ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDY4MjllOTEuLjI3M2Q3MmIgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMjI5OSw4ICsyMjk5LDggQEAKIFc6IGh0dHA6Ly9vb3BzLmdob3N0cHJvdG9jb2xzLm5ldDo4MS9ibG9nLwogUDogMTAyNEQvOTIyNERGMDEgRDVERiBFM0JCIEUzQzggQkNCQiBGOEFEICA4NDFBIEI2QUIgNDY4MSA5MjI0IERGMDEKIEQ6IElQWCwgTExDLCBEQ0NQLCBjeWMyeCwgd2wzNTAxX2NzLCBuZXQvIGhhY2tzCi1TOiBSLiBCcmFz7WxpbyBJdGliZXLqLCA0MjcwLzEwMTAgLSDBZ3VhIFZlcmRlCi1TOiA4MDI0MC0wNjAgLSBDdXJpdGliYSAtIFBhcmFu4QorUzogUi4gQnJhc8OtbGlvIEl0aWJlcsOqLCA0MjcwLzEwMTAgLSDDgWd1YSBWZXJkZQorUzogODAyNDAtMDYwIC0gQ3VyaXRpYmEgLSBQYXJhbsOhCiBTOiBCcmF6aWwKIAogTjogS2Fyc3RlbiBNZXJrZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0IGIvRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QKaW5kZXggNjQ5MWIyYy4uM2FmM2U2NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QKKysrIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QKQEAgLTczLDkgKzczLDkgQEAKICAgICBJZiB0aGUgbmV3IGNvZGUgaXMgc3Vic3RhbnRpYWwsIGFkZGl0aW9uIG9mIHN1YnN5c3RlbS1zcGVjaWZpYyBmYXVsdAogICAgIGluamVjdGlvbiBtaWdodCBiZSBhcHByb3ByaWF0ZS4KIAotMjI6IE5ld2x5LWFkZGVkIGNvZGUgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCBgZ2NjIC1XJy4gIFRoaXMgd2lsbCBnZW5lcmF0ZQotICAgIGxvdHMgb2Ygbm9pc2UsIGJ1dCBpcyBnb29kIGZvciBmaW5kaW5nIGJ1Z3MgbGlrZSAid2FybmluZzogY29tcGFyaXNvbgotICAgIGJldHdlZW4gc2lnbmVkIGFuZCB1bnNpZ25lZCIuCisyMjogTmV3bHktYWRkZWQgY29kZSBoYXMgYmVlbiBjb21waWxlZCB3aXRoIGBnY2MgLVcnICh1c2UgIm1ha2UKKyAgICBFWFRSQV9DRkxBR1M9LVciKS4gIFRoaXMgd2lsbCBnZW5lcmF0ZSBsb3RzIG9mIG5vaXNlLCBidXQgaXMgZ29vZCBmb3IKKyAgICBmaW5kaW5nIGJ1Z3MgbGlrZSAid2FybmluZzogY29tcGFyaXNvbiBiZXR3ZWVuIHNpZ25lZCBhbmQgdW5zaWduZWQiLgogCiAyMzogVGVzdGVkIGFmdGVyIGl0IGhhcyBiZWVuIG1lcmdlZCBpbnRvIHRoZSAtbW0gcGF0Y2hzZXQgdG8gbWFrZSBzdXJlCiAgICAgdGhhdCBpdCBzdGlsbCB3b3JrcyB3aXRoIGFsbCBvZiB0aGUgb3RoZXIgcXVldWVkIHBhdGNoZXMgYW5kIHZhcmlvdXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dCBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAppbmRleCBjNjMyMmM3Li40OThmZjMxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CkBAIC0zMjgsMyArMzI4LDIyIEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitXaGF0OiBsaWJhdGEuc3BpbmRvd25fY29tcGF0IG1vZHVsZSBwYXJhbWV0ZXIKK1doZW46IERlYyAyMDA4CitXaHk6ICBoYWx0KDgpIHN5bmNocm9uaXplcyBjYWNoZXMgZm9yIGFuZCBzcGlucyBkb3duIGxpYmF0YSBkaXNrcworICAgICAgYmVjYXVzZSBsaWJhdGEgZGlkbid0IHVzZSB0byBzcGluIGRvd24gZGlzayBvbiBzeXN0ZW0gaGFsdAorICAgICAgKG9ubHkgc3luY2hyb25pemVkIGNhY2hlcykuCisgICAgICBTcGluIGRvd24gb24gc3lzdGVtIGhhbHQgaXMgbm93IGltcGxlbWVudGVkIGFuZCBjYW4gYmUgdGVzdGVkCisgICAgICB1c2luZyBzeXNmcyBub2RlIC9zeXMvY2xhc3Mvc2NzaV9kaXNrL2g6YzppOmwvbWFuYWdlX3N0YXJ0X3N0b3AuCisgICAgICBCZWNhdXNlIGlzc3Vpbmcgc3BpbiBkb3duIGNvbW1hbmQgdG8gYW4gYWxyZWFkeSBzcHVuIGRvd24gZGlzaworICAgICAgbWFrZXMgc29tZSBkaXNrcyBzcGluIHVwIGp1c3QgdG8gc3BpbiBkb3duIGFnYWluLCB0aGUgb2xkCisgICAgICBiZWhhdmlvciBuZWVkcyB0byBiZSBtYWludGFpbmVkIHRpbGwgdXNlcnNwYWNlIHRvb2wgaXMgdXBkYXRlZAorICAgICAgdG8gY2hlY2sgdGhlIHN5c2ZzIG5vZGUgYW5kIG5vdCB0byBzcGluIGRvd24gZGlza3Mgd2l0aCB0aGUKKyAgICAgIG5vZGUgc2V0IHRvIG9uZS4KKyAgICAgIFRoaXMgbW9kdWxlIHBhcmFtZXRlciBpcyB0byBnaXZlIHVzZXJzcGFjZSB0b29sIHRoZSB0aW1lIHRvCisgICAgICBnZXQgdXBkYXRlZCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgdXNlcnNwYWNlIGlzCisgICAgICByZWFzb25hYmx5IHVwZGF0ZWQuCitXaG86ICBUZWp1biBIZW8gPGh0ZWp1bkBnbWFpbC5jb20+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9ncGlvLnR4dAppbmRleCBmODUyOGRiLi5lOGJlMGFiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2dwaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZ3Bpby50eHQKQEAgLTY2LDcgKzY2LDkgQEAKIHVzZWQgZm9yIHNldmVyYWwgdmVyeSBkaWZmZXJlbnQga2luZHMgb2YgR1BJTyBjb250cm9sbGVyLgogCiBUaGF0IHNhaWQsIGlmIHRoZSBjb252ZW50aW9uIGlzIHN1cHBvcnRlZCBvbiB0aGVpciBwbGF0Zm9ybSwgZHJpdmVycyBzaG91bGQKLXVzZSBpdCB3aGVuIHBvc3NpYmxlOgordXNlIGl0IHdoZW4gcG9zc2libGUuICBQbGF0Zm9ybXMgc2hvdWxkIGRlY2xhcmUgR0VORVJJQ19HUElPIHN1cHBvcnQgaW4KK0tjb25maWcgKGJvb2xlYW4gdHJ1ZSksIHdoaWNoIG11bHRpLXBsYXRmb3JtIGRyaXZlcnMgY2FuIGRlcGVuZCBvbiB3aGVuCit1c2luZyB0aGUgaW5jbHVkZSBmaWxlOgogCiAJI2luY2x1ZGUgPGFzbS9ncGlvLmg+CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va3JlZi50eHQgYi9Eb2N1bWVudGF0aW9uL2tyZWYudHh0CmluZGV4IDQyZmUyODQuLmYzOGI1OWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va3JlZi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rcmVmLnR4dApAQCAtNjcsNyArNjcsNyBAQAogCS4KIAkuIGRvIHN0dWZmIHdpdGggZGF0YSBoZXJlCiAJLgotCWtyZWZfcHV0KGRhdGEsIGRhdGFfcmVsZWFzZSk7CisJa3JlZl9wdXQoJmRhdGEtPnJlZmNvdW50LCBkYXRhX3JlbGVhc2UpOwogfQogCiBpbnQgbXlfZGF0YV9oYW5kbGVyKHZvaWQpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21pcHMvcGNpL3BjaS5SRUFETUUgYi9Eb2N1bWVudGF0aW9uL21pcHMvcGNpL3BjaS5SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OTdlZTQuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9taXBzL3BjaS9wY2kuUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotCi1QZXRlIFBvcG92LCBwcG9wb3ZAcGFjYmVsbC5uZXQKLTA3LzExLzIwMDEKLQotVGhpcyBSRUFETUUgYnJpZWZseSBleHBsYWlucyBob3cgdG8gdXNlIHRoZSBwY2kgYW5kIHBjaV9hdXRvCi1jb2RlIGluIGFyY2gvbWlwcy9rZXJuZWwuICBUaGUgY29kZSB3YXMgcG9ydGVkIGZyb20gUG93ZXJQQyBhbmQKLW1vZGlmaWVkIHNsaWdodGx5LiBJdCBoYXMgYmVlbiB0ZXN0ZWQgcHJldHR5IHdlbGwgb24gUFBDIG9uIHNvbWUKLXJhdGhlciBjb21wbGV4IHN5c3RlbXMgd2l0aCBtdWx0aXBsZSBicmlkZ2VzIGFuZCBkZXZpY2VzIGJlaGluZAotZWFjaCBicmlkZ2UuIEhvd2V2ZXIsIGF0IHRoZSB0aW1lIHRoaXMgUkVBRE1FIHdhcyB3cml0dGVuLCB0aGUKLW1pcHMgcG9ydCB3YXMgdGVzdGVkIG9ubHkgb24gYm9hcmRzIHdpdGggYSBzaW5nbGUgcGNpIGJ1cyBhbmQKLW5vIFAyUCBicmlkZ2VzLiAgSXQncyB2ZXJ5IHBvc3NpYmxlIHRoYXQgb24gYm9hcmRzIHdpdGggUDJQCi1icmlkZ2VzIHNvbWUgbW9kaWZpY2F0aW9ucyBoYXZlIHRvIGJlIG1hZGUuIFRoZSBjb2RlIHdpbGwgCi1ldm9sdmUsIG5vIGRvdWJ0LCBidXQgY3VycmVudGx5IGV2ZXJ5IHNpbmdsZSBtaXBzIGJvYXJkCi1pcyBkb2luZyBpdHMgb3duIHBjaWJpb3MgdGhpbmcgYW5kIGl0IGhhcyBiZWNvbWUgYSBiaWcKLW1lc3MuICBUaGlzIGdlbmVyaWMgcGNpIGNvZGUgaXMgbWVhbnQgdG8gY2xlYW4gdXAgdGhlIG1pcHMKLXBjaSBtZXNzIGFuZCBtYWtlIGl0IGVhc2llciB0byBhZGQgcGNpIHN1cHBvcnQgdG8gbmV3IGJvYXJkcy4KLQotaW5zaWRlIHRoZSBkZWZpbmUgZm9yIHlvdXIgYm9hcmQgaW4gYXJjaC9taXBzL2NvbmZpZy5pbi4gCi1Gb3IgZXhhbXBsZSwgdGhlIEdhbGlsZW8gRVY5NjEwMCBib2FyZCAgbG9va3MgbGlrZSB0aGlzOgotCi1pZiBbICIkQ09ORklHX01JUFNfRVY5NjEwMCIgPSAieSIgXTsgdGhlbgotCWRlZmluZV9ib29sIENPTkZJR19QQ0kgeQotCWRlZmluZV9ib29sIENPTkZJR19NSVBTX0dUOTYxMDAgeQotCWRlZmluZV9ib29sIENPTkZJR19ORVdfUENJIHkKLQlkZWZpbmVfYm9vbCBDT05GSUdfU1dBUF9JT19TUEFDRSB5Ci1maSAKLQotCi1OZXh0LCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGFyY2gvbWlwcy9rZXJuZWwvcGNpIGNvZGUsIHdoaWNoIGhhcyB0aGUKLXBjaWJpb3NfaW5pdCgpIGZ1bmN0aW9uLCBhZGQKLQotZGVmaW5lX2Jvb2wgQ09ORklHX05FV19QQ0kgeQotIAotaW5zaWRlIHRoZSBkZWZpbmUgZm9yIHlvdXIgYm9hcmQuIEFnYWluLCB0aGUgRVY5NjEwMCBleGFtcGxlIGFib3ZlCi1zaG93IE5FV19QQ0kgdHVybmVkIG9uLgotCi0KLU5vdyB5b3UgbmVlZCB0byBhZGQgeW91ciBmaWxlcyB0byBob29rIGluIHlvdXIgcGNpIGNvbmZpZ3VyYXRpb24KLWN5Y2xlcy4gIFVzdWFsbHkgeW91J2xsIG5lZWQgb25seSBhIGNvdXBsZSBvZiBmaWxlcyBuYW1lZCBzb21ldGhpbmcKLWxpa2UgcGNpX2ZpeHVwcy5jIGFuZCBwY2lfb3BzLmMuICBZb3UgY2FuIGNvcHkgdGhlIHRlbXBsYXRlcwotcHJvdmlkZWQgYW5kIGZpbGwgaW4gdGhlIGNvZGUuCi0KLVRoZSBmaWxlIHBjaV9vcHMuYyBzaG91bGQgY29udGFpbiB0aGUgcGNpIGNvbmZpZ3VyYXRpb24gY3ljbGVzIHJvdXRpbmVzLgotSXQgYWxzbyBoYXMgdGhlIG1pcHNfcGNpX2NoYW5uZWxzW10gYXJyYXkgd2hpY2ggY29udGFpbnMgdGhlIGRlc2NyaXB0b3JzCi1vZiBlYWNoIHBjaSBjb250cm9sbGVyLgotCi1UaGUgZmlsZSBwY2lfZml4dXBzLmMgY29udGFpbnMgYSBmZXcgcm91dGluZXMgdG8gZG8gaW50ZXJydXB0IGZpeHVwcywKLXJlc291cmNlcyBmaXh1cHMsIGFuZCwgaWYgbmVlZGVkLCBwY2kgYmlvcyBmaXh1cHMuCi0KLVVzdWFsbHkgeW91J2xsIHB1dCB5b3VyIHBjaV9maXh1cHMuYyBmaWxlIGluIHlvdXIgYm9hcmQgc3BlY2lmaWMgZGlyZWN0b3J5LCAKLXNpbmNlIHRoZSBmdW5jdGlvbnMgaW4gdGhhdCBmaWxlIGFyZSBib2FyZCBzcGVjaWZpYy4gIFRoZSBmdW5jdGlvbnMgaW4KLXBjaV9vcHMuYywgb24gdGhlIG90aGVyIGhhbmQsIGFyZSB1c3VhbGx5IHBjaSBjb250cm9sbGVyIHNwZWNpZmljIHNvIHRoYXQKLWZpbGUgY291bGQgYmUgc2hhcmVkIGFtb25nIGEgZmV3IGRpZmZlcmVudCBib2FyZHMgdXNpbmcgdGhlIHNhbWUKLXBjaSBjb250cm9sbGVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0FMU0EtQ29uZmlndXJhdGlvbi50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dAppbmRleCA3M2U5YTE3Li41N2I4NzhjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dApAQCAtODIxLDYgKzgyMSw3IEBACiAJICA2c3RhY2stZGlnCTYtamFjayBkaWdpdGFsIHdpdGggU1BESUYgSS9PCiAJICBhcmltYQkJQXJpbWEgVzgyMERpMQogCSAgbWFjcHJvCU1hY1BybyBzdXBwb3J0CisJICB3MmpjCQlBU1VTIFcySkMKIAkgIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKIAogCUFMQzg4My84ODgKQEAgLTg1Miw2ICs4NTMsNyBAQAogCSAgM3N0YWNrLWRpZwkzLWphY2sgd2l0aCBTUERJRiBPVVQKIAkgIDZzdGFjay1kaWcJNi1qYWNrIHdpdGggU1BESUYgT1VUCiAJICAzc3RhY2stNjYwCTMtamFjayAoZm9yIEFMQzY2MFZEKQorCSAgbGVub3ZvCUxlbm92byAzMDAwIEMyMDAKIAkgIGF1dG8JCWF1dG8tY29uZmlnIHJlYWRpbmcgQklPUyAoZGVmYXVsdCkKIAogCUNNSTk4ODAKQEAgLTkwOSw2ICs5MTEsNyBAQAogCSAgbWFjYm9vawlJbnRlbCBNYWMgQm9vawogCSAgbWFjYm9vay1wcm8tdjEgSW50ZWwgTWFjIEJvb2sgUHJvIDFzdCBnZW5lcmF0aW9uCiAJICBtYWNib29rLXBybwlJbnRlbCBNYWMgQm9vayBQcm8gMm5kIGdlbmVyYXRpb24KKwkgIGltYWMtaW50ZWwJSW50ZWwgaU1hYwogCiAJU1RBQzkyMDIvOTI1MC85MjUxCiAJICByZWYJCVJlZmVyZW5jZSBib2FyZCwgYmFzZSBjb25maWcKQEAgLTkyNCw2ICs5MjcsMTAgQEAKIAkgIHZhaW8JCVNldHVwIGZvciBWQUlPIEZFNTUwRy9TWjExMAogCSAgdmFpby1hciBTZXR1cCBmb3IgVkFJTyBBUgogCisgICAgVGhlIG1vZGVsIG5hbWUgImdlbnJpYyIgaXMgdHJlYXRlZCBhcyBhIHNwZWNpYWwgY2FzZS4gIFdoZW4gdGhpcworICAgIG1vZGVsIGlzIGdpdmVuLCB0aGUgZHJpdmVyIHVzZXMgdGhlIGdlbmVyaWMgY29kZWMgcGFyc2VyIHdpdGhvdXQKKyAgICAiY29kZWMtcGF0Y2giLiAgSXQncyBzb21ldGltZXMgZ29vZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgorCiAgICAgSWYgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkb2Vzbid0IHdvcmsgYW5kIG9uZSBvZiB0aGUgYWJvdmUKICAgICBtYXRjaGVzIHdpdGggeW91ciBkZXZpY2UsIHJlcG9ydCBpdCB0b2dldGhlciB3aXRoIHRoZSBQQ0kKICAgICBzdWJzeXN0ZW0gSUQgKG91dHB1dCBvZiAibHNwY2kgLW52IikgdG8gQUxTQSBCVFMgb3IgYWxzYS1kZXZlbApAQCAtMTI3OCw2ICsxMjg1LDcgQEAKICAgICBwb3J0CS0gcG9ydCBudW1iZXIgb3IgLTEgKGRpc2FibGUpCiAgICAgaXJxCQktIElSUSBudW1iZXIgb3IgLTEgKGRpc2FibGUpCiAgICAgcG5wCQktIFBuUCBkZXRlY3Rpb24gLSAwID0gZGlzYWJsZSwgMSA9IGVuYWJsZSAoZGVmYXVsdCkKKyAgICB1YXJ0X2VudGVyCS0gSXNzdWUgVUFSVF9FTlRFUiBjb21tYW5kIGF0IG9wZW4gLSBib29sLCBkZWZhdWx0ID0gb24KIAogICAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG11bHRpcGxlIGRldmljZXMgYW5kIFBuUC4KICAgICAKQEAgLTE2OTIsNiArMTcwMCwxNyBAQAogCiAgICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgbXVsdGlwbGUgZGV2aWNlcywgYXV0b3Byb2JlIGFuZCBob3RwbHVnZ2luZy4KIAorICBNb2R1bGUgc25kLXVzYi1jYWlhcQorICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgTW9kdWxlIGZvciBjYWlhcSBVQiBhdWRpbyBpbnRlcmZhY2VzLAorCSAgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBSaWdLb250cm9sMgorCSAgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBLb3JlIENvbnRyb2xsZXIKKwkgICAgKiBOYXRpdmUgSW5zdHJ1bWVudHMgQXVkaW8gS29udHJvbCAxCisJICAgICogTmF0aXZlIEluc3RydW1lbnRzIEF1ZGlvIDggREoKKworICAgIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG11bHRpcGxlIGRldmljZXMsIGF1dG9wcm9iZSBhbmQgaG90cGx1Z2dpbmcuCisKICAgTW9kdWxlIHNuZC11c2ItdXN4MnkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjA0Niw0ICsyMDY1LDQgQEAKICAgICAgICBodHRwczovL2J1Z3RyYWNrLmFsc2EtcHJvamVjdC5vcmcvYnVncy8KIAogICBBTFNBIERldmVsb3BlcnMgTUwKLSAgICAgICBtYWlsdG86YWxzYS1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKKyAgICAgICBtYWlsdG86YWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQnQ4N3gudHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0J0ODd4LnR4dAppbmRleCAxMWVkYjJmLi5mMTU4Y2RlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQnQ4N3gudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9CdDg3eC50eHQKQEAgLTM2LDggKzM2LDggQEAKIG90aGVyIHZhbHVlcyB0aGFuIHRoZSBkZWZhdWx0IDMyMDAwIChvZnRlbiBpdCdzIDQ0MTAwIG9yIDY0MDAwKS4KIAogSWYgeW91IGhhdmUgYW4gdW5rbm93biBjYXJkLCBwbGVhc2UgbWFpbCB0aGUgSUQgYW5kIGJvYXJkIG5hbWUgdG8KLTxhbHNhLWRldmVsQGxpc3RzLnNmLm5ldD4sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhdWRpbyBjYXB0dXJlIHdvcmtzIG9yCi1ub3QsIHNvIHRoYXQgZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgZHJpdmVyIGtub3cgYWJvdXQgeW91ciBjYXJkLgorPGFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZz4sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhdWRpbyBjYXB0dXJlIHdvcmtzCitvciBub3QsIHNvIHRoYXQgZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgZHJpdmVyIGtub3cgYWJvdXQgeW91ciBjYXJkLgogCiAKIEF1ZGlvIG1vZGVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKaW5kZXggZDdiYjJlMi4uNzEyZThjOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNApAQCAtNTIsNyArNTIsNyBAQAogIDUxIC0+IFByb1ZpZGVvIFBWOTUyICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE1NDA6OTUyNF0KICA1MiAtPiBBdmVyTWVkaWEgQXZlclRWLzMwNSAgICAgICAgICAgICAgICAgICAgIFsxNDYxOjIxMDhdCiAgNTMgLT4gQVNVUyBUVi1GTSA3MTM1ICAgICAgICAgICAgICAgICAgICAgICAgICBbMTA0Mzo0ODQ1XQotIDU0IC0+IExpZmVWaWV3IEZseVRWIFBsYXRpbnVtIEZNIC8gR29sZCAgICAgICAgWzUxNjg6MDIxNCwxNDg5OjAyMTQsNTE2ODowMzA0XQorIDU0IC0+IExpZmVWaWV3IEZseVRWIFBsYXRpbnVtIEZNIC8gR29sZCAgICAgICAgWzUxNjg6MDIxNCw1MTY4OjUyMTQsMTQ4OTowMjE0LDUxNjg6MDMwNF0KICA1NSAtPiBMaWZlVmlldyBGbHlEVkItVCBEVU8gLyBNU0kgVFZAbnl3aGVyZSBEdW8gWzUxNjg6MDMwNiw0RTQyOjAzMDZdCiAgNTYgLT4gQXZlcm1lZGlhIEFWZXJUViAzMDcgICAgICAgICAgICAgICAgICAgICBbMTQ2MTphNzBhXQogIDU3IC0+IEF2ZXJtZWRpYSBBVmVyVFYgR08gMDA3IEZNICAgICAgICAgICAgICAgWzE0NjE6ZjMxZl0KQEAgLTExMSwzICsxMTEsNiBAQAogMTEwIC0+IEF2ZXJtZWRpYSBNMTAyICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE0NjE6ZjMxZV0KIDExMSAtPiBBU1VTIFA3MTMxIDQ4NzEgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMDQzOjQ4NzFdCiAxMTIgLT4gQVNVU1RlSyBQNzEzMSBIeWJyaWQgICAgICAgICAgICAgICAgICAgICBbMTA0Mzo0ODc2XQorMTEzIC0+IEVsaXRlZ3JvdXAgRUNTIFRWUDNYUCBGTTEyNDYgVHVuZXIgQ2FyZCAoUEFMLEZNKSBbMTAxOTo0Y2I2XQorMTE0IC0+IEtXb3JsZCBEVkItVCAyMTAgICAgICAgICAgICAgICAgICAgICAgICAgWzE3ZGU6NzI1MF0KKzExNSAtPiBTYWJyZW50IFBDTUNJQSBUVi1QQ0IwNSAgICAgICAgICAgICAgICAgIFswOTE5OjIwMDNdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NuOWMxMDIudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zbjljMTAyLnR4dAppbmRleCA1ZmUwYWQ3Li4yNzk3MTdjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NuOWMxMDIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvc245YzEwMi50eHQKQEAgLTM1NSw2ICszNTUsOSBAQAogCiBWZW5kb3IgSUQgIFByb2R1Y3QgSUQKIC0tLS0tLS0tLSAgLS0tLS0tLS0tLQorMHgwNDU4ICAgICAweDcwMjUKKzB4MDQ1ZSAgICAgMHgwMGY1CisweDA0NWUgICAgIDB4MDBmNwogMHgwNDcxICAgICAweDAzMjcKIDB4MDQ3MSAgICAgMHgwMzI4CiAweDBjNDUgICAgIDB4NjAwMQpAQCAtNDMyLDcgKzQzNSw3IEBACiBIVjcxMzFEICAgIEh5bml4IFNlbWljb25kdWN0b3IgICAgIHwgWWVzICAgICAgICAgTm8gICAgICAgTm8gICAgICAgTm8KIEhWNzEzMVIgICAgSHluaXggU2VtaWNvbmR1Y3RvciAgICAgfCBObyAgICAgICAgICBZZXMgICAgICBZZXMgICAgICBZZXMKIE1JLTAzNDMgICAgTWljcm9uIFRlY2hub2xvZ3kgICAgICAgfCBZZXMgICAgICAgICBObyAgICAgICBObyAgICAgICBObwotTUktMDM2MCAgICBNaWNyb24gVGVjaG5vbG9neSAgICAgICB8IE5vICAgICAgICAgIFllcyAgICAgIE5vICAgICAgIE5vCitNSS0wMzYwICAgIE1pY3JvbiBUZWNobm9sb2d5ICAgICAgIHwgTm8gICAgICAgICAgWWVzICAgICAgWWVzICAgICAgWWVzCiBPVjc2MzAgICAgIE9tbmlWaXNpb24gVGVjaG5vbG9naWVzIHwgWWVzICAgICAgICAgWWVzICAgICAgTm8gICAgICAgTm8KIE9WNzY2MCAgICAgT21uaVZpc2lvbiBUZWNobm9sb2dpZXMgfCBObyAgICAgICAgICBObyAgICAgICBZZXMgICAgICBZZXMKIFBBUzEwNkIgICAgUGl4QXJ0IEltYWdpbmcgICAgICAgICAgfCBZZXMgICAgICAgICBObyAgICAgICBObyAgICAgICBObwpAQCAtNDc4LDEzICs0ODEsMTIgQEAKIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHR3byBkaWZmZXJlbnQgdmlkZW8gZm9ybWF0czogdGhlIGZpcnN0IG9uZSBpcyB0aGUgIjgtYml0CiBTZXF1ZW50aWFsIEJheWVyIiBmb3JtYXQgYW5kIGNhbiBiZSB1c2VkIHRvIG9idGFpbiB1bmNvbXByZXNzZWQgdmlkZW8gZGF0YQogZnJvbSB0aGUgZGV2aWNlIHRocm91Z2ggdGhlIGN1cnJlbnQgSS9PIG1ldGhvZCwgd2hpbGUgdGhlIHNlY29uZCBvbmUgcHJvdmlkZXMKLSJyYXciIGNvbXByZXNzZWQgdmlkZW8gZGF0YSAod2l0aG91dCBmcmFtZSBoZWFkZXJzIG5vdCByZWxhdGVkIHRvIHRoZQotY29tcHJlc3NlZCBkYXRhKS4gVGhlIGNvbXByZXNzaW9uIHF1YWxpdHkgbWF5IHZhcnkgZnJvbSAwIHRvIDEgYW5kIGNhbiBiZQotc2VsZWN0ZWQgb3IgcXVlcmllZCB0aGFua3MgdG8gdGhlIFZJRElPQ19TX0pQRUdDT01QIGFuZCBWSURJT0NfR19KUEVHQ09NUCBWNEwyCi1pb2N0bCdzLiBGb3IgbWF4aW11bSBmbGV4aWJpbGl0eSwgYm90aCB0aGUgZGVmYXVsdCBhY3RpdmUgdmlkZW8gZm9ybWF0IGFuZCB0aGUKLWRlZmF1bHQgY29tcHJlc3Npb24gcXVhbGl0eSBkZXBlbmQgb24gaG93IHRoZSBpbWFnZSBzZW5zb3IgYmVpbmcgdXNlZCBpcwotaW5pdGlhbGl6ZWQgKGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgQVBJIGZvciB0aGUgaW1hZ2Ugc2Vuc29ycwotc3VwcGxpZWQgYnkgdGhpcyBkcml2ZXIpLgorZWl0aGVyICJyYXciIGNvbXByZXNzZWQgdmlkZW8gZGF0YSAod2l0aG91dCBmcmFtZSBoZWFkZXJzIG5vdCByZWxhdGVkIHRvIHRoZQorY29tcHJlc3NlZCBkYXRhKSBvciBzdGFuZGFyZCBKUEVHICh3aXRoIGZyYW1lIGhlYWRlcnMpLiBUaGUgY29tcHJlc3Npb24gcXVhbGl0eQorbWF5IHZhcnkgZnJvbSAwIHRvIDEgYW5kIGNhbiBiZSBzZWxlY3RlZCBvciBxdWVyaWVkIHRoYW5rcyB0byB0aGUKK1ZJRElPQ19TX0pQRUdDT01QIGFuZCBWSURJT0NfR19KUEVHQ09NUCBWNEwyIGlvY3RsJ3MuIEZvciBtYXhpbXVtIGZsZXhpYmlsaXR5LAorYm90aCB0aGUgZGVmYXVsdCBhY3RpdmUgdmlkZW8gZm9ybWF0IGFuZCB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBxdWFsaXR5CitkZXBlbmQgb24gaG93IHRoZSBpbWFnZSBzZW5zb3IgYmVpbmcgdXNlZCBpcyBpbml0aWFsaXplZC4KIAogCiAxMS4gVmlkZW8gZnJhbWUgZm9ybWF0cyBbMV0KZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggYmQ1NThhYy4uNjhhNTZhZCAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTM3Miw3ICszNzIsNyBAQAogUDoJSm9oYW5uZXMgQmVyZwogTToJam9oYW5uZXNAc2lwc29sdXRpb25zLm5ldAogTDoJbGludXhwcGMtZGV2QG96bGFicy5vcmcKLUw6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZworTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChzdWJzY3JpYmVycy1vbmx5KQogUzoJTWFpbnRhaW5lZAogCiBBUE0gRFJJVkVSCkBAIC0zMjM5LDEzICszMjM5LDEzIEBACiBTT1VORAogUDoJSmFyb3NsYXYgS3lzZWxhCiBNOglwZXJleEBzdXNlLmN6Ci1MOglhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcKK0w6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAoc3Vic2NyaWJlcnMtb25seSkKIFM6CU1haW50YWluZWQKIAogU09VTkQgLSBTT0MgTEFZRVIgLyBEWU5BTUlDIEFVRElPIFBPV0VSIE1BTkFHRU1FTlQKIFA6CUxpYW0gR2lyZHdvb2QKIE06CWxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbQotTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnCitMOglhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcgKHN1YnNjcmliZXJzLW9ubHkpCiBTOglTdXBwb3J0ZWQKIAogU1BJIFNVQlNZU1RFTQpAQCAtMzI2OSw3ICszMjY5LDYgQEAKIFA6CU1hcmNlbCBTZWxob3JzdAogTToJdHBtQHNlbGhvcnN0Lm5ldAogVzoJaHR0cDovL3d3dy5wcm9zZWMucnViLmRlL3RwbS8KLUw6CXRwbWRkLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAogUzoJTWFpbnRhaW5lZAogCiBUZWxlY29tIENsb2NrIERyaXZlciBmb3IgTUNQTDAwMTAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9nZGItc3R1Yi5jIGIvYXJjaC9mcnYva2VybmVsL2dkYi1zdHViLmMKaW5kZXggOTU1MGYzNy4uMWU3YTEwMSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL2dkYi1zdHViLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL2dkYi1zdHViLmMKQEAgLTExOTUsNyArMTE5NSw3IEBACiAvKgogICoKICAqLwotc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgZ2Ric3R1Yl9zaG93X3JlZ3Modm9pZCkKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIGdkYnN0dWJfc2hvd19yZWdzKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyAqcmVnOwogCWludCBsb29wOwpAQCAtMTIyMyw3ICsxMjIzLDcgQEAKIC8qCiAgKiBkdW1wIGRlYnVnZ2luZyByZWdzCiAgKi8KLXN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGdkYnN0dWJfZHVtcF9kZWJ1Z3JlZ3Modm9pZCkKK3N0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIGdkYnN0dWJfZHVtcF9kZWJ1Z3JlZ3Modm9pZCkKIHsKIAlnZGJzdHViX3ByaW50aygiRENSICAgICUwOGx4ICAiLCBfX2RlYnVnX3N0YXR1cy5kY3IpOwogCWdkYnN0dWJfcHJpbnRrKCJCUlIgICAgJTA4bHhcbiIsIF9fZGVidWdfc3RhdHVzLmJycik7CkBAIC0yMDc5LDI1ICsyMDc5LDI1IEBACiAgKiBHREIgd2FudHMgdG8gY2FsbCBtYWxsb2MoKSBhbmQgZnJlZSgpIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY2FsbGluZyBrZXJuZWwKICAqIGZ1bmN0aW9ucyBkaXJlY3RseSBmcm9tIGl0cyBjb21tYW5kIGxpbmUKICAqLwotc3RhdGljIHZvaWQgKm1hbGxvYyhzaXplX3Qgc2l6ZSkgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CitzdGF0aWMgdm9pZCAqbWFsbG9jKHNpemVfdCBzaXplKSBfX21heWJlX3VudXNlZDsKIHN0YXRpYyB2b2lkICptYWxsb2Moc2l6ZV90IHNpemUpCiB7CiAJcmV0dXJuIGttYWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWUodm9pZCAqcCkgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CitzdGF0aWMgdm9pZCBmcmVlKHZvaWQgKnApIF9fbWF5YmVfdW51c2VkOwogc3RhdGljIHZvaWQgZnJlZSh2b2lkICpwKQogewogCWtmcmVlKHApOwogfQogCi1zdGF0aWMgdWludDMyX3QgX19fZ2V0X0hTUjAodm9pZCkgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CitzdGF0aWMgdWludDMyX3QgX19fZ2V0X0hTUjAodm9pZCkgX19tYXliZV91bnVzZWQ7CiBzdGF0aWMgdWludDMyX3QgX19fZ2V0X0hTUjAodm9pZCkKIHsKIAlyZXR1cm4gX19nZXRfSFNSKDApOwogfQogCi1zdGF0aWMgdWludDMyX3QgX19fc2V0X0hTUjAodWludDMyX3QgeCkgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CitzdGF0aWMgdWludDMyX3QgX19fc2V0X0hTUjAodWludDMyX3QgeCkgX19tYXliZV91bnVzZWQ7CiBzdGF0aWMgdWludDMyX3QgX19fc2V0X0hTUjAodWludDMyX3QgeCkKIHsKIAlfX3NldF9IU1IoMCwgeCk7CmRpZmYgLS1naXQgYS9hcmNoL2g4MzAwL2tlcm5lbC9zeXNjYWxscy5TIGIvYXJjaC9oODMwMC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCBkYWI5OGZkLi41NGUyMWMzIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvaDgzMDAva2VybmVsL3N5c2NhbGxzLlMKQEAgLTMxLDcgKzMxLDcgQEAKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfbWtub2QpCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2NobW9kKQkJLyogMTUgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfY2hvd24xNikKLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJCQkJLyogb2xkIGJyZWFrIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIG9sZCBicmVhayBzeXNjYWxsIGhvbGRlciAqLwogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19zdGF0KQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19sc2VlaykKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfZ2V0cGlkKQkJLyogMjAgKi8KQEAgLTQ1LDExICs0NSwxMSBAQAogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19mc3RhdCkKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfcGF1c2UpCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3V0aW1lKQkJLyogMzAgKi8KLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJCQkJLyogb2xkIHN0dHkgc3lzY2FsbCBob2xkZXIgKi8KLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJCQkJLyogb2xkIGd0dHkgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJLyogb2xkIHN0dHkgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJLyogb2xkIGd0dHkgc3lzY2FsbCBob2xkZXIgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfYWNjZXNzKQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaWNlKQotCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQkvKiAzNSAqLwkJLyogb2xkIGZ0aW1lIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIDM1IG9sZCBmdGltZSBzeXNjYWxsIGhvbGRlciAqLwogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19zeW5jKQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19raWxsKQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19yZW5hbWUpCkBAIC01OCw3ICs1OCw3IEBACiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2R1cCkKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfcGlwZSkKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfdGltZXMpCi0JLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCQkJCS8qIG9sZCBwcm9mIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIG9sZCBwcm9mIHN5c2NhbGwgaG9sZGVyICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2JyaykJCS8qIDQ1ICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3NldGdpZDE2KQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19nZXRnaWQxNikKQEAgLTY2LDEzICs2NiwxMyBAQAogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19nZXRldWlkMTYpCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2dldGVnaWQxNikJLyogNTAgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfYWNjdCkKLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfdW1vdW50KQkJCQkJLyogcmVjeWNsZWQgbmV2ZXIgdXNlZCBwaHlzKCkgKi8KLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJCQkJLyogb2xkIGxvY2sgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfdW1vdW50KQkJLyogcmVjeWNsZWQgbmV2ZXIgdXNlZCBwaHlzKCkgKi8KKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJLyogb2xkIGxvY2sgc3lzY2FsbCBob2xkZXIgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfaW9jdGwpCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2ZjbnRsKQkJLyogNTUgKi8KLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJCQkJLyogb2xkIG1weCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQkvKiBvbGQgbXB4IHN5c2NhbGwgaG9sZGVyICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3NldHBnaWQpCi0JLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCQkJCS8qIG9sZCB1bGltaXQgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJLyogb2xkIHVsaW1pdCBzeXNjYWxsIGhvbGRlciAqLwogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c191bWFzaykJCS8qIDYwICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2Nocm9vdCkKQEAgLTExMiw3ICsxMTIsNyBAQAogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19mY2hvd24xNikJCS8qIDk1ICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2dldHByaW9yaXR5KQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19zZXRwcmlvcml0eSkKLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJCQkJLyogb2xkIHByb2ZpbCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQkvKiBvbGQgcHJvZmlsIHN5c2NhbGwgaG9sZGVyICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3N0YXRmcykKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfZnN0YXRmcykJCS8qIDEwMCAqLwogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQkvKiBpb3Blcm0gZm9yIGkzODYgKi8KQEAgLTIwMiw4ICsyMDIsOCBAQAogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19jYXBzZXQpICAgICAgICAgICAvKiAxODUgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfc2lnYWx0c3RhY2spCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3NlbmRmaWxlKQotCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQkJLyogc3RyZWFtczEgKi8KLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJCS8qIHN0cmVhbXMyICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIHN0cmVhbXMxICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIHN0cmVhbXMyICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3Zmb3JrKSAgICAgICAgICAgIC8qIDE5MCAqLwogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19nZXRybGltaXQpCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX21tYXAyKQpAQCAtMjM2LDEwICsyMzYsMTAgQEAKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfZ2V0ZGVudHM2NCkJLyogMjIwICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2ZjbnRsNjQpCi0JLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIHJlc2VydmVkIGZvciBUVVggKi8KLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJLyogcmVzZXJ2ZWQgVFVYICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIHJlc2VydmVkIFNlY3VyaXR5ICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2dldHRpZCkKLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJLyogMjI1ICovIC8qIHN5c19yZWFkYWhlYWQgKi8KKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfcmVhZGFoZWFkKQkvKiAyMjUgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfc2V0eGF0dHIpCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2xzZXR4YXR0cikKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfZnNldHhhdHRyKQpAQCAtMjU3LDggKzI1Nyw4IEBACiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2Z1dGV4KQkJLyogMjQwICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3NjaGVkX3NldGFmZmluaXR5KQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19zY2hlZF9nZXRhZmZpbml0eSkKLQkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJLyogc3lzX3NldF90aHJlYWRfYXJlYSAqLwotCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQkvKiBzeXNfZ2V0X3RocmVhZF9hcmVhICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2lvX3NldHVwKQkJLyogMjQ1ICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2lvX2Rlc3Ryb3kpCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2lvX2dldGV2ZW50cykKQEAgLTI4OCw4ICsyODgsOCBAQAogCS5sb25nIFNZTUJPTF9OQU1FKHN5c191dGltZXMpCiAgCS5sb25nIFNZTUJPTF9OQU1FKHN5c19mYWR2aXNlNjRfNjQpCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIHN5c192c2VydmVyICovCi0JLmxvbmcgU1lNQk9MX05BTUUoc3lzX21iaW5kKQotCS5sb25nIFNZTUJPTF9OQU1FKHN5c19nZXRfbWVtcG9saWN5KQorCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQorCS5sb25nIFNZTUJPTF9OQU1FKHN5c19nZXRfbWVtcG9saWN5KQkvKiAyNzUgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfc2V0X21lbXBvbGljeSkKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfbXFfb3BlbikKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfbXFfdW5saW5rKQpAQCAtMjk3LDE2ICsyOTcsNDIgQEAKIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfbXFfdGltZWRyZWNlaXZlKQkvKiAyODAgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfbXFfbm90aWZ5KQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19tcV9nZXRzZXRhdHRyKQotCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQkvKiByZXNlcnZlZCBmb3Iga2V4ZWMgKi8KIAkubG9uZyBTWU1CT0xfTkFNRShzeXNfd2FpdGlkKQotCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQkvKiAyODUgKi8gLyogYXZhaWxhYmxlICovCi0JLmxvbmcgU1lNQk9MX05BTUUoc3lzX2FkZF9rZXkpCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIHN5c19rZXhlY19sb2FkICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2FkZF9rZXkpIAkJLyogMjg1ICovCiAJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3JlcXVlc3Rfa2V5KQogCS5sb25nIFNZTUJPTF9OQU1FKHN5c19rZXljdGwpCi0KLQkucmVwdCBOUl9zeXNjYWxscy0oLi1TWU1CT0xfTkFNRShzeXNfY2FsbF90YWJsZSkpLzQKLQkJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCi0JLmVuZHIKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfaW9wcmlvX3NldCkKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfaW9wcmlvX2dldCkJLyogMjkwICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2lub3RpZnlfaW5pdCkKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfaW5vdGlmeV9hZGRfd2F0Y2gpCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2lub3RpZnlfcm1fd2F0Y2gpCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX21pZ3JhdGVfcGFnZXMpCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX29wZW5hdCkJCS8qIDI5NSAqLworCS5sb25nIFNZTUJPTF9OQU1FKHN5c19ta2RpcmF0KQorCS5sb25nIFNZTUJPTF9OQU1FKHN5c19ta25vZGF0KQorCS5sb25nIFNZTUJPTF9OQU1FKHN5c19mY2hvd25hdCkKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfZnV0aW1lc2F0KQorCS5sb25nIFNZTUJPTF9OQU1FKHN5c19mc3RhdGF0NjQpCS8qIDMwMCAqLworCS5sb25nIFNZTUJPTF9OQU1FKHN5c191bmxpbmthdCkKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfcmVuYW1lYXQpCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2xpbmthdCkKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfc3ltbGlua2F0KQorCS5sb25nIFNZTUJPTF9OQU1FKHN5c19yZWFkbGlua2F0KQkvKiAzMDUgKi8KKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfZmNobW9kYXQpCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX2ZhY2Nlc3NhdCkKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfbmlfc3lzY2FsbCkJLyogc3lzX3BzZWxlY3Q2ICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIHN5c19wcG9sbCAqLworCS5sb25nIFNZTUJPTF9OQU1FKHN5c191bnNoYXJlKQkJLyogMzEwICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3NldF9yb2J1c3RfbGlzdCkKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfZ2V0X3JvYnVzdF9saXN0KQorCS5sb25nIFNZTUJPTF9OQU1FKHN5c19zcGxpY2UpCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3N5bmNfZmlsZV9yYW5nZSkKKwkubG9uZyBTWU1CT0xfTkFNRShzeXNfdGVlKQkJLyogMzE1ICovCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX3Ztc3BsaWNlKQorCS5sb25nIFNZTUJPTF9OQU1FKHN5c19uaV9zeXNjYWxsKQkvKiBzeXNfbW92ZV9wYWdlcyAqLworCS5sb25nIFNZTUJPTF9OQU1FKHN5c19nZXRjcHUpCisJLmxvbmcgU1lNQk9MX05BTUUoc3lzX25pX3N5c2NhbGwpCS8qIHN5c19lcG9sbF9wd2FpdCAqLwogCiAJLm1hY3JvCWNhbGxfc3AgYWRkcgogCW1vdi5sCSNTWU1CT0xfTkFNRShcYWRkciksZXI2CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvS2NvbmZpZyBiL2FyY2gvaTM4Ni9LY29uZmlnCmluZGV4IDMwOTQ0ZWUuLmMyZDU0YjggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9LY29uZmlnCisrKyBiL2FyY2gvaTM4Ni9LY29uZmlnCkBAIC01NSw2ICs1NSwxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAorY29uZmlnIFFVSUNLTElTVAorCWJvb2wKKwlkZWZhdWx0IHkKKwogY29uZmlnIFNCVVMKIAlib29sCiAKQEAgLTc5LDEwICs4Myw2IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCi1jb25maWcgQVJDSF9VU0VTX1NMQUJfUEFHRV9TVFJVQ1QKLQlib29sCi0JZGVmYXVsdCB5Ci0KIGNvbmZpZyBETUkKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGQ3NmQ5YmMuLjA2ZGZhNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xODYsNiArMTg2LDcgQEAKIAkJCWlmIChfX2dldF9jcHVfdmFyKGNwdV9pZGxlX3N0YXRlKSkKIAkJCQlfX2dldF9jcHVfdmFyKGNwdV9pZGxlX3N0YXRlKSA9IDA7CiAKKwkJCWNoZWNrX3BndF9jYWNoZSgpOwogCQkJcm1iKCk7CiAJCQlpZGxlID0gcG1faWRsZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXAuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wLmMKaW5kZXggOTNmMjAyYS4uNzA2YmRhNyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NtcC5jCkBAIC00MjEsNyArNDIxLDcgQEAKIAl9CiAJaWYgKCFjcHVzX2VtcHR5KGNwdV9tYXNrKSkKIAkJZmx1c2hfdGxiX290aGVycyhjcHVfbWFzaywgbW0sIFRMQl9GTFVTSF9BTEwpOwotCisJY2hlY2tfcGd0X2NhY2hlKCk7CiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMgYi9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUwppbmRleCAwNzcyNjc4Li5iZjZhZGNlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUwpAQCAtMzIwLDMgKzMyMCw2IEBACiAJLmxvbmcgc3lzX2dldGNwdQogCS5sb25nIHN5c19lcG9sbF9wd2FpdAogCS5sb25nIHN5c191dGltZW5zYXQJCS8qIDMyMCAqLworCS5sb25nIHN5c19zaWduYWxmZAorCS5sb25nIHN5c190aW1lcmZkCisJLmxvbmcgc3lzX2V2ZW50ZmQKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdmVyaWZ5X2NwdS5TIGIvYXJjaC9pMzg2L2tlcm5lbC92ZXJpZnlfY3B1LlMKaW5kZXggZTUxYTg2OS4uYjJhOWQ4MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC92ZXJpZnlfY3B1LlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92ZXJpZnlfY3B1LlMKQEAgLTEwLDcgKzEwLDkgQEAKIAogI2lmIENPTkZJR19YODZfTUlOSU1VTV9DUFVfTU9ERUwgPj0gNAogCXB1c2hmbAotCW9ybAkkKDE8PDE4KSwoJWVzcCkJCSMgdHJ5IHNldHRpbmcgQUMKKwlwb3AJJWVheAorCW9ybAkkKDE8PDE4KSwlZWF4CQkjIHRyeSBzZXR0aW5nIEFDCisJcHVzaAklZWF4CiAJcG9wZmwKIAlwdXNoZmwKIAlwb3BsICAgICVlYXgKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9pbml0LmMgYi9hcmNoL2kzODYvbW0vaW5pdC5jCmluZGV4IGM1MDc4MmUuLmIyMmNlOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9pbml0LmMKKysrIGIvYXJjaC9pMzg2L21tL2luaXQuYwpAQCAtNzQwLDcgKzc0MCw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChyZW1vdmVfbWVtb3J5KTsKICNlbmRpZgogCi1zdHJ1Y3Qga21lbV9jYWNoZSAqcGdkX2NhY2hlOwogc3RydWN0IGttZW1fY2FjaGUgKnBtZF9jYWNoZTsKIAogdm9pZCBfX2luaXQgcGd0YWJsZV9jYWNoZV9pbml0KHZvaWQpCkBAIC03NjQsMTIgKzc2Myw2IEBACiAJCQlwZ2Rfc2l6ZSA9IFBBR0VfU0laRTsKIAkJfQogCX0KLQlwZ2RfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicGdkIiwKLQkJCQlwZ2Rfc2l6ZSwKLQkJCQlwZ2Rfc2l6ZSwKLQkJCQlTTEFCX1BBTklDLAotCQkJCXBnZF9jdG9yLAotCQkJCSghU0hBUkVEX0tFUk5FTF9QTUQpID8gcGdkX2R0b3IgOiBOVUxMKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9wZ3RhYmxlLmMgYi9hcmNoL2kzODYvbW0vcGd0YWJsZS5jCmluZGV4IDlhOTZjMTYuLjhkN2MwODYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9pMzg2L21tL3BndGFibGUuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3F1aWNrbGlzdC5oPgogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0yMDUsOCArMjA2LDYgQEAKICAqIGFnYWluc3QgcGFnZWF0dHIuYzsgaXQgaXMgdGhlIHVuaXF1ZSBjYXNlIGluIHdoaWNoIGEgdmFsaWQgY2hhbmdlCiAgKiBvZiBrZXJuZWwgcGFnZXRhYmxlcyBjYW4ndCBiZSBsYXppbHkgc3luY2hyb25pemVkIGJ5IHZtYWxsb2MgZmF1bHRzLgogICogdm1hbGxvYyBmYXVsdHMgd29yayBiZWNhdXNlIGF0dGFjaGVkIHBhZ2V0YWJsZXMgYXJlIG5ldmVyIGZyZWVkLgotICogVGhlIGxvY2tpbmcgc2NoZW1lIHdhcyBjaG9zZW4gb24gdGhlIGJhc2lzIG9mIG1hbmZyZWQncwotICogcmVjb21tZW5kYXRpb25zIGFuZCBoYXZpbmcgbm8gY29yZSBpbXBhY3Qgd2hhdHNvZXZlci4KICAqIC0tIHdsaQogICovCiBERUZJTkVfU1BJTkxPQ0socGdkX2xvY2spOwpAQCAtMjMyLDkgKzIzMSwxMSBAQAogCQlzZXRfcGFnZV9wcml2YXRlKG5leHQsICh1bnNpZ25lZCBsb25nKXBwcmV2KTsKIH0KIAorCisKICNpZiAoUFRSU19QRVJfUE1EID09IDEpCiAvKiBOb24tUEFFIHBnZCBjb25zdHJ1Y3RvciAqLwotdm9pZCBwZ2RfY3Rvcih2b2lkICpwZ2QsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSwgdW5zaWduZWQgbG9uZyB1bnVzZWQpCit2b2lkIHBnZF9jdG9yKHZvaWQgKnBnZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yNTYsNyArMjU3LDcgQEAKIH0KICNlbHNlICAvKiBQVFJTX1BFUl9QTUQgPiAxICovCiAvKiBQQUUgcGdkIGNvbnN0cnVjdG9yICovCi12b2lkIHBnZF9jdG9yKHZvaWQgKnBnZCwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlLCB1bnNpZ25lZCBsb25nIHVudXNlZCkKK3ZvaWQgcGdkX2N0b3Iodm9pZCAqcGdkKQogewogCS8qIFBBRSwga2VybmVsIFBNRCBtYXkgYmUgc2hhcmVkICovCiAKQEAgLTI3NSwxMSArMjc2LDEyIEBACiB9CiAjZW5kaWYJLyogUFRSU19QRVJfUE1EICovCiAKLXZvaWQgcGdkX2R0b3Iodm9pZCAqcGdkLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgdW51c2VkKQordm9pZCBwZ2RfZHRvcih2b2lkICpwZ2QpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsgLyogY2FuIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0ICovCiAKLQlCVUdfT04oU0hBUkVEX0tFUk5FTF9QTUQpOworCWlmIChTSEFSRURfS0VSTkVMX1BNRCkKKwkJcmV0dXJuOwogCiAJcGFyYXZpcnRfcmVsZWFzZV9wZChfX3BhKHBnZCkgPj4gUEFHRV9TSElGVCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBnZF9sb2NrLCBmbGFncyk7CkBAIC0zMjEsNyArMzIzLDcgQEAKIHBnZF90ICpwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJaW50IGk7Ci0JcGdkX3QgKnBnZCA9IGttZW1fY2FjaGVfYWxsb2MocGdkX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlwZ2RfdCAqcGdkID0gcXVpY2tsaXN0X2FsbG9jKDAsIEdGUF9LRVJORUwsIHBnZF9jdG9yKTsKIAogCWlmIChQVFJTX1BFUl9QTUQgPT0gMSB8fCAhcGdkKQogCQlyZXR1cm4gcGdkOwpAQCAtMzQ0LDcgKzM0Niw3IEBACiAJCXBhcmF2aXJ0X3JlbGVhc2VfcGQoX19wYShwbWQpID4+IFBBR0VfU0hJRlQpOwogCQlwbWRfY2FjaGVfZnJlZShwbWQsIGkpOwogCX0KLQlrbWVtX2NhY2hlX2ZyZWUocGdkX2NhY2hlLCBwZ2QpOworCXF1aWNrbGlzdF9mcmVlKDAsIHBnZF9kdG9yLCBwZ2QpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0zNjEsNSArMzYzLDExIEBACiAJCQlwbWRfY2FjaGVfZnJlZShwbWQsIGkpOwogCQl9CiAJLyogaW4gdGhlIG5vbi1QQUUgY2FzZSwgZnJlZV9wZ3RhYmxlcygpIGNsZWFycyB1c2VyIHBnZCBlbnRyaWVzICovCi0Ja21lbV9jYWNoZV9mcmVlKHBnZF9jYWNoZSwgcGdkKTsKKwlxdWlja2xpc3RfZnJlZSgwLCBwZ2RfZHRvciwgcGdkKTsKIH0KKwordm9pZCBjaGVja19wZ3RfY2FjaGUodm9pZCkKK3sKKwlxdWlja2xpc3RfdHJpbSgwLCBwZ2RfZHRvciwgMjUsIDE2KTsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L0tjb25maWcgYi9hcmNoL2lhNjQvS2NvbmZpZwppbmRleCA2ZTQxNDcxLi5kZTFiZmY2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvS2NvbmZpZworKysgYi9hcmNoL2lhNjQvS2NvbmZpZwpAQCAtMzEsNiArMzEsMTAgQEAKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiAhSUE2NF9TR0lfU04yCiAKK2NvbmZpZyBRVUlDS0xJU1QKKwlib29sCisJZGVmYXVsdCB5CisKIGNvbmZpZyBNTVUKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaHAvY29tbW9uL2h3c3dfaW9tbXUuYyBiL2FyY2gvaWE2NC9ocC9jb21tb24vaHdzd19pb21tdS5jCmluZGV4IDIxNTNiY2EuLjk0ZTU3MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9jb21tb24vaHdzd19pb21tdS5jCisrKyBiL2FyY2gvaWE2NC9ocC9jb21tb24vaHdzd19pb21tdS5jCkBAIC02Myw3ICs2Myw3IEBACiAJcmV0dXJuIGRldiAmJiBkZXYtPmRtYV9tYXNrICYmICFod2lvbW11X2RtYV9zdXBwb3J0ZWQoZGV2LCAqZGV2LT5kbWFfbWFzayk7CiB9CiAKLXZvaWQKK3ZvaWQgX19pbml0CiBod3N3X2luaXQgKHZvaWQpCiB7CiAJLyogZGVmYXVsdCB0byBhIHNtYWxsaXNoIDJNQiBzdyBJL08gVExCICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaWEzMi9hdWRpdC5jIGIvYXJjaC9pYTY0L2lhMzIvYXVkaXQuYwppbmRleCA5MmQ3ZDBjLi44ODUwZmU0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaWEzMi9hdWRpdC5jCisrKyBiL2FyY2gvaWE2NC9pYTMyL2F1ZGl0LmMKQEAgLTIwLDYgKzIwLDExIEBACiB+MFUKIH07CiAKK3Vuc2lnbmVkIGlhMzJfc2lnbmFsX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfc2lnbmFsLmg+Cit+MFUKK307CisKIGludCBpYTMyX2NsYXNzaWZ5X3N5c2NhbGwodW5zaWduZWQgc3lzY2FsbCkKIHsKIAlzd2l0Y2goc3lzY2FsbCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hdWRpdC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hdWRpdC5jCmluZGV4IDA0NjgyNTUuLmYzODAyYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYXVkaXQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2F1ZGl0LmMKQEAgLTIzLDYgKzIzLDIwIEBACiB+MFUKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBzaWduYWxfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9zaWduYWwuaD4KK34wVQorfTsKKworaW50IGF1ZGl0X2NsYXNzaWZ5X2FyY2goaW50IGFyY2gpCit7CisjaWZkZWYgQ09ORklHX0lBMzJfU1VQUE9SVAorCWlmIChhcmNoID09IEFVRElUX0FSQ0hfSTM4NikKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKwogaW50IGF1ZGl0X2NsYXNzaWZ5X3N5c2NhbGwoaW50IGFiaSwgdW5zaWduZWQgc3lzY2FsbCkKIHsKICNpZmRlZiBDT05GSUdfSUEzMl9TVVBQT1JUCkBAIC00OSwxNSArNjMsMTggQEAKIAlleHRlcm4gX191MzIgaWEzMl93cml0ZV9jbGFzc1tdOwogCWV4dGVybiBfX3UzMiBpYTMyX3JlYWRfY2xhc3NbXTsKIAlleHRlcm4gX191MzIgaWEzMl9jaGF0dHJfY2xhc3NbXTsKKwlleHRlcm4gX191MzIgaWEzMl9zaWduYWxfY2xhc3NbXTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURV8zMiwgaWEzMl93cml0ZV9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRF8zMiwgaWEzMl9yZWFkX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19ESVJfV1JJVEVfMzIsIGlhMzJfZGlyX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFJfMzIsIGlhMzJfY2hhdHRyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19TSUdOQUxfMzIsIGlhMzJfc2lnbmFsX2NsYXNzKTsKICNlbmRpZgogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1dSSVRFLCB3cml0ZV9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRCwgcmVhZF9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfRElSX1dSSVRFLCBkaXJfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0NIQVRUUiwgY2hhdHRyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19TSUdOQUwsIHNpZ25hbF9jbGFzcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwppbmRleCBiNTBiZjIwLi4xNDRiMDU2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNTgzLDUgKzE1ODMsNyBAQAogCWRhdGE4IHN5c192bXNwbGljZQogCWRhdGE4IHN5c19uaV9zeXNjYWxsCQkJLy8gcmVzZXJ2ZWQgZm9yIG1vdmVfcGFnZXMKIAlkYXRhOCBzeXNfZ2V0Y3B1CisJZGF0YTggc3lzX2Vwb2xsX3B3YWl0CQkJLy8gMTMwNQorCWRhdGE4IHN5c191dGltZW5zYXQKIAogCS5vcmcgc3lzX2NhbGxfdGFibGUgKyA4Kk5SX3N5c2NhbGxzCS8vIGd1YXJkIGFnYWluc3QgZmFpbHVyZXMgdG8gaW5jcmVhc2UgTlJfc3lzY2FsbHMKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZXJyX2luamVjdC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9lcnJfaW5qZWN0LmMKaW5kZXggNmE0OTYwMC4uYjY0MjY0OCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lcnJfaW5qZWN0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lcnJfaW5qZWN0LmMKQEAgLTI5MSw1ICsyOTEsNSBAQAogbW9kdWxlX2V4aXQoZXJyX2luamVjdF9leGl0KTsKIAogTU9EVUxFX0FVVEhPUigiRmVuZ2h1YSBZdSA8ZmVuZ2h1YS55dUBpbnRlbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1DIGVycm9yIGluamVjdGlvbiBrZW5yZWwgc3lzZnMgaW50ZXJmYWNlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1DIGVycm9yIGluamVjdGlvbiBrZXJuZWwgc3lzZnMgaW50ZXJmYWNlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lycS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnEuYwppbmRleCBjZTQ5Yzg1Li5iNGMyMzk2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2lycS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxLmMKQEAgLTEwNCw2ICsxMDQsMTcgQEAKIAkJaXJxX3JlZGlyW2lycV0gPSAoY2hhcikgKHJlZGlyICYgMHhmZik7CiAJfQogfQorCitib29sIGlzX2FmZmluaXR5X21hc2tfdmFsaWQoY3B1bWFza190IGNwdW1hc2spCit7CisJaWYgKGlhNjRfcGxhdGZvcm1faXMoInNuMiIpKSB7CisJCS8qIE9ubHkgYWxsb3cgb25lIENQVSB0byBiZSBzcGVjaWZpZWQgaW4gdGhlIHNtcF9hZmZpbml0eSBtYXNrICovCisJCWlmIChjcHVzX3dlaWdodChjcHVtYXNrKSAhPSAxKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwppbmRleCA0ZjVmZDA5Li43MmU1OTNlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwpAQCAtMzcwLDE0ICszNzAsMTggQEAKIAogc3RhdGljIHZvaWQgX19rcHJvYmVzIHNhdmVfcHJldmlvdXNfa3Byb2JlKHN0cnVjdCBrcHJvYmVfY3RsYmxrICprY2IpCiB7Ci0Ja2NiLT5wcmV2X2twcm9iZS5rcCA9IGtwcm9iZV9ydW5uaW5nKCk7Ci0Ja2NiLT5wcmV2X2twcm9iZS5zdGF0dXMgPSBrY2ItPmtwcm9iZV9zdGF0dXM7CisJdW5zaWduZWQgaW50IGk7CisJaSA9IGF0b21pY19hZGRfcmV0dXJuKDEsICZrY2ItPnByZXZfa3Byb2JlX2luZGV4KTsKKwlrY2ItPnByZXZfa3Byb2JlW2ktMV0ua3AgPSBrcHJvYmVfcnVubmluZygpOworCWtjYi0+cHJldl9rcHJvYmVbaS0xXS5zdGF0dXMgPSBrY2ItPmtwcm9iZV9zdGF0dXM7CiB9CiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyByZXN0b3JlX3ByZXZpb3VzX2twcm9iZShzdHJ1Y3Qga3Byb2JlX2N0bGJsayAqa2NiKQogewotCV9fZ2V0X2NwdV92YXIoY3VycmVudF9rcHJvYmUpID0ga2NiLT5wcmV2X2twcm9iZS5rcDsKLQlrY2ItPmtwcm9iZV9zdGF0dXMgPSBrY2ItPnByZXZfa3Byb2JlLnN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpID0gYXRvbWljX3N1Yl9yZXR1cm4oMSwgJmtjYi0+cHJldl9rcHJvYmVfaW5kZXgpOworCV9fZ2V0X2NwdV92YXIoY3VycmVudF9rcHJvYmUpID0ga2NiLT5wcmV2X2twcm9iZVtpXS5rcDsKKwlrY2ItPmtwcm9iZV9zdGF0dXMgPSBrY2ItPnByZXZfa3Byb2JlW2ldLnN0YXR1czsKIH0KIAogc3RhdGljIHZvaWQgX19rcHJvYmVzIHNldF9jdXJyZW50X2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwLApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tYWNodmVjLmMgYi9hcmNoL2lhNjQva2VybmVsL21hY2h2ZWMuYwppbmRleCA5NjIwODIyLi4xM2RmMzM3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21hY2h2ZWMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL21hY2h2ZWMuYwpAQCAtMzUsNyArMzUsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkCit2b2lkIF9faW5pdAogbWFjaHZlY19pbml0IChjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBpYTY0X21hY2hpbmVfdmVjdG9yICptdjsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCmluZGV4IGY4YWU3MDkuLjI2ODE0ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtMTE4LDcgKzExOCw5IEBACiAjZGVmaW5lIENQRV9ISVNUT1JZX0xFTkdUSCAgICA1CiAjZGVmaW5lIENNQ19ISVNUT1JZX0xFTkdUSCAgICA1CiAKKyNpZmRlZiBDT05GSUdfQUNQSQogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGNwZV9wb2xsX3RpbWVyOworI2VuZGlmCiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgY21jX3BvbGxfdGltZXI7CiAvKgogICogVGhpcyB2YXJpYWJsZSB0ZWxscyB3aGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgaW4gcG9sbGluZyBtb2RlLgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2NvbnRpZy5jIGIvYXJjaC9pYTY0L21tL2NvbnRpZy5jCmluZGV4IDQ0Y2U1ZWQuLjdhYzg1OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9tbS9jb250aWcuYworKysgYi9hcmNoL2lhNjQvbW0vY29udGlnLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAlwcmludGsoS0VSTl9JTkZPICIlZCBwYWdlcyBzaGFyZWRcbiIsIHRvdGFsX3NoYXJlZCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsIHRvdGFsX2NhY2hlZCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiVG90YWwgb2YgJWxkIHBhZ2VzIGluIHBhZ2UgdGFibGUgY2FjaGVcbiIsCi0JICAgICAgIHBndGFibGVfcXVpY2tsaXN0X3RvdGFsX3NpemUoKSk7CisJICAgICAgIHF1aWNrbGlzdF90b3RhbF9zaXplKCkpOwogCXByaW50ayhLRVJOX0lORk8gIiVkIGZyZWUgYnVmZmVyIHBhZ2VzXG4iLCBucl9mcmVlX2J1ZmZlcl9wYWdlcygpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jIGIvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jCmluZGV4IDk0ODQ0NDQuLjM4MDg1YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYworKysgYi9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMKQEAgLTU2MSw3ICs1NjEsNyBAQAogCXByaW50ayhLRVJOX0lORk8gIiVkIHBhZ2VzIHNoYXJlZFxuIiwgdG90YWxfc2hhcmVkKTsKIAlwcmludGsoS0VSTl9JTkZPICIlZCBwYWdlcyBzd2FwIGNhY2hlZFxuIiwgdG90YWxfY2FjaGVkKTsKIAlwcmludGsoS0VSTl9JTkZPICJUb3RhbCBvZiAlbGQgcGFnZXMgaW4gcGFnZSB0YWJsZSBjYWNoZVxuIiwKLQkgICAgICAgcGd0YWJsZV9xdWlja2xpc3RfdG90YWxfc2l6ZSgpKTsKKwkgICAgICAgcXVpY2tsaXN0X3RvdGFsX3NpemUoKSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiJWQgZnJlZSBidWZmZXIgcGFnZXNcbiIsIG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKCkpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vaW5pdC5jIGIvYXJjaC9pYTY0L21tL2luaXQuYwppbmRleCBjZmZiMWU4Li5jMTRhYmVmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKQEAgLTM5LDkgKzM5LDYgQEAKIAogREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKIAotREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZyAqLCBfX3BndGFibGVfcXVpY2tsaXN0KTsKLURFRklORV9QRVJfQ1BVKGxvbmcsIF9fcGd0YWJsZV9xdWlja2xpc3Rfc2l6ZSk7Ci0KIGV4dGVybiB2b2lkIGlhNjRfdGxiX2luaXQgKHZvaWQpOwogCiB1bnNpZ25lZCBsb25nIE1BWF9ETUFfQUREUkVTUyA9IFBBR0VfT0ZGU0VUICsgMHgxMDAwMDAwMDBVTDsKQEAgLTU2LDU0ICs1Myw2IEBACiBzdHJ1Y3QgcGFnZSAqemVyb19wYWdlX21lbW1hcF9wdHI7CS8qIG1hcCBlbnRyeSBmb3IgemVybyBwYWdlICovCiBFWFBPUlRfU1lNQk9MKHplcm9fcGFnZV9tZW1tYXBfcHRyKTsKIAotI2RlZmluZSBNSU5fUEdUX1BBR0VTCQkJMjVVTAotI2RlZmluZSBNQVhfUEdUX0ZSRUVTX1BFUl9QQVNTCQkxNkwKLSNkZWZpbmUgUEdUX0ZSQUNUSU9OX09GX05PREVfTUVNCTE2Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZwotbWF4X3BndF9wYWdlcyh2b2lkKQotewotCXU2NCBub2RlX2ZyZWVfcGFnZXMsIG1heF9wZ3RfcGFnZXM7Ci0KLSNpZm5kZWYJQ09ORklHX05VTUEKLQlub2RlX2ZyZWVfcGFnZXMgPSBucl9mcmVlX3BhZ2VzKCk7Ci0jZWxzZQotCW5vZGVfZnJlZV9wYWdlcyA9IG5vZGVfcGFnZV9zdGF0ZShudW1hX25vZGVfaWQoKSwgTlJfRlJFRV9QQUdFUyk7Ci0jZW5kaWYKLQltYXhfcGd0X3BhZ2VzID0gbm9kZV9mcmVlX3BhZ2VzIC8gUEdUX0ZSQUNUSU9OX09GX05PREVfTUVNOwotCW1heF9wZ3RfcGFnZXMgPSBtYXgobWF4X3BndF9wYWdlcywgTUlOX1BHVF9QQUdFUyk7Ci0JcmV0dXJuIG1heF9wZ3RfcGFnZXM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZwotbWluX3BhZ2VzX3RvX2ZyZWUodm9pZCkKLXsKLQlsb25nIHBhZ2VzX3RvX2ZyZWU7Ci0KLQlwYWdlc190b19mcmVlID0gcGd0YWJsZV9xdWlja2xpc3Rfc2l6ZSAtIG1heF9wZ3RfcGFnZXMoKTsKLQlwYWdlc190b19mcmVlID0gbWluKHBhZ2VzX3RvX2ZyZWUsIE1BWF9QR1RfRlJFRVNfUEVSX1BBU1MpOwotCXJldHVybiBwYWdlc190b19mcmVlOwotfQotCi12b2lkCi1jaGVja19wZ3RfY2FjaGUodm9pZCkKLXsKLQlsb25nIHBhZ2VzX3RvX2ZyZWU7Ci0KLQlpZiAodW5saWtlbHkocGd0YWJsZV9xdWlja2xpc3Rfc2l6ZSA8PSBNSU5fUEdUX1BBR0VTKSkKLQkJcmV0dXJuOwotCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0Jd2hpbGUgKHVubGlrZWx5KChwYWdlc190b19mcmVlID0gbWluX3BhZ2VzX3RvX2ZyZWUoKSkgPiAwKSkgewotCQl3aGlsZSAocGFnZXNfdG9fZnJlZS0tKSB7Ci0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGd0YWJsZV9xdWlja2xpc3RfYWxsb2MoKSk7Ci0JCX0KLQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JfQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KIHZvaWQKIGxhenlfbW11X3Byb3RfdXBkYXRlIChwdGVfdCBwdGUpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2NvbW1vbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19jb21tb24uYwppbmRleCBkNDhiY2Q4Li43ZWQ3MmQzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2NvbW1vbi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaW9fY29tbW9uLmMKQEAgLTM2NCw3ICszNjQsNyBAQAogCiAJZWxlbWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXNkYXRhX2VsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbGVtZW50KSB7Ci0JCWRldl9kYmcoZGV2LCAiJXM6IG91dCBvZiBtZW1vcnkhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlkZXZfZGJnKCZkZXYtPmRldiwgIiVzOiBvdXQgb2YgbWVtb3J5IVxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwogCX0KIAllbGVtZW50LT5zeXNkYXRhID0gU05fUENJREVWX0lORk8oZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBjX3BhcnRpdGlvbi5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfcGFydGl0aW9uLmMKaW5kZXggNTdjNzIzZi4uN2JhNDAzMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfcGFydGl0aW9uLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cGNfcGFydGl0aW9uLmMKQEAgLTU3NCw3ICs1NzQsNyBAQAogCQl1NjQgcmVtb3RlX3ZhcnNfcGEsIHN0cnVjdCB4cGNfdmFycyAqcmVtb3RlX3ZhcnMpCiB7CiAJcGFydC0+cmVtb3RlX3JwX3ZlcnNpb24gPSByZW1vdGVfcnBfdmVyc2lvbjsKLQlkZXZfZGJnKHhwY19wYXJ0LCAiICByZW1vdGVfcnBfdmVyc2lvbiA9IDB4JTAxNmx4XG4iLAorCWRldl9kYmcoeHBjX3BhcnQsICIgIHJlbW90ZV9ycF92ZXJzaW9uID0gMHglMDE2eFxuIiwKIAkJcGFydC0+cmVtb3RlX3JwX3ZlcnNpb24pOwogCiAJcGFydC0+cmVtb3RlX3JwX3N0YW1wID0gKnJlbW90ZV9ycF9zdGFtcDsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBuZXQuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwveHBuZXQuYwppbmRleCA4OGZhZDg1Li5kYTcyMTM1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3hwbmV0LmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC94cG5ldC5jCkBAIC0zNDMsOCArMzQzLDggQEAKIAllbnVtIHhwY19yZXR2YWwgcmV0OwogCiAKLQlkZXZfZGJnKHhwbmV0LCAiY2FsbGluZyB4cGNfY29ubmVjdCglZCwgMHglcCwgTlVMTCwgJWxkLCAlbGQsICVkLCAiCi0JCSIlZClcbiIsIFhQQ19ORVRfQ0hBTk5FTCwgeHBuZXRfY29ubmVjdGlvbl9hY3Rpdml0eSwKKwlkZXZfZGJnKHhwbmV0LCAiY2FsbGluZyB4cGNfY29ubmVjdCglZCwgMHglcCwgTlVMTCwgJWxkLCAlbGQsICVsZCwgIgorCQkiJWxkKVxuIiwgWFBDX05FVF9DSEFOTkVMLCB4cG5ldF9jb25uZWN0aW9uX2FjdGl2aXR5LAogCQlYUE5FVF9NU0dfU0laRSwgWFBORVRfTVNHX05FTlRSSUVTLCBYUE5FVF9NQVhfS1RIUkVBRFMsCiAJCVhQTkVUX01BWF9JRExFX0tUSFJFQURTKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL0tjb25maWcgYi9hcmNoL20zMnIvS2NvbmZpZwppbmRleCA5NzQwZDZiLi5jM2JiOGE3NSAxMDA2NDQKLS0tIGEvYXJjaC9tMzJyL0tjb25maWcKKysrIGIvYXJjaC9tMzJyL0tjb25maWcKQEAgLTI0MSw2ICsyNDEsMTAgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBTQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVIKKyAgICAgICAgYm9vbAorICAgICAgICBkZWZhdWx0IHkKKwogY29uZmlnIFBSRUVNUFQKIAlib29sICJQcmVlbXB0aWJsZSBLZXJuZWwiCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL21tL21tdS5TIGIvYXJjaC9tMzJyL21tL21tdS5TCmluZGV4IDhiYjc0YjEuLjQ5YTZkMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9tbS9tbXUuUworKysgYi9hcmNoL20zMnIvbW0vbW11LlMKQEAgLTE2Myw3ICsxNjMsOCBAQAogCiAJOyBwdGVfZGF0YSA9ICh1bnNpZ25lZCBsb25nKXB0ZV92YWwoKnB0ZSk7CiAJbGQJcjIsIEByMwkJCTsgcjI6IHB0ZSBkYXRhCi0Jb3IzCXIyLCByMiwgIzIJCTsgX1BBR0VfUFJFU0VOVCg9MikKKwlhbmQzCXIzLCByMiwgIzIJCTsgX1BBR0VfUFJFU0VOVCg9MikgY2hlY2sKKwliZXF6CXIzLCAzZgogCiAJLmZpbGxpbnNuCiA1OgpAQCAtMjY0LDExICsyNjUsOCBAQAogOwogCWFuZDMJcjEsIHIxLCAjMHhlZmYKIAlsZGkJcjQsICM2MTEJCTsgX0tFUk5QR19UQUJMRSg9NjExKQotCWJlcQlyMSwgcjQsIDRmCQk7ICFwbWRfYmFkKCpwbWQpID8KLQkuZmlsbGluc24KLTM6Ci0JbGRpCXIxLCAjMAkJCTsgcjE6IHB0ZV9kYXRhID0gMAotCWJyYQk1ZgorCWJuZQlyMSwgcjQsIDNmCQk7ICFwbWRfYmFkKCpwbWQpID8KKwogCS5maWxsaW5zbgogNDoKIAk7IHB0ZSA9IHB0ZV9vZmZzZXQocG1kLCBhZGRyZXNzKTsKQEAgLTI4Miw4ICsyODAsMTAgQEAKIAlhZGQJcjQsIHIzCQkJOyByNDogcHRlCiAJOyBwdGVfZGF0YSA9ICh1bnNpZ25lZCBsb25nKXB0ZV92YWwoKnB0ZSk7CiAJbGQJcjEsIEByNAkJCTsgcjE6IHB0ZV9kYXRhCi0JLmZpbGxpbnNuCisJYW5kMwlyMywgcjEsICMyCQk7IF9QQUdFX1BSRVNFTlQoPTIpIGNoZWNrCisJYmVxeglyMywgM2YKIAorCS5maWxsaW5zbgogOzsgc2V0IHRsYgogOyByMDogYWRkcmVzcywgcjE6IHB0ZV9kYXRhLCByMjogZW50cnkKIDsgcjMscjQ6IChmcmVlKQpAQCAtMjk1LDggKzI5NSw3IEBACiAJYW5kMwlyNCwgcjQsICMoTU1VX0NPTlRFWFRfQVNJRF9NQVNLKQogCW9yCXIzLCByNAogCXN0CXIzLCBAcjIKLQlvcjMJcjQsIHIxLCAjMgkJOyBfUEFHRV9QUkVTRU5UKD0yKQotCXN0CXI0LCBAKDQscjIpCQk7IHNldF90bGJfZGF0YShlbnRyeSwgcHRlX2RhdGEpOworCXN0CXIxLCBAKDQscjIpCQk7IHNldF90bGJfZGF0YShlbnRyeSwgcHRlX2RhdGEpOwogCiAJbGQJcjQsIEBzcCsKIAlsZAlyMywgQHNwKwpAQCAtMzA2LDYgKzMwNSwxMSBAQAogCWxkCXNwLCBAc3ArCiAJcnRlCiAKKwkuZmlsbGluc24KKzM6CisJbGRpCXIxLCAjMgkJCTsgcjE6IHB0ZV9kYXRhID0gMCB8IF9QQUdFX1BSRVNFTlQoPTIpCisJYnJhCTViCisKICNlbHNlCiAjZXJyb3IgdW5rbm93biBpc2EgY29uZmlndXJhdGlvbgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IDE2ZWNlYTMuLjBmMDk0MTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC0xNSwxMjEgKzE1LDggQEAKIAlwcm9tcHQgIlN5c3RlbSB0eXBlIgogCWRlZmF1bHQgU0dJX0lQMjIKIAotY29uZmlnIE1JUFNfTVRYMQotCWJvb2wgIjRHIFN5c3RlbXMgTVRYLTEgYm9hcmQiCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKLQlzZWxlY3QgU09DX0FVMTUwMAotCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KLQotY29uZmlnIE1JUFNfQk9TUE9SVVMKLQlib29sICJBTUQgQWxjaGVteSBCb3Nwb3J1cyBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTUwMAotCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCi0KLWNvbmZpZyBNSVBTX1BCMTAwMAotCWJvb2wgIkFNRCBBbGNoZW15IFBCMTAwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTAwMAotCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCi0Jc2VsZWN0IFNXQVBfSU9fU1BBQ0UKLQlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCi0KLWNvbmZpZyBNSVBTX1BCMTEwMAotCWJvb2wgIkFNRCBBbGNoZW15IFBCMTEwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTEwMAotCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCi0Jc2VsZWN0IFNXQVBfSU9fU1BBQ0UKLQlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCi0KLWNvbmZpZyBNSVBTX1BCMTUwMAotCWJvb2wgIkFNRCBBbGNoZW15IFBCMTUwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTUwMAotCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCi0Jc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgotCi1jb25maWcgTUlQU19QQjE1NTAKLQlib29sICJBTUQgQWxjaGVteSBQQjE1NTAgYm9hcmQiCi0Jc2VsZWN0IFNPQ19BVTE1NTAKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IEhXX0hBU19QQ0kKLQlzZWxlY3QgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQotCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCi0Jc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQotCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgotCi1jb25maWcgTUlQU19QQjEyMDAKLQlib29sICJBTUQgQWxjaGVteSBQQjEyMDAgYm9hcmQiCi0Jc2VsZWN0IFNPQ19BVTEyMDAKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKLQlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUIGlmIFBDSQotCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KLQotY29uZmlnIE1JUFNfREIxMDAwCi0JYm9vbCAiQU1EIEFsY2hlbXkgREIxMDAwIGJvYXJkIgotCXNlbGVjdCBTT0NfQVUxMDAwCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKLQlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCi0KLWNvbmZpZyBNSVBTX0RCMTEwMAotCWJvb2wgIkFNRCBBbGNoZW15IERCMTEwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTEwMAotCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCi0KLWNvbmZpZyBNSVBTX0RCMTUwMAotCWJvb2wgIkFNRCBBbGNoZW15IERCMTUwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTUwMAotCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgSFdfSEFTX1BDSQotCXNlbGVjdCBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCi0Jc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKLQlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19CSUdfRU5ESUFOCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCi0KLWNvbmZpZyBNSVBTX0RCMTU1MAotCWJvb2wgIkFNRCBBbGNoZW15IERCMTU1MCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTU1MAotCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCi0Jc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKLQlzZWxlY3QgU1lTX0hBU19DUFVfTUlQUzMyX1IxCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCi0KLWNvbmZpZyBNSVBTX0RCMTIwMAotCWJvb2wgIkFNRCBBbGNoZW15IERCMTIwMCBib2FyZCIKLQlzZWxlY3QgU09DX0FVMTIwMAotCXNlbGVjdCBETUFfQ09IRVJFTlQKLQlzZWxlY3QgTUlQU19ESVNBQkxFX09CU09MRVRFX0lERQotCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KLQotY29uZmlnIE1JUFNfTUlSQUdFCi0JYm9vbCAiQU1EIEFsY2hlbXkgTWlyYWdlIGJvYXJkIgotCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKLQlzZWxlY3QgU09DX0FVMTUwMAotCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KK2NvbmZpZyBNQUNIX0FMQ0hFTVkKKwlib29sICJBbGNoZW15IHByb2Nlc3NvciBiYXNlZCBtYWNoaW5lcyIKIAogY29uZmlnIEJBU0xFUl9FWENJVEUKIAlib29sICJCYXNsZXIgZVhjaXRlIHNtYXJ0IGNhbWVyYSIKQEAgLTM2OSwyOCArMjU2LDYgQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgTUlQUyBUZWNobm9sb2dpZXMgTUlQU3NpbSBzb2Z0d2FyZQogCSAgZW11bGF0b3IuCiAKLWNvbmZpZyBNT01FTkNPX0pBR1VBUl9BVFgKLQlib29sICJNb21lbnR1bSBKYWd1YXIgYm9hcmQiCi0Jc2VsZWN0IEJPT1RfRUxGMzIKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IEhXX0hBU19QQ0kKLQlzZWxlY3QgSVJRX0NQVQotCXNlbGVjdCBJUlFfQ1BVX1JNN0sKLQlzZWxlY3QgSVJRX01WNjQzNDAKLQlzZWxlY3QgTElNSVRFRF9ETUEKLQlzZWxlY3QgUENJX01BUlZFTEwKLQlzZWxlY3QgUk03MDAwX0NQVV9TQ0FDSEUKLQlzZWxlY3QgU1dBUF9JT19TUEFDRQotCXNlbGVjdCBTWVNfSEFTX0NQVV9STTkwMDAKLQlzZWxlY3QgU1lTX0hBU19FQVJMWV9QUklOVEsKLQlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19CSUdfRU5ESUFOCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19LR0RCCi0JaGVscAotCSAgVGhlIEphZ3VhciBBVFggaXMgYSBNSVBTLWJhc2VkIFNpbmdsZSBCb2FyZCBDb21wdXRlciAoU0JDKSBtYWRlIGJ5Ci0JICBNb21lbnR1bSBDb21wdXRlciA8aHR0cDovL3d3dy5tb21lbmNvLmNvbS8+LgotCiBjb25maWcgTU9NRU5DT19PQ0VMT1QKIAlib29sICJNb21lbnR1bSBPY2Vsb3QgYm9hcmQiCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVApAQCAtNDQ2LDI5ICszMTEsNiBAQAogCSAgVGhlIE9jZWxvdCBpcyBhIE1JUFMtYmFzZWQgU2luZ2xlIEJvYXJkIENvbXB1dGVyIChTQkMpIG1hZGUgYnkKIAkgIE1vbWVudHVtIENvbXB1dGVyIDxodHRwOi8vd3d3Lm1vbWVuY28uY29tLz4uCiAKLWNvbmZpZyBNT01FTkNPX09DRUxPVF9HCi0JYm9vbCAiTW9tZW50dW0gT2NlbG90LUcgYm9hcmQiCi0Jc2VsZWN0IERNQV9OT05DT0hFUkVOVAotCXNlbGVjdCBIV19IQVNfUENJCi0Jc2VsZWN0IElSUV9DUFUKLQlzZWxlY3QgSVJRX0NQVV9STTdLCi0Jc2VsZWN0IFBDSV9NQVJWRUxMCi0Jc2VsZWN0IFJNNzAwMF9DUFVfU0NBQ0hFCi0Jc2VsZWN0IFNXQVBfSU9fU1BBQ0UKLQlzZWxlY3QgU1lTX0hBU19DUFVfUk03MDAwCi0Jc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKLQlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTCBpZiBCUk9LRU4KLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KLQloZWxwCi0JICBUaGUgT2NlbG90IGlzIGEgTUlQUy1iYXNlZCBTaW5nbGUgQm9hcmQgQ29tcHV0ZXIgKFNCQykgbWFkZSBieQotCSAgTW9tZW50dW0gQ29tcHV0ZXIgPGh0dHA6Ly93d3cubW9tZW5jby5jb20vPi4KLQotY29uZmlnIE1JUFNfWFhTMTUwMAotCWJvb2wgIk15Q2FibGUgWFhTMTUwMCBib2FyZCIKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IFNPQ19BVTE1MDAKLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KLQogY29uZmlnIFBOWDg1NTBfSkJTCiAJYm9vbCAiUGhpbGlwcyBQTlg4NTUwIGJhc2VkIEpCUyBib2FyZCIKIAlzZWxlY3QgUE5YODU1MApAQCAtNzc1LDcgKzYxNyw2IEBACiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KLQlzZWxlY3QgVE9TSElCQV9CT0FSRFMKIAlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCiAKIGNvbmZpZyBUT1NISUJBX1JCVFg0OTI3CkBAIC03OTEsNyArNjMyLDYgQEAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0tHREIKLQlzZWxlY3QgVE9TSElCQV9CT0FSRFMKIAlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCiAJaGVscAogCSAgVGhpcyBUb3NoaWJhIGJvYXJkIGlzIGJhc2VkIG9uIHRoZSBUWDQ5MjcgcHJvY2Vzc29yLiBTYXkgWSBoZXJlIHRvCkBAIC04MTEsNyArNjUxLDYgQEAKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0JJR19FTkRJQU4KIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0tHREIKLQlzZWxlY3QgVE9TSElCQV9CT0FSRFMKIAlzZWxlY3QgR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRCiAJaGVscAogCSAgVGhpcyBUb3NoaWJhIGJvYXJkIGlzIGJhc2VkIG9uIHRoZSBUWDQ5MzggcHJvY2Vzc29yLiBTYXkgWSBoZXJlIHRvCkBAIC04MTksMTEgKzY1OCwxMSBAQAogCiBlbmRjaG9pY2UKIAorc291cmNlICJhcmNoL21pcHMvYXUxMDAwL0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9kZGI1eHh4L0tjb25maWciCiBzb3VyY2UgImFyY2gvbWlwcy9ndDY0MTIwL2V2NjQxMjAvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9taXBzL2phenovS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9taXBzL2xhc2F0L0tjb25maWciCi1zb3VyY2UgImFyY2gvbWlwcy9tb21lbnR1bS9LY29uZmlnIgogc291cmNlICJhcmNoL21pcHMvcG1jLXNpZXJyYS9LY29uZmlnIgogc291cmNlICJhcmNoL21pcHMvc2dpLWlwMjcvS2NvbmZpZyIKIHNvdXJjZSAiYXJjaC9taXBzL3NpYnl0ZS9LY29uZmlnIgpAQCAtOTIzLDExICs3NjIsNiBAQAogY29uZmlnIEk4MjU5CiAJYm9vbAogCi1jb25maWcgTElNSVRFRF9ETUEKLQlib29sCi0Jc2VsZWN0IEhJR0hNRU0KLQlzZWxlY3QgU1lTX1NVUFBPUlRTX0hJR0hNRU0KLQogY29uZmlnIE1JUFNfQk9OSVRPNjQKIAlib29sCiAKQEAgLTEwMTMsMzMgKzg0Nyw2IEBACiBjb25maWcgUENJX01BUlZFTEwKIAlib29sCiAKLWNvbmZpZyBTT0NfQVUxMDAwCi0JYm9vbAotCXNlbGVjdCBTT0NfQVUxWDAwCi0KLWNvbmZpZyBTT0NfQVUxMTAwCi0JYm9vbAotCXNlbGVjdCBTT0NfQVUxWDAwCi0KLWNvbmZpZyBTT0NfQVUxNTAwCi0JYm9vbAotCXNlbGVjdCBTT0NfQVUxWDAwCi0KLWNvbmZpZyBTT0NfQVUxNTUwCi0JYm9vbAotCXNlbGVjdCBTT0NfQVUxWDAwCi0KLWNvbmZpZyBTT0NfQVUxMjAwCi0JYm9vbAotCXNlbGVjdCBTT0NfQVUxWDAwCi0KLWNvbmZpZyBTT0NfQVUxWDAwCi0JYm9vbAotCXNlbGVjdCBTWVNfSEFTX0NQVV9NSVBTMzJfUjEKLQlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQVBNX0VNVUxBVElPTgotCXNlbGVjdCBTWVNfU1VQUE9SVFNfS0dEQgotCiBjb25maWcgU0VSSUFMX1JNOTAwMAogCWJvb2wKIApAQCAtMTA4MSw5ICs4ODgsOSBAQAogY2hvaWNlCiAJcHJvbXB0ICJHYWxpbGVvIENoaXAgQ2xvY2siCiAJI2RlZmF1bHQgU1lTQ0xLXzgzIGlmIE1JUFNfRVY2NDEyMAotCWRlcGVuZHMgb24gTUlQU19FVjY0MTIwIHx8IE1PTUVOQ09fT0NFTE9UIHx8IE1PTUVOQ09fT0NFTE9UX0cKKwlkZXBlbmRzIG9uIE1JUFNfRVY2NDEyMCB8fCBNT01FTkNPX09DRUxPVAogCWRlZmF1bHQgU1lTQ0xLXzgzIGlmIE1JUFNfRVY2NDEyMAotCWRlZmF1bHQgU1lTQ0xLXzEwMCBpZiBNT01FTkNPX09DRUxPVCB8fCBNT01FTkNPX09DRUxPVF9HCisJZGVmYXVsdCBTWVNDTEtfMTAwIGlmIE1PTUVOQ09fT0NFTE9UCiAKIGNvbmZpZyBTWVNDTEtfNzUKIAlib29sICI3NSIgaWYgTUlQU19FVjY0MTIwCkBAIC0xMDkyLDcgKzg5OSw3IEBACiAJYm9vbCAiODMuMyIgaWYgTUlQU19FVjY0MTIwCiAKIGNvbmZpZyBTWVNDTEtfMTAwCi0JYm9vbCAiMTAwIiBpZiBNSVBTX0VWNjQxMjAgfHwgTU9NRU5DT19PQ0VMT1QgfHwgTU9NRU5DT19PQ0VMT1RfRworCWJvb2wgIjEwMCIgaWYgTUlQU19FVjY0MTIwIHx8IE1PTUVOQ09fT0NFTE9UCiAKIGVuZGNob2ljZQogCkBAIC0xMTMxLDkgKzkzOCw2IEBACiBjb25maWcgQk9PVF9FTEY2NAogCWJvb2wKIAotY29uZmlnIFRPU0hJQkFfQk9BUkRTCi0JYm9vbAotCiBtZW51ICJDUFUgc2VsZWN0aW9uIgogCiBjaG9pY2UKQEAgLTE1NTcsNiArMTM2MSw3IEBACiAJYm9vbCAiVXNlIDEgVEMgb24gZWFjaCBhdmFpbGFibGUgVlBFIGZvciBTTVAiCiAJZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfTVVMVElUSFJFQURJTkcKIAlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfVkkKKwlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfRUkKIAlzZWxlY3QgQ1BVX01JUFNSMl9TUlMKIAlzZWxlY3QgTUlQU19NVAogCXNlbGVjdCBOUl9DUFVTX0RFRkFVTFRfMgpAQCAtMTU3Miw2ICsxMzc3LDcgQEAKIAkjZGVwZW5kcyBvbiBDUFVfTUlQUzY0X1IyCQkjIG9uY2UgdGhlcmUgaXMgaGFyZHdhcmUgLi4uCiAJZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfTVVMVElUSFJFQURJTkcKIAlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfVkkKKwlzZWxlY3QgQ1BVX01JUFNSMl9JUlFfRUkKIAlzZWxlY3QgQ1BVX01JUFNSMl9TUlMKIAlzZWxlY3QgTUlQU19NVAogCXNlbGVjdCBOUl9DUFVTX0RFRkFVTFRfOApAQCAtMTU4NCw2ICsxMzkwLDggQEAKIGNvbmZpZyBNSVBTX1ZQRV9MT0FERVIKIAlib29sICJWUEUgbG9hZGVyIHN1cHBvcnQuIgogCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX01VTFRJVEhSRUFESU5HCisJc2VsZWN0IENQVV9NSVBTUjJfSVJRX1ZJCisJc2VsZWN0IENQVV9NSVBTUjJfSVJRX0VJCiAJc2VsZWN0IE1JUFNfTVQKIAloZWxwCiAJICBJbmNsdWRlcyBhIGxvYWRlciBmb3IgbG9hZGluZyBhbiBlbGYgcmVsb2NhdGFibGUgb2JqZWN0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvTWFrZWZpbGUgYi9hcmNoL21pcHMvTWFrZWZpbGUKaW5kZXggNDg5MmRiOC4uZjQ1MDA2NiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9NYWtlZmlsZQpAQCAtMzQzLDE1ICszNDMsNiBAQAogbG9hZC0kKENPTkZJR19NT01FTkNPX09DRUxPVCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCiAKICMKLSMgTW9tZW50dW0gT2NlbG90LUcgYm9hcmQKLSMKLSMgVGhlIE9jZWxvdC1HIHNldHVwLm8gbXVzdCBiZSBsaW5rZWQgZWFybHkgLSBpdCBkb2VzIHRoZSBpb3JlbWFwKCkgZm9yIHRoZQotIyBtaXBzX2lvX3BvcnRfYmFzZS4KLSMKLWNvcmUtJChDT05GSUdfTU9NRU5DT19PQ0VMT1RfRykJKz0gYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nLwotbG9hZC0kKENPTkZJR19NT01FTkNPX09DRUxPVF9HKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwogIyBNb21lbnR1bSBPY2Vsb3QtQyBhbmQgLUNTIGJvYXJkcwogIwogIyBUaGUgT2NlbG90LUNbU10gc2V0dXAubyBtdXN0IGJlIGxpbmtlZCBlYXJseSAtIGl0IGRvZXMgdGhlIGlvcmVtYXAoKSBmb3IgdGhlCkBAIC0zODgsMTcgKzM3OSw2IEBACiBsb2FkLSQoQ09ORklHX0JBU0xFUl9FWENJVEUpCSs9IDB4ODAxMDAwMDAKIAogIwotIyBNb21lbnR1bSBKYWd1YXIgQVRYCi0jCi1jb3JlLSQoQ09ORklHX01PTUVOQ09fSkFHVUFSX0FUWCkJKz0gYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvCi1jZmxhZ3MtJChDT05GSUdfTU9NRU5DT19KQUdVQVJfQVRYKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1qYQotI2lmZGVmIENPTkZJR19KQUdVQVJfRE1BTE9XCi0jbG9hZC0kKENPTkZJR19NT01FTkNPX0pBR1VBUl9BVFgpCSs9IDB4ZmZmZmZmZmY4ODAwMDAwMAotI2Vsc2UKLWxvYWQtJChDT05GSUdfTU9NRU5DT19KQUdVQVJfQVRYKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLSNlbmRpZgotCi0jCiAjIE5FQyBEREIKICMKIGNvcmUtJChDT05GSUdfRERCNVhYWF9DT01NT04pCSs9IGFyY2gvbWlwcy9kZGI1eHh4L2NvbW1vbi8KQEAgLTcyOSwzICs3MDksMjUgQEAKIENMRUFOX0ZJTEVTICs9IHZtbGludXguMzIgXAogCSAgICAgICB2bWxpbnV4LjY0IFwKIAkgICAgICAgdm1saW51eC5lY29mZgorCitxdWlldF9jbWRfc3lzY2FsbHNfbjMyID0gQ0FMTC1OMzIgJDwKKyAgICAgIGNtZF9zeXNjYWxsc19uMzIgPSAkKENPTkZJR19TSEVMTCkgJDwgJChDQykgJChjX2ZsYWdzKSAtbWFiaT1uMzIKKworcXVpZXRfY21kX3N5c2NhbGxzX28zMiA9IENBTEwtTzMyICQ8CisgICAgICBjbWRfc3lzY2FsbHNfbzMyID0gJChDT05GSUdfU0hFTEwpICQ8ICQoQ0MpICQoY19mbGFncykgLW1hYmk9MzIKKworUEhPTlkgKz0gbWlzc2luZy1zeXNjYWxscy1uMzIgbWlzc2luZy1zeXNjYWxscy1vMzIKKworbWlzc2luZy1zeXNjYWxscy1uMzI6IHNjcmlwdHMvY2hlY2tzeXNjYWxscy5zaCBGT1JDRQorCSQoY2FsbCBjbWQsc3lzY2FsbHNfbjMyKQorCittaXNzaW5nLXN5c2NhbGxzLW8zMjogc2NyaXB0cy9jaGVja3N5c2NhbGxzLnNoIEZPUkNFCisJJChjYWxsIGNtZCxzeXNjYWxsc19vMzIpCisKK2FyY2hwcmVwYXJlOgoraWZkZWYgQ09ORklHX01JUFMzMl9OMzIKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1hcmNoL21pcHMgbWlzc2luZy1zeXNjYWxscy1uMzIKK2VuZGlmCitpZmRlZiBDT05GSUdfTUlQUzMyX08zMgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPWFyY2gvbWlwcyBtaXNzaW5nLXN5c2NhbGxzLW8zMgorZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvS2NvbmZpZyBiL2FyY2gvbWlwcy9hdTEwMDAvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmVhODgwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2F1MTAwMC9LY29uZmlnCkBAIC0wLDAgKzEsMTQyIEBACitjaG9pY2UKKwlwcm9tcHQgIk1hY2hpbmUgdHlwZSIKKwlkZXBlbmRzIG9uIE1BQ0hfQUxDSEVNWQorCWRlZmF1bHQgTUlQU19EQjEwMDAKKworY29uZmlnIE1JUFNfTVRYMQorCWJvb2wgIjRHIFN5c3RlbXMgTVRYLTEgYm9hcmQiCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKKwlzZWxlY3QgU09DX0FVMTUwMAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCitjb25maWcgTUlQU19CT1NQT1JVUworCWJvb2wgIkFsY2hlbXkgQm9zcG9ydXMgYm9hcmQiCisJc2VsZWN0IFNPQ19BVTE1MDAKKwlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCisJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisKK2NvbmZpZyBNSVBTX0RCMTAwMAorCWJvb2wgIkFsY2hlbXkgREIxMDAwIGJvYXJkIgorCXNlbGVjdCBTT0NfQVUxMDAwCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KKworY29uZmlnIE1JUFNfREIxMTAwCisJYm9vbCAiQWxjaGVteSBEQjExMDAgYm9hcmQiCisJc2VsZWN0IFNPQ19BVTExMDAKKwlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCisJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisKK2NvbmZpZyBNSVBTX0RCMTIwMAorCWJvb2wgIkFsY2hlbXkgREIxMjAwIGJvYXJkIgorCXNlbGVjdCBTT0NfQVUxMjAwCisJc2VsZWN0IERNQV9DT0hFUkVOVAorCXNlbGVjdCBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCisJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisKK2NvbmZpZyBNSVBTX0RCMTUwMAorCWJvb2wgIkFsY2hlbXkgREIxNTAwIGJvYXJkIgorCXNlbGVjdCBTT0NfQVUxNTAwCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUIGlmIFBDSQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCitjb25maWcgTUlQU19EQjE1NTAKKwlib29sICJBbGNoZW15IERCMTU1MCBib2FyZCIKKwlzZWxlY3QgU09DX0FVMTU1MAorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBNSVBTX0RJU0FCTEVfT0JTT0xFVEVfSURFCisJc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KKworY29uZmlnIE1JUFNfTUlSQUdFCisJYm9vbCAiQWxjaGVteSBNaXJhZ2UgYm9hcmQiCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBTT0NfQVUxNTAwCisJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisKK2NvbmZpZyBNSVBTX1BCMTAwMAorCWJvb2wgIkFsY2hlbXkgUEIxMDAwIGJvYXJkIgorCXNlbGVjdCBTT0NfQVUxMDAwCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IFJFU09VUkNFU182NEJJVCBpZiBQQ0kKKwlzZWxlY3QgU1dBUF9JT19TUEFDRQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCitjb25maWcgTUlQU19QQjExMDAKKwlib29sICJBbGNoZW15IFBCMTEwMCBib2FyZCIKKwlzZWxlY3QgU09DX0FVMTEwMAorCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKKwlzZWxlY3QgSFdfSEFTX1BDSQorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCisJc2VsZWN0IFNXQVBfSU9fU1BBQ0UKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU4KKworY29uZmlnIE1JUFNfUEIxMjAwCisJYm9vbCAiQWxjaGVteSBQQjEyMDAgYm9hcmQiCisJc2VsZWN0IFNPQ19BVTEyMDAKKwlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCisJc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUIGlmIFBDSQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCitjb25maWcgTUlQU19QQjE1MDAKKwlib29sICJBbGNoZW15IFBCMTUwMCBib2FyZCIKKwlzZWxlY3QgU09DX0FVMTUwMAorCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKKwlzZWxlY3QgSFdfSEFTX1BDSQorCXNlbGVjdCBSRVNPVVJDRVNfNjRCSVQgaWYgUENJCisJc2VsZWN0IFNZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOCisKK2NvbmZpZyBNSVBTX1BCMTU1MAorCWJvb2wgIkFsY2hlbXkgUEIxNTUwIGJvYXJkIgorCXNlbGVjdCBTT0NfQVUxNTUwCisJc2VsZWN0IERNQV9OT05DT0hFUkVOVAorCXNlbGVjdCBIV19IQVNfUENJCisJc2VsZWN0IE1JUFNfRElTQUJMRV9PQlNPTEVURV9JREUKKwlzZWxlY3QgUkVTT1VSQ0VTXzY0QklUIGlmIFBDSQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCitjb25maWcgTUlQU19YWFMxNTAwCisJYm9vbCAiTXlDYWJsZSBYWFMxNTAwIGJvYXJkIgorCXNlbGVjdCBETUFfTk9OQ09IRVJFTlQKKwlzZWxlY3QgU09DX0FVMTUwMAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTElUVExFX0VORElBTgorCitlbmRjaG9pY2UKKworY29uZmlnIFNPQ19BVTEwMDAKKwlib29sCisJc2VsZWN0IFNPQ19BVTFYMDAKKworY29uZmlnIFNPQ19BVTExMDAKKwlib29sCisJc2VsZWN0IFNPQ19BVTFYMDAKKworY29uZmlnIFNPQ19BVTE1MDAKKwlib29sCisJc2VsZWN0IFNPQ19BVTFYMDAKKworY29uZmlnIFNPQ19BVTE1NTAKKwlib29sCisJc2VsZWN0IFNPQ19BVTFYMDAKKworY29uZmlnIFNPQ19BVTEyMDAKKwlib29sCisJc2VsZWN0IFNPQ19BVTFYMDAKKworY29uZmlnIFNPQ19BVTFYMDAKKwlib29sCisJc2VsZWN0IFNZU19IQVNfQ1BVX01JUFMzMl9SMQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMCisJc2VsZWN0IFNZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OCisJc2VsZWN0IFNZU19TVVBQT1JUU19LR0RCCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYmFzbGVyL2V4Y2l0ZS9leGNpdGVfZGV2aWNlLmMgYi9hcmNoL21pcHMvYmFzbGVyL2V4Y2l0ZS9leGNpdGVfZGV2aWNlLmMKaW5kZXggY2MxY2U3Ny4uZTAwYmMyZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Jhc2xlci9leGNpdGUvZXhjaXRlX2RldmljZS5jCisrKyBiL2FyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL2V4Y2l0ZV9kZXZpY2UuYwpAQCAtNjgsNyArNjgsNyBAQAogCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UKLQlleGNpdGVfY3RyX3Jlc291cmNlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0geworCWV4Y2l0ZV9jdHJfcmVzb3VyY2UgX19tYXliZV91bnVzZWQgPSB7CiAJCS5uYW1lCQk9ICJHUEkgY291bnRlcnMiLAogCQkuc3RhcnQJCT0gMCwKIAkJLmVuZAkJPSA1LApAQCAtNzcsNyArNzcsNyBAQAogCQkuc2libGluZwk9IE5VTEwsCiAJCS5jaGlsZAkJPSBOVUxMCiAJfSwKLQlleGNpdGVfZ3Bpc2xpY2VfcmVzb3VyY2UgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSB7CisJZXhjaXRlX2dwaXNsaWNlX3Jlc291cmNlIF9fbWF5YmVfdW51c2VkID0gewogCQkubmFtZQkJPSAiR1BJIHNsaWNlcyIsCiAJCS5zdGFydAkJPSAwLAogCQkuZW5kCQk9IDEsCkBAIC04Niw3ICs4Niw3IEBACiAJCS5zaWJsaW5nCT0gTlVMTCwKIAkJLmNoaWxkCQk9IE5VTEwKIAl9LAotCWV4Y2l0ZV9tZGlvX2NoYW5uZWxfcmVzb3VyY2UgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSB7CisJZXhjaXRlX21kaW9fY2hhbm5lbF9yZXNvdXJjZSBfX21heWJlX3VudXNlZCA9IHsKIAkJLm5hbWUJCT0gIk1ESU8gY2hhbm5lbHMiLAogCQkuc3RhcnQJCT0gMCwKIAkJLmVuZAkJPSAxLApAQCAtOTUsNyArOTUsNyBAQAogCQkuc2libGluZwk9IE5VTEwsCiAJCS5jaGlsZAkJPSBOVUxMCiAJfSwKLQlleGNpdGVfZmlmb21lbV9yZXNvdXJjZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHsKKwlleGNpdGVfZmlmb21lbV9yZXNvdXJjZSBfX21heWJlX3VudXNlZCA9IHsKIAkJLm5hbWUJCT0gIkZJRk8gbWVtb3J5IiwKIAkJLnN0YXJ0CQk9IDAsCiAJCS5lbmQJCT0gNzY3LApAQCAtMTA0LDcgKzEwNCw3IEBACiAJCS5zaWJsaW5nCT0gTlVMTCwKIAkJLmNoaWxkCQk9IE5VTEwKIAl9LAotCWV4Y2l0ZV9zY3JhbV9yZXNvdXJjZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHsKKwlleGNpdGVfc2NyYW1fcmVzb3VyY2UgX19tYXliZV91bnVzZWQgPSB7CiAJCS5uYW1lCQk9ICJTY3JhdGNoIFJBTSIsCiAJCS5zdGFydAkJPSBFWENJVEVfUEhZU19TQ1JBTSwKIAkJLmVuZAkJPSBFWENJVEVfUEhZU19TQ1JBTSArIEVYQ0lURV9TSVpFX1NDUkFNIC0gMSwKQEAgLTExMyw3ICsxMTMsNyBAQAogCQkuc2libGluZwk9IE5VTEwsCiAJCS5jaGlsZAkJPSBOVUxMCiAJfSwKLQlleGNpdGVfZnBnYV9yZXNvdXJjZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHsKKwlleGNpdGVfZnBnYV9yZXNvdXJjZSBfX21heWJlX3VudXNlZCA9IHsKIAkJLm5hbWUJCT0gIlN5c3RlbSBGUEdBIiwKIAkJLnN0YXJ0CQk9IEVYQ0lURV9QSFlTX0ZQR0EsCiAJCS5lbmQJCT0gRVhDSVRFX1BIWVNfRlBHQSArIEVYQ0lURV9TSVpFX0ZQR0EgLSAxLApAQCAtMTIyLDcgKzEyMiw3IEBACiAJCS5zaWJsaW5nCT0gTlVMTCwKIAkJLmNoaWxkCQk9IE5VTEwKIAl9LAotCWV4Y2l0ZV9uYW5kX3Jlc291cmNlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0geworCWV4Y2l0ZV9uYW5kX3Jlc291cmNlIF9fbWF5YmVfdW51c2VkID0gewogCQkubmFtZQkJPSAiTkFORCBmbGFzaCBjb250cm9sIiwKIAkJLnN0YXJ0CQk9IEVYQ0lURV9QSFlTX05BTkQsCiAJCS5lbmQJCT0gRVhDSVRFX1BIWVNfTkFORCArIEVYQ0lURV9TSVpFX05BTkQgLSAxLApAQCAtMTMxLDcgKzEzMSw3IEBACiAJCS5zaWJsaW5nCT0gTlVMTCwKIAkJLmNoaWxkCQk9IE5VTEwKIAl9LAotCWV4Y2l0ZV90aXRhbl9yZXNvdXJjZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHsKKwlleGNpdGVfdGl0YW5fcmVzb3VyY2UgX19tYXliZV91bnVzZWQgPSB7CiAJCS5uYW1lCQk9ICJUSVRBTiByZWdpc3RlcnMiLAogCQkuc3RhcnQJCT0gRVhDSVRFX1BIWVNfVElUQU4sCiAJCS5lbmQJCT0gRVhDSVRFX1BIWVNfVElUQU4gKyBFWENJVEVfU0laRV9USVRBTiAtIDEsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29iYWx0L01ha2VmaWxlIGIvYXJjaC9taXBzL2NvYmFsdC9NYWtlZmlsZQppbmRleCA5NTY1YjIxLi5jMjkyZjgwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29iYWx0L01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9jb2JhbHQvTWFrZWZpbGUKQEAgLTIsNyArMiw3IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgQ29iYWx0IG1pY3JvIHN5c3RlbXMgZmFtaWx5IHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKICMKIAotb2JqLXkJIDo9IGlycS5vIHJlc2V0Lm8gc2V0dXAubyBidXR0b25zLm8KK29iai15IDo9IGJ1dHRvbnMubyBpcnEubyByZXNldC5vIHJ0Yy5vIHNlcmlhbC5vIHNldHVwLm8KIAogb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBjb25zb2xlLm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb2JhbHQvcnRjLmMgYi9hcmNoL21pcHMvY29iYWx0L3J0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NGRhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY29iYWx0L3J0Yy5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiAgUmVnaXN0cmF0aW9uIG9mIENvYmFsdCBSVEMgcGxhdGZvcm0gZGV2aWNlLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIFlvaWNoaSBZdWFzYSA8eW9pY2hpX3l1YXNhQHRyaXBlYWtzLmNvLmpwPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb2JhbHRfcnRjX3Jlc291cmNlW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5zdGFydAk9IDB4NzAsCisJCS5lbmQJPSAweDc3LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPLAorCX0sCisJeworCQkuc3RhcnQJPSA4LAorCQkuZW5kCT0gOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGNvYmFsdF9ydGNfYWRkKHZvaWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlpbnQgcmV0dmFsOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygicnRjX2Ntb3MiLCAtMSk7CisJaWYgKCFwZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsIGNvYmFsdF9ydGNfcmVzb3VyY2UsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShjb2JhbHRfcnRjX3Jlc291cmNlKSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJfZnJlZV9kZXZpY2U7CisKKwlyZXR2YWwgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworCisJcmV0dXJuIHJldHZhbDsKK30KK2RldmljZV9pbml0Y2FsbChjb2JhbHRfcnRjX2FkZCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29iYWx0L3NlcmlhbC5jIGIvYXJjaC9taXBzL2NvYmFsdC9zZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjcxMTY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2NvYmFsdC9zZXJpYWwuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogIFJlZ2lzdHJhdGlvbiBvZiBDb2JhbHQgVUFSVCBwbGF0Zm9ybSBkZXZpY2UuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgWW9pY2hpIFl1YXNhIDx5b2ljaGlfeXVhc2FAdHJpcGVha3MuY28uanA+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisKKyNpbmNsdWRlIDxjb2JhbHQuaD4KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb2JhbHRfdWFydF9yZXNvdXJjZVtdIF9faW5pdGRhdGEgPSB7CisJeworCQkuc3RhcnQJPSAweDFjODAwMDAwLAorCQkuZW5kCT0gMHgxYzgwMDAwNywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IENPQkFMVF9TRVJJQUxfSVJRLAorCQkuZW5kCT0gQ09CQUxUX1NFUklBTF9JUlEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGNvYmFsdF9zZXJpYWw4MjUwX3BvcnRbXSA9IHsKKwl7CisJCS5pcnEJCT0gQ09CQUxUX1NFUklBTF9JUlEsCisJCS51YXJ0Y2xrCT0gMTg0MzIwMDAsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5mbGFncwkJPSBVUEZfSU9SRU1BUCB8IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCwKKwkJLm1hcGJhc2UJPSAweDFjODAwMDAwLAorCX0sCisJe30sCit9OworCitzdGF0aWMgX19pbml0IGludCBjb2JhbHRfdWFydF9hZGQodm9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWludCByZXR2YWw7CisKKwkvKgorCSAqIENvYmFsdCBRdWJlMSBhbmQgUkFRMSBoYXZlIG5vIFVBUlQuCisJICovCisJaWYgKGNvYmFsdF9ib2FyZF9pZCA8PSBDT0JBTFRfQlJEX0lEX1JBUTEpCisJCXJldHVybiAwOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic2VyaWFsODI1MCIsIC0xKTsKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcGRldi0+aWQgPSBQTEFUODI1MF9ERVZfUExBVEZPUk07CisJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBjb2JhbHRfc2VyaWFsODI1MF9wb3J0OworCisJcmV0dmFsID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgY29iYWx0X3VhcnRfcmVzb3VyY2UsIEFSUkFZX1NJWkUoY29iYWx0X3VhcnRfcmVzb3VyY2UpKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9mcmVlX2RldmljZTsKKworCXJldHZhbCA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJfZnJlZV9kZXZpY2U7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfZGV2aWNlOgorCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorZGV2aWNlX2luaXRjYWxsKGNvYmFsdF91YXJ0X2FkZCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29iYWx0L3NldHVwLmMgYi9hcmNoL21pcHMvY29iYWx0L3NldHVwLmMKaW5kZXggZDBkZDgxNy4uN2FiZTQ1ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvYmFsdC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9jb2JhbHQvc2V0dXAuYwpAQCAtMTAsMTEgKzEwLDggQEAKICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogCiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KQEAgLTI3LDkgKzI0LDYgQEAKIGV4dGVybiB2b2lkIGNvYmFsdF9tYWNoaW5lX3Jlc3RhcnQoY2hhciAqY29tbWFuZCk7CiBleHRlcm4gdm9pZCBjb2JhbHRfbWFjaGluZV9oYWx0KHZvaWQpOwogZXh0ZXJuIHZvaWQgY29iYWx0X21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpOwotZXh0ZXJuIHZvaWQgY29iYWx0X2Vhcmx5X2NvbnNvbGUodm9pZCk7Ci0KLWludCBjb2JhbHRfYm9hcmRfaWQ7CiAKIGNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQogewpAQCAtOTUsOCArODksNiBAQAogCiB2b2lkIF9faW5pdCBwbGF0X21lbV9zZXR1cCh2b2lkKQogewotCXN0YXRpYyBzdHJ1Y3QgdWFydF9wb3J0IHVhcnQ7Ci0JdW5zaWduZWQgaW50IGRldmZuID0gUENJX0RFVkZOKENPQkFMVF9QQ0lDT05GX1ZJQSwgMCk7CiAJaW50IGk7CiAKIAlfbWFjaGluZV9yZXN0YXJ0ID0gY29iYWx0X21hY2hpbmVfcmVzdGFydDsKQEAgLTExMSwyOSArMTAzLDYgQEAKIAkvKiBUaGVzZSByZXNvdXJjZXMgaGF2ZSBiZWVuIHJlc2VydmVkIGJ5IFZJQSBTdXBlckkvTyBjaGlwLiAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvYmFsdF9yZXNlcnZlZF9yZXNvdXJjZXMpOyBpKyspCiAJCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwgY29iYWx0X3Jlc2VydmVkX3Jlc291cmNlcyArIGkpOwotCi0gICAgICAgIC8qIFJlYWQgdGhlIGNvYmFsdCBpZCByZWdpc3RlciBvdXQgb2YgdGhlIFBDSSBjb25maWcgc3BhY2UgKi8KLSAgICAgICAgUENJX0NGR19TRVQoZGV2Zm4sIChWSUFfQ09CQUxUX0JSRF9JRF9SRUcgJiB+MHgzKSk7Ci0gICAgICAgIGNvYmFsdF9ib2FyZF9pZCA9IEdUX1JFQUQoR1RfUENJMF9DRkdEQVRBX09GUyk7Ci0gICAgICAgIGNvYmFsdF9ib2FyZF9pZCA+Pj0gKChWSUFfQ09CQUxUX0JSRF9JRF9SRUcgJiAzKSAqIDgpOwotICAgICAgICBjb2JhbHRfYm9hcmRfaWQgPSBWSUFfQ09CQUxUX0JSRF9SRUdfdG9fSUQoY29iYWx0X2JvYXJkX2lkKTsKLQotCXByaW50aygiQ29iYWx0IGJvYXJkIElEOiAlZFxuIiwgY29iYWx0X2JvYXJkX2lkKTsKLQotCWlmIChjb2JhbHRfYm9hcmRfaWQgPiBDT0JBTFRfQlJEX0lEX1JBUTEpIHsKLSNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKLQkJdWFydC5saW5lCT0gMDsKLQkJdWFydC50eXBlCT0gUE9SVF9VTktOT1dOOwotCQl1YXJ0LnVhcnRjbGsJPSAxODQzMjAwMDsKLQkJdWFydC5pcnEJPSBDT0JBTFRfU0VSSUFMX0lSUTsKLQkJdWFydC5mbGFncwk9IFVQRl9JT1JFTUFQIHwgVVBGX0JPT1RfQVVUT0NPTkYgfAotCQkJCSAgVVBGX1NLSVBfVEVTVDsKLQkJdWFydC5pb3R5cGUJPSBVUElPX01FTTsKLQkJdWFydC5tYXBiYXNlCT0gMHgxYzgwMDAwMDsKLQotCQllYXJseV9zZXJpYWxfc2V0dXAoJnVhcnQpOwotI2VuZGlmCi0JfQogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvY29iYWx0X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2NvYmFsdF9kZWZjb25maWcKaW5kZXggYmE1OTNiNS4uNjMxYjIxMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvY29iYWx0X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9jb2JhbHRfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIwCi0jIFR1ZSBGZWIgMjAgMjE6NDc6MjQgMjAwNworIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxLXJjNworIyBXZWQgQXByIDE4IDE0OjI1OjQ1IDIwMDcKICMKIENPTkZJR19NSVBTPXkKIApAQCAtNjIsNyArNjIsNiBAQAogIyBDT05GSUdfVE9TSElCQV9KTVIzOTI3IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPU0hJQkFfUkJUWDQ5MjcgaXMgbm90IHNldAogIyBDT05GSUdfVE9TSElCQV9SQlRYNDkzOCBpcyBub3Qgc2V0Ci1DT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldApAQCAtNzQsMTIgKzczLDE0IEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQogQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfU1lTX0hBU19FQVJMWV9QUklOVEs9eQogQ09ORklHX0k4MjU5PXkKICMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CiBDT05GSUdfU1lTX1NVUFBPUlRTX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX0lSUV9DUFU9eQotQ09ORklHX01JUFNfR1Q2NDExMT15CitDT05GSUdfUENJX0dUNjRYWFhfUENJMD15CiBDT05GSUdfTUlQU19MMV9DQUNIRV9TSElGVD01CiAKICMKQEAgLTE3OSw2ICsxODAsNyBAQAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAogQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQogQ09ORklHX1JFTEFZPXkKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVEw9eQogQ09ORklHX0VNQkVEREVEPXkKQEAgLTQ3Nyw3ICs0NzksNiBAQAogIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogQ09ORklHX0NEUk9NX1BLVENEVkQ9eQogQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04CiAjIENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSBpcyBub3Qgc2V0CkBAIC01MTgsNyArNTE5LDcgQEAKICMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JREVETUFfUENJPXkKICMgQ09ORklHX0JMS19ERVZfSURFRE1BX0ZPUkNFRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfUENJX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX09OTFlESVNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQUVDNjJYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0FMSTE1WDMgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9BTUQ3NFhYIGlzIG5vdCBzZXQKQEAgLTU0Niw3ICs1NDcsNiBAQAogIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVl9JREVETUE9eQogIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKIAogIwpAQCAtNzc5LDcgKzc3OSw4IEBACiAjCiAjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotQ09ORklHX1JUQz15CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CiBDT05GSUdfQ09CQUxUX0xDRD15CiAjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKICMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKQEAgLTgxNSw2ICs4MTYsMTEgQEAKICMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CiAKICMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CkBAIC04MjcsNyArODMzLDcgQEAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAogIyBDT05GSUdfRkIgaXMgbm90IHNldAogCiAjCkBAIC04MzUsNyArODQxLDYgQEAKICMKICMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKIENPTkZJR19EVU1NWV9DT05TT0xFPXkKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKICMgU291bmQKQEAgLTg5NCw3ICs4OTksMjkgQEAKICMKICMgUmVhbCBUaW1lIENsb2NrCiAjCi0jIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0hDVE9TWVM9eQorQ09ORklHX1JUQ19IQ1RPU1lTX0RFVklDRT0icnRjMCIKKyMgQ09ORklHX1JUQ19ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGludGVyZmFjZXMKKyMKK0NPTkZJR19SVENfSU5URl9TWVNGUz15CitDT05GSUdfUlRDX0lOVEZfUFJPQz15CitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisKKyMKKyMgUlRDIGRyaXZlcnMKKyMKK0NPTkZJR19SVENfRFJWX0NNT1M9eQorIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAogCiAjCiAjIERNQSBFbmdpbmUgc3VwcG9ydApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMDAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTAwMF9kZWZjb25maWcKaW5kZXggMGRiNmE4Yi4uMTBmNmFmNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMDAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjEwMDBfZGVmY29uZmlnCkBAIC05LDYgKzksNyBAQAogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwogQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19NQUNIX0FMQ0hFTVk9eQogIyBDT05GSUdfTUlQU19NVFgxIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfQk9TUE9SVVMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19QQjEwMDAgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTEwMF9kZWZjb25maWcKaW5kZXggMTYyYWRkOS4uNGIwODYyOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjExMDBfZGVmY29uZmlnCkBAIC05LDYgKzksNyBAQAogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwogQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19NQUNIX0FMQ0hFTVk9eQogIyBDT05GSUdfTUlQU19NVFgxIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfQk9TUE9SVVMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19QQjEwMDAgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMjAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTIwMF9kZWZjb25maWcKaW5kZXggODI4MDFlYy4uODIwNjU5ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMjAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjEyMDBfZGVmY29uZmlnCkBAIC05LDYgKzksNyBAQAogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwogQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19NQUNIX0FMQ0hFTVk9eQogIyBDT05GSUdfTUlQU19NVFgxIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfQk9TUE9SVVMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19QQjEwMDAgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTUwMF9kZWZjb25maWcKaW5kZXggNTQ1ZjIzMC4uNDA1MGI5YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjE1MDBfZGVmY29uZmlnCkBAIC05LDYgKzksNyBAQAogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwogQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19NQUNIX0FMQ0hFTVk9eQogIyBDT05GSUdfTUlQU19NVFgxIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfQk9TUE9SVVMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19QQjEwMDAgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTUwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTU1MF9kZWZjb25maWcKaW5kZXggNWJkM2I0My4uN2IzNTE5MCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTUwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjE1NTBfZGVmY29uZmlnCkBAIC05LDYgKzksNyBAQAogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwogQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19NQUNIX0FMQ0hFTVk9eQogIyBDT05GSUdfTUlQU19NVFgxIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfQk9TUE9SVVMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19QQjEwMDAgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvamFndWFyLWF0eF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9qYWd1YXItYXR4X2RlZmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzMTA0ZC4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9qYWd1YXItYXR4X2RlZmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDg5NyArMCwwIEBACi0jCi0jIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjAKLSMgVHVlIEZlYiAyMCAyMTo0NzozMyAyMDA3Ci0jCi1DT05GSUdfTUlQUz15Ci0KLSMKLSMgTWFjaGluZSBzZWxlY3Rpb24KLSMKLUNPTkZJR19aT05FX0RNQT15Ci0jIENPTkZJR19NSVBTX01UWDEgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19CT1NQT1JVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1BCMTIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTU1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0RCMTIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX01JUkFHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQVNMRVJfRVhDSVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xBU0FUIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfQVRMQVMgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19NQUxUQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1NFQUQgaXMgbm90IHNldAotIyBDT05GSUdfV1JfUFBNQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX1NJTSBpcyBub3Qgc2V0Ci1DT05GSUdfTU9NRU5DT19KQUdVQVJfQVRYPXkKLSMgQ09ORklHX01PTUVOQ09fT0NFTE9UIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PTUVOQ09fT0NFTE9UXzMgaXMgbm90IHNldAotIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT01FTkNPX09DRUxPVF9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfWFhTMTUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTlg4NTUwX0pCUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTlg4NTUwX1NUQjgxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19EREI1NDc3IGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfVlI0MVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BNQ19ZT1NFTUlURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19RRU1VIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BUktFSU5TIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9JUDIyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9JUDI3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9JUDMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9CSUdTVVIgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX1NXQVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9TRU5UT1NBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9SSE9ORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSUJZVEVfQ0FSTUVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9QVFNXQVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9MSVRUTEVTVVIgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX0NSSElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAotIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKLUNPTkZJR19KQUdVQVJfRE1BTE9XPXkKLUNPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKLSMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAotQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15Ci1DT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKLUNPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15Ci1DT05GSUdfR0VORVJJQ19USU1FPXkKLUNPTkZJR19TQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVI9eQotIyBDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRIGlzIG5vdCBzZXQKLUNPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQotQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQotQ09ORklHX0xJTUlURURfRE1BPXkKLUNPTkZJR19DUFVfQklHX0VORElBTj15Ci0jIENPTkZJR19DUFVfTElUVExFX0VORElBTiBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTX1NVUFBPUlRTX0JJR19FTkRJQU49eQotQ09ORklHX0lSUV9DUFU9eQotQ09ORklHX0lSUV9DUFVfUk03Sz15Ci1DT05GSUdfSVJRX01WNjQzNDA9eQotQ09ORklHX1BDSV9NQVJWRUxMPXkKLUNPTkZJR19TV0FQX0lPX1NQQUNFPXkKLUNPTkZJR19CT09UX0VMRjMyPXkKLUNPTkZJR19NSVBTX0wxX0NBQ0hFX1NISUZUPTUKLQotIwotIyBDUFUgc2VsZWN0aW9uCi0jCi0jIENPTkZJR19DUFVfTUlQUzMyX1IxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9NSVBTMzJfUjIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX01JUFM2NF9SMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfTUlQUzY0X1IyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SMzAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfVFgzOVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9WUjQxWFggaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I0MzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SNFgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfVFg0OVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SNTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfUjU0MzIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I2MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9ORVZBREEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I4MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SMTAwMDAgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1JNNzAwMCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX1JNOTAwMD15Ci0jIENPTkZJR19DUFVfU0IxIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNfSEFTX0NQVV9STTkwMDA9eQotQ09ORklHX1dFQUtfT1JERVJJTkc9eQotQ09ORklHX1NZU19TVVBQT1JUU18zMkJJVF9LRVJORUw9eQotQ09ORklHX1NZU19TVVBQT1JUU182NEJJVF9LRVJORUw9eQotQ09ORklHX0NQVV9TVVBQT1JUU18zMkJJVF9LRVJORUw9eQotQ09ORklHX0NQVV9TVVBQT1JUU182NEJJVF9LRVJORUw9eQotCi0jCi0jIEtlcm5lbCB0eXBlCi0jCi1DT05GSUdfMzJCSVQ9eQotIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAotQ09ORklHX1BBR0VfU0laRV80S0I9eQotIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQUdFX1NJWkVfMTZLQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0Ci1DT05GSUdfQk9BUkRfU0NBQ0hFPXkKLUNPTkZJR19STTcwMDBfQ1BVX1NDQUNIRT15Ci1DT05GSUdfQ1BVX0hBU19QUkVGRVRDSD15Ci1DT05GSUdfTUlQU19NVF9ESVNBQkxFRD15Ci0jIENPTkZJR19NSVBTX01UX1NNUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX01UX1NNVEMgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19WUEVfTE9BREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHXzY0QklUX1BIWVNfQUREUiBpcyBub3Qgc2V0Ci1DT05GSUdfQ1BVX0hBU19MTFNDPXkKLUNPTkZJR19DUFVfSEFTX1NZTkM9eQotQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQotQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKLUNPTkZJR19ISUdITUVNPXkKLUNPTkZJR19DUFVfU1VQUE9SVFNfSElHSE1FTT15Ci1DT05GSUdfU1lTX1NVUFBPUlRTX0hJR0hNRU09eQotQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQotQ09ORklHX0ZMQVRNRU09eQotQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKLSMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAotQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKLSMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0Ci1DT05GSUdfWk9ORV9ETUFfRkxBRz0xCi0jIENPTkZJR19IWl80OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAotIyBDT05GSUdfSFpfMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzI1MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IWl8yNTYgaXMgbm90IHNldAotQ09ORklHX0haXzEwMDA9eQotIyBDT05GSUdfSFpfMTAyNCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTX1NVUFBPUlRTX0FSQklUX0haPXkKLUNPTkZJR19IWj0xMDAwCi1DT05GSUdfUFJFRU1QVF9OT05FPXkKLSMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15Ci1DT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKLUNPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCi0KLSMKLSMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCi0jCi0jIENPTkZJR19FWFBFUklNRU5UQUwgaXMgbm90IHNldAotQ09ORklHX0JST0tFTl9PTl9TTVA9eQotQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgotCi0jCi0jIEdlbmVyYWwgc2V0dXAKLSMKLUNPTkZJR19MT0NBTFZFUlNJT049IiIKLUNPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15Ci1DT05GSUdfU1dBUD15Ci1DT05GSUdfU1lTVklQQz15Ci0jIENPTkZJR19JUENfTlMgaXMgbm90IHNldAotQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKLSMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAotIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci1DT05GSUdfSUtDT05GSUc9eQotQ09ORklHX0lLQ09ORklHX1BST0M9eQotQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQotQ09ORklHX1JFTEFZPXkKLUNPTkZJR19TWVNDVEw9eQotQ09ORklHX0VNQkVEREVEPXkKLUNPTkZJR19TWVNDVExfU1lTQ0FMTD15Ci1DT05GSUdfS0FMTFNZTVM9eQotIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0Ci1DT05GSUdfSE9UUExVRz15Ci1DT05GSUdfUFJJTlRLPXkKLUNPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQotQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLUNPTkZJR19SVF9NVVRFWEVTPXkKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19NT0RVTEVfVU5MT0FEPXkKLSMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKLUNPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEw9eQotQ09ORklHX0tNT0Q9eQotCi0jCi0jIEJsb2NrIGxheWVyCi0jCi1DT05GSUdfQkxPQ0s9eQotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAotIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKLQotIwotIyBJTyBTY2hlZHVsZXJzCi0jCi1DT05GSUdfSU9TQ0hFRF9OT09QPXkKLUNPTkZJR19JT1NDSEVEX0FTPXkKLUNPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKLUNPTkZJR19JT1NDSEVEX0NGUT15Ci1DT05GSUdfREVGQVVMVF9BUz15Ci0jIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCi0KLSMKLSMgQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBJU0EsIFRDKQotIwotQ09ORklHX0hXX0hBU19QQ0k9eQotQ09ORklHX1BDST15Ci1DT05GSUdfTU1VPXkKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKLQotIwotIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwotIwotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotQ09ORklHX1RSQURfU0lHTkFMUz15Ci0KLSMKLSMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCi0jCi1DT05GSUdfUE09eQotIyBDT05GSUdfUE1fTEVHQUNZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BNX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmtpbmcKLSMKLUNPTkZJR19ORVQ9eQotCi0jCi0jIE5ldHdvcmtpbmcgb3B0aW9ucwotIwotIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKLUNPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNPXkKLUNPTkZJR19YRlJNX1VTRVI9bQotIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVD15Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci1DT05GSUdfSVBfUE5QPXkKLSMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfSU5FVF9UVU5ORUw9bQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCi1DT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPW0KLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUPW0KLUNPTkZJR19JTkVUX0RJQUc9eQotQ09ORklHX0lORVRfVENQX0RJQUc9eQotIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0NVQklDPXkKLUNPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKLUNPTkZJR19JUFY2PW0KLUNPTkZJR19JUFY2X1BSSVZBQ1k9eQotQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQotQ09ORklHX0lORVQ2X0FIPW0KLUNPTkZJR19JTkVUNl9FU1A9bQotQ09ORklHX0lORVQ2X0lQQ09NUD1tCi1DT05GSUdfSU5FVDZfWEZSTV9UVU5ORUw9bQotQ09ORklHX0lORVQ2X1RVTk5FTD1tCi1DT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RSQU5TUE9SVD1tCi1DT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTD1tCi1DT05GSUdfSU5FVDZfWEZSTV9NT0RFX0JFRVQ9bQotQ09ORklHX0lQVjZfU0lUPW0KLUNPTkZJR19JUFY2X1RVTk5FTD1tCi1DT05GSUdfTkVUV09SS19TRUNNQVJLPXkKLSMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CUklER0UgaXMgbm90IHNldAotIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUNORVQgaXMgbm90IHNldAotIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUFggaXMgbm90IHNldAotIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAotCi0jCi0jIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZwotIwotIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIHRlc3RpbmcKLSMKLSMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAotIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAotIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CVCBpcyBub3Qgc2V0Ci1DT05GSUdfSUVFRTgwMjExPW0KLSMgQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfSUVFRTgwMjExX0NSWVBUX1dFUD1tCi1DT05GSUdfSUVFRTgwMjExX0NSWVBUX0NDTVA9bQotCi0jCi0jIERldmljZSBEcml2ZXJzCi0jCi0KLSMKLSMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucwotIwotQ09ORklHX1NUQU5EQUxPTkU9eQotQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotQ09ORklHX0ZXX0xPQURFUj1tCi0jIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgotIwotQ09ORklHX0NPTk5FQ1RPUj1tCi0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotIyBDT05GSUdfUE5QQUNQSSBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgZGV2aWNlcwotIwotIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0Ci1DT05GSUdfQ0RST01fUEtUQ0RWRD1tCi1DT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJTPTgKLUNPTkZJR19BVEFfT1ZFUl9FVEg9bQotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotQ09ORklHX1NHSV9JT0M0PW0KLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19SQUlEX0FUVFJTPW0KLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKLQotIwotIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKLSMKLSMgQ09ORklHX0FUQSBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKLSMKLSMgQ09ORklHX01EIGlzIG5vdCBzZXQKLQotIwotIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19GVVNJT04gaXMgbm90IHNldAotCi0jCi0jIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKLQotIwotIyBJMk8gZGV2aWNlIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyTyBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBBUkNuZXQgZGV2aWNlcwotIwotIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19QSFlMSUI9bQotCi0jCi0jIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKLSMKLUNPTkZJR19NQVJWRUxMX1BIWT1tCi1DT05GSUdfREFWSUNPTV9QSFk9bQotQ09ORklHX1FTRU1JX1BIWT1tCi1DT05GSUdfTFhUX1BIWT1tCi1DT05GSUdfQ0lDQURBX1BIWT1tCi1DT05GSUdfVklURVNTRV9QSFk9bQotQ09ORklHX1NNU0NfUEhZPW0KLSMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAotCi0jCi0jIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQotIwotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfTUlJPXkKLSMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAotIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAotIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKLQotIwotIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRfUENJPXkKLSMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAotIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAotIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CNDQgaXMgbm90IHNldAotIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RHUlMgaXMgbm90IHNldAotQ09ORklHX0VFUFJPMTAwPXkKLSMgQ09ORklHX0UxMDAgaXMgbm90IHNldAotIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKLSMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAotIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAotIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAotIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0Ci0KLSMKLSMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKLSMKLSMgQ09ORklHX0FDRU5JQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETDJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0UxMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAotIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAotIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAotIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKLUNPTkZJR19NVjY0M1hYX0VUSD15Ci1DT05GSUdfUUxBM1hYWD1tCi0KLSMKLSMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCi0jCi0jIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKLUNPTkZJR19DSEVMU0lPX1QzPW0KLSMgQ09ORklHX0lYR0IgaXMgbm90IHNldAotIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUWEVOX05JQz1tCi0KLSMKLSMgVG9rZW4gUmluZyBkZXZpY2VzCi0jCi0jIENPTkZJR19UUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCi0jCi0jIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAotCi0jCi0jIFdhbiBpbnRlcmZhY2VzCi0jCi0jIENPTkZJR19XQU4gaXMgbm90IHNldAotIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUFAgaXMgbm90IHNldAotIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAotCi0jCi0jIElTRE4gc3Vic3lzdGVtCi0jCi0jIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKLQotIwotIyBUZWxlcGhvbnkgU3VwcG9ydAotIwotIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAotCi0jCi0jIElucHV0IGRldmljZSBzdXBwb3J0Ci0jCi0jIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi0jIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0Ci0KLSMKLSMgQ2hhcmFjdGVyIGRldmljZXMKLSMKLSMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgU2VyaWFsIGRyaXZlcnMKLSMKLUNPTkZJR19TRVJJQUxfODI1MD15Ci1DT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15Ci1DT05GSUdfU0VSSUFMXzgyNTBfUENJPXkKLUNPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00Ci1DT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00Ci0jIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAotIwotQ09ORklHX1NFUklBTF9DT1JFPXkKLUNPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKLSMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk0gaXMgbm90IHNldAotIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgVFBNIGRldmljZXMKLSMKLQotIwotIyBJMkMgc3VwcG9ydAotIwotIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKLQotIwotIyBTUEkgc3VwcG9ydAotIwotIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAotCi0jCi0jIERhbGxhcydzIDEtd2lyZSBidXMKLSMKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKLSMKLSMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTXVsdGltZWRpYSBkZXZpY2VzCi0jCi0jIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0KLSMKLSMgR3JhcGhpY3Mgc3VwcG9ydAotIwotIyBDT05GSUdfRklSTVdBUkVfRURJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAotCi0jCi0jIFNvdW5kCi0jCi0jIENPTkZJR19TT1VORCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLUNPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKLUNPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15Ci1DT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQotIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKLQotIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCi0jCi0KLSMKLSMgVVNCIEdhZGdldCBTdXBwb3J0Ci0jCi0jIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCi0jIENPTkZJR19NTUMgaXMgbm90IHNldAotCi0jCi0jIExFRCBkZXZpY2VzCi0jCi0jIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0Ci0KLSMKLSMgTEVEIGRyaXZlcnMKLSMKLQotIwotIyBMRUQgVHJpZ2dlcnMKLSMKLQotIwotIyBJbmZpbmlCYW5kIHN1cHBvcnQKLSMKLSMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAotCi0jCi0jIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQotIwotCi0jCi0jIFJlYWwgVGltZSBDbG9jawotIwotCi0jCi0jIERNQSBFbmdpbmUgc3VwcG9ydAotIwotIyBDT05GSUdfRE1BX0VOR0lORSBpcyBub3Qgc2V0Ci0KLSMKLSMgRE1BIENsaWVudHMKLSMKLQotIwotIyBETUEgRGV2aWNlcwotIwotCi0jCi0jIEF1eGlsaWFyeSBEaXNwbGF5IHN1cHBvcnQKLSMKLQotIwotIyBWaXJ0dWFsaXphdGlvbgotIwotCi0jCi0jIEZpbGUgc3lzdGVtcwotIwotIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfRlNfUE9TSVhfQUNMPXkKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5PVElGWT15Ci1DT05GSUdfSU5PVElGWV9VU0VSPXkKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLSMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19GVVNFX0ZTPW0KLUNPTkZJR19HRU5FUklDX0FDTD15Ci0KLSMKLSMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VREZfRlMgaXMgbm90IHNldAotCi0jCi0jIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAotIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgUHNldWRvIGZpbGVzeXN0ZW1zCi0jCi1DT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15Ci1DT05GSUdfUFJPQ19TWVNDVEw9eQotQ09ORklHX1NZU0ZTPXkKLUNPTkZJR19UTVBGUz15Ci1DT05GSUdfVE1QRlNfUE9TSVhfQUNMPXkKLSMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0Ci1DT05GSUdfUkFNRlM9eQotCi0jCi0jIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKLSMKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAotCi0jCi0jIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCi0jCi1DT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAotIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0Ci1DT05GSUdfUk9PVF9ORlM9eQotQ09ORklHX0xPQ0tEPXkKLUNPTkZJR19ORlNfQ09NTU9OPXkKLUNPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlMgaXMgbm90IHNldAotIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi0jIENPTkZJR19OTFMgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi1DT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15Ci0jIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQotIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAotIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLUNPTkZJR19DUk9TU0NPTVBJTEU9eQotQ09ORklHX0NNRExJTkU9IiIKLUNPTkZJR19TWVNfU1VQUE9SVFNfS0dEQj15Ci0KLSMKLSMgU2VjdXJpdHkgb3B0aW9ucwotIwotQ09ORklHX0tFWVM9eQotQ09ORklHX0tFWVNfREVCVUdfUFJPQ19LRVlTPXkKLSMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKLQotIwotIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKLSMKLUNPTkZJR19DUllQVE89eQotQ09ORklHX0NSWVBUT19BTEdBUEk9eQotQ09ORklHX0NSWVBUT19CTEtDSVBIRVI9bQotQ09ORklHX0NSWVBUT19IQVNIPXkKLUNPTkZJR19DUllQVE9fTUFOQUdFUj15Ci1DT05GSUdfQ1JZUFRPX0hNQUM9eQotQ09ORklHX0NSWVBUT19OVUxMPW0KLUNPTkZJR19DUllQVE9fTUQ0PW0KLUNPTkZJR19DUllQVE9fTUQ1PW0KLUNPTkZJR19DUllQVE9fU0hBMT1tCi1DT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCi1DT05GSUdfQ1JZUFRPX1NIQTUxMj1tCi1DT05GSUdfQ1JZUFRPX1dQNTEyPW0KLUNPTkZJR19DUllQVE9fVEdSMTkyPW0KLUNPTkZJR19DUllQVE9fRUNCPW0KLUNPTkZJR19DUllQVE9fQ0JDPW0KLUNPTkZJR19DUllQVE9fUENCQz1tCi1DT05GSUdfQ1JZUFRPX0RFUz1tCi1DT05GSUdfQ1JZUFRPX0ZDUllQVD1tCi1DT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KLUNPTkZJR19DUllQVE9fVFdPRklTSD1tCi1DT05GSUdfQ1JZUFRPX1RXT0ZJU0hfQ09NTU9OPW0KLUNPTkZJR19DUllQVE9fU0VSUEVOVD1tCi1DT05GSUdfQ1JZUFRPX0FFUz1tCi1DT05GSUdfQ1JZUFRPX0NBU1Q1PW0KLUNPTkZJR19DUllQVE9fQ0FTVDY9bQotQ09ORklHX0NSWVBUT19URUE9bQotQ09ORklHX0NSWVBUT19BUkM0PW0KLUNPTkZJR19DUllQVE9fS0hBWkFEPW0KLUNPTkZJR19DUllQVE9fQU5VQklTPW0KLUNPTkZJR19DUllQVE9fREVGTEFURT1tCi1DT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KLUNPTkZJR19DUllQVE9fQ1JDMzJDPW0KLUNPTkZJR19DUllQVE9fQ0FNRUxMSUE9bQotIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAotCi0jCi0jIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCi0jCi0KLSMKLSMgTGlicmFyeSByb3V0aW5lcwotIwotQ09ORklHX0JJVFJFVkVSU0U9bQotIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKLUNPTkZJR19DUkMxNj1tCi1DT05GSUdfQ1JDMzI9bQotQ09ORklHX0xJQkNSQzMyQz1tCi1DT05GSUdfWkxJQl9JTkZMQVRFPW0KLUNPTkZJR19aTElCX0RFRkxBVEU9bQotQ09ORklHX1BMSVNUPXkKLUNPTkZJR19IQVNfSU9NRU09eQotQ09ORklHX0hBU19JT1BPUlQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvam1yMzkyN19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwppbmRleCAwNjhlNDhlLi4xYjM2NGNmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9qbXIzOTI3X2RlZmNvbmZpZwpAQCAtODAsNyArODAsNiBAQAogQ09ORklHX01JUFNfVFgzOTI3PXkKIENPTkZJR19TV0FQX0lPX1NQQUNFPXkKIENPTkZJR19NSVBTX0wxX0NBQ0hFX1NISUZUPTUKLUNPTkZJR19UT1NISUJBX0JPQVJEUz15CiAKICMKICMgQ1BVIHNlbGVjdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxMTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTEwMF9kZWZjb25maWcKaW5kZXggNjk2NzhkOS4uMzdkNjk2YyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxMTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wYjExMDBfZGVmY29uZmlnCkBAIC05LDYgKzksNyBAQAogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwogQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19NQUNIX0FMQ0hFTVk9eQogIyBDT05GSUdfTUlQU19NVFgxIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfQk9TUE9SVVMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19QQjEwMDAgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTUwMF9kZWZjb25maWcKaW5kZXggMDcwNjcyNy4uYjExZjBlOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wYjE1MDBfZGVmY29uZmlnCkBAIC05LDYgKzksNyBAQAogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwogQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19NQUNIX0FMQ0hFTVk9eQogIyBDT05GSUdfTUlQU19NVFgxIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfQk9TUE9SVVMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19QQjEwMDAgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTUwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTU1MF9kZWZjb25maWcKaW5kZXggMzU0ZTQ5Yi4uMjkyN2YzOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTUwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wYjE1NTBfZGVmY29uZmlnCkBAIC05LDYgKzksNyBAQAogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwogQ09ORklHX1pPTkVfRE1BPXkKK0NPTkZJR19NQUNIX0FMQ0hFTVk9eQogIyBDT05GSUdfTUlQU19NVFgxIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfQk9TUE9SVVMgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19QQjEwMDAgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2dfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvcmJobWE0MjAwX2RlZmNvbmZpZwpzaW1pbGFyaXR5IGluZGV4IDczJQpyZW5hbWUgZnJvbSBhcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZ19kZWZjb25maWcKcmVuYW1lIHRvIGFyY2gvbWlwcy9jb25maWdzL3JiaG1hNDIwMF9kZWZjb25maWcKaW5kZXggNzA3OGU2Yi4uMzVkNjQyNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2dfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3JiaG1hNDIwMF9kZWZjb25maWcKQEAgLTEsMTQgKzEsMTMgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMAotIyBUdWUgRmViIDIwIDIxOjQ3OjM2IDIwMDcKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMQorIyBXZWQgTWF5ICA5IDIzOjQ0OjE5IDIwMDcKICMKIENPTkZJR19NSVBTPXkKIAogIwogIyBNYWNoaW5lIHNlbGVjdGlvbgogIwotQ09ORklHX1pPTkVfRE1BPXkKICMgQ09ORklHX01JUFNfTVRYMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0JPU1BPUlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfUEIxMDAwIGlzIG5vdCBzZXQKQEAgLTMzLDExICszMiw5IEBACiAjIENPTkZJR19NSVBTX1NFQUQgaXMgbm90IHNldAogIyBDT05GSUdfV1JfUFBNQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX1NJTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT01FTkNPX0pBR1VBUl9BVFggaXMgbm90IHNldAogIyBDT05GSUdfTU9NRU5DT19PQ0VMT1QgaXMgbm90IHNldAogIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfMyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT01FTkNPX09DRUxPVF9DIGlzIG5vdCBzZXQKLUNPTkZJR19NT01FTkNPX09DRUxPVF9HPXkKICMgQ09ORklHX01JUFNfWFhTMTUwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19QTlg4NTUwX0pCUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QTlg4NTUwX1NUQjgxMCBpcyBub3Qgc2V0CkBAIC02MCw4ICs1Nyw5IEBACiAjIENPTkZJR19TSUJZVEVfQ1JIT05FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NOSV9STSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAotIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0CitDT05GSUdfVE9TSElCQV9SQlRYNDkyNz15CiAjIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RPU0hJQkFfRlBDSUIwIGlzIG5vdCBzZXQKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKICMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldApAQCAtNzAsMTkgKzY4LDE1IEBACiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQogQ09ORklHX0dFTkVSSUNfVElNRT15CiBDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKLSMgQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUSBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19ETUFfTk9OQ09IRVJFTlQ9eQogQ09ORklHX0RNQV9ORUVEX1BDSV9NQVBfU1RBVEU9eQorQ09ORklHX0k4MjU5PXkKIENPTkZJR19DUFVfQklHX0VORElBTj15CiAjIENPTkZJR19DUFVfTElUVExFX0VORElBTiBpcyBub3Qgc2V0CiBDT05GSUdfU1lTX1NVUFBPUlRTX0JJR19FTkRJQU49eQotQ09ORklHX0lSUV9DUFU9eQotQ09ORklHX0lSUV9DUFVfUk03Sz15Ci1DT05GSUdfUENJX01BUlZFTEw9eQorQ09ORklHX1NZU19TVVBQT1JUU19MSVRUTEVfRU5ESUFOPXkKIENPTkZJR19TV0FQX0lPX1NQQUNFPXkKLSMgQ09ORklHX1NZU0NMS183NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNDTEtfODMgaXMgbm90IHNldAotQ09ORklHX1NZU0NMS18xMDA9eQogQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQogCiAjCkBAIC05NywxOCArOTEsMTkgQEAKICMgQ09ORklHX0NQVV9WUjQxWFggaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1I0MzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9SNFgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfVFg0OVhYIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfVFg0OVhYPXkKICMgQ09ORklHX0NQVV9SNTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfUjU0MzIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1I2MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9ORVZBREEgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1I4MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9SMTAwMDAgaXMgbm90IHNldAotQ09ORklHX0NQVV9STTcwMDA9eQorIyBDT05GSUdfQ1BVX1JNNzAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfUk05MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TQjEgaXMgbm90IHNldAotQ09ORklHX1NZU19IQVNfQ1BVX1JNNzAwMD15CitDT05GSUdfU1lTX0hBU19DUFVfVFg0OVhYPXkKIENPTkZJR19TWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKK0NPTkZJR19TWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMPXkKIENPTkZJR19DUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKIENPTkZJR19DUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMPXkKIApAQCAtMTIxLDE5ICsxMTYsMTUgQEAKICMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAogIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAotQ09ORklHX0JPQVJEX1NDQUNIRT15Ci1DT05GSUdfUk03MDAwX0NQVV9TQ0FDSEU9eQogQ09ORklHX0NQVV9IQVNfUFJFRkVUQ0g9eQogQ09ORklHX01JUFNfTVRfRElTQUJMRUQ9eQogIyBDT05GSUdfTUlQU19NVF9TTVAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19NVF9TTVRDIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfVlBFX0xPQURFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR182NEJJVF9QSFlTX0FERFIgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfTExTQz15CiBDT05GSUdfQ1BVX0hBU19TWU5DPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15Ci1DT05GSUdfQ1BVX1NVUFBPUlRTX0hJR0hNRU09eQogQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKQEAgLTE0MywxNyArMTM0LDE3IEBACiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQogIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAotQ09ORklHX1JFU09VUkNFU182NEJJVD15Ci1DT05GSUdfWk9ORV9ETUFfRkxBRz0xCisjIENPTkZJR19SRVNPVVJDRVNfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAogIyBDT05GSUdfSFpfNDggaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEyOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CiAjIENPTkZJR19IWl8yNTYgaXMgbm90IHNldAotQ09ORklHX0haXzEwMDA9eQorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDI0IGlzIG5vdCBzZXQKIENPTkZJR19TWVNfU1VQUE9SVFNfQVJCSVRfSFo9eQotQ09ORklHX0haPTEwMDAKK0NPTkZJR19IWj0yNTAKIENPTkZJR19QUkVFTVBUX05PTkU9eQogIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CkBAIC0xODMsMzQgKzE3NCw0MiBAQAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKLUNPTkZJR19SRUxBWT15Ci0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19FTUJFRERFRD15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotQ09ORklHX0hPVFBMVUc9eQorIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQogQ09ORklHX0VMRl9DT1JFPXkKIENPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CisjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CiBDT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLUNPTkZJR19SVF9NVVRFWEVTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CiAjCi0jIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX01PRFVMRV9VTkxPQUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKIAogIwogIyBCbG9jayBsYXllcgpAQCAtMjE4LDcgKzIxNyw3IEBACiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAotQ09ORklHX0xTRj15CisjIENPTkZJR19MU0YgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKQEAgLTIzOCwxNyArMjM3LDEyIEBACiAjCiBDT05GSUdfSFdfSEFTX1BDST15CiBDT05GSUdfUENJPXkKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIENPTkZJR19NTVU9eQogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKLSMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgUENJIEhvdHBsdWcgU3VwcG9ydAotIwotIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAogCiAjCiAjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCkBAIC0yNjAsMTAgKzI1NCw3IEBACiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucwogIwotQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKIAogIwogIyBOZXR3b3JraW5nCkBAIC0yNzMsMjUgKzI2NCwyMSBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLSMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKLUNPTkZJR19YRlJNPXkKLUNPTkZJR19YRlJNX1VTRVI9eQotIyBDT05GSUdfWEZSTV9TVUJfUE9MSUNZIGlzIG5vdCBzZXQKLUNPTkZJR19YRlJNX01JR1JBVEU9eQotQ09ORklHX05FVF9LRVk9eQotQ09ORklHX05FVF9LRVlfTUlHUkFURT15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUPXkKLSMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTVVMVElDQVNUPXkKICMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CiBDT05GSUdfSVBfRklCX0hBU0g9eQogQ09ORklHX0lQX1BOUD15Ci1DT05GSUdfSVBfUE5QX0RIQ1A9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAogIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAogIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKQEAgLTI5OSwxOSArMjg2LDE5IEBACiAjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15Ci1DT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgotQ09ORklHX1RDUF9NRDVTSUc9eQorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTkVUV09SS19TRUNNQVJLPXkKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAogCiAjCkBAIC0zNTIsMTMgKzMzOSwxNiBAQAogIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0Ci1DT05GSUdfSUVFRTgwMjExPXkKLSMgQ09ORklHX0lFRUU4MDIxMV9ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfSUVFRTgwMjExX0NSWVBUX1dFUD15Ci1DT05GSUdfSUVFRTgwMjExX0NSWVBUX0NDTVA9eQotQ09ORklHX0lFRUU4MDIxMV9TT0ZUTUFDPXkKLSMgQ09ORklHX0lFRUU4MDIxMV9TT0ZUTUFDX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19XSVJFTEVTU19FWFQ9eQorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzCisjCisjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTU19FWFQgaXMgbm90IHNldAorIyBDT05GSUdfTUFDODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTM2OSwxOCArMzU5LDEyIEBACiAjCiBDT05GSUdfU1RBTkRBTE9ORT15CiBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15Ci1DT05GSUdfRldfTE9BREVSPXkKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIAogIwogIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCiAjCi1DT05GSUdfQ09OTkVDVE9SPXkKLUNPTkZJR19QUk9DX0VWRU5UUz15Ci0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX01URCBpcyBub3Qgc2V0CiAKICMKQEAgLTQwMSwyMSArMzg1LDI0IEBACiAjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0Ci1DT05GSUdfQ0RST01fUEtUQ0RWRD15Ci1DT05GSUdfQ0RST01fUEtUQ0RWRF9CVUZGRVJTPTgKLSMgQ09ORklHX0NEUk9NX1BLVENEVkRfV0NBQ0hFIGlzIG5vdCBzZXQKLUNPTkZJR19BVEFfT1ZFUl9FVEg9eQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9ODE5MgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKICMgTWlzYyBkZXZpY2VzCiAjCi1DT05GSUdfU0dJX0lPQzQ9eQorIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CiAjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogCiAjCiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKQEAgLTQyNSw3ICs0MTIsNyBAQAogIwogIyBTQ1NJIGRldmljZSBzdXBwb3J0CiAjCi1DT05GSUdfUkFJRF9BVFRSUz15CisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0kgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKIApAQCAtNDcxLDI3ICs0NTgsMTMgQEAKICMKICMgUEhZIGRldmljZSBzdXBwb3J0CiAjCi1DT05GSUdfUEhZTElCPXkKLQotIwotIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCi0jCi1DT05GSUdfTUFSVkVMTF9QSFk9eQotQ09ORklHX0RBVklDT01fUEhZPXkKLUNPTkZJR19RU0VNSV9QSFk9eQotQ09ORklHX0xYVF9QSFk9eQotQ09ORklHX0NJQ0FEQV9QSFk9eQotQ09ORklHX1ZJVEVTU0VfUEhZPXkKLUNPTkZJR19TTVNDX1BIWT15Ci0jIENPTkZJR19CUk9BRENPTV9QSFkgaXMgbm90IHNldAotIyBDT05GSUdfRklYRURfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCiAjCiBDT05GSUdfTkVUX0VUSEVSTkVUPXkKLUNPTkZJR19NSUk9eQotQ09ORklHX0dBTElMRU9fNjQyNDBfRVRIPXkKKyMgQ09ORklHX01JSSBpcyBub3Qgc2V0CiAjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAogIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKICMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldApAQCAtNTAzLDYgKzQ3Niw3IEBACiAjCiAjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAogIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FMjAwMD15CiAjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKIAogIwpAQCAtNTIxLDE4ICs0OTUsMTggQEAKICMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAogIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKICMgQ09ORklHX0JOWDIgaXMgbm90IHNldAotQ09ORklHX1FMQTNYWFg9eQorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKICMKICMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAotQ09ORklHX0NIRUxTSU9fVDM9eQorIyBDT05GSUdfQ0hFTFNJT19UMyBpcyBub3Qgc2V0CiAjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKICMgQ09ORklHX1MySU8gaXMgbm90IHNldAogIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAotQ09ORklHX05FVFhFTl9OSUM9eQorIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0CiAKICMKICMgVG9rZW4gUmluZyBkZXZpY2VzCkBAIC01NDAsOSArNTE0LDEwIEBACiAjIENPTkZJR19UUiBpcyBub3Qgc2V0CiAKICMKLSMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjIFdpcmVsZXNzIExBTgogIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dMQU5fUFJFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTl84MDIxMSBpcyBub3Qgc2V0CiAKICMKICMgV2FuIGludGVyZmFjZXMKQEAgLTU3MCwyOSArNTQ1LDcgQEAKICMKICMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKICMKLUNPTkZJR19JTlBVVD15Ci0jIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKLQotIwotIyBVc2VybGFuZCBpbnRlcmZhY2VzCi0jCi1DT05GSUdfSU5QVVRfTU9VU0VERVY9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4Ci0jIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAotCi0jCi0jIElucHV0IERldmljZSBEcml2ZXJzCi0jCi0jIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBJL08gcG9ydHMKQEAgLTYwMSwzNCArNTU0LDMxIEBACiAjIENPTkZJR19TRVJJT19JODA0MiBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSU9fU0VSUE9SVD15CiAjIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSU9fTElCUFMyIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJT19SQVc9eQorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAogIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAogCiAjCiAjIENoYXJhY3RlciBkZXZpY2VzCiAjCi1DT05GSUdfVlQ9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CisjIENPTkZJR19WVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogCiAjCiAjIFNlcmlhbCBkcml2ZXJzCiAjCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX1BDST15Ci1DT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9NAotQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAotIyBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAogCiAjCiAjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKICMKIENPTkZJR19TRVJJQUxfQ09SRT15CiBDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX1RYWDk9eQorQ09ORklHX0hBU19UWFg5X1NFUklBTD15CitDT05GSUdfU0VSSUFMX1RYWDlfTlJfVUFSVFM9NgorQ09ORklHX1NFUklBTF9UWFg5X0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9UWFg5X1NURFNFUklBTD15CiAjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKIENPTkZJR19VTklYOThfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWVM9eQpAQCAtNjU2LDEwICs2MDYsNyBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKK0NPTkZJR19ERVZQT1JUPXkKICMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CiAKICMKQEAgLTY3MiwxMiArNjE5LDEyIEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKIAogIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycwogIwotIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CiAKICMKICMgTXVsdGltZWRpYSBkZXZpY2VzCkBAIC02OTIsMTUgKzYzOSwxNCBAQAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCi0jIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKLSMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKICMKLSMgQ09ORklHX1ZHQV9DT05TT0xFIGlzIG5vdCBzZXQKLUNPTkZJR19EVU1NWV9DT05TT0xFPXkKLSMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkIgaXMgbm90IHNldAogCiAjCiAjIFNvdW5kCkBAIC03MDgsMTEgKzY1NCw2IEBACiAjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CiAKICMKLSMgSElEIERldmljZXMKLSMKLSMgQ09ORklHX0hJRCBpcyBub3Qgc2V0Ci0KLSMKICMgVVNCIHN1cHBvcnQKICMKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKQEAgLTcyOCwxMCArNjY5LDYgQEAKICMgVVNCIEdhZGdldCBTdXBwb3J0CiAjCiAjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKLQotIwotIyBNTUMvU0QgQ2FyZCBzdXBwb3J0Ci0jCiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCkBAIC03NTksNyArNjk2LDQwIEBACiAjCiAjIFJlYWwgVGltZSBDbG9jawogIwotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfRFMxNzQyPXkKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIwogCiAjCiAjIERNQSBFbmdpbmUgc3VwcG9ydApAQCAtNzg1LDkgKzc1NSw3IEBACiAjCiAjIEZpbGUgc3lzdGVtcwogIwotQ09ORklHX0VYVDJfRlM9eQotIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CkBAIC04MDEsMTAgKzc2OSwxMCBAQAogQ09ORklHX0lOT1RJRlk9eQogQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0Ci1DT05GSUdfRE5PVElGWT15CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19GVVNFX0ZTPXkKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfQUNMPXkKIAogIwpAQCAtODI0LDIxICs3OTIsMjAgQEAKICMgUHNldWRvIGZpbGVzeXN0ZW1zCiAjCiBDT05GSUdfUFJPQ19GUz15Ci1DT05GSUdfUFJPQ19LQ09SRT15CisjIENPTkZJR19QUk9DX0tDT1JFIGlzIG5vdCBzZXQKIENPTkZJR19QUk9DX1NZU0NUTD15CiBDT05GSUdfU1lTRlM9eQogQ09ORklHX1RNUEZTPXkKIENPTkZJR19UTVBGU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15Ci1DT05GSUdfQ09ORklHRlNfRlM9eQorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAogCiAjCiAjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKICMKICMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FQ1JZUFRfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CkBAIC04NTUsMTcgKzgyMiwxNyBAQAogIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwogIwogQ09ORklHX05GU19GUz15Ci0jIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAotQ09ORklHX05GU0Q9eQotIyBDT05GSUdfTkZTRF9WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKIENPTkZJR19ST09UX05GUz15CiBDT05GSUdfTE9DS0Q9eQotQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19MT0NLRF9WND15CiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAogIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKQEAgLTg4OSwxMCArODU2LDcgQEAKICMKICMgRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyCiAjCi1DT05GSUdfRExNPXkKLUNPTkZJR19ETE1fVENQPXkKLSMgQ09ORklHX0RMTV9TQ1RQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RMTV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAogCiAjCiAjIFByb2ZpbGluZyBzdXBwb3J0CkBAIC05MTAsNzIgKzg3NCwyOSBAQAogIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKIENPTkZJR19DUk9TU0NPTVBJTEU9eQogQ09ORklHX0NNRExJTkU9IiIKK0NPTkZJR19TWVNfU1VQUE9SVFNfS0dEQj15CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwogIwotQ09ORklHX0tFWVM9eQotQ09ORklHX0tFWVNfREVCVUdfUFJPQ19LRVlTPXkKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAogCiAjCiAjIENyeXB0b2dyYXBoaWMgb3B0aW9ucwogIwotQ09ORklHX0NSWVBUTz15Ci1DT05GSUdfQ1JZUFRPX0FMR0FQST15Ci1DT05GSUdfQ1JZUFRPX0JMS0NJUEhFUj15Ci1DT05GSUdfQ1JZUFRPX0hBU0g9eQotQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKLUNPTkZJR19DUllQVE9fSE1BQz15Ci1DT05GSUdfQ1JZUFRPX1hDQkM9eQotQ09ORklHX0NSWVBUT19OVUxMPXkKLUNPTkZJR19DUllQVE9fTUQ0PXkKLUNPTkZJR19DUllQVE9fTUQ1PXkKLUNPTkZJR19DUllQVE9fU0hBMT15Ci1DT05GSUdfQ1JZUFRPX1NIQTI1Nj15Ci1DT05GSUdfQ1JZUFRPX1NIQTUxMj15Ci1DT05GSUdfQ1JZUFRPX1dQNTEyPXkKLUNPTkZJR19DUllQVE9fVEdSMTkyPXkKLUNPTkZJR19DUllQVE9fR0YxMjhNVUw9eQotQ09ORklHX0NSWVBUT19FQ0I9eQotQ09ORklHX0NSWVBUT19DQkM9eQotQ09ORklHX0NSWVBUT19QQ0JDPXkKLUNPTkZJR19DUllQVE9fTFJXPXkKLUNPTkZJR19DUllQVE9fREVTPXkKLUNPTkZJR19DUllQVE9fRkNSWVBUPXkKLUNPTkZJR19DUllQVE9fQkxPV0ZJU0g9eQotQ09ORklHX0NSWVBUT19UV09GSVNIPXkKLUNPTkZJR19DUllQVE9fVFdPRklTSF9DT01NT049eQotQ09ORklHX0NSWVBUT19TRVJQRU5UPXkKLUNPTkZJR19DUllQVE9fQUVTPXkKLUNPTkZJR19DUllQVE9fQ0FTVDU9eQotQ09ORklHX0NSWVBUT19DQVNUNj15Ci1DT05GSUdfQ1JZUFRPX1RFQT15Ci1DT05GSUdfQ1JZUFRPX0FSQzQ9eQotQ09ORklHX0NSWVBUT19LSEFaQUQ9eQotQ09ORklHX0NSWVBUT19BTlVCSVM9eQotQ09ORklHX0NSWVBUT19ERUZMQVRFPXkKLUNPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9eQotQ09ORklHX0NSWVBUT19DUkMzMkM9eQotQ09ORklHX0NSWVBUT19DQU1FTExJQT15Ci0KLSMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIwogQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKLUNPTkZJR19DUkMxNj15CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQotQ09ORklHX0xJQkNSQzMyQz15Ci1DT05GSUdfWkxJQl9JTkZMQVRFPXkKLUNPTkZJR19aTElCX0RFRkxBVEU9eQotQ09ORklHX1BMSVNUPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3JiaG1hNDUwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9yYmhtYTQ1MDBfZGVmY29uZmlnCmluZGV4IDdkMGYyMTcuLjQxMDExZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3JiaG1hNDUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcmJobWE0NTAwX2RlZmNvbmZpZwpAQCAtODksNyArODksNiBAQAogQ09ORklHX1NXQVBfSU9fU1BBQ0U9eQogQ09ORklHX01JUFNfTDFfQ0FDSEVfU0hJRlQ9NQogQ09ORklHX0hBVkVfU1REX1BDX1NFUklBTF9QT1JUPXkKLUNPTkZJR19UT1NISUJBX0JPQVJEUz15CiAKICMKICMgQ1BVIHNlbGVjdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI5X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3RiMDIxOV9kZWZjb25maWcKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI5X2RlZmNvbmZpZwpyZW5hbWUgdG8gYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjE5X2RlZmNvbmZpZwppbmRleCAxNzU2ZDJiLi44YjE2NzVjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy90YjAyMjlfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3RiMDIxOV9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjAKLSMgVHVlIEZlYiAyMCAyMTo0Nzo0MSAyMDA3CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjEtcmM2CisjIFN1biBBcHIgMTUgMDE6MDY6MDEgMjAwNwogIwogQ09ORklHX01JUFM9eQogCkBAIC02NiwxMCArNjYsMTEgQEAKICMgQ09ORklHX0lCTV9XT1JLUEFEIGlzIG5vdCBzZXQKICMgQ09ORklHX05FQ19DTUJWUjQxMzMgaXMgbm90IHNldAogQ09ORklHX1RBTkJBQ19UQjAyMlg9eQotIyBDT05GSUdfVEFOQkFDX1RCMDIyNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19UQU5CQUNfVEIwMjg3IGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQ1RPUl9NUEMzMFggaXMgbm90IHNldAogIyBDT05GSUdfWkFPX0NBUENFTExBIGlzIG5vdCBzZXQKK0NPTkZJR19UQU5CQUNfVEIwMjE5PXkKKyMgQ09ORklHX1RBTkJBQ19UQjAyMjYgaXMgbm90IHNldAorIyBDT05GSUdfVEFOQkFDX1RCMDI4NyBpcyBub3Qgc2V0CiBDT05GSUdfUENJX1ZSNDFYWD15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiAjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldApAQCAtMTg0LDYgKzE4NSw3IEBACiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19FTUJFRERFRD15CkBAIC0zNzUsNyArMzc3LDcgQEAKICMKIENPTkZJR19TVEFOREFMT05FPXkKIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLSMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CitDT05GSUdfRldfTE9BREVSPW0KICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIAogIwpAQCAtNDE1LDcgKzQxNyw2IEBACiBDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKIENPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKIENPTkZJR19CTEtfREVWX1JBTV9CTE9DS1NJWkU9MTAyNAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAogCkBAIC02NDYsNyArNjQ3LDcgQEAKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAotQ09ORklHX1RBTkJBQ19UQjAyMTk9eQorQ09ORklHX0dQSU9fVEIwMjE5PXkKICMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CiBDT05GSUdfR1BJT19WUjQxWFg9eQogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CkBAIC02NzksNiArNjgwLDExIEBACiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogCiAjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisKKyMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldApAQCAtNjkyLDcgKzY5OCw3IEBACiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKLSMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKIAogIwpAQCAtNzAwLDcgKzcwNiw2IEBACiAjCiAjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CiBDT05GSUdfRFVNTVlfQ09OU09MRT15Ci0jIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAogCiAjCiAjIFNvdW5kCkBAIC04MzEsNiArODM2LDcgQEAKICMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9UUkFOQ0VWSUJSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSU9XQVJSSU9SIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gvbWlwcy9rZXJuZWwvZWFybHlfcHJpbnRrLmMKaW5kZXggNGZhNTRiMi4uOWRjY2ZhNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9lYXJseV9wcmludGsuYworKysgYi9hcmNoL21pcHMva2VybmVsL2Vhcmx5X3ByaW50ay5jCkBAIC0xMiw3ICsxMiw4IEBACiAKIGV4dGVybiB2b2lkIHByb21fcHV0Y2hhcihjaGFyKTsKIAotc3RhdGljIHZvaWQgZWFybHlfY29uc29sZV93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBuKQorc3RhdGljIHZvaWQgX19pbml0CitlYXJseV9jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjb24sIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIG4pCiB7CiAJd2hpbGUgKG4tLSAmJiAqcykgewogCQlpZiAoKnMgPT0gJ1xuJykKQEAgLTIyLDE0ICsyMywyMCBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBjb25zb2xlIGVhcmx5X2NvbnNvbGUgPSB7CitzdGF0aWMgc3RydWN0IGNvbnNvbGUgZWFybHlfY29uc29sZSBfX2luaXRkYXRhID0gewogCS5uYW1lCT0gImVhcmx5IiwKIAkud3JpdGUJPSBlYXJseV9jb25zb2xlX3dyaXRlLAogCS5mbGFncwk9IENPTl9QUklOVEJVRkZFUiB8IENPTl9CT09ULAogCS5pbmRleAk9IC0xCiB9OwogCitzdGF0aWMgaW50IGVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQgX19pbml0ZGF0YTsKKwogdm9pZCBfX2luaXQgc2V0dXBfZWFybHlfcHJpbnRrKHZvaWQpCiB7CisJaWYgKGVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKwllYXJseV9jb25zb2xlX2luaXRpYWxpemVkID0gMTsKKwogCXJlZ2lzdGVyX2NvbnNvbGUoJmVhcmx5X2NvbnNvbGUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtbXNjMDEuYyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLW1zYzAxLmMKaW5kZXggMjk2NzUzNy4uNDEwODY4YiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtbXNjMDEuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycS1tc2MwMS5jCkBAIC0xMzIsMTEgKzEzMiwxMSBAQAogfTsKIAogCi12b2lkIF9faW5pdCBpbml0X21zY19pcnFzKHVuc2lnbmVkIGludCBiYXNlLCBtc2NfaXJxbWFwX3QgKmltcCwgaW50IG5pcnEpCit2b2lkIF9faW5pdCBpbml0X21zY19pcnFzKHVuc2lnbmVkIGxvbmcgaWN1YmFzZSwgdW5zaWduZWQgaW50IGlycWJhc2UsIG1zY19pcnFtYXBfdCAqaW1wLCBpbnQgbmlycSkKIHsKIAlleHRlcm4gdm9pZCAoKmJvYXJkX2JpbmRfZWljX2ludGVycnVwdCkodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHJlZ3NldCk7CiAKLQlfaWNjdHJsX21zYyA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwIChNSVBTX01TQzAxX0lDX1JFR19CQVNFLCAweDQwMDAwKTsKKwlfaWNjdHJsX21zYyA9ICh1bnNpZ25lZCBsb25nKSBpb3JlbWFwIChpY3ViYXNlLCAweDQwMDAwKTsKIAogCS8qIFJlc2V0IGludGVycnVwdCBjb250cm9sbGVyIC0gaW5pdGlhbGlzZXMgYWxsIHJlZ2lzdGVycyB0byAwICovCiAJTVNDSUNfV1JJVEUoTVNDMDFfSUNfUlNULCBNU0MwMV9JQ19SU1RfUlNUX0JJVCk7CkBAIC0xNDgsMTQgKzE0OCwxNCBAQAogCiAJCXN3aXRjaCAoaW1wLT5pbV90eXBlKSB7CiAJCWNhc2UgTVNDMDFfSVJRX0VER0U6Ci0JCQlzZXRfaXJxX2NoaXAoYmFzZStuLCAmbXNjX2VkZ2VpcnFfdHlwZSk7CisJCQlzZXRfaXJxX2NoaXAoaXJxYmFzZStuLCAmbXNjX2VkZ2VpcnFfdHlwZSk7CiAJCQlpZiAoY3B1X2hhc192ZWljKQogCQkJCU1TQ0lDX1dSSVRFKE1TQzAxX0lDX1NVUCtuKjgsIE1TQzAxX0lDX1NVUF9FREdFX0JJVCk7CiAJCQllbHNlCiAJCQkJTVNDSUNfV1JJVEUoTVNDMDFfSUNfU1VQK24qOCwgTVNDMDFfSUNfU1VQX0VER0VfQklUIHwgaW1wLT5pbV9sdmwpOwogCQkJYnJlYWs7CiAJCWNhc2UgTVNDMDFfSVJRX0xFVkVMOgotCQkJc2V0X2lycV9jaGlwKGJhc2UrbiwgJm1zY19sZXZlbGlycV90eXBlKTsKKwkJCXNldF9pcnFfY2hpcChpcnFiYXNlK24sICZtc2NfbGV2ZWxpcnFfdHlwZSk7CiAJCQlpZiAoY3B1X2hhc192ZWljKQogCQkJCU1TQ0lDX1dSSVRFKE1TQzAxX0lDX1NVUCtuKjgsIDApOwogCQkJZWxzZQpAQCAtMTYzLDcgKzE2Myw3IEBACiAJCX0KIAl9CiAKLQlpcnFfYmFzZSA9IGJhc2U7CisJaXJxX2Jhc2UgPSBpcnFiYXNlOwogCiAJTVNDSUNfV1JJVEUoTVNDMDFfSUNfR0VOQSwgTVNDMDFfSUNfR0VOQV9HRU5BX0JJVCk7CS8qIEVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2lycS5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEuYwppbmRleCAyZmU0Yzg2Li5hZWRlZDZjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvaXJxLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgaXJxX21hcFtOUl9JUlFTIC8gQklUU19QRVJfTE9OR107CiAKLWludCBfX2RldmluaXQgYWxsb2NhdGVfaXJxbm8odm9pZCkKK2ludCBhbGxvY2F0ZV9pcnFubyh2b2lkKQogewogCWludCBpcnE7CiAKQEAgLTU5LDcgKzU5LDcgQEAKIAkJQlVHX09OKHRlc3RfYW5kX3NldF9iaXQoaSwgaXJxX21hcCkpOwogfQogCi12b2lkIF9fZGV2aW5pdCBmcmVlX2lycW5vKHVuc2lnbmVkIGludCBpcnEpCit2b2lkIGZyZWVfaXJxbm8odW5zaWduZWQgaW50IGlycSkKIHsKIAlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKIAljbGVhcl9iaXQoaXJxLCBpcnFfbWFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdGltZS5jIGIvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKaW5kZXggZTVlNTZiZC4uNzUxYjRhMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMKQEAgLTMwNiw3ICszMDYsNyBAQAogCiBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfbWlwcyA9IHsKIAkubmFtZQkJPSAiTUlQUyIsCi0JLm1hc2sJCT0gMHhmZmZmZmZmZiwKKwkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKaW5kZXggZmY0NWE0Yi4uMjAwZGUwMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYwpAQCAtOTI3LDkgKzkyNyw5IEBACiAJICAgICAgKHJlZ3MtPmNwMF9jYXVzZSAmIDB4N2YpID4+IDIpOwogfQogCi1hc21saW5rYWdlIHZvaWQgZG9fZGVmYXVsdF92aShzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyBhc21saW5rYWdlIHZvaWQgZG9fZGVmYXVsdF92aSh2b2lkKQogewotCXNob3dfcmVncyhyZWdzKTsKKwlzaG93X3JlZ3MoZ2V0X2lycV9yZWdzKCkpOwogCXBhbmljKCJDYXVnaHQgdW5leHBlY3RlZCB2ZWN0b3JlZCBpbnRlcnJ1cHQuIik7CiB9CiAKQEAgLTExMjgsNyArMTEyOCw3IEBACiAJY2xlYXJfYml0KHNldCwgJnNyLT5zcl9hbGxvY2F0ZWQpOwogfQogCi1zdGF0aWMgdm9pZCAqc2V0X3ZpX3Nyc19oYW5kbGVyKGludCBuLCB2b2lkICphZGRyLCBpbnQgc3JzKQorc3RhdGljIHZvaWQgKnNldF92aV9zcnNfaGFuZGxlcihpbnQgbiwgdmlfaGFuZGxlcl90IGFkZHIsIGludCBzcnMpCiB7CiAJdW5zaWduZWQgbG9uZyBoYW5kbGVyOwogCXVuc2lnbmVkIGxvbmcgb2xkX2hhbmRsZXIgPSB2aV9oYW5kbGVyc1tuXTsKQEAgLTEyMTcsNyArMTIxNyw3IEBACiAJcmV0dXJuICh2b2lkICopb2xkX2hhbmRsZXI7CiB9CiAKLXZvaWQgKnNldF92aV9oYW5kbGVyKGludCBuLCB2b2lkICphZGRyKQordm9pZCAqc2V0X3ZpX2hhbmRsZXIoaW50IG4sIHZpX2hhbmRsZXJfdCBhZGRyKQogewogCXJldHVybiBzZXRfdmlfc3JzX2hhbmRsZXIobiwgYWRkciwgMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGliL01ha2VmaWxlIGIvYXJjaC9taXBzL2xpYi9NYWtlZmlsZQppbmRleCBkN2QzYjE0Li41ZGFkMTNlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9saWIvTWFrZWZpbGUKQEAgLTksNCArOSw0IEBACiBvYmotJChDT05GSUdfUENJKQkrPSBpb21hcC1wY2kubwogCiAjIGxpYmdjYy1zdHlsZSBzdHVmZiBuZWVkZWQgaW4gdGhlIGtlcm5lbAotbGliLXkgKz0gYXNobGRpMy5vIGFzaHJkaTMubyBsc2hyZGkzLm8KK2xpYi15ICs9IGFzaGxkaTMubyBhc2hyZGkzLm8gbHNocmRpMy5vIHVjbXBkaTIubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2xpYi91Y21wZGkyLmMgYi9hcmNoL21pcHMvbGliL3VjbXBkaTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWZmMjU4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2xpYi91Y21wZGkyLmMKQEAgLTAsMCArMSwxOSBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAibGliZ2NjLmgiCisKK3dvcmRfdHlwZSBfX3VjbXBkaTIgKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKQoreworCWNvbnN0IERXdW5pb24gYXUgPSB7LmxsID0gYX07CisJY29uc3QgRFd1bmlvbiBidSA9IHsubGwgPSBifTsKKworCWlmICgodW5zaWduZWQgaW50KSBhdS5zLmhpZ2ggPCAodW5zaWduZWQgaW50KSBidS5zLmhpZ2gpCisJCXJldHVybiAwOworCWVsc2UgaWYgKCh1bnNpZ25lZCBpbnQpIGF1LnMuaGlnaCA+ICh1bnNpZ25lZCBpbnQpIGJ1LnMuaGlnaCkKKwkJcmV0dXJuIDI7CisJaWYgKCh1bnNpZ25lZCBpbnQpIGF1LnMubG93IDwgKHVuc2lnbmVkIGludCkgYnUucy5sb3cpCisJCXJldHVybiAwOworCWVsc2UgaWYgKCh1bnNpZ25lZCBpbnQpIGF1LnMubG93ID4gKHVuc2lnbmVkIGludCkgYnUucy5sb3cpCisJCXJldHVybiAyOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX2ludC5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL21hbHRhL21hbHRhX2ludC5jCmluZGV4IDgzZDc2MDIuLjFjZDgzMGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9tYWx0YS9tYWx0YV9pbnQuYworKysgYi9hcmNoL21pcHMvbWlwcy1ib2FyZHMvbWFsdGEvbWFsdGFfaW50LmMKQEAgLTMxMSwxNiArMzExLDIxIEBACiAJaWYgKCFjcHVfaGFzX3ZlaWMpCiAJCW1pcHNfY3B1X2lycV9pbml0KCk7CiAKLSAgICAgICAgc3dpdGNoKG1pcHNfcmV2aXNpb25fY29yaWQpIHsKLSAgICAgICAgY2FzZSBNSVBTX1JFVklTSU9OX0NPUklEX0NPUkVfTVNDOgotICAgICAgICBjYXNlIE1JUFNfUkVWSVNJT05fQ09SSURfQ09SRV9GUEdBMjoKLSAgICAgICAgY2FzZSBNSVBTX1JFVklTSU9OX0NPUklEX0NPUkVfRlBHQTM6Ci0gICAgICAgIGNhc2UgTUlQU19SRVZJU0lPTl9DT1JJRF9DT1JFXzI0SzoKLSAgICAgICAgY2FzZSBNSVBTX1JFVklTSU9OX0NPUklEX0NPUkVfRU1VTF9NU0M6CisgICAgICAgIHN3aXRjaChtaXBzX3JldmlzaW9uX3Njb25pZCkgeworICAgICAgICBjYXNlIE1JUFNfUkVWSVNJT05fU0NPTl9TT0NJVDoKKyAgICAgICAgY2FzZSBNSVBTX1JFVklTSU9OX1NDT05fUk9DSVQ6CiAJCWlmIChjcHVfaGFzX3ZlaWMpCi0JCQlpbml0X21zY19pcnFzIChNU0MwMUVfSU5UX0JBU0UsIG1zY19laWNpcnFtYXAsIG1zY19ucl9laWNpcnFzKTsKKwkJCWluaXRfbXNjX2lycXMgKE1JUFNfTVNDMDFfSUNfUkVHX0JBU0UsIE1TQzAxRV9JTlRfQkFTRSwgbXNjX2VpY2lycW1hcCwgbXNjX25yX2VpY2lycXMpOwogCQllbHNlCi0JCQlpbml0X21zY19pcnFzIChNU0MwMUNfSU5UX0JBU0UsIG1zY19pcnFtYXAsIG1zY19ucl9pcnFzKTsKKwkJCWluaXRfbXNjX2lycXMgKE1JUFNfTVNDMDFfSUNfUkVHX0JBU0UsIE1TQzAxQ19JTlRfQkFTRSwgbXNjX2lycW1hcCwgbXNjX25yX2lycXMpOworCQlicmVhazsKKworICAgICAgICBjYXNlIE1JUFNfUkVWSVNJT05fU0NPTl9TT0NJVFNDOgorICAgICAgICBjYXNlIE1JUFNfUkVWSVNJT05fU0NPTl9TT0NJVFNDUDoKKwkJaWYgKGNwdV9oYXNfdmVpYykKKwkJCWluaXRfbXNjX2lycXMgKE1JUFNfU09DSVRTQ19JQ19SRUdfQkFTRSwgTVNDMDFFX0lOVF9CQVNFLCBtc2NfZWljaXJxbWFwLCBtc2NfbnJfZWljaXJxcyk7CisJCWVsc2UKKwkJCWluaXRfbXNjX2lycXMgKE1JUFNfU09DSVRTQ19JQ19SRUdfQkFTRSwgTVNDMDFDX0lOVF9CQVNFLCBtc2NfaXJxbWFwLCBtc2NfbnJfaXJxcyk7CiAJfQogCiAJaWYgKGNwdV9oYXNfdmVpYykgewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2hpZ2htZW0uYyBiL2FyY2gvbWlwcy9tbS9oaWdobWVtLmMKaW5kZXggNjc1NTAyYS4uMTBkZDJhZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2hpZ2htZW0uYworKysgYi9hcmNoL21pcHMvbW0vaGlnaG1lbS5jCkBAIC04MCw3ICs4MCw2IEBACiAJcGFnZWZhdWx0X2VuYWJsZSgpOwogfQogCi0jaWZuZGVmIENPTkZJR19MSU1JVEVEX0RNQQogLyoKICAqIFRoaXMgaXMgdGhlIHNhbWUgYXMga21hcF9hdG9taWMoKSBidXQgY2FuIG1hcCBtZW1vcnkgdGhhdCBkb2Vzbid0CiAgKiBoYXZlIGEgc3RydWN0IHBhZ2UgYXNzb2NpYXRlZCB3aXRoIGl0LgpAQCAtOTksNyArOTgsNiBAQAogCiAJcmV0dXJuICh2b2lkKikgdmFkZHI7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0xJTUlURURfRE1BICovCiAKIHN0cnVjdCBwYWdlICpfX2ttYXBfYXRvbWljX3RvX3BhZ2Uodm9pZCAqcHRyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL2luaXQuYyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKaW5kZXggMmQxYzJjMC4uNGM4MDUyOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2luaXQuYworKysgYi9hcmNoL21pcHMvbW0vaW5pdC5jCkBAIC00MjQsOSArNDI0LDYgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOwotI2lmZGVmIENPTkZJR19MSU1JVEVEX0RNQQotCQlzZXRfcGFnZV9hZGRyZXNzKHBhZ2UsIGxvd21lbV9wYWdlX2FkZHJlc3MocGFnZSkpOwotI2VuZGlmCiAJCWluaXRfcGFnZV9jb3VudChwYWdlKTsKIAkJX19mcmVlX3BhZ2UocGFnZSk7CiAJCXRvdGFsaGlnaF9wYWdlcysrOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21tL3RsYmV4LmMgYi9hcmNoL21pcHMvbW0vdGxiZXguYwppbmRleCA0OTJjNTE4Li5lNzE0OTI5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vdGxiZXguYworKysgYi9hcmNoL21pcHMvbW0vdGxiZXguYwpAQCAtMzUsMjQgKzM1LDI0IEBACiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS93YXIuaD4KIAotc3RhdGljIF9faW5pdCBpbnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgcjQ1a19idmFod2J1Zyh2b2lkKQorc3RhdGljIF9faW5pdCBpbnQgX19tYXliZV91bnVzZWQgcjQ1a19idmFod2J1Zyh2b2lkKQogewogCS8qIFhYWDogV2Ugc2hvdWxkIHByb2JlIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhpcyBidWcsIGJ1dCB3ZSBkb24ndC4gKi8KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgcjRrXzI1ME1IWmh3YnVnKHZvaWQpCitzdGF0aWMgX19pbml0IGludCBfX21heWJlX3VudXNlZCByNGtfMjUwTUhaaHdidWcodm9pZCkKIHsKIAkvKiBYWFg6IFdlIHNob3VsZCBwcm9iZSBmb3IgdGhlIHByZXNlbmNlIG9mIHRoaXMgYnVnLCBidXQgd2UgZG9uJ3QuICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBfX2luaXQgaW50IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGJjbTEyNTBfbTNfd2FyKHZvaWQpCitzdGF0aWMgX19pbml0IGludCBfX21heWJlX3VudXNlZCBiY20xMjUwX20zX3dhcih2b2lkKQogewogCXJldHVybiBCQ00xMjUwX00zX1dBUjsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgcjEwMDAwX2xsc2Nfd2FyKHZvaWQpCitzdGF0aWMgX19pbml0IGludCBfX21heWJlX3VudXNlZCByMTAwMDBfbGxzY193YXIodm9pZCkKIHsKIAlyZXR1cm4gUjEwMDAwX0xMU0NfV0FSOwogfQpAQCAtNTExLDE4ICs1MTEsMTggQEAKICNkZWZpbmUgaV9laGIoYnVmKSBpX3NsbChidWYsIDAsIDAsIDMpCiAKICNpZmRlZiBDT05GSUdfNjRCSVQKLXN0YXRpYyBfX2luaXQgaW50IF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGluX2NvbXBhdF9zcGFjZV9wKGxvbmcgYWRkcikKK3N0YXRpYyBfX2luaXQgaW50IF9fbWF5YmVfdW51c2VkIGluX2NvbXBhdF9zcGFjZV9wKGxvbmcgYWRkcikKIHsKIAkvKiBJcyB0aGlzIGFkZHJlc3MgaW4gMzJiaXQgY29tcGF0IHNwYWNlPyAqLwogCXJldHVybiAoKChhZGRyKSAmIDB4ZmZmZmZmZmYwMDAwMDAwMEwpID09IDB4ZmZmZmZmZmYwMDAwMDAwMEwpOwogfQogCi1zdGF0aWMgX19pbml0IGludCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSByZWxfaGlnaGVzdChsb25nIHZhbCkKK3N0YXRpYyBfX2luaXQgaW50IF9fbWF5YmVfdW51c2VkIHJlbF9oaWdoZXN0KGxvbmcgdmFsKQogewogCXJldHVybiAoKCgodmFsICsgMHg4MDAwODAwMDgwMDBMKSA+PiA0OCkgJiAweGZmZmYpIF4gMHg4MDAwKSAtIDB4ODAwMDsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgcmVsX2hpZ2hlcihsb25nIHZhbCkKK3N0YXRpYyBfX2luaXQgaW50IF9fbWF5YmVfdW51c2VkIHJlbF9oaWdoZXIobG9uZyB2YWwpCiB7CiAJcmV0dXJuICgoKCh2YWwgKyAweDgwMDA4MDAwTCkgPj4gMzIpICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7CiB9CkBAIC01NTYsOCArNTU2LDggQEAKIAkJaV9sdWkoYnVmLCBycywgcmVsX2hpKGFkZHIpKTsKIH0KIAotc3RhdGljIF9faW5pdCB2b2lkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIGlfTEEodTMyICoqYnVmLCB1bnNpZ25lZCBpbnQgcnMsCi0JCQkJCQlsb25nIGFkZHIpCitzdGF0aWMgX19pbml0IHZvaWQgX19tYXliZV91bnVzZWQgaV9MQSh1MzIgKipidWYsIHVuc2lnbmVkIGludCBycywKKwkJCQkJICAgICBsb25nIGFkZHIpCiB7CiAJaV9MQV9tb3N0bHkoYnVmLCBycywgYWRkcik7CiAJaWYgKHJlbF9sbyhhZGRyKSkKQEAgLTYzNiw4ICs2MzYsOCBAQAogCW1vdmVfbGFiZWxzKGxhYiwgZmlyc3QsIGVuZCwgb2ZmKTsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaW5zbl9oYXNfYmRlbGF5KHN0cnVjdCByZWxvYyAqcmVsLAotCQkJCQkJCSAgdTMyICphZGRyKQorc3RhdGljIF9faW5pdCBpbnQgX19tYXliZV91bnVzZWQgaW5zbl9oYXNfYmRlbGF5KHN0cnVjdCByZWxvYyAqcmVsLAorCQkJCQkJICAgICAgIHUzMiAqYWRkcikKIHsKIAlmb3IgKDsgcmVsLT5sYWIgIT0gbGFiZWxfaW52YWxpZDsgcmVsKyspIHsKIAkJaWYgKHJlbC0+YWRkciA9PSBhZGRyCkBAIC02NTAsMTUgKzY1MCwxNSBAQAogfQogCiAvKiBjb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGxhYmVsZWQgYnJhbmNoZXMgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorc3RhdGljIHZvaWQgX19pbml0IF9fbWF5YmVfdW51c2VkCiAJaWxfYmx0eih1MzIgKipwLCBzdHJ1Y3QgcmVsb2MgKipyLCB1bnNpZ25lZCBpbnQgcmVnLCBlbnVtIGxhYmVsX2lkIGwpCiB7CiAJcl9taXBzX3BjMTYociwgKnAsIGwpOwogCWlfYmx0eihwLCByZWcsIDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgaWxfYih1MzIgKipwLCBzdHJ1Y3QgcmVsb2MgKipyLAotCQkJCQkgZW51bSBsYWJlbF9pZCBsKQorc3RhdGljIHZvaWQgX19pbml0IF9fbWF5YmVfdW51c2VkIGlsX2IodTMyICoqcCwgc3RydWN0IHJlbG9jICoqciwKKwkJCQkJICAgICBlbnVtIGxhYmVsX2lkIGwpCiB7CiAJcl9taXBzX3BjMTYociwgKnAsIGwpOwogCWlfYihwLCAwKTsKQEAgLTY3MSw3ICs2NzEsNyBAQAogCWlfYmVxeihwLCByZWcsIDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKK3N0YXRpYyB2b2lkIF9faW5pdCBfX21heWJlX3VudXNlZAogaWxfYmVxemwodTMyICoqcCwgc3RydWN0IHJlbG9jICoqciwgdW5zaWduZWQgaW50IHJlZywgZW51bSBsYWJlbF9pZCBsKQogewogCXJfbWlwc19wYzE2KHIsICpwLCBsKTsKQEAgLTY5Miw3ICs2OTIsNyBAQAogCWlfYmdlemwocCwgcmVnLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpCitzdGF0aWMgdm9pZCBfX2luaXQgX19tYXliZV91bnVzZWQKIGlsX2JnZXoodTMyICoqcCwgc3RydWN0IHJlbG9jICoqciwgdW5zaWduZWQgaW50IHJlZywgZW51bSBsYWJlbF9pZCBsKQogewogCXJfbWlwc19wYzE2KHIsICpwLCBsKTsKQEAgLTgxMCw3ICs4MTAsNyBAQAogICoKICAqIEFzIGlmIHdlIE1JUFMgaGFja2VycyB3b3VsZG4ndCBrbm93IGhvdyB0byBub3AgcGlwZWxpbmVzIGhhcHB5IC4uLgogICovCi1zdGF0aWMgX19pbml0IHZvaWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgYnVpbGRfdGxiX3Byb2JlX2VudHJ5KHUzMiAqKnApCitzdGF0aWMgX19pbml0IHZvaWQgX19tYXliZV91bnVzZWQgYnVpbGRfdGxiX3Byb2JlX2VudHJ5KHUzMiAqKnApCiB7CiAJc3dpdGNoIChjdXJyZW50X2NwdV9kYXRhLmNwdXR5cGUpIHsKIAkvKiBGb3VuZCBieSBleHBlcmltZW50OiBSNDYwMCB2Mi4wIG5lZWRzIHRoaXMsIHRvby4gICovCkBAIC0xMDk4LDcgKzEwOTgsNyBAQAogICogVE1QIGFuZCBQVFIgYXJlIHNjcmF0Y2guCiAgKiBUTVAgd2lsbCBiZSBjbG9iYmVyZWQsIFBUUiB3aWxsIGhvbGQgdGhlIHBnZCBlbnRyeS4KICAqLwotc3RhdGljIF9faW5pdCB2b2lkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCitzdGF0aWMgX19pbml0IHZvaWQgX19tYXliZV91bnVzZWQKIGJ1aWxkX2dldF9wZ2RlMzIodTMyICoqcCwgdW5zaWduZWQgaW50IHRtcCwgdW5zaWduZWQgaW50IHB0cikKIHsKIAlsb25nIHBnZGMgPSAobG9uZylwZ2RfY3VycmVudDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9LY29uZmlnIGIvYXJjaC9taXBzL21vbWVudHVtL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTYxY2YuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWNvbmZpZyBKQUdVQVJfRE1BTE9XCi0JYm9vbCAiTG93IERNQSBNb2RlIgotCWRlcGVuZHMgb24gTU9NRU5DT19KQUdVQVJfQVRYCi0JaGVscAotCSAgU2VsZWN0IHRvIFkgaWYganVtcCBKUDUgaXMgc2V0IG9uIHlvdXIgYm9hcmQsIE4gb3RoZXJ3aXNlLiAgTm9ybWFsbHkKLQkgIHRoZSBqdW1wZXIgaXMgc2V0LCBzbyBpZiB5b3UgZmVlbCB1bnNhZmUsIGp1c3Qgc2F5IFkuCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZThjZWJkLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgTW9tZW50dW0gQ29tcHV0ZXIncyBKYWd1YXItQVRYIGJvYXJkLgotIwotIyBOb3RlISBEZXBlbmRlbmNpZXMgYXJlIGRvbmUgYXV0b21hZ2ljYWxseSBieSAnbWFrZSBkZXAnLCB3aGljaCBhbHNvCi0jIHJlbW92ZXMgYW55IG9sZCBkZXBlbmRlbmNpZXMuIERPTidUIHB1dCB5b3VyIG93biBkZXBlbmRlbmNpZXMgaGVyZQotIyB1bmxlc3MgaXQncyBzb21ldGhpbmcgc3BlY2lhbCAoaWUgbm90IGEgLmMgZmlsZSkuCi0jCi0KLW9iai15ICs9IGlycS5vIHBsYXRmb3JtLm8gcHJvbS5vIHJlc2V0Lm8gc2V0dXAubwotCi1vYmotJChDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRSkgKz0gamEtY29uc29sZS5vCi1vYmotJChDT05GSUdfUkVNT1RFX0RFQlVHKSArPSBkYmdfaW8ubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvZGJnX2lvLmMgYi9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9kYmdfaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1YTY1Mi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9kYmdfaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0KLSNpZiBkZWZpbmVkKENPTkZJR19SRU1PVEVfREVCVUcpCi0KLSNpbmNsdWRlIDxhc20vc2VyaWFsLmg+IC8qIEZvciB0aGUgc2VyaWFsIHBvcnQgbG9jYXRpb24gYW5kIGJhc2UgYmF1ZCAqLwotCi0vKiAtLS0gQ09ORklHIC0tLSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7Ci10eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzI7Ci0KLS8qIC0tLSBFTkQgT0YgQ09ORklHIC0tLSAqLwotCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfMjQwMCAgICAgICAgICAgICAyNDAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfNDgwMCAgICAgICAgICAgICA0ODAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfOTYwMCAgICAgICAgICAgICA5NjAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfMTkyMDAgICAgICAgICAgICAxOTIwMAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9CQVVEXzM4NDAwICAgICAgICAgICAgMzg0MDAKLSNkZWZpbmUgICAgICAgICBVQVJUMTY1NTBfQkFVRF81NzYwMCAgICAgICAgICAgIDU3NjAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfMTE1MjAwICAgICAgICAgICAxMTUyMDAKLQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfTk9ORSAgICAgICAgICAgMAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfT0REICAgICAgICAgICAgMHgwOAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfRVZFTiAgICAgICAgICAgMHgxOAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfTUFSSyAgICAgICAgICAgMHgyOAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfU1BBQ0UgICAgICAgICAgMHgzOAotCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0RBVEFfNUJJVCAgICAgICAgICAgICAweDAKLSNkZWZpbmUgICAgICAgICBVQVJUMTY1NTBfREFUQV82QklUICAgICAgICAgICAgIDB4MQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9EQVRBXzdCSVQgICAgICAgICAgICAgMHgyCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0RBVEFfOEJJVCAgICAgICAgICAgICAweDMKLQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9TVE9QXzFCSVQgICAgICAgICAgICAgMHgwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX1NUT1BfMkJJVCAgICAgICAgICAgICAweDQKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogPT09IENPTkZJRyA9PT0gKi8KLQotLyogW2pzdW5dIHdlIHVzZSB0aGUgc2Vjb25kIHNlcmlhbCBwb3J0IGZvciBrZGIgKi8KLSNkZWZpbmUgICAgICAgICBCQVNFICAgICAgICAgICAgICAgICAgICBPQ0VMT1RfU0VSSUFMMV9CQVNFCi0jZGVmaW5lICAgICAgICAgTUFYX0JBVUQgICAgICAgICAgICAgICAgT0NFTE9UX0JBU0VfQkFVRAotCi0vKiA9PT0gRU5EIE9GIENPTkZJRyA9PT0gKi8KLQotI2RlZmluZSAgICAgICAgIFJFR19PRkZTRVQgICAgICAgICAgICAgIDQKLQotLyogcmVnaXN0ZXIgb2Zmc2V0ICovCi0jZGVmaW5lICAgICAgICAgT0ZTX1JDVl9CVUZGRVIgICAgICAgICAgMAotI2RlZmluZSAgICAgICAgIE9GU19UUkFOU19IT0xEICAgICAgICAgIDAKLSNkZWZpbmUgICAgICAgICBPRlNfU0VORF9CVUZGRVIgICAgICAgICAwCi0jZGVmaW5lICAgICAgICAgT0ZTX0lOVFJfRU5BQkxFICAgICAgICAgKDEqUkVHX09GRlNFVCkKLSNkZWZpbmUgICAgICAgICBPRlNfSU5UUl9JRCAgICAgICAgICAgICAoMipSRUdfT0ZGU0VUKQotI2RlZmluZSAgICAgICAgIE9GU19EQVRBX0ZPUk1BVCAgICAgICAgICgzKlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX0xJTkVfQ09OVFJPTCAgICAgICAgKDMqUkVHX09GRlNFVCkKLSNkZWZpbmUgICAgICAgICBPRlNfTU9ERU1fQ09OVFJPTCAgICAgICAoNCpSRUdfT0ZGU0VUKQotI2RlZmluZSAgICAgICAgIE9GU19SUzIzMl9PVVRQVVQgICAgICAgICg0KlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX0xJTkVfU1RBVFVTICAgICAgICAgKDUqUkVHX09GRlNFVCkKLSNkZWZpbmUgICAgICAgICBPRlNfTU9ERU1fU1RBVFVTICAgICAgICAoNipSRUdfT0ZGU0VUKQotI2RlZmluZSAgICAgICAgIE9GU19SUzIzMl9JTlBVVCAgICAgICAgICg2KlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX1NDUkFUQ0hfUEFEICAgICAgICAgKDcqUkVHX09GRlNFVCkKLQotI2RlZmluZSAgICAgICAgIE9GU19ESVZJU09SX0xTQiAgICAgICAgICgwKlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX0RJVklTT1JfTVNCICAgICAgICAgKDEqUkVHX09GRlNFVCkKLQotCi0vKiBtZW1vcnktbWFwcGVkIHJlYWQvd3JpdGUgb2YgdGhlIHBvcnQgKi8KLSNkZWZpbmUgICAgICAgICBVQVJUMTY1NTBfUkVBRCh5KSAgICAoKigodm9sYXRpbGUgdWludDgqKShCQVNFICsgeSkpKQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9XUklURSh5LCB6KSAgKCgqKCh2b2xhdGlsZSB1aW50OCopKEJBU0UgKyB5KSkpID0geikKLQotdm9pZCBkZWJ1Z0luaXQodWludDMyIGJhdWQsIHVpbnQ4IGRhdGEsIHVpbnQ4IHBhcml0eSwgdWludDggc3RvcCkKLXsKLQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KLQlVQVJUMTY1NTBfV1JJVEUoT0ZTX0lOVFJfRU5BQkxFLCAwKTsKLQotCS8qIHNldCB1cCBiYXVkIHJhdGUgKi8KLQl7Ci0JCXVpbnQzMiBkaXZpc29yOwotCi0JCS8qIHNldCBESUFCIGJpdCAqLwotCQlVQVJUMTY1NTBfV1JJVEUoT0ZTX0xJTkVfQ09OVFJPTCwgMHg4MCk7Ci0KLQkJLyogc2V0IGRpdmlzb3IgKi8KLQkJZGl2aXNvciA9IE1BWF9CQVVEIC8gYmF1ZDsKLQkJVUFSVDE2NTUwX1dSSVRFKE9GU19ESVZJU09SX0xTQiwgZGl2aXNvciAmIDB4ZmYpOwotCQlVQVJUMTY1NTBfV1JJVEUoT0ZTX0RJVklTT1JfTVNCLCAoZGl2aXNvciAmIDB4ZmYwMCkgPj4gOCk7Ci0KLQkJLyogY2xlYXIgRElBQiBiaXQgKi8KLQkJVUFSVDE2NTUwX1dSSVRFKE9GU19MSU5FX0NPTlRST0wsIDB4MCk7Ci0JfQotCi0JLyogc2V0IGRhdGEgZm9ybWF0ICovCi0JVUFSVDE2NTUwX1dSSVRFKE9GU19EQVRBX0ZPUk1BVCwgZGF0YSB8IHBhcml0eSB8IHN0b3ApOwotfQotCi1zdGF0aWMgaW50IHJlbW90ZURlYnVnSW5pdGlhbGl6ZWQgPSAwOwotCi11aW50OCBnZXREZWJ1Z0NoYXIodm9pZCkKLXsKLQlpZiAoIXJlbW90ZURlYnVnSW5pdGlhbGl6ZWQpIHsKLQkJcmVtb3RlRGVidWdJbml0aWFsaXplZCA9IDE7Ci0JCWRlYnVnSW5pdChVQVJUMTY1NTBfQkFVRF8zODQwMCwKLQkJCSAgVUFSVDE2NTUwX0RBVEFfOEJJVCwKLQkJCSAgVUFSVDE2NTUwX1BBUklUWV9OT05FLCBVQVJUMTY1NTBfU1RPUF8xQklUKTsKLQl9Ci0KLQl3aGlsZSAoKFVBUlQxNjU1MF9SRUFEKE9GU19MSU5FX1NUQVRVUykgJiAweDEpID09IDApOwotCXJldHVybiBVQVJUMTY1NTBfUkVBRChPRlNfUkNWX0JVRkZFUik7Ci19Ci0KLQotaW50IHB1dERlYnVnQ2hhcih1aW50OCBieXRlKQotewotCWlmICghcmVtb3RlRGVidWdJbml0aWFsaXplZCkgewotCQlyZW1vdGVEZWJ1Z0luaXRpYWxpemVkID0gMTsKLQkJZGVidWdJbml0KFVBUlQxNjU1MF9CQVVEXzM4NDAwLAotCQkJICBVQVJUMTY1NTBfREFUQV84QklULAotCQkJICBVQVJUMTY1NTBfUEFSSVRZX05PTkUsIFVBUlQxNjU1MF9TVE9QXzFCSVQpOwotCX0KLQotCXdoaWxlICgoVUFSVDE2NTUwX1JFQUQoT0ZTX0xJTkVfU1RBVFVTKSAmIDB4MjApID09IDApOwotCVVBUlQxNjU1MF9XUklURShPRlNfU0VORF9CVUZGRVIsIGJ5dGUpOwotCXJldHVybiAxOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L2lycS5jIGIvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYjQzMjUuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAyIE1vbWVudHVtIENvbXB1dGVyLCBJbmMuCi0gKiBBdXRob3I6IE1hdHRoZXcgRGhhcm0sIG1kaGFybUBtb21lbmNvLmNvbQotICoKLSAqIEJhc2VkIG9uIHdvcmsgYnk6Ci0gKiAgIENvcHlyaWdodCAoQykgMjAwMCBSaWRnZVJ1biwgSW5jLgotICogICBBdXRob3I6IFJpZGdlUnVuLCBJbmMuCi0gKiAgIGdsb25ub25AcmlkZ2VydW4uY29tLCBza3JhbnpAcmlkZ2VydW4uY29tLCBzdGV2ZWpAcmlkZ2VydW4uY29tCi0gKgotICogICBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqICAgQXV0aG9yOiBKdW4gU3VuLCBqc3VuQG12aXN0YS5jb20gb3IganN1bkBqdW5zdW4ubmV0Ci0gKgotICogICBDb3B5cmlnaHQgKEMpIDIwMDAsIDAxLCAwNiBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2lycV9jcHUuaD4KLSNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vdGltZS5oPgotCi1hc21saW5rYWdlIHZvaWQgcGxhdF9pcnFfZGlzcGF0Y2godm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgcGVuZGluZyA9IHJlYWRfYzBfY2F1c2UoKSAmIHJlYWRfYzBfc3RhdHVzKCk7Ci0KLQlpZiAocGVuZGluZyAmIFNUQVRVU0ZfSVAwKQotCQlkb19JUlEoMCk7Ci0JZWxzZSBpZiAocGVuZGluZyAmIFNUQVRVU0ZfSVAxKQotCQlkb19JUlEoMSk7Ci0JZWxzZSBpZiAocGVuZGluZyAmIFNUQVRVU0ZfSVAyKQotCQlkb19JUlEoMik7Ci0JZWxzZSBpZiAocGVuZGluZyAmIFNUQVRVU0ZfSVAzKQotCQlkb19JUlEoMyk7Ci0JZWxzZSBpZiAocGVuZGluZyAmIFNUQVRVU0ZfSVA0KQotCQlkb19JUlEoNCk7Ci0JZWxzZSBpZiAocGVuZGluZyAmIFNUQVRVU0ZfSVA1KQotCQlkb19JUlEoNSk7Ci0JZWxzZSBpZiAocGVuZGluZyAmIFNUQVRVU0ZfSVA2KQotCQlkb19JUlEoNik7Ci0JZWxzZSBpZiAocGVuZGluZyAmIFNUQVRVU0ZfSVA3KQotCQlsbF90aW1lcl9pbnRlcnJ1cHQoNyk7Ci0JZWxzZSB7Ci0JCS8qCi0JCSAqIE5vdyBsb29rIGF0IHRoZSBleHRlbmRlZCBpbnRlcnJ1cHRzCi0JCSAqLwotCQlwZW5kaW5nID0gKHJlYWRfYzBfY2F1c2UoKSAmIChyZWFkX2MwX2ludGNvbnRyb2woKSA8PCA4KSkgPj4gMTY7Ci0JCWlmIChwZW5kaW5nICYgU1RBVFVTRl9JUDgpCi0JCQlsbF9tdjY0MzQwX2lycSgpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gY2FzY2FkZV9tdjY0MzQwID0gewotCW5vX2FjdGlvbiwgSVJRRl9ESVNBQkxFRCwgQ1BVX01BU0tfTk9ORSwgIk1WNjQzNDAtQ2FzY2FkZSIsIE5VTEwsIE5VTEwKLX07Ci0KLXZvaWQgX19pbml0IGFyY2hfaW5pdF9pcnEodm9pZCkKLXsKLQkvKgotCSAqIENsZWFyIGFsbCBvZiB0aGUgaW50ZXJydXB0cyB3aGlsZSB3ZSBjaGFuZ2UgdGhlIGFibGUgYXJvdW5kIGEgYml0LgotCSAqIGludC1oYW5kbGVyIGlzIG5vdCBvbiBib290c3RyYXAKLQkgKi8KLQljbGVhcl9jMF9zdGF0dXMoU1QwX0lNKTsKLQotCW1pcHNfY3B1X2lycV9pbml0KCk7Ci0Jcm03a19jcHVfaXJxX2luaXQoKTsKLQotCS8qIHNldCB1cCB0aGUgY2FzY2FkaW5nIGludGVycnVwdHMgKi8KLQlzZXR1cF9pcnEoOCwgJmNhc2NhZGVfbXY2NDM0MCk7Ci0KLQltdjY0MzQwX2lycV9pbml0KDE2KTsKLQotCXNldF9jMF9zdGF0dXMoU1QwX0lNKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L2phLWNvbnNvbGUuYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L2phLWNvbnNvbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzMGI0Zi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9qYS1jb25zb2xlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwNCBSYWxmIEJhZWNobGUKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgva2Rldl90Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KLSNpbmNsdWRlIDxsaW51eC90ZXJtaW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90dHkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+Ci0jaW5jbHVkZSA8YXNtL3NlcmlhbC5oPgotCi0vKiBTVVBFUklPIHVhcnQgcmVnaXN0ZXIgbWFwICovCi1zdHJ1Y3QgamFfdWFydHJlZ3MgewotCXVuaW9uIHsKLQkJdm9sYXRpbGUgdTgJcGFkMFszXTsKLQkJdm9sYXRpbGUgdTgJcmJyOwkvKiByZWFkIG9ubHksIERMQUIgPT0gMCAqLwotCQl2b2xhdGlsZSB1OAlwYWQxWzNdOwotCQl2b2xhdGlsZSB1OAl0aHI7CS8qIHdyaXRlIG9ubHksIERMQUIgPT0gMCAqLwotCQl2b2xhdGlsZSB1OAlwYWQyWzNdOwotCQl2b2xhdGlsZSB1OAlkbGw7CS8qIERMQUIgPT0gMSAqLwotCX0gdTE7Ci0JdW5pb24gewotCQl2b2xhdGlsZSB1OAlwYWQwWzNdOwotCQl2b2xhdGlsZSB1OAlpZXI7CS8qIERMQUIgPT0gMCAqLwotCQl2b2xhdGlsZSB1OAlwYWQxWzNdOwotCQl2b2xhdGlsZSB1OAlkbG07CS8qIERMQUIgPT0gMSAqLwotCX0gdTI7Ci0JdW5pb24gewotCQl2b2xhdGlsZSB1OAlwYWQwWzNdOwotCQl2b2xhdGlsZSB1OAlpaXI7CS8qIHJlYWQgb25seSAqLwotCQl2b2xhdGlsZSB1OAlwYWQxWzNdOwotCQl2b2xhdGlsZSB1OAlmY3I7CS8qIHdyaXRlIG9ubHkgKi8KLQl9IHUzOwotCXZvbGF0aWxlIHU4CXBhZDBbM107Ci0Jdm9sYXRpbGUgdTgJaXVfbGNyOwotCXZvbGF0aWxlIHU4CXBhZDFbM107Ci0Jdm9sYXRpbGUgdTgJaXVfbWNyOwotCXZvbGF0aWxlIHU4CXBhZDJbM107Ci0Jdm9sYXRpbGUgdTgJaXVfbHNyOwotCXZvbGF0aWxlIHU4CXBhZDNbM107Ci0Jdm9sYXRpbGUgdTgJaXVfbXNyOwotCXZvbGF0aWxlIHU4CXBhZDRbM107Ci0Jdm9sYXRpbGUgdTgJaXVfc2NyOwotfSBqYV91cmVnc190OwotCi0jZGVmaW5lIGl1X3JiciB1MS5yYnIKLSNkZWZpbmUgaXVfdGhyIHUxLnRocgotI2RlZmluZSBpdV9kbGwgdTEuZGxsCi0jZGVmaW5lIGl1X2llciB1Mi5pZXIKLSNkZWZpbmUgaXVfZGxtIHUyLmRsbQotI2RlZmluZSBpdV9paXIgdTMuaWlyCi0jZGVmaW5lIGl1X2ZjciB1My5mY3IKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdWFydF9iYXNlOwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBqYV91YXJ0cmVncyAqY29uc29sZV91YXJ0KHZvaWQpCi17Ci0JcmV0dXJuIChzdHJ1Y3QgamFfdWFydHJlZ3MgKikgKHVhcnRfYmFzZSArIDB4MjNVTCk7Ci19Ci0KLXZvaWQgcHJvbV9wdXRjaGFyKGNoYXIgYykKLXsKLQlzdHJ1Y3QgamFfdWFydHJlZ3MgKnVhcnQgPSBjb25zb2xlX3VhcnQoKTsKLQotCXdoaWxlICgodWFydC0+aXVfbHNyICYgMHgyMCkgPT0gMCk7Ci0JdWFydC0+aXVfdGhyID0gYzsKLX0KLQotc3RhdGljIHZvaWQgaW5saW5lIGphX2NvbnNvbGVfcHJvYmUodm9pZCkKLXsKLQlzdHJ1Y3QgdWFydF9wb3J0IHVwOwotCi0JLyoKLQkgKiBSZWdpc3RlciB0byBpbnRlcnJ1cHQgemVybyBiZWNhdXNlIHdlIHNoYXJlIHRoZSBpbnRlcnJ1cHQgd2l0aAotCSAqIHRoZSBzZXJpYWwgZHJpdmVyIHdoaWNoIHdlIGRvbid0IHByb3Blcmx5IHN1cHBvcnQgeWV0LgotCSAqLwotCW1lbXNldCgmdXAsIDAsIHNpemVvZih1cCkpOwotCXVwLm1lbWJhc2UJPSAodW5zaWduZWQgY2hhciAqKSB1YXJ0X2Jhc2UgKyAweDIzVUw7Ci0JdXAuaXJxCQk9IEpBR1VBUl9BVFhfU0VSSUFMMV9JUlE7Ci0JdXAudWFydGNsawk9IEpBR1VBUl9BVFhfVUFSVF9DTEs7Ci0JdXAucmVnc2hpZnQJPSAyOwotCXVwLmlvdHlwZQk9IFVQSU9fTUVNOwotCXVwLmZsYWdzCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNUOwotCXVwLmxpbmUJCT0gMDsKLQotCWlmIChlYXJseV9zZXJpYWxfc2V0dXAoJnVwKSkKLQkJcHJpbnRrKEtFUk5fRVJSICJFYXJseSBzZXJpYWwgaW5pdCBvZiBwb3J0IDAgZmFpbGVkXG4iKTsKLX0KLQotX19pbml0IHZvaWQgamFfc2V0dXBfY29uc29sZSh2b2lkKQotewotCWphX2NvbnNvbGVfcHJvYmUoKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9qYWd1YXJfYXR4L2phZ3Vhcl9hdHhfZnBnYS5oIGIvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvamFndWFyX2F0eF9mcGdhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmY2OTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvamFndWFyX2F0eF9mcGdhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogSmFndWFyLUFUWCBCb2FyZCBSZWdpc3RlciBEZWZpbml0aW9ucwotICoKLSAqIChDKSAyMDAyIE1vbWVudHVtIENvbXB1dGVyIEluYy4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAotICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgotICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCi0gKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCi0gKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLSNpZm5kZWYgX19KQUdVQVJfQVRYX0ZQR0FfSF9fCi0jZGVmaW5lIF9fSkFHVUFSX0FUWF9GUEdBX0hfXwotCi0jZGVmaW5lIEpBR1VBUl9BVFhfUkVHX0JPQVJEUkVWCQkweDAKLSNkZWZpbmUgSkFHVUFSX0FUWF9SRUdfRlBHQV9SRVYJCTB4MQotI2RlZmluZSBKQUdVQVJfQVRYX1JFR19GUEdBX1RZUEUJMHgyCi0jZGVmaW5lIEpBR1VBUl9BVFhfUkVHX1JFU0VUX1NUQVRVUwkweDMKLSNkZWZpbmUgSkFHVUFSX0FUWF9SRUdfQk9BUkRfU1RBVFVTCTB4NAotI2RlZmluZSBKQUdVQVJfQVRYX1JFR19SRVNFUlZFRDEJMHg1Ci0jZGVmaW5lIEpBR1VBUl9BVFhfUkVHX1NFVAkJMHg2Ci0jZGVmaW5lIEpBR1VBUl9BVFhfUkVHX0NMUgkJMHg3Ci0jZGVmaW5lIEpBR1VBUl9BVFhfUkVHX0VFUFJPTV9NT0RFCTB4OQotI2RlZmluZSBKQUdVQVJfQVRYX1JFR19SRVNFUlZFRDIJMHhhCi0jZGVmaW5lIEpBR1VBUl9BVFhfUkVHX1JFU0VSVkVEMwkweGIKLSNkZWZpbmUgSkFHVUFSX0FUWF9SRUdfUkVTRVJWRUQ0CTB4YwotI2RlZmluZSBKQUdVQVJfQVRYX1JFR19QSFlfSU5UU1RBVAkweGQKLSNkZWZpbmUgSkFHVUFSX0FUWF9SRUdfUkVTRVJWRUQ1CTB4ZQotI2RlZmluZSBKQUdVQVJfQVRYX1JFR19SRVNFUlZFRDYJMHhmCi0KLSNkZWZpbmUgSkFHVUFSX0FUWF9DUzBfQUREUgkJMHhmYzAwMDAwMEwKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgamFfZnBnYV9iYXNlOwotCi0jZGVmaW5lIF9fRlBHQV9SRUdfVE9fQUREUihyZWcpCQkJCQkJXAotCSgodm9pZCAqKSBqYV9mcGdhX2Jhc2UgKyBKQUdVQVJfQVRYX1JFR18jI3JlZykKLSNkZWZpbmUgSkFHVUFSX0ZQR0FfV1JJVEUoeCwgcmVnKSB3cml0ZWIoeCwgX19GUEdBX1JFR19UT19BRERSKHJlZykpCi0jZGVmaW5lIEpBR1VBUl9GUEdBX1JFQUQocmVnKSByZWFkYihfX0ZQR0FfUkVHX1RPX0FERFIocmVnKSkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9wbGF0Zm9ybS5jIGIvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvcGxhdGZvcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxODQ0OC4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9wbGF0Zm9ybS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXY2NDN4eC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSAiamFndWFyX2F0eF9mcGdhLmgiCi0KLSNpZiBkZWZpbmVkKENPTkZJR19NVjY0M1hYX0VUSCkgfHwgZGVmaW5lZChDT05GSUdfTVY2NDNYWF9FVEhfTU9EVUxFKQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG12NjQzeHhfZXRoX3NoYXJlZF9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5uYW1lICAgPSAiZXRoZXJuZXQgc2hhcmVkIGJhc2UiLAotCQkuc3RhcnQgID0gMHhmMTAwMDAwMCArIE1WNjQzWFhfRVRIX1NIQVJFRF9SRUdTLAotCQkuZW5kICAgID0gMHhmMTAwMDAwMCArIE1WNjQzWFhfRVRIX1NIQVJFRF9SRUdTICsKLQkJICAgICAgICAgICAgICAgICAgICAgICBNVjY0M1hYX0VUSF9TSEFSRURfUkVHU19TSVpFIC0gMSwKLQkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtdjY0M3h4X2V0aF9zaGFyZWRfZGV2aWNlID0gewotCS5uYW1lCQk9IE1WNjQzWFhfRVRIX1NIQVJFRF9OQU1FLAotCS5pZAkJPSAwLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdjY0M3h4X2V0aF9zaGFyZWRfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBtdjY0M3h4X2V0aF9zaGFyZWRfcmVzb3VyY2VzLAotfTsKLQotI2RlZmluZSBNVl9TUkFNX0JBU0UJCQkweGZlMDAwMDAwVUwKLSNkZWZpbmUgTVZfU1JBTV9TSVpFCQkJKDI1NiAqIDEwMjQpCi0KLSNkZWZpbmUgTVZfU1JBTV9SWFJJTkdfU0laRQkJKE1WX1NSQU1fU0laRSAvIDQpCi0jZGVmaW5lIE1WX1NSQU1fVFhSSU5HX1NJWkUJCShNVl9TUkFNX1NJWkUgLyA0KQotCi0jZGVmaW5lIE1WX1NSQU1fQkFTRV9FVEgwCQlNVl9TUkFNX0JBU0UKLSNkZWZpbmUgTVZfU1JBTV9CQVNFX0VUSDEJCShNVl9TUkFNX0JBU0UgKyAoTVZfU1JBTV9TSVpFIC8gMikpCi0KLSNkZWZpbmUgTVY2NHg2MF9JUlFfRVRIXzAgNDgKLSNkZWZpbmUgTVY2NHg2MF9JUlFfRVRIXzEgNDkKLSNkZWZpbmUgTVY2NHg2MF9JUlFfRVRIXzIgNTAKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdjY0eDYwX2V0aDBfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkubmFtZQk9ICJldGgwIGlycSIsCi0JCS5zdGFydAk9IE1WNjR4NjBfSVJRX0VUSF8wLAotCQkuZW5kCT0gTVY2NHg2MF9JUlFfRVRIXzAsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgZXRoMF9wZCA9IHsKLQkucG9ydF9udW1iZXIJPSAwLAotCi0JLnR4X3NyYW1fYWRkcgk9IE1WX1NSQU1fQkFTRV9FVEgwLAotCS50eF9zcmFtX3NpemUJPSBNVl9TUkFNX1RYUklOR19TSVpFLAotCS50eF9xdWV1ZV9zaXplCT0gTVZfU1JBTV9UWFJJTkdfU0laRSAvIDE2LAotCi0JLnJ4X3NyYW1fYWRkcgk9IE1WX1NSQU1fQkFTRV9FVEgwICsgTVZfU1JBTV9UWFJJTkdfU0laRSwKLQkucnhfc3JhbV9zaXplCT0gTVZfU1JBTV9SWFJJTkdfU0laRSwKLQkucnhfcXVldWVfc2l6ZQk9IE1WX1NSQU1fUlhSSU5HX1NJWkUgLyAxNiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV0aDBfZGV2aWNlID0gewotCS5uYW1lCQk9IE1WNjQzWFhfRVRIX05BTUUsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG12NjR4NjBfZXRoMF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IG12NjR4NjBfZXRoMF9yZXNvdXJjZXMsCi0JLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmZXRoMF9wZCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdjY0eDYwX2V0aDFfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkubmFtZQk9ICJldGgxIGlycSIsCi0JCS5zdGFydAk9IE1WNjR4NjBfSVJRX0VUSF8xLAotCQkuZW5kCT0gTVY2NHg2MF9JUlFfRVRIXzEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgZXRoMV9wZCA9IHsKLQkucG9ydF9udW1iZXIJPSAxLAotCi0JLnR4X3NyYW1fYWRkcgk9IE1WX1NSQU1fQkFTRV9FVEgxLAotCS50eF9zcmFtX3NpemUJPSBNVl9TUkFNX1RYUklOR19TSVpFLAotCS50eF9xdWV1ZV9zaXplCT0gTVZfU1JBTV9UWFJJTkdfU0laRSAvIDE2LAotCi0JLnJ4X3NyYW1fYWRkcgk9IE1WX1NSQU1fQkFTRV9FVEgxICsgTVZfU1JBTV9UWFJJTkdfU0laRSwKLQkucnhfc3JhbV9zaXplCT0gTVZfU1JBTV9SWFJJTkdfU0laRSwKLQkucnhfcXVldWVfc2l6ZQk9IE1WX1NSQU1fUlhSSU5HX1NJWkUgLyAxNiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGV0aDFfZGV2aWNlID0gewotCS5uYW1lCQk9IE1WNjQzWFhfRVRIX05BTUUsCi0JLmlkCQk9IDEsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG12NjR4NjBfZXRoMV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IG12NjR4NjBfZXRoMV9yZXNvdXJjZXMsCi0JLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmZXRoMV9wZCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdjY0eDYwX2V0aDJfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkubmFtZQk9ICJldGgyIGlycSIsCi0JCS5zdGFydAk9IE1WNjR4NjBfSVJRX0VUSF8yLAotCQkuZW5kCT0gTVY2NHg2MF9JUlFfRVRIXzIsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgZXRoMl9wZCA9IHsKLQkucG9ydF9udW1iZXIJPSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXRoMl9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gTVY2NDNYWF9FVEhfTkFNRSwKLQkuaWQJCT0gMiwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobXY2NHg2MF9ldGgyX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gbXY2NHg2MF9ldGgyX3Jlc291cmNlcywKLQkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZldGgyX3BkLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbXY2NDN4eF9ldGhfcGRfZGV2c1tdIF9faW5pdGRhdGEgPSB7Ci0JJm12NjQzeHhfZXRoX3NoYXJlZF9kZXZpY2UsCi0JJmV0aDBfZGV2aWNlLAotCSZldGgxX2RldmljZSwKLQkmZXRoMl9kZXZpY2UsCi19OwotCi1zdGF0aWMgdTggX19pbml0IGV4Y2hhbmdlX2JpdCh1OCB2YWwsIHU4IGNzKQotewotCS8qIHBsYWNlIHRoZSBkYXRhICovCi0JSkFHVUFSX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzLCBFRVBST01fTU9ERSk7Ci0JdWRlbGF5KDEpOwotCi0JLyogdHVybiB0aGUgY2xvY2sgb24gKi8KLQlKQUdVQVJfRlBHQV9XUklURSgodmFsIDw8IDIpIHwgY3MgfCAweDIsIEVFUFJPTV9NT0RFKTsKLQl1ZGVsYXkoMSk7Ci0KLQkvKiB0dXJuIHRoZSBjbG9jayBvZmYgYW5kIHJlYWQtc3Ryb2JlICovCi0JSkFHVUFSX0ZQR0FfV1JJVEUoKHZhbCA8PCAyKSB8IGNzIHwgMHgxMCwgRUVQUk9NX01PREUpOwotCi0JLyogcmV0dXJuIHRoZSBkYXRhICovCi0JcmV0dXJuIChKQUdVQVJfRlBHQV9SRUFEKEVFUFJPTV9NT0RFKSA+PiAzKSAmIDB4MTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGdldF9tYWMoY2hhciBkZXN0WzZdKQotewotCXU4IHJlYWRfb3Bjb2RlWzEyXSA9IHsxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLQlpbnQgaSxqOwotCi0JZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCi0JCWV4Y2hhbmdlX2JpdChyZWFkX29wY29kZVtpXSwgMSk7Ci0KLQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7Ci0JCWRlc3Rbal0gPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlkZXN0W2pdIDw8PSAxOwotCQkJZGVzdFtqXSB8PSBleGNoYW5nZV9iaXQoMCwgMSk7Ci0JCX0KLQl9Ci0KLQkvKiB0dXJuIG9mZiBDUyAqLwotCWV4Y2hhbmdlX2JpdCgwLDApOwotfQotCi0vKgotICogQ29weSBhbmQgaW5jcmVtZW50IGV0aGVybmV0IE1BQyBhZGRyZXNzIGJ5IGEgc21hbGwgdmFsdWUuCi0gKgotICogVGhpcyBpcyB1c2VmdWwgZm9yIHN5c3RlbXMgd2hlcmUgdGhlIG9ubHkgb25lIE1BQyBhZGRyZXNzIGlzIHN0b3JlZCBpbgotICogbm9uLXZvbGF0aWxlIG1lbW9yeSBmb3IgbXVsdGlwbGUgcG9ydHMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBldGhfbWFjX2FkZCh1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywKLQl1bnNpZ25lZCBpbnQgYWRkKQotewotCWludCBpOwotCi0JQlVHX09OKGFkZCA+PSAyNTYpOwotCi0JZm9yIChpID0gRVRIX0FMRU47IGkgPj0gMDsgaS0tKSB7Ci0JCWRzdFtpXSA9IHNyY1tpXSArIGFkZDsKLQkJYWRkID0gZHN0W2ldIDwgc3JjW2ldOwkJLyogY29tcHV0ZSBjYXJyeSAqLwotCX0KLQotCVdBUk5fT04oYWRkKTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgbXY2NDN4eF9ldGhfYWRkX3Bkcyh2b2lkKQotewotCXVuc2lnbmVkIGNoYXIgbWFjW0VUSF9BTEVOXTsKLQlpbnQgcmV0OwotCi0JZ2V0X21hYyhtYWMpOwotCWV0aF9tYWNfYWRkKGV0aDBfcGQubWFjX2FkZHIsIG1hYywgMCk7Ci0JZXRoX21hY19hZGQoZXRoMV9wZC5tYWNfYWRkciwgbWFjLCAxKTsKLQlldGhfbWFjX2FkZChldGgyX3BkLm1hY19hZGRyLCBtYWMsIDIpOwotCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKG12NjQzeHhfZXRoX3BkX2RldnMsCi0JCQlBUlJBWV9TSVpFKG12NjQzeHhfZXRoX3BkX2RldnMpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWRldmljZV9pbml0Y2FsbChtdjY0M3h4X2V0aF9hZGRfcGRzKTsKLQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX01WNjQzWFhfRVRIKSB8fCBkZWZpbmVkKENPTkZJR19NVjY0M1hYX0VUSF9NT0RVTEUpICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9wcm9tLmMgYi9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9wcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZDE1NGUuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvcHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMiBNb21lbnR1bSBDb21wdXRlciBJbmMuCi0gKiBBdXRob3I6IE1hdHRoZXcgRGhhcm0gPG1kaGFybUBtb21lbmNvLmNvbT4KLSAqCi0gKiBMb3VpcyBIYW1pbHRvbiwgUmVkIEhhdCwgSW5jLgotICogaGFtaWx0b25AcmVkaGF0LmNvbSAgW01JUFM2NCBtb2RpZmljYXRpb25zXQotICoKLSAqIEJhc2VkIG9uIE9jZWxvdCBMaW51eCBwb3J0LCB3aGljaCBpcwotICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IGpzdW5AbXZpc3RhLmNvbSBvciBqc3VuQGp1bnN1bi5uZXQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEFkZGVkIGNoYW5nZXMgZm9yIFNNUCAtIE1hbmlzaCBMYWNod2FuaSAobGFjaHdhbmlAcG1jLXNpZXJyYS5jb20pCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL3Btb24uaD4KLQotI2luY2x1ZGUgImphZ3Vhcl9hdHhfZnBnYS5oIgotCi1leHRlcm4gdm9pZCBqYV9zZXR1cF9jb25zb2xlKHZvaWQpOwotCi1zdHJ1Y3QgY2FsbHZlY3RvcnMgKmRlYnVnX3ZlY3RvcnM7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGNwdV9jbG9jazsKLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJNb21lbnR1bSBKYWd1YXItQVRYIjsKLX0KLQotI2lmZGVmIENPTkZJR182NEJJVAotCi11bnNpZ25lZCBsb25nIHNpZ25leHQodW5zaWduZWQgbG9uZyBhZGRyKQotewotCWFkZHIgJj0gMHhmZmZmZmZmZjsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKChpbnQpYWRkcik7Ci19Ci0KLXZvaWQgKmdldF9hcmcodW5zaWduZWQgbG9uZyBhcmdzLCBpbnQgYXJjKQotewotCXVuc2lnbmVkIGxvbmcgdWw7Ci0JdW5zaWduZWQgY2hhciAqcHVjLCB1YzsKLQotCWFyZ3MgKz0gKGFyYyAqIDQpOwotCXVsID0gKHVuc2lnbmVkIGxvbmcpc2lnbmV4dChhcmdzKTsKLQlwdWMgPSAodW5zaWduZWQgY2hhciAqKXVsOwotCWlmIChwdWMgPT0gMCkKLQkJcmV0dXJuICh2b2lkICopMDsKLQotI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgotCXVjID0gKnB1YysrOwotCWwgPSAodW5zaWduZWQgbG9uZyl1YzsKLQl1YyA9ICpwdWMrKzsKLQl1bCB8PSAoKCh1bnNpZ25lZCBsb25nKXVjKSA8PCA4KTsKLQl1YyA9ICpwdWMrKzsKLQl1bCB8PSAoKCh1bnNpZ25lZCBsb25nKXVjKSA8PCAxNik7Ci0JdWMgPSAqcHVjKys7Ci0JdWwgfD0gKCgodW5zaWduZWQgbG9uZyl1YykgPDwgMjQpOwotI2Vsc2UKLQl1YyA9ICpwdWMrKzsKLQl1bCA9ICgodW5zaWduZWQgbG9uZyl1YykgPDwgMjQ7Ci0JdWMgPSAqcHVjKys7Ci0JdWwgfD0gKCgodW5zaWduZWQgbG9uZyl1YykgPDwgMTYpOwotCXVjID0gKnB1YysrOwotCXVsIHw9ICgoKHVuc2lnbmVkIGxvbmcpdWMpIDw8IDgpOwotCXVjID0gKnB1YysrOwotCXVsIHw9ICgodW5zaWduZWQgbG9uZyl1Yyk7Ci0jZW5kaWYKLQl1bCA9IHNpZ25leHQodWwpOwotCi0JcmV0dXJuICh2b2lkICopdWw7Ci19Ci0KLWNoYXIgKmFyZzY0KHVuc2lnbmVkIGxvbmcgYWRkcmluLCBpbnQgYXJnX2luZGV4KQotewotCXVuc2lnbmVkIGxvbmcgYXJnczsKLQljaGFyICpwOwotCi0JYXJncyA9IHNpZ25leHQoYWRkcmluKTsKLQlwID0gKGNoYXIgKilnZXRfYXJnKGFyZ3MsIGFyZ19pbmRleCk7Ci0KLQlyZXR1cm4gcDsKLX0KLSNlbmRpZiAgLyogQ09ORklHXzY0QklUICovCi0KLS8qIFBNT04gcGFzc2VzIGFyZ3VtZW50cyBpbiBDIG1haW4oKSBzdHlsZSAqLwotdm9pZCBfX2luaXQgcHJvbV9pbml0KHZvaWQpCi17Ci0JaW50IGFyZ2MgPSBmd19hcmcwOwotCWNoYXIgKiphcmcgPSAoY2hhciAqKikgZndfYXJnMTsKLQljaGFyICoqZW52ID0gKGNoYXIgKiopIGZ3X2FyZzI7Ci0Jc3RydWN0IGNhbGx2ZWN0b3JzICpjdiA9IChzdHJ1Y3QgY2FsbHZlY3RvcnMgKikgZndfYXJnMzsKLQlpbnQgaTsKLQotI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCi0vLwlqYV9zZXR1cF9jb25zb2xlKCk7CS8qIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nLiAgKi8KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHXzY0QklUCi0JY2hhciAqcHRyOwotCi0JcHJpbnRrKCJNaXBzNjQgSmFndWFyLUFUWFxuIik7Ci0JLyogc2F2ZSB0aGUgUFJPTSB2ZWN0b3JzIGZvciBkZWJ1Z2dpbmcgdXNlICovCi0JZGVidWdfdmVjdG9ycyA9IChzdHJ1Y3QgY2FsbHZlY3RvcnMgKilzaWduZXh0KCh1bnNpZ25lZCBsb25nKWN2KTsKLQotCS8qIGFyZ1swXSBpcyAiZyIsIHRoZSByZXN0IGlzIGJvb3QgcGFyYW1ldGVycyAqLwotCWFyY3NfY21kbGluZVswXSA9ICdcMCc7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7Ci0JCXB0ciA9IChjaGFyICopYXJnNjQoKHVuc2lnbmVkIGxvbmcpYXJnLCBpKTsKLQkJaWYgKChzdHJsZW4oYXJjc19jbWRsaW5lKSArIHN0cmxlbihwdHIpICsgMSkgPj0KLQkJICAgIHNpemVvZihhcmNzX2NtZGxpbmUpKQotCQkJYnJlYWs7Ci0JCXN0cmNhdChhcmNzX2NtZGxpbmUsIHB0cik7Ci0JCXN0cmNhdChhcmNzX2NtZGxpbmUsICIgIik7Ci0JfQotCi0JaSA9IDA7Ci0Jd2hpbGUgKDEpIHsKLQkJcHRyID0gKGNoYXIgKilhcmc2NCgodW5zaWduZWQgbG9uZyllbnYsIGkpOwotCQlpZiAoISBwdHIpCi0JCQlicmVhazsKLQotCQlpZiAoc3RybmNtcCgiZ3RiYXNlIiwgcHRyLCBzdHJsZW4oImd0YmFzZSIpKSA9PSAwKSB7Ci0JCQltYXJ2ZWxsX2Jhc2UgPSBzaW1wbGVfc3RydG9sKHB0ciArIHN0cmxlbigiZ3RiYXNlPSIpLAotCQkJCQkJCU5VTEwsIDE2KTsKLQotCQkJaWYgKChtYXJ2ZWxsX2Jhc2UgJiAweGZmZmZmZmZmMDAwMDAwMDApID09IDApCi0JCQkJbWFydmVsbF9iYXNlIHw9IDB4ZmZmZmZmZmYwMDAwMDAwMDsKLQotCQkJcHJpbnRrKCJtYXJ2ZWxsX2Jhc2Ugc2V0IHRvIDB4JTAxNmx4XG4iLCBtYXJ2ZWxsX2Jhc2UpOwotCQl9Ci0JCWlmIChzdHJuY21wKCJjcHVjbG9jayIsIHB0ciwgc3RybGVuKCJjcHVjbG9jayIpKSA9PSAwKSB7Ci0JCQljcHVfY2xvY2sgPSBzaW1wbGVfc3RydG9sKHB0ciArIHN0cmxlbigiY3B1Y2xvY2s9IiksCi0JCQkJCQkJTlVMTCwgMTApOwotCQkJcHJpbnRrKCJjcHVfY2xvY2sgc2V0IHRvICVkXG4iLCBjcHVfY2xvY2spOwotCQl9Ci0JCWkrKzsKLQl9Ci0JcHJpbnRrKCJhcmNzX2NtZGxpbmU6ICVzXG4iLCBhcmNzX2NtZGxpbmUpOwotCi0jZWxzZSAgIC8qIENPTkZJR182NEJJVCAqLwotCS8qIHNhdmUgdGhlIFBST00gdmVjdG9ycyBmb3IgZGVidWdnaW5nIHVzZSAqLwotCWRlYnVnX3ZlY3RvcnMgPSBjdjsKLQotCS8qIGFyZ1swXSBpcyAiZyIsIHRoZSByZXN0IGlzIGJvb3QgcGFyYW1ldGVycyAqLwotCWFyY3NfY21kbGluZVswXSA9ICdcMCc7Ci0JZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotCQlpZiAoc3RybGVuKGFyY3NfY21kbGluZSkgKyBzdHJsZW4oYXJnW2ldICsgMSkKLQkJICAgID49IHNpemVvZihhcmNzX2NtZGxpbmUpKQotCQkJYnJlYWs7Ci0JCXN0cmNhdChhcmNzX2NtZGxpbmUsIGFyZ1tpXSk7Ci0JCXN0cmNhdChhcmNzX2NtZGxpbmUsICIgIik7Ci0JfQotCi0Jd2hpbGUgKCplbnYpIHsKLQkJaWYgKHN0cm5jbXAoImd0YmFzZSIsICplbnYsIHN0cmxlbigiZ3RiYXNlIikpID09IDApIHsKLQkJCW1hcnZlbGxfYmFzZSA9IHNpbXBsZV9zdHJ0b2woKmVudiArIHN0cmxlbigiZ3RiYXNlPSIpLAotCQkJCQkJCU5VTEwsIDE2KTsKLQkJfQotCQlpZiAoc3RybmNtcCgiY3B1Y2xvY2siLCAqZW52LCBzdHJsZW4oImNwdWNsb2NrIikpID09IDApIHsKLQkJCWNwdV9jbG9jayA9IHNpbXBsZV9zdHJ0b2woKmVudiArIHN0cmxlbigiY3B1Y2xvY2s9IiksCi0JCQkJCQkJTlVMTCwgMTApOwotCQl9Ci0JCWVudisrOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQltaXBzX21hY2hncm91cCA9IE1BQ0hfR1JPVVBfTU9NRU5DTzsKLQltaXBzX21hY2h0eXBlID0gTUFDSF9NT01FTkNPX0pBR1VBUl9BVFg7Ci19Ci0KLXZvaWQgX19pbml0IHByb21fZnJlZV9wcm9tX21lbW9yeSh2b2lkKQotewotfQotCi12b2lkIF9faW5pdCBwcm9tX2ZpeHVwX21lbV9tYXAodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci19Ci0KLWludCBwcm9tX2Jvb3Rfc2Vjb25kYXJ5KGludCBjcHUsIHVuc2lnbmVkIGxvbmcgc3AsIHVuc2lnbmVkIGxvbmcgZ3ApCi17Ci0JLyogQ2xlYXIgdGhlIHNlbWFwaG9yZSAqLwotCSoodm9sYXRpbGUgdWludDMyX3QgKikoMHhiYjAwMGE2OCkgPSAweDgwMDAwMDAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXZvaWQgcHJvbV9pbml0X3NlY29uZGFyeSh2b2lkKQotewotICAgICAgICBjbGVhcl9jMF9jb25maWcoQ09ORl9DTV9DTUFTSyk7Ci0gICAgICAgIHNldF9jMF9jb25maWcoMHgyKTsKLQotCWNsZWFyX2MwX3N0YXR1cyhTVDBfSU0pOwotCXNldF9jMF9zdGF0dXMoMHgxZmZmZik7Ci19Ci0KLXZvaWQgcHJvbV9zbXBfZmluaXNoKHZvaWQpCi17Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9yZXNldC5jIGIvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvcmVzZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczYjA4OS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9yZXNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAxIFJhbGYgQmFlY2hsZQotICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IGpzdW5AbXZpc3RhLmNvbSBvciBqc3VuQGp1bnN1bi5uZXQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgTW9tZW50dW0gQ29tcHV0ZXIgSW5jLgotICogQXV0aG9yOiBNYXR0aGV3IERoYXJtIDxtZGhhcm1AbW9tZW5jby5jb20+Ci0gKgotICogTG91aXMgSGFtaWx0b24sIFJlZCBIYXQsIEluYy4KLSAqIGhhbWlsdG9uQHJlZGhhdC5jb20gIFtNSVBTNjQgbW9kaWZpY2F0aW9uc10KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vcmVib290Lmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLXZvaWQgbW9tZW5jb19qYWd1YXJfcmVzdGFydChjaGFyICpjb21tYW5kKQotewotCS8qIGJhc2UgYWRkcmVzcyBvZiB0aW1la2VlcGVyIHBvcnRpb24gb2YgcGFydCAqLwotI2lmZGVmIENPTkZJR182NEJJVAotCXZvaWQgKm52cmFtID0gKHZvaWQqKSAweGZmZmZmZmZmZmM4MDcwMDA7Ci0jZWxzZQotCXZvaWQgKm52cmFtID0gKHZvaWQqKSAweGZjODA3MDAwOwotI2VuZGlmCi0JLyogQXNrIHRoZSBOVlJBTS9SVEMvd2F0Y2hkb2cgY2hpcCB0byBhc3NlcnQgcmVzZXQgaW4gMS8xNiBzZWNvbmQgKi8KLQl3cml0ZWIoMHg4NCwgbnZyYW0gKyAweGZmNyk7Ci0KLQkvKiB3YWl0IGZvciB0aGUgd2F0Y2hkb2cgdG8gZ28gb2ZmICovCi0JbWRlbGF5KDEwMCsoMTAwMC8xNikpOwotCi0JLyogaWYgdGhlIHdhdGNoZG9nIGZhaWxzIGZvciBzb21lIHJlYXNvbiwgbGV0IHBlb3BsZSBrbm93ICovCi0JcHJpbnRrKEtFUk5fTk9USUNFICJXYXRjaGRvZyByZXNldCBmYWlsZWRcbiIpOwotfQotCi12b2lkIG1vbWVuY29famFndWFyX2hhbHQodm9pZCkKLXsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIlxuKiogWW91IGNhbiBzYWZlbHkgdHVybiBvZmYgdGhlIHBvd2VyXG4iKTsKLQl3aGlsZSAoMSkKLQkJX19hc21fXygiLnNldFx0bWlwczNcblx0IgotCSAgICAgICAgICAgICAgICAid2FpdFxuXHQiCi0JCQkiLnNldFx0bWlwczAiKTsKLX0KLQotdm9pZCBtb21lbmNvX2phZ3Vhcl9wb3dlcl9vZmYodm9pZCkKLXsKLQltb21lbmNvX2phZ3Vhcl9oYWx0KCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9zZXR1cC5jIGIvYXJjaC9taXBzL21vbWVudHVtL2phZ3Vhcl9hdHgvc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1MTAxNC4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vamFndWFyX2F0eC9zZXR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLS8qCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqIE1vbWVudHVtIENvbXB1dGVyIEphZ3Vhci1BVFggYm9hcmQgZGVwZW5kZW50IGJvb3Qgcm91dGluZXMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDEsIDA0LCAwNiAgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDAwIFJpZGdlUnVuLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgUmVkIEhhdCwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDAyIE1vbWVudHVtIENvbXB1dGVyCi0gKgotICogQXV0aG9yOiBNYXR0aGV3IERoYXJtLCBNb21lbnR1bSBDb21wdXRlcgotICogICBtZGhhcm1AbW9tZW5jby5jb20KLSAqCi0gKiBMb3VpcyBIYW1pbHRvbiwgUmVkIEhhdCwgSW5jLgotICogICBoYW1pbHRvbkByZWRoYXQuY29tICBbTUlQUzY0IG1vZGlmaWNhdGlvbnNdCi0gKgotICogQXV0aG9yOiBSaWRnZVJ1biwgSW5jLgotICogICBnbG9ubm9uQHJpZGdlcnVuLmNvbSwgc2tyYW56QHJpZGdlcnVuLmNvbSwgc3RldmVqQHJpZGdlcnVuLmNvbQotICoKLSAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBqc3VuQG12aXN0YS5jb20gb3IganN1bkBqdW5zdW4ubmV0Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgvYmNkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3dhcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1leC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9tdjY0M3h4Lmg+Ci0KLSNpbmNsdWRlIDxhc20vdGltZS5oPgotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vcmVib290Lmg+Ci0jaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+Ci0KLSNpbmNsdWRlICJqYWd1YXJfYXR4X2ZwZ2EuaCIKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXY2NDM0MF9zcmFtX2Jhc2U7Ci11bnNpZ25lZCBsb25nIGNwdV9jbG9jazsKLQotLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciByZWJvb3Rpbmcgb3IgaGFsdGluZyB0aGUgbWFjaGluZSovCi1leHRlcm4gdm9pZCBtb21lbmNvX2phZ3Vhcl9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpOwotZXh0ZXJuIHZvaWQgbW9tZW5jb19qYWd1YXJfaGFsdCh2b2lkKTsKLWV4dGVybiB2b2lkIG1vbWVuY29famFndWFyX3Bvd2VyX29mZih2b2lkKTsKLQotdm9pZCBtb21lbmNvX3RpbWVfaW5pdCh2b2lkKTsKLQotc3RhdGljIGNoYXIgcmVzZXRfcmVhc29uOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgRU5UUllMTyh1bnNpZ25lZCBsb25nIHBhZGRyKQotewotCXJldHVybiAoKHBhZGRyICYgUEFHRV9NQVNLKSB8Ci0JICAgICAgIChfUEFHRV9QUkVTRU5UIHwgX19SRUFEQUJMRSB8IF9fV1JJVEVBQkxFIHwgX1BBR0VfR0xPQkFMIHwKLQkJX0NBQ0hFX1VOQ0FDSEVEKSkgPj4gNjsKLX0KLQotdm9pZCBfX2luaXQgYnVzX2Vycm9yX2luaXQodm9pZCkgeyAvKiBub3RoaW5nICovIH0KLQotLyoKLSAqIExvYWQgYSBmZXcgVExCIGVudHJpZXMgZm9yIHRoZSBNVjY0MzQwIGFuZCBwZXJoaXBlcmFscy4gVGhlIE1WNjQzNDAgaXMgZ29pbmcKLSAqIHRvIGJlIGhpdCBvbiBldmVyeSBJUlEgYW55d2F5IC0gdGhlcmUncyBhYnNvbHV0ZWx5IG5vIHBvaW50IGluIGxldHRpbmcgaXQgYmUKLSAqIGEgcmFuZG9tIFRMQiBlbnRyeSwgYXMgaXQnbGwganVzdCBjYXVzZSBuZWVkbGVzcyBjaHVybmluZyBvZiB0aGUgVExCLiBBbmQgd2UKLSAqIHVzZSB0aGUgb3RoZXIgaGFsZiBmb3IgdGhlIHNlcmlhbCBwb3J0LCB3aGljaCBpcyBqdXN0IGEgUElUQSBvdGhlcndpc2UgOikKLSAqCi0gKglEZXZpY2UJCQlQaHlzaWNhbAlWaXJ0dWFsCi0gKglNVjY0MzQwIEludGVybmFsIFJlZ3MJMHhmNDAwMDAwMAkweGY0MDAwMDAwCi0gKglPY2Vsb3QtQ1tTXSBQTEQgKENTMCkJMHhmYzAwMDAwMAkweGZjMDAwMDAwCi0gKglOVlJBTSAoQ1MxKQkJMHhmYzgwMDAwMAkweGZjODAwMDAwCi0gKglVQVJUcyAoQ1MyKQkJMHhmZDAwMDAwMAkweGZkMDAwMDAwCi0gKglJbnRlcm5hbCBTUkFNCQkweGZlMDAwMDAwCTB4ZmUwMDAwMDAKLSAqCU0tU3lzdGVtcyBET0MgKENTMykJMHhmZjAwMDAwMAkweGZmMDAwMDAwCi0gKi8KLQotc3RhdGljIF9faW5pdCB2b2lkIHdpcmVfc3R1cGlkaXR5X2ludG9fdGxiKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHXzMyQklUCi0Jd3JpdGVfYzBfd2lyZWQoMCk7Ci0JbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwotCi0JLyogbWFydmVsbCBhbmQgZXh0cmEgc3BhY2UgKi8KLQlhZGRfd2lyZWRfZW50cnkoRU5UUllMTygweGY0MDAwMDAwKSwgRU5UUllMTygweGY0MDEwMDAwKSwKLQkgICAgICAgICAgICAgICAgMHhmNDAwMDAwMFVMLCBQTV82NEspOwotCS8qIGZwZ2EsIHJ0YywgYW5kIHVhcnQgKi8KLQlhZGRfd2lyZWRfZW50cnkoRU5UUllMTygweGZjMDAwMDAwKSwgRU5UUllMTygweGZkMDAwMDAwKSwKLQkgICAgICAgICAgICAgICAgMHhmYzAwMDAwMFVMLCBQTV8xNk0pOwotLy8JLyogbS1zeXMgYW5kIGludGVybmFsIFNSQU0gKi8KLS8vCWFkZF93aXJlZF9lbnRyeShFTlRSWUxPKDB4ZmUwMDAwMDApLCBFTlRSWUxPKDB4ZmYwMDAwMDApLAotLy8JICAgICAgICAgICAgICAgIDB4ZmUwMDAwMDBVTCwgUE1fMTZNKTsKLQotCW1hcnZlbGxfYmFzZSA9IDB4ZjQwMDAwMDA7Ci0JLy9tdjY0MzQwX3NyYW1fYmFzZSA9IDB4ZmUwMDAwMDA7CS8qIEN1cnJlbnRseSB1bnVzZWQgKi8KLSNlbmRpZgotfQotCi11bnNpZ25lZCBsb25nIG1hcnZlbGxfYmFzZQk9IDB4ZjQwMDAwMDBMOwotdW5zaWduZWQgbG9uZyBqYV9mcGdhX2Jhc2UJPSBKQUdVQVJfQVRYX0NTMF9BRERSOwotdW5zaWduZWQgbG9uZyB1YXJ0X2Jhc2UJCT0gMHhmZDAwMDAwMEw7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqcnRjX2Jhc2UJPSAodW5zaWduZWQgY2hhciopIDB4ZmM4MDAwMDBMOwotCi1FWFBPUlRfU1lNQk9MKG1hcnZlbGxfYmFzZSk7Ci0KLXN0YXRpYyBfX2luaXQgaW50IHBlcl9jcHVfbWFwcGluZ3Modm9pZCkKLXsKLQltYXJ2ZWxsX2Jhc2UJPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcCgweGY0MDAwMDAwLCAweDEwMDAwKTsKLQlqYV9mcGdhX2Jhc2UJPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChKQUdVQVJfQVRYX0NTMF9BRERSLCAgMHgxMDAwKTsKLQl1YXJ0X2Jhc2UJPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcCgweGZkMDAwMDAwVUwsIDB4MTAwMCk7Ci0JcnRjX2Jhc2UJPSBpb3JlbWFwKDB4ZmMwMDAwMDBVTCwgMHg4MDAwKTsKLQkvLyBpb3JlbWFwKDB4ZmUwMDAwMDAsICAzMiA8PCAyMCk7Ci0Jd3JpdGVfYzBfd2lyZWQoMCk7Ci0JbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwotCWphX3NldHVwX2NvbnNvbGUoKTsKLQotCXJldHVybiAwOwotfQotYXJjaF9pbml0Y2FsbChwZXJfY3B1X21hcHBpbmdzKTsKLQotdW5zaWduZWQgbG9uZyBtNDh0Mzd5X2dldF90aW1lKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbiwgc2VjOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKLQkvKiBzdG9wIHRoZSB1cGRhdGUgKi8KLQlydGNfYmFzZVsweDdmZjhdID0gMHg0MDsKLQotCXllYXIgPSBCQ0QyQklOKHJ0Y19iYXNlWzB4N2ZmZl0pOwotCXllYXIgKz0gQkNEMkJJTihydGNfYmFzZVsweDdmZjFdKSAqIDEwMDsKLQotCW1vbnRoID0gQkNEMkJJTihydGNfYmFzZVsweDdmZmVdKTsKLQotCWRheSA9IEJDRDJCSU4ocnRjX2Jhc2VbMHg3ZmZkXSk7Ci0KLQlob3VyID0gQkNEMkJJTihydGNfYmFzZVsweDdmZmJdKTsKLQltaW4gPSBCQ0QyQklOKHJ0Y19iYXNlWzB4N2ZmYV0pOwotCXNlYyA9IEJDRDJCSU4ocnRjX2Jhc2VbMHg3ZmY5XSk7Ci0KLQkvKiBzdGFydCB0aGUgdXBkYXRlICovCi0JcnRjX2Jhc2VbMHg3ZmY4XSA9IDB4MDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBta3RpbWUoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMpOwotfQotCi1pbnQgbTQ4dDM3eV9zZXRfdGltZSh1bnNpZ25lZCBsb25nIHNlYykKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgdG07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIGNvbnZlcnQgdG8gYSBtb3JlIHVzZWZ1bCBmb3JtYXQgLS0gbm90ZSBtb250aHMgY291bnQgZnJvbSAwICovCi0JdG9fdG0oc2VjLCAmdG0pOwotCXRtLnRtX21vbiArPSAxOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7Ci0JLyogZW5hYmxlIHdyaXRpbmcgKi8KLQlydGNfYmFzZVsweDdmZjhdID0gMHg4MDsKLQotCS8qIHllYXIgKi8KLQlydGNfYmFzZVsweDdmZmZdID0gQklOMkJDRCh0bS50bV95ZWFyICUgMTAwKTsKLQlydGNfYmFzZVsweDdmZjFdID0gQklOMkJDRCh0bS50bV95ZWFyIC8gMTAwKTsKLQotCS8qIG1vbnRoICovCi0JcnRjX2Jhc2VbMHg3ZmZlXSA9IEJJTjJCQ0QodG0udG1fbW9uKTsKLQotCS8qIGRheSAqLwotCXJ0Y19iYXNlWzB4N2ZmZF0gPSBCSU4yQkNEKHRtLnRtX21kYXkpOwotCi0JLyogaG91ci9taW4vc2VjICovCi0JcnRjX2Jhc2VbMHg3ZmZiXSA9IEJJTjJCQ0QodG0udG1faG91cik7Ci0JcnRjX2Jhc2VbMHg3ZmZhXSA9IEJJTjJCQ0QodG0udG1fbWluKTsKLQlydGNfYmFzZVsweDdmZjldID0gQklOMkJDRCh0bS50bV9zZWMpOwotCi0JLyogZGF5IG9mIHdlZWsgLS0gbm90IHJlYWxseSB1c2VkLCBidXQgbGV0J3Mga2VlcCBpdCB1cC10by1kYXRlICovCi0JcnRjX2Jhc2VbMHg3ZmZjXSA9IEJJTjJCQ0QodG0udG1fd2RheSArIDEpOwotCi0JLyogZGlzYWJsZSB3cml0aW5nICovCi0JcnRjX2Jhc2VbMHg3ZmY4XSA9IDB4MDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIF9faW5pdCBwbGF0X3RpbWVyX3NldHVwKHN0cnVjdCBpcnFhY3Rpb24gKmlycSkKLXsKLQlzZXR1cF9pcnEoOCwgaXJxKTsKLX0KLQotLyoKLSAqIFVnbHkgYnV0IHRoZSBsZWFzdCBvZiBhbGwgZXZpbHMuICBUTEIgaW5pdGlhbGl6YXRpb24gZGlkIGZsdXNoIHRoZSBUTEIgc28KLSAqIFdlIG5lZWQgdG8gc2V0dXAgbWFwcGluZ3MgYWdhaW4gYmVmb3JlIHdlIGNhbiB0b3VjaCB0aGUgUlRDLgotICovCi12b2lkIG1vbWVuY29fdGltZV9pbml0KHZvaWQpCi17Ci0Jd2lyZV9zdHVwaWRpdHlfaW50b190bGIoKTsKLQotCW1pcHNfaHB0X2ZyZXF1ZW5jeSA9IGNwdV9jbG9jayAvIDI7Ci0KLQlydGNfbWlwc19nZXRfdGltZSA9IG00OHQzN3lfZ2V0X3RpbWU7Ci0JcnRjX21pcHNfc2V0X3RpbWUgPSBtNDh0Mzd5X3NldF90aW1lOwotfQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG12X3BjaV9pb19tZW0wX3Jlc291cmNlID0gewotCS5uYW1lCT0gIk1WNjQzNDAgUENJMCBJTyBNRU0iLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXZfcGNpX21lbTBfcmVzb3VyY2UgPSB7Ci0JLm5hbWUJPSAiTVY2NDM0MCBQQ0kwIE1FTSIsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXZfcGNpX2NvbnRyb2xsZXIgbXZfYnVzMF9jb250cm9sbGVyID0gewotCS5wY2ljID0gewotCQkucGNpX29wcwk9ICZtdl9wY2lfb3BzLAotCQkubWVtX3Jlc291cmNlCT0gJm12X3BjaV9tZW0wX3Jlc291cmNlLAotCQkuaW9fcmVzb3VyY2UJPSAmbXZfcGNpX2lvX21lbTBfcmVzb3VyY2UsCi0JfSwKLQkuY29uZmlnX2FkZHIJPSBNVjY0MzQwX1BDSV8wX0NPTkZJR19BRERSLAotCS5jb25maWdfdnJlZwk9IE1WNjQzNDBfUENJXzBfQ09ORklHX0RBVEFfVklSVFVBTF9SRUcsCi19OwotCi1zdGF0aWMgdWludDMyX3QgbXZfaW9fYmFzZSwgbXZfaW9fc2l6ZTsKLQotc3RhdGljIHZvaWQgamFfcGNpMF9pbml0KHZvaWQpCi17Ci0JdWludDMyX3QgbWVtMF9iYXNlLCBtZW0wX3NpemU7Ci0JdWludDMyX3QgaW9fYmFzZSwgaW9fc2l6ZTsKLQotCWlvX2Jhc2UgPSBNVl9SRUFEKE1WNjQzNDBfUENJXzBfSU9fQkFTRV9BRERSKSA8PCAxNjsKLQlpb19zaXplID0gKE1WX1JFQUQoTVY2NDM0MF9QQ0lfMF9JT19TSVpFKSArIDEpIDw8IDE2OwotCW1lbTBfYmFzZSA9IE1WX1JFQUQoTVY2NDM0MF9QQ0lfMF9NRU1PUlkwX0JBU0VfQUREUikgPDwgMTY7Ci0JbWVtMF9zaXplID0gKE1WX1JFQUQoTVY2NDM0MF9QQ0lfMF9NRU1PUlkwX1NJWkUpICsgMSkgPDwgMTY7Ci0KLQltdl9wY2lfaW9fbWVtMF9yZXNvdXJjZS5zdGFydAkJPSAwOwotCW12X3BjaV9pb19tZW0wX3Jlc291cmNlLmVuZAkJPSBpb19zaXplIC0gMTsKLQltdl9wY2lfbWVtMF9yZXNvdXJjZS5zdGFydAkJPSBtZW0wX2Jhc2U7Ci0JbXZfcGNpX21lbTBfcmVzb3VyY2UuZW5kCQk9IG1lbTBfYmFzZSArIG1lbTBfc2l6ZSAtIDE7Ci0JbXZfYnVzMF9jb250cm9sbGVyLnBjaWMubWVtX29mZnNldAk9IG1lbTBfYmFzZTsKLQltdl9idXMwX2NvbnRyb2xsZXIucGNpYy5pb19vZmZzZXQJPSAwOwotCi0JaW9wb3J0X3Jlc291cmNlLmVuZAkJPSBpb19zaXplIC0gMTsKLQotCXJlZ2lzdGVyX3BjaV9jb250cm9sbGVyKCZtdl9idXMwX2NvbnRyb2xsZXIucGNpYyk7Ci0KLQltdl9pb19iYXNlID0gaW9fYmFzZTsKLQltdl9pb19zaXplID0gaW9fc2l6ZTsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdl9wY2lfaW9fbWVtMV9yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJNVjY0MzQwIFBDSTEgSU8gTUVNIiwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIG12X3BjaV9tZW0xX3Jlc291cmNlID0gewotCS5uYW1lCT0gIk1WNjQzNDAgUENJMSBNRU0iLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCi19OwotCi1zdGF0aWMgc3RydWN0IG12X3BjaV9jb250cm9sbGVyIG12X2J1czFfY29udHJvbGxlciA9IHsKLQkucGNpYyA9IHsKLQkJLnBjaV9vcHMJPSAmbXZfcGNpX29wcywKLQkJLm1lbV9yZXNvdXJjZQk9ICZtdl9wY2lfbWVtMV9yZXNvdXJjZSwKLQkJLmlvX3Jlc291cmNlCT0gJm12X3BjaV9pb19tZW0xX3Jlc291cmNlLAotCX0sCi0JLmNvbmZpZ19hZGRyCT0gTVY2NDM0MF9QQ0lfMV9DT05GSUdfQUREUiwKLQkuY29uZmlnX3ZyZWcJPSBNVjY0MzQwX1BDSV8xX0NPTkZJR19EQVRBX1ZJUlRVQUxfUkVHLAotfTsKLQotc3RhdGljIF9faW5pdCB2b2lkIGphX3BjaTFfaW5pdCh2b2lkKQotewotCXVpbnQzMl90IG1lbTBfYmFzZSwgbWVtMF9zaXplOwotCXVpbnQzMl90IGlvX2Jhc2UsIGlvX3NpemU7Ci0KLQlpb19iYXNlID0gTVZfUkVBRChNVjY0MzQwX1BDSV8xX0lPX0JBU0VfQUREUikgPDwgMTY7Ci0JaW9fc2l6ZSA9IChNVl9SRUFEKE1WNjQzNDBfUENJXzFfSU9fU0laRSkgKyAxKSA8PCAxNjsKLQltZW0wX2Jhc2UgPSBNVl9SRUFEKE1WNjQzNDBfUENJXzFfTUVNT1JZMF9CQVNFX0FERFIpIDw8IDE2OwotCW1lbTBfc2l6ZSA9IChNVl9SRUFEKE1WNjQzNDBfUENJXzFfTUVNT1JZMF9TSVpFKSArIDEpIDw8IDE2OwotCi0JLyoKLQkgKiBIZXJlIHdlIGFzc3VtZSB0aGUgSS9PIHdpbmRvdyBvZiBzZWNvbmQgYnVzIHRvIGJlIGNvbnRpZ3VvdXMgd2l0aAotCSAqIHRoZSBmaXJzdC4gIEEgZ2FwIGlzIG5vIHByb2JsZW0gYnV0IHdvdWxkIHdhc3RlIGFkZHJlc3Mgc3BhY2UgZm9yCi0JICogcmVtYXBwaW5nIHRoZSBwb3J0IHNwYWNlLgotCSAqLwotCW12X3BjaV9pb19tZW0xX3Jlc291cmNlLnN0YXJ0CQk9IG12X2lvX3NpemU7Ci0JbXZfcGNpX2lvX21lbTFfcmVzb3VyY2UuZW5kCQk9IG12X2lvX3NpemUgKyBpb19zaXplIC0gMTsKLQltdl9wY2lfbWVtMV9yZXNvdXJjZS5zdGFydAkJPSBtZW0wX2Jhc2U7Ci0JbXZfcGNpX21lbTFfcmVzb3VyY2UuZW5kCQk9IG1lbTBfYmFzZSArIG1lbTBfc2l6ZSAtIDE7Ci0JbXZfYnVzMV9jb250cm9sbGVyLnBjaWMubWVtX29mZnNldAk9IG1lbTBfYmFzZTsKLQltdl9idXMxX2NvbnRyb2xsZXIucGNpYy5pb19vZmZzZXQJPSAwOwotCi0JaW9wb3J0X3Jlc291cmNlLmVuZAkJPSBpb19iYXNlICsgaW9fc2l6ZSAtbXZfaW9fYmFzZSAtIDE7Ci0KLQlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcigmbXZfYnVzMV9jb250cm9sbGVyLnBjaWMpOwotCi0JbXZfaW9fc2l6ZSA9IGlvX2Jhc2UgKyBpb19zaXplIC0gbXZfaW9fYmFzZTsKLX0KLQotc3RhdGljIF9faW5pdCBpbnQgX19pbml0IGphX3BjaV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBpb192X2Jhc2U7Ci0JdWludDMyX3QgZW5hYmxlOwotCi0JZW5hYmxlID0gfk1WX1JFQUQoTVY2NDM0MF9CQVNFX0FERFJfRU5BQkxFKTsKLQotCS8qCi0JICogV2UgcmVxdWlyZSBhdCBsZWFzdCBvbmUgZW5hYmxlZCBJL08gb3IgUENJIG1lbW9yeSB3aW5kb3cgb3Igd2UKLQkgKiB3aWxsIGlnbm9yZSB0aGlzIFBDSSBidXMuICBXZSBpZ25vcmUgUENJIHdpbmRvd3MgMSwgMiBhbmQgMy4KLQkgKi8KLQlpZiAoZW5hYmxlICYgKDB4MDEgPDwgIDkpIHx8IGVuYWJsZSAmICgweDAxIDw8IDEwKSkKLQkJamFfcGNpMF9pbml0KCk7Ci0KLQlpZiAoZW5hYmxlICYgKDB4MDEgPDwgMTQpIHx8IGVuYWJsZSAmICgweDAxIDw8IDE1KSkKLQkJamFfcGNpMV9pbml0KCk7Ci0KLQlpZiAobXZfaW9fc2l6ZSkgewotCQlpb192X2Jhc2UgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChtdl9pb19iYXNlLCBtdl9pb19zaXplKTsKLQkJaWYgKCFpb192X2Jhc2UpCi0JCQlwYW5pYygiQ291bGQgbm90IGlvcmVtYXAgSS9PIHBvcnQgcmFuZ2UiKTsKLQotCQlzZXRfaW9fcG9ydF9iYXNlKGlvX3ZfYmFzZSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWFyY2hfaW5pdGNhbGwoamFfcGNpX2luaXQpOwotCi12b2lkIF9faW5pdCBwbGF0X21lbV9zZXR1cCh2b2lkKQotewotCXVuc2lnbmVkIGludCB0bXB3b3JkOwotCi0JYm9hcmRfdGltZV9pbml0ID0gbW9tZW5jb190aW1lX2luaXQ7Ci0KLQlfbWFjaGluZV9yZXN0YXJ0ID0gbW9tZW5jb19qYWd1YXJfcmVzdGFydDsKLQlfbWFjaGluZV9oYWx0ID0gbW9tZW5jb19qYWd1YXJfaGFsdDsKLQlwbV9wb3dlcl9vZmYgPSBtb21lbmNvX2phZ3Vhcl9wb3dlcl9vZmY7Ci0KLQkvKgotCSAqIGluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWphZ3Vhcl9pbml0cmRfc3RhcnQ7Ci0JICogaW5pdHJkX2VuZCA9ICh1bnNpZ25lZCBsb25nKWphZ3Vhcl9pbml0cmRfc3RhcnQgKyAodWxvbmcpamFndWFyX2luaXRyZF9zaXplOwotCSAqIGluaXRyZF9iZWxvd19zdGFydF9vayA9IDE7Ci0JICovCi0KLQl3aXJlX3N0dXBpZGl0eV9pbnRvX3RsYigpOwotCi0JLyoKLQkgKiBzaHV0IGRvd24gZXRoZXJuZXQgcG9ydHMsIGp1c3QgdG8gYmUgc3VyZSBvdXIgbWVtb3J5IGRvZXNuJ3QgZ2V0Ci0JICogY29ycnVwdGVkIGJ5IHJhbmRvbSBldGhlcm5ldCB0cmFmZmljLgotCSAqLwotCU1WX1dSSVRFKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKDApLCAweGZmIDw8IDgpOwotCU1WX1dSSVRFKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKDEpLCAweGZmIDw8IDgpOwotCU1WX1dSSVRFKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKDIpLCAweGZmIDw8IDgpOwotCU1WX1dSSVRFKE1WNjQzWFhfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcoMCksIDB4ZmYgPDwgOCk7Ci0JTVZfV1JJVEUoTVY2NDNYWF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRygxKSwgMHhmZiA8PCA4KTsKLQlNVl9XUklURShNVjY0M1hYX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHKDIpLCAweGZmIDw8IDgpOwotCXdoaWxlIChNVl9SRUFEKE1WNjQzWFhfRVRIX1JFQ0VJVkVfUVVFVUVfQ09NTUFORF9SRUcoMCkpICYgMHhmZik7Ci0Jd2hpbGUgKE1WX1JFQUQoTVY2NDNYWF9FVEhfUkVDRUlWRV9RVUVVRV9DT01NQU5EX1JFRygxKSkgJiAweGZmKTsKLQl3aGlsZSAoTVZfUkVBRChNVjY0M1hYX0VUSF9SRUNFSVZFX1FVRVVFX0NPTU1BTkRfUkVHKDIpKSAmIDB4ZmYpOwotCXdoaWxlIChNVl9SRUFEKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKDApKSAmIDB4ZmYpOwotCXdoaWxlIChNVl9SRUFEKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKDEpKSAmIDB4ZmYpOwotCXdoaWxlIChNVl9SRUFEKE1WNjQzWFhfRVRIX1RSQU5TTUlUX1FVRVVFX0NPTU1BTkRfUkVHKDIpKSAmIDB4ZmYpOwotCU1WX1dSSVRFKE1WNjQzWFhfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHKDApLAotCSAgICAgICAgIE1WX1JFQUQoTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcoMCkpICYgfjEpOwotCU1WX1dSSVRFKE1WNjQzWFhfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHKDEpLAotCSAgICAgICAgIE1WX1JFQUQoTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcoMSkpICYgfjEpOwotCU1WX1dSSVRFKE1WNjQzWFhfRVRIX1BPUlRfU0VSSUFMX0NPTlRST0xfUkVHKDIpLAotCSAgICAgICAgIE1WX1JFQUQoTVY2NDNYWF9FVEhfUE9SVF9TRVJJQUxfQ09OVFJPTF9SRUcoMikpICYgfjEpOwotCi0JLyogVHVybiBvZmYgdGhlIEJpdC1FcnJvciBMRUQgKi8KLQlKQUdVQVJfRlBHQV9XUklURSgweDgwLCBDTFIpOwotCi0JdG1wd29yZCA9IEpBR1VBUl9GUEdBX1JFQUQoQk9BUkRSRVYpOwotCWlmICh0bXB3b3JkIDwgMjYpCi0JCXByaW50aygiTW9tZW50dW0gSmFndWFyLUFUWDogQm9hcmQgQXNzZW1ibHkgUmV2LiAlY1xuIiwKLQkJCSdBJyt0bXB3b3JkKTsKLQllbHNlCi0JCXByaW50aygiTW9tZW50dW0gSmFndWFyLUFUWDogQm9hcmQgQXNzZW1ibHkgUmV2aXNpb24gIzB4JXhcbiIsCi0JCQl0bXB3b3JkKTsKLQotCXRtcHdvcmQgPSBKQUdVQVJfRlBHQV9SRUFEKEZQR0FfUkVWKTsKLQlwcmludGsoIkZQR0EgUmV2OiAlZC4lZFxuIiwgdG1wd29yZD4+NCwgdG1wd29yZCYxNSk7Ci0JdG1wd29yZCA9IEpBR1VBUl9GUEdBX1JFQUQoUkVTRVRfU1RBVFVTKTsKLQlwcmludGsoIlJlc2V0IHJlYXNvbjogMHgleFxuIiwgdG1wd29yZCk7Ci0Jc3dpdGNoICh0bXB3b3JkKSB7Ci0JY2FzZSAweDE6Ci0JCXByaW50aygiICAtIFBvd2VyLXVwIHJlc2V0XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDI6Ci0JCXByaW50aygiICAtIFB1c2gtYnV0dG9uIHJlc2V0XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDg6Ci0JCXByaW50aygiICAtIFdhdGNoZG9nIHJlc2V0XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDEwOgotCQlwcmludGsoIiAgLSBKVEFHIHJlc2V0XG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKCIgIC0gVW5rbm93biByZXNldCBjYXVzZVxuIik7Ci0JfQotCXJlc2V0X3JlYXNvbiA9IHRtcHdvcmQ7Ci0JSkFHVUFSX0ZQR0FfV1JJVEUoMHhmZiwgUkVTRVRfU1RBVFVTKTsKLQotCXRtcHdvcmQgPSBKQUdVQVJfRlBHQV9SRUFEKEJPQVJEX1NUQVRVUyk7Ci0JcHJpbnRrKCJCb2FyZCBTdGF0dXMgcmVnaXN0ZXI6IDB4JTAyeFxuIiwgdG1wd29yZCk7Ci0JcHJpbnRrKCIgIC0gVXNlciBqdW1wZXI6ICVzXG4iLCAodG1wd29yZCAmIDB4ODApPyJpbnN0YWxsZWQiOiJhYnNlbnQiKTsKLQlwcmludGsoIiAgLSBCb290IGZsYXNoIHdyaXRlIGp1bXBlcjogJXNcbiIsICh0bXB3b3JkJjB4NDApPyJpbnN0YWxsZWQiOiJhYnNlbnQiKTsKLQotCS8qIDI1Nk1pQiBvZiBSTTkwMDB4MiBERFIgKi8KLS8vCWFkZF9tZW1vcnlfcmVnaW9uKDB4MCwgMHgxMDA8PDIwLCBCT09UX01FTV9SQU0pOwotCi0JLyogMTI4TWlCIG9mIE1WLTY0MzQwIEREUiAqLwotLy8JYWRkX21lbW9yeV9yZWdpb24oMHgxMDA8PDIwLCAweDgwPDwyMCwgQk9PVF9NRU1fUkFNKTsKLQotCS8qIFhYWCBNZW1vcnkgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgcGlja2VkIHVwIGZyb20gUE1PTjJrICovCi0jaWZkZWYgQ09ORklHX0pBR1VBUl9ETUFMT1cKLQlwcmludGsoIkphZ3VhciBBVFggRE1BLWxvdyBtb2RlIHNldFxuIik7Ci0JYWRkX21lbW9yeV9yZWdpb24oMHgwMDAwMDAwMCwgMHgwODAwMDAwMCwgQk9PVF9NRU1fUkFNKTsKLQlhZGRfbWVtb3J5X3JlZ2lvbigweDA4MDAwMDAwLCAweDEwMDAwMDAwLCBCT09UX01FTV9SQU0pOwotI2Vsc2UKLQkvKiAxMjhNaUIgb2YgTVYtNjQzNDAgRERSIFJBTSAqLwotCXByaW50aygiSmFndWFyIEFUWCBETUEtbG93IG1vZGUgaXMgbm90IHNldFxuIik7Ci0JYWRkX21lbW9yeV9yZWdpb24oMHgxMDA8PDIwLCAweDgwPDwyMCwgQk9PVF9NRU1fUkFNKTsKLSNlbmRpZgotCi0jaWZkZWYgR0VNREVCVUdfVFJBQ0VCVUZGRVIKLQl7Ci0JICB1bnNpZ25lZCBpbnQgdGJDb250cm9sOwotCSAgdGJDb250cm9sID0KLQkgICAgMCA8PCAyNiB8ICAvKiBwb3N0IHRyaWdnZXIgZGVsYXkgMCAqLwotCQkgICAgMHgyIDw8IDE2IHwJCS8qIHNlcXVlbnRpYWwgdHJhY2UgbW9kZSAqLwotCSAgICAvLwkgICAgMHgwIDw8IDE2IHwJCS8qIG5vbi1zZXF1ZW50aWFsIHRyYWNlIG1vZGUgKi8KLQkgICAgLy8JICAgIDB4ZiA8PCA0IHwJCS8qIHdhdGNocG9pbnRzIGRpc2FibGVkICovCi0JICAgIDIgPDwgMiB8CQkvKiBhcm1lZCAqLwotCSAgICAyIDsJCQkvKiBpbnRlcnJ1cHQgZGlzYWJsZWQgICovCi0JICBwcmludGsgKCJzZXR0aW5nICAgICB0YkNvbnRyb2wgPSAlMDhseFxuIiwgdGJDb250cm9sKTsKLQkgIHdyaXRlXzMyYml0X2NwMF9zZXQxX3JlZ2lzdGVyKCQyMiwgdGJDb250cm9sKTsKLQkgIF9fYXNtX18gX192b2xhdGlsZV9fKCIuc2V0IG5vcmVvcmRlclxuXHQiIFwKLQkJCSAgICAgICAibm9wOyBub3A7IG5vcDsgbm9wOyBub3A7IG5vcDtcblx0IiBcCi0JCQkgICAgICAgIm5vcDsgbm9wOyBub3A7IG5vcDsgbm9wOyBub3A7XG5cdCIgXAotCQkJICAgICAgICIuc2V0IHJlb3JkZXJcblx0Iik7Ci0KLQl9Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhMDAzMC4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIE1vbWVudHVtIENvbXB1dGVyJ3MgT2NlbG90LUcgYm9hcmQuCi0jCi0KLW9iai15CSAJCSs9IGlycS5vIGd0LWlycS5vIHByb20ubyByZXNldC5vIHNldHVwLm8KLW9iai0kKENPTkZJR19LR0RCKQkrPSBkYmdfaW8ubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL2RiZ19pby5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL2RiZ19pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmQ2ZmI0Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9kYmdfaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0KLSNpbmNsdWRlIDxhc20vc2VyaWFsLmg+IC8qIEZvciB0aGUgc2VyaWFsIHBvcnQgbG9jYXRpb24gYW5kIGJhc2UgYmF1ZCAqLwotCi0vKiAtLS0gQ09ORklHIC0tLSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7Ci10eXBlZGVmIHVuc2lnbmVkIGludCB1aW50MzI7Ci0KLS8qIC0tLSBFTkQgT0YgQ09ORklHIC0tLSAqLwotCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfMjQwMCAgICAgICAgICAgICAyNDAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfNDgwMCAgICAgICAgICAgICA0ODAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfOTYwMCAgICAgICAgICAgICA5NjAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfMTkyMDAgICAgICAgICAgICAxOTIwMAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9CQVVEXzM4NDAwICAgICAgICAgICAgMzg0MDAKLSNkZWZpbmUgICAgICAgICBVQVJUMTY1NTBfQkFVRF81NzYwMCAgICAgICAgICAgIDU3NjAwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0JBVURfMTE1MjAwICAgICAgICAgICAxMTUyMDAKLQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfTk9ORSAgICAgICAgICAgMAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfT0REICAgICAgICAgICAgMHgwOAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfRVZFTiAgICAgICAgICAgMHgxOAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfTUFSSyAgICAgICAgICAgMHgyOAotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9QQVJJVFlfU1BBQ0UgICAgICAgICAgMHgzOAotCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0RBVEFfNUJJVCAgICAgICAgICAgICAweDAKLSNkZWZpbmUgICAgICAgICBVQVJUMTY1NTBfREFUQV82QklUICAgICAgICAgICAgIDB4MQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9EQVRBXzdCSVQgICAgICAgICAgICAgMHgyCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX0RBVEFfOEJJVCAgICAgICAgICAgICAweDMKLQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9TVE9QXzFCSVQgICAgICAgICAgICAgMHgwCi0jZGVmaW5lICAgICAgICAgVUFSVDE2NTUwX1NUT1BfMkJJVCAgICAgICAgICAgICAweDQKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotLyogPT09IENPTkZJRyA9PT0gKi8KLQotLyogW2pzdW5dIHdlIHVzZSB0aGUgc2Vjb25kIHNlcmlhbCBwb3J0IGZvciBrZGIgKi8KLSNkZWZpbmUgICAgICAgICBCQVNFICAgICAgICAgICAgICAgICAgICBPQ0VMT1RfU0VSSUFMMV9CQVNFCi0jZGVmaW5lICAgICAgICAgTUFYX0JBVUQgICAgICAgICAgICAgICAgT0NFTE9UX0JBU0VfQkFVRAotCi0vKiA9PT0gRU5EIE9GIENPTkZJRyA9PT0gKi8KLQotI2RlZmluZSAgICAgICAgIFJFR19PRkZTRVQgICAgICAgICAgICAgIDQKLQotLyogcmVnaXN0ZXIgb2Zmc2V0ICovCi0jZGVmaW5lICAgICAgICAgT0ZTX1JDVl9CVUZGRVIgICAgICAgICAgMAotI2RlZmluZSAgICAgICAgIE9GU19UUkFOU19IT0xEICAgICAgICAgIDAKLSNkZWZpbmUgICAgICAgICBPRlNfU0VORF9CVUZGRVIgICAgICAgICAwCi0jZGVmaW5lICAgICAgICAgT0ZTX0lOVFJfRU5BQkxFICAgICAgICAgKDEqUkVHX09GRlNFVCkKLSNkZWZpbmUgICAgICAgICBPRlNfSU5UUl9JRCAgICAgICAgICAgICAoMipSRUdfT0ZGU0VUKQotI2RlZmluZSAgICAgICAgIE9GU19EQVRBX0ZPUk1BVCAgICAgICAgICgzKlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX0xJTkVfQ09OVFJPTCAgICAgICAgKDMqUkVHX09GRlNFVCkKLSNkZWZpbmUgICAgICAgICBPRlNfTU9ERU1fQ09OVFJPTCAgICAgICAoNCpSRUdfT0ZGU0VUKQotI2RlZmluZSAgICAgICAgIE9GU19SUzIzMl9PVVRQVVQgICAgICAgICg0KlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX0xJTkVfU1RBVFVTICAgICAgICAgKDUqUkVHX09GRlNFVCkKLSNkZWZpbmUgICAgICAgICBPRlNfTU9ERU1fU1RBVFVTICAgICAgICAoNipSRUdfT0ZGU0VUKQotI2RlZmluZSAgICAgICAgIE9GU19SUzIzMl9JTlBVVCAgICAgICAgICg2KlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX1NDUkFUQ0hfUEFEICAgICAgICAgKDcqUkVHX09GRlNFVCkKLQotI2RlZmluZSAgICAgICAgIE9GU19ESVZJU09SX0xTQiAgICAgICAgICgwKlJFR19PRkZTRVQpCi0jZGVmaW5lICAgICAgICAgT0ZTX0RJVklTT1JfTVNCICAgICAgICAgKDEqUkVHX09GRlNFVCkKLQotCi0vKiBtZW1vcnktbWFwcGVkIHJlYWQvd3JpdGUgb2YgdGhlIHBvcnQgKi8KLSNkZWZpbmUgICAgICAgICBVQVJUMTY1NTBfUkVBRCh5KSAgICAoKigodm9sYXRpbGUgdWludDgqKShCQVNFICsgeSkpKQotI2RlZmluZSAgICAgICAgIFVBUlQxNjU1MF9XUklURSh5LCB6KSAgKCgqKCh2b2xhdGlsZSB1aW50OCopKEJBU0UgKyB5KSkpID0geikKLQotdm9pZCBkZWJ1Z0luaXQodWludDMyIGJhdWQsIHVpbnQ4IGRhdGEsIHVpbnQ4IHBhcml0eSwgdWludDggc3RvcCkKLXsKLQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KLQlVQVJUMTY1NTBfV1JJVEUoT0ZTX0lOVFJfRU5BQkxFLCAwKTsKLQotCS8qIHNldCB1cCBiYXVkIHJhdGUgKi8KLQl7Ci0JCXVpbnQzMiBkaXZpc29yOwotCi0JCS8qIHNldCBESUFCIGJpdCAqLwotCQlVQVJUMTY1NTBfV1JJVEUoT0ZTX0xJTkVfQ09OVFJPTCwgMHg4MCk7Ci0KLQkJLyogc2V0IGRpdmlzb3IgKi8KLQkJZGl2aXNvciA9IE1BWF9CQVVEIC8gYmF1ZDsKLQkJVUFSVDE2NTUwX1dSSVRFKE9GU19ESVZJU09SX0xTQiwgZGl2aXNvciAmIDB4ZmYpOwotCQlVQVJUMTY1NTBfV1JJVEUoT0ZTX0RJVklTT1JfTVNCLCAoZGl2aXNvciAmIDB4ZmYwMCkgPj4gOCk7Ci0KLQkJLyogY2xlYXIgRElBQiBiaXQgKi8KLQkJVUFSVDE2NTUwX1dSSVRFKE9GU19MSU5FX0NPTlRST0wsIDB4MCk7Ci0JfQotCi0JLyogc2V0IGRhdGEgZm9ybWF0ICovCi0JVUFSVDE2NTUwX1dSSVRFKE9GU19EQVRBX0ZPUk1BVCwgZGF0YSB8IHBhcml0eSB8IHN0b3ApOwotfQotCi1zdGF0aWMgaW50IHJlbW90ZURlYnVnSW5pdGlhbGl6ZWQgPSAwOwotCi11aW50OCBnZXREZWJ1Z0NoYXIodm9pZCkKLXsKLQlpZiAoIXJlbW90ZURlYnVnSW5pdGlhbGl6ZWQpIHsKLQkJcmVtb3RlRGVidWdJbml0aWFsaXplZCA9IDE7Ci0JCWRlYnVnSW5pdChVQVJUMTY1NTBfQkFVRF8zODQwMCwKLQkJCSAgVUFSVDE2NTUwX0RBVEFfOEJJVCwKLQkJCSAgVUFSVDE2NTUwX1BBUklUWV9OT05FLCBVQVJUMTY1NTBfU1RPUF8xQklUKTsKLQl9Ci0KLQl3aGlsZSAoKFVBUlQxNjU1MF9SRUFEKE9GU19MSU5FX1NUQVRVUykgJiAweDEpID09IDApOwotCXJldHVybiBVQVJUMTY1NTBfUkVBRChPRlNfUkNWX0JVRkZFUik7Ci19Ci0KLQotaW50IHB1dERlYnVnQ2hhcih1aW50OCBieXRlKQotewotCWlmICghcmVtb3RlRGVidWdJbml0aWFsaXplZCkgewotCQlyZW1vdGVEZWJ1Z0luaXRpYWxpemVkID0gMTsKLQkJZGVidWdJbml0KFVBUlQxNjU1MF9CQVVEXzM4NDAwLAotCQkJICBVQVJUMTY1NTBfREFUQV84QklULAotCQkJICBVQVJUMTY1NTBfUEFSSVRZX05PTkUsIFVBUlQxNjU1MF9TVE9QXzFCSVQpOwotCX0KLQotCXdoaWxlICgoVUFSVDE2NTUwX1JFQUQoT0ZTX0xJTkVfU1RBVFVTKSAmIDB4MjApID09IDApOwotCVVBUlQxNjU1MF9XUklURShPRlNfU0VORF9CVUZGRVIsIGJ5dGUpOwotCXJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL2d0LWlycS5jIGIvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL2d0LWlycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTU3NmJkLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9ndC1pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAyMDAyIE1vbWVudHVtIENvbXB1dGVyCi0gKiBBdXRob3I6IG1kaGFybUBtb21lbmNvLmNvbQotICoKLSAqIGFyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9ndF9pcnEuYwotICogICAgIEludGVycnVwdCByb3V0aW5lcyBmb3IgZ3Q2NDI0MC4gIEN1cnJlbnRseSBpdCBvbmx5IGhhbmRsZXMgdGltZXIgaXJxLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8YXNtL2d0NjQyNDAuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotdW5zaWduZWQgbG9uZyBidXNfY2xvY2s7Ci0KLS8qCi0gKiBUaGVzZSBhcmUgaW50ZXJydXB0IGhhbmRsZXJzIGZvciB0aGUgR1Qgb24tY2hpcCBpbnRlcnJ1cHRzLiAgVGhleQotICogYWxsIGNvbWUgaW4gdG8gdGhlIE1JUFMgb24gYSBzaW5nbGUgaW50ZXJydXB0IGxpbmUsIGFuZCBoYXZlIHRvCi0gKiBiZSBoYW5kbGVkIGFuZCBhY2snZWQgZGlmZmVyZW50bHkgdGhhbiBvdGhlciBNSVBTIGludGVycnVwdHMuCi0gKi8KLQotI2lmIDAKLQotc3RydWN0IHRxX3N0cnVjdCBpcnFfaGFuZGxlcnNbTUFYX0NBVVNFX1JFR1NdW01BWF9DQVVTRV9SRUdfV0lEVEhdOwotdm9pZCBob29rX2lycV9oYW5kbGVyKGludCBpbnRfY2F1c2UsIGludCBiaXRfbnVtLCB2b2lkICppc3JfcHRyKTsKLQotLyoKLSAqIEhvb2tzIElSUSBoYW5kbGVyIHRvIHRoZSBzeXN0ZW0uIFdoZW4gdGhlIHN5c3RlbSBpcyBpbnRlcnJ1cHRlZAotICogdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgaXMgY2FsbGVkLgotICoKLSAqIElucHV0cyA6Ci0gKiBpbnRfY2F1c2UgLSBUaGUgaW50ZXJydXB0IGNhdXNlIG51bWJlci4gSW4gRVZCNjQxMjAgdHdvIHBhcmFtZXRlcnMKLSAqICAgICAgICAgICAgIGFyZSBkZWNsYXJlZCwgSU5UX0NBVVNFX01BSU4gYW5kIElOVF9DQVVTRV9ISUdILgotICogYml0X251bSAgIC0gSW5kaWNhdGVzIHdoaWNoIGJpdCBudW1iZXIgaW4gdGhlIGNhdXNlIHJlZ2lzdGVyCi0gKiBpc3JfcHRyICAgLSBQb2ludGVyIHRvIHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lCi0gKi8KLXZvaWQgaG9va19pcnFfaGFuZGxlcihpbnQgaW50X2NhdXNlLCBpbnQgYml0X251bSwgdm9pZCAqaXNyX3B0cikKLXsKLQlpcnFfaGFuZGxlcnNbaW50X2NhdXNlXVtiaXRfbnVtXS5yb3V0aW5lID0gaXNyX3B0cjsKLX0KLQotCi0vKgotICogRW5hYmxlcyB0aGUgSVJRIG9uIEdhbGlsZW8gQ2hpcAotICoKLSAqIElucHV0cyA6Ci0gKiBpbnRfY2F1c2UgLSBUaGUgaW50ZXJydXB0IGNhdXNlIG51bWJlci4gSW4gRVZCNjQxMjAgdHdvIHBhcmFtZXRlcnMKLSAqICAgICAgICAgICAgIGFyZSBkZWNsYXJlZCwgSU5UX0NBVVNFX01BSU4gYW5kIElOVF9DQVVTRV9ISUdILgotICogYml0X251bSAgIC0gSW5kaWNhdGVzIHdoaWNoIGJpdCBudW1iZXIgaW4gdGhlIGNhdXNlIHJlZ2lzdGVyCi0gKgotICogT3V0cHV0cyA6Ci0gKiAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgZmFpbHVyZQotICovCi1pbnQgZW5hYmxlX2dhbGlsZW9faXJxKGludCBpbnRfY2F1c2UsIGludCBiaXRfbnVtKQotewotCWlmIChpbnRfY2F1c2UgPT0gSU5UX0NBVVNFX01BSU4pCi0JCVNFVF9SRUdfQklUUyhDUFVfSU5URVJSVVBUX01BU0tfUkVHSVNURVIsICgxIDw8IGJpdF9udW0pKTsKLQllbHNlIGlmIChpbnRfY2F1c2UgPT0gSU5UX0NBVVNFX0hJR0gpCi0JCVNFVF9SRUdfQklUUyhDUFVfSElHSF9JTlRFUlJVUFRfTUFTS19SRUdJU1RFUiwKLQkJCSAgICAgKDEgPDwgYml0X251bSkpOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIERpc2FibGVzIHRoZSBJUlEgb24gR2FsaWxlbyBDaGlwCi0gKgotICogSW5wdXRzIDoKLSAqIGludF9jYXVzZSAtIFRoZSBpbnRlcnJ1cHQgY2F1c2UgbnVtYmVyLiBJbiBFVkI2NDEyMCB0d28gcGFyYW1ldGVycwotICogICAgICAgICAgICAgYXJlIGRlY2xhcmVkLCBJTlRfQ0FVU0VfTUFJTiBhbmQgSU5UX0NBVVNFX0hJR0guCi0gKiBiaXRfbnVtICAgLSBJbmRpY2F0ZXMgd2hpY2ggYml0IG51bWJlciBpbiB0aGUgY2F1c2UgcmVnaXN0ZXIKLSAqCi0gKiBPdXRwdXRzIDoKLSAqIDEgaWYgc3VjY2Vzc2Z1bCwgMCBpZiBmYWlsdXJlCi0gKi8KLWludCBkaXNhYmxlX2dhbGlsZW9faXJxKGludCBpbnRfY2F1c2UsIGludCBiaXRfbnVtKQotewotCWlmIChpbnRfY2F1c2UgPT0gSU5UX0NBVVNFX01BSU4pCi0JCVJFU0VUX1JFR19CSVRTKENQVV9JTlRFUlJVUFRfTUFTS19SRUdJU1RFUiwKLQkJCSAgICAgICAoMSA8PCBiaXRfbnVtKSk7Ci0JZWxzZSBpZiAoaW50X2NhdXNlID09IElOVF9DQVVTRV9ISUdIKQotCQlSRVNFVF9SRUdfQklUUyhDUFVfSElHSF9JTlRFUlJVUFRfTUFTS19SRUdJU1RFUiwKLQkJCSAgICAgICAoMSA8PCBiaXRfbnVtKSk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiAwICovCi0KLS8qCi0gKiBJbnRlcnJ1cHQgaGFuZGxlciBmb3IgaW50ZXJydXB0cyBjb21pbmcgZnJvbSB0aGUgR2FsaWxlbyBjaGlwIHZpYSBQMF9JTlQjLgotICoKLSAqIFdlIHJvdXRlIHRoZSB0aW1lciBpbnRlcnJ1cHQgdG8gUDBfSU5UIyAoSVJRIDYpLCBhbmQgdGhhdCdzIGFsbCB0aGlzCi0gKiByb3V0aW5lIGNhbiBoYW5kbGUsIGZvciBub3cuCi0gKgotICogSW4gdGhlIGZ1dHVyZSwgd2UnbGwgcm91dGUgbW9yZSBpbnRlcnJ1cHRzIHRvIHRoaXMgcGluLCBhbmQgdGhhdCdzIHdoeQotICogd2Uga2VlcCB0aGlzIHBhcnRpY3VsYXIgc3RydWN0dXJlIGluIHRoZSBmdW5jdGlvbi4KLSAqLwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgZ3Q2NDI0MF9wMGludF9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQotewotCXVpbnQzMl90IGlycV9zcmMsIGlycV9zcmNfbWFzazsKLQlpbnQgaGFuZGxlZDsKLQotCS8qIGdldCB0aGUgbG93IGludGVycnVwdCBjYXVzZSByZWdpc3RlciAqLwotCWlycV9zcmMgPSBNVl9SRUFEKExPV19JTlRFUlJVUFRfQ0FVU0VfUkVHSVNURVIpOwotCi0JLyogZ2V0IHRoZSBtYXNrIHJlZ2lzdGVyIGZvciB0aGlzIHBpbiAqLwotCWlycV9zcmNfbWFzayA9IE1WX1JFQUQoUENJXzBJTlRFUlJVUFRfQ0FVU0VfTUFTS19SRUdJU1RFUl9MT1cpOwotCi0JLyogbWFzayBvZmYgb25seSB0aGUgaW50ZXJydXB0cyB3ZSdyZSBpbnRlcmVzdGVkIGluICovCi0JaXJxX3NyYyA9IGlycV9zcmMgJiBpcnFfc3JjX21hc2s7Ci0KLQloYW5kbGVkID0gSVJRX05PTkU7Ci0KLQkvKiBDaGVjayBmb3IgdGltZXIgaW50ZXJydXB0ICovCi0JaWYgKGlycV9zcmMgJiAweDAwMDAwMTAwKSB7Ci0JCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKLQkJaXJxX3NyYyAmPSB+MHgwMDAwMDEwMDsKLQotCQkvKiBDbGVhciBhbnkgcGVuZGluZyBjYXVzZSBiaXRzICovCi0JCU1WX1dSSVRFKFRJTUVSX0NPVU5URVJfMF8zX0lOVEVSUlVQVF9DQVVTRSwgMHgwKTsKLQotCQkvKiBoYW5kbGUgdGhlIHRpbWVyIGNhbGwgKi8KLQkJZG9fdGltZXIoMSk7Ci0jaWZuZGVmIENPTkZJR19TTVAKLQkJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKGdldF9pcnFfcmVncygpKSk7Ci0jZW5kaWYKLQl9Ci0KLQlpZiAoaXJxX3NyYykgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiVU5LTk9XTiBQMF9JTlQjIGludGVycnVwdCByZWNlaXZlZCwgaXJxX3NyYz0weCV4XG4iLAotCQkgICAgICAgaXJxX3NyYyk7Ci0JfQotCi0JcmV0dXJuIGhhbmRsZWQ7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplcyB0aW1lciB1c2luZyBnYWxpbGVvJ3MgYnVpbHQgaW4gdGltZXIuCi0gKi8KLQotLyoKLSAqIFRoaXMgd2lsbCBpZ25vcmUgdGhlIHN0YW5kYXJkIE1JUFMgdGltZXIgaW50ZXJydXB0IGhhbmRsZXIKLSAqIHRoYXQgaXMgcGFzc2VkIGluIGFzICppcnEgKD1pcnEwIGluIC4uL2tlcm5lbC90aW1lLmMpLgotICogV2Ugd2lsbCBkbyBvdXIgb3duIHRpbWVyIGludGVycnVwdCBoYW5kbGluZy4KLSAqLwotdm9pZCBndDY0MjQwX3RpbWVfaW5pdCh2b2lkKQotewotCXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHRpbWVyOwotCi0JLyogU3RvcCB0aGUgdGltZXIgLS0gd2UnbGwgdXNlIHRpbWVyICMwICovCi0JTVZfV1JJVEUoVElNRVJfQ09VTlRFUl8wXzNfQ09OVFJPTCwgMHgwKTsKLQotCS8qIExvYWQgdGltZXIgdmFsdWUgZm9yIDEwMCBIeiAqLwotCU1WX1dSSVRFKFRJTUVSX0NPVU5URVIwLCBidXNfY2xvY2sgLyAxMDApOwotCi0JLyoKLQkgKiBDcmVhdGUgdGhlIElSUSBzdHJ1Y3R1cmUgZW50cnkgZm9yIHRoZSB0aW1lci4gIFNpbmNlIHdlJ3JlIHRvbyBlYXJseQotCSAqIGluIHRoZSBib290IHByb2Nlc3MgdG8gdXNlIHRoZSAicmVxdWVzdF9pcnEoKSIgY2FsbCwgd2UnbGwgaGFyZC1jb2RlCi0JICogdGhlIHZhbHVlcyB0byB0aGUgY29ycmVjdCBpbnRlcnJ1cHQgbGluZS4KLQkgKi8KLQl0aW1lci5oYW5kbGVyID0gJmd0NjQyNDBfcDBpbnRfaXJxOwotCXRpbWVyLmZsYWdzID0gSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVEOwotCXRpbWVyLm5hbWUgPSAidGltZXIiOwotCXRpbWVyLmRldl9pZCA9IE5VTEw7Ci0JdGltZXIubmV4dCA9IE5VTEw7Ci0JdGltZXIubWFzayA9IENQVV9NQVNLX05PTkU7Ci0JaXJxX2Rlc2NbNl0uYWN0aW9uID0gJnRpbWVyOwotCi0JZW5hYmxlX2lycSg2KTsKLQotCS8qIENsZWFyIGFueSBwZW5kaW5nIGNhdXNlIGJpdHMgKi8KLQlNVl9XUklURShUSU1FUl9DT1VOVEVSXzBfM19JTlRFUlJVUFRfQ0FVU0UsIDB4MCk7Ci0KLQkvKiBFbmFibGUgdGhlIGludGVycnVwdCBmb3IgdGltZXIgMCAqLwotCU1WX1dSSVRFKFRJTUVSX0NPVU5URVJfMF8zX0lOVEVSUlVQVF9NQVNLLCAweDEpOwotCi0JLyogRW5hYmxlIHRoZSB0aW1lciBpbnRlcnJ1cHQgZm9yIEdULTY0MjQwIHBpbiBQMF9JTlQjICovCi0JTVZfV1JJVEUgKFBDSV8wSU5URVJSVVBUX0NBVVNFX01BU0tfUkVHSVNURVJfTE9XLCAweDEwMCk7Ci0KLQkvKiBDb25maWd1cmUgYW5kIHN0YXJ0IHRoZSB0aW1lciAqLwotCU1WX1dSSVRFKFRJTUVSX0NPVU5URVJfMF8zX0NPTlRST0wsIDB4Myk7Ci19Ci0KLXZvaWQgZ3Q2NDI0MF9pcnFfaW5pdCh2b2lkKQotewotI2lmIDAKLQlpbnQgaSwgajsKLQotCS8qIFJlc2V0IGlycSBoYW5kbGVycyBwb2ludGVycyB0byBOVUxMICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9DQVVTRV9SRUdTOyBpKyspIHsKLQkJZm9yIChqID0gMDsgaiA8IE1BWF9DQVVTRV9SRUdfV0lEVEg7IGorKykgewotCQkJaXJxX2hhbmRsZXJzW2ldW2pdLm5leHQgPSBOVUxMOwotCQkJaXJxX2hhbmRsZXJzW2ldW2pdLnN5bmMgPSAwOwotCQkJaXJxX2hhbmRsZXJzW2ldW2pdLnJvdXRpbmUgPSBOVUxMOwotCQkJaXJxX2hhbmRsZXJzW2ldW2pdLmRhdGEgPSBOVUxMOwotCQl9Ci0JfQotI2VuZGlmIC8qIDAgKi8KLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9pcnEuYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9pcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczNTQxZi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBSaWRnZVJ1biwgSW5jLgotICogQXV0aG9yOiBSaWRnZVJ1biwgSW5jLgotICogICBnbG9ubm9uQHJpZGdlcnVuLmNvbSwgc2tyYW56QHJpZGdlcnVuLmNvbSwgc3RldmVqQHJpZGdlcnVuLmNvbQotICoKLSAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBKdW4gU3VuLCBqc3VuQG12aXN0YS5jb20gb3IganN1bkBqdW5zdW4ubmV0Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDAxLCAwNSBSYWxmIEJhZWNobGUgKHJhbGZAbGludXgtbWlwcy5vcmcpCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaXJxX2NwdS5oPgotI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotYXNtbGlua2FnZSB2b2lkIHBsYXRfaXJxX2Rpc3BhdGNoKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHBlbmRpbmcgPSByZWFkX2MwX2NhdXNlKCkgJiByZWFkX2MwX3N0YXR1cygpOwotCi0JaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQMikKLQkJZG9fSVJRKDIpOwotCWVsc2UgaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQMykKLQkJZG9fSVJRKDMpOwotCWVsc2UgaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQNCkKLQkJZG9fSVJRKDQpOwotCWVsc2UgaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQNSkKLQkJZG9fSVJRKDUpOwotCWVsc2UgaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQNikKLQkJZG9fSVJRKDYpOwotCWVsc2UgaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQNykKLQkJZG9fSVJRKDcpOwotCWVsc2UgewotCQkvKgotCQkgKiBOb3cgbG9vayBhdCB0aGUgZXh0ZW5kZWQgaW50ZXJydXB0cwotCQkgKi8KLQkJcGVuZGluZyA9IChyZWFkX2MwX2NhdXNlKCkgJiAocmVhZF9jMF9pbnRjb250cm9sKCkgPDwgOCkpID4+IDE2OwotCi0JCWlmIChwZW5kaW5nICYgU1RBVFVTRl9JUDgpCi0JCQlkb19JUlEoOCk7Ci0JCWVsc2UgaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQOSkKLQkJCWRvX0lSUSg5KTsKLQkJZWxzZSBpZiAocGVuZGluZyAmIFNUQVRVU0ZfSVAxMCkKLQkJCWRvX0lSUSgxMCk7Ci0JCWVsc2UgaWYgKHBlbmRpbmcgJiBTVEFUVVNGX0lQMTEpCi0JCQlkb19JUlEoMTEpOwotCQllbHNlCi0JCQlzcHVyaW91c19pbnRlcnJ1cHQoKTsKLQl9Ci19Ci0KLWV4dGVybiB2b2lkIGd0NjQyNDBfaXJxX2luaXQodm9pZCk7Ci0KLXZvaWQgX19pbml0IGFyY2hfaW5pdF9pcnEodm9pZCkKLXsKLQkvKgotCSAqIENsZWFyIGFsbCBvZiB0aGUgaW50ZXJydXB0cyB3aGlsZSB3ZSBjaGFuZ2UgdGhlIGFibGUgYXJvdW5kIGEgYml0LgotCSAqIGludC1oYW5kbGVyIGlzIG5vdCBvbiBib290c3RyYXAKLQkgKi8KLQljbGVhcl9jMF9zdGF0dXMoU1QwX0lNKTsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCi0JbWlwc19jcHVfaXJxX2luaXQoKTsKLQlybTdrX2NwdV9pcnFfaW5pdCgpOwotCi0JZ3Q2NDI0MF9pcnFfaW5pdCgpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL29jZWxvdF9wbGQuaCBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9vY2Vsb3RfcGxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZTA1MzQuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL29jZWxvdF9wbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBPY2Vsb3QgQm9hcmQgUmVnaXN0ZXIgRGVmaW5pdGlvbnMKLSAqCi0gKiAoQykgMjAwMSBSZWQgSGF0LCBJbmMuCi0gKgotICogR1BMJ2QKLSAqLwotI2lmbmRlZiBfX01PTUVOQ09fT0NFTE9UX1BMRF9IX18KLSNkZWZpbmUgX19NT01FTkNPX09DRUxPVF9QTERfSF9fCi0KLSNkZWZpbmUgT0NFTE9UX0NTMF9BRERSICgweGZjMDAwMDAwKQotCi0jZGVmaW5lIE9DRUxPVF9SRUdfQk9BUkRSRVYgKDApCi0jZGVmaW5lIE9DRUxPVF9SRUdfUExEMV9JRCAoMSkKLSNkZWZpbmUgT0NFTE9UX1JFR19QTEQyX0lEICgyKQotI2RlZmluZSBPQ0VMT1RfUkVHX1JFU0VUX1NUQVRVUyAoMykKLSNkZWZpbmUgT0NFTE9UX1JFR19CT0FSRF9TVEFUVVMgKDQpCi0jZGVmaW5lIE9DRUxPVF9SRUdfQ1BDSV9JRCAoNSkKLSNkZWZpbmUgT0NFTE9UX1JFR19JMkNfQ1RSTCAoOCkKLSNkZWZpbmUgT0NFTE9UX1JFR19FRVBST01fTU9ERSAoOSkKLSNkZWZpbmUgT0NFTE9UX1JFR19JTlRNQVNLICgxMCkKLSNkZWZpbmUgT0NFTE9UX1JFR19JTlRTVEFUVVMgKDExKQotI2RlZmluZSBPQ0VMT1RfUkVHX0lOVFNFVCAoMTIpCi0jZGVmaW5lIE9DRUxPVF9SRUdfSU5UQ0xSICgxMykKLQotI2RlZmluZSBfX1BMRF9SRUdfVE9fQUREUihyZWcpICgodm9pZCAqKSBPQ0VMT1RfQ1MwX0FERFIgKyBPQ0VMT1RfUkVHXyMjcmVnKQotI2RlZmluZSBPQ0VMT1RfUExEX1dSSVRFKHgsIHJlZykgd3JpdGViKHgsIF9fUExEX1JFR19UT19BRERSKHJlZykpCi0jZGVmaW5lIE9DRUxPVF9QTERfUkVBRChyZWcpIHJlYWRiKF9fUExEX1JFR19UT19BRERSKHJlZykpCi0KLSNlbmRpZiAvKiBfX01PTUVOQ09fT0NFTE9UX1BMRF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9wcm9tLmMgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvcHJvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzZkMDgzLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9wcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDIgTW9tZW50dW0gQ29tcHV0ZXIgSW5jLgotICogQXV0aG9yOiBNYXR0aGV3IERoYXJtIDxtZGhhcm1AbW9tZW5jby5jb20+Ci0gKgotICogQmFzZWQgb24gT2NlbG90IExpbnV4IHBvcnQsIHdoaWNoIGlzCi0gKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjoganN1bkBtdmlzdGEuY29tIG9yIGpzdW5AanVuc3VuLm5ldAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLQotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLSNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLSNpbmNsdWRlIDxhc20vcG1vbi5oPgotI2luY2x1ZGUgPGFzbS9ndDY0MjQwLmg+Ci0KLSNpbmNsdWRlICJvY2Vsb3RfcGxkLmgiCi0KLXN0cnVjdCBjYWxsdmVjdG9ycyogZGVidWdfdmVjdG9yczsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWFydmVsbF9iYXNlOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYnVzX2Nsb2NrOwotCi0jaWZkZWYgQ09ORklHX0dBTElMRU9fR1Q2NDI0MF9FVEgKLWV4dGVybiB1bnNpZ25lZCBjaGFyIHByb21fbWFjX2FkZHJfYmFzZVs2XTsKLSNlbmRpZgotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIk1vbWVudHVtIE9jZWxvdCI7Ci19Ci0KLXZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQotewotCWludCBhcmdjID0gZndfYXJnMDsKLQljaGFyICoqYXJnID0gKGNoYXIgKiopIGZ3X2FyZzE7Ci0JY2hhciAqKmVudiA9IChjaGFyICoqKSBmd19hcmcyOwotCXN0cnVjdCBjYWxsdmVjdG9ycyAqY3YgPSAoc3RydWN0IGNhbGx2ZWN0b3JzICopIGZ3X2FyZzM7Ci0JaW50IGk7Ci0KLQkvKiBzYXZlIHRoZSBQUk9NIHZlY3RvcnMgZm9yIGRlYnVnZ2luZyB1c2UgKi8KLQlkZWJ1Z192ZWN0b3JzID0gY3Y7Ci0KLQkvKiBhcmdbMF0gaXMgImciLCB0aGUgcmVzdCBpcyBib290IHBhcmFtZXRlcnMgKi8KLQlhcmNzX2NtZGxpbmVbMF0gPSAnXDAnOwotCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKLQkJaWYgKHN0cmxlbihhcmNzX2NtZGxpbmUpICsgc3RybGVuKGFyZ1tpXSArIDEpCi0JCSAgICA+PSBzaXplb2YoYXJjc19jbWRsaW5lKSkKLQkJCWJyZWFrOwotCQlzdHJjYXQoYXJjc19jbWRsaW5lLCBhcmdbaV0pOwotCQlzdHJjYXQoYXJjc19jbWRsaW5lLCAiICIpOwotCX0KLQotCW1pcHNfbWFjaGdyb3VwID0gTUFDSF9HUk9VUF9NT01FTkNPOwotCW1pcHNfbWFjaHR5cGUgPSBNQUNIX01PTUVOQ09fT0NFTE9UX0c7Ci0KLSNpZmRlZiBDT05GSUdfR0FMSUxFT19HVDY0MjQwX0VUSAotCS8qIGdldCB0aGUgYmFzZSBNQUMgYWRkcmVzcyBmb3Igb24tYm9hcmQgZXRoZXJuZXQgcG9ydHMgKi8KLQltZW1jcHkocHJvbV9tYWNfYWRkcl9iYXNlLCAodm9pZCopMHhmYzgwN2NmMiwgNik7Ci0jZW5kaWYKLQotCXdoaWxlICgqZW52KSB7Ci0JCWlmIChzdHJuY21wKCJndGJhc2UiLCAqZW52LCBzdHJsZW4oImd0YmFzZSIpKSA9PSAwKSB7Ci0JCQltYXJ2ZWxsX2Jhc2UgPSBzaW1wbGVfc3RydG9sKCplbnYgKyBzdHJsZW4oImd0YmFzZT0iKSwKLQkJCQkJCQlOVUxMLCAxNik7Ci0JCX0KLQkJaWYgKHN0cm5jbXAoImJ1c2Nsb2NrIiwgKmVudiwgc3RybGVuKCJidXNjbG9jayIpKSA9PSAwKSB7Ci0JCQlidXNfY2xvY2sgPSBzaW1wbGVfc3RydG9sKCplbnYgKyBzdHJsZW4oImJ1c2Nsb2NrPSIpLAotCQkJCQkJCU5VTEwsIDEwKTsKLQkJfQotCQllbnYrKzsKLQl9Ci19Ci0KLXZvaWQgX19pbml0IHByb21fZnJlZV9wcm9tX21lbW9yeSh2b2lkKQotewotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL21vbWVudHVtL29jZWxvdF9nL3Jlc2V0LmMgYi9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvcmVzZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkNDk5YS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvcmVzZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NywgMjAwMSBSYWxmIEJhZWNobGUKLSAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBqc3VuQG12aXN0YS5jb20gb3IganN1bkBqdW5zdW4ubmV0Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi12b2lkIG1vbWVuY29fb2NlbG90X3Jlc3RhcnQoY2hhciAqY29tbWFuZCkKLXsKLQl2b2lkICpudnJhbSA9IGlvcmVtYXBfbm9jYWNoZSgweDJjODA3MDAwLCAweDEwMDApOwotCi0JaWYgKCFudnJhbSkgewotCQlwcmludGsoS0VSTl9OT1RJQ0UgImlvcmVtYXAgb2YgcmVzZXQgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQl3cml0ZWIoMHg4NCwgbnZyYW0gKyAweGZmNyk7IC8qIEFzayB0aGUgTlZSQU0vUlRDL3dhdGNoZG9nIGNoaXAgdG8KLQkJCQkJYXNzZXJ0IHJlc2V0IGluIDEvMTYgc2Vjb25kICovCi0JbWRlbGF5KDEwKygxMDAwLzE2KSk7Ci0JaW91bm1hcChudnJhbSk7Ci0JcHJpbnRrKEtFUk5fTk9USUNFICJXYXRjaGRvZyByZXNldCBmYWlsZWRcbiIpOwotfQotCi12b2lkIG1vbWVuY29fb2NlbG90X2hhbHQodm9pZCkKLXsKLQlwcmludGsoS0VSTl9OT1RJQ0UgIlxuKiogWW91IGNhbiBzYWZlbHkgdHVybiBvZmYgdGhlIHBvd2VyXG4iKTsKLQl3aGlsZSAoMSkKLQkJX19hc21fXygiLnNldFx0bWlwczNcblx0IgotCSAgICAgICAgICAgICAgICAid2FpdFxuXHQiCi0JCQkiLnNldFx0bWlwczAiKTsKLX0KLQotdm9pZCBtb21lbmNvX29jZWxvdF9wb3dlcl9vZmYodm9pZCkKLXsKLQltb21lbmNvX29jZWxvdF9oYWx0KCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW9tZW50dW0vb2NlbG90X2cvc2V0dXAuYyBiL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI2MzhhLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9tb21lbnR1bS9vY2Vsb3RfZy9zZXR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qCi0gKiBCUklFRiBNT0RVTEUgREVTQ1JJUFRJT04KLSAqIE1vbWVudHVtIENvbXB1dGVyIE9jZWxvdC1HIChDUDcwMDBHKSAtIGJvYXJkIGRlcGVuZGVudCBib290IHJvdXRpbmVzCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAyMDAxICBSYWxmIEJhZWNobGUKLSAqIENvcHlyaWdodCAoQykgMjAwMCBSaWRnZVJ1biwgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDAxIFJlZCBIYXQsIEluYy4KLSAqIENvcHlyaWdodCAoQykgMjAwMiBNb21lbnR1bSBDb21wdXRlcgotICoKLSAqIEF1dGhvcjogTWF0dGhldyBEaGFybSwgTW9tZW50dW0gQ29tcHV0ZXIKLSAqICAgbWRoYXJtQG1vbWVuY28uY29tCi0gKgotICogQXV0aG9yOiBSaWRnZVJ1biwgSW5jLgotICogICBnbG9ubm9uQHJpZGdlcnVuLmNvbSwgc2tyYW56QHJpZGdlcnVuLmNvbSwgc3RldmVqQHJpZGdlcnVuLmNvbQotICoKLSAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBqc3VuQG12aXN0YS5jb20gb3IganN1bkBqdW5zdW4ubmV0Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3dhcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcG0uaD4KLSNpbmNsdWRlIDxsaW51eC90aW1leC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQotI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vZ3Q2NDI0MC5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLQotI2luY2x1ZGUgIm9jZWxvdF9wbGQuaCIKLQotI2lmZGVmIENPTkZJR19HQUxJTEVPX0dUNjQyNDBfRVRICi1leHRlcm4gdW5zaWduZWQgY2hhciBwcm9tX21hY19hZGRyX2Jhc2VbNl07Ci0jZW5kaWYKLQotdW5zaWduZWQgbG9uZyBtYXJ2ZWxsX2Jhc2U7Ci0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgcmVib290aW5nIG9yIGhhbHRpbmcgdGhlIG1hY2hpbmUqLwotZXh0ZXJuIHZvaWQgbW9tZW5jb19vY2Vsb3RfcmVzdGFydChjaGFyICpjb21tYW5kKTsKLWV4dGVybiB2b2lkIG1vbWVuY29fb2NlbG90X2hhbHQodm9pZCk7Ci1leHRlcm4gdm9pZCBtb21lbmNvX29jZWxvdF9wb3dlcl9vZmYodm9pZCk7Ci0KLWV4dGVybiB2b2lkIGd0NjQyNDBfdGltZV9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgbW9tZW5jb19vY2Vsb3RfaXJxX3NldHVwKHZvaWQpOwotCi1zdGF0aWMgY2hhciByZXNldF9yZWFzb247Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIEVOVFJZTE8odW5zaWduZWQgbG9uZyBwYWRkcikKLXsKLQlyZXR1cm4gKChwYWRkciAmIFBBR0VfTUFTSykgfAotCSAgICAgICAoX1BBR0VfUFJFU0VOVCB8IF9fUkVBREFCTEUgfCBfX1dSSVRFQUJMRSB8IF9QQUdFX0dMT0JBTCB8Ci0JCV9DQUNIRV9VTkNBQ0hFRCkpID4+IDY7Ci19Ci0KLS8qIHNldHVwIGNvZGUgZm9yIGEgaGFuZG9mZiBmcm9tIGEgdmVyc2lvbiAyIFBNT04gMjAwMCBQUk9NICovCi12b2lkIFBNT05fdjJfc2V0dXAodm9pZCkKLXsKLQkvKiBBIHdpcmVkIFRMQiBlbnRyeSBmb3IgdGhlIEdUNjQyNDAgYW5kIHRoZSBzZXJpYWwgcG9ydC4gVGhlCi0JICAgR1Q2NDI0MCBpcyBnb2luZyB0byBiZSBoaXQgb24gZXZlcnkgSVJRIGFueXdheSAtIHRoZXJlJ3MKLQkgICBhYnNvbHV0ZWx5IG5vIHBvaW50IGluIGxldHRpbmcgaXQgYmUgYSByYW5kb20gVExCIGVudHJ5LCBhcwotCSAgIGl0J2xsIGp1c3QgY2F1c2UgbmVlZGxlc3MgY2h1cm5pbmcgb2YgdGhlIFRMQi4gQW5kIHdlIHVzZQotCSAgIHRoZSBvdGhlciBoYWxmIGZvciB0aGUgc2VyaWFsIHBvcnQsIHdoaWNoIGlzIGp1c3QgYSBQSVRBCi0JICAgb3RoZXJ3aXNlIDopCi0KLQkJRGV2aWNlCQkJUGh5c2ljYWwJVmlydHVhbAotCQlHVDY0MjQwIEludGVybmFsIFJlZ3MJMHhmNDAwMDAwMAkweGUwMDAwMDAwCi0JCVVBUlRzIChDUzIpCQkweGZkMDAwMDAwCTB4ZTAwMDEwMDAKLQkqLwotCWFkZF93aXJlZF9lbnRyeShFTlRSWUxPKDB4ZjQwMDAwMDApLCBFTlRSWUxPKDB4ZjQwMTAwMDApLAotCSAgICAgICAgICAgICAgICAweGY0MDAwMDAwLCBQTV82NEspOwotCWFkZF93aXJlZF9lbnRyeShFTlRSWUxPKDB4ZmQwMDAwMDApLCBFTlRSWUxPKDB4ZmQwMDEwMDApLAotCSAgICAgICAgICAgICAgICAweGZkMDAwMDAwLCBQTV80Syk7Ci0KLQkvKiBBbHNvIGEgdGVtcG9yYXJ5IGVudHJ5IHRvIGxldCB1cyB0YWxrIHRvIHRoZSBPY2Vsb3QgUExEIGFuZCBOVlJBTQotCSAgIGluIHRoZSBDU1swMTJdIHJlZ2lvbi4gV2UgY2FuJ3QgdXNlIGlvcmVtYXAoKSB5ZXQuIFRoZSBOVlJBTQotCSAgIGlzIGEgU1QgTTQ4VDM3WSwgd2hpY2ggaW5jbHVkZXMgTlZSQU0sIFJUQywgYW5kIFdhdGNoZG9nIGZ1bmN0aW9ucy4KLQotCQlPY2Vsb3QgUExEIChDUzApCTB4ZmMwMDAwMDAJMHhlMDAyMDAwMAotCQlOVlJBTSAoQ1MxKQkJMHhmYzgwMDAwMAkweGUwMDMwMDAwCi0JKi8KLQlhZGRfdGVtcG9yYXJ5X2VudHJ5KEVOVFJZTE8oMHhmYzAwMDAwMCksIEVOVFJZTE8oMHhmYzAxMDAwMCksCi0JICAgICAgICAgICAgICAgICAgICAweGZjMDAwMDAwLCBQTV82NEspOwotCWFkZF90ZW1wb3JhcnlfZW50cnkoRU5UUllMTygweGZjODAwMDAwKSwgRU5UUllMTygweGZjODEwMDAwKSwKLQkgICAgICAgICAgICAgICAgICAgIDB4ZmM4MDAwMDAsIFBNXzY0Syk7Ci0KLQltYXJ2ZWxsX2Jhc2UgPSAweGY0MDAwMDAwOwotfQotCi1leHRlcm4gaW50IHJtN2tfdGNhY2hlX2VuYWJsZWQ7Ci0KLS8qCi0gKiBUaGlzIHJ1bnMgaW4gS1NFRzEuIFNlZSB0aGUgdmVyYmlhZ2UgaW4gcm03ay5jOjpwcm9iZV9zY2FjaGUoKQotICovCi0jZGVmaW5lIFBhZ2VfSW52YWxpZGF0ZV9UIDB4MTYKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9sM2NhY2hlKHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlpbnQgcmVnaXN0ZXIgaTsKLQotCXByaW50aygiRW5hYmxpbmcgTDMgY2FjaGUuLi4iKTsKLQotCS8qIEVuYWJsZSB0aGUgTDMgY2FjaGUgaW4gdGhlIEdUNjQxMjBBJ3MgQ1BVIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQlNVl9XUklURSgwLCBNVl9SRUFEKDApIHwgKDE8PDE0KSk7Ci0KLQkvKiBFbmFibGUgdGhlIEwzIGNhY2hlIGluIHRoZSBDUFUgKi8KLQlzZXRfYzBfY29uZmlnKDE8PDEyIC8qIENPTkZfVEUgKi8pOwotCi0JLyogQ2xlYXIgdGhlIGNhY2hlICovCi0Jd3JpdGVfYzBfdGFnbG8oMCk7Ci0Jd3JpdGVfYzBfdGFnaGkoMCk7Ci0KLQlmb3IgKGk9MDsgaSA8IHNpemU7IGkrPSA0MDk2KSB7Ci0JCV9fYXNtX18gX192b2xhdGlsZV9fICgKLQkJCSIuc2V0IG5vcmVvcmRlclxuXHQiCi0JCQkiLnNldCBtaXBzM1xuXHQiCi0JCQkiY2FjaGUgJTEsICglMClcblx0IgotCQkJIi5zZXQgbWlwczBcblx0IgotCQkJIi5zZXQgcmVvcmRlciIKLQkJCToKLQkJCTogInIiIChLU0VHMEFERFIoaSkpLAotCQkJICAiaSIgKFBhZ2VfSW52YWxpZGF0ZV9UKSk7Ci0JfQotCi0JLyogTGV0IHRoZSBSTTcwMDAgTU0gY29kZSBrbm93IHRoYXQgdGhlIHRlcnRpYXJ5IGNhY2hlIGlzIGVuYWJsZWQgKi8KLQlybTdrX3RjYWNoZV9lbmFibGVkID0gMTsKLQotCXByaW50aygiRG9uZVxuIik7Ci19Ci0KLXZvaWQgX19pbml0IHBsYXRfdGltZXJfc2V0dXAoc3RydWN0IGlycWFjdGlvbiAqaXJxKQotewotfQotCi12b2lkIF9faW5pdCBwbGF0X21lbV9zZXR1cCh2b2lkKQotewotCXZvaWQgKCpsM2Z1bmMpKHVuc2lnbmVkIGxvbmcpID0gKHZvaWQgKikgS1NFRzFBRERSKHNldHVwX2wzY2FjaGUpOwotCXVuc2lnbmVkIGludCB0bXB3b3JkOwotCi0JYm9hcmRfdGltZV9pbml0ID0gZ3Q2NDI0MF90aW1lX2luaXQ7Ci0KLQlfbWFjaGluZV9yZXN0YXJ0ID0gbW9tZW5jb19vY2Vsb3RfcmVzdGFydDsKLQlfbWFjaGluZV9oYWx0ID0gbW9tZW5jb19vY2Vsb3RfaGFsdDsKLQlwbV9wb3dlcl9vZmYgPSBtb21lbmNvX29jZWxvdF9wb3dlcl9vZmY7Ci0KLQkvKgotCSAqIGluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKW9jZWxvdF9pbml0cmRfc3RhcnQ7Ci0JICogaW5pdHJkX2VuZCA9ICh1bnNpZ25lZCBsb25nKW9jZWxvdF9pbml0cmRfc3RhcnQgKyAodWxvbmcpb2NlbG90X2luaXRyZF9zaXplOwotCSAqIGluaXRyZF9iZWxvd19zdGFydF9vayA9IDE7Ci0JICovCi0KLQkvKiBkbyBoYW5kb2ZmIHJlY29uZmlndXJhdGlvbiAqLwotCVBNT05fdjJfc2V0dXAoKTsKLQotI2lmZGVmIENPTkZJR19HQUxJTEVPX0dUNjQyNDBfRVRICi0JLyogZ2V0IHRoZSBtYWMgYWRkciAqLwotCW1lbWNweShwcm9tX21hY19hZGRyX2Jhc2UsICh2b2lkKikweGZjODA3Y2YyLCA2KTsKLSNlbmRpZgotCi0JLyogVHVybiBvZmYgdGhlIEJpdC1FcnJvciBMRUQgKi8KLQlPQ0VMT1RfUExEX1dSSVRFKDB4ODAsIElOVENMUik7Ci0KLQl0bXB3b3JkID0gT0NFTE9UX1BMRF9SRUFEKEJPQVJEUkVWKTsKLQlpZiAodG1wd29yZCA8IDI2KQotCQlwcmludGsoIk1vbWVuY28gT2NlbG90LUc6IEJvYXJkIEFzc2VtYmx5IFJldi4gJWNcbiIsICdBJyt0bXB3b3JkKTsKLQllbHNlCi0JCXByaW50aygiTW9tZW5jbyBPY2Vsb3QtRzogQm9hcmQgQXNzZW1ibHkgUmV2aXNpb24gIzB4JXhcbiIsIHRtcHdvcmQpOwotCi0JdG1wd29yZCA9IE9DRUxPVF9QTERfUkVBRChQTEQxX0lEKTsKLQlwcmludGsoIlBMRCAxIElEOiAlZC4lZFxuIiwgdG1wd29yZD4+NCwgdG1wd29yZCYxNSk7Ci0JdG1wd29yZCA9IE9DRUxPVF9QTERfUkVBRChQTEQyX0lEKTsKLQlwcmludGsoIlBMRCAyIElEOiAlZC4lZFxuIiwgdG1wd29yZD4+NCwgdG1wd29yZCYxNSk7Ci0JdG1wd29yZCA9IE9DRUxPVF9QTERfUkVBRChSRVNFVF9TVEFUVVMpOwotCXByaW50aygiUmVzZXQgcmVhc29uOiAweCV4XG4iLCB0bXB3b3JkKTsKLQlyZXNldF9yZWFzb24gPSB0bXB3b3JkOwotCU9DRUxPVF9QTERfV1JJVEUoMHhmZiwgUkVTRVRfU1RBVFVTKTsKLQotCXRtcHdvcmQgPSBPQ0VMT1RfUExEX1JFQUQoQk9BUkRfU1RBVFVTKTsKLQlwcmludGsoIkJvYXJkIFN0YXR1cyByZWdpc3RlcjogMHglMDJ4XG4iLCB0bXB3b3JkKTsKLQlwcmludGsoIiAgLSBVc2VyIGp1bXBlcjogJXNcbiIsICh0bXB3b3JkICYgMHg4MCk/Imluc3RhbGxlZCI6ImFic2VudCIpOwotCXByaW50aygiICAtIEJvb3QgZmxhc2ggd3JpdGUganVtcGVyOiAlc1xuIiwgKHRtcHdvcmQmMHg0MCk/Imluc3RhbGxlZCI6ImFic2VudCIpOwotCXByaW50aygiICAtIFR1bGlwIFBIWSAlcyBjb25uZWN0ZWRcbiIsICh0bXB3b3JkJjB4MTApPyJpcyI6Im5vdCIpOwotCXByaW50aygiICAtIEwzIENhY2hlIHNpemU6ICVkIE1pQlxuIiwgKDE8PCgodG1wd29yZCYxMikgPj4gMikpJn4xKTsKLQlwcmludGsoIiAgLSBTRFJBTSBzaXplOiAlZCBNaUJcbiIsIDE8PCg2Kyh0bXB3b3JkJjMpKSk7Ci0KLQlpZiAodG1wd29yZCYxMikKLQkJbDNmdW5jKCgxPDwoKCh0bXB3b3JkJjEyKSA+PiAyKSsyMCkpKTsKLQotCXN3aXRjaCh0bXB3b3JkICYzKSB7Ci0JY2FzZSAzOgotCQkvKiA1MTJNaUIgLS0gdHdvIGJhbmtzIG9mIDI1Nk1pQiAqLwotCQlhZGRfbWVtb3J5X3JlZ2lvbiggIDB4MDw8MjAsIDB4MTAwPDwyMCwgQk9PVF9NRU1fUkFNKTsKLS8qCi0JCWFkZF9tZW1vcnlfcmVnaW9uKDB4MTAwPDwyMCwgMHgxMDA8PDIwLCBCT09UX01FTV9SQU0pOwotKi8KLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkvKiAyNTZNaUIgLS0gdHdvIGJhbmtzIG9mIDEyOE1pQiAqLwotCQlhZGRfbWVtb3J5X3JlZ2lvbiggMHgwPDwyMCwgMHg4MDw8MjAsIEJPT1RfTUVNX1JBTSk7Ci0JCWFkZF9tZW1vcnlfcmVnaW9uKDB4ODA8PDIwLCAweDgwPDwyMCwgQk9PVF9NRU1fUkFNKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQkvKiAxMjhNaUIgLS0gNjRNaUIgcGVyIGJhbmsgKi8KLQkJYWRkX21lbW9yeV9yZWdpb24oIDB4MDw8MjAsIDB4NDA8PDIwLCBCT09UX01FTV9SQU0pOwotCQlhZGRfbWVtb3J5X3JlZ2lvbigweDQwPDwyMCwgMHg0MDw8MjAsIEJPT1RfTUVNX1JBTSk7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQkJLyogNjRNaUIgKi8KLQkJYWRkX21lbW9yeV9yZWdpb24oIDB4MDw8MjAsIDB4NDA8PDIwLCBCT09UX01FTV9SQU0pOwotCQlicmVhazsKLQl9Ci0KLQkvKiBGSVhNRTogRml4IHVwIHRoZSBEaXNrT25DaGlwIG1hcHBpbmcgKi8KLQlNVl9XUklURSgweDQ2OCwgMHhmZWY3Myk7Ci19Ci0KLS8qIFRoaXMgbmVlZHMgdG8gYmUgb25lIG9mIHRoZSBmaXJzdCBpbml0Y2FsbHMsIGJlY2F1c2Ugbm8gSS9PIHBvcnQgYWNjZXNzCi0gICBjYW4gd29yayBiZWZvcmUgdGhpcyAqLwotCi1zdGF0aWMgaW50IGlvX2Jhc2VfaW9yZW1hcCh2b2lkKQotewotCS8qIHdlJ3JlIG1hcHBpbmcgUENJIGFjY2Vzc2VzIGZyb20gMHhjMDAwMDAwMCB0byAweGYwMDAwMDAwICovCi0JdW5zaWduZWQgbG9uZyBpb19yZW1hcF9yYW5nZTsKLQotCWlvX3JlbWFwX3JhbmdlID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAoMHhjMDAwMDAwMCwgMHgzMDAwMDAwMCk7Ci0JaWYgKCFpb19yZW1hcF9yYW5nZSkKLQkJcGFuaWMoIkNvdWxkIG5vdCBpb3JlbWFwIEkvTyBwb3J0IHJhbmdlIik7Ci0KLQlzZXRfaW9fcG9ydF9iYXNlKGlvX3JlbWFwX3JhbmdlIC0gMHhjMDAwMDAwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotbW9kdWxlX2luaXQoaW9fYmFzZV9pb3JlbWFwKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCmluZGV4IGRmNDg3YzAuLmFiYTNkYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQpAQCAtMzAsMTEgKzMwLDkgQEAKIG9iai0kKENPTkZJR19TT0NfQVUxNTUwKQkrPSBmaXh1cC1hdTEwMDAubyBvcHMtYXUxMDAwLm8KIG9iai0kKENPTkZJR19TT0NfUE5YODU1MCkJKz0gZml4dXAtcG54ODU1MC5vIG9wcy1wbng4NTUwLm8KIG9iai0kKENPTkZJR19NSVBTX01BTFRBKQkrPSBmaXh1cC1tYWx0YS5vCi1vYmotJChDT05GSUdfTU9NRU5DT19KQUdVQVJfQVRYKSs9IGZpeHVwLWphZ3Vhci5vCiBvYmotJChDT05GSUdfTU9NRU5DT19PQ0VMT1QpCSs9IGZpeHVwLW9jZWxvdC5vIHBjaS1vY2Vsb3Qubwogb2JqLSQoQ09ORklHX01PTUVOQ09fT0NFTE9UXzMpCSs9IGZpeHVwLW9jZWxvdDMubwogb2JqLSQoQ09ORklHX01PTUVOQ09fT0NFTE9UX0MpCSs9IGZpeHVwLW9jZWxvdC1jLm8gcGNpLW9jZWxvdC1jLm8KLW9iai0kKENPTkZJR19NT01FTkNPX09DRUxPVF9HKQkrPSBmaXh1cC1vY2Vsb3QtZy5vIHBjaS1vY2Vsb3QtZy5vCiBvYmotJChDT05GSUdfUE1DX1lPU0VNSVRFKQkrPSBmaXh1cC15b3NlbWl0ZS5vIG9wcy10aXRhbi5vIG9wcy10aXRhbi1odC5vIFwKIAkJCQkgICBwY2kteW9zZW1pdGUubwogb2JqLSQoQ09ORklHX1NHSV9JUDI3KQkJKz0gb3BzLWJyaWRnZS5vIHBjaS1pcDI3Lm8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvZml4dXAtY29iYWx0LmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWNvYmFsdC5jCmluZGV4IDdkNWY2YmIuLmQ1N2ZmZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvZml4dXAtY29iYWx0LmMKKysrIGIvYXJjaC9taXBzL3BjaS9maXh1cC1jb2JhbHQuYwpAQCAtMTcsOSArMTcsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9ndDY0MTIwLmg+CiAKLSNpbmNsdWRlIDxhc20vbWFjaC1jb2JhbHQvY29iYWx0Lmg+Ci0KLWV4dGVybiBpbnQgY29iYWx0X2JvYXJkX2lkOworI2luY2x1ZGUgPGNvYmFsdC5oPgogCiBzdGF0aWMgdm9pZCBxdWJlX3JhcV9nYWxpbGVvX2Vhcmx5X2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0xMTUsNiArMTEzLDI3IEBACiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCBQQ0lfREVWSUNFX0lEX01BUlZFTExfR1Q2NDExMSwKIAkgcXViZV9yYXFfZ2FsaWxlb19maXh1cCk7CiAKK2ludCBjb2JhbHRfYm9hcmRfaWQ7CisKK3N0YXRpYyB2b2lkIHF1YmVfcmFxX3ZpYV9ib2FyZF9pZF9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXU4IGlkOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFZJQV9DT0JBTFRfQlJEX0lEX1JFRywgJmlkKTsKKwlpZiAocmV0dmFsKSB7CisJCXBhbmljKCJDYW5ub3QgcmVhZCBib2FyZCBJRCIpOworCQlyZXR1cm47CisJfQorCisJY29iYWx0X2JvYXJkX2lkID0gVklBX0NPQkFMVF9CUkRfUkVHX3RvX0lEKGlkKTsKKworCXByaW50ayhLRVJOX0lORk8gIkNvYmFsdCBib2FyZCBJRDogJWRcbiIsIGNvYmFsdF9ib2FyZF9pZCk7Cit9CisKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzAsCisJIHF1YmVfcmFxX3ZpYV9ib2FyZF9pZF9maXh1cCk7CisKIHN0YXRpYyBjaGFyIGlycV90YWJfcXViZTFbXSBfX2luaXRkYXRhID0gewogICBbQ09CQUxUX1BDSUNPTkZfQ1BVXSAgICAgPSAwLAogICBbQ09CQUxUX1BDSUNPTkZfRVRIMF0gICAgPSBDT0JBTFRfUVVCRTFfRVRIMF9JUlEsCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWphZ3Vhci5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1qYWd1YXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1ZTFkNC4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWphZ3Vhci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIE1hcnZlbGwgTVY2NDM0MCBpbnRlcnJ1cHQgZml4dXAgY29kZS4KLSAqCi0gKiBNYXJ2ZWxsIHdhbnRzIGFuIE5EQSBmb3IgdGhlaXIgZG9jcyBzbyB0aGlzIHdhcyB3cml0dGVuIHdpdGhvdXQKLSAqIGRvY3VtZW50YXRpb24uICBZb3UndmUgYmVlbiB3YXJuZWQuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgotCi0vKgotICogV0FSTklORzogRXhhbXBsZSBvZiBob3cgX05PVF8gdG8gZG8gaXQuCi0gKi8KLWludCBfX2luaXQgcGNpYmlvc19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlpbnQgYnVzID0gZGV2LT5idXMtPm51bWJlcjsKLQotCWlmIChidXMgPT0gMCAmJiBzbG90ID09IDEpCi0JCXJldHVybiAzOwkvKiBQQ0ktWCBBICovCi0JaWYgKGJ1cyA9PSAwICYmIHNsb3QgPT0gMikKLQkJcmV0dXJuIDQ7CS8qIFBDSS1YIEIgKi8KLQlpZiAoYnVzID09IDEgJiYgc2xvdCA9PSAxKQotCQlyZXR1cm4gNTsJLyogUENJIEEgKi8KLQlpZiAoYnVzID09IDEgJiYgc2xvdCA9PSAyKQotCQlyZXR1cm4gNjsJLyogUENJIEIgKi8KLQotcmV0dXJuIDA7Ci0JcGFuaWMoIldob29vcHMgaW4gcGNpYmlvc19tYXBfaXJxIik7Ci19Ci0KLS8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KLWludCBwY2liaW9zX3BsYXRfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvZml4dXAtb2NlbG90LWcuYyBiL2FyY2gvbWlwcy9wY2kvZml4dXAtb2NlbG90LWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhNjUyZS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLW9jZWxvdC1nLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQotICovCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLWludCBfX2luaXQgcGNpYmlvc19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlpbnQgYnVzID0gZGV2LT5idXMtPm51bWJlcjsKLQotCWlmIChidXMgPT0gMCAmJiBzbG90ID09IDEpCS8qIEludGVsIDgyNTQzIEdpZ2FiaXQgTUFDICovCi0JCXJldHVybiAyOwkJLyogaXJxX25yIGlzIDIgZm9yIElOVDAgKi8KLQotCWlmIChidXMgPT0gMCAmJiBzbG90ID09IDIpCS8qIEludGVsIDgyNTQzIEdpZ2FiaXQgTUFDICovCi0JCXJldHVybiAzOwkJLyogaXJxX25yIGlzIDMgZm9yIElOVDEgKi8KLQotCWlmIChidXMgPT0gMSAmJiBzbG90ID09IDMpCS8qIEludGVsIDIxNTU1IGJyaWRnZSAqLwotCQlyZXR1cm4gNTsJCS8qIGlycV9uciBpcyA4IGZvciBJTlQ2ICovCi0KLQlpZiAoYnVzID09IDEgJiYgc2xvdCA9PSA0KQkvKiBQTUMgU2xvdCAqLwotCQlyZXR1cm4gOTsJCS8qIGlycV9uciBpcyA5IGZvciBJTlQ3ICovCi0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KLWludCBwY2liaW9zX3BsYXRfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLW9jZWxvdC1nLmMgYi9hcmNoL21pcHMvcGNpL3BjaS1vY2Vsb3QtZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTM0MzAxLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLW9jZWxvdC1nLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IGJ5IFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKLSAqCi0gKiBUaGlzIGRvZXNuJ3QgcmVhbGx5IGZseSAtIGJ1dCBJIGRvbid0IGhhdmUgYSBHVDY0MjQwIHN5c3RlbSBmb3IgdGVzdGluZy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9ndDY0MjQwLmg+Ci0KLS8qCi0gKiBXZSBhc3N1bWUgdGhlc2UgYWRkcmVzcyByYW5nZXMgaGF2ZSBiZWVuIHByb2dyYW1tZWQgaW50byB0aGUgR1QtNjQyNDAgYnkKLSAqIHRoZSBmaXJtd2FyZS4gIFBNT04gaW4gY2FzZSBvZiB0aGUgT2NlbG90IEcgZG9lcyB0aGF0LiAgTm90ZSB0aGUgc2l6ZSBvZgotICogdGhlIEkvTyByYW5nZSBpcyBjb21wbGV0bHkgc3R1cGlkOyBJL08gbWFwcGluZ3MgYXJlIGxpbWl0ZWQgdG8gYXQgbW9zdAotICogMjU2IGJ5dGVzIGJ5IHRoZSBQQ0kgc3BlYyBhbmQgZGVwcmVjYXRlZDsgYW5kIGp1c3QgdG8gbWFrZSB0aGluZ3Mgd29yc2UKLSAqIGFwcGFyZW50bHkgbWFueSBkZXZpY2VzIGRvbid0IGRlY29kZSBtb3JlIHRoYW4gNjRrIG9mIEkvTyBzcGFjZS4KLSAqLwotCi0jZGVmaW5lIGd0X2lvX3NpemUJMHgyMDAwMDAwMFVMCi0jZGVmaW5lIGd0X2lvX2Jhc2UJMHhlMDAwMDAwMFVMCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ3RfcGNpX21lbTBfcmVzb3VyY2UgPSB7Ci0JLm5hbWUJPSAiTVY2NDI0MCBQQ0kwIE1FTSIsCi0JLnN0YXJ0CT0gMHhjMDAwMDAwMFVMLAotCS5lbmQJPSAweGNmZmZmZmZmVUwsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ3RfcGNpX2lvX21lbTBfcmVzb3VyY2UgPSB7Ci0JLm5hbWUJPSAiTVY2NDI0MCBQQ0kwIElPIE1FTSIsCi0JLnN0YXJ0CT0gMHhlMDAwMDAwMFVMLAotCS5lbmQJPSAweGVmZmZmZmZmVUwsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9JTwotfTsKLQotc3RhdGljIHN0cnVjdCBtdl9wY2lfY29udHJvbGxlciBndF9idXMwX2NvbnRyb2xsZXIgPSB7Ci0JLnBjaWMgPSB7Ci0JCS5wY2lfb3BzCT0gJm12X3BjaV9vcHMsCi0JCS5tZW1fcmVzb3VyY2UJPSAmZ3RfcGNpX21lbTBfcmVzb3VyY2UsCi0JCS5tZW1fb2Zmc2V0CT0gMHhjMDAwMDAwMFVMLAotCQkuaW9fcmVzb3VyY2UJPSAmZ3RfcGNpX2lvX21lbTBfcmVzb3VyY2UsCi0JCS5pb19vZmZzZXQJPSAweDAwMDAwMDAwVUwKLQl9LAotCS5jb25maWdfYWRkcgk9IFBDSV8wQ09ORklHVVJBVElPTl9BRERSRVNTLAotCS5jb25maWdfdnJlZwk9IFBDSV8wQ09ORklHVVJBVElPTl9EQVRBX1ZJUlRVQUxfUkVHSVNURVIsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGd0X3BjaV9tZW0xX3Jlc291cmNlID0gewotCS5uYW1lCT0gIk1WNjQyNDAgUENJMSBNRU0iLAotCS5zdGFydAk9IDB4ZDAwMDAwMDBVTCwKLQkuZW5kCT0gMHhkZmZmZmZmZlVMLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGd0X3BjaV9pb19tZW0xX3Jlc291cmNlID0gewotCS5uYW1lCT0gIk1WNjQyNDAgUENJMSBJTyBNRU0iLAotCS5zdGFydAk9IDB4ZjAwMDAwMDBVTCwKLQkuZW5kCT0gMHhmZmZmZmZmZlVMLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXZfcGNpX2NvbnRyb2xsZXIgZ3RfYnVzMV9jb250cm9sbGVyID0gewotCS5wY2ljID0gewotCQkucGNpX29wcwk9ICZtdl9wY2lfb3BzLAotCQkubWVtX3Jlc291cmNlCT0gJmd0X3BjaV9tZW0xX3Jlc291cmNlLAotCQkubWVtX29mZnNldAk9IDB4ZDAwMDAwMDBVTCwKLQkJLmlvX3Jlc291cmNlCT0gJmd0X3BjaV9pb19tZW0xX3Jlc291cmNlLAotCQkuaW9fb2Zmc2V0CT0gMHgxMDAwMDAwMFVMCi0JfSwKLQkuY29uZmlnX2FkZHIJPSBQQ0lfMUNPTkZJR1VSQVRJT05fQUREUkVTUywKLQkuY29uZmlnX3ZyZWcJPSBQQ0lfMUNPTkZJR1VSQVRJT05fREFUQV9WSVJUVUFMX1JFR0lTVEVSLAotfTsKLQotc3RhdGljIF9faW5pdCBpbnQgX19pbml0IG9jZWxvdF9nX3BjaV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBpb192X2Jhc2U7Ci0KLQlpZiAoZ3RfaW9fc2l6ZSkgewotCQlpb192X2Jhc2UgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChndF9pb19iYXNlLCBndF9pb19zaXplKTsKLQkJaWYgKCFpb192X2Jhc2UpCi0JCQlwYW5pYygiQ291bGQgbm90IGlvcmVtYXAgSS9PIHBvcnQgcmFuZ2UiKTsKLQotCQlzZXRfaW9fcG9ydF9iYXNlKGlvX3ZfYmFzZSk7Ci0JfQotCi0JcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoJmd0X2J1czBfY29udHJvbGxlci5wY2ljKTsKLQlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcigmZ3RfYnVzMV9jb250cm9sbGVyLnBjaWMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWFyY2hfaW5pdGNhbGwob2NlbG90X2dfcGNpX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDIyL01ha2VmaWxlIGIvYXJjaC9taXBzL3NnaS1pcDIyL01ha2VmaWxlCmluZGV4IGI2ZDY0OTIuLjFmYjNlMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyMi9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvc2dpLWlwMjIvTWFrZWZpbGUKQEAgLTQsNiArNCw2IEBACiAjCiAKIG9iai15CSs9IGlwMjItbWMubyBpcDIyLWhwYy5vIGlwMjItaW50Lm8gaXAyMi1iZXJyLm8gXAotCSAgIGlwMjItdGltZS5vIGlwMjItbnZyYW0ubyBpcDIyLXJlc2V0Lm8gaXAyMi1zZXR1cC5vCisJICAgaXAyMi10aW1lLm8gaXAyMi1udnJhbS5vIGlwMjItcGxhdGZvcm0ubyBpcDIyLXJlc2V0Lm8gaXAyMi1zZXR1cC5vCiAKIG9iai0kKENPTkZJR19FSVNBKQkrPSBpcDIyLWVpc2EubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NnaS1pcDIyL2lwMjItcGxhdGZvcm0uYyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXBsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiNjA4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyMi9pcDIyLXBsYXRmb3JtLmMKQEAgLTAsMCArMSwxNzcgQEAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9wYWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3NnaS9pcDIyLmg+CisjaW5jbHVkZSA8YXNtL3NnaS9ocGMzLmg+CisjaW5jbHVkZSA8YXNtL3NnaS9tYy5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvc2VlcS5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvd2QuaD4KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzZ2l3ZDkzXzBfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZQk9ICJldGgwIGlycSIsCisJCS5zdGFydAk9IFNHSV9XRDkzXzBfSVJRLAorCQkuZW5kCT0gU0dJX1dEOTNfMF9JUlEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzZ2l3ZDkzX3BsYXRmb3JtX2RhdGEgc2dpd2Q5M18wX3BkID0geworCS51bml0CT0gMCwKKwkuaXJxCT0gU0dJX1dEOTNfMF9JUlEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzZ2l3ZDkzXzBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzZ2l3ZDkzIiwKKwkuaWQJCT0gMCwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoc2dpd2Q5M18wX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gc2dpd2Q5M18wX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZzZ2l3ZDkzXzBfcGQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2dpd2Q5M18xX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUJPSAiZXRoMCBpcnEiLAorCQkuc3RhcnQJPSBTR0lfV0Q5M18xX0lSUSwKKwkJLmVuZAk9IFNHSV9XRDkzXzFfSVJRLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2dpd2Q5M19wbGF0Zm9ybV9kYXRhIHNnaXdkOTNfMV9wZCA9IHsKKwkudW5pdAk9IDEsCisJLmlycQk9IFNHSV9XRDkzXzFfSVJRLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2dpd2Q5M18xX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2dpd2Q5MyIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNnaXdkOTNfMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNnaXdkOTNfMV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmc2dpd2Q5M18xX3BkLAorCX0sCit9OworCisvKgorICogQ3JlYXRlIGEgcGxhdGZvcm0gZGV2aWNlIGZvciB0aGUgR1BJIHBvcnQgdGhhdCByZWNlaXZlcyB0aGUKKyAqIGltYWdlIGRhdGEgZnJvbSB0aGUgZW1iZWRkZWQgY2FtZXJhLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzZ2l3ZDkzX2RldmluaXQodm9pZCkKK3sKKwlpbnQgcmVzOworCisJc2dpd2Q5M18wX3BkLmhyZWdzCT0gJmhwYzNjMC0+c2NzaV9jaGFuMDsKKwlzZ2l3ZDkzXzBfcGQud2RyZWdzCT0gKHVuc2lnbmVkIGNoYXIgKikgaHBjM2MwLT5zY3NpMF9leHQ7CisKKwlyZXMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnNnaXdkOTNfMF9kZXZpY2UpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlpZiAoIWlwMjJfaXNfZnVsbGhvdXNlKCkpCisJCXJldHVybiAwOworCisJc2dpd2Q5M18xX3BkLmhyZWdzCT0gJmhwYzNjMC0+c2NzaV9jaGFuMTsKKwlzZ2l3ZDkzXzFfcGQud2RyZWdzCT0gKHVuc2lnbmVkIGNoYXIgKikgaHBjM2MwLT5zY3NpMV9leHQ7CisKKwlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZzZ2l3ZDkzXzFfZGV2aWNlKTsKK30KKworZGV2aWNlX2luaXRjYWxsKHNnaXdkOTNfZGV2aW5pdCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2dpc2VlcV8wX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUJPSAiZXRoMCBpcnEiLAorCQkuc3RhcnQJPSBTR0lfRU5FVF9JUlEsCisJCS5lbmQJPSBTR0lfRU5FVF9JUlEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBzZ2lzZWVxX3BsYXRmb3JtX2RhdGEgZXRoMF9wZDsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXRoMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNnaXNlZXEiLAorCS5pZAkJPSAwLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShzZ2lzZWVxXzBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBzZ2lzZWVxXzBfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmV0aDBfcGQsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2dpc2VlcV8xX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUJPSAiZXRoMSBpcnEiLAorCQkuc3RhcnQJPSBTR0lfR0lPXzBfSVJRLAorCQkuZW5kCT0gU0dJX0dJT18wX0lSUSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHNnaXNlZXFfcGxhdGZvcm1fZGF0YSBldGgxX3BkOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBldGgxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2dpc2VlcSIsCisJLmlkCQk9IDEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNnaXNlZXFfMV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNnaXNlZXFfMV9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZXRoMV9wZCwKKwl9LAorfTsKKworLyoKKyAqIENyZWF0ZSBhIHBsYXRmb3JtIGRldmljZSBmb3IgdGhlIEdQSSBwb3J0IHRoYXQgcmVjZWl2ZXMgdGhlCisgKiBpbWFnZSBkYXRhIGZyb20gdGhlIGVtYmVkZGVkIGNhbWVyYS4KKyAqLworc3RhdGljIGludCBfX2luaXQgc2dpc2VlcV9kZXZpbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgcmVzLCBpOworCisJZXRoMF9wZC5ocGMgPSBocGMzYzA7CisJZXRoMF9wZC5pcnEgPSBTR0lfRU5FVF9JUlE7CisjZGVmaW5lIEVBRERSX05WT0ZTICAgICAyNTAKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXVuc2lnbmVkIHNob3J0IHRtcCA9IGlwMjJfbnZyYW1fcmVhZChFQUREUl9OVk9GUyAvIDIgKyBpKTsKKworCQlldGgwX3BkLm1hY1syICogaV0gICAgID0gdG1wID4+IDg7CisJCWV0aDBfcGQubWFjWzIgKiBpICsgMV0gPSB0bXAgJiAweGZmOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZXRoMF9kZXZpY2UpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwkvKiBTZWNvbmQgSFBDIGlzIG1pc3Npbmc/ICovCisJaWYgKGlwMjJfaXNfZnVsbGhvdXNlKCkgfHwKKwkgICAgIWdldF9kYmUodG1wLCAodW5zaWduZWQgaW50ICopJmhwYzNjMS0+cGJkbWFbMV0pKQorCQlyZXR1cm4gMDsKKworCXNnaW1jLT5naW9wYXIgfD0gU0dJTUNfR0lPUEFSX01BU1RFUkVYUDEgfCBTR0lNQ19HSU9QQVJfRVhQMTY0IHwKKwkgICAgICAgICAgICAgICAgIFNHSU1DX0dJT1BBUl9IUEMyNjQ7CisJaHBjM2MxLT5wYnVzX3Bpb2NmZ1swXVswXSA9IDB4M2ZmZmY7CisJLyogaW50ZXJydXB0L2NvbmZpZyByZWdpc3RlciBvbiBDaGFsbGVuZ2UgUyBNZXp6IGJvYXJkICovCisJaHBjM2MxLT5wYnVzX2V4dHJlZ3NbMF1bMF0gPSAweDMwOworCisJZXRoMV9wZC5ocGMgPSBocGMzYzE7CisJZXRoMV9wZC5pcnEgPSBTR0lfR0lPXzBfSVJROworI2RlZmluZSBFQUREUl9OVk9GUyAgICAgMjUwCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl1bnNpZ25lZCBzaG9ydCB0bXAgPSBpcDIyX2VlcHJvbV9yZWFkKCZocGMzYzEtPmVlcHJvbSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQUREUl9OVk9GUyAvIDIgKyBpKTsKKworCQlldGgxX3BkLm1hY1syICogaV0gICAgID0gdG1wID4+IDg7CisJCWV0aDFfcGQubWFjWzIgKiBpICsgMV0gPSB0bXAgJiAweGZmOworCX0KKworCXJldHVybiBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmV0aDFfZGV2aWNlKTsKK30KKworZGV2aWNlX2luaXRjYWxsKHNnaXNlZXFfZGV2aW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IGNjYzU0MTAuLjU2ZDNjMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC0zODksNiArMzg5LDkgQEAKIAlib29sCiAJZGVwZW5kcyBvbiA0eHggfHwgOHh4IHx8IEUyMDAKIAlkZWZhdWx0IHkKKworY29uZmlnIENPTkZJR19DSEVDS19DQUNIRV9DT0hFUkVOQ1kKKwlib29sCiBlbmRtZW51CiAKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgpAQCAtNDUxLDcgKzQ1NCw3IEBACiAKIGNvbmZpZyBLRVhFQwogCWJvb2wgImtleGVjIHN5c3RlbSBjYWxsIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiAoUFBDX1BSUE1DMjgwMCB8fCBQUENfTVVMVElQTEFURk9STSkgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAga2V4ZWMgaXMgYSBzeXN0ZW0gY2FsbCB0aGF0IGltcGxlbWVudHMgdGhlIGFiaWxpdHkgdG8gc2h1dGRvd24geW91cgogCSAgY3VycmVudCBrZXJuZWwsIGFuZCB0byBzdGFydCBhbm90aGVyIGtlcm5lbC4gIEl0IGlzIGxpa2UgYSByZWJvb3QKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQppbmRleCA4MWE1MzFkLi5kNjAxNGE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogQ1BQRkxBR1Nfdm1saW51eC5sZHMJOj0gLVVwb3dlcnBjCiAKLUJPT1RfVEFSR0VUUyA9IHpJbWFnZSB6SW1hZ2UuaW5pdHJkIHVJbWFnZQorQk9PVF9UQVJHRVRTID0gekltYWdlIHpJbWFnZS5pbml0cmQgekltYWdlLmR0cyB6SW1hZ2UuZHRzX2luaXRyZCB1SW1hZ2UKIAogUEhPTlkgKz0gJChCT09UX1RBUkdFVFMpCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggNWMzODRhYS4uZDRmOWZlZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTQzLDkgKzQzLDkgQEAKIHNyYy13bGliIDo9IHN0cmluZy5TIGNydDAuUyBzdGRpby5jIG1haW4uYyBmbGF0ZGV2dHJlZS5jIGZsYXRkZXZ0cmVlX21pc2MuYyBcCiAJCW5zMTY1NTAuYyBzZXJpYWwuYyBzaW1wbGVfYWxsb2MuYyBkaXY2NC5TIHV0aWwuUyBcCiAJCWd1bnppcF91dGlsLmMgZWxmX3V0aWwuYyAkKHpsaWIpIGRldnRyZWUuYyBcCi0JCTQ0eC5jIGVib255LmMKKwkJNDR4LmMgZWJvbnkuYyBtdjY0eDYwLmMgbXBzYy5jIG12NjR4NjBfaTJjLmMKIHNyYy1wbGF0IDo9IG9mLmMgY3Vib290LTgzeHguYyBjdWJvb3QtODV4eC5jIGhvbGx5LmMgXAotCQljdWJvb3QtZWJvbnkuYyB0cmVlYm9vdC1lYm9ueS5jCisJCWN1Ym9vdC1lYm9ueS5jIHRyZWVib290LWVib255LmMgcHJwbWMyODAwLmMKIHNyYy1ib290IDo9ICQoc3JjLXdsaWIpICQoc3JjLXBsYXQpIGVtcHR5LmMKIAogc3JjLWJvb3QgOj0gJChhZGRwcmVmaXggJChvYmopLywgJChzcmMtYm9vdCkpCkBAIC0xMzIsNiArMTMyLDcgQEAKIGltYWdlLSQoQ09ORklHX1BQQ19FRklLQSkJCSs9IHpJbWFnZS5jaHJwCiBpbWFnZS0kKENPTkZJR19QUENfUE1BQykJCSs9IHpJbWFnZS5wbWFjCiBpbWFnZS0kKENPTkZJR19QUENfSE9MTFkpCQkrPSB6SW1hZ2UuaG9sbHktZWxmCitpbWFnZS0kKENPTkZJR19QUENfUFJQTUMyODAwKQkJKz0gekltYWdlLnBycG1jMjgwMAogaW1hZ2UtJChDT05GSUdfREVGQVVMVF9VSU1BR0UpCQkrPSB1SW1hZ2UKIAogaWZuZXEgKCQoQ09ORklHX0RFVklDRV9UUkVFKSwiIikKQEAgLTE1NCw5ICsxNTUsMjcgQEAKIAogJChhZGRwcmVmaXggJChvYmopLywgJChpbml0cmQteSkpOiAkKG9iaikvcmFtZGlzay5pbWFnZS5negogCitkdHMtICA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHMlLCAkKGltYWdlLW4pICQoaW1hZ2UtKSkKK2R0cy15IDo9ICQocGF0c3Vic3QgekltYWdlJSwgekltYWdlLmR0cyUsICQoaW1hZ2UteSkpCitkdHMteSA6PSAkKGZpbHRlci1vdXQgJChpbWFnZS15KSwgJChkdHMteSkpCit0YXJnZXRzCSs9ICQoaW1hZ2UteSkgJChkdHMteSkKKworZHRzX2luaXRyZC0gIDo9ICQocGF0c3Vic3QgekltYWdlJSwgekltYWdlLmR0c19pbml0cmQlLCAkKGltYWdlLW4pICQoaW1hZ2UtKSkKK2R0c19pbml0cmQteSA6PSAkKHBhdHN1YnN0IHpJbWFnZSUsIHpJbWFnZS5kdHNfaW5pdHJkJSwgJChpbWFnZS15KSkKK2R0c19pbml0cmQteSA6PSAkKGZpbHRlci1vdXQgJChpbWFnZS15KSwgJChkdHNfaW5pdHJkLXkpKQordGFyZ2V0cwkrPSAkKGltYWdlLXkpICQoZHRzX2luaXRyZC15KQorCiskKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0c19pbml0cmQteSkpOiAkKG9iaikvcmFtZGlzay5pbWFnZS5negorCiAjIERvbid0IHB1dCB0aGUgcmFtZGlzayBvbiB0aGUgcGF0dGVybiBydWxlOyB3aGVuIGl0cyBtaXNzaW5nIG1ha2Ugd2lsbCB0cnkKICMgdGhlIHBhdHRlcm4gcnVsZSB3aXRoIGxlc3MgZGVwZW5kZW5jaWVzIHRoYXQgYWxzbyBtYXRjaGVzIChldmVuIHdpdGggdGhlCiAjIGhhcmQgZGVwZW5kZW5jeSBsaXN0ZWQpLgorJChvYmopL3pJbWFnZS5kdHNfaW5pdHJkLiU6IHZtbGludXggJCh3cmFwcGVyYml0cykgJChkdHMpICQob2JqKS9yYW1kaXNrLmltYWdlLmd6CisJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwkKGR0cyksLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQorCiskKG9iaikvekltYWdlLmR0cy4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpICQoZHRzKQorCSQoY2FsbCBpZl9jaGFuZ2VkLHdyYXAsJCosJChkdHMpKQorCiAkKG9iaikvekltYWdlLmluaXRyZC4lOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCwkKiwsLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQogCkBAIC0xOTUsMTMgKzIxNCwxOCBAQAogCUBybSAtZiAkQDsgbG4gJDwgJEAKICQob2JqKS96SW1hZ2UuaW5pdHJkOgkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGluaXRyZC15KSkKIAlAcm0gLWYgJEA7IGxuICQ8ICRACiskKG9iaikvekltYWdlLmR0czoJJChhZGRwcmVmaXggJChvYmopLywgJChkdHMteSkpCisJQHJtIC1mICRAOyBsbiAkPCAkQAorJChvYmopL3pJbWFnZS5kdHNfaW5pdHJkOgkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0c19pbml0cmQteSkpCisJQHJtIC1mICRAOyBsbiAkPCAkQAorCiAKIGluc3RhbGw6ICQoQ09ORklHVVJFKSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQogCXNoIC14ICQoc3JjdHJlZSkvJChzcmMpL2luc3RhbGwuc2ggIiQoS0VSTkVMUkVMRUFTRSkiIHZtbGludXggU3lzdGVtLm1hcCAiJChJTlNUQUxMX1BBVEgpIiAkPAogCiAjIGFueXRoaW5nIG5vdCBpbiAkKHRhcmdldHMpCiBjbGVhbi1maWxlcyArPSAkKGltYWdlLSkgJChpbml0cmQtKSB6SW1hZ2UgekltYWdlLmluaXRyZCBjdUltYWdlLiogXAotCXRyZWVJbWFnZS4qCisJdHJlZUltYWdlLiogekltYWdlLmR0cyB6SW1hZ2UuZHRzX2luaXRyZAogCiAjIGNsZWFuIHVwIGZpbGVzIGNhY2hlZCBieSB3cmFwcGVyCiBjbGVhbi1rZXJuZWwgOj0gdm1saW51eC5zdHJpcCB2bWxpbnV4LmJpbgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTgzeHguYyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04M3h4LmMKaW5kZXggNmNiYzIwYS4uOWFmNTU0ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTgzeHguYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODN4eC5jCkBAIC01Nyw3ICs1Nyw3IEBACiAKIAltZW1jcHkoJmJkLCAoYmRfdCAqKXIzLCBzaXplb2YoYmQpKTsKIAlsb2FkZXJfaW5mby5pbml0cmRfYWRkciA9IHI0OwotCWxvYWRlcl9pbmZvLmluaXRyZF9zaXplID0gcjQgPyByNSA6IDA7CisJbG9hZGVyX2luZm8uaW5pdHJkX3NpemUgPSByNCA/IHI1IC0gcjQgOiAwOwogCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OwogCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTg1eHguYyBiL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC04NXh4LmMKaW5kZXggZjg4YmEwMC4uZTI1NjAzMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LTg1eHguYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtODV4eC5jCkBAIC01OCw3ICs1OCw3IEBACiAKIAltZW1jcHkoJmJkLCAoYmRfdCAqKXIzLCBzaXplb2YoYmQpKTsKIAlsb2FkZXJfaW5mby5pbml0cmRfYWRkciA9IHI0OwotCWxvYWRlcl9pbmZvLmluaXRyZF9zaXplID0gcjQgPyByNSA6IDA7CisJbG9hZGVyX2luZm8uaW5pdHJkX3NpemUgPSByNCA/IHI1IC0gcjQgOiAwOwogCWxvYWRlcl9pbmZvLmNtZGxpbmUgPSAoY2hhciAqKXI2OwogCWxvYWRlcl9pbmZvLmNtZGxpbmVfbGVuID0gcjcgLSByNjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BycG1jMjgwMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcHJwbWMyODAwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Njg5NjVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3BycG1jMjgwMC5kdHMKQEAgLTAsMCArMSwzMTUgQEAKKy8qIERldmljZSBUcmVlIFNvdXJjZSBmb3IgTW90b3JvbGEgUHJQTUMyODAwCisgKgorICogQXV0aG9yOiBNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4KKyAqCisgKiAyMDA3IChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICoKKyAqIFByb3BlcnR5IHZhbHVlcyB0aGF0IGFyZSBsYWJlbGVkIGFzICJEZWZhdWx0IiB3aWxsIGJlIHVwZGF0ZWQgYnkgYm9vdHdyYXBwZXIKKyAqIGlmIGl0IGNhbiBkZXRlcm1pbmUgdGhlIGV4YWN0IFByUE1DIHR5cGUuCisgKgorICogVG8gYnVpbGQ6CisgKiAgIGR0YyAtSSBkdHMgLU8gYXNtIC1vIHBycG1jMjgwMC5TIC1iIDAgcHJwbWMyODAwLmR0cworICogICBkdGMgLUkgZHRzIC1PIGR0YiAtbyBwcnBtYzI4MDAuZHRiIC1iIDAgcHJwbWMyODAwLmR0cworICovCisKKy8geworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCW1vZGVsID0gIlByUE1DMjgwL1ByUE1DMjgwMCI7IC8qIERlZmF1bHQgKi8KKwljb21wYXRpYmxlID0gIm1vdG9yb2xhLFByUE1DMjgwMCI7CisJY29oZXJlbmN5LW9mZjsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyw3NDQ3IHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MmJiMGIxNDA+OwkvKiBEZWZhdWx0ICg3MzMgTUh6KSAqLworCQkJYnVzLWZyZXF1ZW5jeSA9IDw3ZjI4MTU1PjsJLyogMTMzLjMzMzMzMyBNSHogKi8KKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwxZmNhMDU1PjsJLyogMzMuMzMzMzMzIE1IeiAqLworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MjA+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MjA+OworCQkJaS1jYWNoZS1zaXplID0gPDgwMDA+OworCQkJZC1jYWNoZS1zaXplID0gPDgwMDA+OworCQl9OworCX07CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MDAwMDAwMDAgMjAwMDAwMDA+OwkvKiBEZWZhdWx0ICg1MTJNQikgKi8KKwl9OworCisJbXY2NHg2MEBmMTAwMDAwMCB7IC8qIE1hcnZlbGwgRGlzY292ZXJ5ICovCisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJbW9kZWwgPSAibXY2NDM2MCI7CQkJLyogRGVmYXVsdCAqLworCQljb21wYXRpYmxlID0gIm1hcnZlbGwsbXY2NHg2MCI7CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDw3ZjI4MTU1PjsJCS8qIDEzMy4zMzMzMzMgTUh6ICovCisJCXJlZyA9IDxmMTAwMDAwMCAwMDAxMDAwMD47CisJCXZpcnR1YWwtcmVnID0gPGYxMDAwMDAwPjsKKwkJcmFuZ2VzID0gPDg4MDAwMDAwIDg4MDAwMDAwIDAxMDAwMDAwCS8qIFBDSSAwIEkvTyBTcGFjZSAqLworCQkJICA4MDAwMDAwMCA4MDAwMDAwMCAwODAwMDAwMAkvKiBQQ0kgMCBNRU0gU3BhY2UgKi8KKwkJCSAgYTAwMDAwMDAgYTAwMDAwMDAgMDQwMDAwMDAJLyogVXNlciBGTEFTSCAqLworCQkJICAwMDAwMDAwMCBmMTAwMDAwMCAwMDAxMDAwMAkvKiBCcmlkZ2UncyByZWdzICovCisJCQkgIGYyMDAwMDAwIGYyMDAwMDAwIDAwMDQwMDAwPjsJLyogSW50ZWdyYXRlZCBTUkFNICovCisKKwkJZmxhc2hAYTAwMDAwMDAgeworCQkJZGV2aWNlX3R5cGUgPSAicm9tIjsKKwkJCWNvbXBhdGlibGUgPSAiZGlyZWN0LW1hcHBlZCI7CisJCQlyZWcgPSA8YTAwMDAwMDAgNDAwMDAwMD47IC8qIERlZmF1bHQgKDY0TUIpICovCisJCQlwcm9iZS10eXBlID0gIkNGSSI7CisJCQliYW5rLXdpZHRoID0gPDQ+OworCQkJcGFydGl0aW9ucyA9IDwwMDAwMDAwMCAwMDEwMDAwMCAvKiBSTyAqLworCQkJCSAgICAgIDAwMTAwMDAwIDAwMDQwMDAxIC8qIFJXICovCisJCQkJICAgICAgMDAxNDAwMDAgMDA0MDAwMDAgLyogUk8gKi8KKwkJCQkgICAgICAwMDU0MDAwMCAwMzljMDAwMCAvKiBSTyAqLworCQkJCSAgICAgIDAzZjAwMDAwIDAwMTAwMDAwPjsgLyogUk8gKi8KKwkJCXBhcnRpdGlvbi1uYW1lcyA9ICJGVyBJbWFnZSBBIiwgIkZXIENvbmZpZyBEYXRhIiwgIktlcm5lbCBJbWFnZSIsICJGaWxlc3lzdGVtIiwgIkZXIEltYWdlIEIiOworCQl9OworCisJCW1kaW8geworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCWRldmljZV90eXBlID0gIm1kaW8iOworCQkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12NjR4NjAtbWRpbyI7CisJCQlldGhlcm5ldC1waHlAMSB7CisJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJCQljb21wYXRpYmxlID0gImJyb2FkY29tLGJjbTU0MjEiOworCQkJCWludGVycnVwdHMgPSA8NGM+OwkvKiBHUFAgMTIgKi8KKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCYvbXY2NHg2MC9waWM+OworCQkJCXJlZyA9IDwxPjsKKwkJCX07CisJCQlldGhlcm5ldC1waHlAMyB7CisJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJCQljb21wYXRpYmxlID0gImJyb2FkY29tLGJjbTU0MjEiOworCQkJCWludGVycnVwdHMgPSA8NGM+OwkvKiBHUFAgMTIgKi8KKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCYvbXY2NHg2MC9waWM+OworCQkJCXJlZyA9IDwzPjsKKwkJCX07CisJCX07CisKKwkJZXRoZXJuZXRAMjAwMCB7CisJCQlyZWcgPSA8MjAwMCAyMDAwPjsKKwkJCWV0aDAgeworCQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJCWNvbXBhdGlibGUgPSAibWFydmVsbCxtdjY0eDYwLWV0aCI7CisJCQkJYmxvY2staW5kZXggPSA8MD47CisJCQkJaW50ZXJydXB0cyA9IDwyMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmL212NjR4NjAvcGljPjsKKwkJCQlwaHkgPSA8Ji9tdjY0eDYwL21kaW8vZXRoZXJuZXQtcGh5QDE+OworCQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJfTsKKwkJCWV0aDEgeworCQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCQkJCWNvbXBhdGlibGUgPSAibWFydmVsbCxtdjY0eDYwLWV0aCI7CisJCQkJYmxvY2staW5kZXggPSA8MT47CisJCQkJaW50ZXJydXB0cyA9IDwyMT47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmL212NjR4NjAvcGljPjsKKwkJCQlwaHkgPSA8Ji9tdjY0eDYwL21kaW8vZXRoZXJuZXQtcGh5QDM+OworCQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQkJfTsKKwkJfTsKKworCQlzZG1hQDQwMDAgeworCQkJZGV2aWNlX3R5cGUgPSAiZG1hIjsKKwkJCWNvbXBhdGlibGUgPSAibWFydmVsbCxtdjY0eDYwLXNkbWEiOworCQkJcmVnID0gPDQwMDAgYzE4PjsKKwkJCXZpcnR1YWwtcmVnID0gPGYxMDA0MDAwPjsKKwkJCWludGVycnVwdC1iYXNlID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwyND47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCYvbXY2NHg2MC9waWM+OworCQl9OworCisJCXNkbWFANjAwMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJkbWEiOworCQkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12NjR4NjAtc2RtYSI7CisJCQlyZWcgPSA8NjAwMCBjMTg+OworCQkJdmlydHVhbC1yZWcgPSA8ZjEwMDYwMDA+OworCQkJaW50ZXJydXB0LWJhc2UgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDI2PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Ji9tdjY0eDYwL3BpYz47CisJCX07CisKKwkJYnJnQGIyMDAgeworCQkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12NjR4NjAtYnJnIjsKKwkJCXJlZyA9IDxiMjAwIDg+OworCQkJY2xvY2stc3JjID0gPDg+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDdlZDZiNDA+OworCQkJY3VycmVudC1zcGVlZCA9IDwyNTgwPjsKKwkJCWJjciA9IDwwPjsKKwkJfTsKKworCQlicmdAYjIwOCB7CisJCQljb21wYXRpYmxlID0gIm1hcnZlbGwsbXY2NHg2MC1icmciOworCQkJcmVnID0gPGIyMDggOD47CisJCQljbG9jay1zcmMgPSA8OD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8N2VkNmI0MD47CisJCQljdXJyZW50LXNwZWVkID0gPDI1ODA+OworCQkJYmNyID0gPDA+OworCQl9OworCisJCWN1bml0QGYyMDAgeworCQkJcmVnID0gPGYyMDAgMjAwPjsKKwkJfTsKKworCQltcHNjcm91dGluZ0BiNDAwIHsKKwkJCXJlZyA9IDxiNDAwIGM+OworCQl9OworCisJCW1wc2NpbnRyQGI4MDAgeworCQkJcmVnID0gPGI4MDAgMTAwPjsKKwkJCXZpcnR1YWwtcmVnID0gPGYxMDBiODAwPjsKKwkJfTsKKworCQltcHNjQDgwMDAgeworCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwkJCWNvbXBhdGlibGUgPSAibWFydmVsbCxtcHNjIjsKKwkJCXJlZyA9IDw4MDAwIDM4PjsKKwkJCXZpcnR1YWwtcmVnID0gPGYxMDA4MDAwPjsKKwkJCXNkbWEgPSA8Ji9tdjY0eDYwL3NkbWFANDAwMD47CisJCQlicmcgPSA8Ji9tdjY0eDYwL2JyZ0BiMjAwPjsKKwkJCWN1bml0ID0gPCYvbXY2NHg2MC9jdW5pdEBmMjAwPjsKKwkJCW1wc2Nyb3V0aW5nID0gPCYvbXY2NHg2MC9tcHNjcm91dGluZ0BiNDAwPjsKKwkJCW1wc2NpbnRyID0gPCYvbXY2NHg2MC9tcHNjaW50ckBiODAwPjsKKwkJCWJsb2NrLWluZGV4ID0gPDA+OworCQkJbWF4X2lkbGUgPSA8Mjg+OworCQkJY2hyXzEgPSA8MD47CisJCQljaHJfMiA9IDwwPjsKKwkJCWNocl8xMCA9IDwzPjsKKwkJCW1wY3IgPSA8MD47CisJCQlpbnRlcnJ1cHRzID0gPDI4PjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Ji9tdjY0eDYwL3BpYz47CisJCX07CisKKwkJbXBzY0A5MDAwIHsKKwkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQljb21wYXRpYmxlID0gIm1hcnZlbGwsbXBzYyI7CisJCQlyZWcgPSA8OTAwMCAzOD47CisJCQl2aXJ0dWFsLXJlZyA9IDxmMTAwOTAwMD47CisJCQlzZG1hID0gPCYvbXY2NHg2MC9zZG1hQDYwMDA+OworCQkJYnJnID0gPCYvbXY2NHg2MC9icmdAYjIwOD47CisJCQljdW5pdCA9IDwmL212NjR4NjAvY3VuaXRAZjIwMD47CisJCQltcHNjcm91dGluZyA9IDwmL212NjR4NjAvbXBzY3JvdXRpbmdAYjQwMD47CisJCQltcHNjaW50ciA9IDwmL212NjR4NjAvbXBzY2ludHJAYjgwMD47CisJCQlibG9jay1pbmRleCA9IDwxPjsKKwkJCW1heF9pZGxlID0gPDI4PjsKKwkJCWNocl8xID0gPDA+OworCQkJY2hyXzIgPSA8MD47CisJCQljaHJfMTAgPSA8Mz47CisJCQltcGNyID0gPDA+OworCQkJaW50ZXJydXB0cyA9IDwyYT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCYvbXY2NHg2MC9waWM+OworCQl9OworCisJCWkyY0BjMDAwIHsKKwkJCWRldmljZV90eXBlID0gImkyYyI7CisJCQljb21wYXRpYmxlID0gIm1hcnZlbGwsbXY2NHg2MC1pMmMiOworCQkJcmVnID0gPGMwMDAgMjA+OworCQkJdmlydHVhbC1yZWcgPSA8ZjEwMGMwMDA+OworCQkJZnJlcV9tID0gPDg+OworCQkJZnJlcV9uID0gPDM+OworCQkJdGltZW91dCA9IDwzZTg+OwkJLyogMTAwMCA9IDEgc2Vjb25kICovCisJCQlyZXRyaWVzID0gPDE+OworCQkJaW50ZXJydXB0cyA9IDwyNT47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCYvbXY2NHg2MC9waWM+OworCQl9OworCisJCXBpYyB7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQljb21wYXRpYmxlID0gIm1hcnZlbGwsbXY2NHg2MC1waWMiOworCQkJcmVnID0gPDAwMDAgODg+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCX07CisKKwkJbXBwQGYwMDAgeworCQkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12NjR4NjAtbXBwIjsKKwkJCXJlZyA9IDxmMDAwIDEwPjsKKwkJfTsKKworCQlncHBAZjEwMCB7CisJCQljb21wYXRpYmxlID0gIm1hcnZlbGwsbXY2NHg2MC1ncHAiOworCQkJcmVnID0gPGYxMDAgMjA+OworCQl9OworCisJCXBjaUA4MDAwMDAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQljb21wYXRpYmxlID0gIm1hcnZlbGwsbXY2NHg2MC1wY2kiOworCQkJcmVnID0gPDBjZjggOD47CisJCQlyYW5nZXMgPSA8MDEwMDAwMDAgMCAgICAgICAgMCA4ODAwMDAwMCAwIDAxMDAwMDAwCisJCQkJICAwMjAwMDAwMCAwIDgwMDAwMDAwIDgwMDAwMDAwIDAgMDgwMDAwMDA+OworCQkJYnVzLXJhbmdlID0gPDAgZmY+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDNFRjE0ODA+OworCQkJaW50ZXJydXB0LXBjaS1pYWNrID0gPDBjMzQ+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmL212NjR4NjAvcGljPjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDxmODAwIDAgMCA3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJLyogSURTRUwgMHgwYSAqLworCQkJCTUwMDAgMCAwIDEgJi9tdjY0eDYwL3BpYyA1MAorCQkJCTUwMDAgMCAwIDIgJi9tdjY0eDYwL3BpYyA1MQorCQkJCTUwMDAgMCAwIDMgJi9tdjY0eDYwL3BpYyA1YgorCQkJCTUwMDAgMCAwIDQgJi9tdjY0eDYwL3BpYyA1ZAorCisJCQkJLyogSURTRUwgMHgwYiAqLworCQkJCTU4MDAgMCAwIDEgJi9tdjY0eDYwL3BpYyA1YgorCQkJCTU4MDAgMCAwIDIgJi9tdjY0eDYwL3BpYyA1ZAorCQkJCTU4MDAgMCAwIDMgJi9tdjY0eDYwL3BpYyA1MAorCQkJCTU4MDAgMCAwIDQgJi9tdjY0eDYwL3BpYyA1MQorCisJCQkJLyogSURTRUwgMHgwYyAqLworCQkJCTYwMDAgMCAwIDEgJi9tdjY0eDYwL3BpYyA1YgorCQkJCTYwMDAgMCAwIDIgJi9tdjY0eDYwL3BpYyA1ZAorCQkJCTYwMDAgMCAwIDMgJi9tdjY0eDYwL3BpYyA1MAorCQkJCTYwMDAgMCAwIDQgJi9tdjY0eDYwL3BpYyA1MQorCisJCQkJLyogSURTRUwgMHgwZCAqLworCQkJCTY4MDAgMCAwIDEgJi9tdjY0eDYwL3BpYyA1ZAorCQkJCTY4MDAgMCAwIDIgJi9tdjY0eDYwL3BpYyA1MAorCQkJCTY4MDAgMCAwIDMgJi9tdjY0eDYwL3BpYyA1MQorCQkJCTY4MDAgMCAwIDQgJi9tdjY0eDYwL3BpYyA1YgorCQkJPjsKKwkJfTsKKworCQljcHUtZXJyb3JAMDA3MCB7CisJCQljb21wYXRpYmxlID0gIm1hcnZlbGwsbXY2NHg2MC1jcHUtZXJyb3IiOworCQkJcmVnID0gPDAwNzAgMTAgMDEyOCAyOD47CisJCQlpbnRlcnJ1cHRzID0gPDAzPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Ji9tdjY0eDYwL3BpYz47CisJCX07CisKKwkJc3JhbS1jdHJsQDAzODAgeworCQkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12NjR4NjAtc3JhbS1jdHJsIjsKKwkJCXJlZyA9IDwwMzgwIDgwPjsKKwkJCWludGVycnVwdHMgPSA8MGQ+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmL212NjR4NjAvcGljPjsKKwkJfTsKKworCQlwY2ktZXJyb3JAMWQ0MCB7CisJCQljb21wYXRpYmxlID0gIm1hcnZlbGwsbXY2NHg2MC1wY2ktZXJyb3IiOworCQkJcmVnID0gPDFkNDAgNDAgMGMyOCA0PjsKKwkJCWludGVycnVwdHMgPSA8MGM+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmL212NjR4NjAvcGljPjsKKwkJfTsKKworCQltZW0tY3RybEAxNDAwIHsKKwkJCWNvbXBhdGlibGUgPSAibWFydmVsbCxtdjY0eDYwLW1lbS1jdHJsIjsKKwkJCXJlZyA9IDwxNDAwIDYwPjsKKwkJCWludGVycnVwdHMgPSA8MTE+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmL212NjR4NjAvcGljPjsKKwkJfTsKKwl9OworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAiaXA9b24gY29uc29sZT10dHlNTTAiOworCQlsaW51eCxzdGRvdXQtcGF0aCA9ICIvbXY2NHg2MEBmMTAwMDAwMC9tcHNjQDgwMDAiOworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbXBzYy5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbXBzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYzBlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9tcHNjLmMKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBNUFNDL1VBUlQgZHJpdmVyIGZvciB0aGUgTWFydmVsbCBtdjY0MzYwLCBtdjY0NDYwLCAuLi4KKyAqCisgKiBBdXRob3I6IE1hcmsgQS4gR3JlZXIgPG1ncmVlckBtdmlzdGEuY29tPgorICoKKyAqIDIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJpby5oIgorI2luY2x1ZGUgIm9wcy5oIgorCitleHRlcm4gdm9pZCB1ZGVsYXkobG9uZyBkZWxheSk7CisKKyNkZWZpbmUgTVBTQ19DSFJfMQkJMHgwMDBjCisKKyNkZWZpbmUgTVBTQ19DSFJfMgkJMHgwMDEwCisjZGVmaW5lIE1QU0NfQ0hSXzJfVEEJCSgxPDw3KQorI2RlZmluZSBNUFNDX0NIUl8yX1RDUwkJKDE8PDkpCisjZGVmaW5lIE1QU0NfQ0hSXzJfUkEJCSgxPDwyMykKKyNkZWZpbmUgTVBTQ19DSFJfMl9DUkQJCSgxPDwyNSkKKyNkZWZpbmUgTVBTQ19DSFJfMl9FSAkJKDE8PDMxKQorCisjZGVmaW5lIE1QU0NfQ0hSXzQJCTB4MDAxOAorI2RlZmluZSBNUFNDX0NIUl80X1oJCSgxPDwyOSkKKworI2RlZmluZSBNUFNDX0NIUl81CQkweDAwMWMKKyNkZWZpbmUgTVBTQ19DSFJfNV9DVEwxX0lOVFIJKDE8PDEyKQorI2RlZmluZSBNUFNDX0NIUl81X0NUTDFfVkFMSUQJKDE8PDE1KQorCisjZGVmaW5lIE1QU0NfQ0hSXzEwCQkweDAwMzAKKworI2RlZmluZSBNUFNDX0lOVFJfQ0FVU0UJCTB4MDAwMAorI2RlZmluZSBNUFNDX0lOVFJfQ0FVU0VfUkNDCSgxPDw2KQorI2RlZmluZSBNUFNDX0lOVFJfTUFTSwkJMHgwMDgwCisKKyNkZWZpbmUgU0RNQV9TRENNCQkweDAwMDgKKyNkZWZpbmUgU0RNQV9TRENNX0FSCQkoMTw8MTUpCisjZGVmaW5lIFNETUFfU0RDTV9BVAkJKDE8PDMxKQorCitzdGF0aWMgdm9sYXRpbGUgY2hhciAqbXBzY19iYXNlOworc3RhdGljIHZvbGF0aWxlIGNoYXIgKm1wc2NpbnRyX2Jhc2U7CitzdGF0aWMgdTMyIGNocjEsIGNocjI7CisKK3N0YXRpYyBpbnQgbXBzY19vcGVuKHZvaWQpCit7CisJY2hyMSA9IGluX2xlMzIoKHUzMiAqKShtcHNjX2Jhc2UgKyBNUFNDX0NIUl8xKSkgJiAweDAwZmYwMDAwOworCWNocjIgPSBpbl9sZTMyKCh1MzIgKikobXBzY19iYXNlICsgTVBTQ19DSFJfMikpICYgfihNUFNDX0NIUl8yX1RBCisJCQl8IE1QU0NfQ0hSXzJfVENTIHwgTVBTQ19DSFJfMl9SQSB8IE1QU0NfQ0hSXzJfQ1JECisJCQl8IE1QU0NfQ0hSXzJfRUgpOworCW91dF9sZTMyKCh1MzIgKikobXBzY19iYXNlICsgTVBTQ19DSFJfNCksIE1QU0NfQ0hSXzRfWik7CisJb3V0X2xlMzIoKHUzMiAqKShtcHNjX2Jhc2UgKyBNUFNDX0NIUl81KSwKKwkJCU1QU0NfQ0hSXzVfQ1RMMV9JTlRSIHwgTVBTQ19DSFJfNV9DVEwxX1ZBTElEKTsKKwlvdXRfbGUzMigodTMyICopKG1wc2NfYmFzZSArIE1QU0NfQ0hSXzIpLCBjaHIyIHwgTVBTQ19DSFJfMl9FSCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1wc2NfcHV0Yyh1bnNpZ25lZCBjaGFyIGMpCit7CisJd2hpbGUgKGluX2xlMzIoKHUzMiAqKShtcHNjX2Jhc2UgKyBNUFNDX0NIUl8yKSkgJiBNUFNDX0NIUl8yX1RDUyk7CisKKwlvdXRfbGUzMigodTMyICopKG1wc2NfYmFzZSArIE1QU0NfQ0hSXzEpLCBjaHIxIHwgYyk7CisJb3V0X2xlMzIoKHUzMiAqKShtcHNjX2Jhc2UgKyBNUFNDX0NIUl8yKSwgY2hyMiB8IE1QU0NfQ0hSXzJfVENTKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbXBzY19nZXRjKHZvaWQpCit7CisJdTMyIGNhdXNlID0gMDsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwl3aGlsZSAoIShjYXVzZSAmIE1QU0NfSU5UUl9DQVVTRV9SQ0MpKQorCQljYXVzZSA9IGluX2xlMzIoKHUzMiAqKShtcHNjaW50cl9iYXNlICsgTVBTQ19JTlRSX0NBVVNFKSk7CisKKwljID0gaW5fOCgodTggKikobXBzY19iYXNlICsgTVBTQ19DSFJfMTAgKyAyKSk7CisJb3V0XzgoKHU4ICopKG1wc2NfYmFzZSArIE1QU0NfQ0hSXzEwICsgMiksIGMpOworCW91dF9sZTMyKCh1MzIgKikobXBzY2ludHJfYmFzZSArIE1QU0NfSU5UUl9DQVVTRSksCisJCQljYXVzZSAmIH5NUFNDX0lOVFJfQ0FVU0VfUkNDKTsKKworCXJldHVybiBjOworfQorCitzdGF0aWMgdTggbXBzY190c3RjKHZvaWQpCit7CisJcmV0dXJuICh1OCkoKGluX2xlMzIoKHUzMiAqKShtcHNjaW50cl9iYXNlICsgTVBTQ19JTlRSX0NBVVNFKSkKKwkJCQkmIE1QU0NfSU5UUl9DQVVTRV9SQ0MpICE9IDApOworfQorCitzdGF0aWMgdm9pZCBtcHNjX3N0b3BfZG1hKHZvbGF0aWxlIGNoYXIgKnNkbWFfYmFzZSkKK3sKKwlvdXRfbGUzMigodTMyICopKG1wc2NfYmFzZSArIE1QU0NfQ0hSXzIpLE1QU0NfQ0hSXzJfVEEgfCBNUFNDX0NIUl8yX1JBKTsKKwlvdXRfbGUzMigodTMyICopKHNkbWFfYmFzZSArIFNETUFfU0RDTSksIFNETUFfU0RDTV9BUiB8IFNETUFfU0RDTV9BVCk7CisKKwl3aGlsZSAoKGluX2xlMzIoKHUzMiAqKShzZG1hX2Jhc2UgKyBTRE1BX1NEQ00pKQorCQkJCSYgKFNETUFfU0RDTV9BUiB8IFNETUFfU0RDTV9BVCkpICE9IDApCisJCXVkZWxheSgxMDApOworfQorCitzdGF0aWMgdm9sYXRpbGUgY2hhciAqbXBzY19nZXRfdmlydHJlZ19vZl9waGFuZGxlKHZvaWQgKmRldnAsIGNoYXIgKnByb3ApCit7CisJdm9pZCAqdjsKKwlpbnQgbjsKKworCW4gPSBnZXRwcm9wKGRldnAsIHByb3AsICZ2LCBzaXplb2YodikpOworCWlmIChuICE9IHNpemVvZih2KSkKKwkJZ290byBlcnJfb3V0OworCisJZGV2cCA9IGZpbmRfbm9kZV9ieV9saW51eHBoYW5kbGUoKHUzMil2KTsKKwlpZiAoZGV2cCA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXQ7CisKKwluID0gZ2V0cHJvcChkZXZwLCAidmlydHVhbC1yZWciLCAmdiwgc2l6ZW9mKHYpKTsKKwlpZiAobiA9PSBzaXplb2YodikpCisJCXJldHVybiB2OworCitlcnJfb3V0OgorCXJldHVybiBOVUxMOworfQorCitpbnQgbXBzY19jb25zb2xlX2luaXQodm9pZCAqZGV2cCwgc3RydWN0IHNlcmlhbF9jb25zb2xlX2RhdGEgKnNjZHApCit7CisJdm9pZCAqdjsKKwlpbnQgbiwgcmVnX3NldDsKKwl2b2xhdGlsZSBjaGFyICpzZG1hX2Jhc2U7CisKKwluID0gZ2V0cHJvcChkZXZwLCAidmlydHVhbC1yZWciLCAmdiwgc2l6ZW9mKHYpKTsKKwlpZiAobiAhPSBzaXplb2YodikpCisJCWdvdG8gZXJyX291dDsKKwltcHNjX2Jhc2UgPSB2OworCisJc2RtYV9iYXNlID0gbXBzY19nZXRfdmlydHJlZ19vZl9waGFuZGxlKGRldnAsICJzZG1hIik7CisJaWYgKHNkbWFfYmFzZSA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXQ7CisKKwltcHNjaW50cl9iYXNlID0gbXBzY19nZXRfdmlydHJlZ19vZl9waGFuZGxlKGRldnAsICJtcHNjaW50ciIpOworCWlmIChtcHNjaW50cl9iYXNlID09IE5VTEwpCisJCWdvdG8gZXJyX291dDsKKworCW4gPSBnZXRwcm9wKGRldnAsICJibG9jay1pbmRleCIsICZ2LCBzaXplb2YodikpOworCWlmIChuICE9IHNpemVvZih2KSkKKwkJZ290byBlcnJfb3V0OworCXJlZ19zZXQgPSAoaW50KXY7CisKKwltcHNjaW50cl9iYXNlICs9IChyZWdfc2V0ID09IDApID8gMHg0IDogMHhjOworCisJLyogTWFrZSBzdXJlIHRoZSBtcHNjIGN0bHJzIGFyZSBzaHV0ZG93biAqLworCW91dF9sZTMyKCh1MzIgKikobXBzY2ludHJfYmFzZSArIE1QU0NfSU5UUl9DQVVTRSksIDApOworCW91dF9sZTMyKCh1MzIgKikobXBzY2ludHJfYmFzZSArIE1QU0NfSU5UUl9DQVVTRSksIDApOworCW91dF9sZTMyKCh1MzIgKikobXBzY2ludHJfYmFzZSArIE1QU0NfSU5UUl9NQVNLKSwgMCk7CisJb3V0X2xlMzIoKHUzMiAqKShtcHNjaW50cl9iYXNlICsgTVBTQ19JTlRSX01BU0spLCAwKTsKKworCW1wc2Nfc3RvcF9kbWEoc2RtYV9iYXNlKTsKKworCXNjZHAtPm9wZW4gPSBtcHNjX29wZW47CisJc2NkcC0+cHV0YyA9IG1wc2NfcHV0YzsKKwlzY2RwLT5nZXRjID0gbXBzY19nZXRjOworCXNjZHAtPnRzdGMgPSBtcHNjX3RzdGM7CisJc2NkcC0+Y2xvc2UgPSBOVUxMOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbXY2NHg2MC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbXY2NHg2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MzI1OTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9tdjY0eDYwLmMKQEAgLTAsMCArMSw1ODEgQEAKKy8qCisgKiBNYXJ2ZWxsIGhvc3RicmlkZ2Ugcm91dGluZXMKKyAqCisgKiBBdXRob3I6IE1hcmsgQS4gR3JlZXIgPHNvdXJjZUBtdmlzdGEuY29tPgorICoKKyAqIDIwMDQsIDIwMDUsIDIwMDcgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZWxmLmgiCisjaW5jbHVkZSAicGFnZS5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorI2luY2x1ZGUgInN0ZGlvLmgiCisjaW5jbHVkZSAiaW8uaCIKKyNpbmNsdWRlICJvcHMuaCIKKyNpbmNsdWRlICJtdjY0eDYwLmgiCisKKyNkZWZpbmUgUENJX0RFVkZOKHNsb3QsZnVuYykJKCgoKHNsb3QpICYgMHgxZikgPDwgMykgfCAoKGZ1bmMpICYgMHgwNykpCisKKyNkZWZpbmUgTVY2NHg2MF9DUFUyTUVNX1dJTkRPV1MJCQk0CisjZGVmaW5lIE1WNjR4NjBfQ1BVMk1FTV8wX0JBU0UJCQkweDAwMDgKKyNkZWZpbmUgTVY2NHg2MF9DUFUyTUVNXzBfU0laRQkJCTB4MDAxMAorI2RlZmluZSBNVjY0eDYwX0NQVTJNRU1fMV9CQVNFCQkJMHgwMjA4CisjZGVmaW5lIE1WNjR4NjBfQ1BVMk1FTV8xX1NJWkUJCQkweDAyMTAKKyNkZWZpbmUgTVY2NHg2MF9DUFUyTUVNXzJfQkFTRQkJCTB4MDAxOAorI2RlZmluZSBNVjY0eDYwX0NQVTJNRU1fMl9TSVpFCQkJMHgwMDIwCisjZGVmaW5lIE1WNjR4NjBfQ1BVMk1FTV8zX0JBU0UJCQkweDAyMTgKKyNkZWZpbmUgTVY2NHg2MF9DUFUyTUVNXzNfU0laRQkJCTB4MDIyMAorCisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fQkFSX0VOQUJMRQkJMHgyMjkwCisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fMF9CQVNFCQkJMHgyMjAwCisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fMF9TSVpFCQkJMHgyMjA0CisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fMV9CQVNFCQkJMHgyMjA4CisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fMV9TSVpFCQkJMHgyMjBjCisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fMl9CQVNFCQkJMHgyMjEwCisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fMl9TSVpFCQkJMHgyMjE0CisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fM19CQVNFCQkJMHgyMjE4CisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fM19TSVpFCQkJMHgyMjFjCisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fNF9CQVNFCQkJMHgyMjIwCisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fNF9TSVpFCQkJMHgyMjI0CisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fNV9CQVNFCQkJMHgyMjI4CisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fNV9TSVpFCQkJMHgyMjJjCisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fQUNDX1BST1RfMAkJMHgyMjk0CisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fQUNDX1BST1RfMQkJMHgyMjk4CisjZGVmaW5lIE1WNjR4NjBfRU5FVDJNRU1fQUNDX1BST1RfMgkJMHgyMjljCisKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV9CQVJfRU5BQkxFCQkweGYyNTAKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV8wX0JBU0UJCQkweGYyMDAKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV8wX1NJWkUJCQkweGYyMDQKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV8xX0JBU0UJCQkweGYyMDgKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV8xX1NJWkUJCQkweGYyMGMKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV8yX0JBU0UJCQkweGYyMTAKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV8yX1NJWkUJCQkweGYyMTQKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV8zX0JBU0UJCQkweGYyMTgKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV8zX1NJWkUJCQkweGYyMWMKKyNkZWZpbmUgTVY2NHg2MF9NUFNDXzBfUkVNQVAJCQkweGYyNDAKKyNkZWZpbmUgTVY2NHg2MF9NUFNDXzFfUkVNQVAJCQkweGYyNDQKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV9BQ0NfUFJPVF8wCQkweGYyNTQKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMk1FTV9BQ0NfUFJPVF8xCQkweGYyNTgKKyNkZWZpbmUgTVY2NHg2MF9NUFNDMlJFR1NfQkFTRQkJCTB4ZjI1YworCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fQkFSX0VOQUJMRQkJMHgwYTgwCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fMF9CQVNFCQkJMHgwYTAwCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fMF9TSVpFCQkJMHgwYTA0CisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fMV9CQVNFCQkJMHgwYTA4CisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fMV9TSVpFCQkJMHgwYTBjCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fMl9CQVNFCQkJMHgwYTEwCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fMl9TSVpFCQkJMHgwYTE0CisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fM19CQVNFCQkJMHgwYTE4CisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fM19TSVpFCQkJMHgwYTFjCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fNF9CQVNFCQkJMHgwYTIwCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fNF9TSVpFCQkJMHgwYTI0CisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fNV9CQVNFCQkJMHgwYTI4CisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fNV9TSVpFCQkJMHgwYTJjCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fNl9CQVNFCQkJMHgwYTMwCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fNl9TSVpFCQkJMHgwYTM0CisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fN19CQVNFCQkJMHgwYTM4CisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fN19TSVpFCQkJMHgwYTNjCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fQUNDX1BST1RfMAkJMHgwYTcwCisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fQUNDX1BST1RfMQkJMHgwYTc0CisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fQUNDX1BST1RfMgkJMHgwYTc4CisjZGVmaW5lIE1WNjR4NjBfSURNQTJNRU1fQUNDX1BST1RfMwkJMHgwYTdjCisKKyNkZWZpbmUgTVY2NHg2MF9QQ0lfQUNDX0NOVExfV0lORE9XUwkJNgorI2RlZmluZSBNVjY0eDYwX1BDSTBfUENJX0RFQ09ERV9DTlRMCQkweDBkM2MKKyNkZWZpbmUgTVY2NHg2MF9QQ0kxX1BDSV9ERUNPREVfQ05UTAkJMHgwZGJjCisKKyNkZWZpbmUgTVY2NHg2MF9QQ0kwX0JBUl9FTkFCTEUJCQkweDBjM2MKKyNkZWZpbmUgTVY2NHg2MF9QQ0kwMk1FTV8wX1NJWkUJCQkweDBjMDgKKyNkZWZpbmUgTVY2NHg2MF9QQ0kwX0FDQ19DTlRMXzBfQkFTRV9MTwkJMHgxZTAwCisjZGVmaW5lIE1WNjR4NjBfUENJMF9BQ0NfQ05UTF8wX0JBU0VfSEkJCTB4MWUwNAorI2RlZmluZSBNVjY0eDYwX1BDSTBfQUNDX0NOVExfMF9TSVpFCQkweDFlMDgKKyNkZWZpbmUgTVY2NHg2MF9QQ0kwX0FDQ19DTlRMXzFfQkFTRV9MTwkJMHgxZTEwCisjZGVmaW5lIE1WNjR4NjBfUENJMF9BQ0NfQ05UTF8xX0JBU0VfSEkJCTB4MWUxNAorI2RlZmluZSBNVjY0eDYwX1BDSTBfQUNDX0NOVExfMV9TSVpFCQkweDFlMTgKKyNkZWZpbmUgTVY2NHg2MF9QQ0kwX0FDQ19DTlRMXzJfQkFTRV9MTwkJMHgxZTIwCisjZGVmaW5lIE1WNjR4NjBfUENJMF9BQ0NfQ05UTF8yX0JBU0VfSEkJCTB4MWUyNAorI2RlZmluZSBNVjY0eDYwX1BDSTBfQUNDX0NOVExfMl9TSVpFCQkweDFlMjgKKyNkZWZpbmUgTVY2NHg2MF9QQ0kwX0FDQ19DTlRMXzNfQkFTRV9MTwkJMHgxZTMwCisjZGVmaW5lIE1WNjR4NjBfUENJMF9BQ0NfQ05UTF8zX0JBU0VfSEkJCTB4MWUzNAorI2RlZmluZSBNVjY0eDYwX1BDSTBfQUNDX0NOVExfM19TSVpFCQkweDFlMzgKKyNkZWZpbmUgTVY2NHg2MF9QQ0kwX0FDQ19DTlRMXzRfQkFTRV9MTwkJMHgxZTQwCisjZGVmaW5lIE1WNjR4NjBfUENJMF9BQ0NfQ05UTF80X0JBU0VfSEkJCTB4MWU0NAorI2RlZmluZSBNVjY0eDYwX1BDSTBfQUNDX0NOVExfNF9TSVpFCQkweDFlNDgKKyNkZWZpbmUgTVY2NHg2MF9QQ0kwX0FDQ19DTlRMXzVfQkFTRV9MTwkJMHgxZTUwCisjZGVmaW5lIE1WNjR4NjBfUENJMF9BQ0NfQ05UTF81X0JBU0VfSEkJCTB4MWU1NAorI2RlZmluZSBNVjY0eDYwX1BDSTBfQUNDX0NOVExfNV9TSVpFCQkweDFlNTgKKworI2RlZmluZSBNVjY0eDYwX1BDSTFfQkFSX0VOQUJMRQkJCTB4MGNiYworI2RlZmluZSBNVjY0eDYwX1BDSTEyTUVNXzBfU0laRQkJCTB4MGM4OAorI2RlZmluZSBNVjY0eDYwX1BDSTFfQUNDX0NOVExfMF9CQVNFX0xPCQkweDFlODAKKyNkZWZpbmUgTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzBfQkFTRV9ISQkJMHgxZTg0CisjZGVmaW5lIE1WNjR4NjBfUENJMV9BQ0NfQ05UTF8wX1NJWkUJCTB4MWU4OAorI2RlZmluZSBNVjY0eDYwX1BDSTFfQUNDX0NOVExfMV9CQVNFX0xPCQkweDFlOTAKKyNkZWZpbmUgTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzFfQkFTRV9ISQkJMHgxZTk0CisjZGVmaW5lIE1WNjR4NjBfUENJMV9BQ0NfQ05UTF8xX1NJWkUJCTB4MWU5OAorI2RlZmluZSBNVjY0eDYwX1BDSTFfQUNDX0NOVExfMl9CQVNFX0xPCQkweDFlYTAKKyNkZWZpbmUgTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzJfQkFTRV9ISQkJMHgxZWE0CisjZGVmaW5lIE1WNjR4NjBfUENJMV9BQ0NfQ05UTF8yX1NJWkUJCTB4MWVhOAorI2RlZmluZSBNVjY0eDYwX1BDSTFfQUNDX0NOVExfM19CQVNFX0xPCQkweDFlYjAKKyNkZWZpbmUgTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzNfQkFTRV9ISQkJMHgxZWI0CisjZGVmaW5lIE1WNjR4NjBfUENJMV9BQ0NfQ05UTF8zX1NJWkUJCTB4MWViOAorI2RlZmluZSBNVjY0eDYwX1BDSTFfQUNDX0NOVExfNF9CQVNFX0xPCQkweDFlYzAKKyNkZWZpbmUgTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzRfQkFTRV9ISQkJMHgxZWM0CisjZGVmaW5lIE1WNjR4NjBfUENJMV9BQ0NfQ05UTF80X1NJWkUJCTB4MWVjOAorI2RlZmluZSBNVjY0eDYwX1BDSTFfQUNDX0NOVExfNV9CQVNFX0xPCQkweDFlZDAKKyNkZWZpbmUgTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzVfQkFTRV9ISQkJMHgxZWQ0CisjZGVmaW5lIE1WNjR4NjBfUENJMV9BQ0NfQ05UTF81X1NJWkUJCTB4MWVkOAorCisjZGVmaW5lIE1WNjR4NjBfQ1BVMlBDSV9TV0FQX05PTkUJCTB4MDEwMDAwMDAKKworI2RlZmluZSBNVjY0eDYwX0NQVTJQQ0kwX0lPX0JBU0UJCTB4MDA0OAorI2RlZmluZSBNVjY0eDYwX0NQVTJQQ0kwX0lPX1NJWkUJCTB4MDA1MAorI2RlZmluZSBNVjY0eDYwX0NQVTJQQ0kwX0lPX1JFTUFQCQkweDAwZjAKKyNkZWZpbmUgTVY2NHg2MF9DUFUyUENJMF9NRU1fMF9CQVNFCQkweDAwNTgKKyNkZWZpbmUgTVY2NHg2MF9DUFUyUENJMF9NRU1fMF9TSVpFCQkweDAwNjAKKyNkZWZpbmUgTVY2NHg2MF9DUFUyUENJMF9NRU1fMF9SRU1BUF9MTwkJMHgwMGY4CisjZGVmaW5lIE1WNjR4NjBfQ1BVMlBDSTBfTUVNXzBfUkVNQVBfSEkJCTB4MDMyMAorCisjZGVmaW5lIE1WNjR4NjBfQ1BVMlBDSTFfSU9fQkFTRQkJMHgwMDkwCisjZGVmaW5lIE1WNjR4NjBfQ1BVMlBDSTFfSU9fU0laRQkJMHgwMDk4CisjZGVmaW5lIE1WNjR4NjBfQ1BVMlBDSTFfSU9fUkVNQVAJCTB4MDEwOAorI2RlZmluZSBNVjY0eDYwX0NQVTJQQ0kxX01FTV8wX0JBU0UJCTB4MDBhMAorI2RlZmluZSBNVjY0eDYwX0NQVTJQQ0kxX01FTV8wX1NJWkUJCTB4MDBhOAorI2RlZmluZSBNVjY0eDYwX0NQVTJQQ0kxX01FTV8wX1JFTUFQX0xPCQkweDAxMTAKKyNkZWZpbmUgTVY2NHg2MF9DUFUyUENJMV9NRU1fMF9SRU1BUF9ISQkJMHgwMzQwCisKK3N0cnVjdCBtdjY0eDYwX21lbV93aW4geworCXUzMiBoaTsKKwl1MzIgbG87CisJdTMyIHNpemU7Cit9OworCitzdHJ1Y3QgbXY2NHg2MF9wY2lfd2luIHsKKwl1MzIgZmNuOworCXUzMiBoaTsKKwl1MzIgbG87CisJdTMyIHNpemU7Cit9OworCisvKiBQQ0kgY29uZmlnIGFjY2VzcyByb3V0aW5lcyAqLworc3RydWN0IHsKKwl1MzIgYWRkcjsKKwl1MzIgZGF0YTsKK30gc3RhdGljIG12NjR4NjBfcGNpX2NmZ2lvWzJdID0geworCXsgLyogaG9zZSAwICovCisJCS5hZGRyCT0gMHhjZjgsCisJCS5kYXRhCT0gMHhjZmMsCisJfSwKKwl7IC8qIGhvc2UgMSAqLworCQkuYWRkcgk9IDB4Yzc4LAorCQkuZGF0YQk9IDB4YzdjLAorCX0KK307CisKK3UzMiBtdjY0eDYwX2NmZ19yZWFkKHU4ICpicmlkZ2VfYmFzZSwgdTggaG9zZSwgdTggYnVzLCB1OCBkZXZmbiwgdTggb2Zmc2V0KQoreworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBtdjY0eDYwX3BjaV9jZmdpb1tob3NlXS5hZGRyKSwKKwkJCSgxIDw8IDMxKSB8IChidXMgPDwgMTYpIHwgKGRldmZuIDw8IDgpIHwgb2Zmc2V0KTsKKwlyZXR1cm4gaW5fbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgbXY2NHg2MF9wY2lfY2ZnaW9baG9zZV0uZGF0YSkpOworfQorCit2b2lkIG12NjR4NjBfY2ZnX3dyaXRlKHU4ICpicmlkZ2VfYmFzZSwgdTggaG9zZSwgdTggYnVzLCB1OCBkZXZmbiwgdTggb2Zmc2V0LAorCQl1MzIgdmFsKQoreworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBtdjY0eDYwX3BjaV9jZmdpb1tob3NlXS5hZGRyKSwKKwkJCSgxIDw8IDMxKSB8IChidXMgPDwgMTYpIHwgKGRldmZuIDw8IDgpIHwgb2Zmc2V0KTsKKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgbXY2NHg2MF9wY2lfY2ZnaW9baG9zZV0uZGF0YSksIHZhbCk7Cit9CisKKy8qIEkvTyBjdGxyIC0+IHN5c3RlbSBtZW1vcnkgc2V0dXAgKi8KK3N0YXRpYyBzdHJ1Y3QgbXY2NHg2MF9tZW1fd2luIG12NjR4NjBfY3B1Mm1lbVtNVjY0eDYwX0NQVTJNRU1fV0lORE9XU10gPSB7CisJeworCQkubG8JPSBNVjY0eDYwX0NQVTJNRU1fMF9CQVNFLAorCQkuc2l6ZQk9IE1WNjR4NjBfQ1BVMk1FTV8wX1NJWkUsCisJfSwKKwl7CisJCS5sbwk9IE1WNjR4NjBfQ1BVMk1FTV8xX0JBU0UsCisJCS5zaXplCT0gTVY2NHg2MF9DUFUyTUVNXzFfU0laRSwKKwl9LAorCXsKKwkJLmxvCT0gTVY2NHg2MF9DUFUyTUVNXzJfQkFTRSwKKwkJLnNpemUJPSBNVjY0eDYwX0NQVTJNRU1fMl9TSVpFLAorCX0sCisJeworCQkubG8JPSBNVjY0eDYwX0NQVTJNRU1fM19CQVNFLAorCQkuc2l6ZQk9IE1WNjR4NjBfQ1BVMk1FTV8zX1NJWkUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXY2NHg2MF9tZW1fd2luIG12NjR4NjBfZW5ldDJtZW1bTVY2NHg2MF9DUFUyTUVNX1dJTkRPV1NdID0geworCXsKKwkJLmxvCT0gTVY2NHg2MF9FTkVUMk1FTV8wX0JBU0UsCisJCS5zaXplCT0gTVY2NHg2MF9FTkVUMk1FTV8wX1NJWkUsCisJfSwKKwl7CisJCS5sbwk9IE1WNjR4NjBfRU5FVDJNRU1fMV9CQVNFLAorCQkuc2l6ZQk9IE1WNjR4NjBfRU5FVDJNRU1fMV9TSVpFLAorCX0sCisJeworCQkubG8JPSBNVjY0eDYwX0VORVQyTUVNXzJfQkFTRSwKKwkJLnNpemUJPSBNVjY0eDYwX0VORVQyTUVNXzJfU0laRSwKKwl9LAorCXsKKwkJLmxvCT0gTVY2NHg2MF9FTkVUMk1FTV8zX0JBU0UsCisJCS5zaXplCT0gTVY2NHg2MF9FTkVUMk1FTV8zX1NJWkUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXY2NHg2MF9tZW1fd2luIG12NjR4NjBfbXBzYzJtZW1bTVY2NHg2MF9DUFUyTUVNX1dJTkRPV1NdID0geworCXsKKwkJLmxvCT0gTVY2NHg2MF9NUFNDMk1FTV8wX0JBU0UsCisJCS5zaXplCT0gTVY2NHg2MF9NUFNDMk1FTV8wX1NJWkUsCisJfSwKKwl7CisJCS5sbwk9IE1WNjR4NjBfTVBTQzJNRU1fMV9CQVNFLAorCQkuc2l6ZQk9IE1WNjR4NjBfTVBTQzJNRU1fMV9TSVpFLAorCX0sCisJeworCQkubG8JPSBNVjY0eDYwX01QU0MyTUVNXzJfQkFTRSwKKwkJLnNpemUJPSBNVjY0eDYwX01QU0MyTUVNXzJfU0laRSwKKwl9LAorCXsKKwkJLmxvCT0gTVY2NHg2MF9NUFNDMk1FTV8zX0JBU0UsCisJCS5zaXplCT0gTVY2NHg2MF9NUFNDMk1FTV8zX1NJWkUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXY2NHg2MF9tZW1fd2luIG12NjR4NjBfaWRtYTJtZW1bTVY2NHg2MF9DUFUyTUVNX1dJTkRPV1NdID0geworCXsKKwkJLmxvCT0gTVY2NHg2MF9JRE1BMk1FTV8wX0JBU0UsCisJCS5zaXplCT0gTVY2NHg2MF9JRE1BMk1FTV8wX1NJWkUsCisJfSwKKwl7CisJCS5sbwk9IE1WNjR4NjBfSURNQTJNRU1fMV9CQVNFLAorCQkuc2l6ZQk9IE1WNjR4NjBfSURNQTJNRU1fMV9TSVpFLAorCX0sCisJeworCQkubG8JPSBNVjY0eDYwX0lETUEyTUVNXzJfQkFTRSwKKwkJLnNpemUJPSBNVjY0eDYwX0lETUEyTUVNXzJfU0laRSwKKwl9LAorCXsKKwkJLmxvCT0gTVY2NHg2MF9JRE1BMk1FTV8zX0JBU0UsCisJCS5zaXplCT0gTVY2NHg2MF9JRE1BMk1FTV8zX1NJWkUsCisJfSwKK307CisKK3N0YXRpYyB1MzIgbXY2NHg2MF9kcmFtX3NlbGVjdHNbTVY2NHg2MF9DUFUyTUVNX1dJTkRPV1NdID0gezB4ZSwweGQsMHhiLDB4N307CisKKy8qCisgKiBFTkVULCBNUFNDLCBhbmQgSURNQSBjdGxycyBvbiB0aGUgTVY2NHg2MCBoYXZlIHNlcGFyYXRlIHdpbmRvd3MgdGhhdAorICogbXVzdCBiZSBzZXQgdXAgc28gdGhhdCB0aGUgcmVzcGVjdGl2ZSBjdGxyIGNhbiBhY2Nlc3Mgc3lzdGVtIG1lbW9yeS4KKyAqIENvbmZpZ3VyZSB0aGVtIHRvIGJlIHNhbWUgYXMgY3B1LT5tZW1vcnkgd2luZG93cy4KKyAqLwordm9pZCBtdjY0eDYwX2NvbmZpZ19jdGxyX3dpbmRvd3ModTggKmJyaWRnZV9iYXNlLCB1OCAqYnJpZGdlX3BiYXNlLAorCQl1OCBpc19jb2hlcmVudCkKK3sKKwl1MzIgaSwgYmFzZSwgc2l6ZSwgZW5hYmxlcywgcHJvdCA9IDAsIHNub29wX2JpdHMgPSAwOworCisJLyogRGlzYWJsZSBjdGxyLT5tZW0gd2luZG93cyAqLworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBNVjY0eDYwX0VORVQyTUVNX0JBUl9FTkFCTEUpLCAweDNmKTsKKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9NUFNDMk1FTV9CQVJfRU5BQkxFKSwgMHhmKTsKKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9FTkVUMk1FTV9CQVJfRU5BQkxFKSwgMHhmZik7CisKKwlpZiAoaXNfY29oZXJlbnQpCisJCXNub29wX2JpdHMgPSAweDIgPDwgMTI7IC8qIFdyaXRlYmFjayAqLworCisJZW5hYmxlcyA9IGluX2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfQ1BVX0JBUl9FTkFCTEUpKSAmIDB4ZjsKKworCWZvciAoaT0wOyBpPE1WNjR4NjBfQ1BVMk1FTV9XSU5ET1dTOyBpKyspIHsKKwkJaWYgKGVuYWJsZXMgJiAoMSA8PCBpKSkgLyogU2V0IG1lYW5zIGRpc2FibGVkICovCisJCQljb250aW51ZTsKKworCQliYXNlID0gaW5fbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgbXY2NHg2MF9jcHUybWVtW2ldLmxvKSkKKwkJCTw8IDE2OworCQliYXNlIHw9IHNub29wX2JpdHMgfCAobXY2NHg2MF9kcmFtX3NlbGVjdHNbaV0gPDwgOCk7CisJCXNpemUgPSBpbl9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBtdjY0eDYwX2NwdTJtZW1baV0uc2l6ZSkpCisJCQk8PCAxNjsKKwkJcHJvdCB8PSAoMHgzIDw8IChpIDw8IDEpKTsgLyogUlcgYWNjZXNzICovCisKKwkJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIG12NjR4NjBfZW5ldDJtZW1baV0ubG8pLCBiYXNlKTsKKwkJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIG12NjR4NjBfZW5ldDJtZW1baV0uc2l6ZSksIHNpemUpOworCQlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgbXY2NHg2MF9tcHNjMm1lbVtpXS5sbyksIGJhc2UpOworCQlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgbXY2NHg2MF9tcHNjMm1lbVtpXS5zaXplKSwgc2l6ZSk7CisJCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBtdjY0eDYwX2lkbWEybWVtW2ldLmxvKSwgYmFzZSk7CisJCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBtdjY0eDYwX2lkbWEybWVtW2ldLnNpemUpLCBzaXplKTsKKwl9CisKKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9FTkVUMk1FTV9BQ0NfUFJPVF8wKSwgcHJvdCk7CisJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfRU5FVDJNRU1fQUNDX1BST1RfMSksIHByb3QpOworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBNVjY0eDYwX0VORVQyTUVNX0FDQ19QUk9UXzIpLCBwcm90KTsKKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9NUFNDMk1FTV9BQ0NfUFJPVF8wKSwgcHJvdCk7CisJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfTVBTQzJNRU1fQUNDX1BST1RfMSksIHByb3QpOworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBNVjY0eDYwX0lETUEyTUVNX0FDQ19QUk9UXzApLCBwcm90KTsKKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9JRE1BMk1FTV9BQ0NfUFJPVF8xKSwgcHJvdCk7CisJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfSURNQTJNRU1fQUNDX1BST1RfMiksIHByb3QpOworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBNVjY0eDYwX0lETUEyTUVNX0FDQ19QUk9UXzMpLCBwcm90KTsKKworCS8qIFNldCBtcHNjLT5icmlkZ2UncyByZWcgd2luZG93IHRvIHRoZSBicmlkZ2UncyBpbnRlcm5hbCByZWdpc3RlcnMuICovCisJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfTVBTQzJSRUdTX0JBU0UpLAorCQkJKHUzMilicmlkZ2VfcGJhc2UpOworCisJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfRU5FVDJNRU1fQkFSX0VOQUJMRSksIGVuYWJsZXMpOworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBNVjY0eDYwX01QU0MyTUVNX0JBUl9FTkFCTEUpLCBlbmFibGVzKTsKKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9JRE1BMk1FTV9CQVJfRU5BQkxFKSwgZW5hYmxlcyk7Cit9CisKKy8qIFBDSSBNRU0gLT4gc3lzdGVtIG1lbW9yeSwgZXQuIGFsLiBzZXR1cCAqLworc3RhdGljIHN0cnVjdCBtdjY0eDYwX3BjaV93aW4gbXY2NHg2MF9wY2kybWVtWzJdID0geworCXsgLyogaG9zZSAwICovCisJCS5mY24JPSAwLAorCQkuaGkJPSAweDE0LAorCQkubG8JPSAweDEwLAorCQkuc2l6ZQk9IE1WNjR4NjBfUENJMDJNRU1fMF9TSVpFLAorCX0sCisJeyAvKiBob3NlIDEgKi8KKwkJLmZjbgk9IDAsCisJCS5oaQk9IDB4OTQsCisJCS5sbwk9IDB4OTAsCisJCS5zaXplCT0gTVY2NHg2MF9QQ0kxMk1FTV8wX1NJWkUsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QKK212NjR4NjBfbWVtX3dpbiBtdjY0eDYwX3BjaV9hY2NbMl1bTVY2NHg2MF9QQ0lfQUNDX0NOVExfV0lORE9XU10gPSB7CisJeyAvKiBob3NlIDAgKi8KKwkJeworCQkJLmhpCT0gTVY2NHg2MF9QQ0kwX0FDQ19DTlRMXzBfQkFTRV9ISSwKKwkJCS5sbwk9IE1WNjR4NjBfUENJMF9BQ0NfQ05UTF8wX0JBU0VfTE8sCisJCQkuc2l6ZQk9IE1WNjR4NjBfUENJMF9BQ0NfQ05UTF8wX1NJWkUsCisJCX0sCisJCXsKKwkJCS5oaQk9IE1WNjR4NjBfUENJMF9BQ0NfQ05UTF8xX0JBU0VfSEksCisJCQkubG8JPSBNVjY0eDYwX1BDSTBfQUNDX0NOVExfMV9CQVNFX0xPLAorCQkJLnNpemUJPSBNVjY0eDYwX1BDSTBfQUNDX0NOVExfMV9TSVpFLAorCQl9LAorCQl7CisJCQkuaGkJPSBNVjY0eDYwX1BDSTBfQUNDX0NOVExfMl9CQVNFX0hJLAorCQkJLmxvCT0gTVY2NHg2MF9QQ0kwX0FDQ19DTlRMXzJfQkFTRV9MTywKKwkJCS5zaXplCT0gTVY2NHg2MF9QQ0kwX0FDQ19DTlRMXzJfU0laRSwKKwkJfSwKKwkJeworCQkJLmhpCT0gTVY2NHg2MF9QQ0kwX0FDQ19DTlRMXzNfQkFTRV9ISSwKKwkJCS5sbwk9IE1WNjR4NjBfUENJMF9BQ0NfQ05UTF8zX0JBU0VfTE8sCisJCQkuc2l6ZQk9IE1WNjR4NjBfUENJMF9BQ0NfQ05UTF8zX1NJWkUsCisJCX0sCisJfSwKKwl7IC8qIGhvc2UgMSAqLworCQl7CisJCQkuaGkJPSBNVjY0eDYwX1BDSTFfQUNDX0NOVExfMF9CQVNFX0hJLAorCQkJLmxvCT0gTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzBfQkFTRV9MTywKKwkJCS5zaXplCT0gTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzBfU0laRSwKKwkJfSwKKwkJeworCQkJLmhpCT0gTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzFfQkFTRV9ISSwKKwkJCS5sbwk9IE1WNjR4NjBfUENJMV9BQ0NfQ05UTF8xX0JBU0VfTE8sCisJCQkuc2l6ZQk9IE1WNjR4NjBfUENJMV9BQ0NfQ05UTF8xX1NJWkUsCisJCX0sCisJCXsKKwkJCS5oaQk9IE1WNjR4NjBfUENJMV9BQ0NfQ05UTF8yX0JBU0VfSEksCisJCQkubG8JPSBNVjY0eDYwX1BDSTFfQUNDX0NOVExfMl9CQVNFX0xPLAorCQkJLnNpemUJPSBNVjY0eDYwX1BDSTFfQUNDX0NOVExfMl9TSVpFLAorCQl9LAorCQl7CisJCQkuaGkJPSBNVjY0eDYwX1BDSTFfQUNDX0NOVExfM19CQVNFX0hJLAorCQkJLmxvCT0gTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzNfQkFTRV9MTywKKwkJCS5zaXplCT0gTVY2NHg2MF9QQ0kxX0FDQ19DTlRMXzNfU0laRSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBtdjY0eDYwX21lbV93aW4gbXY2NHg2MF9wY2kycmVnWzJdID0geworCXsKKwkJLmhpCT0gMHgyNCwKKwkJLmxvCT0gMHgyMCwKKwkJLnNpemUJPSAwLAorCX0sCisJeworCQkuaGkJPSAweGE0LAorCQkubG8JPSAweGEwLAorCQkuc2l6ZQk9IDAsCisJfSwKK307CisKKy8qIE9ubHkgbmVlZCB0byB1c2UgMSB3aW5kb3cgKHBlciBob3NlKSB0byBnZXQgYWNjZXNzIHRvIGFsbCBvZiBzeXN0ZW0gbWVtb3J5ICovCit2b2lkIG12NjR4NjBfY29uZmlnX3BjaV93aW5kb3dzKHU4ICpicmlkZ2VfYmFzZSwgdTggKmJyaWRnZV9wYmFzZSwgdTggaG9zZSwKKwkJdTggYnVzLCB1MzIgbWVtX3NpemUsIHUzMiBhY2NfYml0cykKK3sKKwl1MzIgaSwgb2Zmc2V0LCBiYXJfZW5hYmxlLCBlbmFibGVzOworCisJLyogRGlzYWJsZSBhbGwgd2luZG93cyBidXQgUENJIE1FTSAtPiBCcmlkZ2UncyByZWdzIHdpbmRvdyAqLworCWVuYWJsZXMgPSB+KDEgPDwgOSk7CisJYmFyX2VuYWJsZSA9IGhvc2UgPyBNVjY0eDYwX1BDSTFfQkFSX0VOQUJMRSA6IE1WNjR4NjBfUENJMF9CQVJfRU5BQkxFOworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBiYXJfZW5hYmxlKSwgZW5hYmxlcyk7CisKKwlmb3IgKGk9MDsgaTxNVjY0eDYwX1BDSV9BQ0NfQ05UTF9XSU5ET1dTOyBpKyspCisJCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBtdjY0eDYwX3BjaV9hY2NbaG9zZV1baV0ubG8pLCAwKTsKKworCS8qIElmIG1lbV9zaXplIGlzIDAsIGxlYXZlIHdpbmRvd3MgZGlzYWJsZWQgKi8KKwlpZiAobWVtX3NpemUgPT0gMCkKKwkJcmV0dXJuOworCisJLyogQ2F1c2UgYXV0b21hdGljIHVwZGF0ZXMgb2YgUENJIHJlbWFwIHJlZ3MgKi8KKwlvZmZzZXQgPSBob3NlID8KKwkJTVY2NHg2MF9QQ0kxX1BDSV9ERUNPREVfQ05UTCA6IE1WNjR4NjBfUENJMF9QQ0lfREVDT0RFX0NOVEw7CisJaSA9IGluX2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIG9mZnNldCkpOworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBvZmZzZXQpLCBpICYgfjB4MSk7CisKKwltZW1fc2l6ZSA9IChtZW1fc2l6ZSAtIDEpICYgMHhmZmZmZjAwMDsKKworCS8qIE1hcCBQQ0kgTUVNIGFkZHIgMCAtPiBTeXN0ZW0gTWVtIGFkZHIgMCAqLworCW12NjR4NjBfY2ZnX3dyaXRlKGJyaWRnZV9iYXNlLCBob3NlLCBidXMsCisJCQlQQ0lfREVWRk4oMCwgbXY2NHg2MF9wY2kybWVtW2hvc2VdLmZjbiksCisJCQltdjY0eDYwX3BjaTJtZW1baG9zZV0uaGksIDApOworCW12NjR4NjBfY2ZnX3dyaXRlKGJyaWRnZV9iYXNlLCBob3NlLCBidXMsCisJCQlQQ0lfREVWRk4oMCwgbXY2NHg2MF9wY2kybWVtW2hvc2VdLmZjbiksCisJCQltdjY0eDYwX3BjaTJtZW1baG9zZV0ubG8sIDApOworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBtdjY0eDYwX3BjaTJtZW1baG9zZV0uc2l6ZSksbWVtX3NpemUpOworCisJYWNjX2JpdHMgfD0gTVY2NHg2MF9QQ0lfQUNDX0NOVExfRU5BQkxFOworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBtdjY0eDYwX3BjaV9hY2NbaG9zZV1bMF0uaGkpLCAwKTsKKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgbXY2NHg2MF9wY2lfYWNjW2hvc2VdWzBdLmxvKSwgYWNjX2JpdHMpOworCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBtdjY0eDYwX3BjaV9hY2NbaG9zZV1bMF0uc2l6ZSksbWVtX3NpemUpOworCisJLyogU2V0IFBDSSBNRU0tPmJyaWRnZSdzIHJlZyB3aW5kb3cgdG8gd2hlcmUgdGhleSBhcmUgaW4gQ1BVIG1lbSBtYXAgKi8KKwlpID0gKHUzMilicmlkZ2VfYmFzZTsKKwlpICY9IDB4ZmZmZjAwMDA7CisJaSB8PSAoMHgyIDw8IDEpOworCW12NjR4NjBfY2ZnX3dyaXRlKGJyaWRnZV9iYXNlLCBob3NlLCBidXMsIFBDSV9ERVZGTigwLDApLAorCQkJbXY2NHg2MF9wY2kycmVnW2hvc2VdLmhpLCAwKTsKKwltdjY0eDYwX2NmZ193cml0ZShicmlkZ2VfYmFzZSwgaG9zZSwgYnVzLCBQQ0lfREVWRk4oMCwwKSwKKwkJCW12NjR4NjBfcGNpMnJlZ1tob3NlXS5sbywgaSk7CisKKwllbmFibGVzICY9IH4weDE7IC8qIEVuYWJsZSBQQ0kgTUVNIC0+IFN5c3RlbSBNZW0gd2luZG93IDAgKi8KKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgYmFyX2VuYWJsZSksIGVuYWJsZXMpOworfQorCisvKiBDUFUgLT4gUENJIEkvTyAmIE1FTSBzZXR1cCAqLworc3RydWN0IG12NjR4NjBfY3B1MnBjaV93aW4gbXY2NHg2MF9jcHUycGNpX2lvWzJdID0geworCXsgLyogaG9zZSAwICovCisJCS5sbwkJPSBNVjY0eDYwX0NQVTJQQ0kwX0lPX0JBU0UsCisJCS5zaXplCQk9IE1WNjR4NjBfQ1BVMlBDSTBfSU9fU0laRSwKKwkJLnJlbWFwX2hpCT0gMCwKKwkJLnJlbWFwX2xvCT0gTVY2NHg2MF9DUFUyUENJMF9JT19SRU1BUCwKKwl9LAorCXsgLyogaG9zZSAxICovCisJCS5sbwkJPSBNVjY0eDYwX0NQVTJQQ0kxX0lPX0JBU0UsCisJCS5zaXplCQk9IE1WNjR4NjBfQ1BVMlBDSTFfSU9fU0laRSwKKwkJLnJlbWFwX2hpCT0gMCwKKwkJLnJlbWFwX2xvCT0gTVY2NHg2MF9DUFUyUENJMV9JT19SRU1BUCwKKwl9LAorfTsKKworc3RydWN0IG12NjR4NjBfY3B1MnBjaV93aW4gbXY2NHg2MF9jcHUycGNpX21lbVsyXSA9IHsKKwl7IC8qIGhvc2UgMCAqLworCQkubG8JCT0gTVY2NHg2MF9DUFUyUENJMF9NRU1fMF9CQVNFLAorCQkuc2l6ZQkJPSBNVjY0eDYwX0NQVTJQQ0kwX01FTV8wX1NJWkUsCisJCS5yZW1hcF9oaQk9IE1WNjR4NjBfQ1BVMlBDSTBfTUVNXzBfUkVNQVBfSEksCisJCS5yZW1hcF9sbwk9IE1WNjR4NjBfQ1BVMlBDSTBfTUVNXzBfUkVNQVBfTE8sCisJfSwKKwl7IC8qIGhvc2UgMSAqLworCQkubG8JCT0gTVY2NHg2MF9DUFUyUENJMV9NRU1fMF9CQVNFLAorCQkuc2l6ZQkJPSBNVjY0eDYwX0NQVTJQQ0kxX01FTV8wX1NJWkUsCisJCS5yZW1hcF9oaQk9IE1WNjR4NjBfQ1BVMlBDSTFfTUVNXzBfUkVNQVBfSEksCisJCS5yZW1hcF9sbwk9IE1WNjR4NjBfQ1BVMlBDSTFfTUVNXzBfUkVNQVBfTE8sCisJfSwKK307CisKKy8qIE9ubHkgbmVlZCB0byBzZXQgdXAgMSB3aW5kb3cgdG8gcGNpIG1lbSBzcGFjZSAqLwordm9pZCBtdjY0eDYwX2NvbmZpZ19jcHUycGNpX3dpbmRvdyh1OCAqYnJpZGdlX2Jhc2UsIHU4IGhvc2UsIHUzMiBwY2lfYmFzZV9oaSwKKwkJdTMyIHBjaV9iYXNlX2xvLCB1MzIgY3B1X2Jhc2UsIHUzMiBzaXplLAorCQlzdHJ1Y3QgbXY2NHg2MF9jcHUycGNpX3dpbiAqb2Zmc2V0X3RibCkKK3sKKwljcHVfYmFzZSA+Pj0gMTY7CisJY3B1X2Jhc2UgfD0gTVY2NHg2MF9DUFUyUENJX1NXQVBfTk9ORTsKKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgb2Zmc2V0X3RibFtob3NlXS5sbyksIGNwdV9iYXNlKTsKKworCWlmIChvZmZzZXRfdGJsW2hvc2VdLnJlbWFwX2hpICE9IDApCisJCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBvZmZzZXRfdGJsW2hvc2VdLnJlbWFwX2hpKSwKKwkJCQlwY2lfYmFzZV9oaSk7CisJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIG9mZnNldF90YmxbaG9zZV0ucmVtYXBfbG8pLAorCQkJcGNpX2Jhc2VfbG8gPj4gMTYpOworCisJc2l6ZSA9IChzaXplIC0gMSkgPj4gMTY7CisJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIG9mZnNldF90YmxbaG9zZV0uc2l6ZSksIHNpemUpOworfQorCisvKiBSZWFkIG1lbSBjdGxyIHRvIGdldCB0aGUgYW1vdW50IG9mIG1lbSBpbiBzeXN0ZW0gKi8KK3UzMiBtdjY0eDYwX2dldF9tZW1fc2l6ZSh1OCAqYnJpZGdlX2Jhc2UpCit7CisJdTMyIGVuYWJsZXMsIGksIHY7CisJdTMyIG1lbSA9IDA7CisKKwllbmFibGVzID0gaW5fbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9DUFVfQkFSX0VOQUJMRSkpICYgMHhmOworCisJZm9yIChpPTA7IGk8TVY2NHg2MF9DUFUyTUVNX1dJTkRPV1M7IGkrKykKKwkJaWYgKCEoZW5hYmxlcyAmICgxPDxpKSkpIHsKKwkJCXYgPSBpbl9sZTMyKCh1MzIqKShicmlkZ2VfYmFzZQorCQkJCQkJKyBtdjY0eDYwX2NwdTJtZW1baV0uc2l6ZSkpOworCQkJdiA9ICgodiAmIDB4ZmZmZikgKyAxKSA8PCAxNjsKKwkJCW1lbSArPSB2OworCQl9CisKKwlyZXR1cm4gbWVtOworfQorCisvKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBicmlkZ2UncyByZWdpc3RlcnMgKi8KK3U4ICptdjY0eDYwX2dldF9icmlkZ2VfcGJhc2Uodm9pZCkKK3sKKwl1MzIgdlsyXTsKKwl2b2lkICpkZXZwOworCisJZGV2cCA9IGZpbmRkZXZpY2UoIi9tdjY0eDYwIik7CisJaWYgKGRldnAgPT0gTlVMTCkKKwkJZ290byBlcnJfb3V0OworCWlmIChnZXRwcm9wKGRldnAsICJyZWciLCB2LCBzaXplb2YodikpICE9IHNpemVvZih2KSkKKwkJZ290byBlcnJfb3V0OworCisJcmV0dXJuICh1OCAqKXZbMF07CisKK2Vycl9vdXQ6CisJcmV0dXJuIDA7Cit9CisKKy8qIEdldCB2aXJ0dWFsIGFkZHJlc3Mgb2YgYnJpZGdlJ3MgcmVnaXN0ZXJzICovCit1OCAqbXY2NHg2MF9nZXRfYnJpZGdlX2Jhc2Uodm9pZCkKK3sKKwl1MzIgdjsKKwl2b2lkICpkZXZwOworCisJZGV2cCA9IGZpbmRkZXZpY2UoIi9tdjY0eDYwIik7CisJaWYgKGRldnAgPT0gTlVMTCkKKwkJZ290byBlcnJfb3V0OworCWlmIChnZXRwcm9wKGRldnAsICJ2aXJ0dWFsLXJlZyIsICZ2LCBzaXplb2YodikpICE9IHNpemVvZih2KSkKKwkJZ290byBlcnJfb3V0OworCisJcmV0dXJuICh1OCAqKXY7CisKK2Vycl9vdXQ6CisJcmV0dXJuIDA7Cit9CisKK3U4IG12NjR4NjBfaXNfY29oZXJlbnQodm9pZCkKK3sKKwl1MzIgdjsKKwl2b2lkICpkZXZwOworCisJZGV2cCA9IGZpbmRkZXZpY2UoIi8iKTsKKwlpZiAoZGV2cCA9PSBOVUxMKQorCQlyZXR1cm4gMTsgLyogQXNzdW1lIGNvaGVyZW5jeSBvbiAqLworCisJaWYgKGdldHByb3AoZGV2cCwgImNvaGVyZW5jeS1vZmYiLCAmdiwgc2l6ZW9mKHYpKSA8IDApCisJCXJldHVybiAxOyAvKiBDb2hlcmVuY3kgb24gKi8KKwllbHNlCisJCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbXY2NHg2MC5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbXY2NHg2MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjcxMDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9tdjY0eDYwLmgKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIEF1dGhvcjogTWFyayBBLiBHcmVlciA8c291cmNlQG12aXN0YS5jb20+CisgKgorICogMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaWZuZGVmIF9QUENfQk9PVF9NVjY0eDYwX0hfCisjZGVmaW5lIF9QUENfQk9PVF9NVjY0eDYwX0hfCisKKyNkZWZpbmUgTVY2NHg2MF9DUFVfQkFSX0VOQUJMRQkJCTB4MDI3OAorCisjZGVmaW5lIE1WNjR4NjBfUENJX0FDQ19DTlRMX0VOQUJMRQkJKDE8PDApCisjZGVmaW5lIE1WNjR4NjBfUENJX0FDQ19DTlRMX1JFUTY0CQkoMTw8MSkKKyNkZWZpbmUgTVY2NHg2MF9QQ0lfQUNDX0NOVExfU05PT1BfTk9ORQkJMHgwMDAwMDAwMAorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9TTk9PUF9XVAkJMHgwMDAwMDAwNAorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9TTk9PUF9XQgkJMHgwMDAwMDAwOAorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9TTk9PUF9NQVNLCQkweDAwMDAwMDBjCisjZGVmaW5lIE1WNjR4NjBfUENJX0FDQ19DTlRMX0FDQ1BST1QJCSgxPDw0KQorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9XUlBST1QJCSgxPDw1KQorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9TV0FQX0JZVEUJCTB4MDAwMDAwMDAKKyNkZWZpbmUgTVY2NHg2MF9QQ0lfQUNDX0NOVExfU1dBUF9OT05FCQkweDAwMDAwMDQwCisjZGVmaW5lIE1WNjR4NjBfUENJX0FDQ19DTlRMX1NXQVBfQllURV9XT1JECTB4MDAwMDAwODAKKyNkZWZpbmUgTVY2NHg2MF9QQ0lfQUNDX0NOVExfU1dBUF9XT1JECQkweDAwMDAwMGMwCisjZGVmaW5lIE1WNjR4NjBfUENJX0FDQ19DTlRMX1NXQVBfTUFTSwkJMHgwMDAwMDBjMAorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9NQlVSU1RfMzJfQllURVMJMHgwMDAwMDAwMAorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9NQlVSU1RfNjRfQllURVMJMHgwMDAwMDEwMAorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9NQlVSU1RfMTI4X0JZVEVTCTB4MDAwMDAyMDAKKyNkZWZpbmUgTVY2NHg2MF9QQ0lfQUNDX0NOVExfTUJVUlNUX01BU0sJMHgwMDAwMDMwMAorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9SRFNJWkVfMzJfQllURVMJMHgwMDAwMDAwMAorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9SRFNJWkVfNjRfQllURVMJMHgwMDAwMDQwMAorI2RlZmluZSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9SRFNJWkVfMTI4X0JZVEVTCTB4MDAwMDA4MDAKKyNkZWZpbmUgTVY2NHg2MF9QQ0lfQUNDX0NOVExfUkRTSVpFXzI1Nl9CWVRFUwkweDAwMDAwYzAwCisjZGVmaW5lIE1WNjR4NjBfUENJX0FDQ19DTlRMX1JEU0laRV9NQVNLCTB4MDAwMDBjMDAKKworc3RydWN0IG12NjR4NjBfY3B1MnBjaV93aW4geworCXUzMiBsbzsKKwl1MzIgc2l6ZTsKKwl1MzIgcmVtYXBfaGk7CisJdTMyIHJlbWFwX2xvOworfTsKKworZXh0ZXJuIHN0cnVjdCBtdjY0eDYwX2NwdTJwY2lfd2luIG12NjR4NjBfY3B1MnBjaV9pb1syXTsKK2V4dGVybiBzdHJ1Y3QgbXY2NHg2MF9jcHUycGNpX3dpbiBtdjY0eDYwX2NwdTJwY2lfbWVtWzJdOworCit1MzIgbXY2NHg2MF9jZmdfcmVhZCh1OCAqYnJpZGdlX2Jhc2UsIHU4IGhvc2UsIHU4IGJ1cywgdTggZGV2Zm4sCisJCXU4IG9mZnNldCk7Cit2b2lkIG12NjR4NjBfY2ZnX3dyaXRlKHU4ICpicmlkZ2VfYmFzZSwgdTggaG9zZSwgdTggYnVzLCB1OCBkZXZmbiwKKwkJdTggb2Zmc2V0LCB1MzIgdmFsKTsKKwordm9pZCBtdjY0eDYwX2NvbmZpZ19jdGxyX3dpbmRvd3ModTggKmJyaWRnZV9iYXNlLCB1OCAqYnJpZGdlX3BiYXNlLAorCQl1OCBpc19jb2hlcmVudCk7Cit2b2lkIG12NjR4NjBfY29uZmlnX3BjaV93aW5kb3dzKHU4ICpicmlkZ2VfYmFzZSwgdTggKmJyaWRnZV9wYmFzZSwgdTggaG9zZSwKKwkJdTggYnVzLCB1MzIgbWVtX3NpemUsIHUzMiBhY2NfYml0cyk7Cit2b2lkIG12NjR4NjBfY29uZmlnX2NwdTJwY2lfd2luZG93KHU4ICpicmlkZ2VfYmFzZSwgdTggaG9zZSwgdTMyIHBjaV9iYXNlX2hpLAorCQl1MzIgcGNpX2Jhc2VfbG8sIHUzMiBjcHVfYmFzZSwgdTMyIHNpemUsCisJCXN0cnVjdCBtdjY0eDYwX2NwdTJwY2lfd2luICpvZmZzZXRfdGJsKTsKK3UzMiBtdjY0eDYwX2dldF9tZW1fc2l6ZSh1OCAqYnJpZGdlX2Jhc2UpOwordTggKm12NjR4NjBfZ2V0X2JyaWRnZV9wYmFzZSh2b2lkKTsKK3U4ICptdjY0eDYwX2dldF9icmlkZ2VfYmFzZSh2b2lkKTsKK3U4IG12NjR4NjBfaXNfY29oZXJlbnQodm9pZCk7CisKK2ludCBtdjY0eDYwX2kyY19vcGVuKHZvaWQpOworaW50IG12NjR4NjBfaTJjX3JlYWQodTMyIGRldmFkZHIsIHU4ICpidWYsIHUzMiBvZmZzZXQsIHUzMiBvZmZzZXRfc2l6ZSwKKwkJdTMyIGNvdW50KTsKK3ZvaWQgbXY2NHg2MF9pMmNfY2xvc2Uodm9pZCk7CisKKyNlbmRpZiAvKiBfUFBDX0JPT1RfTVY2NHg2MF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbXY2NHg2MF9pMmMuYyBiL2FyY2gvcG93ZXJwYy9ib290L212NjR4NjBfaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1ZmU4NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L212NjR4NjBfaTJjLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBCb290bG9hZGVyIHZlcnNpb24gb2YgdGhlIGkyYyBkcml2ZXIgZm9yIHRoZSBNVjY0eDYwLgorICoKKyAqIEF1dGhvcjogRGFsZSBGYXJuc3dvcnRoIDxkZmFybnN3b3J0aEBtdmlzdGEuY29tPgorICogTWFpbnRhaW5lZCBieTogTWFyayBBLiBHcmVlciA8bWdyZWVyQG12aXN0YS5jb20+CisgKgorICogMjAwMywgMjAwNyAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMKKyAqIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvcgorICogaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJlbGYuaCIKKyNpbmNsdWRlICJwYWdlLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJpby5oIgorI2luY2x1ZGUgIm9wcy5oIgorI2luY2x1ZGUgIm12NjR4NjAuaCIKKworZXh0ZXJuIHZvaWQgdWRlbGF5KGxvbmcpOworCisvKiBSZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIE1WNjR4NjBfSTJDX1JFR19TTEFWRV9BRERSCQkJMHgwMAorI2RlZmluZSBNVjY0eDYwX0kyQ19SRUdfREFUQQkJCQkweDA0CisjZGVmaW5lIE1WNjR4NjBfSTJDX1JFR19DT05UUk9MCQkJCTB4MDgKKyNkZWZpbmUgTVY2NHg2MF9JMkNfUkVHX1NUQVRVUwkJCQkweDBjCisjZGVmaW5lIE1WNjR4NjBfSTJDX1JFR19CQVVECQkJCTB4MGMKKyNkZWZpbmUgTVY2NHg2MF9JMkNfUkVHX0VYVF9TTEFWRV9BRERSCQkJMHgxMAorI2RlZmluZSBNVjY0eDYwX0kyQ19SRUdfU09GVF9SRVNFVAkJCTB4MWMKKworI2RlZmluZSBNVjY0eDYwX0kyQ19DT05UUk9MX0FDSwkJCQkweDA0CisjZGVmaW5lIE1WNjR4NjBfSTJDX0NPTlRST0xfSUZMRwkJCTB4MDgKKyNkZWZpbmUgTVY2NHg2MF9JMkNfQ09OVFJPTF9TVE9QCQkJMHgxMAorI2RlZmluZSBNVjY0eDYwX0kyQ19DT05UUk9MX1NUQVJUCQkJMHgyMAorI2RlZmluZSBNVjY0eDYwX0kyQ19DT05UUk9MX1RXU0lFTgkJCTB4NDAKKyNkZWZpbmUgTVY2NHg2MF9JMkNfQ09OVFJPTF9JTlRFTgkJCTB4ODAKKworI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfQlVTX0VSUgkJCTB4MDAKKyNkZWZpbmUgTVY2NHg2MF9JMkNfU1RBVFVTX01BU1RfU1RBUlQJCQkweDA4CisjZGVmaW5lIE1WNjR4NjBfSTJDX1NUQVRVU19NQVNUX1JFUEVBVF9TVEFSVAkJMHgxMAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9XUl9BRERSX0FDSwkJMHgxOAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9XUl9BRERSX05PX0FDSwkJMHgyMAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9XUl9BQ0sJCQkweDI4CisjZGVmaW5lIE1WNjR4NjBfSTJDX1NUQVRVU19NQVNUX1dSX05PX0FDSwkJMHgzMAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9MT1NUX0FSQgkJMHgzOAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9SRF9BRERSX0FDSwkJMHg0MAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9SRF9BRERSX05PX0FDSwkJMHg0OAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9SRF9EQVRBX0FDSwkJMHg1MAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9SRF9EQVRBX05PX0FDSwkJMHg1OAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9XUl9BRERSXzJfQUNLCQkweGQwCisjZGVmaW5lIE1WNjR4NjBfSTJDX1NUQVRVU19NQVNUX1dSX0FERFJfMl9OT19BQ0sJMHhkOAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9SRF9BRERSXzJfQUNLCQkweGUwCisjZGVmaW5lIE1WNjR4NjBfSTJDX1NUQVRVU19NQVNUX1JEX0FERFJfMl9OT19BQ0sJMHhlOAorI2RlZmluZSBNVjY0eDYwX0kyQ19TVEFUVVNfTk9fU1RBVFVTCQkJMHhmOAorCitzdGF0aWMgdTggKmN0bHJfYmFzZTsKKworc3RhdGljIGludCBtdjY0eDYwX2kyY193YWl0X2Zvcl9zdGF0dXMoaW50IHdhbnRlZCkKK3sKKwlpbnQgaTsKKwlpbnQgc3RhdHVzOworCisJZm9yIChpPTA7IGk8MTAwMDsgaSsrKSB7CisJCXVkZWxheSgxMCk7CisJCXN0YXR1cyA9IGluX2xlMzIoKHUzMiAqKShjdGxyX2Jhc2UgKyBNVjY0eDYwX0kyQ19SRUdfU1RBVFVTKSkKKwkJCSYgMHhmZjsKKwkJaWYgKHN0YXR1cyA9PSB3YW50ZWQpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlyZXR1cm4gLXN0YXR1czsKK30KKworc3RhdGljIGludCBtdjY0eDYwX2kyY19jb250cm9sKGludCBjb250cm9sLCBpbnQgc3RhdHVzKQoreworCW91dF9sZTMyKCh1MzIgKikoY3Rscl9iYXNlICsgTVY2NHg2MF9JMkNfUkVHX0NPTlRST0wpLCBjb250cm9sICYgMHhmZik7CisJcmV0dXJuIG12NjR4NjBfaTJjX3dhaXRfZm9yX3N0YXR1cyhzdGF0dXMpOworfQorCitzdGF0aWMgaW50IG12NjR4NjBfaTJjX3JlYWRfYnl0ZShpbnQgY29udHJvbCwgaW50IHN0YXR1cykKK3sKKwlvdXRfbGUzMigodTMyICopKGN0bHJfYmFzZSArIE1WNjR4NjBfSTJDX1JFR19DT05UUk9MKSwgY29udHJvbCAmIDB4ZmYpOworCWlmIChtdjY0eDYwX2kyY193YWl0X2Zvcl9zdGF0dXMoc3RhdHVzKSA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gaW5fbGUzMigodTMyICopKGN0bHJfYmFzZSArIE1WNjR4NjBfSTJDX1JFR19EQVRBKSkgJiAweGZmOworfQorCitzdGF0aWMgaW50IG12NjR4NjBfaTJjX3dyaXRlX2J5dGUoaW50IGRhdGEsIGludCBjb250cm9sLCBpbnQgc3RhdHVzKQoreworCW91dF9sZTMyKCh1MzIgKikoY3Rscl9iYXNlICsgTVY2NHg2MF9JMkNfUkVHX0RBVEEpLCBkYXRhICYgMHhmZik7CisJb3V0X2xlMzIoKHUzMiAqKShjdGxyX2Jhc2UgKyBNVjY0eDYwX0kyQ19SRUdfQ09OVFJPTCksIGNvbnRyb2wgJiAweGZmKTsKKwlyZXR1cm4gbXY2NHg2MF9pMmNfd2FpdF9mb3Jfc3RhdHVzKHN0YXR1cyk7Cit9CisKK2ludCBtdjY0eDYwX2kyY19yZWFkKHUzMiBkZXZhZGRyLCB1OCAqYnVmLCB1MzIgb2Zmc2V0LCB1MzIgb2Zmc2V0X3NpemUsCisJCSB1MzIgY291bnQpCit7CisJaW50IGk7CisJaW50IGRhdGE7CisJaW50IGNvbnRyb2w7CisJaW50IHN0YXR1czsKKworCWlmIChjdGxyX2Jhc2UgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJLyogc2VuZCByZXNldCAqLworCW91dF9sZTMyKCh1MzIgKikoY3Rscl9iYXNlICsgTVY2NHg2MF9JMkNfUkVHX1NPRlRfUkVTRVQpLCAwKTsKKwlvdXRfbGUzMigodTMyICopKGN0bHJfYmFzZSArIE1WNjR4NjBfSTJDX1JFR19TTEFWRV9BRERSKSwgMCk7CisJb3V0X2xlMzIoKHUzMiAqKShjdGxyX2Jhc2UgKyBNVjY0eDYwX0kyQ19SRUdfRVhUX1NMQVZFX0FERFIpLCAwKTsKKwlvdXRfbGUzMigodTMyICopKGN0bHJfYmFzZSArIE1WNjR4NjBfSTJDX1JFR19CQVVEKSwgKDQgPDwgMykgfCAweDQpOworCisJaWYgKG12NjR4NjBfaTJjX2NvbnRyb2woTVY2NHg2MF9JMkNfQ09OVFJPTF9UV1NJRU4sCisJCQkJTVY2NHg2MF9JMkNfU1RBVFVTX05PX1NUQVRVUykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBzZW5kIHN0YXJ0ICovCisJY29udHJvbCA9IE1WNjR4NjBfSTJDX0NPTlRST0xfU1RBUlQgfCBNVjY0eDYwX0kyQ19DT05UUk9MX1RXU0lFTjsKKwlzdGF0dXMgPSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9TVEFSVDsKKwlpZiAobXY2NHg2MF9pMmNfY29udHJvbChjb250cm9sLCBzdGF0dXMpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJLyogc2VsZWN0IGRldmljZSBmb3Igd3JpdGluZyAqLworCWRhdGEgPSBkZXZhZGRyICYgfjB4MTsKKwljb250cm9sID0gTVY2NHg2MF9JMkNfQ09OVFJPTF9UV1NJRU47CisJc3RhdHVzID0gTVY2NHg2MF9JMkNfU1RBVFVTX01BU1RfV1JfQUREUl9BQ0s7CisJaWYgKG12NjR4NjBfaTJjX3dyaXRlX2J5dGUoZGF0YSwgY29udHJvbCwgc3RhdHVzKSA8IDApCisJCXJldHVybiAtMTsKKworCS8qIHNlbmQgb2Zmc2V0IG9mIGRhdGEgKi8KKwljb250cm9sID0gTVY2NHg2MF9JMkNfQ09OVFJPTF9UV1NJRU47CisJc3RhdHVzID0gTVY2NHg2MF9JMkNfU1RBVFVTX01BU1RfV1JfQUNLOworCWlmIChvZmZzZXRfc2l6ZSA+IDEpIHsKKwkJaWYgKG12NjR4NjBfaTJjX3dyaXRlX2J5dGUob2Zmc2V0ID4+IDgsIGNvbnRyb2wsIHN0YXR1cykgPCAwKQorCQkJcmV0dXJuIC0xOworCX0KKwlpZiAobXY2NHg2MF9pMmNfd3JpdGVfYnl0ZShvZmZzZXQsIGNvbnRyb2wsIHN0YXR1cykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiByZXNlbmQgc3RhcnQgKi8KKwljb250cm9sID0gTVY2NHg2MF9JMkNfQ09OVFJPTF9TVEFSVCB8IE1WNjR4NjBfSTJDX0NPTlRST0xfVFdTSUVOOworCXN0YXR1cyA9IE1WNjR4NjBfSTJDX1NUQVRVU19NQVNUX1JFUEVBVF9TVEFSVDsKKwlpZiAobXY2NHg2MF9pMmNfY29udHJvbChjb250cm9sLCBzdGF0dXMpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJLyogc2VsZWN0IGRldmljZSBmb3IgcmVhZGluZyAqLworCWRhdGEgPSBkZXZhZGRyIHwgMHgxOworCWNvbnRyb2wgPSBNVjY0eDYwX0kyQ19DT05UUk9MX1RXU0lFTjsKKwlzdGF0dXMgPSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9SRF9BRERSX0FDSzsKKwlpZiAobXY2NHg2MF9pMmNfd3JpdGVfYnl0ZShkYXRhLCBjb250cm9sLCBzdGF0dXMpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJLyogcmVhZCBhbGwgYnV0IGxhc3QgYnl0ZSBvZiBkYXRhICovCisJY29udHJvbCA9IE1WNjR4NjBfSTJDX0NPTlRST0xfQUNLIHwgTVY2NHg2MF9JMkNfQ09OVFJPTF9UV1NJRU47CisJc3RhdHVzID0gTVY2NHg2MF9JMkNfU1RBVFVTX01BU1RfUkRfREFUQV9BQ0s7CisKKwlmb3IgKGk9MTsgaTxjb3VudDsgaSsrKSB7CisJCWRhdGEgPSBtdjY0eDYwX2kyY19yZWFkX2J5dGUoY29udHJvbCwgc3RhdHVzKTsKKwkJaWYgKGRhdGEgPCAwKSB7CisJCQlwcmludGYoImVycm9ycyBvbiBpdGVyYXRpb24gJWRcbiIsIGkpOworCQkJcmV0dXJuIC0xOworCQl9CisJCSpidWYrKyA9IGRhdGE7CisJfQorCisJLyogcmVhZCBsYXN0IGJ5dGUgb2YgZGF0YSAqLworCWNvbnRyb2wgPSBNVjY0eDYwX0kyQ19DT05UUk9MX1RXU0lFTjsKKwlzdGF0dXMgPSBNVjY0eDYwX0kyQ19TVEFUVVNfTUFTVF9SRF9EQVRBX05PX0FDSzsKKwlkYXRhID0gbXY2NHg2MF9pMmNfcmVhZF9ieXRlKGNvbnRyb2wsIHN0YXR1cyk7CisJaWYgKGRhdGEgPCAwKQorCQlyZXR1cm4gLTE7CisJKmJ1ZisrID0gZGF0YTsKKworCS8qIHNlbmQgc3RvcCAqLworCWNvbnRyb2wgPSBNVjY0eDYwX0kyQ19DT05UUk9MX1NUT1AgfCBNVjY0eDYwX0kyQ19DT05UUk9MX1RXU0lFTjsKKwlzdGF0dXMgPSBNVjY0eDYwX0kyQ19TVEFUVVNfTk9fU1RBVFVTOworCWlmIChtdjY0eDYwX2kyY19jb250cm9sKGNvbnRyb2wsIHN0YXR1cykgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBtdjY0eDYwX2kyY19vcGVuKHZvaWQpCit7CisJdTMyIHY7CisJdm9pZCAqZGV2cDsKKworCWRldnAgPSBmaW5kZGV2aWNlKCIvbXY2NHg2MC9pMmMiKTsKKwlpZiAoZGV2cCA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXQ7CisJaWYgKGdldHByb3AoZGV2cCwgInZpcnR1YWwtcmVnIiwgJnYsIHNpemVvZih2KSkgIT0gc2l6ZW9mKHYpKQorCQlnb3RvIGVycl9vdXQ7CisKKwljdGxyX2Jhc2UgPSAodTggKil2OworCXJldHVybiAwOworCitlcnJfb3V0OgorCXJldHVybiAtMTsKK30KKwordm9pZCBtdjY0eDYwX2kyY19jbG9zZSh2b2lkKQoreworCWN0bHJfYmFzZSA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vcHMuaCBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCmluZGV4IDczYmQ0N2EuLjk1OTEyNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCkBAIC03OSw2ICs3OSw3IEBACiBpbnQgZnRfaW5pdCh2b2lkICpkdF9ibG9iLCB1bnNpZ25lZCBpbnQgbWF4X3NpemUsIHVuc2lnbmVkIGludCBtYXhfZmluZF9kZXZpY2UpOwogaW50IHNlcmlhbF9jb25zb2xlX2luaXQodm9pZCk7CiBpbnQgbnMxNjU1MF9jb25zb2xlX2luaXQodm9pZCAqZGV2cCwgc3RydWN0IHNlcmlhbF9jb25zb2xlX2RhdGEgKnNjZHApOworaW50IG1wc2NfY29uc29sZV9pbml0KHZvaWQgKmRldnAsIHN0cnVjdCBzZXJpYWxfY29uc29sZV9kYXRhICpzY2RwKTsKIHZvaWQgKnNpbXBsZV9hbGxvY19pbml0KGNoYXIgKmJhc2UsIHVuc2lnbmVkIGxvbmcgaGVhcF9zaXplLAogCQkJdW5zaWduZWQgbG9uZyBncmFudWxhcml0eSwgdW5zaWduZWQgbG9uZyBtYXhfYWxsb2NzKTsKIGV4dGVybiB2b2lkIGZsdXNoX2NhY2hlKHZvaWQgKiwgdW5zaWduZWQgbG9uZyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wcnBtYzI4MDAuYyBiL2FyY2gvcG93ZXJwYy9ib290L3BycG1jMjgwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MjhiYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9wcnBtYzI4MDAuYwpAQCAtMCwwICsxLDU3NyBAQAorLyoKKyAqIE1vdG9yb2xhIEVDQyBwcnBtYzI4MC9mMTAxICYgcHJwbWMyODAwL2YxMDFlIHBsYXRmb3JtIGNvZGUuCisgKgorICogQXV0aG9yOiBNYXJrIEEuIEdyZWVyIDxtZ3JlZXJAbXZpc3RhLmNvbT4KKyAqCisgKiAyMDA3IChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImVsZi5oIgorI2luY2x1ZGUgInBhZ2UuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgImlvLmgiCisjaW5jbHVkZSAib3BzLmgiCisjaW5jbHVkZSAiZ3VuemlwX3V0aWwuaCIKKyNpbmNsdWRlICJtdjY0eDYwLmgiCisKK2V4dGVybiBjaGFyIF9lbmRbXTsKK2V4dGVybiBjaGFyIF92bWxpbnV4X3N0YXJ0W10sIF92bWxpbnV4X2VuZFtdOworZXh0ZXJuIGNoYXIgX2R0Yl9zdGFydFtdLCBfZHRiX2VuZFtdOworCitleHRlcm4gdm9pZCB1ZGVsYXkobG9uZyBkZWxheSk7CisKKyNkZWZpbmUgS0IJMTAyNFUKKyNkZWZpbmUgTUIJKEtCKktCKQorI2RlZmluZSBHQgkoS0IqTUIpCisjZGVmaW5lIE1IegkoMTAwMFUqMTAwMFUpCisjZGVmaW5lIEdIegkoMTAwMFUqTUh6KQorCisjZGVmaW5lIEJPQVJEX01PREVMCSJQclBNQzI4MDAiCisjZGVmaW5lIEJPQVJEX01PREVMX01BWAkzMiAvKiBtYXggc3RybGVuKEJPQVJEX01PREVMKSArIDEgKi8KKworI2RlZmluZSBFRVBST00yX0FERFIJMHhhNAorI2RlZmluZSBFRVBST00zX0FERFIJMHhhOAorCitCU1NfU1RBQ0soMTYqS0IpOworCitzdGF0aWMgdTggKmJyaWRnZV9iYXNlOworCit0eXBlZGVmIGVudW0geworCUJPQVJEX01PREVMX1BSUE1DMjgwLAorCUJPQVJEX01PREVMX1BSUE1DMjgwMCwKK30gcHJwbWMyODAwX2JvYXJkX21vZGVsOworCit0eXBlZGVmIGVudW0geworCUJSSURHRV9UWVBFX01WNjQzNjAsCisJQlJJREdFX1RZUEVfTVY2NDM2MiwKK30gcHJwbWMyODAwX2JyaWRnZV90eXBlOworCitzdHJ1Y3QgcHJwbWMyODAwX2JvYXJkX2luZm8geworCXBycG1jMjgwMF9ib2FyZF9tb2RlbCBtb2RlbDsKKwljaGFyIHZhcmlhbnQ7CisJcHJwbWMyODAwX2JyaWRnZV90eXBlIGJyaWRnZV90eXBlOworCXU4IHN1YnN5czA7CisJdTggc3Vic3lzMTsKKwl1OCB2cGQ0OworCXU4IHZwZDRfbWFzazsKKwl1MzIgY29yZV9zcGVlZDsKKwl1MzIgbWVtX3NpemU7CisJdTMyIGJvb3RfZmxhc2g7CisJdTMyIHVzZXJfZmxhc2g7Cit9OworCitzdGF0aWMgc3RydWN0IHBycG1jMjgwMF9ib2FyZF9pbmZvIHBycG1jMjgwMF9ib2FyZF9pbmZvW10gPSB7CisJeworCQkubW9kZWwJCT0gQk9BUkRfTU9ERUxfUFJQTUMyODAsCisJCS52YXJpYW50CT0gJ2EnLAorCQkuYnJpZGdlX3R5cGUJPSBCUklER0VfVFlQRV9NVjY0MzYwLAorCQkuc3Vic3lzMAk9IDB4ZmYsCisJCS5zdWJzeXMxCT0gMHhmZiwKKwkJLnZwZDQJCT0gMHgwMCwKKwkJLnZwZDRfbWFzawk9IDB4MGYsCisJCS5jb3JlX3NwZWVkCT0gMSpHSHosCisJCS5tZW1fc2l6ZQk9IDUxMipNQiwKKwkJLmJvb3RfZmxhc2gJPSAxKk1CLAorCQkudXNlcl9mbGFzaAk9IDY0Kk1CLAorCX0sCisJeworCQkubW9kZWwJCT0gQk9BUkRfTU9ERUxfUFJQTUMyODAsCisJCS52YXJpYW50CT0gJ2InLAorCQkuYnJpZGdlX3R5cGUJPSBCUklER0VfVFlQRV9NVjY0MzYyLAorCQkuc3Vic3lzMAk9IDB4ZmYsCisJCS5zdWJzeXMxCT0gMHhmZiwKKwkJLnZwZDQJCT0gMHgwMSwKKwkJLnZwZDRfbWFzawk9IDB4MGYsCisJCS5jb3JlX3NwZWVkCT0gMSpHSHosCisJCS5tZW1fc2l6ZQk9IDUxMipNQiwKKwkJLmJvb3RfZmxhc2gJPSAwLAorCQkudXNlcl9mbGFzaAk9IDAsCisJfSwKKwl7CisJCS5tb2RlbAkJPSBCT0FSRF9NT0RFTF9QUlBNQzI4MCwKKwkJLnZhcmlhbnQJPSAnYycsCisJCS5icmlkZ2VfdHlwZQk9IEJSSURHRV9UWVBFX01WNjQzNjAsCisJCS5zdWJzeXMwCT0gMHhmZiwKKwkJLnN1YnN5czEJPSAweGZmLAorCQkudnBkNAkJPSAweDAyLAorCQkudnBkNF9tYXNrCT0gMHgwZiwKKwkJLmNvcmVfc3BlZWQJPSA3MzMqTUh6LAorCQkubWVtX3NpemUJPSA1MTIqTUIsCisJCS5ib290X2ZsYXNoCT0gMSpNQiwKKwkJLnVzZXJfZmxhc2gJPSA2NCpNQiwKKwl9LAorCXsKKwkJLm1vZGVsCQk9IEJPQVJEX01PREVMX1BSUE1DMjgwLAorCQkudmFyaWFudAk9ICdkJywKKwkJLmJyaWRnZV90eXBlCT0gQlJJREdFX1RZUEVfTVY2NDM2MCwKKwkJLnN1YnN5czAJPSAweGZmLAorCQkuc3Vic3lzMQk9IDB4ZmYsCisJCS52cGQ0CQk9IDB4MDMsCisJCS52cGQ0X21hc2sJPSAweDBmLAorCQkuY29yZV9zcGVlZAk9IDEqR0h6LAorCQkubWVtX3NpemUJPSAxKkdCLAorCQkuYm9vdF9mbGFzaAk9IDEqTUIsCisJCS51c2VyX2ZsYXNoCT0gNjQqTUIsCisJfSwKKwl7CisJCS5tb2RlbAkJPSBCT0FSRF9NT0RFTF9QUlBNQzI4MCwKKwkJLnZhcmlhbnQJPSAnZScsCisJCS5icmlkZ2VfdHlwZQk9IEJSSURHRV9UWVBFX01WNjQzNjAsCisJCS5zdWJzeXMwCT0gMHhmZiwKKwkJLnN1YnN5czEJPSAweGZmLAorCQkudnBkNAkJPSAweDA0LAorCQkudnBkNF9tYXNrCT0gMHgwZiwKKwkJLmNvcmVfc3BlZWQJPSAxKkdIeiwKKwkJLm1lbV9zaXplCT0gNTEyKk1CLAorCQkuYm9vdF9mbGFzaAk9IDEqTUIsCisJCS51c2VyX2ZsYXNoCT0gNjQqTUIsCisJfSwKKwl7CisJCS5tb2RlbAkJPSBCT0FSRF9NT0RFTF9QUlBNQzI4MCwKKwkJLnZhcmlhbnQJPSAnZicsCisJCS5icmlkZ2VfdHlwZQk9IEJSSURHRV9UWVBFX01WNjQzNjIsCisJCS5zdWJzeXMwCT0gMHhmZiwKKwkJLnN1YnN5czEJPSAweGZmLAorCQkudnBkNAkJPSAweDA1LAorCQkudnBkNF9tYXNrCT0gMHgwZiwKKwkJLmNvcmVfc3BlZWQJPSA3MzMqTUh6LAorCQkubWVtX3NpemUJPSAxMjgqTUIsCisJCS5ib290X2ZsYXNoCT0gMSpNQiwKKwkJLnVzZXJfZmxhc2gJPSAwLAorCX0sCisJeworCQkubW9kZWwJCT0gQk9BUkRfTU9ERUxfUFJQTUMyODAsCisJCS52YXJpYW50CT0gJ2cnLAorCQkuYnJpZGdlX3R5cGUJPSBCUklER0VfVFlQRV9NVjY0MzYwLAorCQkuc3Vic3lzMAk9IDB4ZmYsCisJCS5zdWJzeXMxCT0gMHhmZiwKKwkJLnZwZDQJCT0gMHgwNiwKKwkJLnZwZDRfbWFzawk9IDB4MGYsCisJCS5jb3JlX3NwZWVkCT0gMSpHSHosCisJCS5tZW1fc2l6ZQk9IDI1NipNQiwKKwkJLmJvb3RfZmxhc2gJPSAxKk1CLAorCQkudXNlcl9mbGFzaAk9IDAsCisJfSwKKwl7CisJCS5tb2RlbAkJPSBCT0FSRF9NT0RFTF9QUlBNQzI4MCwKKwkJLnZhcmlhbnQJPSAnaCcsCisJCS5icmlkZ2VfdHlwZQk9IEJSSURHRV9UWVBFX01WNjQzNjAsCisJCS5zdWJzeXMwCT0gMHhmZiwKKwkJLnN1YnN5czEJPSAweGZmLAorCQkudnBkNAkJPSAweDA3LAorCQkudnBkNF9tYXNrCT0gMHgwZiwKKwkJLmNvcmVfc3BlZWQJPSAxKkdIeiwKKwkJLm1lbV9zaXplCT0gMSpHQiwKKwkJLmJvb3RfZmxhc2gJPSAxKk1CLAorCQkudXNlcl9mbGFzaAk9IDY0Kk1CLAorCX0sCisJeworCQkubW9kZWwJCT0gQk9BUkRfTU9ERUxfUFJQTUMyODAwLAorCQkudmFyaWFudAk9ICdhJywKKwkJLmJyaWRnZV90eXBlCT0gQlJJREdFX1RZUEVfTVY2NDM2MCwKKwkJLnN1YnN5czAJPSAweGIyLAorCQkuc3Vic3lzMQk9IDB4OGMsCisJCS52cGQ0CQk9IDB4MDAsCisJCS52cGQ0X21hc2sJPSAweDAwLAorCQkuY29yZV9zcGVlZAk9IDEqR0h6LAorCQkubWVtX3NpemUJPSA1MTIqTUIsCisJCS5ib290X2ZsYXNoCT0gMipNQiwKKwkJLnVzZXJfZmxhc2gJPSA2NCpNQiwKKwl9LAorCXsKKwkJLm1vZGVsCQk9IEJPQVJEX01PREVMX1BSUE1DMjgwMCwKKwkJLnZhcmlhbnQJPSAnYicsCisJCS5icmlkZ2VfdHlwZQk9IEJSSURHRV9UWVBFX01WNjQzNjIsCisJCS5zdWJzeXMwCT0gMHhiMiwKKwkJLnN1YnN5czEJPSAweDhkLAorCQkudnBkNAkJPSAweDAwLAorCQkudnBkNF9tYXNrCT0gMHgwMCwKKwkJLmNvcmVfc3BlZWQJPSAxKkdIeiwKKwkJLm1lbV9zaXplCT0gNTEyKk1CLAorCQkuYm9vdF9mbGFzaAk9IDAsCisJCS51c2VyX2ZsYXNoCT0gMCwKKwl9LAorCXsKKwkJLm1vZGVsCQk9IEJPQVJEX01PREVMX1BSUE1DMjgwMCwKKwkJLnZhcmlhbnQJPSAnYycsCisJCS5icmlkZ2VfdHlwZQk9IEJSSURHRV9UWVBFX01WNjQzNjAsCisJCS5zdWJzeXMwCT0gMHhiMiwKKwkJLnN1YnN5czEJPSAweDhlLAorCQkudnBkNAkJPSAweDAwLAorCQkudnBkNF9tYXNrCT0gMHgwMCwKKwkJLmNvcmVfc3BlZWQJPSA3MzMqTUh6LAorCQkubWVtX3NpemUJPSA1MTIqTUIsCisJCS5ib290X2ZsYXNoCT0gMipNQiwKKwkJLnVzZXJfZmxhc2gJPSA2NCpNQiwKKwl9LAorCXsKKwkJLm1vZGVsCQk9IEJPQVJEX01PREVMX1BSUE1DMjgwMCwKKwkJLnZhcmlhbnQJPSAnZCcsCisJCS5icmlkZ2VfdHlwZQk9IEJSSURHRV9UWVBFX01WNjQzNjAsCisJCS5zdWJzeXMwCT0gMHhiMiwKKwkJLnN1YnN5czEJPSAweDhmLAorCQkudnBkNAkJPSAweDAwLAorCQkudnBkNF9tYXNrCT0gMHgwMCwKKwkJLmNvcmVfc3BlZWQJPSAxKkdIeiwKKwkJLm1lbV9zaXplCT0gMSpHQiwKKwkJLmJvb3RfZmxhc2gJPSAyKk1CLAorCQkudXNlcl9mbGFzaAk9IDY0Kk1CLAorCX0sCisJeworCQkubW9kZWwJCT0gQk9BUkRfTU9ERUxfUFJQTUMyODAwLAorCQkudmFyaWFudAk9ICdlJywKKwkJLmJyaWRnZV90eXBlCT0gQlJJREdFX1RZUEVfTVY2NDM2MCwKKwkJLnN1YnN5czAJPSAweGEyLAorCQkuc3Vic3lzMQk9IDB4OGEsCisJCS52cGQ0CQk9IDB4MDAsCisJCS52cGQ0X21hc2sJPSAweDAwLAorCQkuY29yZV9zcGVlZAk9IDEqR0h6LAorCQkubWVtX3NpemUJPSA1MTIqTUIsCisJCS5ib290X2ZsYXNoCT0gMipNQiwKKwkJLnVzZXJfZmxhc2gJPSA2NCpNQiwKKwl9LAorCXsKKwkJLm1vZGVsCQk9IEJPQVJEX01PREVMX1BSUE1DMjgwMCwKKwkJLnZhcmlhbnQJPSAnZicsCisJCS5icmlkZ2VfdHlwZQk9IEJSSURHRV9UWVBFX01WNjQzNjIsCisJCS5zdWJzeXMwCT0gMHhhMiwKKwkJLnN1YnN5czEJPSAweDhiLAorCQkudnBkNAkJPSAweDAwLAorCQkudnBkNF9tYXNrCT0gMHgwMCwKKwkJLmNvcmVfc3BlZWQJPSA3MzMqTUh6LAorCQkubWVtX3NpemUJPSAxMjgqTUIsCisJCS5ib290X2ZsYXNoCT0gMipNQiwKKwkJLnVzZXJfZmxhc2gJPSAwLAorCX0sCisJeworCQkubW9kZWwJCT0gQk9BUkRfTU9ERUxfUFJQTUMyODAwLAorCQkudmFyaWFudAk9ICdnJywKKwkJLmJyaWRnZV90eXBlCT0gQlJJREdFX1RZUEVfTVY2NDM2MCwKKwkJLnN1YnN5czAJPSAweGEyLAorCQkuc3Vic3lzMQk9IDB4OGMsCisJCS52cGQ0CQk9IDB4MDAsCisJCS52cGQ0X21hc2sJPSAweDAwLAorCQkuY29yZV9zcGVlZAk9IDEqR0h6LAorCQkubWVtX3NpemUJPSAyKkdCLAorCQkuYm9vdF9mbGFzaAk9IDIqTUIsCisJCS51c2VyX2ZsYXNoCT0gNjQqTUIsCisJfSwKKwl7CisJCS5tb2RlbAkJPSBCT0FSRF9NT0RFTF9QUlBNQzI4MDAsCisJCS52YXJpYW50CT0gJ2gnLAorCQkuYnJpZGdlX3R5cGUJPSBCUklER0VfVFlQRV9NVjY0MzYwLAorCQkuc3Vic3lzMAk9IDB4YTIsCisJCS5zdWJzeXMxCT0gMHg4ZCwKKwkJLnZwZDQJCT0gMHgwMCwKKwkJLnZwZDRfbWFzawk9IDB4MDAsCisJCS5jb3JlX3NwZWVkCT0gNzMzKk1IeiwKKwkJLm1lbV9zaXplCT0gMSpHQiwKKwkJLmJvb3RfZmxhc2gJPSAyKk1CLAorCQkudXNlcl9mbGFzaAk9IDY0Kk1CLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBycG1jMjgwMF9ib2FyZF9pbmZvICpwcnBtYzI4MDBfZ2V0X2JvYXJkX2luZm8odTggKnZwZCkKK3sKKwlzdHJ1Y3QgcHJwbWMyODAwX2JvYXJkX2luZm8gKmJpcDsKKwlpbnQgaTsKKworCWZvciAoaT0wLGJpcD1wcnBtYzI4MDBfYm9hcmRfaW5mbzsgaTxBUlJBWV9TSVpFKHBycG1jMjgwMF9ib2FyZF9pbmZvKTsKKwkJCWkrKyxiaXArKykKKwkJaWYgKCh2cGRbMF0gPT0gYmlwLT5zdWJzeXMwKSAmJiAodnBkWzFdID09IGJpcC0+c3Vic3lzMSkKKwkJCQkmJiAoKHZwZFs0XSAmIGJpcC0+dnBkNF9tYXNrKSA9PSBiaXAtPnZwZDQpKQorCQkJcmV0dXJuIGJpcDsKKworCXJldHVybiBOVUxMOworfQorCisvKiBHZXQgVlBEIGZyb20gaTJjIGVlcHJvbSAyLCB0aGVuIG1hdGNoIGl0IHRvIGEgYm9hcmQgaW5mbyBlbnRyeSAqLworc3RhdGljIHN0cnVjdCBwcnBtYzI4MDBfYm9hcmRfaW5mbyAqcHJwbWMyODAwX2dldF9iaXAodm9pZCkKK3sKKwlzdHJ1Y3QgcHJwbWMyODAwX2JvYXJkX2luZm8gKmJpcDsKKwl1OCB2cGRbNV07CisJaW50IHJjOworCisJaWYgKG12NjR4NjBfaTJjX29wZW4oKSkKKwkJZmF0YWwoIkVycm9yOiBDYW4ndCBvcGVuIGkyYyBkZXZpY2VcblxyIik7CisKKwkvKiBHZXQgVlBEIGZyb20gaTJjIGVlcHJvbS0yICovCisJbWVtc2V0KHZwZCwgMCwgc2l6ZW9mKHZwZCkpOworCXJjID0gbXY2NHg2MF9pMmNfcmVhZChFRVBST00yX0FERFIsIHZwZCwgMHgxZmRlLCAyLCBzaXplb2YodnBkKSk7CisJaWYgKHJjIDwgMCkKKwkJZmF0YWwoIkVycm9yOiBDb3VsZG4ndCByZWFkIGVlcHJvbTJcblxyIik7CisJbXY2NHg2MF9pMmNfY2xvc2UoKTsKKworCS8qIEdldCBib2FyZCB0eXBlICYgcmVsYXRlZCBpbmZvICovCisJYmlwID0gcHJwbWMyODAwX2dldF9ib2FyZF9pbmZvKHZwZCk7CisJaWYgKGJpcCA9PSBOVUxMKSB7CisJCXByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIGJvYXJkIG9yIGNvcnJ1cHRlZCBWUEQ6XG5cciIpOworCQlwcmludGYoIiAgMHgleCAweCV4IDB4JXggMHgleCAweCV4XG5cciIsCisJCQkJdnBkWzBdLCB2cGRbMV0sIHZwZFsyXSwgdnBkWzNdLCB2cGRbNF0pOworCQlwcmludGYoIlVzaW5nIGRldmljZSB0cmVlIGRlZmF1bHRzLi4uXG5cciIpOworCX0KKworCXJldHVybiBiaXA7Cit9CisKK3N0YXRpYyB2b2lkIHBycG1jMjgwMF9icmlkZ2Vfc2V0dXAodTMyIG1lbV9zaXplKQoreworCXUzMiBpLCB2WzEyXSwgZW5hYmxlcywgYWNjX2JpdHM7CisJdTMyIHBjaV9iYXNlX2hpLCBwY2lfYmFzZV9sbywgc2l6ZSwgYnVmWzJdOworCXVuc2lnbmVkIGxvbmcgY3B1X2Jhc2U7CisJaW50IHJjOworCXZvaWQgKmRldnA7CisJdTggKmJyaWRnZV9wYmFzZSwgaXNfY29oZXJlbnQ7CisJc3RydWN0IG12NjR4NjBfY3B1MnBjaV93aW4gKnRibDsKKworCWJyaWRnZV9wYmFzZSA9IG12NjR4NjBfZ2V0X2JyaWRnZV9wYmFzZSgpOworCWlzX2NvaGVyZW50ID0gbXY2NHg2MF9pc19jb2hlcmVudCgpOworCisJaWYgKGlzX2NvaGVyZW50KQorCQlhY2NfYml0cyA9IE1WNjR4NjBfUENJX0FDQ19DTlRMX1NOT09QX1dCCisJCQl8IE1WNjR4NjBfUENJX0FDQ19DTlRMX1NXQVBfTk9ORQorCQkJfCBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9NQlVSU1RfMzJfQllURVMKKwkJCXwgTVY2NHg2MF9QQ0lfQUNDX0NOVExfUkRTSVpFXzMyX0JZVEVTOworCWVsc2UKKwkJYWNjX2JpdHMgPSBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9TTk9PUF9OT05FCisJCQl8IE1WNjR4NjBfUENJX0FDQ19DTlRMX1NXQVBfTk9ORQorCQkJfCBNVjY0eDYwX1BDSV9BQ0NfQ05UTF9NQlVSU1RfMTI4X0JZVEVTCisJCQl8IE1WNjR4NjBfUENJX0FDQ19DTlRMX1JEU0laRV8yNTZfQllURVM7CisKKwltdjY0eDYwX2NvbmZpZ19jdGxyX3dpbmRvd3MoYnJpZGdlX2Jhc2UsIGJyaWRnZV9wYmFzZSwgaXNfY29oZXJlbnQpOworCW12NjR4NjBfY29uZmlnX3BjaV93aW5kb3dzKGJyaWRnZV9iYXNlLCBicmlkZ2VfcGJhc2UsIDAsIDAsIG1lbV9zaXplLAorCQkJYWNjX2JpdHMpOworCisJLyogR2V0IHRoZSBjcHUgLT4gcGNpIGkvbyAmIG1lbSBtYXBwaW5ncyBmcm9tIHRoZSBkZXZpY2UgdHJlZSAqLworCWRldnAgPSBmaW5kZGV2aWNlKCIvbXY2NHg2MC9wY2lAODAwMDAwMDAiKTsKKwlpZiAoZGV2cCA9PSBOVUxMKQorCQlmYXRhbCgiRXJyb3I6IE1pc3NpbmcgL212NjR4NjAvcGNpQDgwMDAwMDAwIgorCQkJCSIgZGV2aWNlIHRyZWUgbm9kZVxuXHIiKTsKKworCXJjID0gZ2V0cHJvcChkZXZwLCAicmFuZ2VzIiwgdiwgc2l6ZW9mKHYpKTsKKwlpZiAocmMgIT0gc2l6ZW9mKHYpKQorCQlmYXRhbCgiRXJyb3I6IENhbid0IGZpbmQgL212NjR4NjAvcGNpQDgwMDAwMDAwL3JhbmdlcyIKKwkJCQkiIHByb3BlcnR5XG5cciIpOworCisJLyogR2V0IHRoZSBjcHUgLT4gcGNpIGkvbyAmIG1lbSBtYXBwaW5ncyBmcm9tIHRoZSBkZXZpY2UgdHJlZSAqLworCWRldnAgPSBmaW5kZGV2aWNlKCIvbXY2NHg2MCIpOworCWlmIChkZXZwID09IE5VTEwpCisJCWZhdGFsKCJFcnJvcjogTWlzc2luZyAvbXY2NHg2MCBkZXZpY2UgdHJlZSBub2RlXG5cciIpOworCisJZW5hYmxlcyA9IGluX2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfQ1BVX0JBUl9FTkFCTEUpKTsKKwllbmFibGVzIHw9IDB4MDAwN2ZlMDA7IC8qIERpc2FibGUgYWxsIGNwdS0+cGNpIHdpbmRvd3MgKi8KKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9DUFVfQkFSX0VOQUJMRSksIGVuYWJsZXMpOworCisJZm9yIChpPTA7IGk8MTI7IGkrPTYpIHsKKwkJc3dpdGNoICh2W2ldICYgMHhmZjAwMDAwMCkgeworCQljYXNlIDB4MDEwMDAwMDA6IC8qIFBDSSBJL08gU3BhY2UgKi8KKwkJCXRibCA9IG12NjR4NjBfY3B1MnBjaV9pbzsKKwkJCWJyZWFrOworCQljYXNlIDB4MDIwMDAwMDA6IC8qIFBDSSBNRU0gU3BhY2UgKi8KKwkJCXRibCA9IG12NjR4NjBfY3B1MnBjaV9tZW07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcGNpX2Jhc2VfaGkgPSB2W2krMV07CisJCXBjaV9iYXNlX2xvID0gdltpKzJdOworCQljcHVfYmFzZSA9IHZbaSszXTsKKwkJc2l6ZSA9IHZbaSs1XTsKKworCQlidWZbMF0gPSBjcHVfYmFzZTsKKwkJYnVmWzFdID0gc2l6ZTsKKworCQlpZiAoIWR0X3hsYXRlX2FkZHIoZGV2cCwgYnVmLCBzaXplb2YoYnVmKSwgJmNwdV9iYXNlKSkKKwkJCWZhdGFsKCJFcnJvcjogQ2FuJ3QgdHJhbnNsYXRlIFBDSSBhZGRyZXNzIDB4JXhcblxyIiwKKwkJCQkJKHUzMiljcHVfYmFzZSk7CisKKwkJbXY2NHg2MF9jb25maWdfY3B1MnBjaV93aW5kb3coYnJpZGdlX2Jhc2UsIDAsIHBjaV9iYXNlX2hpLAorCQkJCXBjaV9iYXNlX2xvLCBjcHVfYmFzZSwgc2l6ZSwgdGJsKTsKKwl9CisKKwllbmFibGVzICY9IH4weDAwMDAwNjAwOyAvKiBFbmFibGUgY3B1LT5wY2kwIGkvbywgY3B1LT5wY2kwIG1lbTAgKi8KKwlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9DUFVfQkFSX0VOQUJMRSksIGVuYWJsZXMpOworfQorCitzdGF0aWMgdm9pZCBwcnBtYzI4MDBfZml4dXBzKHZvaWQpCit7CisJdTMyIHZbMl0sIGwsIG1lbV9zaXplOworCWludCByYzsKKwl2b2lkICpkZXZwOworCWNoYXIgbW9kZWxbQk9BUkRfTU9ERUxfTUFYXTsKKwlzdHJ1Y3QgcHJwbWMyODAwX2JvYXJkX2luZm8gKmJpcDsKKworCWJpcCA9IHBycG1jMjgwMF9nZXRfYmlwKCk7IC8qIEdldCBib2FyZCBpbmZvIGJhc2VkIG9uIFZQRCAqLworCisJbWVtX3NpemUgPSAoYmlwKSA/IGJpcC0+bWVtX3NpemUgOiBtdjY0eDYwX2dldF9tZW1fc2l6ZShicmlkZ2VfYmFzZSk7CisJcHJwbWMyODAwX2JyaWRnZV9zZXR1cChtZW1fc2l6ZSk7IC8qIERvIG5lY2Vzc2FyeSBicmlkZ2Ugc2V0dXAgKi8KKworCS8qIElmIHRoZSBWUEQgZG9lc24ndCBtYXRjaCB3aGF0IHdlIGtub3cgYWJvdXQsIGp1c3QgdXNlIHRoZQorCSAqIGRlZmF1bHRzIGFscmVhZHkgaW4gdGhlIGRldmljZSB0cmVlLgorCSAqLworCWlmICghYmlwKQorCQlyZXR1cm47CisKKwkvKiBLbm93IHRoZSBib2FyZCB0eXBlIHNvIG92ZXJyaWRlIGRldmljZSB0cmVlIGRlZmF1bHRzICovCisJLyogU2V0IC9tb2RlbCBhcHByb3ByaWF0ZWx5ICovCisJZGV2cCA9IGZpbmRkZXZpY2UoIi8iKTsKKwlpZiAoZGV2cCA9PSBOVUxMKQorCQlmYXRhbCgiRXJyb3I6IE1pc3NpbmcgJy8nIGRldmljZSB0cmVlIG5vZGVcblxyIik7CisJbWVtc2V0KG1vZGVsLCAwLCBCT0FSRF9NT0RFTF9NQVgpOworCXN0cm5jcHkobW9kZWwsIEJPQVJEX01PREVMLCBCT0FSRF9NT0RFTF9NQVggLSAyKTsKKwlsID0gc3RybGVuKG1vZGVsKTsKKwlpZiAoYmlwLT5tb2RlbCA9PSBCT0FSRF9NT0RFTF9QUlBNQzI4MCkKKwkJbC0tOworCW1vZGVsW2wrK10gPSBiaXAtPnZhcmlhbnQ7CisJbW9kZWxbbCsrXSA9ICdcMCc7CisJc2V0cHJvcChkZXZwLCAibW9kZWwiLCBtb2RlbCwgbCk7CisKKwkvKiBTZXQgL2NwdXMvUG93ZXJQQyw3NDQ3L2Nsb2NrLWZyZXF1ZW5jeSAqLworCWRldnAgPSBmaW5kZGV2aWNlKCIvY3B1cy9Qb3dlclBDLDc0NDciKTsKKwlpZiAoZGV2cCA9PSBOVUxMKQorCQlmYXRhbCgiRXJyb3I6IE1pc3NpbmcgcHJvcGVyIC9jcHVzIGRldmljZSB0cmVlIG5vZGVcblxyIik7CisJdlswXSA9IGJpcC0+Y29yZV9zcGVlZDsKKwlzZXRwcm9wKGRldnAsICJjbG9jay1mcmVxdWVuY3kiLCAmdlswXSwgc2l6ZW9mKHZbMF0pKTsKKworCS8qIFNldCAvbWVtb3J5L3JlZyBzaXplICovCisJZGV2cCA9IGZpbmRkZXZpY2UoIi9tZW1vcnkiKTsKKwlpZiAoZGV2cCA9PSBOVUxMKQorCQlmYXRhbCgiRXJyb3I6IE1pc3NpbmcgL21lbW9yeSBkZXZpY2UgdHJlZSBub2RlXG5cciIpOworCXZbMF0gPSAwOworCXZbMV0gPSBiaXAtPm1lbV9zaXplOworCXNldHByb3AoZGV2cCwgInJlZyIsIHYsIHNpemVvZih2KSk7CisKKwkvKiBVcGRhdGUgL212NjR4NjAvbW9kZWwsIGlmIHRoaXMgaXMgYSBtdjY0MzYyICovCisJaWYgKGJpcC0+YnJpZGdlX3R5cGUgPT0gQlJJREdFX1RZUEVfTVY2NDM2MikgeworCQlkZXZwID0gZmluZGRldmljZSgiL212NjR4NjAiKTsKKwkJaWYgKGRldnAgPT0gTlVMTCkKKwkJCWZhdGFsKCJFcnJvcjogTWlzc2luZyAvbXY2NHg2MCBkZXZpY2UgdHJlZSBub2RlXG5cciIpOworCQlzZXRwcm9wKGRldnAsICJtb2RlbCIsICJtdjY0MzYyIiwgc3RybGVuKCJtdjY0MzYyIikgKyAxKTsKKwl9CisKKwkvKiBTZXQgVXNlciBGTEFTSCBzaXplICovCisJZGV2cCA9IGZpbmRkZXZpY2UoIi9tdjY0eDYwL2ZsYXNoQGEwMDAwMDAwIik7CisJaWYgKGRldnAgPT0gTlVMTCkKKwkJZmF0YWwoIkVycm9yOiBNaXNzaW5nIFVzZXIgRkxBU0ggZGV2aWNlIHRyZWUgbm9kZVxuXHIiKTsKKwlyYyA9IGdldHByb3AoZGV2cCwgInJlZyIsIHYsIHNpemVvZih2KSk7CisJaWYgKHJjICE9IHNpemVvZih2KSkKKwkJZmF0YWwoIkVycm9yOiBDYW4ndCBmaW5kIFVzZXIgRkxBU0ggcmVnIHByb3BlcnR5XG5cciIpOworCXZbMV0gPSBiaXAtPnVzZXJfZmxhc2g7CisJc2V0cHJvcChkZXZwLCAicmVnIiwgdiwgc2l6ZW9mKHYpKTsKK30KKworI2RlZmluZSBNVjY0eDYwX01QUF9DTlRMXzAJMHhmMDAwCisjZGVmaW5lIE1WNjR4NjBfTVBQX0NOVExfMgkweGYwMDgKKyNkZWZpbmUgTVY2NHg2MF9HUFBfSU9fQ05UTAkweGYxMDAKKyNkZWZpbmUgTVY2NHg2MF9HUFBfTEVWRUxfQ05UTAkweGYxMTAKKyNkZWZpbmUgTVY2NHg2MF9HUFBfVkFMVUVfU0VUCTB4ZjExOAorCitzdGF0aWMgdm9pZCBwcnBtYzI4MDBfcmVzZXQodm9pZCkKK3sKKwl1MzIgdGVtcDsKKworCXVkZWxheSg1MDAwMDAwKTsKKworCWlmIChicmlkZ2VfYmFzZSAhPSAwKSB7CisJCXRlbXAgPSBpbl9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBNVjY0eDYwX01QUF9DTlRMXzApKTsKKwkJdGVtcCAmPSAweEZGRkYwRkZGOworCQlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9NUFBfQ05UTF8wKSwgdGVtcCk7CisKKwkJdGVtcCA9IGluX2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfR1BQX0xFVkVMX0NOVEwpKTsKKwkJdGVtcCB8PSAweDAwMDAwMDA0OworCQlvdXRfbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9HUFBfTEVWRUxfQ05UTCksIHRlbXApOworCisJCXRlbXAgPSBpbl9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBNVjY0eDYwX0dQUF9JT19DTlRMKSk7CisJCXRlbXAgfD0gMHgwMDAwMDAwNDsKKwkJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfR1BQX0lPX0NOVEwpLCB0ZW1wKTsKKworCQl0ZW1wID0gaW5fbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9NUFBfQ05UTF8yKSk7CisJCXRlbXAgJj0gMHhGRkZGMEZGRjsKKwkJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfTVBQX0NOVExfMiksIHRlbXApOworCisJCXRlbXAgPSBpbl9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBNVjY0eDYwX0dQUF9MRVZFTF9DTlRMKSk7CisJCXRlbXAgfD0gMHgwMDA4MDAwMDsKKwkJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfR1BQX0xFVkVMX0NOVEwpLCB0ZW1wKTsKKworCQl0ZW1wID0gaW5fbGUzMigodTMyICopKGJyaWRnZV9iYXNlICsgTVY2NHg2MF9HUFBfSU9fQ05UTCkpOworCQl0ZW1wIHw9IDB4MDAwODAwMDA7CisJCW91dF9sZTMyKCh1MzIgKikoYnJpZGdlX2Jhc2UgKyBNVjY0eDYwX0dQUF9JT19DTlRMKSwgdGVtcCk7CisKKwkJb3V0X2xlMzIoKHUzMiAqKShicmlkZ2VfYmFzZSArIE1WNjR4NjBfR1BQX1ZBTFVFX1NFVCksCisJCQkJMHgwMDA4MDAwNCk7CisJfQorCisJZm9yICg7Oyk7Cit9CisKKyNkZWZpbmUgSEVBUF9TSVpFCSgxNipNQikKK3N0YXRpYyBzdHJ1Y3QgZ3VuemlwX3N0YXRlIGd6c3RhdGU7CisKK3ZvaWQgcGxhdGZvcm1faW5pdCh1bnNpZ25lZCBsb25nIHIzLCB1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcpCit7CisJc3RydWN0IGVsZl9pbmZvIGVpOworCWNoYXIgKmhlYXBfc3RhcnQsICpkdGI7CisJaW50IGR0X3NpemUgPSBfZHRiX2VuZCAtIF9kdGJfc3RhcnQ7CisJdm9pZCAqdm1saW51el9hZGRyID0gX3ZtbGludXhfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyB2bWxpbnV6X3NpemUgPSBfdm1saW51eF9lbmQgLSBfdm1saW51eF9zdGFydDsKKwljaGFyIGVsZmhlYWRlclsyNTZdOworCisJaWYgKGR0X3NpemUgPD0gMCkgLyogTm8gZmR0ICovCisJCWV4aXQoKTsKKworCS8qCisJICogU3RhcnQgaGVhcCBhZnRlciBlbmQgb2YgdGhlIGtlcm5lbCAoYWZ0ZXIgZGVjb21wcmVzc2VkIHRvCisJICogYWRkcmVzcyAwKSBvciB0aGUgZW5kIG9mIHRoZSB6SW1hZ2UsIHdoaWNoZXZlciBpcyBoaWdoZXIuCisJICogVGhhdCdzIHNvIHRoaW5ncyBhbGxvY2F0ZWQgYnkgc2ltcGxlX2FsbG9jIHdvbid0IG92ZXJ3cml0ZQorCSAqIGFueSBwYXJ0IG9mIHRoZSB6SW1hZ2UgYW5kIHRoZSBrZXJuZWwgd29uJ3Qgb3ZlcndyaXRlIHRoZSBkdGIKKwkgKiB3aGVuIGRlY29tcHJlc3NlZCAmIHJlbG9jYXRlZC4KKwkgKi8KKwlndW56aXBfc3RhcnQoJmd6c3RhdGUsIHZtbGludXpfYWRkciwgdm1saW51el9zaXplKTsKKwlndW56aXBfZXhhY3RseSgmZ3pzdGF0ZSwgZWxmaGVhZGVyLCBzaXplb2YoZWxmaGVhZGVyKSk7CisKKwlpZiAoIXBhcnNlX2VsZjMyKGVsZmhlYWRlciwgJmVpKSkKKwkJZXhpdCgpOworCisJaGVhcF9zdGFydCA9IChjaGFyICopKGVpLm1lbXNpemUgKyBlaS5lbGZvZmZzZXQpOyAvKiBlbmQgb2Yga2VybmVsKi8KKwloZWFwX3N0YXJ0ID0gbWF4KGhlYXBfc3RhcnQsIChjaGFyICopX2VuZCk7IC8qIGVuZCBvZiB6SW1hZ2UgKi8KKworCWlmICgodW5zaWduZWQpc2ltcGxlX2FsbG9jX2luaXQoaGVhcF9zdGFydCwgSEVBUF9TSVpFLCAyKktCLCAxNikKKwkJCT4gKDEyOCpNQikpCisJCWV4aXQoKTsKKworCS8qIFJlbG9jYXRlIGR0YiB0byBzYWZlIGFyZWEgcGFzdCBlbmQgb2YgekltYWdlICYga2VybmVsICovCisJZHRiID0gbWFsbG9jKGR0X3NpemUpOworCWlmICghZHRiKQorCQlleGl0KCk7CisJbWVtbW92ZShkdGIsIF9kdGJfc3RhcnQsIGR0X3NpemUpOworCWlmIChmdF9pbml0KGR0YiwgZHRfc2l6ZSwgMTYpKQorCQlleGl0KCk7CisKKwlicmlkZ2VfYmFzZSA9IG12NjR4NjBfZ2V0X2JyaWRnZV9iYXNlKCk7CisKKwlwbGF0Zm9ybV9vcHMuZml4dXBzID0gcHJwbWMyODAwX2ZpeHVwczsKKwlwbGF0Zm9ybV9vcHMuZXhpdCA9IHBycG1jMjgwMF9yZXNldDsKKworCWlmIChzZXJpYWxfY29uc29sZV9pbml0KCkgPCAwKQorCQlleGl0KCk7Cit9CisKKy8qIF96aW1hZ2Vfc3RhcnQgY2FsbGVkIHZlcnkgZWFybHktLW5lZWQgdG8gdHVybiBvZmYgZXh0ZXJuYWwgaW50ZXJydXB0cyAqLworYXNtICgiCS5nbG9ibCBfemltYWdlX3N0YXJ0XG5cCisJX3ppbWFnZV9zdGFydDpcblwKKwkJbWZtc3IJMTBcblwKKwkJcmx3aW5tCTEwLDEwLDAsfigxPDwxNSkJLyogQ2xlYXIgTVNSX0VFICovXG5cCisJCXN5bmNcblwKKwkJbXRtc3IJMTBcblwKKwkJaXN5bmNcblwKKwkJYiBfemltYWdlX3N0YXJ0X2xpYlxuXAorIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9zZXJpYWwuYyBiL2FyY2gvcG93ZXJwYy9ib290L3NlcmlhbC5jCmluZGV4IGU4ZGU0Y2YuLjdmZDMyMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L3NlcmlhbC5jCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3NlcmlhbC5jCkBAIC0xMjUsNiArMTI1LDggQEAKIAogCWlmICghc3RyY21wKGNvbXBhdCwgIm5zMTY1NTAiKSkKIAkJcmMgPSBuczE2NTUwX2NvbnNvbGVfaW5pdChkZXZwLCAmc2VyaWFsX2NkKTsKKwllbHNlIGlmICghc3RyY21wKGNvbXBhdCwgIm1hcnZlbGwsbXBzYyIpKQorCQlyYyA9IG1wc2NfY29uc29sZV9pbml0KGRldnAsICZzZXJpYWxfY2QpOwogCiAJLyogQWRkIG90aGVyIHNlcmlhbCBjb25zb2xlIGRyaXZlciBjYWxscyBoZXJlICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BycG1jMjgwMF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcnBtYzI4MDBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MGE3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcnBtYzI4MDBfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTQ0MiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIxCisjIFdlZCBNYXkgIDkgMDk6NDI6NDYgMjAwNworIworIyBDT05GSUdfUFBDNjQgaXMgbm90IHNldAorQ09ORklHX1BQQzMyPXkKK0NPTkZJR19QUENfTUVSR0U9eQorQ09ORklHX01NVT15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfSVJRX1BFUl9DUFU9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19BUkNIX0hBU19JTE9HMl9VMzI9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfUFBDPXkKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorQ09ORklHX1BQQ19PRj15CisjIENPTkZJR19QUENfVURCR18xNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfQVVESVRfQVJDSD15CitDT05GSUdfR0VORVJJQ19CVUc9eQorIyBDT05GSUdfREVGQVVMVF9VSU1BR0UgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzdXBwb3J0CisjCitDT05GSUdfQ0xBU1NJQzMyPXkKKyMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184M3h4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184Nnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184eHggaXMgbm90IHNldAorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR182eHg9eQorQ09ORklHX1BQQ19GUFU9eQorIyBDT05GSUdfUFBDX0RDUl9OQVRJVkUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0RDUl9NTUlPIGlzIG5vdCBzZXQKK0NPTkZJR19BTFRJVkVDPXkKK0NPTkZJR19QUENfU1REX01NVT15CitDT05GSUdfUFBDX1NURF9NTVVfMzI9eQorIyBDT05GSUdfUFBDX01NX1NMSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTVAgaXMgbm90IHNldAorQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRT15CitDT05GSUdfQ09ORklHX0NIRUNLX0NBQ0hFX0NPSEVSRU5DWT15CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX0lQQ19OUyBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCisjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUlRfTVVURVhFUz15CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKK0NPTkZJR19CTE9DSz15CitDT05GSUdfTEJEPXkKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQVM9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgorCisjCisjIFBsYXRmb3JtIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRDZ4eD15CisjIENPTkZJR19BUFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NUEM1Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19NUEM1MjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19DRUxMX05BVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUTJBRFMgaXMgbm90IHNldAorIyBDT05GSUdfTElOS1NUQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTVBDNzQ0OEhQQzIgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0hPTExZIGlzIG5vdCBzZXQKK0NPTkZJR19QUENfUFJQTUMyODAwPXkKK0NPTkZJR19NVjY0WDYwPXkKKyMgQ09ORklHX01QSUMgaXMgbm90IHNldAorIyBDT05GSUdfTVBJQ19XRUlSRCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfSTgyNTkgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX1JUQVMgaXMgbm90IHNldAorIyBDT05GSUdfTU1JT19OVlJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfTVBDMTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ185NzBfTkFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9JTyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5FUklDX0lPTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBVSBpcyBub3Qgc2V0CisjIENPTkZJR19DUE0yIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgb3B0aW9ucworIworQ09ORklHX0hJR0hNRU09eQorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfTUlTQz15CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX1JFU09VUkNFU182NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0xCitDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKK0NPTkZJR19XQU5UX0RFVklDRV9UUkVFPXkKK0NPTkZJR19ERVZJQ0VfVFJFRT0icHJwbWMyODAwLmR0cyIKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19aT05FX0RNQT15CitDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKK0NPTkZJR19QUENfSU5ESVJFQ1RfUENJPXkKKyMgQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0lfQkUgaXMgbm90IHNldAorQ09ORklHX1BDST15CitDT05GSUdfUENJX0RPTUFJTlM9eQorIyBDT05GSUdfUENJRVBPUlRCVVMgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJPXkKKyMgQ09ORklHX1BDSV9NU0kgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgQWR2YW5jZWQgc2V0dXAKKyMKKyMgQ09ORklHX0FEVkFOQ0VEX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIERlZmF1bHQgc2V0dGluZ3MgZm9yIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgdXNlZAorIworQ09ORklHX0hJR0hNRU1fU1RBUlQ9MHhmZTAwMDAwMAorQ09ORklHX0xPV01FTV9TSVpFPTB4MzAwMDAwMDAKK0NPTkZJR19LRVJORUxfU1RBUlQ9MHhjMDAwMDAwMAorQ09ORklHX1RBU0tfU0laRT0weDgwMDAwMDAwCitDT05GSUdfQ09OU0lTVEVOVF9TVEFSVD0weGZmMTAwMDAwCitDT05GSUdfQ09OU0lTVEVOVF9TSVpFPTB4MDAyMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CitDT05GSUdfWEZSTV9VU0VSPXkKKyMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CitDT05GSUdfSVBfTVVMVElDQVNUPXkKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorQ09ORklHX1NZTl9DT09LSUVTPXkKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKK0NPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisKKyMKKyMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MKKyMKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09OQ0FUPXkKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorQ09ORklHX01URF9KRURFQ1BST0JFPXkKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhZU01BUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVBfT0Y9eQorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1BNQzU1MSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BOUEFDUEkgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VCIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTEzMTA3MgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19QSEFOVE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NHSV9JT0M0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworQ09ORklHX0lERT15CitDT05GSUdfQkxLX0RFVl9JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcworIworIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKKyMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CitDT05GSUdfQkxLX0RFVl9JREVQQ0k9eQorIyBDT05GSUdfSURFUENJX1NIQVJFX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9eQorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0pNSUNST04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9QREMyMDJYWF9ORVc9eQorIyBDT05GSUdfQkxLX0RFVl9TVldLUyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NJSU1BR0UgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TTDgyQzEwNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVEM4NkMwMDEgaXMgbm90IHNldAorIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVETUE9eQorIyBDT05GSUdfSURFRE1BX0lWQiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJPXkKKyMgQ09ORklHX1NDU0lfVEdUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM5NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0dEVEggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEFfSVNDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0VTUF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1JQIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgQVRBIChwcm9kKSBhbmQgUGFyYWxsZWwgQVRBIChleHBlcmltZW50YWwpIGRyaXZlcnMKKyMKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NWVyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfUElJWCBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9NVj15CisjIENPTkZJR19TQVRBX05WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BEQ19BRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUVNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9QUk9NSVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU1g0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfU0lMMjQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9VTEkgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfSU5JQzE2MlggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BTEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BTUQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BUlRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FUSUlYUCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0NNRDY0MF9QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DWVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfRUZBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMk4gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMTMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9KTUlDUk9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01BUlZFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09MRFBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9ORVRDRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTlM4NzQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVEkgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JBRElTWVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SWjEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TRVJWRVJXT1JLUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQzIwMjdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0lMNjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfV0lOQk9ORCBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fRkMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NBUyBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKK0NPTkZJR19NQUNJTlRPU0hfRFJJVkVSUz15CisjIENPTkZJR19NQUNfRU1VTU9VU0VCVE4gaXMgbm90IHNldAorIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfUEhZTElCPXkKKworIworIyBNSUkgUEhZIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NQVJWRUxMX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19EQVZJQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19RU0VNSV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTFhUX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19DSUNBREFfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJVEVTU0VfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNU0NfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JST0FEQ09NX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19GSVhFRF9QSFkgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FVF9QQ0k9eQorIyBDT05GSUdfUENORVQzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CitDT05GSUdfRTEwMD15CisjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAorIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAorQ09ORklHXzgxMzlUT089eQorIyBDT05GSUdfODEzOVRPT19QSU8gaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPT184MTI5IGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlfT0xEX1JYX1JFU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDOTIwMzEgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CitDT05GSUdfRTEwMDA9eQorIyBDT05GSUdfRTEwMDBfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMF9ESVNBQkxFX1BBQ0tFVF9TUExJVCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLWTIgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSUFfVkVMT0NJVFkgaXMgbm90IHNldAorIyBDT05GSUdfVElHT04zIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JOWDIgaXMgbm90IHNldAorQ09ORklHX01WNjQzWFhfRVRIPXkKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIRUxTSU9fVDMgaXMgbm90IHNldAorIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CisjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfVlRfQ09OU09MRT15CitDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfTVBTQz15CitDT05GSUdfU0VSSUFMX01QU0NfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfVUFSVExJVEUgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorQ09ORklHX0dFTl9SVEM9eQorIyBDT05GSUdfR0VOX1JUQ19YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorIyBDT05GSUdfQUdQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfREVWUE9SVD15CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19NUEMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX05GT1JDRTIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19TSU1URUMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19USU5ZX1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVklBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUFQUk8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAorQ09ORklHX0kyQ19NVjY0WFhYPXkKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRUVQUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTTQxVDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBTUEkgc3VwcG9ydAorIworIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSV9NQVNURVIgaXMgbm90IHNldAorCisjCisjIERhbGxhcydzIDEtd2lyZSBidXMKKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKK0NPTkZJR19IV01PTj15CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRE0xMDI5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE03NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNNzcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTc4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04MCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNODMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE04NyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdCMzk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVklBNjg2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1ZUODIzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc4MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19XODM3OTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4Mzc5MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9JQk1fR1hUNDUwMCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCitDT05GSUdfVkdBX0NPTlNPTEU9eQorIyBDT05GSUdfVkdBQ09OX1NPRlRfU0NST0xMQkFDSyBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBISUQgRGV2aWNlcworIworQ09ORklHX0hJRD15CisjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD15CisjIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfREVWSUNFX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19VU0JfRUhDSV9IQ0Q9eQorIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX0JJR19FTkRJQU5fTU1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0hDRD15CisjIENPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX09GIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU5fREVTQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOX01NSU8gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworIyBDT05GSUdfVVNCX0FDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUFJJTlRFUiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKKyMgQ09ORklHX1VTQl9TVE9SQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVRfTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCisjIENPTkZJR19VU0JfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBVU0IgTWlzY2VsbGFuZW91cyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfRU1JNjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VNSTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BRFVUVVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FVRVJTV0FMRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUklPNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQkVSUllfQ0hBUkdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRldmljZXMKKyMKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKworIworIyBMRUQgZHJpdmVycworIworCisjCisjIExFRCBUcmlnZ2VycworIworCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CisKKyMKKyMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCisjCisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTMwNyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTY3MiBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0RSVl9NQVg2OTAwPXkKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0lTTDEyMDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKworIworIyBQbGF0Zm9ybSBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgRE1BIEVuZ2luZSBzdXBwb3J0CisjCisjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKKworIworIyBETUEgQ2xpZW50cworIworCisjCisjIERNQSBEZXZpY2VzCisjCisKKyMKKyMgQXV4aWxpYXJ5IERpc3BsYXkgc3VwcG9ydAorIworCisjCisjIFZpcnR1YWxpemF0aW9uCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKK0NPTkZJR19JTk9USUZZX1VTRVI9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfU1VOUlBDX0JJTkQzNCBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1lTVjY4X1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyCisjCisjIENPTkZJR19ETE0gaXMgbm90IHNldAorIyBDT05GSUdfVUNDX1NMT1cgaXMgbm90IHNldAorIyBDT05GSUdfVUNDX0ZBU1QgaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19QTElTVD15CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKKworIworIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0JPT1RYX1RFWFQgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZwppbmRleCBmZDYwNDk2Li40Nzc5MzQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CiAjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjEKLSMgTW9uIEFwciAzMCAxMjowMzozNSAyMDA3CisjIEZyaSBNYXkgMTEgMTA6MTY6MjcgMjAwNwogIwogQ09ORklHX1BQQzY0PXkKIENPTkZJR182NEJJVD15CkBAIC00MCw2ICs0MCw3IEBACiAjIENPTkZJR19QUENfT0ZfUExBVEZPUk1fUENJIGlzIG5vdCBzZXQKIENPTkZJR19BTFRJVkVDPXkKIENPTkZJR19QUENfU1REX01NVT15CisjIENPTkZJR19QUENfTU1fU0xJQ0VTIGlzIG5vdCBzZXQKIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HPXkKIENPTkZJR19TTVA9eQogQ09ORklHX05SX0NQVVM9MgpAQCAtNjcsNiArNjgsNyBAQAogIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE3CiAjIENPTkZJR19DUFVTRVRTIGlzIG5vdCBzZXQKIENPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKICMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKQEAgLTg3LDEyICs4OSwxMyBAQAogQ09ORklHX0ZVVEVYPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1NMVUIgaXMgbm90IHNldAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKLSMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogCiAjCiAjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CkBAIC0yMTMsNiArMjE2LDcgQEAKIENPTkZJR19SRVNPVVJDRVNfNjRCSVQ9eQogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MQogQ09ORklHX0FSQ0hfTUVNT1JZX1BST0JFPXkKKyMgQ09ORklHX1BQQ19IQVNfSEFTSF82NEsgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzY0S19QQUdFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRF9TTVQgaXMgbm90IHNldAogQ09ORklHX1BST0NfREVWSUNFVFJFRT15CkBAIC0yMjksMTUgKzIzMywxMiBAQAogQ09ORklHX0dFTkVSSUNfSVNBX0RNQT15CiAjIENPTkZJR19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfUENJX0RPTUFJTlMgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKICMKICMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0Ci0KLSMKLSMgUENJIEhvdHBsdWcgU3VwcG9ydAotIwogQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwMDAwMDAwMDAKIAogIwpAQCAtMzYzLDcgKzM2NCw5IEBACiAjCiAjIENPTkZJR19DRkc4MDIxMSBpcyBub3Qgc2V0CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKKyMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC00MTQsNiArNDE3LDcgQEAKICMKICMgTWlzYyBkZXZpY2VzCiAjCisjIENPTkZJR19CTElOSyBpcyBub3Qgc2V0CiAKICMKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydApAQCAtNDQ3LDYgKzQ1MSw3IEBACiAjIENPTkZJR19TQ1NJX0NPTlNUQU5UUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQ0FOX0FTWU5DIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1dBSVRfU0NBTj1tCiAKICMKICMgU0NTSSBUcmFuc3BvcnRzCkBAIC00NzMsMjUgKzQ3OCw3IEBACiAjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCiAjCiAjIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTWFjaW50b3NoIGRldmljZSBkcml2ZXJzCi0jCi0jIENPTkZJR19NQUNfRU1VTU9VU0VCVE4gaXMgbm90IHNldAotIyBDT05GSUdfV0lOREZBUk0gaXMgbm90IHNldAorIyBDT05GSUdfTUFDSU5UT1NIX0RSSVZFUlMgaXMgbm90IHNldAogCiAjCiAjIE5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKQEAgLTUxOSw2ICs1MDYsNyBAQAogIwogIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKICMKK0NPTkZJR19NTFg0X0RFQlVHPXkKIAogIwogIyBUb2tlbiBSaW5nIGRldmljZXMKQEAgLTUzMSw2ICs1MTksMjUgQEAKICMgQ09ORklHX1dMQU5fODAyMTEgaXMgbm90IHNldAogCiAjCisjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCisjCisjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfUEVHQVNVUz1tCisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1VTQk5FVF9NSUk9bQorQ09ORklHX1VTQl9VU0JORVQ9bQorIyBDT05GSUdfVVNCX05FVF9DRENFVEhFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTkVUX0RNOTYwMSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTkVUX0dMNjIwQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTkVUX05FVDEwODAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX05FVF9QTFVTQiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX05FVF9NQ1M3ODMwPW0KKyMgQ09ORklHX1VTQl9ORVRfUk5ESVNfSE9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTkVUX0NEQ19TVUJTRVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX05FVF9aQVVSVVMgaXMgbm90IHNldAorCisjCiAjIFdhbiBpbnRlcmZhY2VzCiAjCiAjIENPTkZJR19XQU4gaXMgbm90IHNldApAQCAtNTc1LDYgKzU4Miw3IEBACiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CiAKQEAgLTYwOSwxNSArNjE3LDEwIEBACiAjIElQTUkKICMKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CiBDT05GSUdfR0VOX1JUQz15CiAjIENPTkZJR19HRU5fUlRDX1ggaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTkdDSEVDS19USU1FUiBpcyBub3Qgc2V0CkBAIC02MjYsMTAgKzYyOSw2IEBACiAjIFRQTSBkZXZpY2VzCiAjCiAjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKLQotIwotIyBJMkMgc3VwcG9ydAotIwogIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKIAogIwpAQCAtNjQyLDEyICs2NDEsNyBAQAogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCiAjIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0Ci0jCiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogCiAjCiAjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKQEAgLTY2OSwxMiArNjYzLDIzIEBACiAjIEdyYXBoaWNzIHN1cHBvcnQKICMKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKIENPTkZJR19GQj15CiAjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CiBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKIENPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQogQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC03MDIsMTAgKzcwNyw2IEBACiAjIENPTkZJR19GT05UUyBpcyBub3Qgc2V0CiBDT05GSUdfRk9OVF84eDg9eQogQ09ORklHX0ZPTlRfOHgxNj15Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCiBDT05GSUdfTE9HTz15CiAjIENPTkZJR19MT0dPX0xJTlVYX01PTk8gaXMgbm90IHNldAogIyBDT05GSUdfTE9HT19MSU5VWF9WR0ExNiBpcyBub3Qgc2V0CkBAIC03NjgsNiArNzY5LDIwIEBACiAjIENPTkZJR19ISURfREVCVUcgaXMgbm90IHNldAogCiAjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD1tCisjIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorCisjCiAjIFVTQiBzdXBwb3J0CiAjCiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CkBAIC04MjcsNTYgKzg0MiwxMCBAQAogIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKIAogIwotIyBVU0IgSW5wdXQgRGV2aWNlcwotIwotQ09ORklHX1VTQl9ISUQ9bQotIyBDT05GSUdfVVNCX0hJRElOUFVUX1BPV0VSQk9PSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ISURfRkYgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKLSMKLSMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9BVElfUkVNT1RFMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0dUQ08gaXMgbm90IHNldAotCi0jCiAjIFVTQiBJbWFnaW5nIGRldmljZXMKICMKICMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgTmV0d29yayBBZGFwdGVycwotIwotIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0Ci1DT05GSUdfVVNCX1BFR0FTVVM9bQotIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAotQ09ORklHX1VTQl9VU0JORVRfTUlJPW0KLUNPTkZJR19VU0JfVVNCTkVUPW0KLSMgQ09ORklHX1VTQl9ORVRfQ0RDRVRIRVIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX05FVF9ETTk2MDEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX05FVF9HTDYyMEEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX05FVF9ORVQxMDgwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9ORVRfUExVU0IgaXMgbm90IHNldAotQ09ORklHX1VTQl9ORVRfTUNTNzgzMD1tCi0jIENPTkZJR19VU0JfTkVUX1JORElTX0hPU1QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX05FVF9DRENfU1VCU0VUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9ORVRfWkFVUlVTIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfTU9OPXkKIAogIwpAQCAtOTIwLDEwICs4ODksNiBAQAogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKQEAgLTk2NiwxNCArOTMxLDYgQEAKICMKIAogIwotIyBBdXhpbGlhcnkgRGlzcGxheSBzdXBwb3J0Ci0jCi0KLSMKLSMgVmlydHVhbGl6YXRpb24KLSMKLQotIwogIyBGaWxlIHN5c3RlbXMKICMKIENPTkZJR19FWFQyX0ZTPW0KQEAgLTEwNzEsNiArMTAyOCw3IEBACiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKKyMgQ09ORklHX1NVTlJQQ19CSU5EMzQgaXMgbm90IHNldAogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CkBAIC0xMTQ4LDExICsxMTA2LDEzIEBACiBDT05GSUdfQklUUkVWRVJTRT15CiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAogIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1BMSVNUPXkKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQogCiAjCiAjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CkBAIC0xMTcxLDcgKzExMzEsNiBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE3CiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CkBAIC0xMjA1LDYgKzExNjQsNyBAQAogIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0lTRVJJRVMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX1BBU19SRUFMTU9ERSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUENfRUFSTFlfREVCVUdfQkVBVCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfNDR4IGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCkBAIC0xMjM0LDYgKzExOTQsNyBAQAogQ09ORklHX0NSWVBUT19DQkM9eQogQ09ORklHX0NSWVBUT19QQ0JDPW0KICMgQ09ORklHX0NSWVBUT19MUlcgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0RFUz15CiAjIENPTkZJR19DUllQVE9fRkNSWVBUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2F1ZGl0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2F1ZGl0LmMKaW5kZXggN2ZlNWU2My4uYTRkYWI3YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hdWRpdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXVkaXQuYwpAQCAtMjMsNiArMjMsMjAgQEAKIH4wVQogfTsKIAorc3RhdGljIHVuc2lnbmVkIHNpZ25hbF9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X3NpZ25hbC5oPgorfjBVCit9OworCitpbnQgYXVkaXRfY2xhc3NpZnlfYXJjaChpbnQgYXJjaCkKK3sKKyNpZmRlZiBDT05GSUdfUFBDNjQKKwlpZiAoYXJjaCA9PSBBVURJVF9BUkNIX1BQQykKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKwogaW50IGF1ZGl0X2NsYXNzaWZ5X3N5c2NhbGwoaW50IGFiaSwgdW5zaWduZWQgc3lzY2FsbCkKIHsKICNpZmRlZiBDT05GSUdfUFBDNjQKQEAgLTUxLDE1ICs2NSwxOCBAQAogCWV4dGVybiBfX3UzMiBwcGMzMl93cml0ZV9jbGFzc1tdOwogCWV4dGVybiBfX3UzMiBwcGMzMl9yZWFkX2NsYXNzW107CiAJZXh0ZXJuIF9fdTMyIHBwYzMyX2NoYXR0cl9jbGFzc1tdOworCWV4dGVybiBfX3UzMiBwcGMzMl9zaWduYWxfY2xhc3NbXTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURV8zMiwgcHBjMzJfd3JpdGVfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1JFQURfMzIsIHBwYzMyX3JlYWRfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0RJUl9XUklURV8zMiwgcHBjMzJfZGlyX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFJfMzIsIHBwYzMyX2NoYXR0cl9jbGFzcyk7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfU0lHTkFMXzMyLCBwcGMzMl9zaWduYWxfY2xhc3MpOwogI2VuZGlmCiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfV1JJVEUsIHdyaXRlX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19SRUFELCByZWFkX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19ESVJfV1JJVEUsIGRpcl9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfQ0hBVFRSLCBjaGF0dHJfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1NJR05BTCwgc2lnbmFsX2NsYXNzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jb21wYXRfYXVkaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY29tcGF0X2F1ZGl0LmMKaW5kZXggNjQwZDRiYi4uMTA4ZmYxNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jb21wYXRfYXVkaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NvbXBhdF9hdWRpdC5jCkBAIC0yMSw2ICsyMSwxMSBAQAogfjBVCiB9OwogCit1bnNpZ25lZCBwcGMzMl9zaWduYWxfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9zaWduYWwuaD4KK34wVQorfTsKKwogaW50IHBwYzMyX2NsYXNzaWZ5X3N5c2NhbGwodW5zaWduZWQgc3lzY2FsbCkKIHsKIAlzd2l0Y2goc3lzY2FsbCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggOWVkNDkzMS4uMDY4Mzc3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC0xNzMsNyArMTczLDcgQEAKIAkJbHYxX2dldF92ZXJzaW9uX2luZm8oJnRtcCk7CiAJfQogCi0JaGFyZF9pcnFfZW5hYmxlKCk7CisJX19oYXJkX2lycV9lbmFibGUoKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwppbmRleCBiNWM5NmFmLi4zNzg2ZGNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwpAQCAtMjQsNyArMjQsNyBAQAogLyogTWF4IGFkZHJlc3Mgc2l6ZSB3ZSBkZWFsIHdpdGggKi8KICNkZWZpbmUgT0ZfTUFYX0FERFJfQ0VMTFMJNAogI2RlZmluZSBPRl9DSEVDS19DT1VOVFMobmEsIG5zKQkoKG5hKSA+IDAgJiYgKG5hKSA8PSBPRl9NQVhfQUREUl9DRUxMUyAmJiBcCi0JCQkobnMpID4gMCkKKwkJCShucykgPj0gMCkKIAogc3RhdGljIHN0cnVjdCBvZl9idXMgKm9mX21hdGNoX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIHN0YXRpYyBpbnQgX19vZl9hZGRyZXNzX3RvX3Jlc291cmNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKaW5kZXggMzcwODAzNy4uZWQwN2ExOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCkBAIC01MzAsMyArNTMwLDQ0IEBACiB7CiAJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LCAmcHBjX3BhbmljX2Jsb2NrKTsKIH0KKworI2lmZGVmIENPTkZJR19DSEVDS19DQUNIRV9DT0hFUkVOQ1kKKy8qCisgKiBGb3IgcGxhdGZvcm1zIHRoYXQgaGF2ZSBjb25maWd1cmFibGUgY2FjaGUtY29oZXJlbmN5LiAgVGhpcyBmdW5jdGlvbgorICogY2hlY2tzIHRoYXQgdGhlIGNhY2hlIGNvaGVyZW5jeSBzZXR0aW5nIG9mIHRoZSBrZXJuZWwgbWF0Y2hlcyB0aGUgc2V0dGluZworICogbGVmdCBieSB0aGUgZmlybXdhcmUsIGFzIGluZGljYXRlZCBpbiB0aGUgZGV2aWNlIHRyZWUuICBTaW5jZSBhIG1pc21hdGNoCisgKiB3aWxsIGV2ZW50dWFsbHkgcmVzdWx0IGluIERNQSBmYWlsdXJlcywgd2UgcHJpbnQgKiBhbmQgZXJyb3IgYW5kIGNhbGwKKyAqIEJVRygpIGluIHRoYXQgY2FzZS4KKyAqLworCisjaWZkZWYgQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRQorI2RlZmluZSBLRVJORUxfQ09IRVJFTkNZCTAKKyNlbHNlCisjZGVmaW5lIEtFUk5FTF9DT0hFUkVOQ1kJMQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGNoZWNrX2NhY2hlX2NvaGVyZW5jeSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJY29uc3Qgdm9pZCAqcHJvcDsKKwlpbnQgZGV2dHJlZV9jb2hlcmVuY3k7CisKKwlucCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNvaGVyZW5jeS1vZmYiLCBOVUxMKTsKKwlvZl9ub2RlX3B1dChucCk7CisKKwlkZXZ0cmVlX2NvaGVyZW5jeSA9IHByb3AgPyAwIDogMTsKKworCWlmIChkZXZ0cmVlX2NvaGVyZW5jeSAhPSBLRVJORUxfQ09IRVJFTkNZKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJImtlcm5lbCBjb2hlcmVuY3k6JXMgIT0gZGV2aWNlIHRyZWVfY29oZXJlbmN5OiVzXG4iLAorCQkJS0VSTkVMX0NPSEVSRU5DWSA/ICJvbiIgOiAib2ZmIiwKKwkJCWRldnRyZWVfY29oZXJlbmN5ID8gIm9uIiA6ICJvZmYiKTsKKwkJQlVHKCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2xhdGVfaW5pdGNhbGwoY2hlY2tfY2FjaGVfY29oZXJlbmN5KTsKKyNlbmRpZiAvKiBDT05GSUdfQ0hFQ0tfQ0FDSEVfQ09IRVJFTkNZICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N3c3VzcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zd3N1c3AuYwppbmRleCAwNjRhN2JhLi43N2I3YjM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N3c3VzcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3dzdXNwLmMKQEAgLTM2LDggKzM2LDQgQEAKICNpZmRlZiBDT05GSUdfUFBDMzIKIAlzZXRfY29udGV4dChjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQuaWQsIGN1cnJlbnQtPmFjdGl2ZV9tbS0+cGdkKTsKICNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JaGFyZF9pcnFfZW5hYmxlKCk7Ci0jZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKaW5kZXggN2NlZGVmOC4uMmM4NTY0ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKQEAgLTcxMSwzMCArNzExLDE1IEBACiB2b2lkIF9faW5pdCBzbXBfc3BhY2VfdGltZXJzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKIHsKIAlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGhhbGYgPSB0Yl90aWNrc19wZXJfamlmZnkgLyAyOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdGJfdGlja3NfcGVyX2ppZmZ5IC8gbWF4X2NwdXM7CiAJdTY0IHByZXZpb3VzX3RiID0gcGVyX2NwdShsYXN0X2ppZmZ5LCBib290X2NwdWlkKTsKIAogCS8qIG1ha2Ugc3VyZSB0YiA+IHBlcl9jcHUobGFzdF9qaWZmeSwgY3B1KSBmb3IgYWxsIGNwdXMgYWx3YXlzICovCiAJcHJldmlvdXNfdGIgLT0gdGJfdGlja3NfcGVyX2ppZmZ5OwotCS8qCi0JICogVGhlIHN0b2xlbiB0aW1lIGNhbGN1bGF0aW9uIGZvciBQT1dFUjUgc2hhcmVkLXByb2Nlc3NvciBMUEFSCi0JICogc3lzdGVtcyB3b3JrcyBiZXR0ZXIgaWYgdGhlIHR3byB0aHJlYWRzJyB0aW1lYmFzZSBpbnRlcnJ1cHRzCi0JICogYXJlIHN0YWdnZXJlZCBieSBoYWxmIGEgamlmZnkgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIuCi0JICovCisKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlpZiAoaSA9PSBib290X2NwdWlkKQogCQkJY29udGludWU7Ci0JCWlmIChpID09IChib290X2NwdWlkIF4gMSkpCi0JCQlwZXJfY3B1KGxhc3RfamlmZnksIGkpID0KLQkJCQlwZXJfY3B1KGxhc3RfamlmZnksIGJvb3RfY3B1aWQpIC0gaGFsZjsKLQkJZWxzZSBpZiAoaSAmIDEpCi0JCQlwZXJfY3B1KGxhc3RfamlmZnksIGkpID0KLQkJCQlwZXJfY3B1KGxhc3RfamlmZnksIGkgXiAxKSArIGhhbGY7Ci0JCWVsc2UgewotCQkJcHJldmlvdXNfdGIgKz0gb2Zmc2V0OwotCQkJcGVyX2NwdShsYXN0X2ppZmZ5LCBpKSA9IHByZXZpb3VzX3RiOwotCQl9CisJCXBlcl9jcHUobGFzdF9qaWZmeSwgaSkgPSBwcmV2aW91c190YjsKIAl9CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKaW5kZXggN2Q3MjJlZS4uNGEyMGQ4OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKQEAgLTM1MSw3ICszNTEsNyBAQAogCXVuc2lnbmVkIGxvbmcgaHB0ZV9yID0gaHB0ZS0+cjsKIAl1bnNpZ25lZCBsb25nIGhwdGVfdiA9IGhwdGUtPnY7CiAJdW5zaWduZWQgbG9uZyBhdnBuOwotCWludCBpLCBzaXplLCBzaGlmdCwgcGVuYywgYXZwbm1fYml0czsKKwlpbnQgaSwgc2l6ZSwgc2hpZnQsIHBlbmM7CiAKIAlpZiAoIShocHRlX3YgJiBIUFRFX1ZfTEFSR0UpKQogCQlzaXplID0gTU1VX1BBR0VfNEs7CkBAIC0zOTUsNyArMzk1LDcgQEAKIAkJCXZwaSA9ICh2c2lkIF4gKHZzaWQgPDwgMjUpIF4gcHRlZykgJiBodGFiX2hhc2hfbWFzazsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJYXZwbiA9IHZwaSA9IHBzaXplID0gMDsKKwkJCWF2cG4gPSB2cGkgPSBzaXplID0gMDsKIAkJfQogCQlhdnBuIHw9ICh2cGkgPDwgbW11X3BzaXplX2RlZnNbc2l6ZV0uc2hpZnQpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYwppbmRleCA4YzIwZjBmLi44MTJiZjU2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcGVydmFzaXZlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BlcnZhc2l2ZS5jCkBAIC00MywxMiArNDMsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGN0cmwsIHRocmVhZF9zd2l0Y2hfY29udHJvbDsKIAogCS8qCi0JICogV2UgbmVlZCB0byBoYXJkIGRpc2FibGUgaW50ZXJydXB0cywgYnV0IHdlIGFsc28gbmVlZCB0byBtYXJrIHRoZW0KLQkgKiBoYXJkIGRpc2FibGVkIGluIHRoZSBQQUNBIHNvIHRoYXQgdGhlIGxvY2FsX2lycV9lbmFibGUoKSBkb25lIGJ5Ci0JICogb3VyIGNhbGxlciB1cG9uIHJldHVybiBwcm9wZXJ0bHkgaGFyZCBlbmFibGVzLgorCSAqIFdlIG5lZWQgdG8gaGFyZCBkaXNhYmxlIGludGVycnVwdHMsIHRoZSBsb2NhbF9pcnFfZW5hYmxlKCkgZG9uZSBieQorCSAqIG91ciBjYWxsZXIgdXBvbiByZXR1cm4gd2lsbCBoYXJkIHJlLWVuYWJsZS4KIAkgKi8KIAloYXJkX2lycV9kaXNhYmxlKCk7Ci0JZ2V0X3BhY2EoKS0+aGFyZF9lbmFibGVkID0gMDsKIAogCWN0cmwgPSBtZnNwcihTUFJOX0NUUkxGKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9LY29uZmlnCmluZGV4IDhmM2MyYTcuLmYyZDI2MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L0tjb25maWcKQEAgLTMxLDYgKzMxLDE0IEBACiAJaGVscAogCSAgU2VsZWN0IFBQQ19IT0xMWSBpZiBjb25maWd1cmluZyBmb3IgYW4gSUJNIDc1MEdYL0NMIEV2YWwKIAkgIEJvYXJkIHdpdGggVFNJMTA4LzkgYnJpZGdlIChIaWNrb3J5L0hvbGx5KQorCitjb25maWcgUFBDX1BSUE1DMjgwMAorCWJvb2wgIk1vdG9yb2xhLVByUE1DMjgwMCIKKwlzZWxlY3QgTVY2NFg2MAorCXNlbGVjdCBOT1RfQ09IRVJFTlRfQ0FDSEUKKwlzZWxlY3QgV0FOVF9ERVZJQ0VfVFJFRQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1vdG9yb2xhIFByUE1DMjgwMCBib2FyZAogZW5kY2hvaWNlCiAKIGNvbmZpZyBUU0kxMDhfQlJJREdFCkBAIC00Niw2ICs1NCwxMSBAQAogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBNVjY0WDYwCisJYm9vbAorCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCisJc2VsZWN0IENPTkZJR19DSEVDS19DQUNIRV9DT0hFUkVOQ1kKKwogY29uZmlnIE1QQzEwWF9PUEVOUElDCiAJYm9vbAogCWRlcGVuZHMgb24gTElOS1NUQVRJT04KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L01ha2VmaWxlCmluZGV4IGIzOWZlNGYuLjg0NDk0N2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9NYWtlZmlsZQpAQCAtNCwzICs0LDQgQEAKIG9iai0kKENPTkZJR19NUEM3NDQ4SFBDMikJKz0gbXBjNzQ0OF9ocGMyLm8KIG9iai0kKENPTkZJR19MSU5LU1RBVElPTikJKz0gbGlua3N0YXRpb24ubyBsc191YXJ0Lm8KIG9iai0kKENPTkZJR19QUENfSE9MTFkpCQkrPSBob2xseS5vCitvYmotJChDT05GSUdfUFBDX1BSUE1DMjgwMCkJKz0gcHJwbWMyODAwLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvcHJwbWMyODAwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L3BycG1jMjgwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDIwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L3BycG1jMjgwMC5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQm9hcmQgc2V0dXAgcm91dGluZXMgZm9yIHRoZSBNb3Rvcm9sYSBQclBNQzI4MDAKKyAqCisgKiBBdXRob3I6IERhbGUgRmFybnN3b3J0aCA8ZGFsZUBmYXJuc3dvcnRoLm9yZz4KKyAqCisgKiAyMDA3IChjKSBNb250YVZpc3RhLCBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbQorICogaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2tleGVjLmg+CisKKyNpbmNsdWRlIDxtbS9tbXVfZGVjbC5oPgorCisjaW5jbHVkZSA8c3lzZGV2L212NjR4NjAuaD4KKworI2RlZmluZSBNVjY0eDYwX01QUF9DTlRMXzAJMHgwMDAwCisjZGVmaW5lIE1WNjR4NjBfTVBQX0NOVExfMgkweDAwMDgKKworI2RlZmluZSBNVjY0eDYwX0dQUF9JT19DTlRMCTB4MDAwMAorI2RlZmluZSBNVjY0eDYwX0dQUF9MRVZFTF9DTlRMCTB4MDAxMAorI2RlZmluZSBNVjY0eDYwX0dQUF9WQUxVRV9TRVQJMHgwMDE4CisKKyNkZWZpbmUgUExBVEZPUk1fTkFNRV9NQVgJMzIKKworc3RhdGljIGNoYXIgcHJwbWMyODAwX3BsYXRmb3JtX25hbWVbUExBVEZPUk1fTkFNRV9NQVhdOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICptdjY0eDYwX21wcF9yZWdfYmFzZTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm12NjR4NjBfZ3BwX3JlZ19iYXNlOworCitzdGF0aWMgdm9pZCBfX2luaXQgcHJwbWMyODAwX3NldHVwX2FyY2godm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXBoeXNfYWRkcl90IHBhZGRyOworCWNvbnN0IHVuc2lnbmVkIGludCAqcmVnOworCWNvbnN0IHVuc2lnbmVkIGludCAqcHJvcDsKKworCS8qCisJICogaW9yZW1hcCBtcHAgYW5kIGdwcCByZWdpc3RlcnMgaW4gY2FzZSB0aGV5IGFyZSBsYXRlcgorCSAqIG5lZWRlZCBieSBwcnBtYzI4MDBfcmVzZXRfYm9hcmQoKS4KKwkgKi8KKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJtYXJ2ZWxsLG12NjR4NjAtbXBwIik7CisJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgTlVMTCk7CisJcGFkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhucCwgcmVnKTsKKwlvZl9ub2RlX3B1dChucCk7CisJbXY2NHg2MF9tcHBfcmVnX2Jhc2UgPSBpb3JlbWFwKHBhZGRyLCByZWdbMV0pOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAibWFydmVsbCxtdjY0eDYwLWdwcCIpOworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCXBhZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3MobnAsIHJlZyk7CisJb2Zfbm9kZV9wdXQobnApOworCW12NjR4NjBfZ3BwX3JlZ19iYXNlID0gaW9yZW1hcChwYWRkciwgcmVnWzFdKTsKKworCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJbG9vcHNfcGVyX2ppZmZ5ID0gKnByb3AgLyBIWjsKKwlvZl9ub2RlX3B1dChucCk7CisKKyNpZmRlZiBDT05GSUdfUENJCisJbXY2NHg2MF9wY2lfaW5pdCgpOworI2VuZGlmCisKKwlwcmludGsoIk1vdG9yb2xhICVzXG4iLCBwcnBtYzI4MDBfcGxhdGZvcm1fbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBycG1jMjgwMF9yZXNldF9ib2FyZCh2b2lkKQoreworCXUzMiB0ZW1wOworCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCXRlbXAgPSBpbl9sZTMyKG12NjR4NjBfbXBwX3JlZ19iYXNlICsgTVY2NHg2MF9NUFBfQ05UTF8wKTsKKwl0ZW1wICY9IDB4RkZGRjBGRkY7CisJb3V0X2xlMzIobXY2NHg2MF9tcHBfcmVnX2Jhc2UgKyBNVjY0eDYwX01QUF9DTlRMXzAsIHRlbXApOworCisJdGVtcCA9IGluX2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9MRVZFTF9DTlRMKTsKKwl0ZW1wIHw9IDB4MDAwMDAwMDQ7CisJb3V0X2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9MRVZFTF9DTlRMLCB0ZW1wKTsKKworCXRlbXAgPSBpbl9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfSU9fQ05UTCk7CisJdGVtcCB8PSAweDAwMDAwMDA0OworCW91dF9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfSU9fQ05UTCwgdGVtcCk7CisKKwl0ZW1wID0gaW5fbGUzMihtdjY0eDYwX21wcF9yZWdfYmFzZSArIE1WNjR4NjBfTVBQX0NOVExfMik7CisJdGVtcCAmPSAweEZGRkYwRkZGOworCW91dF9sZTMyKG12NjR4NjBfbXBwX3JlZ19iYXNlICsgTVY2NHg2MF9NUFBfQ05UTF8yLCB0ZW1wKTsKKworCXRlbXAgPSBpbl9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfTEVWRUxfQ05UTCk7CisJdGVtcCB8PSAweDAwMDgwMDAwOworCW91dF9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfTEVWRUxfQ05UTCwgdGVtcCk7CisKKwl0ZW1wID0gaW5fbGUzMihtdjY0eDYwX2dwcF9yZWdfYmFzZSArIE1WNjR4NjBfR1BQX0lPX0NOVEwpOworCXRlbXAgfD0gMHgwMDA4MDAwMDsKKwlvdXRfbGUzMihtdjY0eDYwX2dwcF9yZWdfYmFzZSArIE1WNjR4NjBfR1BQX0lPX0NOVEwsIHRlbXApOworCisJb3V0X2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9WQUxVRV9TRVQsIDB4MDAwODAwMDQpOworfQorCitzdGF0aWMgdm9pZCBwcnBtYzI4MDBfcmVzdGFydChjaGFyICpjbWQpCit7CisJdm9sYXRpbGUgdWxvbmcgaSA9IDEwMDAwMDAwOworCisJcHJwbWMyODAwX3Jlc2V0X2JvYXJkKCk7CisKKwl3aGlsZSAoaS0tID4gMCk7CisJcGFuaWMoInJlc3RhcnQgZmFpbGVkXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19OT1RfQ09IRVJFTlRfQ0FDSEUKKyNkZWZpbmUgUFBSUE0yODAwX0NPSEVSRU5DWV9TRVRUSU5HICJvZmYiCisjZWxzZQorI2RlZmluZSBQUFJQTTI4MDBfQ09IRVJFTkNZX1NFVFRJTkcgIm9uIgorI2VuZGlmCisKK3ZvaWQgcHJwbWMyODAwX3Nob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJdWludCBtZW1zaXplID0gdG90YWxfbWVtb3J5OworCisJc2VxX3ByaW50ZihtLCAiVmVuZG9yXHRcdDogTW90b3JvbGFcbiIpOworCXNlcV9wcmludGYobSwgIk1lbW9yeVx0XHQ6ICVkIE1CXG4iLCBtZW1zaXplIC8gKDEwMjQgKiAxMDI0KSk7CisJc2VxX3ByaW50ZihtLCAiY29oZXJlbmN5XHQ6ICVzXG4iLCBQUFJQTTI4MDBfQ09IRVJFTkNZX1NFVFRJTkcpOworfQorCisvKgorICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBycG1jMjgwMF9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IFBMQVRGT1JNX05BTUVfTUFYOworCXZvaWQgKm07CisKKwlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAibW90b3JvbGEsUHJQTUMyODAwIikpCisJCXJldHVybiAwOworCisJLyogVXBkYXRlIHBwY19tZC5uYW1lIHdpdGggbmFtZSBmcm9tIGR0ICovCisJbSA9IG9mX2dldF9mbGF0X2R0X3Byb3Aocm9vdCwgIm1vZGVsIiwgJmxlbik7CisJaWYgKG0pCisJCXN0cm5jcHkocHJwbWMyODAwX3BsYXRmb3JtX25hbWUsIG0sCisJCQltaW4oKGludClsZW4sIFBMQVRGT1JNX05BTUVfTUFYIC0gMSkpOworCisJcmV0dXJuIDE7Cit9CisKK2RlZmluZV9tYWNoaW5lKHBycG1jMjgwMCl7CisJLm5hbWUJCQk9IHBycG1jMjgwMF9wbGF0Zm9ybV9uYW1lLAorCS5wcm9iZQkJCT0gcHJwbWMyODAwX3Byb2JlLAorCS5zZXR1cF9hcmNoCQk9IHBycG1jMjgwMF9zZXR1cF9hcmNoLAorCS5zaG93X2NwdWluZm8JCT0gcHJwbWMyODAwX3Nob3dfY3B1aW5mbywKKwkuaW5pdF9JUlEJCT0gbXY2NHg2MF9pbml0X2lycSwKKwkuZ2V0X2lycQkJPSBtdjY0eDYwX2dldF9pcnEsCisJLnJlc3RhcnQJCT0gcHJwbWMyODAwX3Jlc3RhcnQsCisJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCisjaWZkZWYgQ09ORklHX0tFWEVDCisJLm1hY2hpbmVfa2V4ZWMJCT0gZGVmYXVsdF9tYWNoaW5lX2tleGVjLAorCS5tYWNoaW5lX2tleGVjX3ByZXBhcmUJPSBkZWZhdWx0X21hY2hpbmVfa2V4ZWNfcHJlcGFyZSwKKwkubWFjaGluZV9jcmFzaF9zaHV0ZG93bgk9IGRlZmF1bHRfbWFjaGluZV9jcmFzaF9zaHV0ZG93biwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lkbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lkbGUuYwppbmRleCA1OTg1Y2UwLi4wM2NkNDVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9pZGxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvaWRsZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3JlZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKaW5kZXggYzk4OTQ5My4uOTM1Mzk2NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jCkBAIC05OSw2ICs5OSw3IEBACiAJd2hpbGUoMSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfRkJfUFMzCiBzdGF0aWMgdm9pZCBwcmVhbGxvYyhzdHJ1Y3QgcHMzX3ByZWFsbG9jICpwKQogewogCWlmICghcC0+c2l6ZSkKQEAgLTExNSw3ICsxMTYsNiBAQAogCSAgICAgICBwLT5hZGRyZXNzKTsKIH0KIAotI2lmZGVmIENPTkZJR19GQl9QUzMKIHN0cnVjdCBwczNfcHJlYWxsb2MgcHMzZmJfdmlkZW9tZW1vcnkgPSB7CiAgICAgLm5hbWUgPSAicHMzZmIgdmlkZW9tZW1vcnkiLAogICAgIC5zaXplID0gQ09ORklHX0ZCX1BTM19ERUZBVUxUX1NJWkVfTSoxMDI0KjEwMjQsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCmluZGV4IDg3MjkzNDguLjUzNDE2ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NtcC5jCkBAIC0xMTgsOSArMTE4LDExIEBACiAJCURCRygiJXM6JWQ6ICglZCwgJWQpID0+IHZpcnEgJXVcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGNwdSwgaSwgdmlycXNbaV0pOwogCisJCXJlc3VsdCA9IHJlcXVlc3RfaXJxKHZpcnFzW2ldLCBpcGlfZnVuY3Rpb25faGFuZGxlciwKKwkJCUlSUUZfRElTQUJMRUQsIG5hbWVzW2ldLCAodm9pZCopKGxvbmcpaSk7CiAKLQkJcmVxdWVzdF9pcnEodmlycXNbaV0sIGlwaV9mdW5jdGlvbl9oYW5kbGVyLCBJUlFGX0RJU0FCTEVELAotCQkJbmFtZXNbaV0sICh2b2lkKikobG9uZylpKTsKKwkJaWYgKHJlc3VsdCkKKwkJCXZpcnFzW2ldID0gTk9fSVJROwogCX0KIAogCXBzM19yZWdpc3Rlcl9pcGlfZGVidWdfYnJrKGNwdSwgdmlycXNbUFBDX01TR19ERUJVR0dFUl9CUkVBS10pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3lzdGVtLWJ1cy5jCmluZGV4IDNjNDhjY2UuLjZiZGE1MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3N5c3RlbS1idXMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zeXN0ZW0tYnVzLmMKQEAgLTI3NCwxMyArMjc0LDEzIEBACiBzdGF0aWMgaW50IHBzM19tYXBfc2coc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3QgcHMzX3N5c3RlbV9idXNfZGV2aWNlICpkZXYgPSB0b19wczNfc3lzdGVtX2J1c19kZXZpY2UoX2Rldik7Ci0JaW50IGk7Ci0KICNpZiBkZWZpbmVkKENPTkZJR19QUzNfRFlOQU1JQ19ETUEpCiAJQlVHX09OKCJkbyIpOwogCXJldHVybiAtRVBFUk07CiAjZWxzZQorCXN0cnVjdCBwczNfc3lzdGVtX2J1c19kZXZpY2UgKmRldiA9IHRvX3BzM19zeXN0ZW1fYnVzX2RldmljZShfZGV2KTsKKwlpbnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7CiAJCWludCByZXN1bHQgPSBwczNfZG1hX21hcChkZXYtPmRfcmVnaW9uLAogCQkJcGFnZV90b19waHlzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQsIHNnLT5sZW5ndGgsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQppbmRleCA5Y2U3NzVjLi5jM2NlMGJkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKQEAgLTE2LDYgKzE2LDggQEAKIG9iai0kKENPTkZJR19GU0xfUENJRSkJCSs9IGZzbF9wY2llLm8KIG9iai0kKENPTkZJR19UU0kxMDhfQlJJREdFKQkrPSB0c2kxMDhfcGNpLm8gdHNpMTA4X2Rldi5vCiBvYmotJChDT05GSUdfUVVJQ0NfRU5HSU5FKQkrPSBxZV9saWIvCittdjY0eDYwLSQoQ09ORklHX1BDSSkJCSs9IG12NjR4NjBfcGNpLm8KK29iai0kKENPTkZJR19NVjY0WDYwKQkJKz0gJChtdjY0eDYwLXkpIG12NjR4NjBfcGljLm8gbXY2NHg2MF9kZXYubwogCiAjIGNvbnRhaW5zIG9ubHkgdGhlIHN1c3BlbmQgaGFuZGxlciBmb3IgdGltZQogb2JqLSQoQ09ORklHX1BNKQkJKz0gdGltZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmYwYjRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwLmgKQEAgLTAsMCArMSwxMSBAQAorI2lmbmRlZiBfX01WNjRYNjBfSF9fCisjZGVmaW5lIF9fTVY2NFg2MF9IX18KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworZXh0ZXJuIHZvaWQgX19pbml0IG12NjR4NjBfaW5pdF9pcnEodm9pZCk7CitleHRlcm4gdW5zaWduZWQgaW50IG12NjR4NjBfZ2V0X2lycSh2b2lkKTsKKworZXh0ZXJuIHZvaWQgX19pbml0IG12NjR4NjBfcGNpX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBfX01WNjRYNjBfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwYTljOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9kZXYuYwpAQCAtMCwwICsxLDQyMiBAQAorLyoKKyAqIFBsYXRmb3JtIGRldmljZSBzZXR1cCBmb3IgTWFydmVsbCBtdjY0MzYwL212NjQ0NjAgaG9zdCBicmlkZ2VzIChEaXNjb3ZlcnkpCisgKgorICogQXV0aG9yOiBEYWxlIEZhcm5zd29ydGggPGRhbGVAZmFybnN3b3J0aC5vcmc+CisgKgorICogMjAwNyAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L212NjQzeHguaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKKy8qCisgKiBUaGVzZSBmdW5jdGlvbnMgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IHNldHVwIGZvciB0aGUgbXY2NHg2MCBkcml2ZXJzLgorICogVGhlc2UgZHJpdmVycyBhcmUgdW51c3VhbCBpbiB0aGF0IHRoZXkgd29yayBvbiBib3RoIHRoZSBNSVBTIGFuZCBQb3dlclBDCisgKiBhcmNoaXRlY3R1cmVzLiAgQmVjYXVzZSBvZiB0aGF0LCB0aGUgZHJpdmVycyBkbyBub3Qgc3VwcG9ydCB0aGUgbm9ybWFsCisgKiBQb3dlclBDIG9mX3BsYXRmb3JtX2J1c190eXBlLiAgVGhleSBzdXBwb3J0IHBsYXRmb3JtX2J1c190eXBlIGluc3RlYWQuCisgKi8KKworLyoKKyAqIENyZWF0ZSBNUFNDIHBsYXRmb3JtIGRldmljZXMKKyAqLworc3RhdGljIGludCBfX2luaXQgbXY2NHg2MF9tcHNjX3JlZ2lzdGVyX3NoYXJlZF9wZGV2KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgclsyXTsKKwlzdHJ1Y3QgbXBzY19zaGFyZWRfcGRhdGEgcGRhdGE7CisJY29uc3QgcGhhbmRsZSAqcGg7CisJc3RydWN0IGRldmljZV9ub2RlICptcHNjcm91dGluZywgKm1wc2NpbnRyOworCWludCBlcnI7CisKKwlwaCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIm1wc2Nyb3V0aW5nIiwgTlVMTCk7CisJbXBzY3JvdXRpbmcgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOworCWlmICghbXBzY3JvdXRpbmcpCisJCXJldHVybiAtRU5PREVWOworCisJZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShtcHNjcm91dGluZywgMCwgJnJbMF0pOworCW9mX25vZGVfcHV0KG1wc2Nyb3V0aW5nKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcGggPSBvZl9nZXRfcHJvcGVydHkobnAsICJtcHNjaW50ciIsIE5VTEwpOworCW1wc2NpbnRyID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoKnBoKTsKKwlpZiAoIW1wc2NpbnRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVyciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobXBzY2ludHIsIDAsICZyWzFdKTsKKwlvZl9ub2RlX3B1dChtcHNjaW50cik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW1lbXNldCgmcGRhdGEsIDAsIHNpemVvZihwZGF0YSkpOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhNUFNDX1NIQVJFRF9OQU1FLCAwKTsKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgciwgMik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCAmcGRhdGEsIHNpemVvZihwZGF0YSkpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgX19pbml0IG12NjR4NjBfbXBzY19kZXZpY2Vfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGlkKQoreworCXN0cnVjdCByZXNvdXJjZSByWzVdOworCXN0cnVjdCBtcHNjX3BkYXRhIHBkYXRhOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJY29uc3QgdW5zaWduZWQgaW50ICpwcm9wOworCWNvbnN0IHBoYW5kbGUgKnBoOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc2RtYSwgKmJyZzsKKwlpbnQgZXJyOworCWludCBwb3J0X251bWJlcjsKKworCS8qIG9ubHkgcmVnaXN0ZXIgdGhlIHNoYXJlZCBwbGF0Zm9ybSBkZXZpY2UgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCAqLworCWlmIChpZCA9PSAwICYmIChlcnIgPSBtdjY0eDYwX21wc2NfcmVnaXN0ZXJfc2hhcmVkX3BkZXYobnApKSkKKwkJcmV0dXJuIGVycjsKKworCW1lbXNldChyLCAwLCBzaXplb2YocikpOworCisJZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJbMF0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzRdKTsKKworCXBoID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAic2RtYSIsIE5VTEwpOworCXNkbWEgPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZSgqcGgpOworCWlmICghc2RtYSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvZl9pcnFfdG9fcmVzb3VyY2Uoc2RtYSwgMCwgJnJbM10pOworCWVyciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uoc2RtYSwgMCwgJnJbMV0pOworCW9mX25vZGVfcHV0KHNkbWEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwaCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImJyZyIsIE5VTEwpOworCWJyZyA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CisJaWYgKCFicmcpCisJCXJldHVybiAtRU5PREVWOworCisJZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShicmcsIDAsICZyWzJdKTsKKwlvZl9ub2RlX3B1dChicmcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYmxvY2staW5kZXgiLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRU5PREVWOworCXBvcnRfbnVtYmVyID0gKihpbnQgKilwcm9wOworCisJbWVtc2V0KCZwZGF0YSwgMCwgc2l6ZW9mKHBkYXRhKSk7CisKKwlwZGF0YS5jYWNoZV9tZ210ID0gMTsgLyogQWxsIGN1cnJlbnQgcmV2cyBuZWVkIHRoaXMgc2V0ICovCisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibWF4X2lkbGUiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJcGRhdGEubWF4X2lkbGUgPSAqcHJvcDsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkoYnJnLCAiY3VycmVudC1zcGVlZCIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwZGF0YS5kZWZhdWx0X2JhdWQgPSAqcHJvcDsKKworCS8qIERlZmF1bHQgaXMgOCBiaXRzLCBubyBwYXJpdHksIG5vIGZsb3cgY29udHJvbCAqLworCXBkYXRhLmRlZmF1bHRfYml0cyA9IDg7CisJcGRhdGEuZGVmYXVsdF9wYXJpdHkgPSAnbic7CisJcGRhdGEuZGVmYXVsdF9mbG93ID0gJ24nOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNocl8xIiwgTlVMTCk7CisJaWYgKHByb3ApCisJCXBkYXRhLmNocl8xX3ZhbCA9ICpwcm9wOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNocl8yIiwgTlVMTCk7CisJaWYgKHByb3ApCisJCXBkYXRhLmNocl8yX3ZhbCA9ICpwcm9wOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNocl8xMCIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwZGF0YS5jaHJfMTBfdmFsID0gKnByb3A7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibXBjciIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwZGF0YS5tcGNyX3ZhbCA9ICpwcm9wOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShicmcsICJiY3IiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJcGRhdGEuYmNyX3ZhbCA9ICpwcm9wOworCisJcGRhdGEuYnJnX2Nhbl90dW5lID0gMTsgLyogQWxsIGN1cnJlbnQgcmV2cyBuZWVkIHRoaXMgc2V0ICovCisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGJyZywgImNsb2NrLXNyYyIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwZGF0YS5icmdfY2xrX3NyYyA9ICpwcm9wOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShicmcsICJjbG9jay1mcmVxdWVuY3kiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJcGRhdGEuYnJnX2Nsa19mcmVxID0gKnByb3A7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKE1QU0NfQ1RMUl9OQU1FLCBwb3J0X251bWJlcik7CisJaWYgKCFwZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsIHIsIDUpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEocGRldiwgJnBkYXRhLCBzaXplb2YocGRhdGEpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXBsYXRmb3JtX2RldmljZV9wdXQocGRldik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENyZWF0ZSBtdjY0eDYwX2V0aCBwbGF0Zm9ybSBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGV0aF9yZWdpc3Rlcl9zaGFyZWRfcGRldihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHJlc291cmNlIHJbMV07CisJaW50IGVycjsKKworCW5wID0gb2ZfZ2V0X3BhcmVudChucCk7CisJaWYgKCFucCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllcnIgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmclswXSk7CisJb2Zfbm9kZV9wdXQobnApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShNVjY0M1hYX0VUSF9TSEFSRURfTkFNRSwgMCwKKwkJCQkJICAgICAgIHIsIDEpOworCWlmIChJU19FUlIocGRldikpCisJCXJldHVybiBQVFJfRVJSKHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG12NjR4NjBfZXRoX2RldmljZV9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgaWQpCit7CisJc3RydWN0IHJlc291cmNlIHJbMV07CisJc3RydWN0IG12NjQzeHhfZXRoX3BsYXRmb3JtX2RhdGEgcGRhdGE7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeTsKKwljb25zdCB1OCAqbWFjX2FkZHI7CisJY29uc3QgaW50ICpwcm9wOworCWNvbnN0IHBoYW5kbGUgKnBoOworCWludCBlcnI7CisKKwkvKiBvbmx5IHJlZ2lzdGVyIHRoZSBzaGFyZWQgcGxhdGZvcm0gZGV2aWNlIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggKi8KKwlpZiAoaWQgPT0gMCAmJiAoZXJyID0gZXRoX3JlZ2lzdGVyX3NoYXJlZF9wZGV2KG5wKSkpCisJCXJldHVybiBlcnI7OworCisJbWVtc2V0KHIsIDAsIHNpemVvZihyKSk7CisJb2ZfaXJxX3RvX3Jlc291cmNlKG5wLCAwLCAmclswXSk7CisKKwltZW1zZXQoJnBkYXRhLCAwLCBzaXplb2YocGRhdGEpKTsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJibG9jay1pbmRleCIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcGRhdGEucG9ydF9udW1iZXIgPSAqcHJvcDsKKworCW1hY19hZGRyID0gb2ZfZ2V0X21hY19hZGRyZXNzKG5wKTsKKwlpZiAobWFjX2FkZHIpCisJCW1lbWNweShwZGF0YS5tYWNfYWRkciwgbWFjX2FkZHIsIDYpOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInNwZWVkIiwgTlVMTCk7CisJaWYgKHByb3ApCisJCXBkYXRhLnNwZWVkID0gKnByb3A7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAidHhfcXVldWVfc2l6ZSIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwZGF0YS50eF9xdWV1ZV9zaXplID0gKnByb3A7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicnhfcXVldWVfc2l6ZSIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwZGF0YS5yeF9xdWV1ZV9zaXplID0gKnByb3A7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAidHhfc3JhbV9hZGRyIiwgTlVMTCk7CisJaWYgKHByb3ApCisJCXBkYXRhLnR4X3NyYW1fYWRkciA9ICpwcm9wOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInR4X3NyYW1fc2l6ZSIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwZGF0YS50eF9zcmFtX3NpemUgPSAqcHJvcDsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyeF9zcmFtX2FkZHIiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJcGRhdGEucnhfc3JhbV9hZGRyID0gKnByb3A7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicnhfc3JhbV9zaXplIiwgTlVMTCk7CisJaWYgKHByb3ApCisJCXBkYXRhLnJ4X3NyYW1fc2l6ZSA9ICpwcm9wOworCisJcGggPSBvZl9nZXRfcHJvcGVydHkobnAsICJwaHkiLCBOVUxMKTsKKwlpZiAoIXBoKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBoeSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKCpwaCk7CisJaWYgKHBoeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkocGh5LCAicmVnIiwgTlVMTCk7CisJaWYgKHByb3ApIHsKKwkJcGRhdGEuZm9yY2VfcGh5X2FkZHIgPSAxOworCQlwZGF0YS5waHlfYWRkciA9ICpwcm9wOworCX0KKworCW9mX25vZGVfcHV0KHBoeSk7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKE1WNjQzWFhfRVRIX05BTUUsIHBkYXRhLnBvcnRfbnVtYmVyKTsKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgciwgMSk7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCAmcGRhdGEsIHNpemVvZihwZGF0YSkpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQ3JlYXRlIG12NjR4NjBfaTJjIHBsYXRmb3JtIGRldmljZXMKKyAqLworc3RhdGljIGludCBfX2luaXQgbXY2NHg2MF9pMmNfZGV2aWNlX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpZCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgclsyXTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBtdjY0eHh4X2kyY19wZGF0YSBwZGF0YTsKKwljb25zdCB1bnNpZ25lZCBpbnQgKnByb3A7CisJaW50IGVycjsKKworCW1lbXNldChyLCAwLCBzaXplb2YocikpOworCisJZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJbMF0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyWzFdKTsKKworCW1lbXNldCgmcGRhdGEsIDAsIHNpemVvZihwZGF0YSkpOworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImZyZXFfbSIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcGRhdGEuZnJlcV9tID0gKnByb3A7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZnJlcV9uIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwZGF0YS5mcmVxX24gPSAqcHJvcDsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJ0aW1lb3V0IiwgTlVMTCk7CisJaWYgKHByb3ApCisJCXBkYXRhLnRpbWVvdXQgPSAqcHJvcDsKKwllbHNlCisJCXBkYXRhLnRpbWVvdXQgPSAxMDAwOwkvKiAxIHNlY29uZCAqLworCisJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJldHJpZXMiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJcGRhdGEucmV0cmllcyA9ICpwcm9wOworCWVsc2UKKwkJcGRhdGEucmV0cmllcyA9IDE7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKE1WNjRYWFhfSTJDX0NUTFJfTkFNRSwgaWQpOworCWlmICghcGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCByLCAyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHBkZXYsICZwZGF0YSwgc2l6ZW9mKHBkYXRhKSk7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQocGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG12NjR4NjBfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisJaW50IGlkOworCWludCBlcnI7CisKKwlmb3IgKGlkID0gMDsKKwkgICAgIChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAic2VyaWFsIiwgIm1hcnZlbGwsbXBzYyIpKTsgaWQrKykKKwkJaWYgKChlcnIgPSBtdjY0eDYwX21wc2NfZGV2aWNlX3NldHVwKG5wLCBpZCkpKQorCQkJZ290byBlcnJvcjsKKworCWZvciAoaWQgPSAwOworCSAgICAgKG5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUobnAsICJuZXR3b3JrIiwKKwkJCQkJICAgIm1hcnZlbGwsbXY2NHg2MC1ldGgiKSk7CisJICAgICBpZCsrKQorCQlpZiAoKGVyciA9IG12NjR4NjBfZXRoX2RldmljZV9zZXR1cChucCwgaWQpKSkKKwkJCWdvdG8gZXJyb3I7CisKKwlmb3IgKGlkID0gMDsKKwkgICAgIChucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKG5wLCAiaTJjIiwgIm1hcnZlbGwsbXY2NHg2MC1pMmMiKSk7CisJICAgICBpZCsrKQorCQlpZiAoKGVyciA9IG12NjR4NjBfaTJjX2RldmljZV9zZXR1cChucCwgaWQpKSkKKwkJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiBlcnI7Cit9CithcmNoX2luaXRjYWxsKG12NjR4NjBfZGV2aWNlX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFlZjRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BjaS5jCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogUENJIGJ1cyBzZXR1cCBmb3IgTWFydmVsbCBtdjY0MzYwL212NjQ0NjAgaG9zdCBicmlkZ2VzIChEaXNjb3ZlcnkpCisgKgorICogQXV0aG9yOiBEYWxlIEZhcm5zd29ydGggPGRhbGVAZmFybnN3b3J0aC5vcmc+CisgKgorICogMjAwNyAoYykgTW9udGFWaXN0YSwgU29mdHdhcmUsIEluYy4gIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorCisjZGVmaW5lIFBDSV9IRUFERVJfVFlQRV9JTlZBTElECQkweDdmCS8qIEludmFsaWQgUENJIGhlYWRlciB0eXBlICovCisKKyNpZmRlZiBDT05GSUdfU1lTRlMKKy8qIDMyLWJpdCBoZXggb3IgZGVjIHN0cmluZ2lmaWVkIG51bWJlciArICdcbicgKi8KKyNkZWZpbmUgTVY2NFg2MF9WQUxfTEVOX01BWAkJMTEKKyNkZWZpbmUgTVY2NFg2MF9QQ0lDRkdfQ1BDSV9IT1RTV0FQCTB4NjgKKworc3RhdGljIHNzaXplX3QgbXY2NHg2MF9oc19yZWdfcmVhZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLAorCQkJCSAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGhiOworCXUzMiB2OworCisJaWYgKG9mZiA+IDApCisJCXJldHVybiAwOworCWlmIChjb3VudCA8IE1WNjRYNjBfVkFMX0xFTl9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJcGhiID0gcGNpX2dldF9idXNfYW5kX3Nsb3QoMCwgUENJX0RFVkZOKDAsIDApKTsKKwlpZiAoIXBoYikKKwkJcmV0dXJuIC1FTk9ERVY7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBoYiwgTVY2NFg2MF9QQ0lDRkdfQ1BDSV9IT1RTV0FQLCAmdik7CisJcGNpX2Rldl9wdXQocGhiKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgdik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG12NjR4NjBfaHNfcmVnX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsCisJCQkJICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGhiOworCXUzMiB2OworCisJaWYgKG9mZiA+IDApCisJCXJldHVybiAwOworCWlmIChjb3VudCA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzc2NhbmYoYnVmLCAiJWkiLCAmdikgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwaGIgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCBQQ0lfREVWRk4oMCwgMCkpOworCWlmICghcGhiKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBoYiwgTVY2NFg2MF9QQ0lDRkdfQ1BDSV9IT1RTV0FQLCB2KTsKKwlwY2lfZGV2X3B1dChwaGIpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgbXY2NHg2MF9oc19yZWdfYXR0ciA9IHsgLyogSG90c3dhcCByZWdpc3RlciAqLworCS5hdHRyID0geworCQkubmFtZSA9ICJoc19yZWciLAorCQkubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5zaXplICA9IE1WNjRYNjBfVkFMX0xFTl9NQVgsCisJLnJlYWQgID0gbXY2NHg2MF9oc19yZWdfcmVhZCwKKwkud3JpdGUgPSBtdjY0eDYwX2hzX3JlZ193cml0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG12NjR4NjBfc3lzZnNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwljb25zdCB1bnNpZ25lZCBpbnQgKnByb3A7CisKKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJtYXJ2ZWxsLG12NjR4NjAiKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gMDsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJoc19yZWdfdmFsaWQiLCBOVUxMKTsKKwlvZl9ub2RlX3B1dChucCk7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgibWFydmVsbCxtdjY0eDYwIiwgMCwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihwZGV2KSkKKwkJcmV0dXJuIFBUUl9FUlIocGRldik7CisKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJm12NjR4NjBfaHNfcmVnX2F0dHIpOworfQorCitzdWJzeXNfaW5pdGNhbGwobXY2NHg2MF9zeXNmc19pbml0KTsKKworI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgbXY2NHg2MF9wY2lfZml4dXBfZWFybHkoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwkvKgorCSAqIFNldCB0aGUgaG9zdCBicmlkZ2UgaGRyX3R5cGUgdG8gYW4gaW52YWxpZCB2YWx1ZSBzbyB0aGF0CisJICogcGNpX3NldHVwX2RldmljZSgpIHdpbGwgaWdub3JlIHRoZSBob3N0IGJyaWRnZS4KKwkgKi8KKwlkZXYtPmhkcl90eXBlID0gUENJX0hFQURFUl9UWVBFX0lOVkFMSUQ7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF9NVjY0MzYwLAorCQkJbXY2NHg2MF9wY2lfZml4dXBfZWFybHkpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCBQQ0lfREVWSUNFX0lEX01BUlZFTExfTVY2NDQ2MCwKKwkJCW12NjR4NjBfcGNpX2ZpeHVwX2Vhcmx5KTsKKworc3RhdGljIGludCBfX2luaXQgbXY2NHg2MF9hZGRfYnJpZGdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2KQoreworCWludCBsZW47CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlOworCXN0cnVjdCByZXNvdXJjZSByc3JjOworCWNvbnN0IGludCAqYnVzX3JhbmdlOworCWludCBwcmltYXJ5OworCisJbWVtc2V0KCZyc3JjLCAwLCBzaXplb2YocnNyYykpOworCisJLyogRmV0Y2ggaG9zdCBicmlkZ2UgcmVnaXN0ZXJzIGFkZHJlc3MgKi8KKwlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIDAsICZyc3JjKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIFBDSSByZWcgcHJvcGVydHkgaW4gZGV2aWNlIHRyZWVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBHZXQgYnVzIHJhbmdlIGlmIGFueSAqLworCWJ1c19yYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShkZXYsICJidXMtcmFuZ2UiLCAmbGVuKTsKKwlpZiAoYnVzX3JhbmdlID09IE5VTEwgfHwgbGVuIDwgMiAqIHNpemVvZihpbnQpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCBnZXQgYnVzLXJhbmdlIGZvciAlcywgYXNzdW1lIgorCQkgICAgICAgIiBidXMgMFxuIiwgZGV2LT5mdWxsX25hbWUpOworCisJaG9zZSA9IHBjaWJpb3NfYWxsb2NfY29udHJvbGxlcigpOworCWlmICghaG9zZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlob3NlLT5hcmNoX2RhdGEgPSBkZXY7CisJaG9zZS0+c2V0X2NmZ190eXBlID0gMTsKKworCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMDsKKwlob3NlLT5sYXN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzFdIDogMHhmZjsKKworCXNldHVwX2luZGlyZWN0X3BjaShob3NlLCByc3JjLnN0YXJ0LCByc3JjLnN0YXJ0ICsgNCk7CisJaG9zZS0+YnVzX29mZnNldCA9IGhvc2UtPmZpcnN0X2J1c25vOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTVY2NHg2MCBQQ0kgaG9zdCBicmlkZ2UgYXQgMHglMDE2bGx4LiAiCisJICAgICAgICJGaXJtd2FyZSBidXMgbnVtYmVyOiAlZC0+JWRcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcnNyYy5zdGFydCwgaG9zZS0+Zmlyc3RfYnVzbm8sCisJICAgICAgIGhvc2UtPmxhc3RfYnVzbm8pOworCisJLyogSW50ZXJwcmV0IHRoZSAicmFuZ2VzIiBwcm9wZXJ0eSAqLworCS8qIFRoaXMgYWxzbyBtYXBzIHRoZSBJL08gcmVnaW9uIGFuZCBzZXRzIGlzYV9pby9tZW1fYmFzZSAqLworCXByaW1hcnkgPSAoaG9zZS0+Zmlyc3RfYnVzbm8gPT0gMCk7CisJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3Jhbmdlcyhob3NlLCBkZXYsIHByaW1hcnkpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IG12NjR4NjBfcGNpX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKKworCXdoaWxlICgobnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJtYXJ2ZWxsLG12NjR4NjAtcGNpIikpKQorCQltdjY0eDYwX2FkZF9icmlkZ2UobnApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDMxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGljLmMKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBJbnRlcnJ1cHQgaGFuZGxpbmcgZm9yIE1hcnZlbGwgbXY2NDM2MC9tdjY0NDYwIGhvc3QgYnJpZGdlcyAoRGlzY292ZXJ5KQorICoKKyAqIEF1dGhvcjogRGFsZSBGYXJuc3dvcnRoIDxkYWxlQGZhcm5zd29ydGgub3JnPgorICoKKyAqIDIwMDcgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorCisjaW5jbHVkZSAibXY2NHg2MC5oIgorCisvKiBJbnRlcnJ1cHQgQ29udHJvbGxlciBJbnRlcmZhY2UgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1WNjRYNjBfSUNfTUFJTl9DQVVTRV9MTwkweDAwMDQKKyNkZWZpbmUgTVY2NFg2MF9JQ19NQUlOX0NBVVNFX0hJCTB4MDAwYworI2RlZmluZSBNVjY0WDYwX0lDX0NQVTBfSU5UUl9NQVNLX0xPCTB4MDAxNAorI2RlZmluZSBNVjY0WDYwX0lDX0NQVTBfSU5UUl9NQVNLX0hJCTB4MDAxYworI2RlZmluZSBNVjY0WDYwX0lDX0NQVTBfU0VMRUNUX0NBVVNFCTB4MDAyNAorCisjZGVmaW5lIE1WNjRYNjBfSElHSF9HUFBfR1JPVVBTCQkweDBmMDAwMDAwCisjZGVmaW5lIE1WNjRYNjBfU0VMRUNUX0NBVVNFX0hJR0gJMHg0MDAwMDAwMAorCisvKiBHZW5lcmFsIFB1cnBvc2UgUGlucyBDb250cm9sbGVyIEludGVyZmFjZSBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVY2NHg2MF9HUFBfSU5UUl9DQVVTRQkJMHgwMDA4CisjZGVmaW5lIE1WNjR4NjBfR1BQX0lOVFJfTUFTSwkJMHgwMDBjCisKKyNkZWZpbmUgTVY2NHg2MF9MRVZFTDFfTE9XCQkwCisjZGVmaW5lIE1WNjR4NjBfTEVWRUwxX0hJR0gJCTEKKyNkZWZpbmUgTVY2NHg2MF9MRVZFTDFfR1BQCQkyCisKKyNkZWZpbmUgTVY2NHg2MF9MRVZFTDFfTUFTSwkJMHgwMDAwMDA2MAorI2RlZmluZSBNVjY0eDYwX0xFVkVMMV9PRkZTRVQJCTUKKworI2RlZmluZSBNVjY0eDYwX0xFVkVMMl9NQVNLCQkweDAwMDAwMDFmCisKKyNkZWZpbmUgTVY2NHg2MF9OVU1fSVJRUwkJOTYKKworc3RhdGljIERFRklORV9TUElOTE9DSyhtdjY0eDYwX2xvY2spOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICptdjY0eDYwX2lycV9yZWdfYmFzZTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm12NjR4NjBfZ3BwX3JlZ19iYXNlOworCisvKgorICogSW50ZXJydXB0IENvbnRyb2xsZXIgSGFuZGxpbmcKKyAqCisgKiBUaGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgaGFuZGxlcyB0aHJlZSBncm91cHMgb2YgaW50ZXJydXB0czoKKyAqICAgbWFpbiBsb3c6CUlSUTAtSVJRMzEKKyAqICAgbWFpbiBoaWdoOglJUlEzMi1JUlE2MworICogICBncHA6CUlSUTY0LUlSUTk1CisgKgorICogVGhpcyBjb2RlIGhhbmRsZXMgaW50ZXJydXB0cyBpbiB0d28gbGV2ZWxzLiAgTGV2ZWwgMSBzZWxlY3RzIHRoZQorICogaW50ZXJydXB0IGdyb3VwLCBhbmQgbGV2ZWwgMiBzZWxlY3RzIGFuIElSUSB3aXRoaW4gdGhhdCBncm91cC4KKyAqIEVhY2ggZ3JvdXAgaGFzIGl0cyBvd24gaXJxX2NoaXAgc3RydWN0dXJlLgorICovCisKK3N0YXRpYyB1MzIgbXY2NHg2MF9jYWNoZWRfbG93X21hc2s7CitzdGF0aWMgdTMyIG12NjR4NjBfY2FjaGVkX2hpZ2hfbWFzayA9IE1WNjRYNjBfSElHSF9HUFBfR1JPVVBTOworc3RhdGljIHUzMiBtdjY0eDYwX2NhY2hlZF9ncHBfbWFzazsKKworc3RhdGljIHN0cnVjdCBpcnFfaG9zdCAqbXY2NHg2MF9pcnFfaG9zdDsKKworLyoKKyAqIG12NjR4NjBfY2hpcF9sb3cgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgbXY2NHg2MF9tYXNrX2xvdyh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgbGV2ZWwyID0gaXJxX21hcFt2aXJxXS5od2lycSAmIE1WNjR4NjBfTEVWRUwyX01BU0s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtdjY0eDYwX2xvY2ssIGZsYWdzKTsKKwltdjY0eDYwX2NhY2hlZF9sb3dfbWFzayAmPSB+KDEgPDwgbGV2ZWwyKTsKKwlvdXRfbGUzMihtdjY0eDYwX2lycV9yZWdfYmFzZSArIE1WNjRYNjBfSUNfQ1BVMF9JTlRSX01BU0tfTE8sCisJCSBtdjY0eDYwX2NhY2hlZF9sb3dfbWFzayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXY2NHg2MF9sb2NrLCBmbGFncyk7CisJKHZvaWQpaW5fbGUzMihtdjY0eDYwX2lycV9yZWdfYmFzZSArIE1WNjRYNjBfSUNfQ1BVMF9JTlRSX01BU0tfTE8pOworfQorCitzdGF0aWMgdm9pZCBtdjY0eDYwX3VubWFza19sb3codW5zaWduZWQgaW50IHZpcnEpCit7CisJaW50IGxldmVsMiA9IGlycV9tYXBbdmlycV0uaHdpcnEgJiBNVjY0eDYwX0xFVkVMMl9NQVNLOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXY2NHg2MF9sb2NrLCBmbGFncyk7CisJbXY2NHg2MF9jYWNoZWRfbG93X21hc2sgfD0gMSA8PCBsZXZlbDI7CisJb3V0X2xlMzIobXY2NHg2MF9pcnFfcmVnX2Jhc2UgKyBNVjY0WDYwX0lDX0NQVTBfSU5UUl9NQVNLX0xPLAorCQkgbXY2NHg2MF9jYWNoZWRfbG93X21hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm12NjR4NjBfbG9jaywgZmxhZ3MpOworCSh2b2lkKWluX2xlMzIobXY2NHg2MF9pcnFfcmVnX2Jhc2UgKyBNVjY0WDYwX0lDX0NQVTBfSU5UUl9NQVNLX0xPKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBtdjY0eDYwX2NoaXBfbG93ID0geworCS5uYW1lCQk9ICJtdjY0eDYwX2xvdyIsCisJLm1hc2sJCT0gbXY2NHg2MF9tYXNrX2xvdywKKwkubWFza19hY2sJPSBtdjY0eDYwX21hc2tfbG93LAorCS51bm1hc2sJCT0gbXY2NHg2MF91bm1hc2tfbG93LAorfTsKKworLyoKKyAqIG12NjR4NjBfY2hpcF9oaWdoIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyB2b2lkIG12NjR4NjBfbWFza19oaWdoKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCBsZXZlbDIgPSBpcnFfbWFwW3ZpcnFdLmh3aXJxICYgTVY2NHg2MF9MRVZFTDJfTUFTSzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm12NjR4NjBfbG9jaywgZmxhZ3MpOworCW12NjR4NjBfY2FjaGVkX2hpZ2hfbWFzayAmPSB+KDEgPDwgbGV2ZWwyKTsKKwlvdXRfbGUzMihtdjY0eDYwX2lycV9yZWdfYmFzZSArIE1WNjRYNjBfSUNfQ1BVMF9JTlRSX01BU0tfSEksCisJCSBtdjY0eDYwX2NhY2hlZF9oaWdoX21hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm12NjR4NjBfbG9jaywgZmxhZ3MpOworCSh2b2lkKWluX2xlMzIobXY2NHg2MF9pcnFfcmVnX2Jhc2UgKyBNVjY0WDYwX0lDX0NQVTBfSU5UUl9NQVNLX0hJKTsKK30KKworc3RhdGljIHZvaWQgbXY2NHg2MF91bm1hc2tfaGlnaCh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgbGV2ZWwyID0gaXJxX21hcFt2aXJxXS5od2lycSAmIE1WNjR4NjBfTEVWRUwyX01BU0s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtdjY0eDYwX2xvY2ssIGZsYWdzKTsKKwltdjY0eDYwX2NhY2hlZF9oaWdoX21hc2sgfD0gMSA8PCBsZXZlbDI7CisJb3V0X2xlMzIobXY2NHg2MF9pcnFfcmVnX2Jhc2UgKyBNVjY0WDYwX0lDX0NQVTBfSU5UUl9NQVNLX0hJLAorCQkgbXY2NHg2MF9jYWNoZWRfaGlnaF9tYXNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdjY0eDYwX2xvY2ssIGZsYWdzKTsKKwkodm9pZClpbl9sZTMyKG12NjR4NjBfaXJxX3JlZ19iYXNlICsgTVY2NFg2MF9JQ19DUFUwX0lOVFJfTUFTS19ISSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXY2NHg2MF9jaGlwX2hpZ2ggPSB7CisJLm5hbWUJCT0gIm12NjR4NjBfaGlnaCIsCisJLm1hc2sJCT0gbXY2NHg2MF9tYXNrX2hpZ2gsCisJLm1hc2tfYWNrCT0gbXY2NHg2MF9tYXNrX2hpZ2gsCisJLnVubWFzawkJPSBtdjY0eDYwX3VubWFza19oaWdoLAorfTsKKworLyoKKyAqIG12NjR4NjBfY2hpcF9ncHAgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIHZvaWQgbXY2NHg2MF9tYXNrX2dwcCh1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlpbnQgbGV2ZWwyID0gaXJxX21hcFt2aXJxXS5od2lycSAmIE1WNjR4NjBfTEVWRUwyX01BU0s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtdjY0eDYwX2xvY2ssIGZsYWdzKTsKKwltdjY0eDYwX2NhY2hlZF9ncHBfbWFzayAmPSB+KDEgPDwgbGV2ZWwyKTsKKwlvdXRfbGUzMihtdjY0eDYwX2dwcF9yZWdfYmFzZSArIE1WNjR4NjBfR1BQX0lOVFJfTUFTSywKKwkJIG12NjR4NjBfY2FjaGVkX2dwcF9tYXNrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdjY0eDYwX2xvY2ssIGZsYWdzKTsKKwkodm9pZClpbl9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfSU5UUl9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgbXY2NHg2MF9tYXNrX2Fja19ncHAodW5zaWduZWQgaW50IHZpcnEpCit7CisJaW50IGxldmVsMiA9IGlycV9tYXBbdmlycV0uaHdpcnEgJiBNVjY0eDYwX0xFVkVMMl9NQVNLOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXY2NHg2MF9sb2NrLCBmbGFncyk7CisJbXY2NHg2MF9jYWNoZWRfZ3BwX21hc2sgJj0gfigxIDw8IGxldmVsMik7CisJb3V0X2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9JTlRSX01BU0ssCisJCSBtdjY0eDYwX2NhY2hlZF9ncHBfbWFzayk7CisJb3V0X2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9JTlRSX0NBVVNFLAorCQkgfigxIDw8IGxldmVsMikpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm12NjR4NjBfbG9jaywgZmxhZ3MpOworCSh2b2lkKWluX2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9JTlRSX0NBVVNFKTsKK30KKworc3RhdGljIHZvaWQgbXY2NHg2MF91bm1hc2tfZ3BwKHVuc2lnbmVkIGludCB2aXJxKQoreworCWludCBsZXZlbDIgPSBpcnFfbWFwW3ZpcnFdLmh3aXJxICYgTVY2NHg2MF9MRVZFTDJfTUFTSzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm12NjR4NjBfbG9jaywgZmxhZ3MpOworCW12NjR4NjBfY2FjaGVkX2dwcF9tYXNrIHw9IDEgPDwgbGV2ZWwyOworCW91dF9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfSU5UUl9NQVNLLAorCQkgbXY2NHg2MF9jYWNoZWRfZ3BwX21hc2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm12NjR4NjBfbG9jaywgZmxhZ3MpOworCSh2b2lkKWluX2xlMzIobXY2NHg2MF9ncHBfcmVnX2Jhc2UgKyBNVjY0eDYwX0dQUF9JTlRSX01BU0spOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG12NjR4NjBfY2hpcF9ncHAgPSB7CisJLm5hbWUJCT0gIm12NjR4NjBfZ3BwIiwKKwkubWFzawkJPSBtdjY0eDYwX21hc2tfZ3BwLAorCS5tYXNrX2Fjawk9IG12NjR4NjBfbWFza19hY2tfZ3BwLAorCS51bm1hc2sJCT0gbXY2NHg2MF91bm1hc2tfZ3BwLAorfTsKKworLyoKKyAqIG12NjR4NjBfaG9zdF9vcHMgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCBtdjY0eDYwX2hvc3RfbWF0Y2goc3RydWN0IGlycV9ob3N0ICpoLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXJldHVybiBtdjY0eDYwX2lycV9ob3N0LT5ob3N0X2RhdGEgPT0gbnA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgKm12NjR4NjBfY2hpcHNbXSA9IHsKKwlbTVY2NHg2MF9MRVZFTDFfTE9XXSAgPSAmbXY2NHg2MF9jaGlwX2xvdywKKwlbTVY2NHg2MF9MRVZFTDFfSElHSF0gPSAmbXY2NHg2MF9jaGlwX2hpZ2gsCisJW01WNjR4NjBfTEVWRUwxX0dQUF0gID0gJm12NjR4NjBfY2hpcF9ncHAsCit9OworCitzdGF0aWMgaW50IG12NjR4NjBfaG9zdF9tYXAoc3RydWN0IGlycV9ob3N0ICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCSAgaXJxX2h3X251bWJlcl90IGh3aXJxKQoreworCWludCBsZXZlbDE7CisKKwlnZXRfaXJxX2Rlc2ModmlycSktPnN0YXR1cyB8PSBJUlFfTEVWRUw7CisKKwlsZXZlbDEgPSAoaHdpcnEgJiBNVjY0eDYwX0xFVkVMMV9NQVNLKSA+PiBNVjY0eDYwX0xFVkVMMV9PRkZTRVQ7CisJQlVHX09OKGxldmVsMSA+IE1WNjR4NjBfTEVWRUwxX0dQUCk7CisJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsIG12NjR4NjBfY2hpcHNbbGV2ZWwxXSwgaGFuZGxlX2xldmVsX2lycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfaG9zdF9vcHMgbXY2NHg2MF9ob3N0X29wcyA9IHsKKwkubWF0Y2ggPSBtdjY0eDYwX2hvc3RfbWF0Y2gsCisJLm1hcCAgID0gbXY2NHg2MF9ob3N0X21hcCwKK307CisKKy8qCisgKiBHbG9iYWwgZnVuY3Rpb25zCisgKi8KKwordm9pZCBfX2luaXQgbXY2NHg2MF9pbml0X2lycSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJcGh5c19hZGRyX3QgcGFkZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisJY29uc3QgdW5zaWduZWQgaW50ICpyZWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgIm1hcnZlbGwsbXY2NHg2MC1ncHAiKTsKKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCAmc2l6ZSk7CisJcGFkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhucCwgcmVnKTsKKwltdjY0eDYwX2dwcF9yZWdfYmFzZSA9IGlvcmVtYXAocGFkZHIsIHJlZ1sxXSk7CisJb2Zfbm9kZV9wdXQobnApOworCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAibWFydmVsbCxtdjY0eDYwLXBpYyIpOworCXJlZyA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZzaXplKTsKKwlwYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKG5wLCByZWcpOworCW9mX25vZGVfcHV0KG5wKTsKKwltdjY0eDYwX2lycV9yZWdfYmFzZSA9IGlvcmVtYXAocGFkZHIsIHJlZ1sxXSk7CisKKwltdjY0eDYwX2lycV9ob3N0ID0gaXJxX2FsbG9jX2hvc3QoSVJRX0hPU1RfTUFQX0xJTkVBUiwgTVY2NHg2MF9OVU1fSVJRUywKKwkJCQkJICAmbXY2NHg2MF9ob3N0X29wcywgTVY2NHg2MF9OVU1fSVJRUyk7CisKKwltdjY0eDYwX2lycV9ob3N0LT5ob3N0X2RhdGEgPSBucDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtdjY0eDYwX2xvY2ssIGZsYWdzKTsKKwlvdXRfbGUzMihtdjY0eDYwX2dwcF9yZWdfYmFzZSArIE1WNjR4NjBfR1BQX0lOVFJfTUFTSywKKwkJIG12NjR4NjBfY2FjaGVkX2dwcF9tYXNrKTsKKwlvdXRfbGUzMihtdjY0eDYwX2lycV9yZWdfYmFzZSArIE1WNjRYNjBfSUNfQ1BVMF9JTlRSX01BU0tfTE8sCisJCSBtdjY0eDYwX2NhY2hlZF9sb3dfbWFzayk7CisJb3V0X2xlMzIobXY2NHg2MF9pcnFfcmVnX2Jhc2UgKyBNVjY0WDYwX0lDX0NQVTBfSU5UUl9NQVNLX0hJLAorCQkgbXY2NHg2MF9jYWNoZWRfaGlnaF9tYXNrKTsKKworCW91dF9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsgTVY2NHg2MF9HUFBfSU5UUl9DQVVTRSwgMCk7CisJb3V0X2xlMzIobXY2NHg2MF9pcnFfcmVnX2Jhc2UgKyBNVjY0WDYwX0lDX01BSU5fQ0FVU0VfTE8sIDApOworCW91dF9sZTMyKG12NjR4NjBfaXJxX3JlZ19iYXNlICsgTVY2NFg2MF9JQ19NQUlOX0NBVVNFX0hJLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdjY0eDYwX2xvY2ssIGZsYWdzKTsKK30KKwordW5zaWduZWQgaW50IG12NjR4NjBfZ2V0X2lycSh2b2lkKQoreworCXUzMiBjYXVzZTsKKwlpbnQgbGV2ZWwxOworCWlycV9od19udW1iZXJfdCBod2lycTsKKwlpbnQgdmlycSA9IE5PX0lSUTsKKworCWNhdXNlID0gaW5fbGUzMihtdjY0eDYwX2lycV9yZWdfYmFzZSArIE1WNjRYNjBfSUNfQ1BVMF9TRUxFQ1RfQ0FVU0UpOworCWlmIChjYXVzZSAmIE1WNjRYNjBfU0VMRUNUX0NBVVNFX0hJR0gpIHsKKwkJY2F1c2UgJj0gbXY2NHg2MF9jYWNoZWRfaGlnaF9tYXNrOworCQlsZXZlbDEgPSBNVjY0eDYwX0xFVkVMMV9ISUdIOworCQlpZiAoY2F1c2UgJiBNVjY0WDYwX0hJR0hfR1BQX0dST1VQUykgeworCQkJY2F1c2UgPSBpbl9sZTMyKG12NjR4NjBfZ3BwX3JlZ19iYXNlICsKKwkJCQkJTVY2NHg2MF9HUFBfSU5UUl9DQVVTRSk7CisJCQljYXVzZSAmPSBtdjY0eDYwX2NhY2hlZF9ncHBfbWFzazsKKwkJCWxldmVsMSA9IE1WNjR4NjBfTEVWRUwxX0dQUDsKKwkJfQorCX0gZWxzZSB7CisJCWNhdXNlICY9IG12NjR4NjBfY2FjaGVkX2xvd19tYXNrOworCQlsZXZlbDEgPSBNVjY0eDYwX0xFVkVMMV9MT1c7CisJfQorCWlmIChjYXVzZSkgeworCQlod2lycSA9IChsZXZlbDEgPDwgTVY2NHg2MF9MRVZFTDFfT0ZGU0VUKSB8IF9faWxvZzIoY2F1c2UpOworCQl2aXJxID0gaXJxX2xpbmVhcl9yZXZtYXAobXY2NHg2MF9pcnFfaG9zdCwgaHdpcnEpOworCX0KKworCXJldHVybiB2aXJxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvNHh4X2lvL3NlcmlhbF9zaWNjLmMgYi9hcmNoL3BwYy80eHhfaW8vc2VyaWFsX3NpY2MuYwppbmRleCBlMzU0ODM5Li5lZmEwYTU2IDEwMDY0NAotLS0gYS9hcmNoL3BwYy80eHhfaW8vc2VyaWFsX3NpY2MuYworKysgYi9hcmNoL3BwYy80eHhfaW8vc2VyaWFsX3NpY2MuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiAgQmFzZWQgb24gZHJpdmVycy9jaGFyL3NlcmlhbF9hbWJhLmMsIGJ5IEFSTSBMdGQuCiAgKgotICogIENvcHlyaWdodCAyMDAxIElCTSBDcm9wLgorICogIENvcHlyaWdodCAyMDAxIElCTSBDb3JwLgogICogIEF1dGhvcjogSUJNIENoaW5hIFJlc2VhcmNoIExhYgogICogICAgICAgICAgICBZdWRvbmcgWWFuZyA8eWFuZ3l1ZEBjbi5pYm0uY29tPgogICogICAgICAgICAgICBZaSBHZSAgICAgICA8Z2V5aUBjbi5pYm0uY29tPgpAQCAtMTU1LDE2ICsxNTUsMTYgQEAKIAogLyogc2VyaWFsIHBvcnQgdHJhbnNtaXQgY29tbWFuZCByZWdpc3RlciAqLwogCi0jZGVmaW5lIF9UeENSX0VUX01BU0sgICAweDgwICAgICAgICAgICAvKiB0cmFuc21pdGVyIGVuYWJsZSBtYXNrICovCisjZGVmaW5lIF9UeENSX0VUX01BU0sgICAweDgwICAgICAgICAgICAvKiB0cmFuc21pdHRlciBlbmFibGUgbWFzayAqLwogI2RlZmluZSBfVHhDUl9ETUVfTUFTSyAgMHg2MCAgICAgICAgICAgLyogZG1hIG1vZGUgbWFzayAqLwogI2RlZmluZSBfVHhDUl9USUVfTUFTSyAgMHgxMCAgICAgICAgICAgLyogZW1wdHkgaW50ZXJydXB0IGVuYWJsZSBtYXNrICovCiAjZGVmaW5lIF9UeENSX0VJRV9NQVNLICAweDA4ICAgICAgICAgICAvKiBlcnJvciBpbnRlcnJ1cHQgZW5hYmxlIG1hc2sgKi8KICNkZWZpbmUgX1R4Q1JfU1BFX01BU0sgIDB4MDQgICAgICAgICAgIC8qIHN0b3AvcGF1c2UgbWFzayAqLwogI2RlZmluZSBfVHhDUl9UQl9NQVNLICAgMHgwMiAgICAgICAgICAgLyogdHJhbnNtaXQgYnJlYWsgbWFzayAqLwogCi0jZGVmaW5lIF9UeENSX0VUX0VOQUJMRSBfVHhDUl9FVF9NQVNLICAvKiB0cmFuc21pdGVyIGVuYWJsZWQgKi8KLSNkZWZpbmUgX1R4Q1JfRE1FX0RJU0FCTEUgMHgwMCAgICAgICAgIC8qIHRyYW5zbWl0ZXIgZGlzYWJsZWQsIFRCUiBpbnRyIGRpc2FibGVkICovCi0jZGVmaW5lIF9UeENSX0RNRV9UQlIgICAweDIwICAgICAgICAgICAvKiB0cmFuc21pdGVyIGRpc2FibGVkLCBUQlIgaW50ciBlbmFibGVkICovCisjZGVmaW5lIF9UeENSX0VUX0VOQUJMRSBfVHhDUl9FVF9NQVNLICAvKiB0cmFuc21pdHRlciBlbmFibGVkICovCisjZGVmaW5lIF9UeENSX0RNRV9ESVNBQkxFIDB4MDAgICAgICAgICAvKiB0cmFuc21pdHRlciBkaXNhYmxlZCwgVEJSIGludHIgZGlzYWJsZWQgKi8KKyNkZWZpbmUgX1R4Q1JfRE1FX1RCUiAgIDB4MjAgICAgICAgICAgIC8qIHRyYW5zbWl0dGVyIGRpc2FibGVkLCBUQlIgaW50ciBlbmFibGVkICovCiAjZGVmaW5lIF9UeENSX0RNRV9DSEFOXzIgMHg0MCAgICAgICAgICAvKiBkbWEgZW5hYmxlZCwgZGVzdGluYXRpb24gY2hhbm4gMiAqLwogI2RlZmluZSBfVHhDUl9ETUVfQ0hBTl8zIDB4NjAgICAgICAgICAgLyogZG1hIGVuYWJsZWQsIGRlc3RpbmF0aW9uIGNoYW5uIDMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvOHh4X2lvL2NvbW1wcm9jLmMgYi9hcmNoL3BwYy84eHhfaW8vY29tbXByb2MuYwppbmRleCBlMmM2MjEwLi43MDg4NDI4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy84eHhfaW8vY29tbXByb2MuYworKysgYi9hcmNoL3BwYy84eHhfaW8vY29tbXByb2MuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAKIAkvKiBTZXQgU0RNQSBCdXMgUmVxdWVzdCBwcmlvcml0eSA1LgogCSAqIE9uIDg2MFQsIHRoaXMgYWxzbyBlbmFibGVzIEZFQyBwcmlvcml0eSA2LiAgSSBhbSBub3Qgc3VyZQotCSAqIHRoaXMgaXMgd2hhdCB3ZSByZWFseSB3YW50IGZvciBzb21lIGFwcGxpY2F0aW9ucywgYnV0IHRoZQorCSAqIHRoaXMgaXMgd2hhdCB3ZSByZWFsbHkgd2FudCBmb3Igc29tZSBhcHBsaWNhdGlvbnMsIGJ1dCB0aGUKIAkgKiBtYW51YWwgcmVjb21tZW5kcyBpdC4KIAkgKiBCaXQgMjUsIEZBTSBjYW4gYWxzbyBiZSBzZXQgdG8gdXNlIEZFQyBhZ2dyZXNzaXZlIG1vZGUgKDg2MFQpLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvOHh4X2lvL2ZlYy5jIGIvYXJjaC9wcGMvOHh4X2lvL2ZlYy5jCmluZGV4IDU3YTlhNjEuLmQzODMzNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjLzh4eF9pby9mZWMuYworKysgYi9hcmNoL3BwYy84eHhfaW8vZmVjLmMKQEAgLTE4NzgsNyArMTg3OCw3IEBACiAJYmRwLS07CiAJYmRwLT5jYmRfc2MgfD0gQkRfU0NfV1JBUDsKIAotCS8qIC4uLmFuZCB0aGUgc2FtZSBmb3IgdHJhbnNtbWl0LgorCS8qIC4uLmFuZCB0aGUgc2FtZSBmb3IgdHJhbnNtaXQuCiAJKi8KIAliZHAgPSBmZXAtPnR4X2JkX2Jhc2U7CiAJZm9yIChpPTA7IGk8VFhfUklOR19TSVpFOyBpKyspIHsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3QvbGliL3ZyZXNldC5jIGIvYXJjaC9wcGMvYm9vdC9saWIvdnJlc2V0LmMKaW5kZXggNDYzYmEwMC4uOTg1MzllOSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9saWIvdnJlc2V0LmMKKysrIGIvYXJjaC9wcGMvYm9vdC9saWIvdnJlc2V0LmMKQEAgLTUxOCw3ICs1MTgsNyBAQAogCW91dGIoMHgzYzYsIDB4ZmYpOyAgLyogTUFTSyAqLwogCiAJZm9yICggaSA9IDA7IGkgPCAweDEwOyBpKyspCi0JCXdyaXRlQXR0cihpLCBBQ1tpXSwgMCk7ICAvKiBwYWxsZXRlICovCisJCXdyaXRlQXR0cihpLCBBQ1tpXSwgMCk7ICAvKiBwYWxldHRlICovCiAJd3JpdGVBdHRyKDB4MTAsIDB4MGMsIDApOyAgICAvKiB0ZXh0IG1vZGUgKi8KIAl3cml0ZUF0dHIoMHgxMSwgMHgwMCwgMCk7ICAgIC8qIG92ZXJzY2FuIGNvbG9yIChib3JkZXIpICovCiAJd3JpdGVBdHRyKDB4MTIsIDB4MGYsIDApOyAgICAvKiBwbGFuZSBlbmFibGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL204eHhfdHR5LmMgYi9hcmNoL3BwYy9ib290L3NpbXBsZS9tOHh4X3R0eS5jCmluZGV4IGNhY2M0MGYuLmVhNjE1ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL204eHhfdHR5LmMKKysrIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvbTh4eF90dHkuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIE1pbmltYWwgc2VyaWFsIGZ1bmN0aW9ucyBuZWVkZWQgdG8gc2VuZCBtZXNzYWdlcyBvdXQgdGhlIHNlcmlhbAogICogcG9ydCBvbiB0aGUgTUJYIGNvbnNvbGUuCiAgKgotICogVGhlIE1CWCB1eGVzIFNNQzEgZm9yIHRoZSBzZXJpYWwgcG9ydC4gIFdlIHJlc2V0IHRoZSBwb3J0IGFuZCB1c2UKKyAqIFRoZSBNQlggdXNlcyBTTUMxIGZvciB0aGUgc2VyaWFsIHBvcnQuICBXZSByZXNldCB0aGUgcG9ydCBhbmQgdXNlCiAgKiBvbmx5IHRoZSBmaXJzdCBCRCB0aGF0IEVQUEMtQnVnIHNldCB1cCBhcyBhIGNoYXJhY3RlciBGSUZPLgogICoKICAqIExhdGVyIHZlcnNpb25zIChhdCBsZWFzdCAxLjQsIG1heWJlIGVhcmxpZXIpIG9mIHRoZSBNQlggRVBQQy1CdWcKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2MtZW1iZWRkZWQuYyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2MtZW1iZWRkZWQuYwppbmRleCAxMDIxOWVlYy4uOGEwOGFkMyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9zaW1wbGUvbWlzYy1lbWJlZGRlZC5jCisrKyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL21pc2MtZW1iZWRkZWQuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAKIAkvKgogCSAqIFdlIGxpbmsgb3Vyc2VsZiB0byBhbiBhcmJpdHJhcnkgbG93IGFkZHJlc3MuICBXaGVuIHdlIHJ1biwgd2UKLQkgKiByZWxvY2F0ZSBvdXRzZWxmIHRvIHRoYXQgYWRkcmVzcy4gIF9faW1hZ2VfYmVpbmcgcG9pbnRzIHRvCisJICogcmVsb2NhdGUgb3Vyc2VsZiB0byB0aGF0IGFkZHJlc3MuICBfX2ltYWdlX2JlaW5nIHBvaW50cyB0bwogCSAqIHRoZSBwYXJ0IG9mIHRoZSBpbWFnZSB3aGVyZSB0aGUgekltYWdlIGlzLiAtLSBUb20KIAkgKi8KIAl6aW1hZ2Vfc3RhcnQgPSAoY2hhciAqKSh1bnNpZ25lZCBsb25nKSgmX19pbWFnZV9iZWdpbik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L3NpbXBsZS9tcGM1Mnh4X3R0eS5jIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvbXBjNTJ4eF90dHkuYwppbmRleCA3YjU5MjRjYy4uNjk1NTg5MSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvYm9vdC9zaW1wbGUvbXBjNTJ4eF90dHkuYworKysgYi9hcmNoL3BwYy9ib290L3NpbXBsZS9tcGM1Mnh4X3R0eS5jCkBAIC0zMyw3ICszMyw3IEBACiAgKiBydGMuICBXZSByZWFkIHRoZSBkZWNyZW1lbnRlciBjaGFuZ2UgZHVyaW5nIG9uZSBydGMgdGljawogICogYW5kIG11bHRpcGx5IGJ5IDQgdG8gZ2V0IHRoZSBzeXN0ZW0gYnVzIGNsb2NrIGZyZXF1ZW5jeS4gU2luY2UgYQogICogcnRjIHRpY2sgaXMgb25lIHNlY29uZHMsIGFuZCB0aGF0J3MgcHJldHR5IGxvbmcsIHdlIGNoYW5nZSB0aGUgcnRjCi0gKiBkaXZpZGVycyB0ZW1wb3Jhcmx5IHRvIHNldCB0aGVtIDY0eCBmYXN0ZXIgOykKKyAqIGRpdmlkZXJzIHRlbXBvcmFyaWx5IHRvIHNldCB0aGVtIDY0eCBmYXN0ZXIgOykKICAqLwogc3RhdGljIGludAogbXBjNTJ4eF9pcGJmcmVxKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L3NpbXBsZS9tdjY0eDYwX3R0eS5jIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvbXY2NHg2MF90dHkuYwppbmRleCA3ODFlMDQwLi44YTczNTc4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9ib290L3NpbXBsZS9tdjY0eDYwX3R0eS5jCisrKyBiL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL212NjR4NjBfdHR5LmMKQEAgLTMzOCw3ICszMzgsNyBAQAogCiAJcmRwID0gJnJkW2NvbV9wb3J0XVtjdXJfcmRbY29tX3BvcnRdXTsKIAotCS8qIEdvIHRocnUgcmN2IGRlc2MncyB1bnRpbCBlbXB0eSBsb29raW5nIGZvciBvbmUgd2l0aCBkYXRhIChubyBlcnJvcikqLworCS8qIEdvIHRocm91Z2ggcmN2IGRlc2NzIHVudGlsIGVtcHR5IGxvb2tpbmcgZm9yIG9uZSB3aXRoIGRhdGEgKG5vIGVycm9yKSovCiAJd2hpbGUgKCgocmRwLT5jbWRfc3RhdCAmIFNETUFfREVTQ19DTURTVEFUX08pID09IDApICYmCiAJCShsb29wX2NvdW50KysgPCBSWF9OVU1fREVTQykpIHsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvYm9vdC9zaW1wbGUvcnc0L3N0Yi5oIGIvYXJjaC9wcGMvYm9vdC9zaW1wbGUvcnc0L3N0Yi5oCmluZGV4IGZkOThlZTAuLjlhZmE1YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3Qvc2ltcGxlL3J3NC9zdGIuaAorKysgYi9hcmNoL3BwYy9ib290L3NpbXBsZS9ydzQvc3RiLmgKQEAgLTg4LDcgKzg4LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIHwgU1RCIHRhc2tzLCB0YXNrIHN0YWNrIHNpemVzLCBhbmQgdGFzayBwcmlvcml0aWVzLiAgVGhlIGFjdHVhbCB0YXNrIHByaW9yaXR5CiB8IGlzIDEgbW9yZSB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIHNpbmNlIHByaW9yaXR5IDAgaXMgcmVzZXJ2ZWQgKHN5c3RlbQotfCBpbnRlcm5hbHkgYWRkcyAxIHRvIHN1cHBsaWVkIHByaW9yaXR5IG51bWJlcikuCit8IGludGVybmFsbHkgYWRkcyAxIHRvIHN1cHBsaWVkIHByaW9yaXR5IG51bWJlcikuCiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAjZGVmaW5lIFNUQl9JRExFX1RBU0tfU1MgICAgICAgICg1KiAxMDI0KQogI2RlZmluZSBTVEJfSURMRV9UQVNLX1BSSU8gICAgICAwCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCmluZGV4IDgxMGY3YWEuLmFlYTEwMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvcHBjL2tlcm5lbC90cmFwcy5jCkBAIC01NzcsNyArNTc3LDcgQEAKIAkgKiBFU1JfRFNUICghPykgb3IgMC4gIEluIHRoZSBwcm9jZXNzIG9mIGNoYXNpbmcgdGhpcyB3aXRoIHRoZQogCSAqIGhhcmR3YXJlIHBlb3BsZSAtIG5vdCBzdXJlIGlmIGl0IGNhbiBoYXBwZW4gb24gYW55IGlsbGVnYWwKIAkgKiBpbnN0cnVjdGlvbiBvciBvbmx5IG9uIEZQIGluc3RydWN0aW9ucywgd2hldGhlciB0aGVyZSBpcyBhCi0JICogcGF0dGVybiB0byBvY2N1cmVuY2VzIGV0Yy4gLWRnaWJzb24gMzEvTWFyLzIwMDMgKi8KKwkgKiBwYXR0ZXJuIHRvIG9jY3VycmVuY2VzIGV0Yy4gLWRnaWJzb24gMzEvTWFyLzIwMDMgKi8KIAlpZiAoIShyZWFzb24gJiBSRUFTT05fVFJBUCkgJiYgZG9fbWF0aGVtdShyZWdzKSA9PSAwKSB7CiAJCWVtdWxhdGVfc2luZ2xlX3N0ZXAocmVncyk7CiAJCXJldHVybjsKQEAgLTg2MCw3ICs4NjAsNyBAQAogCXNwZWZzY3IgPSBjdXJyZW50LT50aHJlYWQuc3BlZnNjcjsKIAlmcGV4Y19tb2RlID0gY3VycmVudC0+dGhyZWFkLmZwZXhjX21vZGU7CiAKLQkvKiBIYXJkd2FyZSBkb2VzIG5vdCBuZWNjZXNzYXJpbHkgc2V0IHN0aWNreQorCS8qIEhhcmR3YXJlIGRvZXMgbm90IG5lY2Vzc2FyaWx5IHNldCBzdGlja3kKIAkgKiB1bmRlcmZsb3cvb3ZlcmZsb3cvaW52YWxpZCBmbGFncyAqLwogCWlmICgoc3BlZnNjciAmIFNQRUZTQ1JfRk9WRikgJiYgKGZwZXhjX21vZGUgJiBQUl9GUF9FWENfT1ZGKSkgewogCQljb2RlID0gRlBFX0ZMVE9WRjsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL21tL2luaXQuYyBiL2FyY2gvcHBjL21tL2luaXQuYwppbmRleCBjMzc0ZTUzLi4zOTBkZDE5IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9tbS9pbml0LmMKKysrIGIvYXJjaC9wcGMvbW0vaW5pdC5jCkBAIC00OCw3ICs0OCw3IEBACiAjaW5jbHVkZSAibW11X2RlY2wuaCIKIAogI2lmIGRlZmluZWQoQ09ORklHX0tFUk5FTF9TVEFSVF9CT09MKSB8fCBkZWZpbmVkKENPTkZJR19MT1dNRU1fU0laRV9CT09MKQotLyogVGhlIGFtbW91bnQgb2YgbG93bWVtIG11c3QgYmUgd2l0aGluIDB4RjAwMDAwMDAgLSBLRVJORUxCQVNFLiAqLworLyogVGhlIGFtb3VudCBvZiBsb3dtZW0gbXVzdCBiZSB3aXRoaW4gMHhGMDAwMDAwMCAtIEtFUk5FTEJBU0UuICovCiAjaWYgKENPTkZJR19MT1dNRU1fU0laRSA+ICgweEYwMDAwMDAwIC0gS0VSTkVMQkFTRSkpCiAjZXJyb3IgIllvdSBtdXN0IGFkanVzdCBDT05GSUdfTE9XTUVNX1NJWkUgb3IgQ09ORklHX1NUQVJUX0tFUk5FTCIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9idWJpbmdhLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2J1YmluZ2EuYwppbmRleCA3NTg1N2IzLi4xYTdmMDc1IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2J1YmluZ2EuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2J1YmluZ2EuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCSAgICBob3NlLT5maXJzdF9idXNubywgUENJX1NMT1QoaG9zZS0+Zmlyc3RfYnVzbm8pLAogCQkgICAgUENJX0ZVTkMoaG9zZS0+Zmlyc3RfYnVzbm8pLCBiYXIsIGJhcl9yZXNwb25zZSk7CiAJfQotCS8qIGVuZCB3b3JrIGFycm91bmQgKi8KKwkvKiBlbmQgd29ya2Fyb3VuZCAqLwogCiAjaWZkZWYgREVCVUcKIAlwcmludGsoIlBDSSBicmlkZ2UgcmVncyBhZnRlciBmaXh1cCBcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9lcDQwNS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9lcDQwNS5jCmluZGV4IGU1YWRmOWJhLi41YWEyOTUwIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2VwNDA1LmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9lcDQwNS5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJICAgIGhvc2UtPmZpcnN0X2J1c25vLCBQQ0lfU0xPVChob3NlLT5maXJzdF9idXNubyksCiAJCSAgICBQQ0lfRlVOQyhob3NlLT5maXJzdF9idXNubyksIGJhciwgYmFyX3Jlc3BvbnNlKTsKIAl9Ci0JLyogZW5kIHdvcmsgYXJyb3VuZCAqLworCS8qIGVuZCB3b3JrYXJvdW5kICovCiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm1ucDQwNWguaCBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvaWJtbnA0MDVoLmgKaW5kZXggNGFhODgyMS4uMDhhNmE3NyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9pYm1ucDQwNWguaAorKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L2libW5wNDA1aC5oCkBAIC04MCw3ICs4MCw3IEBACiAjZGVmaW5lIERDUk5fQ1BNRlJfQkFTRQkweDBCOQogI2RlZmluZSBEQ1JOX0NQTUVSX0JBU0UJMHgwQjgKIAotLyogQ1BNIENsb2NraW5nICYgUG93ZXIgTWFuZ2VtZW50IGRlZmluZXMgKi8KKy8qIENQTSBDbG9ja2luZyAmIFBvd2VyIE1hbmFnZW1lbnQgZGVmaW5lcyAqLwogI2RlZmluZSBJQk1fQ1BNX1BDSQkJMHg0MDAwMDAwMAkvKiBQQ0kgKi8KICNkZWZpbmUgSUJNX0NQTV9FTUFDMgkweDIwMDAwMDAwCS8qIEVNQUMgMiBNSUkgKi8KICNkZWZpbmUgSUJNX0NQTV9FTUFDMwkweDA0MDAwMDAwCS8qIEVNQUMgMyBNSUkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvc3ljYW1vcmUuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvc3ljYW1vcmUuYwppbmRleCBjNDc0OTNlLi44Njg5ZjNlIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3N5Y2Ftb3JlLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9zeWNhbW9yZS5jCkBAIC0yMjUsNyArMjI1LDcgQEAKIAkJICAgIGhvc2UtPmZpcnN0X2J1c25vLCBQQ0lfU0xPVChob3NlLT5maXJzdF9idXNubyksCiAJCSAgICBQQ0lfRlVOQyhob3NlLT5maXJzdF9idXNubyksIGJhciwgYmFyX3Jlc3BvbnNlKTsKIAl9Ci0JLyogZW5kIHdvcmsgYXJyb3VuZCAqLworCS8qIGVuZCB3b3JrYXJvdW5kICovCiAKICNpZmRlZiBERUJVRwogCXByaW50aygiUENJIGJyaWRnZSByZWdzIGFmdGVyIGZpeHVwIFxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3dhbG51dC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC93YWxudXQuYwppbmRleCBmNDE0ZDJkLi4yZjk3NzIzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L3dhbG51dC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvd2FsbnV0LmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCQkgICAgaG9zZS0+Zmlyc3RfYnVzbm8sIFBDSV9TTE9UKGhvc2UtPmZpcnN0X2J1c25vKSwKIAkJICAgIFBDSV9GVU5DKGhvc2UtPmZpcnN0X2J1c25vKSwgYmFyLCBiYXJfcmVzcG9uc2UpOwogCX0KLQkvKiBlbmQgd29yayBhcnJvdW5kICovCisJLyogZW5kIHdvcmsgYXJvdW5kICovCiAKICNpZmRlZiBERUJVRwogCXByaW50aygiUENJIGJyaWRnZSByZWdzIGFmdGVyIGZpeHVwIFxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvZXY2NDM2MC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2V2NjQzNjAuYwppbmRleCBmODdlMDZmLi5mOGJhZjA1IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvZXY2NDM2MC5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9ldjY0MzYwLmMKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCSAqIGFyZSBub24temVybywgdGhlbiB3ZSBzaG91bGQgdXNlIHRoZSBib2FyZCBpbmZvIGZyb20gdGhlIGJkX3QKIAkgKiBzdHJ1Y3R1cmUgYW5kIHRoZSBjbWRsaW5lIHBvaW50ZWQgdG8gYnkgcjYgaW5zdGVhZCBvZiB0aGUKIAkgKiBpbmZvcm1hdGlvbiBmcm9tIGJpcmVjcywgaWYgYW55LiAgT3RoZXJ3aXNlLCB1c2UgdGhlIGluZm9ybWF0aW9uCi0JICogZnJvbSBiaXJlY3MgYXMgZGlzY292ZXJlZCBieSB0aGUgcHJlY2VlZGluZyBjYWxsIHRvCisJICogZnJvbSBiaXJlY3MgYXMgZGlzY292ZXJlZCBieSB0aGUgcHJlY2VkaW5nIGNhbGwgdG8KIAkgKiBwYXJzZV9ib290aW5mbygpLiAgVGhpcyBydWxlIHNob3VsZCB3b3JrIHdpdGggYm90aCBQUENCb290LCB3aGljaAogCSAqIHVzZXMgYSBiZF90IGJvYXJkIGluZm8gc3RydWN0dXJlLCBhbmQgdGhlIGtlcm5lbCBib290IHdyYXBwZXIsCiAJICogd2hpY2ggdXNlcyBiaXJlY3MuCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMvaGRwdS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL2hkcHUuYwppbmRleCBkODA5ZTE3Li5jYTVkZTEzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvaGRwdS5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9oZHB1LmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiAJLyogRW5hYmxlIHBpcGVsaW5pbmcgKi8KIAltdjY0eDYwX3NldF9iaXRzKCZiaCwgTVY2NHg2MF9DUFVfQ09ORklHLCAoMSA8PCAxMykpOwotCS8qIEVuYWJsZSBTbm9vcCBQaXBlbGluZWluZyAqLworCS8qIEVuYWJsZSBTbm9vcCBQaXBlbGluaW5nICovCiAJbXY2NHg2MF9zZXRfYml0cygmYmgsIE1WNjQzNjBfRF9VTklUX0NPTlRST0xfSElHSCwgKDEgPDwgMjQpKTsKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9wbGF0Zm9ybXMva2F0YW5hLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMva2F0YW5hLmMKaW5kZXggNzIwZjhiMy4uYzI4OWU5ZiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL2thdGFuYS5jCisrKyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9rYXRhbmEuYwpAQCAtODgwLDcgKzg4MCw3IEBACiAJICogYXJlIG5vbi16ZXJvLCB0aGVuIHdlIHNob3VsZCB1c2UgdGhlIGJvYXJkIGluZm8gZnJvbSB0aGUgYmRfdAogCSAqIHN0cnVjdHVyZSBhbmQgdGhlIGNtZGxpbmUgcG9pbnRlZCB0byBieSByNiBpbnN0ZWFkIG9mIHRoZQogCSAqIGluZm9ybWF0aW9uIGZyb20gYmlyZWNzLCBpZiBhbnkuICBPdGhlcndpc2UsIHVzZSB0aGUgaW5mb3JtYXRpb24KLQkgKiBmcm9tIGJpcmVjcyBhcyBkaXNjb3ZlcmVkIGJ5IHRoZSBwcmVjZWVkaW5nIGNhbGwgdG8KKwkgKiBmcm9tIGJpcmVjcyBhcyBkaXNjb3ZlcmVkIGJ5IHRoZSBwcmVjZWRpbmcgY2FsbCB0bwogCSAqIHBhcnNlX2Jvb3RpbmZvKCkuICBUaGlzIHJ1bGUgc2hvdWxkIHdvcmsgd2l0aCBib3RoIFBQQ0Jvb3QsIHdoaWNoCiAJICogdXNlcyBhIGJkX3QgYm9hcmQgaW5mbyBzdHJ1Y3R1cmUsIGFuZCB0aGUga2VybmVsIGJvb3Qgd3JhcHBlciwKIAkgKiB3aGljaCB1c2VzIGJpcmVjcy4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tYnguaCBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9tYnguaAppbmRleCBmZTgxY2E0Li4xY2YzNmZhIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvbWJ4LmgKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL21ieC5oCkBAIC0zNyw3ICszNyw3IEBACiAKIC8qIE1lbW9yeSBtYXAgZm9yIHRoZSBNQlggYXMgY29uZmlndXJlZCBieSBFUFBDLUJ1Zy4gIFdlIGNvdWxkIHJlcHJvZ3JhbQogICogVGhlIFNJVSBhbmQgUENJIGJyaWRnZSwgYW5kIHRyeSB0byB1c2UgbGFyZ2VyIE1NVSBwYWdlcywgYnV0IHRoZQotICogcGVyZm9ybWFuY2UgZ2FpbiBpcyBub3QgbWVhc3VyZWFibGUgYW5kIGl0IGNlcnRhaW5seSBjb21wbGljYXRlcyB0aGUKKyAqIHBlcmZvcm1hbmNlIGdhaW4gaXMgbm90IG1lYXN1cmFibGUgYW5kIGl0IGNlcnRhaW5seSBjb21wbGljYXRlcyB0aGUKICAqIGdlbmVyaWMgTU1VIG1vZGVsLgogICoKICAqIEluIGEgZWZmb3J0IHRvIG1pbmltaXplIG1lbW9yeSB1c2FnZSBmb3IgZW1iZWRkZWQgYXBwbGljYXRpb25zLCBhbnkKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9tdm1lNTEwMC5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL212bWU1MTAwLmgKaW5kZXggOWUyYTA5ZS4uZmJiNTQ5NSAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL212bWU1MTAwLmgKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL212bWU1MTAwLmgKQEAgLTY5LDcgKzY5LDcgQEAKIAogI2RlZmluZSBTVERfQ09NX0ZMQUdTIEFTWU5DX0JPT1RfQVVUT0NPTkYKIAotLyogQWxsIFVBUlQgSVJRJ3MgYXJlIHdpcmUtT1InZCB0byBvbmUgTVBJQyBJUlEgKi8KKy8qIEFsbCBVQVJUIElSUXMgYXJlIHdpcmUtT1InZCB0byBvbmUgTVBJQyBJUlEgKi8KICNkZWZpbmUgU1REX1NFUklBTF9QT1JUX0RGTlMgXAogICAgICAgICB7IDAsIEJBU0VfQkFVRCwgTVZNRTUxMDBfU0VSSUFMXzEsIFwKIAkJTVZNRTUxMDBfU0VSSUFMX0lSUSwgXApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BwbHVzLmggYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcHBsdXMuaAppbmRleCBhMDdjYmJkLi5hNGJiYWE4IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcHBsdXMuaAorKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcHBsdXMuaApAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAvKgotICogRHVlIHRvIGxpbWlhdGlvbnMgaW1wb3NlZCBieSBsZWdhY3kgaGFyZHdhcmUgKHByaW1hcnlpbHkgSURFIGNvbnRyb2xsZXJzKSwKKyAqIER1ZSB0byBsaW1pdGF0aW9ucyBpbXBvc2VkIGJ5IGxlZ2FjeSBoYXJkd2FyZSAocHJpbWFyaWx5IElERSBjb250cm9sbGVycyksCiAgKiB0aGUgUFBMVVMgYm9hcmRzIG9wZXJhdGUgdXNpbmcgYSBQUmVQIGFkZHJlc3MgbWFwLgogICoKICAqIEZyb20gUHJvY2Vzc29yIChwaHlzaWNhbCkgLT4gUENJOgpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3ByZXBfcGNpLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9wY2kuYwppbmRleCBjNjI3YmE0Li4xZGYzMTUwIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9wY2kuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9wY2kuYwpAQCAtNTg5LDkgKzU4OSw5IEBACiAJeyA0LCAxLCAyLCAzfSwgIC8qIEJ1c2VzIDMsIDcsIDExIC4uLiAqLwogfTsKIAotLyogV2UgaGF2ZSB0byB0dXJuIG9uIExFVkVMIG1vZGUgZm9yIGNoYW5nZWQgSVJRJ3MgKi8KLS8qIEFsbCBQQ0kgSVJRJ3MgbmVlZCB0byBiZSBsZXZlbCBtb2RlLCBzbyB0aGlzIHNob3VsZCBiZSBzb21ldGhpbmcKLSAqIG90aGVyIHRoYW4gaGFyZC1jb2RlZCBhcyB3ZWxsLi4uIElSUSdzIGFyZSBpbmRpdmlkdWFsbHkgbWFwcGFibGUKKy8qIFdlIGhhdmUgdG8gdHVybiBvbiBMRVZFTCBtb2RlIGZvciBjaGFuZ2VkIElSUXMgKi8KKy8qIEFsbCBQQ0kgSVJRcyBuZWVkIHRvIGJlIGxldmVsIG1vZGUsIHNvIHRoaXMgc2hvdWxkIGJlIHNvbWV0aGluZworICogb3RoZXIgdGhhbiBoYXJkLWNvZGVkIGFzIHdlbGwuLi4gSVJRcyBhcmUgaW5kaXZpZHVhbGx5IG1hcHBhYmxlCiAgKiB0byBlaXRoZXIgZWRnZSBvciBsZXZlbC4KICAqLwogCkBAIC05MjMsOCArOTIzLDggQEAKIAlNb3RoZXJib2FyZF9tYXBfbmFtZSA9ICJJQk0gNjAxNS83MDIwIChTYW5kYWxmb290L1NhbmRhbGJvdykiOwogCU1vdGhlcmJvYXJkX21hcCA9IGlibTYwMTVfcGNpX0lSUV9tYXA7CiAJTW90aGVyYm9hcmRfcm91dGVzID0gaWJtNjAxNV9wY2lfSVJRX3JvdXRlczsKLQkqaXJxX2VkZ2VfbWFza19sbyA9IDB4MDA7IC8qIGlycSdzIDAtNyBhbGwgZWRnZS10cmlnZ2VyZWQgKi8KLQkqaXJxX2VkZ2VfbWFza19oaSA9IDB4QTA7IC8qIGlycSdzIDEzLCAxNSBsZXZlbC10cmlnZ2VyZWQgKi8KKwkqaXJxX2VkZ2VfbWFza19sbyA9IDB4MDA7IC8qIElSUXMgMC03IGFsbCBlZGdlLXRyaWdnZXJlZCAqLworCSppcnFfZWRnZV9tYXNrX2hpID0gMHhBMDsgLyogSVJRcyAxMywgMTUgbGV2ZWwtdHJpZ2dlcmVkICovCiB9CiAKIHZvaWQgX19pbml0CkBAIC05MzMsOCArOTMzLDggQEAKIAlNb3RoZXJib2FyZF9tYXBfbmFtZSA9ICJJQk0gVGhpbmtwYWQgODUwLzg2MCI7CiAJTW90aGVyYm9hcmRfbWFwID0gTm9iaXNfcGNpX0lSUV9tYXA7CiAJTW90aGVyYm9hcmRfcm91dGVzID0gTm9iaXNfcGNpX0lSUV9yb3V0ZXM7Ci0JKmlycV9lZGdlX21hc2tfbG8gPSAweDAwOyAvKiBpcnEncyAwLTcgYWxsIGVkZ2UtdHJpZ2dlcmVkICovCi0JKmlycV9lZGdlX21hc2tfaGkgPSAweEEwOyAvKiBpcnEncyAxMywgMTUgbGV2ZWwtdHJpZ2dlcmVkICovCisJKmlycV9lZGdlX21hc2tfbG8gPSAweDAwOyAvKiBJUlFzIDAtNyBhbGwgZWRnZS10cmlnZ2VyZWQgKi8KKwkqaXJxX2VkZ2VfbWFza19oaSA9IDB4QTA7IC8qIElSUXMgMTMsIDE1IGxldmVsLXRyaWdnZXJlZCAqLwogfQogCiB2b2lkIF9faW5pdApAQCAtOTQzLDggKzk0Myw4IEBACiAJTW90aGVyYm9hcmRfbWFwX25hbWUgPSAiSUJNIDcyNDgsIFBvd2VyU2VyaWVzIDgzMC84NTAgKENhcm9saW5hKSI7CiAJTW90aGVyYm9hcmRfbWFwID0gaWJtOHh4X3BjaV9JUlFfbWFwOwogCU1vdGhlcmJvYXJkX3JvdXRlcyA9IGlibTh4eF9wY2lfSVJRX3JvdXRlczsKLQkqaXJxX2VkZ2VfbWFza19sbyA9IDB4MDA7IC8qIGlycSdzIDAtNyBhbGwgZWRnZS10cmlnZ2VyZWQgKi8KLQkqaXJxX2VkZ2VfbWFza19oaSA9IDB4QTQ7IC8qIGlycSdzIDEwLCAxMywgMTUgbGV2ZWwtdHJpZ2dlcmVkICovCisJKmlycV9lZGdlX21hc2tfbG8gPSAweDAwOyAvKiBJUlFzIDAtNyBhbGwgZWRnZS10cmlnZ2VyZWQgKi8KKwkqaXJxX2VkZ2VfbWFza19oaSA9IDB4QTQ7IC8qIElSUXMgMTAsIDEzLCAxNSBsZXZlbC10cmlnZ2VyZWQgKi8KIH0KIAogdm9pZCBfX2luaXQKQEAgLTk1NCw4ICs5NTQsOCBAQAogCU1vdGhlcmJvYXJkX21hcCA9IGlibTQzcF9wY2lfSVJRX21hcDsKIAlNb3RoZXJib2FyZF9yb3V0ZXMgPSBpYm00M3BfcGNpX0lSUV9yb3V0ZXM7CiAJTW90aGVyYm9hcmRfbm9uMCA9IGlibTQzcF9wY2lfbWFwX25vbjA7Ci0JKmlycV9lZGdlX21hc2tfbG8gPSAweDAwOyAvKiBpcnEncyAwLTcgYWxsIGVkZ2UtdHJpZ2dlcmVkICovCi0JKmlycV9lZGdlX21hc2tfaGkgPSAweEEwOyAvKiBpcnEncyAxMywgMTUgbGV2ZWwtdHJpZ2dlcmVkICovCisJKmlycV9lZGdlX21hc2tfbG8gPSAweDAwOyAvKiBJUlFzIDAtNyBhbGwgZWRnZS10cmlnZ2VyZWQgKi8KKwkqaXJxX2VkZ2VfbWFza19oaSA9IDB4QTA7IC8qIElSUXMgMTMsIDE1IGxldmVsLXRyaWdnZXJlZCAqLwogfQogCiB2b2lkIF9faW5pdApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zL3ByZXBfc2V0dXAuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9wcmVwX3NldHVwLmMKaW5kZXggZjE2NjI5OS4uNmYyMTExMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3ByZXBfc2V0dXAuYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvcHJlcF9zZXR1cC5jCkBAIC01OTMsNyArNTkzLDcgQEAKIAlQUENfREVWSUNFICphdWRpb2RldmljZSA9IE5VTEw7CiAKIAkvKgotCSAqIEdldCB0aGUgbmVlZGVkIHJlc291cmNlIGluZm9ybWF0aW9ucyBmcm9tIHJlc2lkdWFsIGRhdGEuCisJICogR2V0IHRoZSBuZWVkZWQgcmVzb3VyY2UgaW5mb3JtYXRpb24gZnJvbSByZXNpZHVhbCBkYXRhLgogCSAqCiAJICovCiAJaWYgKGhhdmVfcmVzaWR1YWxfZGF0YSkKQEAgLTYzMiw5ICs2MzIsOSBAQAogCX0KIAogCS8qCi0JICogRmluZCBhIHdheSB0byBwdXNoIHRoZXNlIGluZm9ybWF0aW9ucyB0byB0aGUgY3M0MjMyIGRyaXZlcgorCSAqIEZpbmQgYSB3YXkgdG8gcHVzaCB0aGlzIGluZm9ybWF0aW9uIHRvIHRoZSBjczQyMzIgZHJpdmVyCiAJICogR2l2ZSBpdCBvdXQgd2l0aCBwcmludGssIHdoZW4gbm90IGluIGNtZF9saW5lPwotCSAqIEFwcGVuZCBpdCB0byAgY21kX2xpbmUgYW5kIGJvb3RfY29tbWFuZF9saW5lPworCSAqIEFwcGVuZCBpdCB0byBjbWRfbGluZSBhbmQgYm9vdF9jb21tYW5kX2xpbmU/CiAJICogRm9ybWF0IGlzIGNzNDIzMj1pbyxpcnEsZG1hLGRtYTIKIAkgKi8KIH0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9wcnBtYzc1MC5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BycG1jNzUwLmgKaW5kZXggNGM3YWRjYy4uYzRkY2ZmMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3BycG1jNzUwLmgKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3BycG1jNzUwLmgKQEAgLTE2LDcgKzE2LDcgQEAKICNkZWZpbmUgX19BU01fUFJQTUM3NTBfSF9fCiAKIC8qCi0gKiBEdWUgdG8gbGltaWF0aW9ucyBpbXBvc2VkIGJ5IGxlZ2FjeSBoYXJkd2FyZSAocHJpbWFyeWlseSBJREUgY29udHJvbGxlcnMpLAorICogRHVlIHRvIGxpbWl0YXRpb25zIGltcG9zZWQgYnkgbGVnYWN5IGhhcmR3YXJlIChwcmltYXJpbHkgSURFIGNvbnRyb2xsZXJzKSwKICAqIHRoZSBQclBNQzc1MCBjYXJyaWVyIGJvYXJkIG9wZXJhdGVzIHVzaW5nIGEgUFJlUCBhZGRyZXNzIG1hcC4KICAqCiAgKiBGcm9tIFByb2Nlc3NvciAocGh5c2ljYWwpIC0+IFBDSToKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9yYWRzdG9uZV9wcGM3ZC5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3JhZHN0b25lX3BwYzdkLmMKaW5kZXggMTNkNzBhYi4uYjU1ODYwNyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zL3JhZHN0b25lX3BwYzdkLmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3JhZHN0b25lX3BwYzdkLmMKQEAgLTEzNzEsNyArMTM3MSw3IEBACiAJICogYXJlIG5vbi16ZXJvLCB0aGVuIHdlIHNob3VsZCB1c2UgdGhlIGJvYXJkIGluZm8gZnJvbSB0aGUgYmRfdAogCSAqIHN0cnVjdHVyZSBhbmQgdGhlIGNtZGxpbmUgcG9pbnRlZCB0byBieSByNiBpbnN0ZWFkIG9mIHRoZQogCSAqIGluZm9ybWF0aW9uIGZyb20gYmlyZWNzLCBpZiBhbnkuICBPdGhlcndpc2UsIHVzZSB0aGUgaW5mb3JtYXRpb24KLQkgKiBmcm9tIGJpcmVjcyBhcyBkaXNjb3ZlcmVkIGJ5IHRoZSBwcmVjZWVkaW5nIGNhbGwgdG8KKwkgKiBmcm9tIGJpcmVjcyBhcyBkaXNjb3ZlcmVkIGJ5IHRoZSBwcmVjZWRpbmcgY2FsbCB0bwogCSAqIHBhcnNlX2Jvb3RpbmZvKCkuICBUaGlzIHJ1bGUgc2hvdWxkIHdvcmsgd2l0aCBib3RoIFBQQ0Jvb3QsIHdoaWNoCiAJICogdXNlcyBhIGJkX3QgYm9hcmQgaW5mbyBzdHJ1Y3R1cmUsIGFuZCB0aGUga2VybmVsIGJvb3Qgd3JhcHBlciwKIAkgKiB3aGljaCB1c2VzIGJpcmVjcy4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy9zYW5kcG9pbnQuYyBiL2FyY2gvcHBjL3BsYXRmb3Jtcy9zYW5kcG9pbnQuYwppbmRleCBhNzYwMDJhLi4zMzUyZmFlIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvc2FuZHBvaW50LmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zL3NhbmRwb2ludC5jCkBAIC01NCw3ICs1NCw3IEBACiAgKgogICoKICAqIE1vdG9yb2xhIGhhcyBmaW5hbGx5IHJlbGVhc2VkIGEgdmVyc2lvbiBvZiBESU5LMzIgdGhhdCBjb3JyZWN0bHkKLSAqIChzZWVtaW5nbHkpIGluaXRhbGl6ZXMgdGhlIG1lbW9yeSBjb250cm9sbGVyIGNvcnJlY3RseSwgcmVnYXJkbGVzcworICogKHNlZW1pbmdseSkgaW5pdGlhbGl6ZXMgdGhlIG1lbW9yeSBjb250cm9sbGVyIGNvcnJlY3RseSwgcmVnYXJkbGVzcwogICogb2YgdGhlIGFtb3VudCBvZiBtZW1vcnkgaW4gdGhlIHN5c3RlbS4gIE9uY2UgYSBtZXRob2Qgb2YgZGV0ZXJtaW5pbmcKICAqIHdoYXQgdmVyc2lvbiBvZiBESU5LIGluaXRpYWxpemVzIHRoZSBzeXN0ZW0gZm9yIHVzLCBpZiBhcHBsaWNhYmxlLCBpcwogICogZm91bmQsIHdlIGNhbiBob3BlZnVsbHkgc3RvcCBoYXJkY29kaW5nIDMyTUIgb2YgUkFNLgpAQCAtNDczLDcgKzQ3Myw3IEBACiBhcmNoX2luaXRjYWxsKHNhbmRwb2ludF9yZXF1ZXN0X2lvKTsKIAogLyoKLSAqIEludGVycnVwdCBzZXR1cCBhbmQgc2VydmljZS4gIEludGVycnJ1cHRzIG9uIHRoZSBTYW5kcG9pbnQgY29tZQorICogSW50ZXJydXB0IHNldHVwIGFuZCBzZXJ2aWNlLiAgSW50ZXJydXB0cyBvbiB0aGUgU2FuZHBvaW50IGNvbWUKICAqIGZyb20gdGhlIGZvdXIgUENJIHNsb3RzIHBsdXMgdGhlIDgyNTkgaW4gdGhlIFdpbmJvbmQgU3VwZXIgSS9PIChTSU8pLgogICogVGhlIDgyNTkgaXMgY2FzY2FkZWQgZnJvbSBFUElDIElSUTAsIElSUTEtNCBtYXAgdG8gUENJIHNsb3RzIDEtNCwKICAqIElERSBpcyBvbiBFUElDIDcgYW5kIDguCkBAIC01MDUsNyArNTA1LDcgQEAKIAlpZiAoYnAtPmJpX21lbXNpemUpCiAJCXJldHVybiBicC0+YmlfbWVtc2l6ZTsKIAotCS8qIERJTkszMiAxMy4wIGNvcnJlY3RseSBpbml0YWxpemVzIHRoaW5ncywgc28gaWZmIHlvdSB1c2UKKwkvKiBESU5LMzIgMTMuMCBjb3JyZWN0bHkgaW5pdGlhbGl6ZXMgdGhpbmdzLCBzbyBpZmYgeW91IHVzZQogCSAqIHRoaXMgeW91IF9zaG91bGRfIGJlIGFibGUgdG8gY2hhbmdlIHRoaXMgaW5zdGVhZCBvZiBhCiAJICogaGFyZGNvZGVkIHZhbHVlLiAqLwogI2lmIDAKQEAgLTY3Nyw3ICs2NzcsNyBAQAogCSAqIGFyZSBub24temVybywgdGhlbiB3ZSBzaG91bGQgdXNlIHRoZSBib2FyZCBpbmZvIGZyb20gdGhlIGJkX3QKIAkgKiBzdHJ1Y3R1cmUgYW5kIHRoZSBjbWRsaW5lIHBvaW50ZWQgdG8gYnkgcjYgaW5zdGVhZCBvZiB0aGUKIAkgKiBpbmZvcm1hdGlvbiBmcm9tIGJpcmVjcywgaWYgYW55LiAgT3RoZXJ3aXNlLCB1c2UgdGhlIGluZm9ybWF0aW9uCi0JICogZnJvbSBiaXJlY3MgYXMgZGlzY292ZXJlZCBieSB0aGUgcHJlY2VlZGluZyBjYWxsIHRvCisJICogZnJvbSBiaXJlY3MgYXMgZGlzY292ZXJlZCBieSB0aGUgcHJlY2VkaW5nIGNhbGwgdG8KIAkgKiBwYXJzZV9ib290aW5mbygpLiAgVGhpcyBydWxlIHNob3VsZCB3b3JrIHdpdGggYm90aCBQUENCb290LCB3aGljaAogCSAqIHVzZXMgYSBiZF90IGJvYXJkIGluZm8gc3RydWN0dXJlLCBhbmQgdGhlIGtlcm5lbCBib290IHdyYXBwZXIsCiAJICogd2hpY2ggdXNlcyBiaXJlY3MuCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvaGFycmllci5jIGIvYXJjaC9wcGMvc3lzbGliL2hhcnJpZXIuYwppbmRleCBjMTU4M2Y0Li40NWI3OTdiIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvaGFycmllci5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9oYXJyaWVyLmMKQEAgLTIxMCw3ICsyMTAsNyBAQAogICogVGhpcyBhc3N1bWVzIHRoYXQgUFBDQnVnIGhhcyBpbml0aWFsaXplZCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIgKFNNQykKICAqIG9uIHRoZSBIYXJyaWVyIGNvcnJlY3RseSAoaS5lLiwgaXQgZG9lcyBubyBzYW5pdHkgY2hlY2tpbmcpLgogICogSXQgYWxzbyBhc3N1bWVzIHRoYXQgdGhlIG1lbW9yeSBiYXNlIHJlZ2lzdGVycyBhcmUgc2V0IHRvIGNvbmZpZ3VyZSB0aGUKLSAqIG1lbW9yeSBhcyBjb250aWdvdXMgc3RhcnRpbmcgd2l0aCAiUkFNIEEgQkFTRSIsICJSQU0gQiBCQVNFIiwgZXRjLgorICogbWVtb3J5IGFzIGNvbnRpZ3VvdXMgc3RhcnRpbmcgd2l0aCAiUkFNIEEgQkFTRSIsICJSQU0gQiBCQVNFIiwgZXRjLgogICogaG93ZXZlciwgUkFNIGJhc2UgcmVnaXN0ZXJzIGNhbiBiZSBza2lwcGVkIChlLmcuIEEsIEIsIEMgYXJlIHNldCwKICAqIEQgaXMgc2tpcHBlZCBidXQgRSBpcyBzZXQgaXMgb2theSkuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9oYXdrX2NvbW1vbi5jIGIvYXJjaC9wcGMvc3lzbGliL2hhd2tfY29tbW9uLmMKaW5kZXggYzViZjE2Yi4uODY4MjFkOCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL2hhd2tfY29tbW9uLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL2hhd2tfY29tbW9uLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCQkJCSBwcm9jZXNzb3JfcGNpX21lbV9zdGFydCArIAogCQkJCSBob3NlLT5tZW1fc3BhY2Uuc3RhcnQpIHwgMHgwKTsKIAotCS8qIE1hcCBNUElDIGludG8gdml0dWFsIG1lbW9yeSAqLworCS8qIE1hcCBNUElDIGludG8gdmlydHVhbCBtZW1vcnkgKi8KIAlPcGVuUElDX0FkZHIgPSBpb3JlbWFwKHByb2Nlc3Nvcl9tcGljX2Jhc2UsIEhBV0tfTVBJQ19TSVpFKTsKIAogCXJldHVybiAwOwpAQCAtMTc2LDcgKzE3Niw3IEBACiAgKiBUaGlzIGFzc3VtZXMgdGhhdCBQUENCdWcgaGFzIGluaXRpYWxpemVkIHRoZSBtZW1vcnkgY29udHJvbGxlciAoU01DKQogICogb24gdGhlIEZhbGNvbi9IQVdLIGNvcnJlY3RseSAoaS5lLiwgaXQgZG9lcyBubyBzYW5pdHkgY2hlY2tpbmcpLgogICogSXQgYWxzbyBhc3N1bWVzIHRoYXQgdGhlIG1lbW9yeSBiYXNlIHJlZ2lzdGVycyBhcmUgc2V0IHRvIGNvbmZpZ3VyZSB0aGUKLSAqIG1lbW9yeSBhcyBjb250aWdvdXMgc3RhcnRpbmcgd2l0aCAiUkFNIEEgQkFTRSIsICJSQU0gQiBCQVNFIiwgZXRjLgorICogbWVtb3J5IGFzIGNvbnRpZ3VvdXMgc3RhcnRpbmcgd2l0aCAiUkFNIEEgQkFTRSIsICJSQU0gQiBCQVNFIiwgZXRjLgogICogaG93ZXZlciwgUkFNIGJhc2UgcmVnaXN0ZXJzIGNhbiBiZSBza2lwcGVkIChlLmcuIEEsIEIsIEMgYXJlIHNldCwKICAqIEQgaXMgc2tpcHBlZCBidXQgRSBpcyBzZXQgaXMgb2theSkuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tODJ4eF9wY2kuYyBiL2FyY2gvcHBjL3N5c2xpYi9tODJ4eF9wY2kuYwppbmRleCBlM2I1ODZiLi5mZTg2MGQ1IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbTgyeHhfcGNpLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL204Mnh4X3BjaS5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAkgICBDUE0gaGlnaCAgICAgIAkwYjAwMDAKIAkgICBDUE0gbWlkZGxlICAgICAgICAgICAwYjAwMDEKIAkgICBDUE0gbG93ICAgICAgIAkwYjAwMTAKLQkgICBQQ0kgcmVndWVzdCAgICAgICAgICAwYjAwMTEKKwkgICBQQ0kgcmVxdWVzdCAgICAgICAgICAwYjAwMTEKIAkgICBSZXNlcnZlZCAgICAgIAkwYjAxMDAKIAkgICBSZXNlcnZlZCAgICAgIAkwYjAxMDEKIAkgICBJbnRlcm5hbCBDb3JlICAgICAJMGIwMTEwCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvbXBjMTB4X2NvbW1vbi5jIGIvYXJjaC9wcGMvc3lzbGliL21wYzEweF9jb21tb24uYwppbmRleCAyZmM3YzQxLi40MzdhMjk0IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbXBjMTB4X2NvbW1vbi5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9tcGMxMHhfY29tbW9uLmMKQEAgLTQzMiw3ICs0MzIsNyBAQAogCQkJcGh5c19ldW1iX2Jhc2UpOwogCX0KIAotCS8qIElSUSdzIGFyZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUgKi8KKwkvKiBJUlFzIGFyZSBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUgKi8KIAlwcGNfc3lzX3BsYXRmb3JtX2RldmljZXNbTVBDMTBYX0lJQzFdLnJlc291cmNlWzFdLnN0YXJ0ID0gTVBDMTBYX0kyQ19JUlE7CiAJcHBjX3N5c19wbGF0Zm9ybV9kZXZpY2VzW01QQzEwWF9JSUMxXS5yZXNvdXJjZVsxXS5lbmQgPSBNUEMxMFhfSTJDX0lSUTsKIAlwcGNfc3lzX3BsYXRmb3JtX2RldmljZXNbTVBDMTBYX0RNQTBdLnJlc291cmNlWzFdLnN0YXJ0ID0gTVBDMTBYX0RNQTBfSVJROwpAQCAtNjQ2LDcgKzY0Niw3IEBACiAJb3BlbnBpY19zZXRfc291cmNlcyhFUElDX0lSUV9CQVNFLCAzLCBPcGVuUElDX0FkZHIgKyAweDExMDIwKTsKIAkvKiBTa2lwIHJlc2VydmVkIHNwYWNlIGFuZCBtYXAgTWVzc2FnZSBVbml0IEludGVycnVwdCAoSTJPKSAqLwogCW9wZW5waWNfc2V0X3NvdXJjZXMoRVBJQ19JUlFfQkFTRSArIDMsIDEsIE9wZW5QSUNfQWRkciArIDB4MTEwQzApOwotCS8qIFNraXAgcmVzZXJ2ZWQgc3BhY2UgYW5kIG1hcCBTZXJpYWwgSW50ZXJ1cHRzICovCisJLyogU2tpcCByZXNlcnZlZCBzcGFjZSBhbmQgbWFwIFNlcmlhbCBJbnRlcnJ1cHRzICovCiAJb3BlbnBpY19zZXRfc291cmNlcyhFUElDX0lSUV9CQVNFICsgNCwgMiwgT3BlblBJQ19BZGRyICsgMHgxMTEyMCk7CiAKIAlvcGVucGljX2luaXQoTlVNXzgyNTlfSU5URVJSVVBUUyk7CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvbXBjNTJ4eF9zZXR1cC5jIGIvYXJjaC9wcGMvc3lzbGliL21wYzUyeHhfc2V0dXAuYwppbmRleCA4MGM2MDkwLi5lY2ZhMmMwIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbXBjNTJ4eF9zZXR1cC5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9tcGM1Mnh4X3NldHVwLmMKQEAgLTI1Miw3ICsyNTIsNyBAQAogCW91dF9iZTMyKCZ4bGItPnNub29wX3dpbmRvdywgTVBDNTJ4eF9QQ0lfVEFSR0VUX01FTSB8IDB4MWQpOwogCiAJLyogRGlzYWJsZSBYTEIgcGlwZWxpbmluZyAqLwotCS8qIChjZnIgZXJyYXRlIDI5Mi4gV2UgY291bGQgZG8gdGhpcyBvbmx5IGp1c3QgYmVmb3JlIEFUQSBQSU8KKwkvKiAoY2ZyIGVycmF0YSAyOTIuIFdlIGNvdWxkIGRvIHRoaXMgb25seSBqdXN0IGJlZm9yZSBBVEEgUElPCiAJICAgIHRyYW5zYWN0aW9uIGFuZCByZS1lbmFibGUgaXQgYWZ0ZXIgLi4uKSAqLwogCW91dF9iZTMyKCZ4bGItPmNvbmZpZywgaW5fYmUzMigmeGxiLT5jb25maWcpIHwgTVBDNTJ4eF9YTEJfQ0ZHX1BMRElTKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL21wYzh4eF9kZXZpY2VzLmMgYi9hcmNoL3BwYy9zeXNsaWIvbXBjOHh4X2RldmljZXMuYwppbmRleCAzMWZiNTY1Li5jMDVhYzg3IDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvbXBjOHh4X2RldmljZXMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvbXBjOHh4X2RldmljZXMuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vcHBjX3N5cy5oPgogCi0vKiBXZSB1c2Ugb2Zmc2V0cyBmb3IgSU9SRVNPVVJDRV9NRU0gdG8gZG8gbm90IHNldCBkZXBlbmRlbmNlcyBhdCBjb21waWxlIHRpbWUuCisvKiBXZSB1c2Ugb2Zmc2V0cyBmb3IgSU9SRVNPVVJDRV9NRU0gdG8gZG8gbm90IHNldCBkZXBlbmRlbmNpZXMgYXQgY29tcGlsZSB0aW1lLgogICogVGhleSB3aWxsIGdldCBmaXhlZCB1cCBieSBtYWNoX21wYzh4eF9maXh1cAogICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9tdjY0eDYwLmMgYi9hcmNoL3BwYy9zeXNsaWIvbXY2NHg2MC5jCmluZGV4IGE2ZjhiNjguLjg0ODVhNjggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9tdjY0eDYwLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL212NjR4NjAuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAvKgogICogbXY2NHg2MF9pbml0KCkKICAqCi0gKiBJbml0aWFsemUgdGhlIGJyaWRnZSBiYXNlZCBvbiBzZXR0aW5nIHBhc3NlZCBpbiB2aWEgJ3NpJy4gIFRoZSBicmlkZ2UKKyAqIEluaXRpYWxpemUgdGhlIGJyaWRnZSBiYXNlZCBvbiBzZXR0aW5nIHBhc3NlZCBpbiB2aWEgJ3NpJy4gIFRoZSBicmlkZ2UKICAqIGhhbmRsZSwgJ2JoJywgd2lsbCBiZSBzZXQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBtYWtlIHN1YnNlcXVlbnQKICAqIGNhbGxzIHRvIHJvdXRpbmVzIGluIHRoaXMgZmlsZS4KICAqLwpAQCAtMTcwNCw3ICsxNzA0LDcgQEAKIC8qCiAgKiBndDY0MjYwYV9jaGlwX3NwZWNpZmljX2luaXQoKQogICoKLSAqIEltcGxlbWVudCBlcnJhdGEgd29yayBhcm91bmRzIGZvciB0aGUgR1Q2NDI2MEEuCisgKiBJbXBsZW1lbnQgZXJyYXRhIHdvcmthcm91bmRzIGZvciB0aGUgR1Q2NDI2MEEuCiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdAogZ3Q2NDI2MGFfY2hpcF9zcGVjaWZpY19pbml0KHN0cnVjdCBtdjY0eDYwX2hhbmRsZSAqYmgsCkBAIC0xNzc2LDcgKzE3NzYsNyBAQAogLyoKICAqIGd0NjQyNjBiX2NoaXBfc3BlY2lmaWNfaW5pdCgpCiAgKgotICogSW1wbGVtZW50IGVycmF0YSB3b3JrIGFyb3VuZHMgZm9yIHRoZSBHVDY0MjYwQi4KKyAqIEltcGxlbWVudCBlcnJhdGEgd29ya2Fyb3VuZHMgZm9yIHRoZSBHVDY0MjYwQi4KICAqLwogc3RhdGljIHZvaWQgX19pbml0CiBndDY0MjYwYl9jaGlwX3NwZWNpZmljX2luaXQoc3RydWN0IG12NjR4NjBfaGFuZGxlICpiaCwKQEAgLTIzMTYsNyArMjMxNiw3IEBACiAvKgogICogbXY2NDM2MF9jaGlwX3NwZWNpZmljX2luaXQoKQogICoKLSAqIEltcGxlbWVudCBlcnJhdGEgd29yayBhcm91bmRzIGZvciB0aGUgTVY2NDM2MC4KKyAqIEltcGxlbWVudCBlcnJhdGEgd29ya2Fyb3VuZHMgZm9yIHRoZSBNVjY0MzYwLgogICovCiBzdGF0aWMgdm9pZCBfX2luaXQKIG12NjQzNjBfY2hpcF9zcGVjaWZpY19pbml0KHN0cnVjdCBtdjY0eDYwX2hhbmRsZSAqYmgsCkBAIC0yMzM2LDcgKzIzMzYsNyBAQAogLyoKICAqIG12NjQ0NjBfY2hpcF9zcGVjaWZpY19pbml0KCkKICAqCi0gKiBJbXBsZW1lbnQgZXJyYXRhIHdvcmsgYXJvdW5kcyBmb3IgdGhlIE1WNjQ0NjAuCisgKiBJbXBsZW1lbnQgZXJyYXRhIHdvcmthcm91bmRzIGZvciB0aGUgTVY2NDQ2MC4KICAqLwogc3RhdGljIHZvaWQgX19pbml0CiBtdjY0NDYwX2NoaXBfc3BlY2lmaWNfaW5pdChzdHJ1Y3QgbXY2NHg2MF9oYW5kbGUgKmJoLApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL29jcC5jIGIvYXJjaC9wcGMvc3lzbGliL29jcC5jCmluZGV4IDUwYzU1NjIuLjQ5MWZlOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9vY3AuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvb2NwLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqICBkZXZpY2UgbW9kZWwuICBUaGUgZGV2aWNlcyBvbiB0aGUgT0NQIGJ1cyBhcmUgc2VlZGVkIGJ5IGFuCiAgKiAgYW4gaW5pdGlhbCBPQ1AgZGV2aWNlIGFycmF5IGNyZWF0ZWQgYnkgdGhlIGFyY2gtc3BlY2lmaWMKICAqICBEZXZpY2UgZW50cmllcyBjYW4gYmUgYWRkZWQvcmVtb3ZlZC9tb2RpZmllZCB0aHJvdWdoIE9DUAotICogIGhlbHBlciBmdW5jdGlvbnMgdG8gYWNjb21vZGF0ZSBzeXN0ZW0gYW5kICBib2FyZC1zcGVjaWZpYworICogIGhlbHBlciBmdW5jdGlvbnMgdG8gYWNjb21tb2RhdGUgc3lzdGVtIGFuZCAgYm9hcmQtc3BlY2lmaWMKICAqICBwYXJhbWV0ZXJzIGNvbW1vbmx5IGZvdW5kIGluIGVtYmVkZGVkIHN5c3RlbXMuIE9DUCBhbHNvCiAgKiAgcHJvdmlkZXMgYSBzdGFuZGFyZCBtZXRob2QgZm9yIGRldmljZXMgdG8gZGVzY3JpYmUgZXh0ZW5kZWQKICAqICBhdHRyaWJ1dGVzIGFib3V0IHRoZW1zZWx2ZXMgdG8gdGhlIHN5c3RlbS4gIEEgc3RhbmRhcmQgYWNjZXNzCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvcHBjNDAzX3BpYy5jIGIvYXJjaC9wcGMvc3lzbGliL3BwYzQwM19waWMuYwppbmRleCA2MDdlYmQxLi5jM2I3YjhiIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9zeXNsaWIvcHBjNDAzX3BpYy5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9wcGM0MDNfcGljLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCiAJLyoKIAkgKiBEaXNhYmxlIGFsbCBleHRlcm5hbCBpbnRlcnJ1cHRzIHVudGlsIHRoZXkgYXJlCi0JICogZXhwbGljaXR5IHJlcXVlc3RlZC4KKwkgKiBleHBsaWNpdGx5IHJlcXVlc3RlZC4KIAkgKi8KIAlwcGNfY2FjaGVkX2lycV9tYXNrWzBdID0gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3BwYzQwNV9wY2kuYyBiL2FyY2gvcHBjL3N5c2xpYi9wcGM0MDVfcGNpLmMKaW5kZXggZDZkODM4Yi4uOWU5MDM1NiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3BwYzQwNV9wY2kuYworKysgYi9hcmNoL3BwYy9zeXNsaWIvcHBjNDA1X3BjaS5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAlob3NlX2EtPnBjaV9tZW1fb2Zmc2V0ID0gMDsKIAogCS8qIFNldHVwIGJyaWRnZSBtZW1vcnkvSU8gcmFuZ2VzICYgcmVzb3VyY2VzCi0JICogVE9ETzogSGFuZGxlIGZpcm13YXJlcyBzZXR0aW5nIHVwIGEgbGVnYWN5IElTQSBtZW0gYmFzZQorCSAqIFRPRE86IEhhbmRsZSBmaXJtd2FyZSBzZXR0aW5nIHVwIGEgbGVnYWN5IElTQSBtZW0gYmFzZQogCSAqLwogCWhvc2VfYS0+aW9fc3BhY2Uuc3RhcnQgPSBQUEM0MDVfUENJX0xPV0VSX0lPOwogCWhvc2VfYS0+aW9fc3BhY2UuZW5kID0gUFBDNDA1X1BDSV9VUFBFUl9JTzsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3N5c2xpYi9wcGM0eHhfZG1hLmMgYi9hcmNoL3BwYy9zeXNsaWIvcHBjNHh4X2RtYS5jCmluZGV4IDFlZWY0ZmYuLmJkMzAxODYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9wcGM0eHhfZG1hLmMKKysrIGIvYXJjaC9wcGMvc3lzbGliL3BwYzR4eF9kbWEuYwpAQCAtMjQxLDcgKzI0MSw3IEBACiB9CiAKIC8qCi0gKiAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIGJlIHRyYW5zZmVyZWQuCisgKiAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIGJlIHRyYW5zZmVycmVkLgogICogICBBZnRlciBhIERNQSB0cmFuc2ZlciwgdGhpcyBzaG91bGQgcmV0dXJuIHplcm8uCiAgKiAgIFJlYWRpbmcgdGhpcyB3aGlsZSBhIERNQSB0cmFuc2ZlciBpcyBzdGlsbCBpbiBwcm9ncmVzcyB3aWxsIHJldHVybgogICogICB1bnByZWRpY3RhYmxlIHJlc3VsdHMuCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9zeXNsaWIvcHBjODV4eF9yaW8uYyBiL2FyY2gvcHBjL3N5c2xpYi9wcGM4NXh4X3Jpby5jCmluZGV4IDJiMDk3ODAuLmFmMjQyNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3N5c2xpYi9wcGM4NXh4X3Jpby5jCisrKyBiL2FyY2gvcHBjL3N5c2xpYi9wcGM4NXh4X3Jpby5jCkBAIC0zNDksNyArMzQ5LDcgQEAKICAqIEBkZXZfaW5zdGFuY2U6IFBvaW50ZXIgdG8gaW50ZXJydXB0LXNwZWNpZmljIGRhdGEKICAqCiAgKiBIYW5kbGVzIG91dGJvdW5kIG1lc3NhZ2UgaW50ZXJydXB0cy4gRXhlY3V0ZXMgYSByZWdpc3RlciBvdXRib3VuZAotICogbWFpbGJveCBldmVudCBoYW5kbGVyIGFuZCBhY2tzIHRoZSBpbnRlcnJ1cHQgb2NjdXJlbmNlLgorICogbWFpbGJveCBldmVudCBoYW5kbGVyIGFuZCBhY2tzIHRoZSBpbnRlcnJ1cHQgb2NjdXJyZW5jZS4KICAqLwogc3RhdGljIGlycXJldHVybl90CiBtcGM4NXh4X3Jpb190eF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKQEAgLTUxNiw3ICs1MTYsNyBAQAogICogQGRldl9pbnN0YW5jZTogUG9pbnRlciB0byBpbnRlcnJ1cHQtc3BlY2lmaWMgZGF0YQogICoKICAqIEhhbmRsZXMgaW5ib3VuZCBtZXNzYWdlIGludGVycnVwdHMuIEV4ZWN1dGVzIGEgcmVnaXN0ZXJlZCBpbmJvdW5kCi0gKiBtYWlsYm94IGV2ZW50IGhhbmRsZXIgYW5kIGFja3MgdGhlIGludGVycnVwdCBvY2N1cmVuY2UuCisgKiBtYWlsYm94IGV2ZW50IGhhbmRsZXIgYW5kIGFja3MgdGhlIGludGVycnVwdCBvY2N1cnJlbmNlLgogICovCiBzdGF0aWMgaXJxcmV0dXJuX3QKIG1wYzg1eHhfcmlvX3J4X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvc3lzbGliL3hpbGlueF9waWMuYyBiL2FyY2gvcHBjL3N5c2xpYi94aWxpbnhfcGljLmMKaW5kZXggNmZkNGNkYi4uM2I4MjMzMyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvc3lzbGliL3hpbGlueF9waWMuYworKysgYi9hcmNoL3BwYy9zeXNsaWIveGlsaW54X3BpYy5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAogCS8qCiAJICogRGlzYWJsZSBhbGwgZXh0ZXJuYWwgaW50ZXJydXB0cyB1bnRpbCB0aGV5IGFyZQotCSAqIGV4cGxpY2l0eSByZXF1ZXN0ZWQuCisJICogZXhwbGljaXRseSByZXF1ZXN0ZWQuCiAJICovCiAJaW50Y19vdXRfYmUzMihpbnRjICsgSUVSLCAwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9hdWRpdC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9hdWRpdC5jCmluZGV4IDA3NDFkOTEuLmQxYzc2ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvYXVkaXQuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2F1ZGl0LmMKQEAgLTIzLDYgKzIzLDIwIEBACiB+MFUKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBzaWduYWxfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9zaWduYWwuaD4KK34wVQorfTsKKworaW50IGF1ZGl0X2NsYXNzaWZ5X2FyY2goaW50IGFyY2gpCit7CisjaWZkZWYgQ09ORklHX0NPTVBBVAorCWlmIChhcmNoID09IEFVRElUX0FSQ0hfUzM5MCkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKwogaW50IGF1ZGl0X2NsYXNzaWZ5X3N5c2NhbGwoaW50IGFiaSwgdW5zaWduZWQgc3lzY2FsbCkKIHsKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC01MSwxNSArNjUsMTggQEAKIAlleHRlcm4gX191MzIgczM5MF93cml0ZV9jbGFzc1tdOwogCWV4dGVybiBfX3UzMiBzMzkwX3JlYWRfY2xhc3NbXTsKIAlleHRlcm4gX191MzIgczM5MF9jaGF0dHJfY2xhc3NbXTsKKwlleHRlcm4gX191MzIgczM5MF9zaWduYWxfY2xhc3NbXTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURV8zMiwgczM5MF93cml0ZV9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRF8zMiwgczM5MF9yZWFkX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19ESVJfV1JJVEVfMzIsIHMzOTBfZGlyX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFJfMzIsIHMzOTBfY2hhdHRyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19TSUdOQUxfMzIsIHMzOTBfc2lnbmFsX2NsYXNzKTsKICNlbmRpZgogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1dSSVRFLCB3cml0ZV9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRCwgcmVhZF9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfRElSX1dSSVRFLCBkaXJfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0NIQVRUUiwgY2hhdHRyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19TSUdOQUwsIHNpZ25hbF9jbGFzcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2F1ZGl0LmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9hdWRpdC5jCmluZGV4IDE2ZDk0MzYuLjA1NjlmNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2F1ZGl0LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfYXVkaXQuYwpAQCAtMjEsNiArMjEsMTEgQEAKIH4wVQogfTsKIAordW5zaWduZWQgczM5MF9zaWduYWxfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9zaWduYWwuaD4KK34wVQorfTsKKwogaW50IHMzOTBfY2xhc3NpZnlfc3lzY2FsbCh1bnNpZ25lZCBzeXNjYWxsKQogewogCXN3aXRjaChzeXNjYWxsKSB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpby5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvYXV4aW8uYwppbmRleCAxMThmM2VjLi5iYWY0ZWQzIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9hdXhpby5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2F1eGlvLmMKQEAgLTg4LDcgKzg4LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBzdW40bToKIAkJaWYoIWF1eGlvX3JlZ2lzdGVyKQotCQkJYnJlYWs7ICAgICAvKiBWTUUgY2hhc3NpYyBzdW40bSwgbm8gYXV4aW8uICovCisJCQlicmVhazsgICAgIC8qIFZNRSBjaGFzc2lzIHN1bjRtLCBubyBhdXhpby4gKi8KIAkJcmVndmFsID0gc2J1c19yZWFkYihhdXhpb19yZWdpc3Rlcik7CiAJCXNidXNfd3JpdGViKCgocmVndmFsIHwgYml0c19vbikgJiB+Yml0c19vZmYpIHwgQVVYSU9fT1JNRUlONE0sCiAJCQlhdXhpb19yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pb3BvcnQuYyBiL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCmluZGV4IDk4N2VjNjcuLjYyMTgyZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCkBAIC02MTcsNyArNjE3LDcgQEAKICAqIHNpemUgbXVzdCBiZSB0aGUgc2FtZSBhcyB3aGF0IGFzIHBhc3NlZCBpbnRvIHBjaV9hbGxvY19jb25zaXN0ZW50LAogICogYW5kIGxpa2V3aXNlIGRtYV9hZGRyIG11c3QgYmUgdGhlIHNhbWUgYXMgd2hhdCAqZG1hX2FkZHJwIHdhcyBzZXQgdG8uCiAgKgotICogUmVmZXJlbmNlcyB0byB0aGUgbWVtb3J5IGFuZCBtYXBwaW5ncyBhc3Nvc2NpYXRlZCB3aXRoIGNwdV9hZGRyL2RtYV9hZGRyCisgKiBSZWZlcmVuY2VzIHRvIHRoZSBtZW1vcnkgYW5kIG1hcHBpbmdzIGFzc29jaWF0ZWQgd2l0aCBjcHVfYWRkci9kbWFfYWRkcgogICogcGFzdCB0aGlzIGNhbGwgYXJlIGlsbGVnYWwuCiAgKi8KIHZvaWQgcGNpX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc2l6ZV90IG4sIHZvaWQgKnAsIGRtYV9hZGRyX3QgYmEpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pcnEuYyBiL2FyY2gvc3BhcmMva2VybmVsL2lycS5jCmluZGV4IGJkYmVmYTguLmYyNTdhNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2lycS5jCkBAIC0xLDYgKzEsNiBAQAogLyogICRJZDogaXJxLmMsdiAxLjExNCAyMDAxLzEyLzExIDA0OjU1OjUxIGRhdmVtIEV4cCAkCiAgKiAgYXJjaC9zcGFyYy9rZXJuZWwvaXJxLmM6ICBJbnRlcnJ1cHQgcmVxdWVzdCBoYW5kbGluZyByb3V0aW5lcy4gT24gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyYyB0aGUgSVJRJ3MgYXJlIGJhc2ljYWxseSAnY2FzdCBpbiBzdG9uZScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYXJjIHRoZSBJUlFzIGFyZSBiYXNpY2FsbHkgJ2Nhc3QgaW4gc3RvbmUnCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgeW91IGFyZSBzdXBwb3NlZCB0byBwcm9iZSB0aGUgcHJvbSdzIGRldmljZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSB0cmVlcyB0byBmaW5kIG91dCB3aG8ncyBnb3Qgd2hpY2ggSVJRLgogICoKQEAgLTMzMCw3ICszMzAsNyBAQAogCWlycV9lbnRlcigpOwogCWRpc2FibGVfcGlsX2lycShpcnEpOwogI2lmZGVmIENPTkZJR19TTVAKLQkvKiBPbmx5IHJvdGF0ZSBvbiBsb3dlciBwcmlvcml0eSBJUlEncyAoc2NzaSwgZXRoZXJuZXQsIGV0Yy4pLiAqLworCS8qIE9ubHkgcm90YXRlIG9uIGxvd2VyIHByaW9yaXR5IElSUXMgKHNjc2ksIGV0aGVybmV0LCBldGMuKS4gKi8KIAlpZigoc3BhcmNfY3B1X21vZGVsPT1zdW40bSkgJiYgKGlycSA8IDEwKSkKIAkJc21wNG1faXJxX3JvdGF0ZShjcHUpOwogI2VuZGlmCkBAIC0zNzEsNyArMzcxLDcgQEAKIH0KICNlbmRpZgogCi0vKiBGYXN0IElSUSdzIG9uIHRoZSBTcGFyYyBjYW4gb25seSBoYXZlIG9uZSByb3V0aW5lIGF0dGFjaGVkIHRvIHRoZW0sCisvKiBGYXN0IElSUXMgb24gdGhlIFNwYXJjIGNhbiBvbmx5IGhhdmUgb25lIHJvdXRpbmUgYXR0YWNoZWQgdG8gdGhlbSwKICAqIHRodXMgbm8gc2hhcmluZyBwb3NzaWJsZS4KICAqLwogaW50IHJlcXVlc3RfZmFzdF9pcnEodW5zaWduZWQgaW50IGlycSwKQEAgLTYwOCw3ICs2MDgsNyBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXByb21fcHJpbnRmKCJDYW5ub3QgaW5pdGlhbGl6ZSBJUlEncyBvbiB0aGlzIFN1biBtYWNoaW5lLi4uIik7CisJCXByb21fcHJpbnRmKCJDYW5ub3QgaW5pdGlhbGl6ZSBJUlFzIG9uIHRoaXMgU3VuIG1hY2hpbmUuLi4iKTsKIAkJYnJlYWs7CiAJfQogCWJ0Zml4dXAoKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwppbmRleCA1Y2E3ZThmLi43OTE3NzExIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCkBAIC03NTUsNyArNzU1LDcgQEAKIHN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgZG9fZ2V0dGltZW9mZnNldCh2b2lkKQogewogCS8qCi0JICogV2UgZGV2aWRlIGFsbCB0byAxMDAKKwkgKiBXZSBkaXZpZGUgYWxsIGJ5IDEwMAogCSAqIHRvIGhhdmUgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiBhbmQgdG8gYXZvaWQgb3ZlcmZsb3cKIAkgKi8KIAl1bnNpZ25lZCBsb25nIGNvdW50ID0KQEAgLTk1Niw3ICs5NTYsNyBAQAogICogQWxzbywgdGhpbmsgZm9yIGEgbW9tZW50IGFib3V0IGxpa2VzIG9mIGZsb3BweS5jIHRoYXQKICAqIGluY2x1ZGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIHBhcnRzLiBUaGV5IG1heSB3YW50IHRvIHJlZGVmaW5lIGlucy9vdXRzLgogICoKLSAqIFdlIGRvIG5vdCB1c2UgaG9ycm9ibGUgbWFjcm9zZXMgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8KKyAqIFdlIGRvIG5vdCB1c2UgaG9ycmlibGUgbWFjcm9zIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvCiAgKiBhZHZhbmNlIHBvaW50ZXIgYnkgc2l6ZW9mKHNpemUpLgogICovCiB2b2lkIG91dHNiKHVuc2lnbmVkIGxvbmcgYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDI5NDBkMmMuLjhjMzdmOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTY4Myw3ICs2ODMsNyBAQAogICogTk9URSEgT25seSBhIGtlcm5lbC1vbmx5IHByb2Nlc3MoaWUgdGhlIHN3YXBwZXIgb3IgZGlyZWN0IGRlc2NlbmRhbnRzCiAgKiB3aG8gaGF2ZW4ndCBkb25lIGFuICJleGVjdmUoKSIpIHNob3VsZCB1c2UgdGhpczogaXQgd2lsbCB3b3JrIHdpdGhpbgogICogYSBzeXN0ZW0gY2FsbCBmcm9tIGEgInJlYWwiIHByb2Nlc3MsIGJ1dCB0aGUgcHJvY2VzcyBtZW1vcnkgc3BhY2Ugd2lsbAotICogbm90IGJlIGZyZWUnZCB1bnRpbCBib3RoIHRoZSBwYXJlbnQgYW5kIHRoZSBjaGlsZCBoYXZlIGV4aXRlZC4KKyAqIG5vdCBiZSBmcmVlZCB1bnRpbCBib3RoIHRoZSBwYXJlbnQgYW5kIHRoZSBjaGlsZCBoYXZlIGV4aXRlZC4KICAqLwogcGlkX3Qga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N1bjRkX2lycS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfaXJxLmMKaW5kZXggMTE2ZDZhMi4uMzk2Nzk3ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfaXJxLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNGRfaXJxLmMKQEAgLTUyMSw3ICs1MjEsNyBAQAogCQlsdmwxNF9zYXZlWzJdICs9IHNtcDRkX3RpY2tlciAtIHJlYWxfaXJxX2VudHJ5OwogCiAJCS8qIEZvciBTTVAgd2UgdXNlIHRoZSBsZXZlbCAxNCB0aWNrZXIsIGhvd2V2ZXIgdGhlIGJvb3R1cCBjb2RlCi0JCSAqIGhhcyBjb3BpZWQgdGhlIGZpcm13YXJlcyBsZXZlbCAxNCB2ZWN0b3IgaW50byBib290IGNwdSdzCisJCSAqIGhhcyBjb3BpZWQgdGhlIGZpcm13YXJlJ3MgbGV2ZWwgMTQgdmVjdG9yIGludG8gdGhlIGJvb3QgY3B1J3MKIAkJICogdHJhcCB0YWJsZSwgd2UgbXVzdCBmaXggdGhpcyBub3cgb3Igd2UgZ2V0IHNxdWFzaGVkLgogCQkgKi8KIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3VuNG1faXJxLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9pcnEuYwppbmRleCBhNjU0YzE2Li45MWE4MDNlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9pcnEuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdW40bV9pcnEuYwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJCXN0cnVjdCB0dF9lbnRyeSAqdHJhcF90YWJsZSA9ICZzcGFyY190dGFibGVbU1BfVFJBUF9JUlExICsgKDE0IC0gMSldOwogCiAJCS8qIEZvciBTTVAgd2UgdXNlIHRoZSBsZXZlbCAxNCB0aWNrZXIsIGhvd2V2ZXIgdGhlIGJvb3R1cCBjb2RlCi0JCSAqIGhhcyBjb3BpZWQgdGhlIGZpcm13YXJlcyBsZXZlbCAxNCB2ZWN0b3IgaW50byBib290IGNwdSdzCisJCSAqIGhhcyBjb3BpZWQgdGhlIGZpcm13YXJlJ3MgbGV2ZWwgMTQgdmVjdG9yIGludG8gdGhlIGJvb3QgY3B1J3MKIAkJICogdHJhcCB0YWJsZSwgd2UgbXVzdCBmaXggdGhpcyBub3cgb3Igd2UgZ2V0IHNxdWFzaGVkLgogCQkgKi8KIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzdGJscy5TCmluZGV4IGUzZjViOGUuLjkwYjUyZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3N5c3RibHMuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zeXN0YmxzLlMKQEAgLTgwLDcgKzgwLDcgQEAKIC8qMjk1Ki8JLmxvbmcgc3lzX2ZjaG1vZGF0LCBzeXNfZmFjY2Vzc2F0LCBzeXNfcHNlbGVjdDYsIHN5c19wcG9sbCwgc3lzX3Vuc2hhcmUKIC8qMzAwKi8JLmxvbmcgc3lzX3NldF9yb2J1c3RfbGlzdCwgc3lzX2dldF9yb2J1c3RfbGlzdCwgc3lzX21pZ3JhdGVfcGFnZXMsIHN5c19tYmluZCwgc3lzX2dldF9tZW1wb2xpY3kKIC8qMzA1Ki8JLmxvbmcgc3lzX3NldF9tZW1wb2xpY3ksIHN5c19rZXhlY19sb2FkLCBzeXNfbW92ZV9wYWdlcywgc3lzX2dldGNwdSwgc3lzX2Vwb2xsX3B3YWl0Ci0vKjMxMCovCS5sb25nIHN5c191dGltZW5zYXQKKy8qMzEwKi8JLmxvbmcgc3lzX3V0aW1lbnNhdCwgc3lzX3NpZ25hbGZkLCBzeXNfdGltZXJmZCwgc3lzX2V2ZW50ZmQKIAogI2lmZGVmIENPTkZJR19TVU5PU19FTVVMCiAJLyogTm93IHRoZSBTdW5PUyBzeXNjYWxsIHRhYmxlLiAqLwpAQCAtMTk3LDYgKzE5Nyw3IEBACiAJLmxvbmcgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cwogCS5sb25nIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKIAkubG9uZyBzdW5vc19ub3N5cwotLyozMTAqLwkubG9uZyBzdW5vc19ub3N5cworLyozMTAqLwkubG9uZyBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCisJLmxvbmcgc3Vub3Nfbm9zeXMKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL3Byb20vcHJpbnRmLmMgYi9hcmNoL3NwYXJjL3Byb20vcHJpbnRmLmMKaW5kZXggZGM4YjU5OC4uMjdmZGFjOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9wcm9tL3ByaW50Zi5jCisrKyBiL2FyY2gvc3BhcmMvcHJvbS9wcmludGYuYwpAQCAtNSw3ICs1LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMiBQZXRlIFphaXRjZXYgKHphaXRjZXZAeWFob28uY29tKQogICoKICAqIFdlIHVzZWQgdG8gd2FybiBhbGwgb3ZlciB0aGUgY29kZTogRE8gTk9UIFVTRSBwcm9tX3ByaW50ZigpLAotICogYW5kIHlldCBwZW9wbGUgZG8uIEFudG9uJ3MgYmFua2luZyBjb2RlIHdhcyBvdXRwdXRpbmcgYmFua3MKKyAqIGFuZCB5ZXQgcGVvcGxlIGRvLiBBbnRvbidzIGJhbmtpbmcgY29kZSB3YXMgb3V0cHV0dGluZyBiYW5rcwogICogd2l0aCBwcm9tX3ByaW50ZiBmb3IgbW9zdCBvZiB0aGUgMi40IGxpZmV0aW1lLiBTaW5jZSBhbiBlZmZlY3RpdmUKICAqIHN0aWNrIGlzIG5vdCBhdmFpbGFibGUsIHdlIGRlcGxveWVkIGEgY2Fycm90OiBhbiBlYXJseSBwcmludGsKICAqIHRocm91Z2ggUFJPTSBieSBtZWFucyBvZiAtcCBib290IG9wdGlvbi4gVGhpcyBvdWdodCB0byBmaXggaXQuCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvS2NvbmZpZyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCmluZGV4IGFkOGQ2YjIuLjgzMTc4MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9LY29uZmlnCkBAIC0yMjYsOSArMjI2LDYgQEAKIAlkZWZfYm9vbCB5CiAJc2VsZWN0IFNQQVJTRU1FTV9TVEFUSUMKIAotY29uZmlnIExBUkdFX0FMTE9DUwotCWRlZl9ib29sIHkKLQogc291cmNlICJtbS9LY29uZmlnIgogCiBjb25maWcgSVNBCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvZGVmY29uZmlnIGIvYXJjaC9zcGFyYzY0L2RlZmNvbmZpZwppbmRleCAzN2MyZDM2Li41ODVlZjRmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvZGVmY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CiAjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjEKLSMgU3VuIE1heSAgNiAyMjo0Njo1NCAyMDA3CisjIEZyaSBNYXkgMTEgMTQ6MzE6NDUgMjAwNwogIwogQ09ORklHX1NQQVJDPXkKIENPTkZJR19TUEFSQzY0PXkKQEAgLTksNiArOSw3IEBACiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUz15CiBDT05GSUdfNjRCSVQ9eQogQ09ORklHX01NVT15CitDT05GSUdfUVVJQ0tMSVNUPXkKIENPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CiBDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQpAQCAtNDksNiArNTAsNyBAQAogIyBDT05GSUdfVVRTX05TIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE4CiBDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CiBDT05GSUdfUkVMQVk9eQogIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldApAQCAtNjYsMTQgKzY4LDIwIEBACiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQorQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CitDT05GSUdfU0lHTkFMRkQ9eQorQ09ORklHX1RJTUVSRkQ9eQorQ09ORklHX0VWRU5URkQ9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19TTEFCPXkKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfU0xVQl9ERUJVRz15CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCi0jIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKIAogIwogIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydApAQCAtMTM3LDcgKzE0NSw2IEBACiBDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQogQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQ9eQotQ09ORklHX0xBUkdFX0FMTE9DUz15CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiAjIENPTkZJR19GTEFUTUVNX01BTlVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKQEAgLTE0OCw2ICsxNTUsNyBAQAogQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKIENPTkZJR19SRVNPVVJDRVNfNjRCSVQ9eQogQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTEKIENPTkZJR19TQlVTPXkKIENPTkZJR19TQlVTQ0hBUj15CiBDT05GSUdfU1VOX0FVWElPPXkKQEAgLTMwNSw2ICszMTMsNyBAQAogIyBDT05GSUdfV0lSRUxFU1NfRVhUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExIGlzIG5vdCBzZXQKICMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAogCiAjCiAjIERldmljZSBEcml2ZXJzCkBAIC0zNTksOCArMzY4LDEwIEBACiAjCiAjIE1pc2MgZGV2aWNlcwogIworIyBDT05GSUdfUEhBTlRPTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CiAjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfQkxJTksgaXMgbm90IHNldAogCiAjCiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKQEAgLTM3OSw2ICszOTAsNyBAQAogIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKICMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKK0NPTkZJR19JREVfUFJPQ19GUz15CiAKICMKICMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcwpAQCAtMzg2LDYgKzM5OCw3IEBACiBDT05GSUdfSURFX0dFTkVSSUM9eQogQ09ORklHX0JMS19ERVZfSURFUENJPXkKICMgQ09ORklHX0lERVBDSV9TSEFSRV9JUlEgaXMgbm90IHNldAorQ09ORklHX0lERVBDSV9QQ0lCVVNfT1JERVI9eQogIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0dFTkVSSUMgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKQEAgLTUyMSw2ICs1MzQsNyBAQAogQ09ORklHX0RNX01JUlJPUj1tCiBDT05GSUdfRE1fWkVSTz1tCiAjIENPTkZJR19ETV9NVUxUSVBBVEggaXMgbm90IHNldAorIyBDT05GSUdfRE1fREVMQVkgaXMgbm90IHNldAogCiAjCiAjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKQEAgLTUzMyw2ICs1NDcsNyBAQAogIwogIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CiAjCisjIENPTkZJR19GSVJFV0lSRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JRUVFMTM5NCBpcyBub3Qgc2V0CiAKICMKQEAgLTYyOSw2ICs2NDQsOCBAQAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01MWDRfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfTUxYNF9ERUJVRz15CiAKICMKICMgVG9rZW4gUmluZyBkZXZpY2VzCkBAIC02NDIsNiArNjU5LDE2IEBACiAjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKIAogIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUX01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKKworIwogIyBXYW4gaW50ZXJmYWNlcwogIwogIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKQEAgLTcxMSwxMSArNzM4LDE4IEBACiBDT05GSUdfTU9VU0VfUFMyX1RSQUNLUE9JTlQ9eQogIyBDT05GSUdfTU9VU0VfUFMyX1RPVUNIS0lUIGlzIG5vdCBzZXQKIENPTkZJR19NT1VTRV9TRVJJQUw9eQorIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfTUlTQz15CiBDT05GSUdfSU5QVVRfU1BBUkNTUEtSPXkKKyMgQ09ORklHX0lOUFVUX0FUSV9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfQVRJX1JFTU9URTIgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9XRVJNQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1lFQUxJTksgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVUlOUFVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAogCkBAIC03NjIsMTQgKzc5Niw5IEBACiAjIElQTUkKICMKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgV2F0Y2hkb2cgQ2FyZHMKLSMKICMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CiBDT05GSUdfUlRDPXkKLSMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAogIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAogIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKQEAgLTc3OSw2ICs4MDgsNyBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfREVWUE9SVD15CiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQk9BUkRJTkZPPXkKICMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKQEAgLTg0MSwxMyArODcxLDEwIEBACiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKICMgQ09ORklHX1cxIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKLSMKIENPTkZJR19IV01PTj15CiAjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BQklUVUdVUlUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BRDc0MTggaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjYgaXMgbm90IHNldApAQCAtODc0LDYgKzkwMSw3IEBACiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYMTYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY2NTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldApAQCAtOTAxLDIzICs5MjksMzAgQEAKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotCi0jCi0jIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKLSMKLSMgQ09ORklHX0RWQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RWQl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBQiBpcyBub3Qgc2V0CiAKICMKICMgR3JhcGhpY3Mgc3VwcG9ydAogIwogIyBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ESVNQTEFZX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAogQ09ORklHX0ZCPXkKICMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAogQ09ORklHX0ZCX0REQz15CiBDT05GSUdfRkJfQ0ZCX0ZJTExSRUNUPXkKIENPTkZJR19GQl9DRkJfQ09QWUFSRUE9eQogQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfU1lTX0ZJTExSRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19DT1BZQVJFQSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TWVNfSU1BR0VCTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1NZU19GT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CiAjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CkBAIC05NDksNyArOTg0LDEwIEBACiAjIENPTkZJR19GQl9LWVJPIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCXzNERlggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVk9PRE9PMSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WVDg2MjMgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9BUksgaXMgbm90IHNldAorIyBDT05GSUdfRkJfUE0zIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1hWUjUwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9YVlIyNTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1BDSSBpcyBub3Qgc2V0CkBAIC05NzIsMTAgKzEwMTAsNiBAQAogQ09ORklHX0ZPTlRfU1VOOHgxNj15CiAjIENPTkZJR19GT05UX1NVTjEyeDIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZPTlRfMTB4MTggaXMgbm90IHNldAotCi0jCi0jIExvZ28gY29uZmlndXJhdGlvbgotIwogQ09ORklHX0xPR089eQogIyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldApAQCAtMTA4Myw2ICsxMTE3LDcgQEAKICMgVVNCIGRldmljZXMKICMKICMgQ09ORklHX1NORF9VU0JfQVVESU8gaXMgbm90IHNldAorIyBDT05GSUdfU05EX1VTQl9DQUlBUSBpcyBub3Qgc2V0CiAKICMKICMgQUxTQSBTcGFyYyBkZXZpY2VzCkBAIC0xMDkyLDcgKzExMjcsNyBAQAogIyBDT05GSUdfU05EX1NVTl9EQlJJIGlzIG5vdCBzZXQKIAogIwotIyBTb0MgYXVkaW8gc3VwcG9ydAorIyBTeXN0ZW0gb24gQ2hpcCBhdWRpbyBzdXBwb3J0CiAjCiAjIENPTkZJR19TTkRfU09DIGlzIG5vdCBzZXQKIApAQCAtMTE3OCwzNyArMTIxMywxMCBAQAogIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKIAogIwotIyBVU0IgSW5wdXQgRGV2aWNlcwotIwotIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1lFQUxJTksgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfR1RDTyBpcyBub3Qgc2V0Ci0KLSMKICMgVVNCIEltYWdpbmcgZGV2aWNlcwogIwogIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAotCi0jCi0jIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCi0jCi0jIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfS0FXRVRIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9VU0JORVRfTUlJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX01PTiBpcyBub3Qgc2V0CiAKICMKQEAgLTEyNTIsMTAgKzEyNjAsNiBAQAogIyBVU0IgR2FkZ2V0IFN1cHBvcnQKICMKICMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAKICMKQEAgLTEyOTksMTQgKzEzMDMsNiBAQAogIwogCiAjCi0jIEF1eGlsaWFyeSBEaXNwbGF5IHN1cHBvcnQKLSMKLQotIwotIyBWaXJ0dWFsaXphdGlvbgotIwotCi0jCiAjIE1pc2MgTGludXgvU1BBUkMgZHJpdmVycwogIwogQ09ORklHX1NVTl9PUEVOUFJPTUlPPW0KQEAgLTE0ODYsMTEgKzE0ODIsOSBAQAogIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKLUNPTkZJR19MT0dfQlVGX1NISUZUPTE4CiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQogQ09ORklHX1NDSEVEU1RBVFM9eQogIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CkBAIC0xNTc0LDYgKzE1NjgsNyBAQAogQ09ORklHX0JJVFJFVkVSU0U9eQogQ09ORklHX0NSQ19DQ0lUVD1tCiBDT05GSUdfQ1JDMTY9bQorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiBDT05GSUdfTElCQ1JDMzJDPW0KIENPTkZJR19aTElCX0lORkxBVEU9eQpAQCAtMTU4MSwzICsxNTc2LDQgQEAKIENPTkZJR19QTElTVD15CiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXVkaXQuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXVkaXQuYwppbmRleCBhZWYxOWNjLi4yNGQ3ZjRiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2F1ZGl0LmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9hdWRpdC5jCkBAIC0yMyw2ICsyMywyMCBAQAogfjBVCiB9OwogCitzdGF0aWMgdW5zaWduZWQgc2lnbmFsX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfc2lnbmFsLmg+Cit+MFUKK307CisKK2ludCBhdWRpdF9jbGFzc2lmeV9hcmNoKGludCBhcmNoKQoreworI2lmZGVmIENPTkZJR19TUEFSQzMyX0NPTVBBVAorCWlmIChhcmNoID09IEFVRElUX0FSQ0hfU1BBUkMpCisJCXJldHVybiAxOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKIGludCBhdWRpdF9jbGFzc2lmeV9zeXNjYWxsKGludCBhYmksIHVuc2lnbmVkIHN5c2NhbGwpCiB7CiAjaWZkZWYgQ09ORklHX1NQQVJDMzJfQ09NUEFUCkBAIC01MSwxNSArNjUsMTggQEAKIAlleHRlcm4gX191MzIgc3BhcmMzMl93cml0ZV9jbGFzc1tdOwogCWV4dGVybiBfX3UzMiBzcGFyYzMyX3JlYWRfY2xhc3NbXTsKIAlleHRlcm4gX191MzIgc3BhcmMzMl9jaGF0dHJfY2xhc3NbXTsKKwlleHRlcm4gX191MzIgc3BhcmMzMl9zaWduYWxfY2xhc3NbXTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURV8zMiwgc3BhcmMzMl93cml0ZV9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRF8zMiwgc3BhcmMzMl9yZWFkX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19ESVJfV1JJVEVfMzIsIHNwYXJjMzJfZGlyX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFJfMzIsIHNwYXJjMzJfY2hhdHRyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19TSUdOQUxfMzIsIHNwYXJjMzJfc2lnbmFsX2NsYXNzKTsKICNlbmRpZgogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1dSSVRFLCB3cml0ZV9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRCwgcmVhZF9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfRElSX1dSSVRFLCBkaXJfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0NIQVRUUiwgY2hhdHRyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19TSUdOQUwsIHNpZ25hbF9jbGFzcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY29tcGF0X2F1ZGl0LmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2NvbXBhdF9hdWRpdC5jCmluZGV4IGNjYTk2YzkuLmMxOTc5NDggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY29tcGF0X2F1ZGl0LmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9jb21wYXRfYXVkaXQuYwpAQCAtMjAsNiArMjAsMTEgQEAKIH4wVQogfTsKIAordW5zaWduZWQgc3BhcmMzMl9zaWduYWxfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9zaWduYWwuaD4KK34wVQorfTsKKwogaW50IHNwYXJjMzJfY2xhc3NpZnlfc3lzY2FsbCh1bnNpZ25lZCBzeXNjYWxsKQogewogCXN3aXRjaChzeXNjYWxsKSB7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2RldmljZXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZGV2aWNlcy5jCmluZGV4IGVjMTBmN2UuLjBlMDNjOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZGV2aWNlcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZGV2aWNlcy5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWRhdGEuaD4KIAotLyogVXNlZCB0byBzeW5jaHJvbml6ZSBhY2Nlc2VzIHRvIE5hdFNlbWkgU1VQRVIgSS9PIGNoaXAgY29uZmlndXJlCisvKiBVc2VkIHRvIHN5bmNocm9uaXplIGFjY2Vzc2VzIHRvIE5hdFNlbWkgU1VQRVIgSS9PIGNoaXAgY29uZmlndXJlCiAgKiBvcGVyYXRpb25zIGluIGFzbS9uczg3MzAzLmgKICAqLwogREVGSU5FX1NQSU5MT0NLKG5zODczMDNfbG9jayk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL29mX2RldmljZS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYwppbmRleCA5YWM5YTMwLi43NDU1ZjVkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL29mX2RldmljZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKQEAgLTU5Niw3ICs1OTYsNyBAQAogCS8qIENvbnZlcnQgdG8gbnVtLWVudHJpZXMuICAqLwogCW51bV9yZWcgLz0gbmEgKyBuczsKIAotCS8qIFByZXZlbnQgb3ZlcnJ1bmluZyB0aGUgb3AtPnJlc291cmNlc1tdIGFycmF5LiAgKi8KKwkvKiBQcmV2ZW50IG92ZXJydW5uaW5nIHRoZSBvcC0+cmVzb3VyY2VzW10gYXJyYXkuICAqLwogCWlmIChudW1fcmVnID4gUFJPTVJFR19NQVgpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFRvbyBtYW55IHJlZ3MgKCVkKSwgIgogCQkgICAgICAgImxpbWl0aW5nIHRvICVkLlxuIiwKQEAgLTkwNCw3ICs5MDQsNyBAQAogCQlvcC0+bnVtX2lycXMgPSAwOwogCX0KIAotCS8qIFByZXZlbnQgb3ZlcnJ1bmluZyB0aGUgb3AtPmlycXNbXSBhcnJheS4gICovCisJLyogUHJldmVudCBvdmVycnVubmluZyB0aGUgb3AtPmlycXNbXSBhcnJheS4gICovCiAJaWYgKG9wLT5udW1faXJxcyA+IFBST01JTlRSX01BWCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVG9vIG1hbnkgaXJxcyAoJWQpLCAiCiAJCSAgICAgICAibGltaXRpbmcgdG8gJWQuXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMKaW5kZXggY2Y5YTc1MS4uZDRjMDc3ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaS5jCkBAIC00OTUsOCArNDk1LDggQEAKIAkqbGFzdF9wID0gbGFzdDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHBjaV9yZXNvdXJjZV9hZGp1c3Qoc3RydWN0IHJlc291cmNlICpyZXMsCi0JCQkJICAgICAgIHN0cnVjdCByZXNvdXJjZSAqcm9vdCkKK3N0YXRpYyB2b2lkIHBjaV9yZXNvdXJjZV9hZGp1c3Qoc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJc3RydWN0IHJlc291cmNlICpyb290KQogewogCXJlcy0+c3RhcnQgKz0gcm9vdC0+c3RhcnQ7CiAJcmVzLT5lbmQgKz0gcm9vdC0+c3RhcnQ7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9maXJlLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9maXJlLmMKaW5kZXggOTE5OGMxYS4uN2Y1ZDQ3MyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfZmlyZS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ZpcmUuYwpAQCAtMzcsNyArMzcsNyBAQAogI2RlZmluZSBGSVJFX0lPTU1VX0NPTlRST0wJMHg0MDAwMFVMCiAjZGVmaW5lIEZJUkVfSU9NTVVfVFNCQkFTRQkweDQwMDA4VUwKICNkZWZpbmUgRklSRV9JT01NVV9GTFVTSAkweDQwMTAwVUwKLSNkZWZpbmUgRklSRV9JT01NVV9GTFVTSElOVgkweDQwMTAwVUwKKyNkZWZpbmUgRklSRV9JT01NVV9GTFVTSElOVgkweDQwMTA4VUwKIAogc3RhdGljIHZvaWQgcGNpX2ZpcmVfcGJtX2lvbW11X2luaXQoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2lvbW11LmMKaW5kZXggZGZkNmY5Zi4uNzBkMjM2NCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW9tbXUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9pb21tdS5jCkBAIC01NDIsNyArNTQyLDcgQEAKIC8qIE1hcCBhIHNldCBvZiBidWZmZXJzIGRlc2NyaWJlZCBieSBTR0xJU1Qgd2l0aCBORUxFTVMgYXJyYXkKICAqIGVsZW1lbnRzIGluIHN0cmVhbWluZyBtb2RlIGZvciBQQ0kgRE1BLgogICogV2hlbiBtYWtpbmcgY2hhbmdlcyBoZXJlLCBpbnNwZWN0IHRoZSBhc3NlbWJseSBvdXRwdXQuIEkgd2FzIGhhdmluZwotICogaGFyZCB0aW1lIHRvIGtlcHAgdGhpcyByb3V0aW5lIG91dCBvZiB1c2luZyBzdGFjayBzbG90cyBmb3IgaG9sZGluZyB2YXJpYWJsZXMuCisgKiBoYXJkIHRpbWUgdG8ga2VlcCB0aGlzIHJvdXRpbmUgb3V0IG9mIHVzaW5nIHN0YWNrIHNsb3RzIGZvciBob2xkaW5nIHZhcmlhYmxlcy4KICAqLwogc3RhdGljIGludCBwY2lfNHVfbWFwX3NnKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3N1bjR2LmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jCmluZGV4IDM0ZGY0MDQuLjA0NGU4ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3N1bjR2LmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHYuYwpAQCAtNzMxLDcgKzczMSw3IEBACiAKIAl1NjQJCW1zaV9hZGRyZXNzOwogCi0JLyogVGhlIGZvcm1hdCBvZiB0aGlzIHZhbHVlIGlzIG1lc3NhZ2UgdHlwZSBkZXBlbmRhbnQuCisJLyogVGhlIGZvcm1hdCBvZiB0aGlzIHZhbHVlIGlzIG1lc3NhZ2UgdHlwZSBkZXBlbmRlbnQuCiAJICogRm9yIE1TSSBiaXRzIDE1OjAgYXJlIHRoZSBkYXRhIGZyb20gdGhlIE1TSSBwYWNrZXQuCiAJICogRm9yIE1TSS1YIGJpdHMgMzE6MCBhcmUgdGhlIGRhdGEgZnJvbSB0aGUgTVNJIHBhY2tldC4KIAkgKiBGb3IgTVNHLCB0aGUgbWVzc2FnZSBjb2RlIGFuZCBtZXNzYWdlIHJvdXRpbmcgY29kZSB3aGVyZToKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggOGUzYzZlNC4uOTUyNzYyYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTY3Nyw3ICs2NzcsNyBAQAogICogTk9URSEgT25seSBhIGtlcm5lbC1vbmx5IHByb2Nlc3MoaWUgdGhlIHN3YXBwZXIgb3IgZGlyZWN0IGRlc2NlbmRhbnRzCiAgKiB3aG8gaGF2ZW4ndCBkb25lIGFuICJleGVjdmUoKSIpIHNob3VsZCB1c2UgdGhpczogaXQgd2lsbCB3b3JrIHdpdGhpbgogICogYSBzeXN0ZW0gY2FsbCBmcm9tIGEgInJlYWwiIHByb2Nlc3MsIGJ1dCB0aGUgcHJvY2VzcyBtZW1vcnkgc3BhY2Ugd2lsbAotICogbm90IGJlIGZyZWUnZCB1bnRpbCBib3RoIHRoZSBwYXJlbnQgYW5kIHRoZSBjaGlsZCBoYXZlIGV4aXRlZC4KKyAqIG5vdCBiZSBmcmVlZCB1bnRpbCBib3RoIHRoZSBwYXJlbnQgYW5kIHRoZSBjaGlsZCBoYXZlIGV4aXRlZC4KICAqLwogcGlkX3Qga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKaW5kZXggYjc5NzZiMS4uMDI4MzBlNCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wcm9tLmMKQEAgLTg5OSw3ICs4OTksNyBAQAogCS8qIFRoZSBpbnRlcnJ1cHQgbWFwIHJlZ2lzdGVycyBkbyBub3QgaGF2ZSBhbiBJTk8gZmllbGQKIAkgKiBsaWtlIG90aGVyIGNoaXBzIGRvLiAgVGhleSByZXR1cm4gemVybyBpbiB0aGUgSU5PCiAJICogZmllbGQsIGFuZCB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgbnVtYmVyIGlzIGNvbnRyb2xsZWQKLQkgKiBpbiBiaXRzIDYgdGhydSA5LiAgU28gaW4gb3JkZXIgZm9yIGJ1aWxkX2lycSgpIHRvIGdldAorCSAqIGluIGJpdHMgNiB0byA5LiAgU28gaW4gb3JkZXIgZm9yIGJ1aWxkX2lycSgpIHRvIGdldAogCSAqIHRoZSBJTk8gcmlnaHQgd2UgcGFzcyBpdCBpbiBhcyBwYXJ0IG9mIHRoZSBmaXh1cAogCSAqIHdoaWNoIHdpbGwgZ2V0IGFkZGVkIHRvIHRoZSBtYXAgcmVnaXN0ZXIgemVybyB2YWx1ZQogCSAqIHJlYWQgYnkgYnVpbGRfaXJxKCkuCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzdGJscy5TCmluZGV4IDVmZTdmOWEuLjg3NjVlMzIxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3N5c3RibHMuUwpAQCAtODEsNyArODEsNyBAQAogCS53b3JkIHN5c19mY2htb2RhdCwgc3lzX2ZhY2Nlc3NhdCwgY29tcGF0X3N5c19wc2VsZWN0NiwgY29tcGF0X3N5c19wcG9sbCwgc3lzX3Vuc2hhcmUKIC8qMzAwKi8JLndvcmQgY29tcGF0X3N5c19zZXRfcm9idXN0X2xpc3QsIGNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0LCBjb21wYXRfc3lzX21pZ3JhdGVfcGFnZXMsIGNvbXBhdF9zeXNfbWJpbmQsIGNvbXBhdF9zeXNfZ2V0X21lbXBvbGljeQogCS53b3JkIGNvbXBhdF9zeXNfc2V0X21lbXBvbGljeSwgY29tcGF0X3N5c19rZXhlY19sb2FkLCBjb21wYXRfc3lzX21vdmVfcGFnZXMsIHN5c19nZXRjcHUsIGNvbXBhdF9zeXNfZXBvbGxfcHdhaXQKLS8qMzEwKi8JLndvcmQgY29tcGF0X3N5c191dGltZW5zYXQKKy8qMzEwKi8JLndvcmQgY29tcGF0X3N5c191dGltZW5zYXQsIGNvbXBhdF9zeXNfc2lnbmFsZmQsIGNvbXBhdF9zeXNfdGltZXJmZCwgc3lzX2V2ZW50ZmQKIAogI2VuZGlmIC8qIENPTkZJR19DT01QQVQgKi8KIApAQCAtMTUzLDcgKzE1Myw3IEBACiAJLndvcmQgc3lzX2ZjaG1vZGF0LCBzeXNfZmFjY2Vzc2F0LCBzeXNfcHNlbGVjdDYsIHN5c19wcG9sbCwgc3lzX3Vuc2hhcmUKIC8qMzAwKi8JLndvcmQgc3lzX3NldF9yb2J1c3RfbGlzdCwgc3lzX2dldF9yb2J1c3RfbGlzdCwgc3lzX21pZ3JhdGVfcGFnZXMsIHN5c19tYmluZCwgc3lzX2dldF9tZW1wb2xpY3kKIAkud29yZCBzeXNfc2V0X21lbXBvbGljeSwgc3lzX2tleGVjX2xvYWQsIHN5c19tb3ZlX3BhZ2VzLCBzeXNfZ2V0Y3B1LCBzeXNfZXBvbGxfcHdhaXQKLS8qMzEwKi8JLndvcmQgc3lzX3V0aW1lbnNhdAorLyozMTAqLwkud29yZCBzeXNfdXRpbWVuc2F0LCBzeXNfc2lnbmFsZmQsIHN5c190aW1lcmZkLCBzeXNfZXZlbnRmZAogCiAjaWYgZGVmaW5lZChDT05GSUdfU1VOT1NfRU1VTCkgfHwgZGVmaW5lZChDT05GSUdfU09MQVJJU19FTVVMKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfU09MQVJJU19FTVVMX01PRFVMRSkKQEAgLTI3MSw2ICsyNzEsNyBAQAogCS53b3JkIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMKIAkud29yZCBzdW5vc19ub3N5cywgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzCiAJLndvcmQgc3Vub3Nfbm9zeXMKLS8qMzEwKi8JLmxvbmcgc3Vub3Nfbm9zeXMKKy8qMzEwKi8JLndvcmQgc3Vub3Nfbm9zeXMsIHN1bm9zX25vc3lzLCBzdW5vc19ub3N5cworCS53b3JkIHN1bm9zX25vc3lzCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYwppbmRleCAyNTkwNjNmLi42YjlhMDZlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYwpAQCAtNTUsNiArNTUsNyBAQAogdm9pZCBfX2lvbWVtICptc3RrNDh0MDJfcmVncyA9IE5VTEw7CiAjaWZkZWYgQ09ORklHX1BDSQogdW5zaWduZWQgbG9uZyBkczEyODdfcmVncyA9IDBVTDsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmJxNDgwMl9yZWdzOwogI2VuZGlmCiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKm1zdGs0OHQwOF9yZWdzOwpAQCAtNTY1LDEyICs1NjYsMTQgQEAKIAl2b2lkIF9faW9tZW0gKm1yZWdzID0gbXN0azQ4dDAyX3JlZ3M7CiAjaWZkZWYgQ09ORklHX1BDSQogCXVuc2lnbmVkIGxvbmcgZHJlZ3MgPSBkczEyODdfcmVnczsKKwl2b2lkIF9faW9tZW0gKmJyZWdzID0gYnE0ODAyX3JlZ3M7CiAjZWxzZQogCXVuc2lnbmVkIGxvbmcgZHJlZ3MgPSAwVUw7CisJdm9pZCBfX2lvbWVtICpicmVncyA9IDBVTDsKICNlbmRpZgogCXU4IHRtcDsKIAotCWlmICghbXJlZ3MgJiYgIWRyZWdzKSB7CisJaWYgKCFtcmVncyAmJiAhZHJlZ3MgJiYgIWJyZWdzKSB7CiAJCXByb21fcHJpbnRmKCJTb21ldGhpbmcgd3JvbmcsIGNsb2NrIHJlZ3Mgbm90IG1hcHBlZCB5ZXQuXG4iKTsKIAkJcHJvbV9oYWx0KCk7CiAJfQkJCkBAIC01ODksNiArNTkyLDMzIEBACiAJCWRheSA9IE1TVEtfUkVHX0RPTShtcmVncyk7CiAJCW1vbiA9IE1TVEtfUkVHX01PTlRIKG1yZWdzKTsKIAkJeWVhciA9IE1TVEtfQ1ZUX1lFQVIoIE1TVEtfUkVHX1lFQVIobXJlZ3MpICk7CisJfSBlbHNlIGlmIChicmVncykgeworCQl1bnNpZ25lZCBjaGFyIHZhbCA9IHJlYWRiKGJyZWdzICsgMHgwZSk7CisJCXVuc2lnbmVkIGludCBjZW50dXJ5OworCisJCS8qIEJRNDgwMiBSVEMgY2hpcC4gKi8KKworCQl3cml0ZWIodmFsIHwgMHgwOCwgYnJlZ3MgKyAweDBlKTsKKworCQlzZWMgID0gcmVhZGIoYnJlZ3MgKyAweDAwKTsKKwkJbWluICA9IHJlYWRiKGJyZWdzICsgMHgwMik7CisJCWhvdXIgPSByZWFkYihicmVncyArIDB4MDQpOworCQlkYXkgID0gcmVhZGIoYnJlZ3MgKyAweDA2KTsKKwkJbW9uICA9IHJlYWRiKGJyZWdzICsgMHgwOSk7CisJCXllYXIgPSByZWFkYihicmVncyArIDB4MGEpOworCQljZW50dXJ5ID0gcmVhZGIoYnJlZ3MgKyAweDBmKTsKKworCQl3cml0ZWIodmFsLCBicmVncyArIDB4MGUpOworCisJCUJDRF9UT19CSU4oc2VjKTsKKwkJQkNEX1RPX0JJTihtaW4pOworCQlCQ0RfVE9fQklOKGhvdXIpOworCQlCQ0RfVE9fQklOKGRheSk7CisJCUJDRF9UT19CSU4obW9uKTsKKwkJQkNEX1RPX0JJTih5ZWFyKTsKKwkJQkNEX1RPX0JJTihjZW50dXJ5KTsKKworCQl5ZWFyICs9IChjZW50dXJ5ICogMTAwKTsKIAl9IGVsc2UgewogCQkvKiBEYWxsYXMgMTI4ODcgUlRDIGNoaXAuICovCiAKQEAgLTcxMiw3ICs3NDIsOCBAQAogCSAgICBzdHJjbXAobW9kZWwsICJtNTgxOSIpICYmCiAJICAgIHN0cmNtcChtb2RlbCwgIm01ODE5cCIpICYmCiAJICAgIHN0cmNtcChtb2RlbCwgIm01ODIzIikgJiYKLQkgICAgc3RyY21wKG1vZGVsLCAiZHMxMjg3IikpCisJICAgIHN0cmNtcChtb2RlbCwgImRzMTI4NyIpICYmCisJICAgIHN0cmNtcChtb2RlbCwgImJxNDgwMiIpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwpAQCAtNzIyLDkgKzc1MywxMyBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBvcC0+bm9kZTsKIAljb25zdCBjaGFyICptb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgIm1vZGVsIiwgTlVMTCk7CisJY29uc3QgY2hhciAqY29tcGF0ID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiY29tcGF0aWJsZSIsIE5VTEwpOwogCXVuc2lnbmVkIGxvbmcgc2l6ZSwgZmxhZ3M7CiAJdm9pZCBfX2lvbWVtICpyZWdzOwogCisJaWYgKCFtb2RlbCkKKwkJbW9kZWwgPSBjb21wYXQ7CisKIAlpZiAoIW1vZGVsIHx8ICFjbG9ja19tb2RlbF9tYXRjaGVzKG1vZGVsKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTc0Niw2ICs3ODEsOCBAQAogCSAgICAhc3RyY21wKG1vZGVsLCAibTU4MTlwIikgfHwKIAkgICAgIXN0cmNtcChtb2RlbCwgIm01ODIzIikpIHsKIAkJZHMxMjg3X3JlZ3MgPSAodW5zaWduZWQgbG9uZykgcmVnczsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobW9kZWwsICJicTQ4MDIiKSkgeworCQlicTQ4MDJfcmVncyA9IHJlZ3M7CiAJfSBlbHNlCiAjZW5kaWYKIAlpZiAobW9kZWxbNV0gPT0gJzAnICYmIG1vZGVsWzZdID09ICcyJykgewpAQCAtMTA3MCw4ICsxMTA3LDEwIEBACiAJdm9pZCBfX2lvbWVtICptcmVncyA9IG1zdGs0OHQwMl9yZWdzOwogI2lmZGVmIENPTkZJR19QQ0kKIAl1bnNpZ25lZCBsb25nIGRyZWdzID0gZHMxMjg3X3JlZ3M7CisJdm9pZCBfX2lvbWVtICpicmVncyA9IGJxNDgwMl9yZWdzOwogI2Vsc2UKIAl1bnNpZ25lZCBsb25nIGRyZWdzID0gMFVMOworCXZvaWQgX19pb21lbSAqYnJlZ3MgPSAwVUw7CiAjZW5kaWYKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU4IHRtcDsKQEAgLTEwODAsNyArMTExOSw3IEBACiAJICogTm90IGhhdmluZyBhIHJlZ2lzdGVyIHNldCBjYW4gbGVhZCB0byB0cm91YmxlLgogCSAqIEFsc28gc3RhcmZpcmUgZG9lc24ndCBoYXZlIGEgdG9kIGNsb2NrLgogCSAqLwotCWlmICghbXJlZ3MgJiYgIWRyZWdzKSAKKwlpZiAoIW1yZWdzICYmICFkcmVncyAmICFicmVncykKIAkJcmV0dXJuIC0xOwogCiAJaWYgKG1yZWdzKSB7CkBAIC0xMTI5LDYgKzExNjgsMzcgQEAKIAogCQkJcmV0dXJuIC0xOwogCQl9CisJfSBlbHNlIGlmIChicmVncykgeworCQlpbnQgcmV0dmFsID0gMDsKKwkJdW5zaWduZWQgY2hhciB2YWwgPSByZWFkYihicmVncyArIDB4MGUpOworCisJCS8qIEJRNDgwMiBSVEMgY2hpcC4gKi8KKworCQl3cml0ZWIodmFsIHwgMHgwOCwgYnJlZ3MgKyAweDBlKTsKKworCQljaGlwX21pbnV0ZXMgPSByZWFkYihicmVncyArIDB4MDIpOworCQlCQ0RfVE9fQklOKGNoaXBfbWludXRlcyk7CisJCXJlYWxfc2Vjb25kcyA9IG5vd3RpbWUgJSA2MDsKKwkJcmVhbF9taW51dGVzID0gbm93dGltZSAvIDYwOworCQlpZiAoKChhYnMocmVhbF9taW51dGVzIC0gY2hpcF9taW51dGVzKSArIDE1KS8zMCkgJiAxKQorCQkJcmVhbF9taW51dGVzICs9IDMwOworCQlyZWFsX21pbnV0ZXMgJT0gNjA7CisKKwkJaWYgKGFicyhyZWFsX21pbnV0ZXMgLSBjaGlwX21pbnV0ZXMpIDwgMzApIHsKKwkJCUJJTl9UT19CQ0QocmVhbF9zZWNvbmRzKTsKKwkJCUJJTl9UT19CQ0QocmVhbF9taW51dGVzKTsKKwkJCXdyaXRlYihyZWFsX3NlY29uZHMsIGJyZWdzICsgMHgwMCk7CisJCQl3cml0ZWIocmVhbF9taW51dGVzLCBicmVncyArIDB4MDIpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJzZXRfcnRjX21tc3M6IGNhbid0IHVwZGF0ZSBmcm9tICVkIHRvICVkXG4iLAorCQkJICAgICAgIGNoaXBfbWludXRlcywgcmVhbF9taW51dGVzKTsKKwkJCXJldHZhbCA9IC0xOworCQl9CisKKwkJd3JpdGViKHZhbCwgYnJlZ3MgKyAweDBlKTsKKworCQlyZXR1cm4gcmV0dmFsOwogCX0gZWxzZSB7CiAJCWludCByZXR2YWwgPSAwOwogCQl1bnNpZ25lZCBjaGFyIHNhdmVfY29udHJvbCwgc2F2ZV9mcmVxX3NlbGVjdDsKQEAgLTEyNTksMzggKzEzMjksMTUyIEBACiAvKiBCb3RoIFN0YXJmaXJlIGFuZCBTVU40ViBnaXZlIHVzIHNlY29uZHMgc2luY2UgSmFuIDFzdCwgMTk3MCwKICAqIGFrYSBVbml4IHRpbWUuICBTbyB3ZSBoYXZlIHRvIGNvbnZlcnQgdG8vZnJvbSBydGNfdGltZS4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIG1pbmlfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdGltZSkKK3N0YXRpYyB2b2lkIHN0YXJmaXJlX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgc2Vjb25kczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOwotCXNlY29uZHMgPSAwOwotCWlmICh0aGlzX2lzX3N0YXJmaXJlKQotCQlzZWNvbmRzID0gc3RhcmZpcmVfZ2V0X3RpbWUoKTsKLQllbHNlIGlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKQotCQlzZWNvbmRzID0gaHlwZXJ2aXNvcl9nZXRfdGltZSgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJdTMyIHNlY29uZHMgPSBzdGFyZmlyZV9nZXRfdGltZSgpOwogCiAJdG9fdG0oc2Vjb25kcywgdGltZSk7CiAJdGltZS0+dG1feWVhciAtPSAxOTAwOwogCXRpbWUtPnRtX21vbiAtPSAxOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtaW5pX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCitzdGF0aWMgaW50IHN0YXJmaXJlX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCiB7CiAJdTMyIHNlY29uZHMgPSBta3RpbWUodGltZS0+dG1feWVhciArIDE5MDAsIHRpbWUtPnRtX21vbiArIDEsCiAJCQkgICAgIHRpbWUtPnRtX21kYXksIHRpbWUtPnRtX2hvdXIsCiAJCQkgICAgIHRpbWUtPnRtX21pbiwgdGltZS0+dG1fc2VjKTsKKworCXJldHVybiBzdGFyZmlyZV9zZXRfdGltZShzZWNvbmRzKTsKK30KKworc3RhdGljIHZvaWQgaHlwZXJ2aXNvcl9nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCXUzMiBzZWNvbmRzID0gaHlwZXJ2aXNvcl9nZXRfdGltZSgpOworCisJdG9fdG0oc2Vjb25kcywgdGltZSk7CisJdGltZS0+dG1feWVhciAtPSAxOTAwOworCXRpbWUtPnRtX21vbiAtPSAxOworfQorCitzdGF0aWMgaW50IGh5cGVydmlzb3Jfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdGltZSkKK3sKKwl1MzIgc2Vjb25kcyA9IG1rdGltZSh0aW1lLT50bV95ZWFyICsgMTkwMCwgdGltZS0+dG1fbW9uICsgMSwKKwkJCSAgICAgdGltZS0+dG1fbWRheSwgdGltZS0+dG1faG91ciwKKwkJCSAgICAgdGltZS0+dG1fbWluLCB0aW1lLT50bV9zZWMpOworCisJcmV0dXJuIGh5cGVydmlzb3Jfc2V0X3RpbWUoc2Vjb25kcyk7Cit9CisKK3N0YXRpYyB2b2lkIGJxNDgwMl9nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCXVuc2lnbmVkIGNoYXIgdmFsID0gcmVhZGIoYnE0ODAyX3JlZ3MgKyAweDBlKTsKKwl1bnNpZ25lZCBpbnQgY2VudHVyeTsKKworCXdyaXRlYih2YWwgfCAweDA4LCBicTQ4MDJfcmVncyArIDB4MGUpOworCisJdGltZS0+dG1fc2VjID0gcmVhZGIoYnE0ODAyX3JlZ3MgKyAweDAwKTsKKwl0aW1lLT50bV9taW4gPSByZWFkYihicTQ4MDJfcmVncyArIDB4MDIpOworCXRpbWUtPnRtX2hvdXIgPSByZWFkYihicTQ4MDJfcmVncyArIDB4MDQpOworCXRpbWUtPnRtX21kYXkgPSByZWFkYihicTQ4MDJfcmVncyArIDB4MDYpOworCXRpbWUtPnRtX21vbiA9IHJlYWRiKGJxNDgwMl9yZWdzICsgMHgwOSk7CisJdGltZS0+dG1feWVhciA9IHJlYWRiKGJxNDgwMl9yZWdzICsgMHgwYSk7CisJdGltZS0+dG1fd2RheSA9IHJlYWRiKGJxNDgwMl9yZWdzICsgMHgwOCk7CisJY2VudHVyeSA9IHJlYWRiKGJxNDgwMl9yZWdzICsgMHgwZik7CisKKwl3cml0ZWIodmFsLCBicTQ4MDJfcmVncyArIDB4MGUpOworCisJQkNEX1RPX0JJTih0aW1lLT50bV9zZWMpOworCUJDRF9UT19CSU4odGltZS0+dG1fbWluKTsKKwlCQ0RfVE9fQklOKHRpbWUtPnRtX2hvdXIpOworCUJDRF9UT19CSU4odGltZS0+dG1fbWRheSk7CisJQkNEX1RPX0JJTih0aW1lLT50bV9tb24pOworCUJDRF9UT19CSU4odGltZS0+dG1feWVhcik7CisJQkNEX1RPX0JJTih0aW1lLT50bV93ZGF5KTsKKwlCQ0RfVE9fQklOKGNlbnR1cnkpOworCisJdGltZS0+dG1feWVhciArPSAoY2VudHVyeSAqIDEwMCk7CisJdGltZS0+dG1feWVhciAtPSAxOTAwOworCisJdGltZS0+dG1fbW9uLS07Cit9CisKK3N0YXRpYyBpbnQgYnE0ODAyX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CisJdW5zaWduZWQgY2hhciB2YWwgPSByZWFkYihicTQ4MDJfcmVncyArIDB4MGUpOworCXVuc2lnbmVkIGNoYXIgc2VjLCBtaW4sIGhycywgZGF5LCBtb24sIHlycywgY2VudHVyeTsKKwl1bnNpZ25lZCBpbnQgeWVhcjsKKworCXllYXIgPSB0aW1lLT50bV95ZWFyICsgMTkwMDsKKwljZW50dXJ5ID0geWVhciAvIDEwMDsKKwl5cnMgPSB5ZWFyICUgMTAwOworCisJbW9uID0gdGltZS0+dG1fbW9uICsgMTsgICAvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwlkYXkgPSB0aW1lLT50bV9tZGF5OworCWhycyA9IHRpbWUtPnRtX2hvdXI7CisJbWluID0gdGltZS0+dG1fbWluOworCXNlYyA9IHRpbWUtPnRtX3NlYzsKKworCUJJTl9UT19CQ0Qoc2VjKTsKKwlCSU5fVE9fQkNEKG1pbik7CisJQklOX1RPX0JDRChocnMpOworCUJJTl9UT19CQ0QoZGF5KTsKKwlCSU5fVE9fQkNEKG1vbik7CisJQklOX1RPX0JDRCh5cnMpOworCUJJTl9UT19CQ0QoY2VudHVyeSk7CisKKwl3cml0ZWIodmFsIHwgMHgwOCwgYnE0ODAyX3JlZ3MgKyAweDBlKTsKKworCXdyaXRlYihzZWMsIGJxNDgwMl9yZWdzICsgMHgwMCk7CisJd3JpdGViKG1pbiwgYnE0ODAyX3JlZ3MgKyAweDAyKTsKKwl3cml0ZWIoaHJzLCBicTQ4MDJfcmVncyArIDB4MDQpOworCXdyaXRlYihkYXksIGJxNDgwMl9yZWdzICsgMHgwNik7CisJd3JpdGViKG1vbiwgYnE0ODAyX3JlZ3MgKyAweDA5KTsKKwl3cml0ZWIoeXJzLCBicTQ4MDJfcmVncyArIDB4MGEpOworCXdyaXRlYihjZW50dXJ5LCBicTQ4MDJfcmVncyArIDB4MGYpOworCisJd3JpdGViKHZhbCwgYnE0ODAyX3JlZ3MgKyAweDBlKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbWluaV9ydGNfb3BzIHsKKwl2b2lkICgqZ2V0X3J0Y190aW1lKShzdHJ1Y3QgcnRjX3RpbWUgKik7CisJaW50ICgqc2V0X3J0Y190aW1lKShzdHJ1Y3QgcnRjX3RpbWUgKik7Cit9OworCitzdGF0aWMgc3RydWN0IG1pbmlfcnRjX29wcyBzdGFyZmlyZV9ydGNfb3BzID0geworCS5nZXRfcnRjX3RpbWUgPSBzdGFyZmlyZV9nZXRfcnRjX3RpbWUsCisJLnNldF9ydGNfdGltZSA9IHN0YXJmaXJlX3NldF9ydGNfdGltZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWluaV9ydGNfb3BzIGh5cGVydmlzb3JfcnRjX29wcyA9IHsKKwkuZ2V0X3J0Y190aW1lID0gaHlwZXJ2aXNvcl9nZXRfcnRjX3RpbWUsCisJLnNldF9ydGNfdGltZSA9IGh5cGVydmlzb3Jfc2V0X3J0Y190aW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBtaW5pX3J0Y19vcHMgYnE0ODAyX3J0Y19vcHMgPSB7CisJLmdldF9ydGNfdGltZSA9IGJxNDgwMl9nZXRfcnRjX3RpbWUsCisJLnNldF9ydGNfdGltZSA9IGJxNDgwMl9zZXRfcnRjX3RpbWUsCit9OworCitzdGF0aWMgc3RydWN0IG1pbmlfcnRjX29wcyAqbWluaV9ydGNfb3BzOworCitzdGF0aWMgaW5saW5lIHZvaWQgbWluaV9nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0aW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjX2xvY2ssIGZsYWdzKTsKKwltaW5pX3J0Y19vcHMtPmdldF9ydGNfdGltZSh0aW1lKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtaW5pX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnRpbWUpCit7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7Ci0JZXJyID0gLUVOT0RFVjsKLQlpZiAodGhpc19pc19zdGFyZmlyZSkKLQkJZXJyID0gc3RhcmZpcmVfc2V0X3RpbWUoc2Vjb25kcyk7Ci0JZWxzZSAgaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpCi0JCWVyciA9IGh5cGVydmlzb3Jfc2V0X3RpbWUoc2Vjb25kcyk7CisJZXJyID0gbWluaV9ydGNfb3BzLT5zZXRfcnRjX3RpbWUodGltZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiBlcnI7CkBAIC0xMzkxLDcgKzE1NzUsMTMgQEAKIHsKIAlpbnQgcmV0dmFsOwogCi0JaWYgKHRsYl90eXBlICE9IGh5cGVydmlzb3IgJiYgIXRoaXNfaXNfc3RhcmZpcmUpCisJaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpCisJCW1pbmlfcnRjX29wcyA9ICZoeXBlcnZpc29yX3J0Y19vcHM7CisJZWxzZSBpZiAodGhpc19pc19zdGFyZmlyZSkKKwkJbWluaV9ydGNfb3BzID0gJnN0YXJmaXJlX3J0Y19vcHM7CisJZWxzZSBpZiAoYnE0ODAyX3JlZ3MpCisJCW1pbmlfcnRjX29wcyA9ICZicTQ4MDJfcnRjX29wczsKKwllbHNlCiAJCXJldHVybiAtRU5PREVWOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiTWluaSBSVEMgRHJpdmVyXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMgYi9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCmluZGV4IGQ3MDA0ZWEuLjZlNWIwMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2luaXQuYwpAQCAtMTAwOCw3ICsxMDA4LDcgQEAKIAlpZiAoaW5pdHJkX3N0YXJ0KSB7CiAJCXNpemUgPSBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0OwogCi0JCS8qIFJlc2VydCB0aGUgaW5pdHJkIGltYWdlIGFyZWEuICovCisJCS8qIFJlc2VydmUgdGhlIGluaXRyZCBpbWFnZSBhcmVhLiAqLwogI2lmZGVmIENPTkZJR19ERUJVR19CT09UTUVNCiAJCXByb21fcHJpbnRmKCJyZXNlcnZlX2Jvb3RtZW0oaW5pdHJkKTogYmFzZVslbGx4XSBzaXplWyVseF1cbiIsCiAJCQlpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnIGIvYXJjaC91bS9LY29uZmlnCmluZGV4IGI5YzBmMzAuLmM1MDQzMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZworKysgYi9hcmNoL3VtL0tjb25maWcKQEAgLTI3Nyw3ICsyNzcsOCBAQAogCiBjb25maWcgS0VSTkVMX1NUQUNLX09SREVSCiAJaW50ICJLZXJuZWwgc3RhY2sgc2l6ZSBvcmRlciIKLQlkZWZhdWx0IDIKKwlkZWZhdWx0IDEgaWYgNjRCSVQKKwlkZWZhdWx0IDAgaWYgITY0QklUCiAJaGVscAogCVRoaXMgb3B0aW9uIGRldGVybWluZXMgdGhlIHNpemUgb2YgVU1MIGtlcm5lbCBzdGFja3MuICBUaGV5IHdpbGwKIAliZSAxIDw8IG9yZGVyIHBhZ2VzLiAgVGhlIGRlZmF1bHQgaXMgT0sgdW5sZXNzIHlvdSdyZSBydW5uaW5nIFZhbGdyaW5kCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RlZmNvbmZpZyBiL2FyY2gvdW0vZGVmY29uZmlnCmluZGV4IGY5MzhmYTguLmE1NGQwZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZGVmY29uZmlnCisrKyBiL2FyY2gvdW0vZGVmY29uZmlnCkBAIC04Niw3ICs4Niw3IEBACiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiBDT05GSUdfTkVTVF9MRVZFTD0wCiAjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKLUNPTkZJR19LRVJORUxfU1RBQ0tfT1JERVI9MgorQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUj0wCiBDT05GSUdfVU1MX1JFQUxfVElNRV9DTE9DSz15CiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9jb21tb24tb2Zmc2V0cy5oIGIvYXJjaC91bS9pbmNsdWRlL2NvbW1vbi1vZmZzZXRzLmgKaW5kZXggNTU5M2E4MC4uNTQxZjRhOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2NvbW1vbi1vZmZzZXRzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2NvbW1vbi1vZmZzZXRzLmgKQEAgLTI4LDMgKzI4LDUgQEAKIAogLyogRm9yIGNyeXB0byBhc3NlbWJsZXIgY29kZS4gKi8KIERFRklORShjcnlwdG9fdGZtX2N0eF9vZmZzZXQsIG9mZnNldG9mKHN0cnVjdCBjcnlwdG9fdGZtLCBfX2NydF9jdHgpKTsKKworREVGSU5FKFVNX1RIUkVBRF9TSVpFLCBUSFJFQURfU0laRSk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUva2Vybl91dGlsLmggYi9hcmNoL3VtL2luY2x1ZGUva2Vybl91dGlsLmgKaW5kZXggNTBhNDk2OS4uOGQ3ZjdjMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2tlcm5fdXRpbC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9rZXJuX3V0aWwuaApAQCAtMTE3LDQgKzExNyw3IEBACiAKIGV4dGVybiB2b2lkIGNvcHlfc2ModW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MsIHZvaWQgKmZyb20pOwogCit1bnNpZ25lZCBsb25nIHRvX2lycV9zdGFjayhpbnQgc2lnLCB1bnNpZ25lZCBsb25nICptYXNrX291dCk7Cit1bnNpZ25lZCBsb25nIGZyb21faXJxX3N0YWNrKGludCBuZXN0ZWQpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oIGIvYXJjaC91bS9pbmNsdWRlL29zLmgKaW5kZXggNjg4ZDE4MS4uNGQ5ZmIyNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9vcy5oCkBAIC0yNzIsNyArMjcyLDYgQEAKIAogLyogdXRpbC5jICovCiBleHRlcm4gdm9pZCBzdGFja19wcm90ZWN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwotZXh0ZXJuIHZvaWQgdGFza19wcm90ZWN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHJlc3MpOwogZXh0ZXJuIGludCByYXcoaW50IGZkKTsKIGV4dGVybiB2b2lkIHNldHVwX21hY2hpbmVuYW1lKGNoYXIgKm1hY2hpbmVfb3V0KTsKIGV4dGVybiB2b2lkIHNldHVwX2hvc3RpbmZvKGNoYXIgKmJ1ZiwgaW50IGxlbik7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMgYi9hcmNoL3VtL2tlcm5lbC9keW4ubGRzLlMKaW5kZXggZTM2ZjkyYi4uODdhNGU0NCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvZHluLmxkcy5TCisrKyBiL2FyY2gvdW0va2VybmVsL2R5bi5sZHMuUwpAQCAtOTcsNiArOTcsOCBAQAogICAuZGF0YSAgICAgICAgICAgOiB7CiAgICAgLiA9IEFMSUdOKEtFUk5FTF9TVEFDS19TSVpFKTsJCS8qIGluaXRfdGFzayAqLwogICAgICooLmRhdGEuaW5pdF90YXNrKQorICAgIC4gPSBBTElHTihLRVJORUxfU1RBQ0tfU0laRSk7CisgICAgKiguZGF0YS5pbml0X2lycXN0YWNrKQogICAgICooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKikKICAgICBTT1JUKENPTlNUUlVDVE9SUykKICAgfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL3VtL2tlcm5lbC9pbml0X3Rhc2suYwppbmRleCBjZGE5MWFhLi5kNGYxZDFhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pbml0X3Rhc2suYworKysgYi9hcmNoL3VtL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMSw1ICsxLDUgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsaW50ZWwubGludXh9LmNvbSkKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCkBAIC0zMywyOCArMzMsMjAgQEAKIC8qCiAgKiBJbml0aWFsIHRocmVhZCBzdHJ1Y3R1cmUuCiAgKgotICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIDE2Mzg0LWJ5dGUgYWxpZ25lZCBkdWUgdG8gdGhlCisgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgYWxpZ25lZCBkdWUgdG8gdGhlCiAgKiB3YXkgcHJvY2VzcyBzdGFja3MgYXJlIGhhbmRsZWQuIFRoaXMgaXMgZG9uZSBieSBoYXZpbmcgYSBzcGVjaWFsCiAgKiAiaW5pdF90YXNrIiBsaW5rZXIgbWFwIGVudHJ5Li4KICAqLwogCi11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gCi1fX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF90YXNrIikpKSA9IAoteyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKK3VuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbgorCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuZGF0YS5pbml0X3Rhc2siKSkpID0KKwkJeyBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykgfTsKKwordW5pb24gdGhyZWFkX3VuaW9uIGNwdTBfaXJxc3RhY2sKKwlfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEuaW5pdF9pcnFzdGFjayIpKSkgPQorCQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwogCiB2b2lkIHVucHJvdGVjdF9zdGFjayh1bnNpZ25lZCBsb25nIHN0YWNrKQogewotCW9zX3Byb3RlY3RfbWVtb3J5KCh2b2lkICopIHN0YWNrLCAoMSA8PCBDT05GSUdfS0VSTkVMX1NUQUNLX09SREVSKSAqIFBBR0VfU0laRSwKLQkJICAgICAgIDEsIDEsIDApOworCW9zX3Byb3RlY3RfbWVtb3J5KCh2b2lkICopIHN0YWNrLCBUSFJFQURfU0laRSwgMSwgMSwgMCk7CiB9Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9pcnEuYyBiL2FyY2gvdW0va2VybmVsL2lycS5jCmluZGV4IDhmMmVkMzYuLmRiYTA0ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2lycS5jCisrKyBiL2FyY2gvdW0va2VybmVsL2lycS5jCkBAIC0xLDQgKzEsNCBAQAotLyogCisvKgogICogQ29weXJpZ2h0IChDKSAyMDAwIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqIERlcml2ZWQgKGkuZS4gbW9zdGx5IGNvcGllZCkgZnJvbSBhcmNoL2kzODYva2VybmVsL2lycS5jOgpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgInNpZ2lvLmgiCiAjaW5jbHVkZSAidW1fbWFsbG9jLmgiCiAjaW5jbHVkZSAibWlzY19jb25zdGFudHMuaCIKKyNpbmNsdWRlICJhcy1sYXlvdXQuaCIKIAogLyoKICAqIEdlbmVyaWMsIGNvbnRyb2xsZXItaW5kZXBlbmRlbnQgZnVuY3Rpb25zOgpAQCAtNTMsNyArNTQsNyBAQAogCWlmIChpIDwgTlJfSVJRUykgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOwogCQlhY3Rpb24gPSBpcnFfZGVzY1tpXS5hY3Rpb247Ci0JCWlmICghYWN0aW9uKSAKKwkJaWYgKCFhY3Rpb24pCiAJCQlnb3RvIHNraXA7CiAJCXNlcV9wcmludGYocCwgIiUzZDogIixpKTsKICNpZm5kZWYgQ09ORklHX1NNUApAQCAtNDY4LDMgKzQ2OSwxMTMgQEAKICBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KKworLyoKKyAqIElSUSBzdGFjayBlbnRyeSBhbmQgZXhpdDoKKyAqCisgKiBVbmxpa2UgaTM4NiwgVU1MIGRvZXNuJ3QgcmVjZWl2ZSBJUlFzIG9uIHRoZSBub3JtYWwga2VybmVsIHN0YWNrCisgKiBhbmQgc3dpdGNoIG92ZXIgdG8gdGhlIElSUSBzdGFjayBhZnRlciBzb21lIHByZXBhcmF0aW9uLiAgV2UgdXNlCisgKiBzaWdhbHRzdGFjayB0byByZWNlaXZlIHNpZ25hbHMgb24gYSBzZXBhcmF0ZSBzdGFjayBmcm9tIHRoZSBzdGFydC4KKyAqIFRoZXNlIHR3byBmdW5jdGlvbnMgbWFrZSBzdXJlIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwgd29uJ3QgYmUgdG9vCisgKiB1cHNldCBieSBiZWluZyBvbiBhIGRpZmZlcmVudCBzdGFjay4gIFRoZSBJUlEgc3RhY2sgaGFzIGEKKyAqIHRocmVhZF9pbmZvIHN0cnVjdHVyZSBhdCB0aGUgYm90dG9tIHNvIHRoYXQgY3VycmVudCBldCBhbCBjb250aW51ZQorICogdG8gd29yay4KKyAqCisgKiB0b19pcnFfc3RhY2sgY29waWVzIHRoZSBjdXJyZW50IHRhc2sncyB0aHJlYWRfaW5mbyB0byB0aGUgSVJRIHN0YWNrCisgKiB0aHJlYWRfaW5mbyBhbmQgc2V0cyB0aGUgdGFza3MncyBzdGFjayB0byBwb2ludCB0byB0aGUgSVJRIHN0YWNrLgorICoKKyAqIGZyb21faXJxX3N0YWNrIGNvcGllcyB0aGUgdGhyZWFkX2luZm8gc3RydWN0IGJhY2sgKGZsYWdzIG1heSBoYXZlCisgKiBiZWVuIG1vZGlmaWVkKSBhbmQgcmVzZXRzIHRoZSB0YXNrJ3Mgc3RhY2sgcG9pbnRlci4KKyAqCisgKiBUcmlja3kgYml0cyAtCisgKgorICogV2hhdCBoYXBwZW5zIHdoZW4gdHdvIHNpZ25hbHMgcmFjZSBlYWNoIG90aGVyPyAgVU1MIGRvZXNuJ3QgYmxvY2sKKyAqIHNpZ25hbHMgd2l0aCBzaWdwcm9jbWFzaywgU0FfREVGRVIsIG9yIHNhX21hc2ssIHNvIGEgc2Vjb25kIHNpZ25hbAorICogY291bGQgYXJyaXZlIHdoaWxlIGEgcHJldmlvdXMgb25lIGlzIHN0aWxsIHNldHRpbmcgdXAgdGhlCisgKiB0aHJlYWRfaW5mby4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgY2FzZXMgLQorICogICAgIFRoZSBmaXJzdCBpbnRlcnJ1cHQgb24gdGhlIHN0YWNrIC0gc2V0cyB1cCB0aGUgdGhyZWFkX2luZm8gYW5kCisgKiBoYW5kbGVzIHRoZSBpbnRlcnJ1cHQKKyAqICAgICBBIG5lc3RlZCBpbnRlcnJ1cHQgaW50ZXJydXB0aW5nIHRoZSBjb3B5aW5nIG9mIHRoZSB0aHJlYWRfaW5mbyAtCisgKiBjYW4ndCBoYW5kbGUgdGhlIGludGVycnVwdCwgYXMgdGhlIHN0YWNrIGlzIGluIGFuIHVua25vd24gc3RhdGUKKyAqICAgICBBIG5lc3RlZCBpbnRlcnJ1cHQgbm90IGludGVycnVwdGluZyB0aGUgY29weWluZyBvZiB0aGUKKyAqIHRocmVhZF9pbmZvIC0gZG9lc24ndCBkbyBhbnkgc2V0dXAsIGp1c3QgaGFuZGxlcyB0aGUgaW50ZXJydXB0CisgKgorICogVGhlIGZpcnN0IGpvYiBpcyB0byBmaWd1cmUgb3V0IHdoZXRoZXIgd2UgaW50ZXJydXB0ZWQgc3RhY2sgc2V0dXAuCisgKiBUaGlzIGlzIGRvbmUgYnkgeGNoZ2luZyB0aGUgc2lnbmFsIG1hc2sgd2l0aCB0aHJlYWRfaW5mby0+cGVuZGluZy4KKyAqIElmIHRoZSB2YWx1ZSB0aGF0IGNvbWVzIGJhY2sgaXMgemVybywgdGhlbiB0aGVyZSBpcyBubyBzZXR1cCBpbgorICogcHJvZ3Jlc3MsIGFuZCB0aGUgaW50ZXJydXB0IGNhbiBiZSBoYW5kbGVkLiAgSWYgdGhlIHZhbHVlIGlzCisgKiBub24temVybywgdGhlbiB0aGVyZSBpcyBzdGFjayBzZXR1cCBpbiBwcm9ncmVzcy4gIEluIG9yZGVyIHRvIGhhdmUKKyAqIHRoZSBpbnRlcnJ1cHQgaGFuZGxlZCwgd2UgbGVhdmUgb3VyIHNpZ25hbCBpbiB0aGUgbWFzaywgYW5kIGl0IHdpbGwKKyAqIGJlIGhhbmRsZWQgYnkgdGhlIHVwcGVyIGhhbmRsZXIgYWZ0ZXIgaXQgaGFzIHNldCB1cCB0aGUgc3RhY2suCisgKgorICogTmV4dCBpcyB0byBmaWd1cmUgb3V0IHdoZXRoZXIgd2UgYXJlIHRoZSBvdXRlciBoYW5kbGVyIG9yIGEgbmVzdGVkCisgKiBvbmUuICBBcyBwYXJ0IG9mIHNldHRpbmcgdXAgdGhlIHN0YWNrLCB0aHJlYWRfaW5mby0+cmVhbF90aHJlYWQgaXMKKyAqIHNldCB0byBub24tTlVMTCAoYW5kIGlzIHJlc2V0IHRvIE5VTEwgb24gZXhpdCkuICBUaGlzIGlzIHRoZQorICogbmVzdGluZyBpbmRpY2F0b3IuICBJZiBpdCBpcyBub24tTlVMTCwgdGhlbiB0aGUgc3RhY2sgaXMgYWxyZWFkeQorICogc2V0IHVwIGFuZCB0aGUgaGFuZGxlciBjYW4gcnVuLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBlbmRpbmdfbWFzazsKKwordW5zaWduZWQgbG9uZyB0b19pcnFfc3RhY2soaW50IHNpZywgdW5zaWduZWQgbG9uZyAqbWFza19vdXQpCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aTsKKwl1bnNpZ25lZCBsb25nIG1hc2ssIG9sZDsKKwlpbnQgbmVzdGVkOworCisJbWFzayA9IHhjaGcoJnBlbmRpbmdfbWFzaywgMSA8PCBzaWcpOworCWlmKG1hc2sgIT0gMCl7CisJCS8qIElmIGFueSBpbnRlcnJ1cHRzIGNvbWUgaW4gYXQgdGhpcyBwb2ludCwgd2Ugd2FudCB0bworCQkgKiBtYWtlIHN1cmUgdGhhdCB0aGVpciBiaXRzIGFyZW4ndCBsb3N0IGJ5IG91cgorCQkgKiBwdXR0aW5nIG91ciBiaXQgaW4uICBTbywgdGhpcyBsb29wIGFjY3VtdWxhdGVzIGJpdHMKKwkJICogdW50aWwgeGNoZyByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIHRoYXQgd2UgcHV0IGluLgorCQkgKiBXaGVuIHRoYXQgaGFwcGVucywgdGhlcmUgd2VyZSBubyBuZXcgaW50ZXJydXB0cywKKwkJICogYW5kIHBlbmRpbmdfbWFzayBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBpbnRlcnJ1cHQKKwkJICogdGhhdCBjYW1lIGluLgorCQkgKi8KKwkJb2xkID0gMSA8PCBzaWc7CisJCWRvIHsKKwkJCW9sZCB8PSBtYXNrOworCQkJbWFzayA9IHhjaGcoJnBlbmRpbmdfbWFzaywgb2xkKTsKKwkJfSB3aGlsZShtYXNrICE9IG9sZCk7CisJCXJldHVybiAxOworCX0KKworCXRpID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCW5lc3RlZCA9ICh0aS0+cmVhbF90aHJlYWQgIT0gTlVMTCk7CisJaWYoIW5lc3RlZCl7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwkJc3RydWN0IHRocmVhZF9pbmZvICp0dGk7CisKKwkJdGFzayA9IGNwdV90YXNrc1t0aS0+Y3B1XS50YXNrOworCQl0dGkgPSB0YXNrX3RocmVhZF9pbmZvKHRhc2spOworCQkqdGkgPSAqdHRpOworCQl0aS0+cmVhbF90aHJlYWQgPSB0dGk7CisJCXRhc2stPnN0YWNrID0gdGk7CisJfQorCisJbWFzayA9IHhjaGcoJnBlbmRpbmdfbWFzaywgMCk7CisJKm1hc2tfb3V0IHw9IG1hc2sgfCBuZXN0ZWQ7CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZnJvbV9pcnFfc3RhY2soaW50IG5lc3RlZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpLCAqdG87CisJdW5zaWduZWQgbG9uZyBtYXNrOworCisJdGkgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CisKKwlwZW5kaW5nX21hc2sgPSAxOworCisJdG8gPSB0aS0+cmVhbF90aHJlYWQ7CisJY3VycmVudC0+c3RhY2sgPSB0bzsKKwl0aS0+cmVhbF90aHJlYWQgPSBOVUxMOworCSp0byA9ICp0aTsKKworCW1hc2sgPSB4Y2hnKCZwZW5kaW5nX21hc2ssIDApOworCXJldHVybiBtYXNrICYgfjE7Cit9CisKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzLmMKaW5kZXggYTk2YWUxYS4uMmE2OWE3YyAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzLmMKQEAgLTE2Myw4ICsxNjMsMTIgQEAKIAogZXh0ZXJuIGludCB1c2Vyc3BhY2VfcGlkW107CiAKK2V4dGVybiBjaGFyIGNwdTBfaXJxc3RhY2tbXTsKKwogaW50IHN0YXJ0X3VtbF9za2FzKHZvaWQpCiB7CisJc3RhY2tfcHJvdGVjdGlvbnMoKHVuc2lnbmVkIGxvbmcpICZjcHUwX2lycXN0YWNrKTsKKwlzZXRfc2lnc3RhY2soY3B1MF9pcnFzdGFjaywgVEhSRUFEX1NJWkUpOwogCWlmKHByb2NfbW0pCiAJCXVzZXJzcGFjZV9waWRbMF0gPSBzdGFydF91c2Vyc3BhY2UoMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L2V4ZWNfa2Vybi5jIGIvYXJjaC91bS9rZXJuZWwvdHQvZXhlY19rZXJuLmMKaW5kZXggOThlMjE3NC4uNDAxMjZjYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvZXhlY19rZXJuLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHQvZXhlY19rZXJuLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAllbmFibGVfdGltZXIoKTsKIAlmcmVlX3BhZ2Uoc3RhY2spOwogCXByb3RlY3RfbWVtb3J5KHVtbF9yZXNlcnZlZCwgaGlnaF9waHlzbWVtIC0gdW1sX3Jlc2VydmVkLCAxLCAxLCAwLCAxKTsKLQl0YXNrX3Byb3RlY3Rpb25zKCh1bnNpZ25lZCBsb25nKSBjdXJyZW50X3RocmVhZCk7CisJc3RhY2tfcHJvdGVjdGlvbnMoKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnRfdGhyZWFkKTsKIAlmb3JjZV9mbHVzaF9hbGwoKTsKIAl1bmJsb2NrX3NpZ25hbHMoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3R0L3Byb2Nlc3Nfa2Vybi5jIGIvYXJjaC91bS9rZXJuZWwvdHQvcHJvY2Vzc19rZXJuLmMKaW5kZXggYzYzMTMwMy4uNzQzNDdhZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvdHQvcHJvY2Vzc19rZXJuLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHQvcHJvY2Vzc19rZXJuLmMKQEAgLTIwOSw3ICsyMDksNyBAQAogCWlmKGN1cnJlbnQtPm1tICE9IGN1cnJlbnQtPnBhcmVudC0+bW0pCiAJCXByb3RlY3RfbWVtb3J5KHVtbF9yZXNlcnZlZCwgaGlnaF9waHlzbWVtIC0gdW1sX3Jlc2VydmVkLCAxLCAKIAkJCSAgICAgICAxLCAwLCAxKTsKLQl0YXNrX3Byb3RlY3Rpb25zKCh1bnNpZ25lZCBsb25nKSBjdXJyZW50X3RocmVhZCk7CisJc3RhY2tfcHJvdGVjdGlvbnMoKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnRfdGhyZWFkKTsKIAogCWZyZWVfcGFnZShjdXJyZW50LT50aHJlYWQudGVtcF9zdGFjayk7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3VtX2FyY2guYyBiL2FyY2gvdW0va2VybmVsL3VtX2FyY2guYwppbmRleCAxY2Y5NTRhLi5lY2M0NThmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdW1fYXJjaC5jCkBAIC00NTksNyArNDU5LDcgQEAKIAogCXVtbF9wb3N0c2V0dXAoKTsKIAotCXRhc2tfcHJvdGVjdGlvbnMoKHVuc2lnbmVkIGxvbmcpICZpbml0X3RocmVhZF9pbmZvKTsKKwlzdGFja19wcm90ZWN0aW9ucygodW5zaWduZWQgbG9uZykgJmluaXRfdGhyZWFkX2luZm8pOwogCW9zX2ZsdXNoX3N0ZG91dCgpOwogCiAJcmV0dXJuIENIT09TRV9NT0RFKHN0YXJ0X3VtbF90dCgpLCBzdGFydF91bWxfc2thcygpKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUyBiL2FyY2gvdW0va2VybmVsL3VtbC5sZHMuUwppbmRleCBmNjMwMTI3Li5iYzU5Zjk3IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC91bWwubGRzLlMKKysrIGIvYXJjaC91bS9rZXJuZWwvdW1sLmxkcy5TCkBAIC01OSw2ICs1OSw4IEBACiAgIHsKICAgICAuID0gQUxJR04oS0VSTkVMX1NUQUNLX1NJWkUpOwkJLyogaW5pdF90YXNrICovCiAgICAgKiguZGF0YS5pbml0X3Rhc2spCisgICAgLiA9IEFMSUdOKEtFUk5FTF9TVEFDS19TSVpFKTsKKyAgICAqKC5kYXRhLmluaXRfaXJxc3RhY2spCiAgICAgKiguZGF0YSkKICAgICAqKC5nbnUubGlua29uY2UuZCopCiAgICAgQ09OU1RSVUNUT1JTCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3NpZ25hbC5jIGIvYXJjaC91bS9vcy1MaW51eC9zaWduYWwuYwppbmRleCA0OGQ0OTM0Li4xOGU1YzhiIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NpZ25hbC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc2lnbmFsLmMKQEAgLTYxLDE1ICs2MSwxOSBAQAogCiBzdGF0aWMgdm9pZCByZWFsX2FsYXJtX2hhbmRsZXIoaW50IHNpZywgc3RydWN0IHNpZ2NvbnRleHQgKnNjKQogeworCXVuaW9uIHVtbF9wdF9yZWdzIHJlZ3M7CisKIAlpZihzaWcgPT0gU0lHQUxSTSkKIAkJc3dpdGNoX3RpbWVycygwKTsKIAotCUNIT09TRV9NT0RFX1BST0Moc2lnX2hhbmRsZXJfY29tbW9uX3R0LCBzaWdfaGFuZGxlcl9jb21tb25fc2thcywKLQkJCSBzaWcsIHNjKTsKKwlpZihzYyAhPSBOVUxMKQorCQljb3B5X3NjKCZyZWdzLCBzYyk7CisJcmVncy5za2FzLmlzX3VzZXIgPSAwOworCXVuYmxvY2tfc2lnbmFscygpOworCXRpbWVyX2hhbmRsZXIoc2lnLCAmcmVncyk7CiAKIAlpZihzaWcgPT0gU0lHQUxSTSkKIAkJc3dpdGNoX3RpbWVycygxKTsKLQogfQogCiB2b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZywgc3RydWN0IHNpZ2NvbnRleHQgKnNjKQpAQCAtMTEzLDYgKzExNyw0NiBAQAogCiB2b2lkICgqaGFuZGxlcnNbX05TSUddKShpbnQgc2lnLCBzdHJ1Y3Qgc2lnY29udGV4dCAqc2MpOwogCit2b2lkIGhhbmRsZV9zaWduYWwoaW50IHNpZywgc3RydWN0IHNpZ2NvbnRleHQgKnNjKQoreworCXVuc2lnbmVkIGxvbmcgcGVuZGluZyA9IDA7CisKKwlkbyB7CisJCWludCBuZXN0ZWQsIGJhaWw7CisKKwkJLyoKKwkJICogcGVuZGluZyBjb21lcyBiYWNrIHdpdGggb25lIGJpdCBzZXQgZm9yIGVhY2gKKwkJICogaW50ZXJydXB0IHRoYXQgYXJyaXZlZCB3aGlsZSBzZXR0aW5nIHVwIHRoZSBzdGFjaywKKwkJICogcGx1cyBhIGJpdCBmb3IgdGhpcyBpbnRlcnJ1cHQsIHBsdXMgdGhlIHplcm8gYml0IGlzCisJCSAqIHNldCBpZiB0aGlzIGlzIGEgbmVzdGVkIGludGVycnVwdC4KKwkJICogSWYgYmFpbCBpcyB0cnVlLCB0aGVuIHdlIGludGVycnVwdGVkIGFub3RoZXIKKwkJICogaGFuZGxlciBzZXR0aW5nIHVwIHRoZSBzdGFjay4gIEluIHRoaXMgY2FzZSwgd2UKKwkJICogaGF2ZSB0byByZXR1cm4sIGFuZCB0aGUgdXBwZXIgaGFuZGxlciB3aWxsIGRlYWwKKwkJICogd2l0aCB0aGlzIGludGVycnVwdC4KKwkJICovCisJCWJhaWwgPSB0b19pcnFfc3RhY2soc2lnLCAmcGVuZGluZyk7CisJCWlmKGJhaWwpCisJCQlyZXR1cm47CisKKwkJbmVzdGVkID0gcGVuZGluZyAmIDE7CisJCXBlbmRpbmcgJj0gfjE7CisKKwkJd2hpbGUoKHNpZyA9IGZmcyhwZW5kaW5nKSkgIT0gMCl7CisJCQlzaWctLTsKKwkJCXBlbmRpbmcgJj0gfigxIDw8IHNpZyk7CisJCQkoKmhhbmRsZXJzW3NpZ10pKHNpZywgc2MpOworCQl9CisKKwkJLyogQWdhaW4sIHBlbmRpbmcgY29tZXMgYmFjayB3aXRoIGEgbWFzayBvZiBzaWduYWxzCisJCSAqIHRoYXQgYXJyaXZlZCB3aGlsZSB0ZWFyaW5nIGRvd24gdGhlIHN0YWNrLiAgSWYgdGhpcworCQkgKiBpcyBub24temVybywgd2UganVzdCBnbyBiYWNrLCBzZXQgdXAgdGhlIHN0YWNrCisJCSAqIGFnYWluLCBhbmQgaGFuZGxlIHRoZSBuZXcgaW50ZXJydXB0cy4KKwkJICovCisJCWlmKCFuZXN0ZWQpCisJCQlwZW5kaW5nID0gZnJvbV9pcnFfc3RhY2sobmVzdGVkKTsKKwl9IHdoaWxlKHBlbmRpbmcpOworfQorCiBleHRlcm4gdm9pZCBoYXJkX2hhbmRsZXIoaW50IHNpZyk7CiAKIHZvaWQgc2V0X2hhbmRsZXIoaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCksIGludCBmbGFncywgLi4uKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYyBiL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKaW5kZXggNmEwZTQ2Ni4uZjlkMmY4NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCkBAIC0yODgsNyArMjg4LDggQEAKIHZvaWQgdXNlcnNwYWNlKHVuaW9uIHVtbF9wdF9yZWdzICpyZWdzKQogewogCWludCBlcnIsIHN0YXR1cywgb3AsIHBpZCA9IHVzZXJzcGFjZV9waWRbMF07Ci0JaW50IGxvY2FsX3VzaW5nX3N5c2VtdTsgLypUbyBwcmV2ZW50IHJhY2VzIGlmIHVzaW5nX3N5c2VtdSBjaGFuZ2VzIHVuZGVyIHVzLiovCisJLyogVG8gcHJldmVudCByYWNlcyBpZiB1c2luZ19zeXNlbXUgY2hhbmdlcyB1bmRlciB1cy4qLworCWludCBsb2NhbF91c2luZ19zeXNlbXU7CiAKIAl3aGlsZSgxKXsKIAkJcmVzdG9yZV9yZWdpc3RlcnMocGlkLCByZWdzKTsKQEAgLTI5Niw3ICsyOTcsOCBAQAogCQkvKiBOb3cgd2Ugc2V0IGxvY2FsX3VzaW5nX3N5c2VtdSB0byBiZSB1c2VkIGZvciBvbmUgbG9vcCAqLwogCQlsb2NhbF91c2luZ19zeXNlbXUgPSBnZXRfdXNpbmdfc3lzZW11KCk7CiAKLQkJb3AgPSBTRUxFQ1RfUFRSQUNFX09QRVJBVElPTihsb2NhbF91c2luZ19zeXNlbXUsIHNpbmdsZXN0ZXBwaW5nKE5VTEwpKTsKKwkJb3AgPSBTRUxFQ1RfUFRSQUNFX09QRVJBVElPTihsb2NhbF91c2luZ19zeXNlbXUsCisJCQkJCSAgICAgc2luZ2xlc3RlcHBpbmcoTlVMTCkpOwogCiAJCWVyciA9IHB0cmFjZShvcCwgcGlkLCAwLCAwKTsKIAkJaWYoZXJyKQpAQCAtNDkwLDggKzQ5Miw4IEBACiB2b2lkIG5ld190aHJlYWQodm9pZCAqc3RhY2ssIGptcF9idWYgKmJ1Ziwgdm9pZCAoKmhhbmRsZXIpKHZvaWQpKQogewogCSgqYnVmKVswXS5KQl9JUCA9ICh1bnNpZ25lZCBsb25nKSBoYW5kbGVyOwotCSgqYnVmKVswXS5KQl9TUCA9ICh1bnNpZ25lZCBsb25nKSBzdGFjayArCi0JCShQQUdFX1NJWkUgPDwgVU1MX0NPTkZJR19LRVJORUxfU1RBQ0tfT1JERVIpIC0gc2l6ZW9mKHZvaWQgKik7CisJKCpidWYpWzBdLkpCX1NQID0gKHVuc2lnbmVkIGxvbmcpIHN0YWNrICsgVU1fVEhSRUFEX1NJWkUgLQorCQlzaXplb2Yodm9pZCAqKTsKIH0KIAogI2RlZmluZSBJTklUX0pNUF9ORVdfVEhSRUFEIDAKQEAgLTUzMyw4ICs1MzUsNyBAQAogCWNhc2UgSU5JVF9KTVBfTkVXX1RIUkVBRDoKIAkJKCpzd2l0Y2hfYnVmKVswXS5KQl9JUCA9ICh1bnNpZ25lZCBsb25nKSBuZXdfdGhyZWFkX2hhbmRsZXI7CiAJCSgqc3dpdGNoX2J1ZilbMF0uSkJfU1AgPSAodW5zaWduZWQgbG9uZykgc3RhY2sgKwotCQkJKFBBR0VfU0laRSA8PCBVTUxfQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUikgLQotCQkJc2l6ZW9mKHZvaWQgKik7CisJCQlVTV9USFJFQURfU0laRSAtIHNpemVvZih2b2lkICopOwogCQlicmVhazsKIAljYXNlIElOSVRfSk1QX0NBTExCQUNLOgogCQkoKmNiX3Byb2MpKGNiX2FyZyk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3NpZ25hbC5jIGIvYXJjaC91bS9vcy1MaW51eC9zeXMtaTM4Ni9zaWduYWwuYwppbmRleCAwZDNlYWU1Li5mMzExNjA5IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N5cy1pMzg2L3NpZ25hbC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLWkzODYvc2lnbmFsLmMKQEAgLTEsMTUgKzEsMTMgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgSmVmZiBEaWtlIChqZGlrZUBhZGR0b2l0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMjAwNiBKZWZmIERpa2UgKGpkaWtlQHthZGR0b2l0LGxpbnV4LmludGVsfS5jb20pCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIAogI2luY2x1ZGUgPHNpZ25hbC5oPgogCi1leHRlcm4gdm9pZCAoKmhhbmRsZXJzW10pKGludCBzaWcsIHN0cnVjdCBzaWdjb250ZXh0ICpzYyk7CitleHRlcm4gdm9pZCBoYW5kbGVfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdjb250ZXh0ICpzYyk7CiAKIHZvaWQgaGFyZF9oYW5kbGVyKGludCBzaWcpCiB7Ci0Jc3RydWN0IHNpZ2NvbnRleHQgKnNjID0gKHN0cnVjdCBzaWdjb250ZXh0ICopICgmc2lnICsgMSk7Ci0KLQkoKmhhbmRsZXJzW3NpZ10pKHNpZywgc2MpOworCWhhbmRsZV9zaWduYWwoc2lnLCAoc3RydWN0IHNpZ2NvbnRleHQgKikgKCZzaWcgKyAxKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvc2lnbmFsLmMgYi9hcmNoL3VtL29zLUxpbnV4L3N5cy14ODZfNjQvc2lnbmFsLmMKaW5kZXggM2YzNjllNS4uODJhMzg4OCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9zeXMteDg2XzY0L3NpZ25hbC5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc3lzLXg4Nl82NC9zaWduYWwuYwpAQCAtMSwxNiArMSwxNiBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNiBKZWZmIERpa2UgKGpkaWtlQGFkZHRvaXQuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDA2IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKICAqLwogCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAKLWV4dGVybiB2b2lkICgqaGFuZGxlcnNbXSkoaW50IHNpZywgc3RydWN0IHNpZ2NvbnRleHQgKnNjKTsKK2V4dGVybiB2b2lkIGhhbmRsZV9zaWduYWwoaW50IHNpZywgc3RydWN0IHNpZ2NvbnRleHQgKnNjKTsKIAogdm9pZCBoYXJkX2hhbmRsZXIoaW50IHNpZykKIHsKIAlzdHJ1Y3QgdWNvbnRleHQgKnVjOwogCWFzbSgibW92cSAlJXJkeCwgJTAiIDogIj1yIiAodWMpKTsKIAotCSgqaGFuZGxlcnNbc2lnXSkoc2lnLCAoc3RydWN0IHNpZ2NvbnRleHQgKikgJnVjLT51Y19tY29udGV4dCk7CisJaGFuZGxlX3NpZ25hbChzaWcsIChzdHJ1Y3Qgc2lnY29udGV4dCAqKSAmdWMtPnVjX21jb250ZXh0KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvdXRpbC5jIGIvYXJjaC91bS9vcy1MaW51eC91dGlsLmMKaW5kZXggYzMwN2E4OS4uN2NiY2Y0OCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC91dGlsLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC91dGlsLmMKQEAgLTMzLDI1ICszMyw4IEBACiAKIHZvaWQgc3RhY2tfcHJvdGVjdGlvbnModW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCWludCBwcm90ID0gUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQzsKLQotCWlmKG1wcm90ZWN0KCh2b2lkICopIGFkZHJlc3MsIFVNX0tFUk5fUEFHRV9TSVpFLCBwcm90KSA8IDApCi0JCXBhbmljKCJwcm90ZWN0aW5nIHN0YWNrIGZhaWxlZCwgZXJybm8gPSAlZCIsIGVycm5vKTsKLX0KLQotdm9pZCB0YXNrX3Byb3RlY3Rpb25zKHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKLXsKLQl1bnNpZ25lZCBsb25nIGd1YXJkID0gYWRkcmVzcyArIFVNX0tFUk5fUEFHRV9TSVpFOwotCXVuc2lnbmVkIGxvbmcgc3RhY2sgPSBndWFyZCArIFVNX0tFUk5fUEFHRV9TSVpFOwotCWludCBwcm90ID0gMCwgcGFnZXM7Ci0KLSNpZmRlZiBub3RkZWYKLQlpZihtcHJvdGVjdCgodm9pZCAqKSBzdGFjaywgVU1fS0VSTl9QQUdFX1NJWkUsIHByb3QpIDwgMCkKLQkJcGFuaWMoInByb3RlY3RpbmcgZ3VhcmQgcGFnZSBmYWlsZWQsIGVycm5vID0gJWQiLCBlcnJubyk7Ci0jZW5kaWYKLQlwYWdlcyA9ICgxIDw8IFVNTF9DT05GSUdfS0VSTkVMX1NUQUNLX09SREVSKSAtIDI7Ci0JcHJvdCA9IFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUM7Ci0JaWYobXByb3RlY3QoKHZvaWQgKikgc3RhY2ssIHBhZ2VzICogVU1fS0VSTl9QQUdFX1NJWkUsIHByb3QpIDwgMCkKKwlpZihtcHJvdGVjdCgodm9pZCAqKSBhZGRyZXNzLCBVTV9USFJFQURfU0laRSwKKwkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMpIDwgMCkKIAkJcGFuaWMoInByb3RlY3Rpbmcgc3RhY2sgZmFpbGVkLCBlcnJubyA9ICVkIiwgZXJybm8pOwogfQogCkBAIC03Miw3ICs1NSw3IEBACiAKIAkvKiBYWFggdGNzZXRhdHRyIGNvdWxkIGhhdmUgYXBwbGllZCBvbmx5IHNvbWUgY2hhbmdlcwogCSAqIChhbmQgY2ZtYWtlcmF3KCkgaXMgYSBzZXQgb2YgY2hhbmdlcykgKi8KLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgc2V0dXBfbWFjaGluZW5hbWUoY2hhciAqbWFjaGluZV9vdXQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2F1ZGl0LmMgYi9hcmNoL3g4Nl82NC9pYTMyL2F1ZGl0LmMKaW5kZXggOTJkN2QwYy4uODg1MGZlNCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9hdWRpdC5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvYXVkaXQuYwpAQCAtMjAsNiArMjAsMTEgQEAKIH4wVQogfTsKIAordW5zaWduZWQgaWEzMl9zaWduYWxfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9zaWduYWwuaD4KK34wVQorfTsKKwogaW50IGlhMzJfY2xhc3NpZnlfc3lzY2FsbCh1bnNpZ25lZCBzeXNjYWxsKQogewogCXN3aXRjaChzeXNjYWxsKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUwppbmRleCBmMjEwNjgzLi4yMTg2OGY5IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTcxNiw0ICs3MTYsNyBAQAogCS5xdWFkIHN5c19nZXRjcHUKIAkucXVhZCBzeXNfZXBvbGxfcHdhaXQKIAkucXVhZCBjb21wYXRfc3lzX3V0aW1lbnNhdAkvKiAzMjAgKi8KLWlhMzJfc3lzY2FsbF9lbmQ6CQkKKwkucXVhZCBjb21wYXRfc3lzX3NpZ25hbGZkCisJLnF1YWQgY29tcGF0X3N5c190aW1lcmZkCisJLnF1YWQgc3lzX2V2ZW50ZmQKK2lhMzJfc3lzY2FsbF9lbmQ6CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBlcnR1cmUuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGVydHVyZS5jCmluZGV4IGE1MmFmNTguLmEzZDQ1MGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9hcGVydHVyZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGVydHVyZS5jCkBAIC04Niw3ICs4Niw3IEBACiAJCXByaW50aygiQXBlcnR1cmUgdG9vIHNtYWxsICglZCBNQilcbiIsIGFwZXJfc2l6ZT4+MjApOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKGFwZXJfYmFzZSArIGFwZXJfc2l6ZSA+PSAweGZmZmZmZmZmKSB7IAorCWlmIChhcGVyX2Jhc2UgKyBhcGVyX3NpemUgPiAweDEwMDAwMDAwMFVMKSB7CiAJCXByaW50aygiQXBlcnR1cmUgYmV5b25kIDRHQi4gSWdub3JpbmcuXG4iKTsKIAkJcmV0dXJuIDA7IAogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9hdWRpdC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2F1ZGl0LmMKaW5kZXggMjFmMzMzOC4uMDZkM2U1YSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2F1ZGl0LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2F1ZGl0LmMKQEAgLTIzLDYgKzIzLDIwIEBACiB+MFUKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBzaWduYWxfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9zaWduYWwuaD4KK34wVQorfTsKKworaW50IGF1ZGl0X2NsYXNzaWZ5X2FyY2goaW50IGFyY2gpCit7CisjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCisJaWYgKGFyY2ggPT0gQVVESVRfQVJDSF9JMzg2KQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCiBpbnQgYXVkaXRfY2xhc3NpZnlfc3lzY2FsbChpbnQgYWJpLCB1bnNpZ25lZCBzeXNjYWxsKQogewogI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgpAQCAtNDksMTUgKzYzLDE4IEBACiAJZXh0ZXJuIF9fdTMyIGlhMzJfd3JpdGVfY2xhc3NbXTsKIAlleHRlcm4gX191MzIgaWEzMl9yZWFkX2NsYXNzW107CiAJZXh0ZXJuIF9fdTMyIGlhMzJfY2hhdHRyX2NsYXNzW107CisJZXh0ZXJuIF9fdTMyIGlhMzJfc2lnbmFsX2NsYXNzW107CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfV1JJVEVfMzIsIGlhMzJfd3JpdGVfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1JFQURfMzIsIGlhMzJfcmVhZF9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfRElSX1dSSVRFXzMyLCBpYTMyX2Rpcl9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfQ0hBVFRSXzMyLCBpYTMyX2NoYXR0cl9jbGFzcyk7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfU0lHTkFMXzMyLCBpYTMyX3NpZ25hbF9jbGFzcyk7CiAjZW5kaWYKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURSwgd3JpdGVfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1JFQUQsIHJlYWRfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0RJUl9XUklURSwgZGlyX2NsYXNzKTsKIAlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFIsIGNoYXR0cl9jbGFzcyk7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfU0lHTkFMLCBzaWduYWxfY2xhc3MpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvYnVncy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2J1Z3MuYwppbmRleCAxMmI1ODViLi5jM2M2YjkxIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYnVncy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9idWdzLmMKQEAgLTksMTAgKzksMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAKIHZvaWQgX19pbml0IGNoZWNrX2J1Z3Modm9pZCkKIHsKIAlpZGVudGlmeV9jcHUoJmJvb3RfY3B1X2RhdGEpOworCW10cnJfYnBfaW5pdCgpOwogI2lmICFkZWZpbmVkKENPTkZJR19TTVApCiAJcHJpbnRrKCJDUFU6ICIpOwogCXByaW50X2NwdV9pbmZvKCZib290X2NwdV9kYXRhKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkNjQuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkNjQuYwppbmRleCAyMTNkOTBlLi42YzM0YmRkIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZDY0LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2hlYWQ2NC5jCkBAIC02MiwxMyArNjIsNiBAQAogewogCWludCBpOwogCi0JLyoKLQkgKiBNYWtlIHN1cmUga2VybmVsIGlzIGFsaWduZWQgdG8gMk1CIGFkZHJlc3MuIENhdGNoaW5nIGl0IGF0IGNvbXBpbGUKLQkgKiB0aW1lIGlzIGJldHRlci4gQ2hhbmdlIHlvdXIgY29uZmlnIGZpbGUgYW5kIGNvbXBpbGUgdGhlIGtlcm5lbAotCSAqIGZvciBhIDJNQiBhbGlnbmVkIGFkZHJlc3MgKENPTkZJR19QSFlTSUNBTF9TVEFSVCkKLQkgKi8KLQlCVUlMRF9CVUdfT04oQ09ORklHX1BIWVNJQ0FMX1NUQVJUICYgKF9fS0VSTkVMX0FMSUdOIC0gMSkpOwotCiAJLyogY2xlYXIgYnNzIGJlZm9yZSBzZXRfaW50cl9nYXRlIHdpdGggZWFybHlfaWR0X2hhbmRsZXIgKi8KIAljbGVhcl9ic3MoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3BjaS1nYXJ0LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWdhcnQuYwppbmRleCAzNzNlZjY2Li5hZTA5MWNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWdhcnQuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWdhcnQuYwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAJYXBlcl9iYXNlIDw8PSAyNTsKIAogCWFwZXJfc2l6ZSA9ICgzMiAqIDEwMjQgKiAxMDI0KSA8PCBhcGVyX29yZGVyOyAKLQlpZiAoYXBlcl9iYXNlICsgYXBlcl9zaXplID49IDB4ZmZmZmZmZmYgfHwgIWFwZXJfc2l6ZSkKKyAgICAgICBpZiAoYXBlcl9iYXNlICsgYXBlcl9zaXplID4gMHgxMDAwMDAwMDBVTCB8fCAhYXBlcl9zaXplKQogCQlhcGVyX2Jhc2UgPSAwOwogCiAJKnNpemUgPSBhcGVyX3NpemU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IGRiNTE1NzcuLmViNjUyNGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCkBAIC04OTEsOSArODkxLDcgQEAKICNpZmRlZiBDT05GSUdfWDg2X01DRQogCW1jaGVja19pbml0KGMpOwogI2VuZGlmCi0JaWYgKGMgPT0gJmJvb3RfY3B1X2RhdGEpCi0JCW10cnJfYnBfaW5pdCgpOwotCWVsc2UKKwlpZiAoYyAhPSAmYm9vdF9jcHVfZGF0YSkKIAkJbXRycl9hcF9pbml0KCk7CiAjaWZkZWYgQ09ORklHX05VTUEKIAludW1hX2FkZF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2xsX3J3X2Jsay5jIGIvYmxvY2svbGxfcndfYmxrLmMKaW5kZXggMTdlMTg4OS4uNzRhNTY3YSAxMDA2NDQKLS0tIGEvYmxvY2svbGxfcndfYmxrLmMKKysrIGIvYmxvY2svbGxfcndfYmxrLmMKQEAgLTMxMTYsNyArMzExNiw3IEBACiAgKiBiaV9zZWN0b3IgZm9yIHJlbWFwcyBhcyBpdCBzZWVzIGZpdC4gIFNvIHRoZSB2YWx1ZXMgb2YgdGhlc2UgZmllbGRzCiAgKiBzaG91bGQgTk9UIGJlIGRlcGVuZGVkIG9uIGFmdGVyIHRoZSBjYWxsIHRvIGdlbmVyaWNfbWFrZV9yZXF1ZXN0LgogICovCi12b2lkIGdlbmVyaWNfbWFrZV9yZXF1ZXN0KHN0cnVjdCBiaW8gKmJpbykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2dlbmVyaWNfbWFrZV9yZXF1ZXN0KHN0cnVjdCBiaW8gKmJpbykKIHsKIAlyZXF1ZXN0X3F1ZXVlX3QgKnE7CiAJc2VjdG9yX3QgbWF4c2VjdG9yOwpAQCAtMzIxNSw2ICszMjE1LDU3IEBACiAJfSB3aGlsZSAocmV0KTsKIH0KIAorLyoKKyAqIFdlIG9ubHkgd2FudCBvbmUgLT5tYWtlX3JlcXVlc3RfZm4gdG8gYmUgYWN0aXZlIGF0IGEgdGltZSwKKyAqIGVsc2Ugc3RhY2sgdXNhZ2Ugd2l0aCBzdGFja2VkIGRldmljZXMgY291bGQgYmUgYSBwcm9ibGVtLgorICogU28gdXNlIGN1cnJlbnQtPmJpb197bGlzdCx0YWlsfSB0byBrZWVwIGEgbGlzdCBvZiByZXF1ZXN0cworICogc3VibWl0ZWQgYnkgYSBtYWtlX3JlcXVlc3RfZm4gZnVuY3Rpb24uCisgKiBjdXJyZW50LT5iaW9fdGFpbCBpcyBhbHNvIHVzZWQgYXMgYSBmbGFnIHRvIHNheSBpZgorICogZ2VuZXJpY19tYWtlX3JlcXVlc3QgaXMgY3VycmVudGx5IGFjdGl2ZSBpbiB0aGlzIHRhc2sgb3Igbm90LgorICogSWYgaXQgaXMgTlVMTCwgdGhlbiBubyBtYWtlX3JlcXVlc3QgaXMgYWN0aXZlLiAgSWYgaXQgaXMgbm9uLU5VTEwsCisgKiB0aGVuIGEgbWFrZV9yZXF1ZXN0IGlzIGFjdGl2ZSwgYW5kIG5ldyByZXF1ZXN0cyBzaG91bGQgYmUgYWRkZWQKKyAqIGF0IHRoZSB0YWlsCisgKi8KK3ZvaWQgZ2VuZXJpY19tYWtlX3JlcXVlc3Qoc3RydWN0IGJpbyAqYmlvKQoreworCWlmIChjdXJyZW50LT5iaW9fdGFpbCkgeworCQkvKiBtYWtlX3JlcXVlc3QgaXMgYWN0aXZlICovCisJCSooY3VycmVudC0+YmlvX3RhaWwpID0gYmlvOworCQliaW8tPmJpX25leHQgPSBOVUxMOworCQljdXJyZW50LT5iaW9fdGFpbCA9ICZiaW8tPmJpX25leHQ7CisJCXJldHVybjsKKwl9CisJLyogZm9sbG93aW5nIGxvb3AgbWF5IGJlIGEgYml0IG5vbi1vYnZpb3VzLCBhbmQgc28gZGVzZXJ2ZXMgc29tZQorCSAqIGV4cGxhbmF0aW9uLgorCSAqIEJlZm9yZSBlbnRlcmluZyB0aGUgbG9vcCwgYmlvLT5iaV9uZXh0IGlzIE5VTEwgKGFzIGFsbCBjYWxsZXJzCisJICogZW5zdXJlIHRoYXQpIHNvIHdlIGhhdmUgYSBsaXN0IHdpdGggYSBzaW5nbGUgYmlvLgorCSAqIFdlIHByZXRlbmQgdGhhdCB3ZSBoYXZlIGp1c3QgdGFrZW4gaXQgb2ZmIGEgbG9uZ2VyIGxpc3QsIHNvCisJICogd2UgYXNzaWduIGJpb19saXN0IHRvIHRoZSBuZXh0ICh3aGljaCBpcyBOVUxMKSBhbmQgYmlvX3RhaWwKKwkgKiB0byAmYmlvX2xpc3QsIHRodXMgaW5pdGlhbGlzaW5nIHRoZSBiaW9fbGlzdCBvZiBuZXcgYmlvcyB0byBiZQorCSAqIGFkZGVkLiAgX19nZW5lcmljX21ha2VfcmVxdWVzdCBtYXkgaW5kZWVkIGFkZCBzb21lIG1vcmUgYmlvcworCSAqIHRocm91Z2ggYSByZWN1cnNpdmUgY2FsbCB0byBnZW5lcmljX21ha2VfcmVxdWVzdC4gIElmIGl0CisJICogZGlkLCB3ZSBmaW5kIGEgbm9uLU5VTEwgdmFsdWUgaW4gYmlvX2xpc3QgYW5kIHJlLWVudGVyIHRoZSBsb29wCisJICogZnJvbSB0aGUgdG9wLiAgSW4gdGhpcyBjYXNlIHdlIHJlYWxseSBkaWQganVzdCB0YWtlIHRoZSBiaW8KKwkgKiBvZiB0aGUgdG9wIG9mIHRoZSBsaXN0IChubyBwcmV0ZW5kaW5nKSBhbmQgc28gZml4dXAgYmlvX2xpc3QgYW5kCisJICogYmlvX3RhaWwgb3IgYmlfbmV4dCwgYW5kIGNhbGwgaW50byBfX2dlbmVyaWNfbWFrZV9yZXF1ZXN0IGFnYWluLgorCSAqCisJICogVGhlIGxvb3Agd2FzIHN0cnVjdHVyZWQgbGlrZSB0aGlzIHRvIG1ha2Ugb25seSBvbmUgY2FsbCB0bworCSAqIF9fZ2VuZXJpY19tYWtlX3JlcXVlc3QgKHdoaWNoIGlzIGltcG9ydGFudCBhcyBpdCBpcyBsYXJnZSBhbmQKKwkgKiBpbmxpbmVkKSBhbmQgdG8ga2VlcCB0aGUgc3RydWN0dXJlIHNpbXBsZS4KKwkgKi8KKwlCVUdfT04oYmlvLT5iaV9uZXh0KTsKKwlkbyB7CisJCWN1cnJlbnQtPmJpb19saXN0ID0gYmlvLT5iaV9uZXh0OworCQlpZiAoYmlvLT5iaV9uZXh0ID09IE5VTEwpCisJCQljdXJyZW50LT5iaW9fdGFpbCA9ICZjdXJyZW50LT5iaW9fbGlzdDsKKwkJZWxzZQorCQkJYmlvLT5iaV9uZXh0ID0gTlVMTDsKKwkJX19nZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOworCQliaW8gPSBjdXJyZW50LT5iaW9fbGlzdDsKKwl9IHdoaWxlIChiaW8pOworCWN1cnJlbnQtPmJpb190YWlsID0gTlVMTDsgLyogZGVhY3RpdmF0ZSAqLworfQorCiBFWFBPUlRfU1lNQk9MKGdlbmVyaWNfbWFrZV9yZXF1ZXN0KTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9LY29uZmlnIGIvZHJpdmVycy9hdGEvS2NvbmZpZwppbmRleCBmMDMxYjg3Li5hZDFmNTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYXRhL0tjb25maWcKQEAgLTIsMTEgKzIsOSBAQAogIyBTQVRBL1BBVEEgZHJpdmVyIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzIgorbWVudWNvbmZpZyBBVEEKKwl0cmlzdGF0ZSAiU2VyaWFsIEFUQSAocHJvZCkgYW5kIFBhcmFsbGVsIEFUQSAoZXhwZXJpbWVudGFsKSBkcml2ZXJzIgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0KLWNvbmZpZyBBVEEKLQl0cmlzdGF0ZSAiQVRBIGRldmljZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gQkxPQ0sKIAlkZXBlbmRzIG9uICEoTTMyUiB8fCBNNjhLKSB8fCBCUk9LRU4KIAlkZXBlbmRzIG9uICFTVU40IHx8IEJST0tFTgpAQCAtMjQsNiArMjIsMTkgQEAKICAgICAgICBib29sCiAgICAgICAgZGVmYXVsdCBuCiAKK2NvbmZpZyBBVEFfQUNQSQorCWJvb2wKKwlkZXBlbmRzIG9uIEFDUEkgJiYgUENJCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBBVEEtcmVsYXRlZCBBQ1BJIG9iamVjdHMuCisJICBUaGVzZSBBQ1BJIG9iamVjdHMgYWRkIHRoZSBhYmlsaXR5IHRvIHJldHJpZXZlIHRhc2tmaWxlcworCSAgZnJvbSB0aGUgQUNQSSBCSU9TIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBkaXNrIGNvbnRyb2xsZXIuCisJICBUaGVzZSBvYmplY3RzIG1heSBiZSByZWxhdGVkIHRvIHBlcmZvcm1hbmNlLCBzZWN1cml0eSwKKwkgIHBvd2VyIG1hbmFnZW1lbnQsIG9yIG90aGVyIGFyZWFzLgorCSAgWW91IGNhbiBkaXNhYmxlIHRoaXMgYXQga2VybmVsIGJvb3QgdGltZSBieSB1c2luZyB0aGUKKwkgIG9wdGlvbiBsaWJhdGEubm9hY3BpPTEKKwogY29uZmlnIFNBVEFfQUhDSQogCXRyaXN0YXRlICJBSENJIFNBVEEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQpAQCAtMTU3LDE5ICsxNjgsNiBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgSW5pdGlvIDE2MnggU2VyaWFsIEFUQS4KIAotY29uZmlnIFNBVEFfQUNQSQotCWJvb2wKLQlkZXBlbmRzIG9uIEFDUEkgJiYgUENJCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBTQVRBLXJlbGF0ZWQgQUNQSSBvYmplY3RzLgotCSAgVGhlc2UgQUNQSSBvYmplY3RzIGFkZCB0aGUgYWJpbGl0eSB0byByZXRyaWV2ZSB0YXNrZmlsZXMKLQkgIGZyb20gdGhlIEFDUEkgQklPUyBhbmQgd3JpdGUgdGhlbSB0byB0aGUgZGlzayBjb250cm9sbGVyLgotCSAgVGhlc2Ugb2JqZWN0cyBtYXkgYmUgcmVsYXRlZCB0byBwZXJmb3JtYW5jZSwgc2VjdXJpdHksCi0JICBwb3dlciBtYW5hZ2VtZW50LCBvciBvdGhlciBhcmVhcy4KLQkgIFlvdSBjYW4gZGlzYWJsZSB0aGlzIGF0IGtlcm5lbCBib290IHRpbWUgYnkgdXNpbmcgdGhlCi0JICBvcHRpb24gbGliYXRhLm5vYWNwaT0xCi0KIGNvbmZpZyBQQVRBX0FMSQogCXRyaXN0YXRlICJBTGkgUEFUQSBzdXBwb3J0IChFeHBlcmltZW50YWwpIgogCWRlcGVuZHMgb24gUENJICYmIEVYUEVSSU1FTlRBTApAQCAtNTg1LDYgKzU4Myw0IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWVuZGlmCi1lbmRtZW51Ci0KK2VuZGlmICMgQVRBCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9NYWtlZmlsZSBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCmluZGV4IDZmNDJhMGUuLjgxNDljNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCkBAIC02OSw0ICs2OSw0IEBACiBvYmotJChDT05GSUdfUEFUQV9MRUdBQ1kpCSs9IHBhdGFfbGVnYWN5Lm8KIAogbGliYXRhLW9ianMJOj0gbGliYXRhLWNvcmUubyBsaWJhdGEtc2NzaS5vIGxpYmF0YS1zZmYubyBsaWJhdGEtZWgubwotbGliYXRhLSQoQ09ORklHX1NBVEFfQUNQSSkgKz0gbGliYXRhLWFjcGkubworbGliYXRhLSQoQ09ORklHX0FUQV9BQ1BJKQkrPSBsaWJhdGEtYWNwaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmMgYi9kcml2ZXJzL2F0YS9haGNpLmMKaW5kZXggZDk2MTc4OS4uMWFlNDQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuYwpAQCAtMjUwLDEwICsyNTAsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLSNlbmRpZgogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFoY2lfb3BzID0gewpAQCAtNDAwLDYgKzM5Niw3IEBACiAKIAkvKiBBVEkgKi8KIAl7IFBDSV9WREVWSUNFKEFUSSwgMHg0MzgwKSwgYm9hcmRfYWhjaV9zYjYwMCB9LCAvKiBBVEkgU0I2MDAgKi8KKwl7IFBDSV9WREVWSUNFKEFUSSwgMHg0MzkwKSwgYm9hcmRfYWhjaV9zYjYwMCB9LCAvKiBBVEkgU0I3MDAgKi8KIAogCS8qIFZJQSAqLwogCXsgUENJX1ZERVZJQ0UoVklBLCAweDMzNDkpLCBib2FyZF9haGNpX3Z0ODI1MSB9LCAvKiBWSUEgVlQ4MjUxICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jIGIvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYwppbmRleCA5MmE0OTFkLi5jM2Q3NTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgewogCQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gJmFwLT5kZXZpY2VbaV07Ci0JCWlmIChhdGFfZGV2X3JlYWR5KGRldikpIHsKKwkJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpKSB7CiAJCQkvKiBXZSBkb24ndCByZWFsbHkgY2FyZSAqLwogCQkJZGV2LT5waW9fbW9kZSA9IFhGRVJfUElPXzA7CiAJCQlkZXYtPmRtYV9tb2RlID0gWEZFUl9NV19ETUFfMDsKQEAgLTkwLDEwICs5MCw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgZ2VuZXJpY19wb3J0X29wcyA9IHsKQEAgLTE0NSw3ICsxNDEsNyBAQAogc3RhdGljIGludCBhdGFfZ2VuZXJpY19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJdTE2IGNvbW1hbmQ7Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5zaHQgPSAmZ2VuZXJpY19zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLApAQCAtMTUzLDcgKzE0OSw3IEBACiAJCS51ZG1hX21hc2sgPSAweDNmLAogCQkucG9ydF9vcHMgPSAmZ2VuZXJpY19wb3J0X29wcwogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0gPSB7ICZpbmZvLCAmaW5mbyB9OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKIAogCS8qIERvbid0IHVzZSB0aGUgZ2VuZXJpYyBlbnRyeSB1bmxlc3MgaW5zdHJ1Y3RlZCB0byBkbyBzbyAqLwogCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gMSAmJiBhbGxfZ2VuZXJpY19pZGUgPT0gMCkKQEAgLTE3OSw3ICsxNzUsNyBAQAogCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FMKQogCSAgICAJYXRhX3BjaV9jbGVhcl9zaW1wbGV4KGRldik7CiAKLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBvcnRfaW5mbywgMik7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwcGkpOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYXRhX2dlbmVyaWNbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCmluZGV4IDRhNzk1ZmQuLjEzYjZiMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvYXRhX3BpaXguYwpAQCAtMjc1LDEwICsyNzUsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHBpaXhfcGF0YV9vcHMgPSB7CkBAIC0xMDM0LDcgKzEwMzAsNyBAQAogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IGF0YV9wb3J0X2luZm8gcG9ydF9pbmZvWzJdOwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGluZm9bMl0gPSB7ICZwb3J0X2luZm9bMF0sICZwb3J0X2luZm9bMV0gfTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZwb3J0X2luZm9bMF0sICZwb3J0X2luZm9bMV0gfTsKIAlzdHJ1Y3QgcGlpeF9ob3N0X3ByaXYgKmhwcml2OwogCXVuc2lnbmVkIGxvbmcgcG9ydF9mbGFnczsKIApAQCAtMTA5Myw3ICsxMDg5LDcgQEAKIAkJcG9ydF9pbmZvWzFdLm13ZG1hX21hc2sgPSAwOwogCQlwb3J0X2luZm9bMV0udWRtYV9tYXNrID0gMDsKIAl9Ci0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcHBpbmZvLCAyKTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGkpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwaWl4X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jCmluZGV4IGNiM2VhYjZlLi5lZDQxMzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKQEAgLTI3MCw4ICsyNzAsNyBAQAogCiAvKioKICAqIGRvX2RyaXZlX2dldF9HVEYgLSBnZXQgdGhlIGRyaXZlIGJvb3R1cCBkZWZhdWx0IHRhc2tmaWxlIHNldHRpbmdzCi0gKiBAYXA6IHRoZSBhdGFfcG9ydCBmb3IgdGhlIGRyaXZlCi0gKiBAaXg6IHRhcmdldCBhdGFfZGV2aWNlIChkcml2ZSkgaW5kZXgKKyAqIEBkZXY6IHRhcmdldCBBVEEgZGV2aWNlCiAgKiBAZ3RmX2xlbmd0aDogbnVtYmVyIG9mIGJ5dGVzIG9mIF9HVEYgZGF0YSByZXR1cm5lZCBhdCBAZ3RmX2FkZHJlc3MKICAqIEBndGZfYWRkcmVzczogYnVmZmVyIGNvbnRhaW5pbmcgX0dURiB0YXNrZmlsZSBhcnJheXMKICAqCkBAIC0yODYsMjAgKzI4NSwxOSBAQAogICogVGhlIHJldHVybmVkIEBndGZfbGVuZ3RoIGFuZCBAZ3RmX2FkZHJlc3MgYXJlIG9ubHkgdmFsaWQgaWYgdGhlCiAgKiBmdW5jdGlvbiByZXR1cm4gdmFsdWUgaXMgMC4KICAqLwotc3RhdGljIGludCBkb19kcml2ZV9nZXRfR1RGKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCBpeCwKLQkJCXVuc2lnbmVkIGludCAqZ3RmX2xlbmd0aCwgdW5zaWduZWQgbG9uZyAqZ3RmX2FkZHJlc3MsCi0JCQl1bnNpZ25lZCBsb25nICpvYmpfbG9jKQorc3RhdGljIGludCBkb19kcml2ZV9nZXRfR1RGKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqZ3RmX2xlbmd0aCwKKwkJCSAgICB1bnNpZ25lZCBsb25nICpndGZfYWRkcmVzcywgdW5zaWduZWQgbG9uZyAqb2JqX2xvYykKIHsKLQlhY3BpX3N0YXR1cwkJCXN0YXR1czsKLQlhY3BpX2hhbmRsZQkJCWRldl9oYW5kbGUgPSBOVUxMOwotCWFjcGlfaGFuZGxlCQkJY2hhbl9oYW5kbGUsIGRyaXZlX2hhbmRsZTsKLQlhY3BpX2ludGVnZXIJCQlwY2lkZXZmbiA9IDA7Ci0JdTMyCQkJCWRldl9hZHI7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyCQlvdXRwdXQ7Ci0JdW5pb24gYWNwaV9vYmplY3QgCQkqb3V0X29iajsKLQlzdHJ1Y3QgZGV2aWNlCQkJKmRldiA9IGFwLT5ob3N0LT5kZXY7Ci0Jc3RydWN0IGF0YV9kZXZpY2UJCSphdGFkZXYgPSAmYXAtPmRldmljZVtpeF07Ci0JaW50CQkJCWVyciA9IC1FTk9ERVY7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+YXA7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIGRldl9oYW5kbGUgPSBOVUxMOworCWFjcGlfaGFuZGxlIGNoYW5faGFuZGxlLCBkcml2ZV9oYW5kbGU7CisJYWNwaV9pbnRlZ2VyIHBjaWRldmZuID0gMDsKKwl1MzIgZGV2X2FkcjsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0OworCXVuaW9uIGFjcGlfb2JqZWN0ICpvdXRfb2JqOworCXN0cnVjdCBkZXZpY2UgKmdkZXYgPSBhcC0+aG9zdC0+ZGV2OworCWludCBlcnIgPSAtRU5PREVWOwogCiAJKmd0Zl9sZW5ndGggPSAwOwogCSpndGZfYWRkcmVzcyA9IDBVTDsKQEAgLTMwOSwxNCArMzA3LDE0IEBACiAJCXJldHVybiAwOwogCiAJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQotCQlhdGFfZGV2X3ByaW50ayhhdGFkZXYsIEtFUk5fREVCVUcsICIlczogRU5URVI6IHBvcnQjOiAlZFxuIiwKKwkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLCAiJXM6IEVOVEVSOiBwb3J0IzogJWRcbiIsCiAJCQkgICAgICAgX19GVU5DVElPTl9fLCBhcC0+cG9ydF9ubyk7CiAKLQlpZiAoIWF0YV9kZXZfZW5hYmxlZChhdGFkZXYpIHx8IChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkpIHsKKwlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpIHx8IChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkpIHsKIAkJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQotCQkJYXRhX2Rldl9wcmludGsoYXRhZGV2LCBLRVJOX0RFQlVHLCAiJXM6IEVSUjogIgorCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLCAiJXM6IEVSUjogIgogCQkJCSJhdGFfZGV2X3ByZXNlbnQ6ICVkLCBQT1JUX0RJU0FCTEVEOiAlbHVcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBhdGFfZGV2X2VuYWJsZWQoYXRhZGV2KSwKKwkJCQlfX0ZVTkNUSU9OX18sIGF0YV9kZXZfZW5hYmxlZChkZXYpLAogCQkJCWFwLT5mbGFncyAmIEFUQV9GTEFHX0RJU0FCTEVEKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzI0LDE5ICszMjIsMTkgQEAKIAkvKiBEb24ndCBjb250aW51ZSBpZiBkZXZpY2UgaGFzIG5vIF9BRFIgbWV0aG9kLgogCSAqIF9HVEYgaXMgaW50ZW5kZWQgZm9yIGtub3duIG1vdGhlcmJvYXJkIGRldmljZXMuICovCiAJaWYgKCEoYXAtPmNibCA9PSBBVEFfQ0JMX1NBVEEpKSB7Ci0JCWVyciA9IHBhdGFfZ2V0X2Rldl9oYW5kbGUoZGV2LCAmZGV2X2hhbmRsZSwgJnBjaWRldmZuKTsKKwkJZXJyID0gcGF0YV9nZXRfZGV2X2hhbmRsZShnZGV2LCAmZGV2X2hhbmRsZSwgJnBjaWRldmZuKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJCQlhdGFfZGV2X3ByaW50ayhhdGFkZXYsIEtFUk5fREVCVUcsCisJCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLAogCQkJCQkiJXM6IHBhdGFfZ2V0X2Rldl9oYW5kbGUgZmFpbGVkICglZClcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfSBlbHNlIHsKLQkJZXJyID0gc2F0YV9nZXRfZGV2X2hhbmRsZShkZXYsICZkZXZfaGFuZGxlLCAmcGNpZGV2Zm4pOworCQllcnIgPSBzYXRhX2dldF9kZXZfaGFuZGxlKGdkZXYsICZkZXZfaGFuZGxlLCAmcGNpZGV2Zm4pOwogCQlpZiAoZXJyIDwgMCkgewogCQkJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQotCQkJCWF0YV9kZXZfcHJpbnRrKGF0YWRldiwgS0VSTl9ERUJVRywKKwkJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsCiAJCQkJCSIlczogc2F0YV9nZXRfZGV2X2hhbmRsZSBmYWlsZWQgKCVkXG4iLAogCQkJCQlfX0ZVTkNUSU9OX18sIGVycik7CiAJCQlnb3RvIG91dDsKQEAgLTM0NCw3ICszNDIsNyBAQAogCX0KIAogCS8qIEdldCB0aGlzIGRyaXZlJ3MgX0FEUiBpbmZvLiBpZiBub3QgYWxyZWFkeSBrbm93bi4gKi8KLQlpZiAoIWF0YWRldi0+b2JqX2hhbmRsZSkgeworCWlmICghZGV2LT5vYmpfaGFuZGxlKSB7CiAJCWlmICghKGFwLT5jYmwgPT0gQVRBX0NCTF9TQVRBKSkgewogCQkJLyogZ2V0IGNoaWxkIG9iamVjdHMgb2YgZGV2X2hhbmRsZSA9PSBjaGFubmVsIG9iamVjdHMsCiAJIAkJICogKyBfdGhlaXJfIGNoaWxkcmVuID09IGRyaXZlIG9iamVjdHMgKi8KQEAgLTM1Miw3ICszNTAsNyBAQAogCQkJY2hhbl9oYW5kbGUgPSBhY3BpX2dldF9jaGlsZChkZXZfaGFuZGxlLAogCQkJCQkJYXAtPnBvcnRfbm8pOwogCQkJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQotCQkJCWF0YV9kZXZfcHJpbnRrKGF0YWRldiwgS0VSTl9ERUJVRywKKwkJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsCiAJCQkJCSIlczogY2hhbiBhZHI9JWQ6IGNoYW5faGFuZGxlPTB4JXBcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXywgYXAtPnBvcnRfbm8sCiAJCQkJCWNoYW5faGFuZGxlKTsKQEAgLTM2MSwyNiArMzU5LDI2IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQkvKiBUQkQ6IGNvdWxkIGFsc28gY2hlY2sgQUNQSSBvYmplY3QgVkFMSUQgYml0cyAqLwotCQkJZHJpdmVfaGFuZGxlID0gYWNwaV9nZXRfY2hpbGQoY2hhbl9oYW5kbGUsIGl4KTsKKwkJCWRyaXZlX2hhbmRsZSA9IGFjcGlfZ2V0X2NoaWxkKGNoYW5faGFuZGxlLCBkZXYtPmRldm5vKTsKIAkJCWlmICghZHJpdmVfaGFuZGxlKSB7CiAJCQkJZXJyID0gLUVOT0RFVjsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJCWRldl9hZHIgPSBpeDsKLQkJCWF0YWRldi0+b2JqX2hhbmRsZSA9IGRyaXZlX2hhbmRsZTsKKwkJCWRldl9hZHIgPSBkZXYtPmRldm5vOworCQkJZGV2LT5vYmpfaGFuZGxlID0gZHJpdmVfaGFuZGxlOwogCQl9IGVsc2UgewkvKiBmb3IgU0FUQSBtb2RlICovCiAJCQlkZXZfYWRyID0gU0FUQV9BRFJfUlNWRDsKLQkJCWVyciA9IGdldF9zYXRhX2FkcihkZXYsIGRldl9oYW5kbGUsIHBjaWRldmZuLCAwLAotCQkJCQlhcCwgYXRhZGV2LCAmZGV2X2Fkcik7CisJCQllcnIgPSBnZXRfc2F0YV9hZHIoZ2RldiwgZGV2X2hhbmRsZSwgcGNpZGV2Zm4sIDAsCisJCQkJCWFwLCBkZXYsICZkZXZfYWRyKTsKIAkJfQogCQlpZiAoZXJyIDwgMCB8fCBkZXZfYWRyID09IFNBVEFfQURSX1JTVkQgfHwKLQkJICAgICFhdGFkZXYtPm9ial9oYW5kbGUpIHsKKwkJICAgICFkZXYtPm9ial9oYW5kbGUpIHsKIAkJCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJCQlhdGFfZGV2X3ByaW50ayhhdGFkZXYsIEtFUk5fREVCVUcsCisJCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLAogCQkJCQkiJXM6IGdldF9zYXRhL3BhdGFfYWRyIGZhaWxlZDogIgogCQkJCQkiZXJyPSVkLCBkZXZfYWRyPSV1LCBvYmpfaGFuZGxlPTB4JXBcbiIsCiAJCQkJCV9fRlVOQ1RJT05fXywgZXJyLCBkZXZfYWRyLAotCQkJCQlhdGFkZXYtPm9ial9oYW5kbGUpOworCQkJCQlkZXYtPm9ial9oYW5kbGUpOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC0zOTEsMTEgKzM4OSwxMSBAQAogCiAJLyogX0dURiBoYXMgbm8gaW5wdXQgcGFyYW1ldGVycyAqLwogCWVyciA9IC1FSU87Ci0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoYXRhZGV2LT5vYmpfaGFuZGxlLCAiX0dURiIsCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoZGV2LT5vYmpfaGFuZGxlLCAiX0dURiIsCiAJCQkJCU5VTEwsICZvdXRwdXQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlpZiAoYXRhX21zZ19wcm9iZShhcCkpCi0JCQlhdGFfZGV2X3ByaW50ayhhdGFkZXYsIEtFUk5fREVCVUcsCisJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsCiAJCQkJIiVzOiBSdW4gX0dURiBlcnJvcjogc3RhdHVzID0gMHgleFxuIiwKIAkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CiAJCWdvdG8gb3V0OwpAQCAtNDAzLDcgKzQwMSw3IEBACiAKIAlpZiAoIW91dHB1dC5sZW5ndGggfHwgIW91dHB1dC5wb2ludGVyKSB7CiAJCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJCWF0YV9kZXZfcHJpbnRrKGF0YWRldiwgS0VSTl9ERUJVRywgIiVzOiBSdW4gX0dURjogIgorCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLCAiJXM6IFJ1biBfR1RGOiAiCiAJCQkJImxlbmd0aCBvciBwdHIgaXMgTlVMTCAoMHglbGx4LCAweCVwKVxuIiwKIAkJCQlfX0ZVTkNUSU9OX18sCiAJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvdXRwdXQubGVuZ3RoLApAQCAtNDE2LDcgKzQxNCw3IEBACiAJaWYgKG91dF9vYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUikgewogCQlrZnJlZShvdXRwdXQucG9pbnRlcik7CiAJCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJCWF0YV9kZXZfcHJpbnRrKGF0YWRldiwgS0VSTl9ERUJVRywgIiVzOiBSdW4gX0dURjogIgorCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLCAiJXM6IFJ1biBfR1RGOiAiCiAJCQkJImVycm9yOiBleHBlY3RlZCBvYmplY3QgdHlwZSBvZiAiCiAJCQkJIiBBQ1BJX1RZUEVfQlVGRkVSLCBnb3QgMHgleFxuIiwKIAkJCQlfX0ZVTkNUSU9OX18sIG91dF9vYmotPnR5cGUpOwpAQCAtNDI3LDcgKzQyNSw3IEBACiAJaWYgKCFvdXRfb2JqLT5idWZmZXIubGVuZ3RoIHx8ICFvdXRfb2JqLT5idWZmZXIucG9pbnRlciB8fAogCSAgICBvdXRfb2JqLT5idWZmZXIubGVuZ3RoICUgUkVHU19QRVJfR1RGKSB7CiAJCWlmIChhdGFfbXNnX2RydihhcCkpCi0JCQlhdGFfZGV2X3ByaW50ayhhdGFkZXYsIEtFUk5fRVJSLAorCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwKIAkJCQkiJXM6IHVuZXhwZWN0ZWQgR1RGIGxlbmd0aCAoJWQpIG9yIGFkZHIgKDB4JXApXG4iLAogCQkJCV9fRlVOQ1RJT05fXywgb3V0X29iai0+YnVmZmVyLmxlbmd0aCwKIAkJCQlvdXRfb2JqLT5idWZmZXIucG9pbnRlcik7CkBAIC00MzksNyArNDM3LDcgQEAKIAkqZ3RmX2FkZHJlc3MgPSAodW5zaWduZWQgbG9uZylvdXRfb2JqLT5idWZmZXIucG9pbnRlcjsKIAkqb2JqX2xvYyA9ICh1bnNpZ25lZCBsb25nKW91dF9vYmo7CiAJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQotCQlhdGFfZGV2X3ByaW50ayhhdGFkZXYsIEtFUk5fREVCVUcsICIlczogcmV0dXJuaW5nICIKKwkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLCAiJXM6IHJldHVybmluZyAiCiAJCQkiZ3RmX2xlbmd0aD0lZCwgZ3RmX2FkZHJlc3M9MHglbHgsIG9ial9sb2M9MHglbHhcbiIsCiAJCQlfX0ZVTkNUSU9OX18sICpndGZfbGVuZ3RoLCAqZ3RmX2FkZHJlc3MsICpvYmpfbG9jKTsKIAllcnIgPSAwOwpAQCAtNDQ5LDcgKzQ0Nyw3IEBACiAKIC8qKgogICogdGFza2ZpbGVfbG9hZF9yYXcgLSBzZW5kIHRhc2tmaWxlIHJlZ2lzdGVycyB0byBob3N0IGNvbnRyb2xsZXIKLSAqIEBhcDogUG9ydCB0byB3aGljaCBvdXRwdXQgaXMgc2VudAorICogQGRldjogdGFyZ2V0IEFUQSBkZXZpY2UKICAqIEBndGY6IHJhdyBBVEEgdGFza2ZpbGUgcmVnaXN0ZXIgc2V0ICgweDFmMSAtIDB4MWY3KQogICoKICAqIE91dHB1dHMgQVRBIHRhc2tmaWxlIHRvIHN0YW5kYXJkIEFUQSBob3N0IGNvbnRyb2xsZXIgdXNpbmcgTU1JTwpAQCAtNDY2LDE1ICs0NjQsMTUgQEAKICAqIExPQ0tJTkc6IFRCRDoKICAqIEluaGVyaXRlZCBmcm9tIGNhbGxlci4KICAqLwotc3RhdGljIHZvaWQgdGFza2ZpbGVfbG9hZF9yYXcoc3RydWN0IGF0YV9wb3J0ICphcCwKLQkJCQlzdHJ1Y3QgYXRhX2RldmljZSAqYXRhZGV2LAotCQkJCWNvbnN0IHN0cnVjdCB0YXNrZmlsZV9hcnJheSAqZ3RmKQorc3RhdGljIHZvaWQgdGFza2ZpbGVfbG9hZF9yYXcoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCB0YXNrZmlsZV9hcnJheSAqZ3RmKQogeworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOwogCXN0cnVjdCBhdGFfdGFza2ZpbGUgdGY7CiAJdW5zaWduZWQgaW50IGVycjsKIAogCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJYXRhX2Rldl9wcmludGsoYXRhZGV2LCBLRVJOX0RFQlVHLCAiJXM6ICgweDFmMS0xZjcpOiBoZXg6ICIKKwkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLCAiJXM6ICgweDFmMS0xZjcpOiBoZXg6ICIKIAkJCSIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAogCQkJX19GVU5DVElPTl9fLAogCQkJZ3RmLT50ZmFbMF0sIGd0Zi0+dGZhWzFdLCBndGYtPnRmYVsyXSwKQEAgLTQ4NSw3ICs0ODMsNyBAQAogCSAgICAmJiAoZ3RmLT50ZmFbNl0gPT0gMCkpCiAJCXJldHVybjsKIAotCWF0YV90Zl9pbml0KGF0YWRldiwgJnRmKTsKKwlhdGFfdGZfaW5pdChkZXYsICZ0Zik7CiAKIAkvKiBjb252ZXJ0IGd0ZiB0byB0ZiAqLwogCXRmLmZsYWdzIHw9IEFUQV9URkxBR19JU0FERFIgfCBBVEFfVEZMQUdfREVWSUNFOyAvKiBUQkQgKi8KQEAgLTQ5OCwxNyArNDk2LDE2IEBACiAJdGYuZGV2aWNlICA9IGd0Zi0+dGZhWzVdOwkvKiAweDFmNiAqLwogCXRmLmNvbW1hbmQgPSBndGYtPnRmYVs2XTsJLyogMHgxZjcgKi8KIAotCWVyciA9IGF0YV9leGVjX2ludGVybmFsKGF0YWRldiwgJnRmLCBOVUxMLCBETUFfTk9ORSwgTlVMTCwgMCk7CisJZXJyID0gYXRhX2V4ZWNfaW50ZXJuYWwoZGV2LCAmdGYsIE5VTEwsIERNQV9OT05FLCBOVUxMLCAwKTsKIAlpZiAoZXJyICYmIGF0YV9tc2dfcHJvYmUoYXApKQotCQlhdGFfZGV2X3ByaW50ayhhdGFkZXYsIEtFUk5fRVJSLAorCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fRVJSLAogCQkJIiVzOiBhdGFfZXhlY19pbnRlcm5hbCBmYWlsZWQ6ICV1XG4iLAogCQkJX19GVU5DVElPTl9fLCBlcnIpOwogfQogCiAvKioKICAqIGRvX2RyaXZlX3NldF90YXNrZmlsZXMgLSB3cml0ZSB0aGUgZHJpdmUgdGFza2ZpbGUgc2V0dGluZ3MgZnJvbSBfR1RGCi0gKiBAYXA6IHRoZSBhdGFfcG9ydCBmb3IgdGhlIGRyaXZlCi0gKiBAYXRhZGV2OiB0YXJnZXQgYXRhX2RldmljZQorICogQGRldjogdGFyZ2V0IEFUQSBkZXZpY2UKICAqIEBndGZfbGVuZ3RoOiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgb2YgX0dURiB0YXNrZmlsZXMKICAqIEBndGZfYWRkcmVzczogbG9jYXRpb24gb2YgX0dURiB0YXNrZmlsZSBhcnJheXMKICAqCkBAIC01MTcsMzAgKzUxNCwzMSBAQAogICogV3JpdGUge2d0Zl9hZGRyZXNzLCBsZW5ndGggZ3RmX2xlbmd0aH0gaW4gZ3JvdXBzIG9mCiAgKiBSRUdTX1BFUl9HVEYgYnl0ZXMuCiAgKi8KLXN0YXRpYyBpbnQgZG9fZHJpdmVfc2V0X3Rhc2tmaWxlcyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQlzdHJ1Y3QgYXRhX2RldmljZSAqYXRhZGV2LCB1bnNpZ25lZCBpbnQgZ3RmX2xlbmd0aCwKLQkJdW5zaWduZWQgbG9uZyBndGZfYWRkcmVzcykKK3N0YXRpYyBpbnQgZG9fZHJpdmVfc2V0X3Rhc2tmaWxlcyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCSAgdW5zaWduZWQgaW50IGd0Zl9sZW5ndGgsCisJCQkJICB1bnNpZ25lZCBsb25nIGd0Zl9hZGRyZXNzKQogewotCWludAkJCWVyciA9IC1FTk9ERVY7Ci0JaW50CQkJZ3RmX2NvdW50ID0gZ3RmX2xlbmd0aCAvIFJFR1NfUEVSX0dURjsKLQlpbnQJCQlpeDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGV2LT5hcDsKKwlpbnQgZXJyID0gLUVOT0RFVjsKKwlpbnQgZ3RmX2NvdW50ID0gZ3RmX2xlbmd0aCAvIFJFR1NfUEVSX0dURjsKKwlpbnQgaXg7CiAJc3RydWN0IHRhc2tmaWxlX2FycmF5CSpndGY7CiAKIAlpZiAoYXRhX21zZ19wcm9iZShhcCkpCi0JCWF0YV9kZXZfcHJpbnRrKGF0YWRldiwgS0VSTl9ERUJVRywgIiVzOiBFTlRFUjogcG9ydCM6ICVkXG4iLAorCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsICIlczogRU5URVI6IHBvcnQjOiAlZFxuIiwKIAkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGFwLT5wb3J0X25vKTsKIAogCWlmIChsaWJhdGFfbm9hY3BpIHx8ICEoYXAtPmNibCA9PSBBVEFfQ0JMX1NBVEEpKQogCQlyZXR1cm4gMDsKIAotCWlmICghYXRhX2Rldl9lbmFibGVkKGF0YWRldikgfHwgKGFwLT5mbGFncyAmIEFUQV9GTEFHX0RJU0FCTEVEKSkKKwlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpIHx8IChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkpCiAJCWdvdG8gb3V0OwogCWlmICghZ3RmX2NvdW50KQkJLyogc2hvdWxkbid0IGJlIGhlcmUgKi8KIAkJZ290byBvdXQ7CiAKIAlpZiAoZ3RmX2xlbmd0aCAlIFJFR1NfUEVSX0dURikgewogCQlpZiAoYXRhX21zZ19kcnYoYXApKQotCQkJYXRhX2Rldl9wcmludGsoYXRhZGV2LCBLRVJOX0VSUiwKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9FUlIsCiAJCQkJIiVzOiB1bmV4cGVjdGVkIEdURiBsZW5ndGggKCVkKVxuIiwKIAkJCQlfX0ZVTkNUSU9OX18sIGd0Zl9sZW5ndGgpOwogCQlnb3RvIG91dDsKQEAgLTU1MSw3ICs1NDksNyBAQAogCQkJKGd0Zl9hZGRyZXNzICsgaXggKiBSRUdTX1BFUl9HVEYpOwogCiAJCS8qIHNlbmQgYWxsIFRhc2tGaWxlIHJlZ2lzdGVycyAoMHgxZjEtMHgxZjcpICppbip0aGF0Km9yZGVyKiAqLwotCQl0YXNrZmlsZV9sb2FkX3JhdyhhcCwgYXRhZGV2LCBndGYpOworCQl0YXNrZmlsZV9sb2FkX3JhdyhkZXYsIGd0Zik7CiAJfQogCiAJZXJyID0gMDsKQEAgLTU2NywxMSArNTY1LDExIEBACiAgKi8KIGludCBhdGFfYWNwaV9leGVjX3RmcyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCWludAkJaXg7Ci0JaW50CQlyZXQgPTA7Ci0JdW5zaWduZWQgaW50CWd0Zl9sZW5ndGg7Ci0JdW5zaWduZWQgbG9uZwlndGZfYWRkcmVzczsKLQl1bnNpZ25lZCBsb25nCW9ial9sb2M7CisJaW50IGl4OworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBndGZfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcgZ3RmX2FkZHJlc3M7CisJdW5zaWduZWQgbG9uZyBvYmpfbG9jOwogCiAJaWYgKGxpYmF0YV9ub2FjcGkpCiAJCXJldHVybiAwOwpAQCAtNTg0LDExICs1ODIsMTMgQEAKIAkJcmV0dXJuIDA7CiAKIAlmb3IgKGl4ID0gMDsgaXggPCBBVEFfTUFYX0RFVklDRVM7IGl4KyspIHsKLQkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoJmFwLT5kZXZpY2VbaXhdKSkKKwkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2l4XTsKKworCQlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpKQogCQkJY29udGludWU7CiAKLQkJcmV0ID0gZG9fZHJpdmVfZ2V0X0dURihhcCwgaXgsCi0JCQkJJmd0Zl9sZW5ndGgsICZndGZfYWRkcmVzcywgJm9ial9sb2MpOworCQlyZXQgPSBkb19kcml2ZV9nZXRfR1RGKGRldiwgJmd0Zl9sZW5ndGgsICZndGZfYWRkcmVzcywKKwkJCQkgICAgICAgJm9ial9sb2MpOwogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQogCQkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9ERUJVRywKQEAgLTU5Nyw4ICs1OTcsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlyZXQgPSBkb19kcml2ZV9zZXRfdGFza2ZpbGVzKGFwLCAmYXAtPmRldmljZVtpeF0sCi0JCQkJZ3RmX2xlbmd0aCwgZ3RmX2FkZHJlc3MpOworCQlyZXQgPSBkb19kcml2ZV9zZXRfdGFza2ZpbGVzKGRldiwgZ3RmX2xlbmd0aCwgZ3RmX2FkZHJlc3MpOwogCQlrZnJlZSgodm9pZCAqKW9ial9sb2MpOwogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQpAQCAtNjE0LDggKzYxMyw3IEBACiAKIC8qKgogICogYXRhX2FjcGlfcHVzaF9pZCAtIHNlbmQgSWRlbnRpZnkgZGF0YSB0byBkcml2ZQotICogQGFwOiB0aGUgYXRhX3BvcnQgZm9yIHRoZSBkcml2ZQotICogQGl4OiBkcml2ZSBpbmRleAorICogQGRldjogdGFyZ2V0IEFUQSBkZXZpY2UKICAqCiAgKiBfU0REIEFDUEkgb2JqZWN0OiBmb3IgU0FUQSBtb2RlIG9ubHkKICAqIE11c3QgYmUgYWZ0ZXIgSWRlbnRpZnkgKFBhY2tldCkgRGV2aWNlIC0tIHVzZXMgaXRzIGRhdGEKQEAgLTYyMyw1NyArNjIxLDU3IEBACiAgKiBtZXRob2QgYW5kIGlmIGl0IGZhaWxzIGZvciB3aGF0ZXZlciByZWFzb24sIHdlIHNob3VsZCBzdGlsbAogICoganVzdCBrZWVwIGdvaW5nLgogICovCi1pbnQgYXRhX2FjcGlfcHVzaF9pZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgaXgpCitpbnQgYXRhX2FjcGlfcHVzaF9pZChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogewotCWFjcGlfaGFuZGxlICAgICAgICAgICAgICAgICAgICAgaGFuZGxlOwotCWFjcGlfaW50ZWdlciAgICAgICAgICAgICAgICAgICAgcGNpZGV2Zm47Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI7Ci0Jc3RydWN0IGRldmljZSAgICAgICAgICAgICAgICAgICAqZGV2ID0gYXAtPmhvc3QtPmRldjsKLQlzdHJ1Y3QgYXRhX2RldmljZSAgICAgICAgICAgICAgICphdGFkZXYgPSAmYXAtPmRldmljZVtpeF07Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfYWRyOwotCWFjcGlfc3RhdHVzICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOwotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0ICAgICAgICAgaW5wdXQ7Ci0JdW5pb24gYWNwaV9vYmplY3QgICAgICAgICAgICAgICBpbl9wYXJhbXNbMV07CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+YXA7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWFjcGlfaW50ZWdlciBwY2lkZXZmbjsKKwlpbnQgZXJyOworCXN0cnVjdCBkZXZpY2UgKmdkZXYgPSBhcC0+aG9zdC0+ZGV2OworCXUzMiBkZXZfYWRyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBpbnB1dDsKKwl1bmlvbiBhY3BpX29iamVjdCBpbl9wYXJhbXNbMV07CiAKIAlpZiAobGliYXRhX25vYWNwaSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoYXRhX21zZ19wcm9iZShhcCkpCi0JCWF0YV9kZXZfcHJpbnRrKGF0YWRldiwgS0VSTl9ERUJVRywgIiVzOiBpeCA9ICVkLCBwb3J0IzogJWRcbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fLCBpeCwgYXAtPnBvcnRfbm8pOworCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsICIlczogaXggPSAlZCwgcG9ydCM6ICVkXG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGV2LT5kZXZubywgYXAtPnBvcnRfbm8pOwogCiAJLyogRG9uJ3QgY29udGludWUgaWYgbm90IGEgU0FUQSBkZXZpY2UuICovCiAJaWYgKCEoYXAtPmNibCA9PSBBVEFfQ0JMX1NBVEEpKSB7CiAJCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJCWF0YV9kZXZfcHJpbnRrKGF0YWRldiwgS0VSTl9ERUJVRywKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywKIAkJCQkiJXM6IE5vdCBhIFNBVEEgZGV2aWNlXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBEb24ndCBjb250aW51ZSBpZiBkZXZpY2UgaGFzIG5vIF9BRFIgbWV0aG9kLgogCSAqIF9TREQgaXMgaW50ZW5kZWQgZm9yIGtub3duIG1vdGhlcmJvYXJkIGRldmljZXMuICovCi0JZXJyID0gc2F0YV9nZXRfZGV2X2hhbmRsZShkZXYsICZoYW5kbGUsICZwY2lkZXZmbik7CisJZXJyID0gc2F0YV9nZXRfZGV2X2hhbmRsZShnZGV2LCAmaGFuZGxlLCAmcGNpZGV2Zm4pOwogCWlmIChlcnIgPCAwKSB7CiAJCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJCWF0YV9kZXZfcHJpbnRrKGF0YWRldiwgS0VSTl9ERUJVRywKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywKIAkJCQkiJXM6IHNhdGFfZ2V0X2Rldl9oYW5kbGUgZmFpbGVkICglZFxuIiwKIAkJCQlfX0ZVTkNUSU9OX18sIGVycik7CiAJCWdvdG8gb3V0OwogCX0KIAogCS8qIEdldCB0aGlzIGRyaXZlJ3MgX0FEUiBpbmZvLCBpZiBub3QgYWxyZWFkeSBrbm93biAqLwotCWlmICghYXRhZGV2LT5vYmpfaGFuZGxlKSB7CisJaWYgKCFkZXYtPm9ial9oYW5kbGUpIHsKIAkJZGV2X2FkciA9IFNBVEFfQURSX1JTVkQ7Ci0JCWVyciA9IGdldF9zYXRhX2FkcihkZXYsIGhhbmRsZSwgcGNpZGV2Zm4sIGl4LCBhcCwgYXRhZGV2LAorCQllcnIgPSBnZXRfc2F0YV9hZHIoZ2RldiwgaGFuZGxlLCBwY2lkZXZmbiwgZGV2LT5kZXZubywgYXAsIGRldiwKIAkJCQkJJmRldl9hZHIpOwogCQlpZiAoZXJyIDwgMCB8fCBkZXZfYWRyID09IFNBVEFfQURSX1JTVkQgfHwKLQkJCSFhdGFkZXYtPm9ial9oYW5kbGUpIHsKKwkJCSFkZXYtPm9ial9oYW5kbGUpIHsKIAkJCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJCQlhdGFfZGV2X3ByaW50ayhhdGFkZXYsIEtFUk5fREVCVUcsCisJCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLAogCQkJCQkiJXM6IGdldF9zYXRhX2FkciBmYWlsZWQ6ICIKIAkJCQkJImVycj0lZCwgZGV2X2Fkcj0ldSwgb2JqX2hhbmRsZT0weCVwXG4iLAogCQkJCQlfX0ZVTkNUSU9OX18sIGVyciwgZGV2X2FkciwKLQkJCQkJYXRhZGV2LT5vYmpfaGFuZGxlKTsKKwkJCQkJZGV2LT5vYmpfaGFuZGxlKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtNjgzLDE5ICs2ODEsMTkgQEAKIAlpbnB1dC5jb3VudCA9IDE7CiAJaW5wdXQucG9pbnRlciA9IGluX3BhcmFtczsKIAlpbl9wYXJhbXNbMF0udHlwZSA9IEFDUElfVFlQRV9CVUZGRVI7Ci0JaW5fcGFyYW1zWzBdLmJ1ZmZlci5sZW5ndGggPSBzaXplb2YoYXRhZGV2LT5pZFswXSkgKiBBVEFfSURfV09SRFM7Ci0JaW5fcGFyYW1zWzBdLmJ1ZmZlci5wb2ludGVyID0gKHU4ICopYXRhZGV2LT5pZDsKKwlpbl9wYXJhbXNbMF0uYnVmZmVyLmxlbmd0aCA9IHNpemVvZihkZXYtPmlkWzBdKSAqIEFUQV9JRF9XT1JEUzsKKwlpbl9wYXJhbXNbMF0uYnVmZmVyLnBvaW50ZXIgPSAodTggKilkZXYtPmlkOwogCS8qIE91dHB1dCBidWZmZXI6IF9TREQgaGFzIG5vIG91dHB1dCAqLwogCiAJLyogSXQncyBPSyBmb3IgX1NERCB0byBiZSBtaXNzaW5nIHRvby4gKi8KLQlzd2FwX2J1Zl9sZTE2KGF0YWRldi0+aWQsIEFUQV9JRF9XT1JEUyk7Ci0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoYXRhZGV2LT5vYmpfaGFuZGxlLCAiX1NERCIsICZpbnB1dCwgTlVMTCk7Ci0Jc3dhcF9idWZfbGUxNihhdGFkZXYtPmlkLCBBVEFfSURfV09SRFMpOworCXN3YXBfYnVmX2xlMTYoZGV2LT5pZCwgQVRBX0lEX1dPUkRTKTsKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChkZXYtPm9ial9oYW5kbGUsICJfU0REIiwgJmlucHV0LCBOVUxMKTsKKwlzd2FwX2J1Zl9sZTE2KGRldi0+aWQsIEFUQV9JRF9XT1JEUyk7CiAKIAllcnIgPSBBQ1BJX0ZBSUxVUkUoc3RhdHVzKSA/IC1FSU8gOiAwOwogCWlmIChlcnIgPCAwKSB7CiAJCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKLQkJCWF0YV9kZXZfcHJpbnRrKGF0YWRldiwgS0VSTl9ERUJVRywKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywKIAkJCQkgICAgICAgIiVzIF9TREQgZXJyb3I6IHN0YXR1cyA9IDB4JXhcbiIsCiAJCQkJICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwppbmRleCA0NTk1ZDFmLi40MTY2NDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKQEAgLTEwMSw2ICsxMDEsMTIgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChub2FjcGksIGxpYmF0YV9ub2FjcGksIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vYWNwaSwgIkRpc2FibGVzIHRoZSB1c2Ugb2YgQUNQSSBpbiBzdXNwZW5kL3Jlc3VtZSB3aGVuIHNldCIpOwogCitpbnQgYXRhX3NwaW5kb3duX2NvbXBhdCA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoc3BpbmRvd25fY29tcGF0LCBhdGFfc3BpbmRvd25fY29tcGF0LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhzcGluZG93bl9jb21wYXQsICJFbmFibGUgYmFja3dhcmQgY29tcGF0aWJsZSBzcGluZG93biAiCisJCSAiYmVoYXZpb3IuICBXaWxsIGJlIHJlbW92ZWQuICBNb3JlIGluZm8gY2FuIGJlIGZvdW5kIGluICIKKwkJICJEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHRcbiIpOworCiBNT0RVTEVfQVVUSE9SKCJKZWZmIEdhcnppayIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJMaWJyYXJ5IG1vZHVsZSBmb3IgQVRBIGRldmljZXMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTE2NTQsNyArMTY2MCw3IEBACiAJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKIAl1bnNpZ25lZCBpbnQgZXJyX21hc2sgPSAwOwogCWNvbnN0IGNoYXIgKnJlYXNvbjsKLQlpbnQgdHJpZWRfc3BpbnVwID0gMDsKKwlpbnQgbWF5X2ZhbGxiYWNrID0gMSwgdHJpZWRfc3BpbnVwID0gMDsKIAlpbnQgcmM7CiAKIAlpZiAoYXRhX21zZ19jdGwoYXApKQpAQCAtMTY5OCwxMSArMTcwNCwzMSBAQAogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KIAorCQkvKiBEZXZpY2Ugb3IgY29udHJvbGxlciBtaWdodCBoYXZlIHJlcG9ydGVkIHRoZSB3cm9uZworCQkgKiBkZXZpY2UgY2xhc3MuICBHaXZlIGEgc2hvdCBhdCB0aGUgb3RoZXIgSURFTlRJRlkgaWYKKwkJICogdGhlIGN1cnJlbnQgb25lIGlzIGFib3J0ZWQgYnkgdGhlIGRldmljZS4KKwkJICovCisJCWlmIChtYXlfZmFsbGJhY2sgJiYKKwkJICAgIChlcnJfbWFzayA9PSBBQ19FUlJfREVWKSAmJiAodGYuZmVhdHVyZSAmIEFUQV9BQk9SVEVEKSkgeworCQkJbWF5X2ZhbGxiYWNrID0gMDsKKworCQkJaWYgKGNsYXNzID09IEFUQV9ERVZfQVRBKQorCQkJCWNsYXNzID0gQVRBX0RFVl9BVEFQSTsKKwkJCWVsc2UKKwkJCQljbGFzcyA9IEFUQV9ERVZfQVRBOworCQkJZ290byByZXRyeTsKKwkJfQorCiAJCXJjID0gLUVJTzsKIAkJcmVhc29uID0gIkkvTyBlcnJvciI7CiAJCWdvdG8gZXJyX291dDsKIAl9CiAKKwkvKiBGYWxsaW5nIGJhY2sgZG9lc24ndCBtYWtlIHNlbnNlIGlmIElEIGRhdGEgd2FzIHJlYWQKKwkgKiBzdWNjZXNzZnVsbHkgYXQgbGVhc3Qgb25jZS4KKwkgKi8KKwltYXlfZmFsbGJhY2sgPSAwOworCiAJc3dhcF9idWZfbGUxNihpZCwgQVRBX0lEX1dPUkRTKTsKIAogCS8qIHNhbml0eSBjaGVjayAqLwpAQCAtMTg0Myw3ICsxODY5LDcgQEAKIAkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0RFQlVHLCAiJXM6IEVOVEVSXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJLyogc2V0IF9TREQgKi8KLQlyYyA9IGF0YV9hY3BpX3B1c2hfaWQoYXAsIGRldi0+ZGV2bm8pOworCXJjID0gYXRhX2FjcGlfcHVzaF9pZChkZXYpOwogCWlmIChyYykgewogCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywgImZhaWxlZCB0byBzZXQgX1NERCglZClcbiIsCiAJCQlyYyk7CkBAIC0yODYwLDcgKzI4ODYsNyBAQAogCQlkZXYgPSAmYXAtPmRldmljZVtpXTsKIAogCQkvKiBkb24ndCB1cGRhdGUgc3VzcGVuZGVkIGRldmljZXMnIHhmZXIgbW9kZSAqLwotCQlpZiAoIWF0YV9kZXZfcmVhZHkoZGV2KSkKKwkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKIAkJCWNvbnRpbnVlOwogCiAJCXJjID0gYXRhX2Rldl9zZXRfbW9kZShkZXYpOwpAQCAtNTg0NSwzNyArNTg3MSwxMSBAQAogICovCiBpbnQgYXRhX2hvc3Rfc3VzcGVuZChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsIHBtX21lc3NhZ2VfdCBtZXNnKQogewotCWludCBpLCBqLCByYzsKKwlpbnQgcmM7CiAKIAlyYyA9IGF0YV9ob3N0X3JlcXVlc3RfcG0oaG9zdCwgbWVzZywgMCwgQVRBX0VISV9RVUlFVCwgMSk7Ci0JaWYgKHJjKQotCQlnb3RvIGZhaWw7Ci0KLQkvKiBFSCBpcyBxdWllc2NlbnQgbm93LiAgRmFpbCBpZiB3ZSBoYXZlIGFueSByZWFkeSBkZXZpY2UuCi0JICogVGhpcyBoYXBwZW5zIGlmIGhvdHBsdWcgb2NjdXJzIGJldHdlZW4gY29tcGxldGlvbiBvZiBkZXZpY2UKLQkgKiBzdXNwZW5zaW9uIGFuZCBoZXJlLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKLQkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3QtPnBvcnRzW2ldOwotCi0JCWZvciAoaiA9IDA7IGogPCBBVEFfTUFYX0RFVklDRVM7IGorKykgewotCQkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2pdOwotCi0JCQlpZiAoYXRhX2Rldl9yZWFkeShkZXYpKSB7Ci0JCQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX1dBUk5JTkcsCi0JCQkJCQkic3VzcGVuZCBmYWlsZWQsIGRldmljZSAlZCAiCi0JCQkJCQkic3RpbGwgYWN0aXZlXG4iLCBkZXYtPmRldm5vKTsKLQkJCQlyYyA9IC1FQlVTWTsKLQkJCQlnb3RvIGZhaWw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlob3N0LT5kZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzZzsKLQlyZXR1cm4gMDsKLQotIGZhaWw6Ci0JYXRhX2hvc3RfcmVzdW1lKGhvc3QpOworCWlmIChyYyA9PSAwKQorCQlob3N0LT5kZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzZzsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTU5ODQsNiArNTk4NCw3IEBACiAJaWYgKCFhcCkKIAkJcmV0dXJuIE5VTEw7CiAKKwlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19JTklUSUFMSVpJTkc7CiAJYXAtPmxvY2sgPSAmaG9zdC0+bG9jazsKIAlhcC0+ZmxhZ3MgPSBBVEFfRkxBR19ESVNBQkxFRDsKIAlhcC0+cHJpbnRfaWQgPSAtMTsKQEAgLTYzNTIsNiArNjM1Myw3IEBACiAJCQllaGktPmFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOwogCQkJZWhpLT5mbGFncyB8PSBBVEFfRUhJX05PX0FVVE9QU1kgfCBBVEFfRUhJX1FVSUVUOwogCisJCQlhcC0+cGZsYWdzICY9IH5BVEFfUEZMQUdfSU5JVElBTElaSU5HOwogCQkJYXAtPnBmbGFncyB8PSBBVEFfUEZMQUdfTE9BRElORzsKIAkJCWF0YV9wb3J0X3NjaGVkdWxlX2VoKGFwKTsKIApAQCAtNjg3Niw2ICs2ODc4LDcgQEAKICNpZmRlZiBDT05GSUdfUENJCiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfdGVzdF9jb25maWdfYml0cyk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX2luaXRfbmF0aXZlX2hvc3QpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BjaV9pbml0X2JtZG1hKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfcHJlcGFyZV9uYXRpdmVfaG9zdCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfcGNpX2luaXRfb25lKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfcmVtb3ZlX29uZSk7CkBAIC02ODg5LDExICs2ODkyLDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wY2lfY2xlYXJfc2ltcGxleCk7CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCi0jaWZkZWYgQ09ORklHX1BNCi1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaV9kZXZpY2VfcmVzdW1lKTsKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLQogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2VuZ190aW1lb3V0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wb3J0X3NjaGVkdWxlX2VoKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wb3J0X2Fib3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKaW5kZXggODI1NjY1NS4uNTMwOWMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWVoLmMKQEAgLTc3LDI5ICs3NywxMiBAQAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIHZvaWQgYXRhX2VoX2hhbmRsZV9wb3J0X3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBhdGFfZWhfaGFuZGxlX3BvcnRfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXApOwotc3RhdGljIGludCBhdGFfZWhfc3VzcGVuZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJICBzdHJ1Y3QgYXRhX2RldmljZSAqKnJfZmFpbGVkX2Rldik7Ci1zdGF0aWMgdm9pZCBhdGFfZWhfcHJlcF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCk7Ci1zdGF0aWMgaW50IGF0YV9laF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKipyX2ZhaWxlZF9kZXYpOwogI2Vsc2UgLyogQ09ORklHX1BNICovCiBzdGF0aWMgdm9pZCBhdGFfZWhfaGFuZGxlX3BvcnRfc3VzcGVuZChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogeyB9CiAKIHN0YXRpYyB2b2lkIGF0YV9laF9oYW5kbGVfcG9ydF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsgfQotCi1zdGF0aWMgaW50IGF0YV9laF9zdXNwZW5kKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICoqcl9mYWlsZWRfZGV2KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdGFfZWhfcHJlcF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsgfQotCi1zdGF0aWMgaW50IGF0YV9laF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKipyX2ZhaWxlZF9kZXYpCi17Ci0JcmV0dXJuIDA7Ci19CiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0YXRpYyB2b2lkIGF0YV9lcmluZ19yZWNvcmQoc3RydWN0IGF0YV9lcmluZyAqZXJpbmcsIGludCBpc19pbywKQEAgLTU2OCw2ICs1NTEsOSBAQAogewogCVdBUk5fT04oIWFwLT5vcHMtPmVycm9yX2hhbmRsZXIpOwogCisJaWYgKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfSU5JVElBTElaSU5HKQorCQlyZXR1cm47CisKIAlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19FSF9QRU5ESU5HOwogCXNjc2lfc2NoZWR1bGVfZWgoYXAtPnNjc2lfaG9zdCk7CiAKQEAgLTE3OTEsNyArMTc3Nyw3IEBACiAJCWlmIChlaGMtPmkuZmxhZ3MgJiBBVEFfRUhJX0RJRF9SRVNFVCkKIAkJCXJlYWRpZF9mbGFncyB8PSBBVEFfUkVBRElEX1BPU1RSRVNFVDsKIAotCQlpZiAoYWN0aW9uICYgQVRBX0VIX1JFVkFMSURBVEUgJiYgYXRhX2Rldl9yZWFkeShkZXYpKSB7CisJCWlmICgoYWN0aW9uICYgQVRBX0VIX1JFVkFMSURBVEUpICYmIGF0YV9kZXZfZW5hYmxlZChkZXYpKSB7CiAJCQlpZiAoYXRhX3BvcnRfb2ZmbGluZShhcCkpIHsKIAkJCQlyYyA9IC1FSU87CiAJCQkJZ290byBlcnI7CkBAIC0xODcyLDE2NiArMTg1OCw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCi0vKioKLSAqCWF0YV9laF9zdXNwZW5kIC0gaGFuZGxlIHN1c3BlbmQgRUggYWN0aW9uCi0gKglAYXA6IHRhcmdldCBob3N0IHBvcnQKLSAqCUByX2ZhaWxlZF9kZXY6IHJlc3VsdCBwYXJhbWV0ZXIgdG8gaW5kaWNhdGUgZmFpbGluZyBkZXZpY2UKLSAqCi0gKglIYW5kbGUgc3VzcGVuZCBFSCBhY3Rpb24uICBEaXNrIGRldmljZXMgYXJlIHNwaW5uZWQgZG93biBhbmQKLSAqCW90aGVyIHR5cGVzIG9mIGRldmljZXMgYXJlIGp1c3QgbWFya2VkIHN1c3BlbmRlZC4gIE9uY2UKLSAqCXN1c3BlbmRlZCwgbm8gRUggYWN0aW9uIHRvIHRoZSBkZXZpY2UgaXMgYWxsb3dlZCB1bnRpbCBpdCBpcwotICoJcmVzdW1lZC4KLSAqCi0gKglMT0NLSU5HOgotICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgotICoKLSAqCVJFVFVSTlM6Ci0gKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UKLSAqLwotc3RhdGljIGludCBhdGFfZWhfc3VzcGVuZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqKnJfZmFpbGVkX2RldikKLXsKLQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwotCWludCBpLCByYyA9IDA7Ci0KLQlEUFJJTlRLKCJFTlRFUlxuIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJdW5zaWduZWQgaW50IGFjdGlvbiwgZXJyX21hc2s7Ci0KLQkJZGV2ID0gJmFwLT5kZXZpY2VbaV07Ci0JCWFjdGlvbiA9IGF0YV9laF9kZXZfYWN0aW9uKGRldik7Ci0KLQkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSB8fCAhKGFjdGlvbiAmIEFUQV9FSF9TVVNQRU5EKSkKLQkJCWNvbnRpbnVlOwotCi0JCVdBUk5fT04oZGV2LT5mbGFncyAmIEFUQV9ERkxBR19TVVNQRU5ERUQpOwotCi0JCWF0YV9laF9hYm91dF90b19kbyhhcCwgZGV2LCBBVEFfRUhfU1VTUEVORCk7Ci0KLQkJaWYgKGRldi0+Y2xhc3MgPT0gQVRBX0RFVl9BVEEgJiYgIShhY3Rpb24gJiBBVEFfRUhfUE1fRlJFRVpFKSkgewotCQkJLyogZmx1c2ggY2FjaGUgKi8KLQkJCXJjID0gYXRhX2ZsdXNoX2NhY2hlKGRldik7Ci0JCQlpZiAocmMpCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIHNwaW4gZG93biAqLwotCQkJZXJyX21hc2sgPSBhdGFfZG9fc2ltcGxlX2NtZChkZXYsIEFUQV9DTURfU1RBTkRCWU5PVzEpOwotCQkJaWYgKGVycl9tYXNrKSB7Ci0JCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwgImZhaWxlZCB0byAiCi0JCQkJCSAgICAgICAic3BpbiBkb3duIChlcnJfbWFzaz0weCV4KVxuIiwKLQkJCQkJICAgICAgIGVycl9tYXNrKTsKLQkJCQlyYyA9IC1FSU87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOwotCQlkZXYtPmZsYWdzIHw9IEFUQV9ERkxBR19TVVNQRU5ERUQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKLQotCQlhdGFfZWhfZG9uZShhcCwgZGV2LCBBVEFfRUhfU1VTUEVORCk7Ci0JfQotCi0JaWYgKHJjKQotCQkqcl9mYWlsZWRfZGV2ID0gZGV2OwotCi0JRFBSSU5USygiRVhJVFxuIik7Ci0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqCWF0YV9laF9wcmVwX3Jlc3VtZSAtIHByZXAgZm9yIHJlc3VtZSBFSCBhY3Rpb24KLSAqCUBhcDogdGFyZ2V0IGhvc3QgcG9ydAotICoKLSAqCUNsZWFyIFNVU1BFTkRFRCBpbiBwcmVwYXJhdGlvbiBmb3Igc2NoZWR1bGVkIHJlc3VtZSBhY3Rpb25zLgotICoJVGhpcyBhbGxvd3Mgb3RoZXIgcGFydHMgb2YgRUggdG8gYWNjZXNzIHRoZSBkZXZpY2VzIGJlaW5nCi0gKglyZXN1bWVkLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkuCi0gKi8KLXN0YXRpYyB2b2lkIGF0YV9laF9wcmVwX3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaTsKLQotCURQUklOVEsoIkVOVEVSXG4iKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgewotCQl1bnNpZ25lZCBpbnQgYWN0aW9uOwotCi0JCWRldiA9ICZhcC0+ZGV2aWNlW2ldOwotCQlhY3Rpb24gPSBhdGFfZWhfZGV2X2FjdGlvbihkZXYpOwotCi0JCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikgfHwgIShhY3Rpb24gJiBBVEFfRUhfUkVTVU1FKSkKLQkJCWNvbnRpbnVlOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7Ci0JCWRldi0+ZmxhZ3MgJj0gfkFUQV9ERkxBR19TVVNQRU5ERUQ7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlEUFJJTlRLKCJFWElUXG4iKTsKLX0KLQotLyoqCi0gKglhdGFfZWhfcmVzdW1lIC0gaGFuZGxlIHJlc3VtZSBFSCBhY3Rpb24KLSAqCUBhcDogdGFyZ2V0IGhvc3QgcG9ydAotICoJQHJfZmFpbGVkX2RldjogcmVzdWx0IHBhcmFtZXRlciB0byBpbmRpY2F0ZSBmYWlsaW5nIGRldmljZQotICoKLSAqCUhhbmRsZSByZXN1bWUgRUggYWN0aW9uLiAgVGFyZ2V0IGRldmljZXMgYXJlIGFscmVhZHkgcmVzZXQgYW5kCi0gKglyZXZhbGlkYXRlZC4gIFNwaW5uaW5nIHVwIGlzIHRoZSBvbmx5IG9wZXJhdGlvbiBsZWZ0LgotICoKLSAqCUxPQ0tJTkc6Ci0gKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkuCi0gKgotICoJUkVUVVJOUzoKLSAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZQotICovCi1zdGF0aWMgaW50IGF0YV9laF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKipyX2ZhaWxlZF9kZXYpCi17Ci0Jc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKLQlpbnQgaSwgcmMgPSAwOwotCi0JRFBSSU5USygiRU5URVJcbiIpOwotCi0JZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7Ci0JCXVuc2lnbmVkIGludCBhY3Rpb24sIGVycl9tYXNrOwotCi0JCWRldiA9ICZhcC0+ZGV2aWNlW2ldOwotCQlhY3Rpb24gPSBhdGFfZWhfZGV2X2FjdGlvbihkZXYpOwotCi0JCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikgfHwgIShhY3Rpb24gJiBBVEFfRUhfUkVTVU1FKSkKLQkJCWNvbnRpbnVlOwotCi0JCWF0YV9laF9hYm91dF90b19kbyhhcCwgZGV2LCBBVEFfRUhfUkVTVU1FKTsKLQotCQlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSAmJiAhKGFjdGlvbiAmIEFUQV9FSF9QTV9GUkVFWkUpKSB7Ci0JCQllcnJfbWFzayA9IGF0YV9kb19zaW1wbGVfY21kKGRldiwKLQkJCQkJCSAgICAgQVRBX0NNRF9JRExFSU1NRURJQVRFKTsKLQkJCWlmIChlcnJfbWFzaykgewotCQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9FUlIsICJmYWlsZWQgdG8gIgotCQkJCQkgICAgICAgInNwaW4gdXAgKGVycl9tYXNrPTB4JXgpXG4iLAotCQkJCQkgICAgICAgZXJyX21hc2spOwotCQkJCXJjID0gLUVJTzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWF0YV9laF9kb25lKGFwLCBkZXYsIEFUQV9FSF9SRVNVTUUpOwotCX0KLQotCWlmIChyYykKLQkJKnJfZmFpbGVkX2RldiA9IGRldjsKLQotCURQUklOVEsoIkVYSVRcbiIpOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCiBzdGF0aWMgaW50IGF0YV9wb3J0X25yX2VuYWJsZWQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlpbnQgaSwgY250ID0gMDsKQEAgLTIwNTcsMTcgKzE4ODMsNiBAQAogCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmFwLT5laF9jb250ZXh0OwogCWludCBpOwogCi0JLyogc2tpcCBpZiBhbGwgcG9zc2libGUgZGV2aWNlcyBhcmUgc3VzcGVuZGVkICovCi0JZm9yIChpID0gMDsgaSA8IGF0YV9wb3J0X21heF9kZXZpY2VzKGFwKTsgaSsrKSB7Ci0JCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKLQotCQlpZiAoIShkZXYtPmZsYWdzICYgQVRBX0RGTEFHX1NVU1BFTkRFRCkpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA9PSBhdGFfcG9ydF9tYXhfZGV2aWNlcyhhcCkpCi0JCXJldHVybiAxOwotCiAJLyogdGhhdyBmcm96ZW4gcG9ydCwgcmVzdW1lIGxpbmsgYW5kIHJlY292ZXIgZmFpbGVkIGRldmljZXMgKi8KIAlpZiAoKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRlJPWkVOKSB8fAogCSAgICAoZWhjLT5pLmZsYWdzICYgQVRBX0VISV9SRVNVTUVfTElOSykgfHwgYXRhX3BvcnRfbnJfZW5hYmxlZChhcCkpCkBAIC0yMTQ3LDkgKzE5NjIsNiBAQAogCWlmIChhcC0+cGZsYWdzICYgQVRBX1BGTEFHX1VOTE9BRElORykKIAkJZ290byBvdXQ7CiAKLQkvKiBwcmVwIGZvciByZXN1bWUgKi8KLQlhdGFfZWhfcHJlcF9yZXN1bWUoYXApOwotCiAJLyogc2tpcCBFSCBpZiBwb3NzaWJsZS4gKi8KIAlpZiAoYXRhX2VoX3NraXBfcmVjb3ZlcnkoYXApKQogCQllaGMtPmkuYWN0aW9uID0gMDsKQEAgLTIxNzcsMTEgKzE5ODksNiBAQAogCWlmIChyYykKIAkJZ290byBkZXZfZmFpbDsKIAotCS8qIHJlc3VtZSBkZXZpY2VzICovCi0JcmMgPSBhdGFfZWhfcmVzdW1lKGFwLCAmZGV2KTsKLQlpZiAocmMpCi0JCWdvdG8gZGV2X2ZhaWw7Ci0KIAkvKiBjb25maWd1cmUgdHJhbnNmZXIgbW9kZSBpZiBuZWNlc3NhcnkgKi8KIAlpZiAoZWhjLT5pLmZsYWdzICYgQVRBX0VISV9TRVRNT0RFKSB7CiAJCXJjID0gYXRhX3NldF9tb2RlKGFwLCAmZGV2KTsKQEAgLTIxOTAsMjUgKzE5OTcsMTYgQEAKIAkJZWhjLT5pLmZsYWdzICY9IH5BVEFfRUhJX1NFVE1PREU7CiAJfQogCi0JLyogc3VzcGVuZCBkZXZpY2VzICovCi0JcmMgPSBhdGFfZWhfc3VzcGVuZChhcCwgJmRldik7Ci0JaWYgKHJjKQotCQlnb3RvIGRldl9mYWlsOwotCiAJZ290byBvdXQ7CiAKICBkZXZfZmFpbDoKIAllaGMtPnRyaWVzW2Rldi0+ZGV2bm9dLS07CiAKIAlzd2l0Y2ggKHJjKSB7Ci0JY2FzZSAtRUlOVkFMOgotCQkvKiBlZWVrLCBzb21ldGhpbmcgd2VudCB2ZXJ5IHdyb25nLCBnaXZlIHVwICovCi0JCWVoYy0+dHJpZXNbZGV2LT5kZXZub10gPSAwOwotCQlicmVhazsKLQogCWNhc2UgLUVOT0RFVjoKIAkJLyogZGV2aWNlIG1pc3Npbmcgb3Igd3JvbmcgSURFTlRJRlkgZGF0YSwgc2NoZWR1bGUgcHJvYmluZyAqLwogCQllaGMtPmkucHJvYmVfbWFzayB8PSAoMSA8PCBkZXYtPmRldm5vKTsKKwljYXNlIC1FSU5WQUw6CiAJCS8qIGdpdmUgaXQganVzdCBvbmUgbW9yZSBjaGFuY2UgKi8KIAkJZWhjLT50cmllc1tkZXYtPmRldm5vXSA9IG1pbihlaGMtPnRyaWVzW2Rldi0+ZGV2bm9dLCAxKTsKIAljYXNlIC1FSU86CkBAIC0yMzkwLDIyICsyMTg4LDEzIEBACiAgKgogICoJUmVzdW1lIEBhcC4KICAqCi0gKglUaGlzIGZ1bmN0aW9uIGFsc28gd2FpdHMgdXB0byBvbmUgc2Vjb25kIHVudGlsIGFsbCBkZXZpY2VzCi0gKgloYW5naW5nIG9mZiB0aGlzIHBvcnQgcmVxdWVzdHMgcmVzdW1lIEVIIGFjdGlvbi4gIFRoaXMgaXMgdG8KLSAqCXByZXZlbnQgaW52b2tpbmcgRUggYW5kIHRodXMgcmVzZXQgbXVsdGlwbGUgdGltZXMgb24gcmVzdW1lLgotICoKLSAqCU9uIERQTSByZXN1bWUsIHdoZXJlIHNvbWUgb2YgZGV2aWNlcyBtaWdodCBub3QgYmUgcmVzdW1lZAotICoJdG9nZXRoZXIsIHRoaXMgbWF5IGRlbGF5IHBvcnQgcmVzdW1lIHVwdG8gb25lIHNlY29uZCwgYnV0IHN1Y2gKLSAqCURQTSByZXN1bWVzIGFyZSByYXJlIGFuZCAxIHNlYyBkZWxheSBpc24ndCB0b28gYmFkLgotICoKICAqCUxPQ0tJTkc6CiAgKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkuCiAgKi8KIHN0YXRpYyB2b2lkIGF0YV9laF9oYW5kbGVfcG9ydF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaSwgcmMgPSAwOworCWludCByYyA9IDA7CiAKIAkvKiBhcmUgd2UgcmVzdW1pbmc/ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKQEAgLTI0MTYsMzEgKzIyMDUsMTIgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwogCi0JLyogc3B1cmlvdXM/ICovCi0JaWYgKCEoYXAtPnBmbGFncyAmIEFUQV9QRkxBR19TVVNQRU5ERUQpKQotCQlnb3RvIGRvbmU7CisJV0FSTl9PTighKGFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfU1VTUEVOREVEKSk7CiAKIAlpZiAoYXAtPm9wcy0+cG9ydF9yZXN1bWUpCiAJCXJjID0gYXAtPm9wcy0+cG9ydF9yZXN1bWUoYXApOwogCi0JLyogZ2l2ZSBkZXZpY2VzIHRpbWUgdG8gcmVxdWVzdCBFSCAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgSFo7IC8qIDFzIG1heCAqLwotCXdoaWxlICgxKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgewotCQkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2ldOwotCQkJdW5zaWduZWQgaW50IGFjdGlvbiA9IGF0YV9laF9kZXZfYWN0aW9uKGRldik7Ci0KLQkJCWlmICgoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19TVVNQRU5ERUQpICYmCi0JCQkgICAgIShhY3Rpb24gJiBBVEFfRUhfUkVTVU1FKSkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChpID09IEFUQV9NQVhfREVWSUNFUyB8fCB0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQotCQkJYnJlYWs7Ci0JCW1zbGVlcCgxMCk7Ci0JfQotCi0gZG9uZToKKwkvKiByZXBvcnQgcmVzdWx0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKIAlhcC0+cGZsYWdzICY9IH4oQVRBX1BGTEFHX1BNX1BFTkRJTkcgfCBBVEFfUEZMQUdfU1VTUEVOREVEKTsKIAlpZiAoYXAtPnBtX3Jlc3VsdCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKaW5kZXggOWFmYmEyYi4uZGQ4MWZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCkBAIC01MTAsMTMzICs1MTAsNiBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19QTQotLyoqCi0gKglhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCAtIHN1c3BlbmQgQVRBIGRldmljZSBhc3NvY2lhdGVkIHdpdGggc2RldgotICoJQHNkZXY6IHRoZSBTQ1NJIGRldmljZSB0byBzdXNwZW5kCi0gKglAbWVzZzogdGFyZ2V0IHBvd2VyIG1hbmFnZW1lbnQgbWVzc2FnZQotICoKLSAqCVJlcXVlc3Qgc3VzcGVuZCBFSCBhY3Rpb24gb24gdGhlIEFUQSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoCi0gKglAc2RldiBhbmQgd2FpdCBmb3IgdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZS4KLSAqCi0gKglMT0NLSU5HOgotICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgotICoKLSAqCVJFVFVSTlM6Ci0gKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCi0gKi8KLWludCBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQotewotCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBhdGFfc2hvc3RfdG9fcG9ydChzZGV2LT5ob3N0KTsKLQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gYXRhX3Njc2lfZmluZF9kZXYoYXAsIHNkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGFjdGlvbjsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKCFkZXYpCi0JCWdvdG8gb3V0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKLQotCS8qIHdhaXQgZm9yIHRoZSBwcmV2aW91cyByZXN1bWUgdG8gY29tcGxldGUgKi8KLQl3aGlsZSAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19TVVNQRU5ERUQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwotCQlhdGFfcG9ydF93YWl0X2VoKGFwKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQkvKiBpZiBAc2RldiBpcyBhbHJlYWR5IGRldGFjaGVkLCBub3RoaW5nIHRvIGRvICovCi0JaWYgKHNkZXYtPnNkZXZfc3RhdGUgPT0gU0RFVl9PRkZMSU5FIHx8Ci0JICAgIHNkZXYtPnNkZXZfc3RhdGUgPT0gU0RFVl9DQU5DRUwgfHwgc2Rldi0+c2Rldl9zdGF0ZSA9PSBTREVWX0RFTCkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JLyogcmVxdWVzdCBzdXNwZW5kICovCi0JYWN0aW9uID0gQVRBX0VIX1NVU1BFTkQ7Ci0JaWYgKG1lc2cuZXZlbnQgIT0gUE1fRVZFTlRfU1VTUEVORCkKLQkJYWN0aW9uIHw9IEFUQV9FSF9QTV9GUkVFWkU7Ci0JYXAtPmVoX2luZm8uZGV2X2FjdGlvbltkZXYtPmRldm5vXSB8PSBhY3Rpb247Ci0JYXAtPmVoX2luZm8uZmxhZ3MgfD0gQVRBX0VISV9RVUlFVDsKLQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiB3YWl0IGZvciBFSCB0byBkbyB0aGUgam9iICovCi0JYXRhX3BvcnRfd2FpdF9laChhcCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOwotCi0JLyogSWYgQHNkZXYgaXMgc3RpbGwgYXR0YWNoZWQgYnV0IHRoZSBhc3NvY2lhdGVkIEFUQSBkZXZpY2UKLQkgKiBpc24ndCBzdXNwZW5kZWQsIHRoZSBvcGVyYXRpb24gZmFpbGVkLgotCSAqLwotCWlmIChzZGV2LT5zZGV2X3N0YXRlICE9IFNERVZfT0ZGTElORSAmJgotCSAgICBzZGV2LT5zZGV2X3N0YXRlICE9IFNERVZfQ0FOQ0VMICYmIHNkZXYtPnNkZXZfc3RhdGUgIT0gU0RFVl9ERUwgJiYKLQkgICAgIShkZXYtPmZsYWdzICYgQVRBX0RGTEFHX1NVU1BFTkRFRCkpCi0JCXJjID0gLUVJTzsKLQotIG91dF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwotIG91dDoKLQlpZiAocmMgPT0gMCkKLQkJc2Rldi0+c2Rldl9nZW5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBtZXNnOwotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKglhdGFfc2NzaV9kZXZpY2VfcmVzdW1lIC0gcmVzdW1lIEFUQSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNkZXYKLSAqCUBzZGV2OiB0aGUgU0NTSSBkZXZpY2UgdG8gcmVzdW1lCi0gKgotICoJUmVxdWVzdCByZXN1bWUgRUggYWN0aW9uIG9uIHRoZSBBVEEgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aAotICoJQHNkZXYgYW5kIHJldHVybiBpbW1lZGlhdGVseS4gIFRoaXMgZW5hYmxlcyBwYXJhbGxlbAotICoJd2FrZXVwL3NwaW51cCBvZiBkZXZpY2VzLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkuCi0gKgotICoJUkVUVVJOUzoKLSAqCTAuCi0gKi8KLWludCBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKLXsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gYXRhX3Nob3N0X3RvX3BvcnQoc2Rldi0+aG9zdCk7Ci0Jc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9IGF0YV9zY3NpX2ZpbmRfZGV2KGFwLCBzZGV2KTsKLQlzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSA9ICZhcC0+ZWhfaW5mbzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBhY3Rpb247Ci0KLQlpZiAoIWRldikKLQkJZ290byBvdXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOwotCi0JLyogaWYgQHNkZXYgaXMgYWxyZWFkeSBkZXRhY2hlZCwgbm90aGluZyB0byBkbyAqLwotCWlmIChzZGV2LT5zZGV2X3N0YXRlID09IFNERVZfT0ZGTElORSB8fAotCSAgICBzZGV2LT5zZGV2X3N0YXRlID09IFNERVZfQ0FOQ0VMIHx8IHNkZXYtPnNkZXZfc3RhdGUgPT0gU0RFVl9ERUwpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCS8qIHJlcXVlc3QgcmVzdW1lICovCi0JYWN0aW9uID0gQVRBX0VIX1JFU1VNRTsKLQlpZiAoc2Rldi0+c2Rldl9nZW5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkKLQkJX19hdGFfZWhpX2hvdHBsdWdnZWQoZWhpKTsKLQllbHNlCi0JCWFjdGlvbiB8PSBBVEFfRUhfUE1fRlJFRVpFIHwgQVRBX0VIX1NPRlRSRVNFVDsKLQllaGktPmRldl9hY3Rpb25bZGV2LT5kZXZub10gfD0gYWN0aW9uOwotCi0JLyogV2UgZG9uJ3Qgd2FudCBhdXRvcHN5IGFuZCB2ZXJib3NlIEVIIG1lc3NhZ2VzLiAgRGlzYWJsZQotCSAqIHRob3NlIGlmIHdlJ3JlIHRoZSBvbmx5IGRldmljZSBvbiB0aGlzIGxpbmsuCi0JICovCi0JaWYgKGF0YV9wb3J0X21heF9kZXZpY2VzKGFwKSA9PSAxKQotCQllaGktPmZsYWdzIHw9IEFUQV9FSElfTk9fQVVUT1BTWSB8IEFUQV9FSElfUVVJRVQ7Ci0KLQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7Ci0KLSBvdXRfdW5sb2NrOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKLSBvdXQ6Ci0Jc2Rldi0+c2Rldl9nZW5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCiAvKioKICAqCWF0YV90b19zZW5zZV9lcnJvciAtIGNvbnZlcnQgQVRBIGVycm9yIHRvIFNDU0kgZXJyb3IKICAqCUBpZDogQVRBIGRldmljZSBudW1iZXIKQEAgLTkyOSw2ICs4MDIsOCBAQAogCiAJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHNkZXYtPnJlcXVlc3RfcXVldWUsIExJQkFUQV9NQVhfUFJEKTsKIAorCXNkZXYtPm1hbmFnZV9zdGFydF9zdG9wID0gMTsKKwogCWlmIChkZXYpCiAJCWF0YV9zY3NpX2Rldl9jb25maWcoc2RldiwgZGV2KTsKIApAQCAtMTA2OSw5ICs5NDQsMzUgQEAKIAkJfQogCiAJCXRmLT5jb21tYW5kID0gQVRBX0NNRF9WRVJJRlk7CS8qIFJFQUQgVkVSSUZZICovCi0JfSBlbHNlCisJfSBlbHNlIHsKKwkJLyogWFhYOiBUaGlzIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB3aWxsIGJlCisJCSAqIHJlbW92ZWQuICBSZWFkIERvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorCQkgKiBmb3IgbW9yZSBpbmZvLgorCQkgKi8KKwkJaWYgKGF0YV9zcGluZG93bl9jb21wYXQgJiYKKwkJICAgIChzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX0hBTFQgfHwKKwkJICAgICBzeXN0ZW1fc3RhdGUgPT0gU1lTVEVNX1BPV0VSX09GRikpIHsKKwkJCXN0YXRpYyBpbnQgd2FybmVkID0gMDsKKworCQkJaWYgKCF3YXJuZWQpIHsKKwkJCQlzcGluX3VubG9ja19pcnEocWMtPmFwLT5sb2NrKTsKKwkJCQlhdGFfZGV2X3ByaW50ayhxYy0+ZGV2LCBLRVJOX1dBUk5JTkcsCisJCQkJCSJESVNLIE1JR0hUIE5PVCBCRSBTUFVOIERPV04gUFJPUEVSTFkuICIKKwkJCQkJIlVQREFURSBTSFVURE9XTiBVVElMSVRZXG4iKTsKKwkJCQlhdGFfZGV2X3ByaW50ayhxYy0+ZGV2LCBLRVJOX1dBUk5JTkcsCisJCQkJCSJGb3IgbW9yZSBpbmZvLCB2aXNpdCAiCisJCQkJCSJodHRwOi8vbGludXgtYXRhLm9yZy9zaHV0ZG93bi5odG1sXG4iKTsKKwkJCQl3YXJuZWQgPSAxOworCQkJCXNzbGVlcCg1KTsKKwkJCQlzcGluX2xvY2tfaXJxKHFjLT5hcC0+bG9jayk7CisJCQl9CisJCQlzY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOworCQkJcmV0dXJuIDE7CisJCX0KKwogCQkvKiBJc3N1ZSBBVEEgU1RBTkRCWSBJTU1FRElBVEUgY29tbWFuZCAqLwogCQl0Zi0+Y29tbWFuZCA9IEFUQV9DTURfU1RBTkRCWU5PVzE7CisJfQogCiAJLyoKIAkgKiBTdGFuZGJ5IGFuZCBJZGxlIGNvbmRpdGlvbiB0aW1lcnMgY291bGQgYmUgaW1wbGVtZW50ZWQgYnV0IHRoYXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYwppbmRleCBkMjExZGI2Li5lMzVkMTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCkBAIC01NDQsNyArNTQ0LDcgQEAKICAqCVJFVFVSTlM6CiAgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBpbnQgYXRhX3BjaV9pbml0X2JtZG1hKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCkKK2ludCBhdGFfcGNpX2luaXRfYm1kbWEoc3RydWN0IGF0YV9ob3N0ICpob3N0KQogewogCXN0cnVjdCBkZXZpY2UgKmdkZXYgPSBob3N0LT5kZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGdkZXYpOwpAQCAtNTY2LDcgKzU2Niw3IEBACiAJfQogCWhvc3QtPmlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKIAotCWZvciAoaSA9IDA7IGkgPCBob3N0LT5uX3BvcnRzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKIAkJdm9pZCBfX2lvbWVtICpibWRtYSA9IGhvc3QtPmlvbWFwWzRdICsgOCAqIGk7CiAKQEAgLTU4NSw1NCArNTg1LDUyIEBACiAvKioKICAqCWF0YV9wY2lfaW5pdF9uYXRpdmVfaG9zdCAtIGFjcXVpcmUgbmF0aXZlIEFUQSByZXNvdXJjZXMgYW5kIGluaXQgaG9zdAogICoJQGhvc3Q6IHRhcmdldCBBVEEgaG9zdAotICoJQHBvcnRfbWFzazogcG9ydHMgdG8gY29uc2lkZXIKICAqCi0gKglBY3F1aXJlIG5hdGl2ZSBQQ0kgQVRBIHJlc291cmNlcyBmb3IgQGhvc3QgYW5kIGluaXRpYWxpemUKLSAqCUBob3N0IGFjY29yZG9pbmdseS4KKyAqCUFjcXVpcmUgbmF0aXZlIFBDSSBBVEEgcmVzb3VyY2VzIGZvciBAaG9zdCBhbmQgaW5pdGlhbGl6ZSB0aGUKKyAqCWZpcnN0IHR3byBwb3J0cyBvZiBAaG9zdCBhY2NvcmRpbmdseS4gIFBvcnRzIG1hcmtlZCBkdW1teSBhcmUKKyAqCXNraXBwZWQgYW5kIGFsbG9jYXRpb24gZmFpbHVyZSBtYWtlcyB0aGUgcG9ydCBkdW1teS4KICAqCiAgKglMT0NLSU5HOgogICoJSW5oZXJpdGVkIGZyb20gY2FsbGluZyBsYXllciAobWF5IHNsZWVwKS4KICAqCiAgKglSRVRVUk5TOgotICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLgorICoJMCBpZiBhdCBsZWFzdCBvbmUgcG9ydCBpcyBpbml0aWFsaXplZCwgLUVOT0RFViBpZiBubyBwb3J0IGlzCisgKglhdmFpbGFibGUuCiAgKi8KLWludCBhdGFfcGNpX2luaXRfbmF0aXZlX2hvc3Qoc3RydWN0IGF0YV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgcG9ydF9tYXNrKQoraW50IGF0YV9wY2lfaW5pdF9uYXRpdmVfaG9zdChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpCiB7CiAJc3RydWN0IGRldmljZSAqZ2RldiA9IGhvc3QtPmRldjsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZ2Rldik7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCWludCBpLCByYzsKIAotCS8qIERpc2NhcmQgZGlzYWJsZWQgcG9ydHMuICBTb21lIGNvbnRyb2xsZXJzIHNob3cgdGhlaXIgdW51c2VkCi0JICogY2hhbm5lbHMgdGhpcyB3YXkuICBEaXNhYmxlZCBwb3J0cyBhcmUgbWFkZSBkdW1teS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCWlmICgocG9ydF9tYXNrICYgKDEgPDwgaSkpICYmICFhdGFfcmVzb3VyY2VzX3ByZXNlbnQocGRldiwgaSkpIHsKLQkJCWhvc3QtPnBvcnRzW2ldLT5vcHMgPSAmYXRhX2R1bW15X3BvcnRfb3BzOwotCQkJcG9ydF9tYXNrICY9IH4oMSA8PCBpKTsKLQkJfQotCX0KLQotCWlmICghcG9ydF9tYXNrKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsIGdkZXYsICJubyBhdmFpbGFibGUgcG9ydFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCS8qIHJlcXVlc3QsIGlvbWFwIEJBUnMgYW5kIGluaXQgcG9ydCBhZGRyZXNzZXMgYWNjb3JkaW5nbHkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0LT5wb3J0c1tpXTsKIAkJaW50IGJhc2UgPSBpICogMjsKIAkJdm9pZCBfX2lvbWVtICogY29uc3QgKmlvbWFwOwogCi0JCWlmICghKHBvcnRfbWFzayAmICgxIDw8IGkpKSkKKwkJaWYgKGF0YV9wb3J0X2lzX2R1bW15KGFwKSkKIAkJCWNvbnRpbnVlOwogCisJCS8qIERpc2NhcmQgZGlzYWJsZWQgcG9ydHMuICBTb21lIGNvbnRyb2xsZXJzIHNob3cKKwkJICogdGhlaXIgdW51c2VkIGNoYW5uZWxzIHRoaXMgd2F5LiAgRGlzYWJsZWQgcG9ydHMgYXJlCisJCSAqIG1hZGUgZHVtbXkuCisJCSAqLworCQlpZiAoIWF0YV9yZXNvdXJjZXNfcHJlc2VudChwZGV2LCBpKSkgeworCQkJYXAtPm9wcyA9ICZhdGFfZHVtbXlfcG9ydF9vcHM7CisJCQljb250aW51ZTsKKwkJfQorCiAJCXJjID0gcGNpbV9pb21hcF9yZWdpb25zKHBkZXYsIDB4MyA8PCBiYXNlLCBEUlZfTkFNRSk7CiAJCWlmIChyYykgewotCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZ2RldiwgImZhaWxlZCB0byByZXF1ZXN0L2lvbWFwICIKLQkJCQkgICAiQkFScyBmb3IgcG9ydCAlZCAoZXJybm89JWQpXG4iLCBpLCByYyk7CisJCQlkZXZfcHJpbnRrKEtFUk5fV0FSTklORywgZ2RldiwKKwkJCQkgICAiZmFpbGVkIHRvIHJlcXVlc3QvaW9tYXAgQkFScyBmb3IgcG9ydCAlZCAiCisJCQkJICAgIihlcnJubz0lZClcbiIsIGksIHJjKTsKIAkJCWlmIChyYyA9PSAtRUJVU1kpCiAJCQkJcGNpbV9waW5fZGV2aWNlKHBkZXYpOwotCQkJcmV0dXJuIHJjOworCQkJYXAtPm9wcyA9ICZhdGFfZHVtbXlfcG9ydF9vcHM7CisJCQljb250aW51ZTsKIAkJfQogCQlob3N0LT5pb21hcCA9IGlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKIApAQCAtNjQxLDYgKzYzOSwxMyBAQAogCQlhcC0+aW9hZGRyLmN0bF9hZGRyID0gKHZvaWQgX19pb21lbSAqKQogCQkJKCh1bnNpZ25lZCBsb25nKWlvbWFwW2Jhc2UgKyAxXSB8IEFUQV9QQ0lfQ1RMX09GUyk7CiAJCWF0YV9zdGRfcG9ydHMoJmFwLT5pb2FkZHIpOworCisJCW1hc2sgfD0gMSA8PCBpOworCX0KKworCWlmICghbWFzaykgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBnZGV2LCAibm8gYXZhaWxhYmxlIG5hdGl2ZSBwb3J0XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC02NDksOCArNjU0LDcgQEAKIC8qKgogICoJYXRhX3BjaV9wcmVwYXJlX25hdGl2ZV9ob3N0IC0gaGVscGVyIHRvIHByZXBhcmUgbmF0aXZlIFBDSSBBVEEgaG9zdAogICoJQHBkZXY6IHRhcmdldCBQQ0kgZGV2aWNlCi0gKglAcHBpOiBhcnJheSBvZiBwb3J0X2luZm8KLSAqCUBuX3BvcnRzOiBudW1iZXIgb2YgcG9ydHMgdG8gYWxsb2NhdGUKKyAqCUBwcGk6IGFycmF5IG9mIHBvcnRfaW5mbywgbXVzdCBiZSBlbm91Z2ggZm9yIHR3byBwb3J0cwogICoJQHJfaG9zdDogb3V0IGFyZ3VtZW50IGZvciB0aGUgaW5pdGlhbGl6ZWQgQVRBIGhvc3QKICAqCiAgKglIZWxwZXIgdG8gYWxsb2NhdGUgQVRBIGhvc3QgZm9yIEBwZGV2LCBhY3F1aXJlIGFsbCBuYXRpdmUgUENJCkBAIC02NjQsMTAgKzY2OCw5IEBACiAgKi8KIGludCBhdGFfcGNpX3ByZXBhcmVfbmF0aXZlX2hvc3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKiBjb25zdCAqIHBwaSwKLQkJCQlpbnQgbl9wb3J0cywgc3RydWN0IGF0YV9ob3N0ICoqcl9ob3N0KQorCQkJCXN0cnVjdCBhdGFfaG9zdCAqKnJfaG9zdCkKIHsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7Ci0JdW5zaWduZWQgaW50IHBvcnRfbWFzazsKIAlpbnQgcmM7CiAKIAlpZiAoIWRldnJlc19vcGVuX2dyb3VwKCZwZGV2LT5kZXYsIE5VTEwsIEdGUF9LRVJORUwpKQpAQCAtNjgxLDExICs2ODQsNyBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JcG9ydF9tYXNrID0gQVRBX1BPUlRfUFJJTUFSWTsKLQlpZiAobl9wb3J0cyA+IDEpCi0JCXBvcnRfbWFzayB8PSBBVEFfUE9SVF9TRUNPTkRBUlk7Ci0KLQlyYyA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfaG9zdChob3N0LCBwb3J0X21hc2spOworCXJjID0gYXRhX3BjaV9pbml0X25hdGl2ZV9ob3N0KGhvc3QpOwogCWlmIChyYykKIAkJZ290byBlcnJfb3V0OwogCkBAIC03NzcsOCArNzc2LDExIEBACiAJLyogaW9tYXAgY21kIGFuZCBjdGwgcG9ydHMgKi8KIAlsZWdhY3lfZHItPmNtZF9hZGRyW3BvcnRfbm9dID0gaW9wb3J0X21hcChjbWRfcG9ydCwgOCk7CiAJbGVnYWN5X2RyLT5jdGxfYWRkcltwb3J0X25vXSA9IGlvcG9ydF9tYXAoY3RsX3BvcnQsIDEpOwotCWlmICghbGVnYWN5X2RyLT5jbWRfYWRkcltwb3J0X25vXSB8fCAhbGVnYWN5X2RyLT5jdGxfYWRkcltwb3J0X25vXSkKKwlpZiAoIWxlZ2FjeV9kci0+Y21kX2FkZHJbcG9ydF9ub10gfHwgIWxlZ2FjeV9kci0+Y3RsX2FkZHJbcG9ydF9ub10pIHsKKwkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhvc3QtPmRldiwKKwkJCSAgICJmYWlsZWQgdG8gbWFwIGNtZC9jdGwgcG9ydHNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAkvKiBpbml0IElPIGFkZHJlc3NlcyAqLwogCWFwLT5pb2FkZHIuY21kX2FkZHIgPSBsZWdhY3lfZHItPmNtZF9hZGRyW3BvcnRfbm9dOwpAQCAtNzkyLDE5ICs3OTQsMjAgQEAKIC8qKgogICoJYXRhX2luaXRfbGVnYWN5X2hvc3QgLSBhY3F1aXJlIGxlZ2FjeSBBVEEgcmVzb3VyY2VzIGFuZCBpbml0IEFUQSBob3N0CiAgKglAaG9zdDogdGFyZ2V0IEFUQSBob3N0Ci0gKglAbGVnYWN5X21hc2s6IG91dCBwYXJhbWV0ZXIsIG1hc2sgaW5kaWNhdGluZyBwb3J0cyBpcyBpbiBsZWdhY3kgbW9kZQogICoJQHdhc19idXN5OiBvdXQgcGFyYW1ldGVyLCBpbmRpY2F0ZXMgd2hldGhlciBhbnkgcG9ydCB3YXMgYnVzeQogICoKLSAqCUFjcXVpcmUgbGVnYWN5IEFUQSByZXNvdXJjZXMgZm9yIHBvcnRzLgorICoJQWNxdWlyZSBsZWdhY3kgQVRBIHJlc291cmNlcyBmb3IgdGhlIGZpcnN0IHR3byBwb3J0cyBvZiBAaG9zdAorICoJYW5kIGluaXRpYWxpemUgaXQgYWNjb3JkaW5nbHkuICBQb3J0cyBtYXJrZWQgZHVtbXkgYXJlIHNraXBwZWQKKyAqCWFuZCByZXNvdXJjZSBhY3F1aXN0aW9uIGZhaWx1cmUgbWFrZXMgdGhlIHBvcnQgZHVtbXkuCiAgKgogICoJTE9DS0lORzoKICAqCUluaGVyaXRlZCBmcm9tIGNhbGxpbmcgbGF5ZXIgKG1heSBzbGVlcCkuCiAgKgogICoJUkVUVVJOUzoKLSAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZS4KKyAqCTAgaWYgYXQgbGVhc3Qgb25lIHBvcnQgaXMgaW5pdGlhbGl6ZWQsIC1FTk9ERVYgaWYgbm8gcG9ydCBpcworICoJYXZhaWxhYmxlLgogICovCi1zdGF0aWMgaW50IGF0YV9pbml0X2xlZ2FjeV9ob3N0KHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwKLQkJCQl1bnNpZ25lZCBpbnQgKmxlZ2FjeV9tYXNrLCBpbnQgKndhc19idXN5KQorc3RhdGljIGludCBhdGFfaW5pdF9sZWdhY3lfaG9zdChzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QsIGludCAqd2FzX2J1c3kpCiB7CiAJc3RydWN0IGRldmljZSAqZ2RldiA9IGhvc3QtPmRldjsKIAlzdHJ1Y3QgYXRhX2xlZ2FjeV9kZXZyZXMgKmxlZ2FjeV9kcjsKQEAgLTgyMSwyMiArODI0LDIzIEBACiAJZGV2cmVzX2FkZChnZGV2LCBsZWdhY3lfZHIpOwogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkqbGVnYWN5X21hc2sgJj0gfigxIDw8IGkpOworCQlpZiAoYXRhX3BvcnRfaXNfZHVtbXkoaG9zdC0+cG9ydHNbaV0pKQorCQkJY29udGludWU7CisKIAkJcmMgPSBhdGFfaW5pdF9sZWdhY3lfcG9ydChob3N0LT5wb3J0c1tpXSwgbGVnYWN5X2RyKTsKIAkJaWYgKHJjID09IDApCiAJCQlsZWdhY3lfZHItPm1hc2sgfD0gMSA8PCBpOwotCQllbHNlIGlmIChyYyA9PSAtRUJVU1kpCi0JCQkoKndhc19idXN5KSsrOworCQllbHNlIHsKKwkJCWlmIChyYyA9PSAtRUJVU1kpCisJCQkJKCp3YXNfYnVzeSkrKzsKKwkJCWhvc3QtPnBvcnRzW2ldLT5vcHMgPSAmYXRhX2R1bW15X3BvcnRfb3BzOworCQl9CiAJfQogCi0JaWYgKCFsZWdhY3lfZHItPm1hc2spCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotCQlpZiAoIShsZWdhY3lfZHItPm1hc2sgJiAoMSA8PCBpKSkpCi0JCQlob3N0LT5wb3J0c1tpXS0+b3BzID0gJmF0YV9kdW1teV9wb3J0X29wczsKLQotCSpsZWdhY3lfbWFzayB8PSBsZWdhY3lfZHItPm1hc2s7CisJaWYgKCFsZWdhY3lfZHItPm1hc2spIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZ2RldiwgIm5vIGF2YWlsYWJsZSBsZWdhY3kgcG9ydFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KIAogCWRldnJlc19yZW1vdmVfZ3JvdXAoZ2RldiwgTlVMTCk7CiAJcmV0dXJuIDA7CkBAIC04NzUsNyArODc5LDcgQEAKIAlsZWdhY3lfZHIgPSBkZXZyZXNfZmluZChob3N0LT5kZXYsIGF0YV9sZWdhY3lfcmVsZWFzZSwgTlVMTCwgTlVMTCk7CiAJQlVHX09OKCFsZWdhY3lfZHIpOwogCi0JZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJdW5zaWduZWQgaW50IGlycTsKIAogCQkvKiBGSVhNRTogQVRBXypfSVJRKCkgc2hvdWxkIHRha2UgZ2VuZXJpYyBkZXZpY2Ugbm90IHBjaV9kZXYgKi8KQEAgLTkyMyw4ICs5MjcsNyBAQAogLyoqCiAgKglhdGFfcGNpX2luaXRfb25lIC0gSW5pdGlhbGl6ZS9yZWdpc3RlciBQQ0kgSURFIGhvc3QgY29udHJvbGxlcgogICoJQHBkZXY6IENvbnRyb2xsZXIgdG8gYmUgaW5pdGlhbGl6ZWQKLSAqCUBwb3J0X2luZm86IEluZm9ybWF0aW9uIGZyb20gbG93LWxldmVsIGhvc3QgZHJpdmVyCi0gKglAbl9wb3J0czogTnVtYmVyIG9mIHBvcnRzIGF0dGFjaGVkIHRvIGhvc3QgY29udHJvbGxlcgorICoJQHBwaTogYXJyYXkgb2YgcG9ydF9pbmZvLCBtdXN0IGJlIGVub3VnaCBmb3IgdHdvIHBvcnRzCiAgKgogICoJVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB3aGljaCBjYW4gYmUgY2FsbGVkIGZyb20gYSBkcml2ZXIncwogICoJeHh4X2luaXRfb25lKCkgcHJvYmUgZnVuY3Rpb24gaWYgdGhlIGhhcmR3YXJlIHVzZXMgdHJhZGl0aW9uYWwKQEAgLTk0NCwyNyArOTQ3LDM1IEBACiAgKglSRVRVUk5TOgogICoJWmVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBlcnJuby1iYXNlZCB2YWx1ZSBvbiBlcnJvci4KICAqLwotCi1pbnQgYXRhX3BjaV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBhdGFfcG9ydF9pbmZvICoqcG9ydF9pbmZvLAotCQkgICAgICB1bnNpZ25lZCBpbnQgbl9wb3J0cykKK2ludCBhdGFfcGNpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkgICAgIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICogY29uc3QgKiBwcGkpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcGkgPSBOVUxMOwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRbMl07CiAJdTggbWFzazsKLQl1bnNpZ25lZCBpbnQgbGVnYWN5X21vZGUgPSAwOwotCWludCByYzsKKwlpbnQgbGVnYWN5X21vZGUgPSAwOworCWludCBpLCByYzsKIAogCURQUklOVEsoIkVOVEVSXG4iKTsKIAorCS8qIGxvb2sgdXAgdGhlIGZpcnN0IHZhbGlkIHBvcnRfaW5mbyAqLworCWZvciAoaSA9IDA7IGkgPCAyICYmIHBwaVtpXTsgaSsrKSB7CisJCWlmIChwcGlbaV0tPnBvcnRfb3BzICE9ICZhdGFfZHVtbXlfcG9ydF9vcHMpIHsKKwkJCXBpID0gcHBpW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIXBpKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCisJCQkgICAibm8gdmFsaWQgcG9ydF9pbmZvIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmICghZGV2cmVzX29wZW5fZ3JvdXAoZGV2LCBOVUxMLCBHRlBfS0VSTkVMKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlCVUdfT04obl9wb3J0cyA8IDEgfHwgbl9wb3J0cyA+IDIpOwotCi0JcG9ydFswXSA9IHBvcnRfaW5mb1swXTsKLQlwb3J0WzFdID0gKG5fcG9ydHMgPiAxKSA/IHBvcnRfaW5mb1sxXSA6IE5VTEw7Ci0KIAkvKiBGSVhNRTogUmVhbGx5IGZvciBBVEEgaXQgaXNuJ3Qgc2FmZSBiZWNhdXNlIHRoZSBkZXZpY2UgbWF5IGJlCiAJICAgbXVsdGktcHVycG9zZSBhbmQgd2Ugd2FudCB0byBsZWF2ZSBpdCBhbG9uZSBpZiBpdCB3YXMgYWxyZWFkeQogCSAgIGVuYWJsZWQuIFNlY29uZGx5IGZvciBzaGFyZWQgdXNlIGFzIEFyamFuIHNheXMgd2Ugd2FudCByZWZjb3VudGluZwpAQCAtOTg0LDcgKzk5NSw3IEBACiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9DTEFTU19QUk9HLCAmdG1wOCk7CiAJCW1hc2sgPSAoMSA8PCAyKSB8ICgxIDw8IDApOwogCQlpZiAoKHRtcDggJiBtYXNrKSAhPSBtYXNrKQotCQkJbGVnYWN5X21vZGUgPSAoMSA8PCAzKTsKKwkJCWxlZ2FjeV9tb2RlID0gMTsKICNpZiBkZWZpbmVkKENPTkZJR19OT19BVEFfTEVHQUNZKQogCQkvKiBTb21lIHBsYXRmb3JtcyB3aXRoIFBDSSBsaW1pdHMgY2Fubm90IGFkZHJlc3MgY29tcGF0CiAJCSAgIHBvcnQgc3BhY2UuIEluIHRoYXQgY2FzZSB3ZSBwdW50IGlmIHRoZWlyIGZpcm13YXJlIGhhcwpAQCAtOTk4LDcgKzEwMDksNyBAQAogCX0KIAogCS8qIGFsbG9jIGFuZCBpbml0IGhvc3QgKi8KLQlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oZGV2LCBwb3J0LCBuX3BvcnRzKTsKKwlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oZGV2LCBwcGksIDIpOwogCWlmICghaG9zdCkgewogCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAogCQkJICAgImZhaWxlZCB0byBhbGxvY2F0ZSBBVEEgaG9zdFxuIik7CkBAIC0xMDA3LDE5ICsxMDE4LDEzIEBACiAJfQogCiAJaWYgKCFsZWdhY3lfbW9kZSkgewotCQl1bnNpZ25lZCBpbnQgcG9ydF9tYXNrOwotCi0JCXBvcnRfbWFzayA9IEFUQV9QT1JUX1BSSU1BUlk7Ci0JCWlmIChuX3BvcnRzID4gMSkKLQkJCXBvcnRfbWFzayB8PSBBVEFfUE9SVF9TRUNPTkRBUlk7Ci0KLQkJcmMgPSBhdGFfcGNpX2luaXRfbmF0aXZlX2hvc3QoaG9zdCwgcG9ydF9tYXNrKTsKKwkJcmMgPSBhdGFfcGNpX2luaXRfbmF0aXZlX2hvc3QoaG9zdCk7CiAJCWlmIChyYykKIAkJCWdvdG8gZXJyX291dDsKIAl9IGVsc2UgewogCQlpbnQgd2FzX2J1c3kgPSAwOwogCi0JCXJjID0gYXRhX2luaXRfbGVnYWN5X2hvc3QoaG9zdCwgJmxlZ2FjeV9tb2RlLCAmd2FzX2J1c3kpOworCQlyYyA9IGF0YV9pbml0X2xlZ2FjeV9ob3N0KGhvc3QsICZ3YXNfYnVzeSk7CiAJCWlmICh3YXNfYnVzeSkKIAkJCXBjaW1fcGluX2RldmljZShwZGV2KTsKIAkJaWYgKHJjKQpAQCAtMTA0MCw4ICsxMDQ1LDcgQEAKIAkJZ290byBlcnJfb3V0OwogCiAJaWYgKCFsZWdhY3lfbW9kZSkKLQkJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgcGRldi0+aXJxLAotCQkJCSAgICAgIHBvcnRfaW5mb1swXS0+cG9ydF9vcHMtPmlycV9oYW5kbGVyLAorCQlyYyA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBwZGV2LT5pcnEsIHBpLT5wb3J0X29wcy0+aXJxX2hhbmRsZXIsCiAJCQkJICAgICAgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBob3N0KTsKIAllbHNlIHsKIAkJaXJxX2hhbmRsZXJfdCBoYW5kbGVyWzJdID0geyBob3N0LT5vcHMtPmlycV9oYW5kbGVyLApAQCAtMTA1NSw3ICsxMDU5LDcgQEAKIAkJZ290byBlcnJfb3V0OwogCiAJLyogcmVnaXN0ZXIgKi8KLQlyYyA9IGF0YV9ob3N0X3JlZ2lzdGVyKGhvc3QsIHBvcnRfaW5mb1swXS0+c2h0KTsKKwlyYyA9IGF0YV9ob3N0X3JlZ2lzdGVyKGhvc3QsIHBpLT5zaHQpOwogCWlmIChyYykKIAkJZ290byBlcnJfb3V0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEuaCBiL2RyaXZlcnMvYXRhL2xpYmF0YS5oCmluZGV4IDVmNGQ0MGMuLjhiNzFiNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS5oCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS5oCkBAIC01OCw2ICs1OCw3IEBACiBleHRlcm4gaW50IGF0YXBpX2RtYWRpcjsKIGV4dGVybiBpbnQgbGliYXRhX2Z1YTsKIGV4dGVybiBpbnQgbGliYXRhX25vYWNwaTsKK2V4dGVybiBpbnQgYXRhX3NwaW5kb3duX2NvbXBhdDsKIGV4dGVybiBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9xY19uZXdfaW5pdChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgYXRhX2J1aWxkX3J3X3RmKHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAogCQkJICAgdTY0IGJsb2NrLCB1MzIgbl9ibG9jaywgdW5zaWduZWQgaW50IHRmX2ZsYWdzLApAQCAtOTYsMTUgKzk3LDE1IEBACiBleHRlcm4gc3RydWN0IGF0YV9wb3J0ICphdGFfcG9ydF9hbGxvYyhzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpOwogCiAvKiBsaWJhdGEtYWNwaS5jICovCi0jaWZkZWYgQ09ORklHX1NBVEFfQUNQSQorI2lmZGVmIENPTkZJR19BVEFfQUNQSQogZXh0ZXJuIGludCBhdGFfYWNwaV9leGVjX3RmcyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKLWV4dGVybiBpbnQgYXRhX2FjcGlfcHVzaF9pZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgaXgpOworZXh0ZXJuIGludCBhdGFfYWNwaV9wdXNoX2lkKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGF0YV9hY3BpX2V4ZWNfdGZzKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW5saW5lIGludCBhdGFfYWNwaV9wdXNoX2lkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBpeCkKK3N0YXRpYyBpbmxpbmUgaW50IGF0YV9hY3BpX3B1c2hfaWQoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCmluZGV4IGQ0MGVkZWIuLjNjNTVhNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbGkuYwpAQCAtMjkxLDEwICsyOTEsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogLyoKQEAgLTUyMiwxNCArNTE4LDE0IEBACiAKIHN0YXRpYyBpbnQgYWxpX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fZWFybHkgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fZWFybHkgPSB7CiAJCS5zaHQgPSAmYWxpX3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCiAJCS5wb3J0X29wcyA9ICZhbGlfZWFybHlfcG9ydF9vcHMKIAl9OwogCS8qIFJldmlzaW9uIDB4MjAgYWRkZWQgRE1BICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fMjAgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fMjAgPSB7CiAJCS5zaHQgPSAmYWxpX3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19QSU9fTEJBNDgsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC01MzcsNyArNTMzLDcgQEAKIAkJLnBvcnRfb3BzID0gJmFsaV8yMF9wb3J0X29wcwogCX07CiAJLyogUmV2aXNpb24gMHgyMCB3aXRoIHN1cHBvcnQgbG9naWMgYWRkZWQgVURNQSAqLwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvXzIwX3VkbWEgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fMjBfdWRtYSA9IHsKIAkJLnNodCA9ICZhbGlfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCB8IEFUQV9GTEFHX1BJT19MQkE0OCwKIAkJLnBpb19tYXNrID0gMHgxZiwKQEAgLTU0Niw3ICs1NDIsNyBAQAogCQkucG9ydF9vcHMgPSAmYWxpXzIwX3BvcnRfb3BzCiAJfTsKIAkvKiBSZXZpc2lvbiAweEMyIGFkZHMgVURNQTY2ICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fYzIgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fYzIgPSB7CiAJCS5zaHQgPSAmYWxpX3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19QSU9fTEJBNDgsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC01NTUsNyArNTUxLDcgQEAKIAkJLnBvcnRfb3BzID0gJmFsaV9jMl9wb3J0X29wcwogCX07CiAJLyogUmV2aXNpb24gMHhDMyBpcyBVRE1BMTAwICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fYzMgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fYzMgPSB7CiAJCS5zaHQgPSAmYWxpX3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19QSU9fTEJBNDgsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC01NjQsNyArNTYwLDcgQEAKIAkJLnBvcnRfb3BzID0gJmFsaV9jMl9wb3J0X29wcwogCX07CiAJLyogUmV2aXNpb24gMHhDNCBpcyBVRE1BMTMzICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fYzQgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fYzQgPSB7CiAJCS5zaHQgPSAmYWxpX3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QgfCBBVEFfRkxBR19QSU9fTEJBNDgsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC01NzMsNyArNTY5LDcgQEAKIAkJLnBvcnRfb3BzID0gJmFsaV9jMl9wb3J0X29wcwogCX07CiAJLyogUmV2aXNpb24gMHhDNSBpcyBVRE1BMTMzIHdpdGggTEJBNDggRE1BICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fYzUgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fYzUgPSB7CiAJCS5zaHQgPSAmYWxpX3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC01ODIsNyArNTc4LDcgQEAKIAkJLnBvcnRfb3BzID0gJmFsaV9jNV9wb3J0X29wcwogCX07CiAKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7IE5VTEwsIE5VTEwgfTsKIAl1OCByZXYsIHRtcDsKIAlzdHJ1Y3QgcGNpX2RldiAqaXNhX2JyaWRnZTsKIApAQCAtNTk0LDE3ICs1OTAsMTcgQEAKIAkgKi8KIAogCWlmIChyZXYgPCAweDIwKSB7Ci0JCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvX2Vhcmx5OworCQlwcGlbMF0gPSAmaW5mb19lYXJseTsKIAl9IGVsc2UgaWYgKHJldiA8IDB4QzIpIHsKLSAgICAgICAgCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvXzIwOworICAgICAgICAJcHBpWzBdID0gJmluZm9fMjA7CiAJfSBlbHNlIGlmIChyZXYgPT0gMHhDMikgewotICAgICAgICAJcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gJmluZm9fYzI7CisgICAgICAgIAlwcGlbMF0gPSAmaW5mb19jMjsKIAl9IGVsc2UgaWYgKHJldiA9PSAweEMzKSB7Ci0gICAgICAgIAlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSAmaW5mb19jMzsKKyAgICAgICAgCXBwaVswXSA9ICZpbmZvX2MzOwogCX0gZWxzZSBpZiAocmV2ID09IDB4QzQpIHsKLSAgICAgICAgCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvX2M0OworICAgICAgICAJcHBpWzBdID0gJmluZm9fYzQ7CiAJfSBlbHNlCi0gICAgICAgIAlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSAmaW5mb19jNTsKKyAgICAgICAgCXBwaVswXSA9ICZpbmZvX2M1OwogCiAJYWxpX2luaXRfY2hpcHNldChwZGV2KTsKIApAQCAtNjEzLDEwICs2MDksMTAgQEAKIAkJLyogQXJlIHdlIHBhaXJlZCB3aXRoIGEgVURNQSBjYXBhYmxlIGNoaXAgKi8KIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg1RSwgJnRtcCk7CiAJCWlmICgodG1wICYgMHgxRSkgPT0gMHgxMikKLQkgICAgICAgIAlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSAmaW5mb18yMF91ZG1hOworCSAgICAgICAgCXBwaVswXSA9ICZpbmZvXzIwX3VkbWE7CiAJCXBjaV9kZXZfcHV0KGlzYV9icmlkZ2UpOwogCX0KLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBwaSk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCmluZGV4IDY3YzdlODcuLmI0MzkzNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbWQuYwpAQCAtMzI0LDEwICszMjQsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGFtZDMzX3BvcnRfb3BzID0gewpAQCAtNTQyLDcgKzUzOCw3IEBACiAKIHN0YXRpYyBpbnQgYW1kX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9bMTBdID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvWzEwXSA9IHsKIAkJewkvKiAwOiBBTUQgNzQwMSAqLwogCQkJLnNodCA9ICZhbWRfc2h0LAogCQkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCkBAIC02MjQsNyArNjIwLDcgQEAKIAkJCS5wb3J0X29wcyA9ICZhbWQxMDBfcG9ydF9vcHMKIAkJfQogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl07CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyBOVUxMLCBOVUxMIH07CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJaW50IHR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJdTggcmV2OwpAQCAtNjU2LDkgKzY1Miw4IEBACiAJCWF0YV9wY2lfY2xlYXJfc2ltcGxleChwZGV2KTsKIAogCS8qIEFuZCBmaXJlIGl0IHVwICovCi0KLQlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSAmaW5mb1t0eXBlXTsKLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOworCXBwaVswXSA9ICZpbmZvW3R5cGVdOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBwaSk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYwppbmRleCBlZjUxOTQwLi45ODYxMDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCkBAIC00MTQsNyArNDE0LDcgQEAKIHN0YXRpYyBpbnQgYXJ0b3BfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fNjIxMCA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb182MjEwID0gewogCQkuc2h0CQk9ICZhcnRvcF9zaHQsCiAJCS5mbGFncwkJPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCkBAIC00MjIsNyArNDIyLDcgQEAKIAkJLnVkbWFfbWFzayAJPSBBVEFfVURNQTIsCiAJCS5wb3J0X29wcwk9ICZhcnRvcDYyMTBfb3BzLAogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fNjI2eCA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb182MjZ4ID0gewogCQkuc2h0CQk9ICZhcnRvcF9zaHQsCiAJCS5mbGFncwkJPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCkBAIC00MzAsNyArNDMwLDcgQEAKIAkJLnVkbWFfbWFzayAJPSBBVEFfVURNQTQsCiAJCS5wb3J0X29wcwk9ICZhcnRvcDYyNjBfb3BzLAogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fNjI2eF9mYXN0ID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvXzYyNnhfZmFzdCA9IHsKIAkJLnNodAkJPSAmYXJ0b3Bfc2h0LAogCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwpAQCAtNDM4LDMyICs0MzgsMzAgQEAKIAkJLnVkbWFfbWFzayAJPSBBVEFfVURNQTUsCiAJCS5wb3J0X29wcwk9ICZhcnRvcDYyNjBfb3BzLAogCX07Ci0Jc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXTsKLQlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqaW5mbyA9IE5VTEw7Ci0JaW50IHBvcnRzID0gMjsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7IE5VTEwsIE5VTEwgfTsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwKIAkJCSAgICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKIAlpZiAoaWQtPmRyaXZlcl9kYXRhID09IDApIHsJLyogNjIxMCB2YXJpYW50ICovCi0JCWluZm8gPSAmaW5mb182MjEwOworCQlwcGlbMF0gPSAmaW5mb182MjEwOworCQlwcGlbMV0gPSAmYXRhX2R1bW15X3BvcnRfaW5mbzsKIAkJLyogQklPUyBtYXkgaGF2ZSBsZWZ0IHVzIGluIFVETUEsIGNsZWFyIGl0IGJlZm9yZSBsaWJhdGEgcHJvYmUgKi8KIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTQsIDApOwogCQkvKiBGb3IgdGhlIG1vbWVudCAoYWxzbyBsYWNrcyBkc2MpICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFSVE9QIDYyMTAgcmVxdWlyZXMgc2VyaWFsaXplIGZ1bmN0aW9uYWxpdHkgbm90IHlldCBzdXBwb3J0ZWQgYnkgbGliYXRhLlxuIik7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlY29uZGFyeSBBVEEgcG9ydHMgd2lsbCBub3QgYmUgYWN0aXZhdGVkLlxuIik7Ci0JCXBvcnRzID0gMTsKIAl9CiAJZWxzZSBpZiAoaWQtPmRyaXZlcl9kYXRhID09IDEpCS8qIDYyNjAgKi8KLQkJaW5mbyA9ICZpbmZvXzYyNng7CisJCXBwaVswXSA9ICZpbmZvXzYyNng7CiAJZWxzZSBpZiAoaWQtPmRyaXZlcl9kYXRhID09IDIpCXsgLyogNjI2MCBvciA2MjYwICsgZmFzdCAqLwogCQl1bnNpZ25lZCBsb25nIGlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDQpOwogCQl1OCByZWc7CiAKLQkJaW5mbyA9ICZpbmZvXzYyNng7CisJCXBwaVswXSA9ICZpbmZvXzYyNng7CiAJCWlmIChpbmIoaW8pICYgMHgxMCkKLQkJCWluZm8gPSAmaW5mb182MjZ4X2Zhc3Q7CisJCQlwcGlbMF0gPSAmaW5mb182MjZ4X2Zhc3Q7CiAJCS8qIE1hYyBzeXN0ZW1zIGNvbWUgdXAgd2l0aCBzb21lIHJlZ2lzdGVycyBub3Qgc2V0IGFzIHdlCiAJCSAgIHdpbGwgbmVlZCB0aGVtICovCiAKQEAgLTQ4NCwxMCArNDgyLDkgQEAKIAogCX0KIAotCUJVR19PTihpbmZvID09IE5VTEwpOworCUJVR19PTihwcGlbMF0gPT0gTlVMTCk7CiAKLQlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSBpbmZvOwotCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgcG9ydHMpOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBwaSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhcnRvcF9wY2lfdGJsW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYwppbmRleCAyMTUxNTM4Li44NDQ5MTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKQEAgLTIyOSwxMCArMjI5LDYgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0JLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBhdGlpeHBfcG9ydF9vcHMgPSB7CkBAIC0yNzIsNyArMjY4LDcgQEAKIAogc3RhdGljIGludCBhdGlpeHBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0gewogCQkuc2h0ID0gJmF0aWl4cF9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLApAQCAtMjgwLDggKzI3Niw4IEBACiAJCS51ZG1hX21hc2sgPSAweDNGLAogCQkucG9ydF9vcHMgPSAmYXRpaXhwX3BvcnRfb3BzCiAJfTsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXSA9IHsgJmluZm8sICZpbmZvIH07Ci0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwb3J0X2luZm8sIDIpOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBwaSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhdGlpeHBbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjQwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0MC5jCmluZGV4IDIxMDU5ODUuLmVkMDBmYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjQwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NDAuYwpAQCAtMTgxLDEwICsxODEsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGNtZDY0MF9wb3J0X29wcyA9IHsKQEAgLTI1MywxNyArMjQ5LDE2IEBACiAKIHN0YXRpYyBpbnQgY21kNjQwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5zaHQgPSAmY21kNjQwX3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCiAJCS5wb3J0X29wcyA9ICZjbWQ2NDBfcG9ydF9vcHMKIAl9OwotCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0gPSB7ICZpbmZvLCAmaW5mbyB9OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKIAogCWNtZDY0MF9oYXJkd2FyZV9pbml0KHBkZXYpOwotCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgMik7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcHBpKTsKIH0KIAogc3RhdGljIGludCBjbWQ2NDBfcmVpbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jCmluZGV4IDM5ODljYzUuLjJhNzliMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYwpAQCAtMjY2LDEwICsyNjYsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGNtZDY0eF9wb3J0X29wcyA9IHsKQEAgLTM4MSw3ICszNzcsNyBAQAogewogCXUzMiBjbGFzc19yZXY7CiAKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gY21kX2luZm9bNl0gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGNtZF9pbmZvWzZdID0gewogCQl7CS8qIENNRCA2NDMgLSBubyBVRE1BICovCiAJCQkuc2h0ID0gJmNtZDY0eF9zaHQsCiAJCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKQEAgLTQyOCwxMSArNDI0LDkgQEAKIAkJCS5wb3J0X29wcyA9ICZjbWQ2NDhfcG9ydF9vcHMKIAkJfQogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0sICppbmZvOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmNtZF9pbmZvW2lkLT5kcml2ZXJfZGF0YV0sIE5VTEwgfTsKIAl1OCBtcmRtb2RlOwogCi0JaW5mbyA9ICZjbWRfaW5mb1tpZC0+ZHJpdmVyX2RhdGFdOwotCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNsYXNzX3Jldik7CiAJY2xhc3NfcmV2ICY9IDB4RkY7CiAKQEAgLTQ0MiwxMCArNDM2LDEwIEBACiAJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0NNRF82NDYpIHsKIAkJLyogRG9lcyBVRE1BIHdvcmsgPyAqLwogCQlpZiAoY2xhc3NfcmV2ID4gNCkKLQkJCWluZm8gPSAmY21kX2luZm9bMl07CisJCQlwcGlbMF0gPSAmY21kX2luZm9bMl07CiAJCS8qIEVhcmx5IHJldiB3aXRoIG90aGVyIHByb2JsZW1zID8gKi8KIAkJZWxzZSBpZiAoY2xhc3NfcmV2ID09IDEpCi0JCQlpbmZvID0gJmNtZF9pbmZvWzNdOworCQkJcHBpWzBdID0gJmNtZF9pbmZvWzNdOwogCX0KIAogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgNjQpOwpAQCAtNDYxLDggKzQ1NSw3IEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIFVESURFVENSMCwgMHhGMCk7CiAjZW5kaWYKIAotCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9IGluZm87Ci0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAyKTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGkpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYwppbmRleCA3OWJlZjBkLi44M2JjYzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMKQEAgLTE1NSwxMCArMTU1LDYgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0JLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBjczU1MjBfcG9ydF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MzAuYwppbmRleCAyOTY0MmQ1Li4xYjY3OTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTMwLmMKQEAgLTE3NiwxMCArMTc2LDYgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0JLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBjczU1MzBfcG9ydF9vcHMgPSB7CkBAIC0zMzksNyArMzM1LDcgQEAKIAogc3RhdGljIGludCBjczU1MzBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKIAkJLnNodCA9ICZjczU1MzBfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC0zNDgsMjMgKzM0NCwyMyBAQAogCQkucG9ydF9vcHMgPSAmY3M1NTMwX3BvcnRfb3BzCiAJfTsKIAkvKiBUaGUgZG9ja2luZyBjb25uZWN0b3IgZG9lc24ndCBkbyBVRE1BLCBhbmQgaXQgc2VlbXMgbm90IE1XRE1BICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fcGFsbWF4X3NlY29uZGFyeSA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19wYWxtYXhfc2Vjb25kYXJ5ID0gewogCQkuc2h0ID0gJmNzNTUzMF9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrID0gMHgxZiwKIAkJLnBvcnRfb3BzID0gJmNzNTUzMF9wb3J0X29wcwogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0gPSB7ICZpbmZvLCAmaW5mbyB9OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKIAogCS8qIENoaXAgaW5pdGlhbGlzYXRpb24gKi8KIAlpZiAoY3M1NTMwX2luaXRfY2hpcCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChjczU1MzBfaXNfcGFsbWF4KCkpCi0JCXBvcnRfaW5mb1sxXSA9ICZpbmZvX3BhbG1heF9zZWNvbmRhcnk7CisJCXBwaVsxXSA9ICZpbmZvX3BhbG1heF9zZWNvbmRhcnk7CiAKIAkvKiBOb3cga2ljayBvZmYgQVRBIHNldCB1cCAqLwotCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgMik7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcHBpKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM1LmMKaW5kZXggMjIwMDZhZS4uZjM3ZDRjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jCkBAIC0xNzMsMTAgKzE3Myw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgY3M1NTM1X3BvcnRfb3BzID0gewpAQCAtMjI3LDcgKzIyMyw3IEBACiAKIHN0YXRpYyBpbnQgY3M1NTM1X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKIAkJLnNodCA9ICZjczU1MzVfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC0yMzUsNyArMjMxLDcgQEAKIAkJLnVkbWFfbWFzayA9IDB4MWYsCiAJCS5wb3J0X29wcyA9ICZjczU1MzVfcG9ydF9vcHMKIAl9OwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0c1sxXSA9IHsgJmluZm8gfTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCAmYXRhX2R1bW15X3BvcnRfaW5mbyB9OwogCiAJdTMyIHRpbWluZ3MsIGR1bW15OwogCkBAIC0yNDcsNyArMjQzLDcgQEAKIAlyZG1zcihBVEFDX0NIMEQxX1BJTywgdGltaW5ncywgZHVtbXkpOwogCWlmIChDUzU1MzVfQkFEX1BJTyh0aW1pbmdzKSkKIAkJd3Jtc3IoQVRBQ19DSDBEMV9QSU8sIDB4RjdGNEY3RjRVTCwgMCk7Ci0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwb3J0cywgMSk7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwcGkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3M1NTM1W10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jCmluZGV4IDZlYzA0OWMuLjI3YjlmMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jCkBAIC0xMjUsMTAgKzEyNSw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgY3k4MmM2OTNfcG9ydF9vcHMgPSB7CkBAIC0xNjksMTQgKzE2NSwxNCBAQAogCiBzdGF0aWMgaW50IGN5ODJjNjkzX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5zaHQgPSAmY3k4MmM2OTNfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrID0gMHgxZiwKIAkJLm13ZG1hX21hc2sgPSAweDA3LAogCQkucG9ydF9vcHMgPSAmY3k4MmM2OTNfcG9ydF9vcHMKIAl9OwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzFdID0geyAmaW5mbyB9OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sICZhdGFfZHVtbXlfcG9ydF9pbmZvIH07CiAKIAkvKiBEZXZmbiAxIGlzIHRoZSBBVEEgcHJpbWFyeS4gVGhlIHNlY29uZGFyeSBpcyBtYWdpYyBhbmQgb24gZGV2Zm4yLgogCSAgIEZvciB0aGUgbW9tZW50IHdlIGRvbid0IGhhbmRsZSB0aGUgc2Vjb25kYXJ5LiBGSVhNRSAqLwpAQCAtMTg0LDcgKzE4MCw3IEBACiAJaWYgKFBDSV9GVU5DKHBkZXYtPmRldmZuKSAhPSAxKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgMSk7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcHBpKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGN5ODJjNjkzW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYyBiL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jCmluZGV4IGQwZjUyZTAuLjA3OTI0OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfZWZhci5jCkBAIC0yNDcsMTAgKzI0Nyw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgZWZhcl9vcHMgPSB7CkBAIC0zMDUsNyArMzAxLDcgQEAKIHN0YXRpYyBpbnQgZWZhcl9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5zaHQJCT0gJmVmYXJfc2h0LAogCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwpAQCAtMzEzLDEzICszMDksMTMgQEAKIAkJLnVkbWFfbWFzayAJPSAweDBmLCAvKiBVRE1BIDY2ICovCiAJCS5wb3J0X29wcwk9ICZlZmFyX29wcywKIAl9OwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdID0geyAmaW5mbywgJmluZm8gfTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCBOVUxMIH07CiAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCiAJCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCi0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAyKTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgZWZhcl9wY2lfdGJsW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYwppbmRleCBlNjRlMDVlLi5jNmM4YThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKQEAgLTMzMSwxMCArMzMxLDYgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0JLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCi0jZW5kaWYKIH07CiAKIC8qCkBAIC00MjEsNyArNDE3LDcgQEAKIAogc3RhdGljIGludCBocHQzNnhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM2NiA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNjYgPSB7CiAJCS5zaHQgPSAmaHB0MzZ4X3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC00MjksNyArNDI1LDggQEAKIAkJLnVkbWFfbWFzayA9IDB4MWYsCiAJCS5wb3J0X29wcyA9ICZocHQzNjZfcG9ydF9vcHMKIAl9OwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0gPSB7JmluZm9faHB0MzY2LCAmaW5mb19ocHQzNjZ9OworCXN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSBpbmZvX2hwdDM2NjsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCBOVUxMIH07CiAKIAl1MzIgY2xhc3NfcmV2OwogCXUzMiByZWcxOwpAQCAtNDUwLDE3ICs0NDcsMTcgQEAKIAkvKiBpbmZvX2hwdDM2NiBpcyBzYWZlIGFnYWluc3QgcmUtZW50cnkgc28gd2UgY2FuIHNjcmliYmxlIG9uIGl0ICovCiAJc3dpdGNoKChyZWcxICYgMHg3MDApID4+IDgpIHsKIAkJY2FzZSA1OgotCQkJaW5mb19ocHQzNjYucHJpdmF0ZV9kYXRhID0gJmhwdDM2Nl80MDsKKwkJCWluZm8ucHJpdmF0ZV9kYXRhID0gJmhwdDM2Nl80MDsKIAkJCWJyZWFrOwogCQljYXNlIDk6Ci0JCQlpbmZvX2hwdDM2Ni5wcml2YXRlX2RhdGEgPSAmaHB0MzY2XzI1OworCQkJaW5mby5wcml2YXRlX2RhdGEgPSAmaHB0MzY2XzI1OwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlpbmZvX2hwdDM2Ni5wcml2YXRlX2RhdGEgPSAmaHB0MzY2XzMzOworCQkJaW5mby5wcml2YXRlX2RhdGEgPSAmaHB0MzY2XzMzOwogCQkJYnJlYWs7CiAJfQogCS8qIE5vdyBraWNrIG9mZiBBVEEgc2V0IHVwICovCi0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwb3J0X2luZm8sIDIpOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKGRldiwgcHBpKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKaW5kZXggMTYxNGU4Yy4uNWEwYTQxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCkBAIC04ODcsNyArODg3LDcgQEAKIHN0YXRpYyBpbnQgaHB0Mzd4X2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAkvKiBIUFQzNzAgLSBVRE1BMTAwICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0MzcwID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3MCA9IHsKIAkJLnNodCA9ICZocHQzN3hfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC04OTYsNyArODk2LDcgQEAKIAkJLnBvcnRfb3BzID0gJmhwdDM3MF9wb3J0X29wcwogCX07CiAJLyogSFBUMzcwQSAtIFVETUExMDAgKi8KLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNzBhID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3MGEgPSB7CiAJCS5zaHQgPSAmaHB0Mzd4X3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TU3xBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLApAQCAtOTA1LDcgKzkwNSw3IEBACiAJCS5wb3J0X29wcyA9ICZocHQzNzBhX3BvcnRfb3BzCiAJfTsKIAkvKiBIUFQzNzAgLSBVRE1BMTAwICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0MzcwXzMzID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3MF8zMyA9IHsKIAkJLnNodCA9ICZocHQzN3hfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC05MTQsNyArOTE0LDcgQEAKIAkJLnBvcnRfb3BzID0gJmhwdDM3MF9wb3J0X29wcwogCX07CiAJLyogSFBUMzcwQSAtIFVETUExMDAgKi8KLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNzBhXzMzID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3MGFfMzMgPSB7CiAJCS5zaHQgPSAmaHB0Mzd4X3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TU3xBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLApAQCAtOTIzLDcgKzkyMyw3IEBACiAJCS5wb3J0X29wcyA9ICZocHQzNzBhX3BvcnRfb3BzCiAJfTsKIAkvKiBIUFQzNzEsIDM3MiBhbmQgZnJpZW5kcyAtIFVETUExMzMgKi8KLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNzIgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0MzcyID0gewogCQkuc2h0ID0gJmhwdDM3eF9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrID0gMHgxZiwKQEAgLTkzMiw3ICs5MzIsNyBAQAogCQkucG9ydF9vcHMgPSAmaHB0MzcyX3BvcnRfb3BzCiAJfTsKIAkvKiBIUFQzNzEsIDM3MiBhbmQgZnJpZW5kcyAtIFVETUExMDAgYXQgNTBNSHogY2xvY2sgKi8KLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19ocHQzNzJfNTAgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0MzcyXzUwID0gewogCQkuc2h0ID0gJmhwdDM3eF9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrID0gMHgxZiwKQEAgLTk0MSw3ICs5NDEsNyBAQAogCQkucG9ydF9vcHMgPSAmaHB0MzcyX3BvcnRfb3BzCiAJfTsKIAkvKiBIUFQzNzQgLSBVRE1BMTMzICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9faHB0Mzc0ID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2hwdDM3NCA9IHsKIAkJLnNodCA9ICZocHQzN3hfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC05NTEsOSArOTUxLDEwIEBACiAJfTsKIAogCXN0YXRpYyBjb25zdCBpbnQgTUh6WzRdID0geyAzMywgNDAsIDUwLCA2NiB9OwotCi0Jc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXTsKLQlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydDsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydDsKKwl2b2lkICpwcml2YXRlX2RhdGEgPSBOVUxMOworCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBvcnRfaW5mbzsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZwb3J0X2luZm8sIE5VTEwgfTsKIAogCXU4IGlycW1hc2s7CiAJdTMyIGNsYXNzX3JldjsKQEAgLTExMjQsMTMgKzExMjUsMTMgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJCWlmIChjbG9ja19zbG90ID09IDMpCi0JCQlwb3J0LT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKWhwdDM3eF90aW1pbmdzXzY2OworCQkJcHJpdmF0ZV9kYXRhID0gKHZvaWQgKilocHQzN3hfdGltaW5nc182NjsKIAkJZWxzZQotCQkJcG9ydC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilocHQzN3hfdGltaW5nc181MDsKKwkJCXByaXZhdGVfZGF0YSA9ICh2b2lkICopaHB0Mzd4X3RpbWluZ3NfNTA7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaHB0Mzd4OiBCdXMgY2xvY2sgJWRNSHosIHVzaW5nIERQTEwuXG4iLCBNSHpbY2xvY2tfc2xvdF0pOwogCX0gZWxzZSB7Ci0JCXBvcnQtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopY2hpcF90YWJsZS0+Y2xvY2tzW2Nsb2NrX3Nsb3RdOworCQlwcml2YXRlX2RhdGEgPSAodm9pZCAqKWNoaXBfdGFibGUtPmNsb2Nrc1tjbG9ja19zbG90XTsKIAkJLyoKIAkJICoJUGVyZm9ybSBhIGZpbmFsIGZpeHVwLiBOb3RlIHRoYXQgd2Ugd2lsbCBoYXZlIHVzZWQgdGhlCiAJCSAqCURQTEwgb24gdGhlIEhQVDM3MiB3aGljaCBtZWFucyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5CkBAIC0xMTQ0LDkgKzExNDUsMTEgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaHB0Mzd4OiAlczogQnVzIGNsb2NrICVkTUh6LlxuIiwgY2hpcF90YWJsZS0+bmFtZSwgTUh6W2Nsb2NrX3Nsb3RdKTsKIAl9CiAKLQlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSBwb3J0OwogCS8qIE5vdyBraWNrIG9mZiBBVEEgc2V0IHVwICovCi0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwb3J0X2luZm8sIDIpOworCXBvcnRfaW5mbyA9ICpwb3J0OworCXBvcnRfaW5mby5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBwaSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBocHQzN3hbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKaW5kZXggZWExMDM3ZC4uZjI1MTU0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKQEAgLTQ4OCw3ICs0ODgsNyBAQAogc3RhdGljIGludCBocHQzeDJuX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKIAkvKiBIUFQzNzJOIGFuZCBmcmllbmRzIC0gVURNQTEzMyAqLwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0gewogCQkuc2h0ID0gJmhwdDN4Mm5fc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrID0gMHgxZiwKQEAgLTQ5Niw4ICs0OTYsOCBAQAogCQkudWRtYV9tYXNrID0gMHg3ZiwKIAkJLnBvcnRfb3BzID0gJmhwdDN4Mm5fcG9ydF9vcHMKIAl9OwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl07Ci0Jc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnQgPSAmaW5mbzsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwb3J0ID0gaW5mbzsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZwb3J0LCBOVUxMIH07CiAKIAl1OCBpcnFtYXNrOwogCXUzMiBjbGFzc19yZXY7CkBAIC01ODUsOSArNTg1LDkgQEAKIAogCS8qIFNldCBvdXIgcHJpdmF0ZSBkYXRhIHVwLiBXZSBvbmx5IG5lZWQgYSBmZXcgZmxhZ3Mgc28gd2UgdXNlCiAJICAgaXQgZGlyZWN0bHkgKi8KLQlwb3J0LT5wcml2YXRlX2RhdGEgPSBOVUxMOworCXBvcnQucHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlpZiAocGNpX21oeiA+IDYwKSB7Ci0JCXBvcnQtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopUENJNjY7CisJCXBvcnQucHJpdmF0ZV9kYXRhID0gKHZvaWQgKilQQ0k2NjsKIAkJLyoKIAkJICogT24gIEhQVDM3MU4sIGlmIEFUQSBjbG9jayBpcyA2NiBNSHogd2UgbXVzdCBzZXQgYml0IDIgaW4KIAkJICogdGhlIE1JU0MuIHJlZ2lzdGVyIHRvIHN0cmV0Y2ggdGhlIFVsdHJhRE1BIFRzcyB0aW1pbmcuCkBAIC01OTgsOCArNTk4LDcgQEAKIAl9CiAKIAkvKiBOb3cga2ljayBvZmYgQVRBIHNldCB1cCAqLwotCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9IHBvcnQ7Ci0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwb3J0X2luZm8sIDIpOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKGRldiwgcHBpKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGhwdDN4Mm5bXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCmluZGV4IGFjMjhlYzguLmJiYWJlNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYwpAQCAtMTAwLDEwICsxMDAsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGhwdDN4M19wb3J0X29wcyA9IHsKQEAgLTE3NSw3ICsxNzEsNyBAQAogCiBzdGF0aWMgaW50IGhwdDN4M19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5zaHQgPSAmaHB0M3gzX3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TU3xBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLApAQCAtMTgzLDExICsxNzksMTEgQEAKIAkJLnVkbWFfbWFzayA9IDB4MDcsCiAJCS5wb3J0X29wcyA9ICZocHQzeDNfcG9ydF9vcHMKIAl9OwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdID0geyAmaW5mbywgJmluZm8gfTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCBOVUxMIH07CiAKIAlocHQzeDNfaW5pdF9jaGlwc2V0KGRldik7CiAJLyogTm93IGtpY2sgb2ZmIEFUQSBzZXQgdXAgKi8KLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBvcnRfaW5mbywgMik7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwcGkpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMTMuYwppbmRleCAxN2JmOWYzLi5hNzY5OTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxMy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjEzLmMKQEAgLTI1NywxMCArMjU3LDYgQEAKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGl0ODIxM19vcHMgPSB7CkBAIC0zMTUsNyArMzExLDcgQEAKIHN0YXRpYyBpbnQgaXQ4MjEzX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKIAkJLnNodAkJPSAmaXQ4MjEzX3NodCwKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KQEAgLTMyMywxNCArMzE5LDE0IEBACiAJCS51ZG1hX21hc2sgCT0gMHgxZiwgLyogVURNQSAxMDAgKi8KIAkJLnBvcnRfb3BzCT0gJml0ODIxM19vcHMsCiAJfTsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXSA9IHsgJmluZm8sICZpbmZvIH07CisJLyogQ3VycmVudCBJVDgyMTMgc3R1ZmYgaXMgc2luZ2xlIHBvcnQgKi8KKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCAmYXRhX2R1bW15X3BvcnRfaW5mbyB9OwogCiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LAogCQkJICAgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAotCS8qIEN1cnJlbnQgSVQ4MjEzIHN0dWZmIGlzIHNpbmdsZSBwb3J0ICovCi0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAxKTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXQ4MjEzX3BjaV90YmxbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jCmluZGV4IGYxZjhjZWMuLmZmOWE2ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYwpAQCAtNjIwLDEwICs2MjAsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIGl0ODIxeF9zbWFydF9wb3J0X29wcyA9IHsKQEAgLTcyMiwxNCArNzE4LDE0IEBACiB7CiAJdTggY29uZjsKIAotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX3NtYXJ0ID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX3NtYXJ0ID0gewogCQkuc2h0ID0gJml0ODIxeF9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLAogCQkubXdkbWFfbWFzayA9IDB4MDcsCiAJCS5wb3J0X29wcyA9ICZpdDgyMXhfc21hcnRfcG9ydF9vcHMKIAl9OwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX3Bhc3N0aHJ1ID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX3Bhc3N0aHJ1ID0gewogCQkuc2h0ID0gJml0ODIxeF9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLApAQCAtNzM3LDggKzczMyw4IEBACiAJCS51ZG1hX21hc2sgPSAweDdmLAogCQkucG9ydF9vcHMgPSAmaXQ4MjF4X3Bhc3N0aHJ1X3BvcnRfb3BzCiAJfTsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXTsKIAorCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgTlVMTCwgTlVMTCB9OwogCXN0YXRpYyBjaGFyICptb2RlWzJdID0geyAicGFzcyB0aHJvdWdoIiwgInNtYXJ0IiB9OwogCiAJLyogRm9yY2UgdGhlIGNhcmQgaW50byBieXBhc3MgbW9kZSBpZiBzbyByZXF1ZXN0ZWQgKi8KQEAgLTc1MSwxMSArNzQ3LDExIEBACiAKIAlwcmludGsoS0VSTl9JTkZPIERSVl9OQU1FICI6IGNvbnRyb2xsZXIgaW4gJXMgbW9kZS5cbiIsIG1vZGVbY29uZl0pOwogCWlmIChjb25mID09IDApCi0JCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvX3Bhc3N0aHJ1OworCQlwcGlbMF0gPSAmaW5mb19wYXNzdGhydTsKIAllbHNlCi0JCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9ICZpbmZvX3NtYXJ0OworCQlwcGlbMF0gPSAmaW5mb19zbWFydDsKIAotCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgMik7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcHBpKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9peHA0eHhfY2YuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaXhwNHh4X2NmLmMKaW5kZXggNDIwYzM0My4uYjk5NDM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9peHA0eHhfY2YuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2l4cDR4eF9jZi5jCkBAIC0zMSw3ICszMSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKIAkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2ldOwotCQlpZiAoYXRhX2Rldl9yZWFkeShkZXYpKSB7CisJCWlmIChhdGFfZGV2X2VuYWJsZWQoZGV2KSkgewogCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJjb25maWd1cmVkIGZvciBQSU8wXG4iKTsKIAkJCWRldi0+cGlvX21vZGUgPSBYRkVSX1BJT18wOwogCQkJZGV2LT54ZmVyX21vZGUgPSBYRkVSX1BJT18wOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9qbWljcm9uLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2ptaWNyb24uYwppbmRleCAxZGFmNzhhLi44ZDc5OWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2ptaWNyb24uYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2ptaWNyb24uYwpAQCAtMTM4LDEwICsxMzgsNiBAQAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLyogVXNlIHN0YW5kYXJkIENIUyBtYXBwaW5nIHJ1bGVzICovCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBqbWljcm9uX29wcyA9IHsKQEAgLTE5NSw3ICsxOTEsNyBAQAogCiBzdGF0aWMgaW50IGptaWNyb25faW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5zaHQJCT0gJmptaWNyb25fc2h0LAogCQkuZmxhZ3MJPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIApAQCAtMjA1LDkgKzIwMSw5IEBACiAKIAkJLnBvcnRfb3BzCT0gJmptaWNyb25fb3BzLAogCX07Ci0Jc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXSA9IHsgJmluZm8sICZpbmZvIH07CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mbywgTlVMTCB9OwogCi0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAyKTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgam1pY3Jvbl9wY2lfdGJsW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX21hcnZlbGwuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jCmluZGV4IDgzN2I3ZmUuLmVkYmZlMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbWFydmVsbC5jCkBAIC0xMDcsMTAgKzEwNyw2IEBACiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkvKiBVc2Ugc3RhbmRhcmQgQ0hTIG1hcHBpbmcgcnVsZXMgKi8KIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG1hcnZlbGxfb3BzID0gewpAQCAtMTY1LDcgKzE2MSw3IEBACiAKIHN0YXRpYyBpbnQgbWFydmVsbF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKIAkJLnNodAkJPSAmbWFydmVsbF9zaHQsCiAJCS5mbGFncwkJPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIApAQCAtMTc1LDcgKzE3MSw3IEBACiAKIAkJLnBvcnRfb3BzCT0gJm1hcnZlbGxfb3BzLAogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fc2F0YSA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19zYXRhID0gewogCQkuc2h0CQk9ICZtYXJ2ZWxsX3NodCwKIAkJLyogU2xhdmUgcG9zc2libGUgYXMgaXRzIG1hZ2ljYWxseSBtYXBwZWQgbm90IHJlYWwgKi8KIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULApAQCAtMTg2LDEzICsxODIsMTIgQEAKIAogCQkucG9ydF9vcHMJPSAmbWFydmVsbF9vcHMsCiAJfTsKLQlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdID0geyAmaW5mbywgJmluZm9fc2F0YSB9OwotCWludCBuX3BvcnQgPSAyOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sICZpbmZvX3NhdGEgfTsKIAogCWlmIChwZGV2LT5kZXZpY2UgPT0gMHg2MTAxKQotCQluX3BvcnQgPSAxOworCQlwcGlbMV0gPSAmYXRhX2R1bW15X3BvcnRfaW5mbzsKIAotCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgbl9wb3J0KTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgbWFydmVsbF9wY2lfdGJsW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX21wYzUyeHguYyBiL2RyaXZlcnMvYXRhL3BhdGFfbXBjNTJ4eC5jCmluZGV4IDk1ODdhODkuLjM2OGZhYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbXBjNTJ4eC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbXBjNTJ4eC5jCkBAIC0yODAsMTAgKzI4MCw2IEBACiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBtcGM1Mnh4X2F0YV9wb3J0X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYwppbmRleCAzYmZiZDQ5Li40ZWE0MjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCkBAIC0xNjUsMTAgKzE2NSw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbXBpaXhfcG9ydF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX25ldGNlbGwuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbmV0Y2VsbC5jCmluZGV4IGRiYmE1YjcuLjgxZjU2MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbmV0Y2VsbC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbmV0Y2VsbC5jCkBAIC0zNywxMCArMzcsNiBAQAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLyogVXNlIHN0YW5kYXJkIENIUyBtYXBwaW5nIHJ1bGVzICovCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0JLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBuZXRjZWxsX29wcyA9IHsKQEAgLTk2LDcgKzkyLDcgQEAKIHN0YXRpYyBpbnQgbmV0Y2VsbF9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5zaHQJCT0gJm5ldGNlbGxfc2h0LAogCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJCS8qIEFjdHVhbGx5IHdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IHRoZXNlIGFzIHRoZQpAQCAtMTA2LDcgKzEwMiw3IEBACiAJCS51ZG1hX21hc2sgCT0gMHgzZiwgLyogVURNQSAxMzMgKi8KIAkJLnBvcnRfb3BzCT0gJm5ldGNlbGxfb3BzLAogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0gPSB7ICZpbmZvLCAmaW5mbyB9OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bXSA9IHsgJmluZm8sIE5VTEwgfTsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwKQEAgLTExNiw3ICsxMTIsNyBAQAogCWF0YV9wY2lfY2xlYXJfc2ltcGxleChwZGV2KTsKIAogCS8qIEFuZCBsZXQgdGhlIGxpYnJhcnkgY29kZSBkbyB0aGUgd29yayAqLwotCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgMik7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5ldGNlbGxfcGNpX3RibFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9uczg3NDEwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTAuYwppbmRleCBlYmM1OGE5Li5lYTcwZWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTAuYwpAQCAtMTU4LDEwICsxNTgsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG5zODc0MTBfcG9ydF9vcHMgPSB7CkBAIC0xOTUsMTQgKzE5MSwxNCBAQAogCiBzdGF0aWMgaW50IG5zODc0MTBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0gewogCQkuc2h0ID0gJm5zODc0MTBfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrID0gMHgwRiwKIAkJLnBvcnRfb3BzID0gJm5zODc0MTBfcG9ydF9vcHMKIAl9OwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdID0geyZpbmZvLCAmaW5mb307Ci0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwb3J0X2luZm8sIDIpOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBwaSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBuczg3NDEwW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfb2xkcGlpeC5jCmluZGV4IDRkNzVkMzIuLjI5YzIzZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfb2xkcGlpeC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfb2xkcGlpeC5jCkBAIC0yMzQsMTAgKzIzNCw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgb2xkcGlpeF9wYXRhX29wcyA9IHsKQEAgLTI5MywyMCArMjg5LDIwIEBACiBzdGF0aWMgaW50IG9sZHBpaXhfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0gewogCQkuc2h0CQk9ICZvbGRwaWl4X3NodCwKIAkJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA3LCAvKiBtd2RtYTEtMiAqLwogCQkucG9ydF9vcHMJPSAmb2xkcGlpeF9wYXRhX29wcywKIAl9OwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdID0geyAmaW5mbywgJmluZm8gfTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCBOVUxMIH07CiAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCiAJCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCi0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcG9ydF9pbmZvLCAyKTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgb2xkcGlpeF9wY2lfdGJsW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX29wdGkuYyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aS5jCmluZGV4IDBhZjhhMmMuLjFjNDQ2NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfb3B0aS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aS5jCkBAIC0xNzksMTAgKzE3OSw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgb3B0aV9wb3J0X29wcyA9IHsKQEAgLTIyMCwxOSArMjE2LDE5IEBACiAKIHN0YXRpYyBpbnQgb3B0aV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5zaHQgPSAmb3B0aV9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLAogCQkucG9ydF9vcHMgPSAmb3B0aV9wb3J0X29wcwogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0gPSB7ICZpbmZvLCAmaW5mbyB9OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKIAlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCi0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwb3J0X2luZm8sIDIpOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKGRldiwgcHBpKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG9wdGlbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jIGIvZHJpdmVycy9hdGEvcGF0YV9vcHRpZG1hLmMKaW5kZXggMjg0M2U0OC4uMzA5M2IwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9vcHRpZG1hLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9vcHRpZG1hLmMKQEAgLTM2MywxMCArMzYzLDYgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0JLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBvcHRpZG1hX3BvcnRfb3BzID0gewpAQCAtNDg2LDE0ICs0ODIsMTQgQEAKIAogc3RhdGljIGludCBvcHRpZG1hX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb184MmM3MDAgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fODJjNzAwID0gewogCQkuc2h0ID0gJm9wdGlkbWFfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrID0gMHgxZiwKIAkJLm13ZG1hX21hc2sgPSAweDA3LAogCQkucG9ydF9vcHMgPSAmb3B0aWRtYV9wb3J0X29wcwogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fODJjNzAwX3VkbWEgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fODJjNzAwX3VkbWEgPSB7CiAJCS5zaHQgPSAmb3B0aWRtYV9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLApAQCAtNTAxLDggKzQ5Nyw3IEBACiAJCS51ZG1hX21hc2sgPSAweDA3LAogCQkucG9ydF9vcHMgPSAmb3B0aXBsdXNfcG9ydF9vcHMKIAl9OwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdOwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvICppbmZvID0gJmluZm9fODJjNzAwOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm9fODJjNzAwLCBOVUxMIH07CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQpAQCAtNTE0LDEwICs1MDksOSBAQAogCXBjaV9jbG9jayA9IGluYigweDFGNSkgJiAxOwkJLyogMCA9IDMzTWh6LCAxID0gMjVNaHogKi8KIAogCWlmIChvcHRpcGx1c193aXRoX3VkbWEoZGV2KSkKLQkJaW5mbyA9ICZpbmZvXzgyYzcwMF91ZG1hOworCQlwcGlbMF0gPSAmaW5mb184MmM3MDBfdWRtYTsKIAotCXBvcnRfaW5mb1swXSA9IHBvcnRfaW5mb1sxXSA9IGluZm87Ci0JcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwb3J0X2luZm8sIDIpOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKGRldiwgcHBpKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG9wdGlkbWFbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BjbWNpYS5jCmluZGV4IDExMjQ1ZTMuLjRkNDRjNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYwpAQCAtMzk3LDYgKzM5Nyw3IEBACiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRPU0hJQkEiLCAiTUsyMDAxTVBMIiwgMHhiNDU4NWExYSwgMHgzNDg5ZTAwMyksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMSgiVFJBTlNDRU5EICAgIDUxMk0gICAiLCAweGQwOTA5NDQzKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVFJBTlNDRU5EIiwgIlRTMUdDRjgwIiwgMHg3MDliMWJmMSwgMHgyYTU0ZDRiMSksCisJUENNQ0lBX0RFVklDRV9QUk9EX0lEMTIoIlRSQU5TQ0VORCIsICJUUzJHQ0YxMjAiLCAweDcwOWIxYmYxLCAweDk2OWFhNGYyKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiVFJBTlNDRU5EIiwgIlRTNEdDRjEyMCIsIDB4NzA5YjFiZjEsIDB4ZjU0YTkxYzgpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJXSVQiLCAiSURFMTYiLCAweDI0NGU1OTk0LCAweDNlMjMyODUyKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiV0VJREEiLCAiVFdUVEkiLCAweGNjN2NmNjljLCAweDIxMmJiOTE4KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyeHhfb2xkLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMnh4X29sZC5jCmluZGV4IGVlNjM2YmUuLmVkYmFmOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyeHhfb2xkLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDJ4eF9vbGQuYwpAQCAtMjQ0LDEwICsyNDQsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHBkYzIwMjR4X3BvcnRfb3BzID0gewpAQCAtMzIxLDcgKzMxNyw3IEBACiAKIHN0YXRpYyBpbnQgcGRjMjAyeHhfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvWzNdID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvWzNdID0gewogCQl7CiAJCQkuc2h0ID0gJnBkYzIwMnh4X3NodCwKIAkJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULApAQCAtMzQ4LDkgKzM0NCw3IEBACiAJCX0KIAogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl07Ci0KLQlwb3J0X2luZm9bMF0gPSBwb3J0X2luZm9bMV0gPSAmaW5mb1tpZC0+ZHJpdmVyX2RhdGFdOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm9baWQtPmRyaXZlcl9kYXRhXSwgTlVMTCB9OwogCiAJaWYgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfUFJPTUlTRV8yMDI2NSkgewogCQlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlID0gZGV2LT5idXMtPnNlbGY7CkBAIC0zNjIsNyArMzU2LDcgQEAKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBvcnRfaW5mbywgMik7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwcGkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGRjMjAyeHhbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGxhdGZvcm0uYwppbmRleCBhMGE2NTBjLi4xZjYzODQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9wbGF0Zm9ybS5jCkBAIC00OCw2ICs0OCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXRhX2R1bW15X3JldDAoc3RydWN0IGF0YV9wb3J0ICphcCkJeyByZXR1cm4gMDsgfQorCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBwYXRhX3BsYXRmb3JtX3NodCA9IHsKIAkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJCT0gRFJWX05BTUUsCkBAIC05MSw3ICs5Myw3IEBACiAJLmlycV9vbgkJCT0gYXRhX2lycV9vbiwKIAkuaXJxX2FjawkJPSBhdGFfaXJxX2FjaywKIAotCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAorCS5wb3J0X3N0YXJ0CQk9IGF0YV9kdW1teV9yZXQwLAogfTsKIAogc3RhdGljIHZvaWQgcGF0YV9wbGF0Zm9ybV9zZXR1cF9wb3J0KHN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9yYWRpc3lzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYwppbmRleCAxYzU0NjczLi5iYTk2YjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYwpAQCAtMjAwLDEwICsyMDAsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHJhZGlzeXNfcGF0YV9vcHMgPSB7CkBAIC0yNTksNyArMjU1LDcgQEAKIHN0YXRpYyBpbnQgcmFkaXN5c19pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5zaHQJCT0gJnJhZGlzeXNfc2h0LAogCQkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwpAQCAtMjY3LDEzICsyNjMsMTMgQEAKIAkJLnVkbWFfbWFzawk9IDB4MTQsIC8qIFVETUEzMy82NiBvbmx5ICovCiAJCS5wb3J0X29wcwk9ICZyYWRpc3lzX3BhdGFfb3BzLAogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0gPSB7ICZpbmZvLCAmaW5mbyB9OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwKIAkJCSAgICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBwaSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCByYWRpc3lzX3BjaV90YmxbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jCmluZGV4IDg1YzQ1MjkuLjJiZmQ3ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9yejEwMDAuYwpAQCAtNDAsNyArNDAsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CiAJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKLQkJaWYgKGF0YV9kZXZfcmVhZHkoZGV2KSkgeworCQlpZiAoYXRhX2Rldl9lbmFibGVkKGRldikpIHsKIAkJCS8qIFdlIGRvbid0IHJlYWxseSBjYXJlICovCiAJCQlkZXYtPnBpb19tb2RlID0gWEZFUl9QSU9fMDsKIAkJCWRldi0+eGZlcl9tb2RlID0gWEZFUl9QSU9fMDsKQEAgLTY5LDEwICs2OSw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgcnoxMDAwX3BvcnRfb3BzID0gewpAQCAtMTM1LDIyICsxMzEsMjAgQEAKIHN0YXRpYyBpbnQgcnoxMDAwX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKLQlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydF9pbmZvWzJdOwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvID0gewogCQkuc2h0ID0gJnJ6MTAwMF9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLAogCQkucG9ydF9vcHMgPSAmcnoxMDAwX3BvcnRfb3BzCiAJfTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvLCBOVUxMIH07CiAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKIAotCWlmIChyejEwMDBfZmlmb19kaXNhYmxlKHBkZXYpID09IDApIHsKLQkJcG9ydF9pbmZvWzBdID0gJmluZm87Ci0JCXBvcnRfaW5mb1sxXSA9ICZpbmZvOwotCQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOwotCX0KKwlpZiAocnoxMDAwX2ZpZm9fZGlzYWJsZShwZGV2KSA9PSAwKQorCQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGkpOworCiAJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGZhaWxlZCB0byBkaXNhYmxlIHJlYWQtYWhlYWQgb24gY2hpcHNldC4uXG4iKTsKIAkvKiBOb3Qgc2FmZSB0byB1c2Ugc28gc2tpcCAqLwogCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMKaW5kZXggNjZlOGZmNC4uMjI1MDEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jCkBAIC0xOTQsMTAgKzE5NCw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgc2MxMjAwX3BvcnRfb3BzID0gewpAQCAtMjQ3LDcgKzI0Myw3IEBACiAKIHN0YXRpYyBpbnQgc2MxMjAwX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKIAkJLnNodCA9ICZzYzEyMDBfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC0yNTUsMTAgKzI1MSwxMCBAQAogCQkudWRtYV9tYXNrID0gMHgwNywKIAkJLnBvcnRfb3BzID0gJnNjMTIwMF9wb3J0X29wcwogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0gPSB7ICZpbmZvLCAmaW5mbyB9OwotCiAJLyogQ2FuJ3QgZW5hYmxlIHBvcnQgMiB5ZXQsIHNlZSB0b3AgY29tbWVudHMgKi8KLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBvcnRfaW5mbywgMSk7CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mbywgJmF0YV9kdW1teV9wb3J0X2luZm8gfTsKKworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKGRldiwgcHBpKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNjMTIwMFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zY2MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMKaW5kZXggMjAzZjQ2My4uY2NhM2FhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zY2MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jCkBAIC05ODQsMTAgKzk4NCw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgc2NjX3BhdGFfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jIGIvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jCmluZGV4IGI2ZTAyMDMuLmRlZTZlMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMKQEAgLTMxNSwxMCArMzE1LDYgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0JLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBzZXJ2ZXJ3b3Jrc19vc2I0X3BvcnRfb3BzID0gewpAQCAtNDc5LDggKzQ3NSw3IEBACiAKIHN0YXRpYyBpbnQgc2VydmVyd29ya3NfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgcG9ydHMgPSAyOwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvWzRdID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvWzRdID0gewogCQl7IC8qIE9TQjQgKi8KIAkJCS5zaHQgPSAmc2VydmVyd29ya3Nfc2h0LAogCQkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCkBAIC01MTEsOCArNTA2LDcgQEAKIAkJCS5wb3J0X29wcyA9ICZzZXJ2ZXJ3b3Jrc19jc2JfcG9ydF9vcHMKIAkJfQogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl07Ci0Jc3RydWN0IGF0YV9wb3J0X2luZm8gKmRldmluZm8gPSAmaW5mb1tpZC0+ZHJpdmVyX2RhdGFdOworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm9baWQtPmRyaXZlcl9kYXRhXSwgTlVMTCB9OwogCiAJLyogRm9yY2UgbWFzdGVyIGxhdGVuY3kgdGltZXIgdG8gNjQgUENJIGNsb2NrcyAqLwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgMHg0MCk7CkBAIC01MjEsNyArNTE1LDcgQEAKIAlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfT1NCNElERSkgewogCQkvKiBTZWxlY3Qgbm9uIFVETUEgY2FwYWJsZSBPU0I0IGlmIHdlIGNhbid0IGRvIGZpeHVwcyAqLwogCQlpZiAoIHNlcnZlcndvcmtzX2ZpeHVwX29zYjQocGRldikgPCAwKQotCQkJZGV2aW5mbyA9ICZpbmZvWzFdOworCQkJcHBpWzBdID0gJmluZm9bMV07CiAJfQogCS8qIHNldHVwIENTQjUvQ1NCNiA6IFNvdXRoIEJyaWRnZSBhbmQgSURFIG9wdGlvbiBSQUlEICovCiAJZWxzZSBpZiAoKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUpIHx8CkBAIC01MzEsMTEgKzUyNSwxMSBAQAogCQkgLyogSWYgdGhlIHJldHVybmVkIGJ0ciBpcyB0aGUgbmV3ZXIgcmV2aXNpb24gdGhlbgogCQkgICAgc2VsZWN0IHRoZSByaWdodCBpbmZvIGJsb2NrICovCiAJCSBpZiAoc2VydmVyd29ya3NfZml4dXBfY3NiKHBkZXYpID09IDMpCi0JCSAJZGV2aW5mbyA9ICZpbmZvWzNdOworCQkgCXBwaVswXSA9ICZpbmZvWzNdOwogCiAJCS8qIElzIHRoaXMgdGhlIDNyZCBjaGFubmVsIENTQjYgSURFID8gKi8KIAkJaWYgKHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjZJREUyKQotCQkJcG9ydHMgPSAxOworCQkJcHBpWzFdID0gJmF0YV9kdW1teV9wb3J0X2luZm87CiAJfQogCS8qIHNldHVwIEhUMTAwMEUgKi8KIAllbHNlIGlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19IVDEwMDBJREUpCkBAIC01NDQsOCArNTM4LDcgQEAKIAlpZiAocGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSkKIAkJYXRhX3BjaV9jbGVhcl9zaW1wbGV4KHBkZXYpOwogCi0JcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gZGV2aW5mbzsKLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIHBvcnRzKTsKKwlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwcGkpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwppbmRleCBhNTg4NmYwLi40NDBlMmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKQEAgLTIzMiwxMCArMjMyLDYgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBzaWw2ODBfcG9ydF9vcHMgPSB7CkBAIC0zNDUsNyArMzQxLDcgQEAKIAogc3RhdGljIGludCBzaWw2ODBfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKIHsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mbyA9IHsKIAkJLnNodCA9ICZzaWw2ODBfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrID0gMHgxZiwKQEAgLTM1Myw3ICszNDksNyBAQAogCQkudWRtYV9tYXNrID0gMHg3ZiwKIAkJLnBvcnRfb3BzID0gJnNpbDY4MF9wb3J0X29wcwogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm9fc2xvdyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19zbG93ID0gewogCQkuc2h0ID0gJnNpbDY4MF9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLApAQCAtMzYxLDcgKzM1Nyw3IEBACiAJCS51ZG1hX21hc2sgPSAweDNmLAogCQkucG9ydF9vcHMgPSAmc2lsNjgwX3BvcnRfb3BzCiAJfTsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXSA9IHsmaW5mbywgJmluZm99OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJmluZm8sIE5VTEwgfTsKIAlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCkBAIC0zNzAsMTIgKzM2NiwxMiBAQAogCXN3aXRjaChzaWw2ODBfaW5pdF9jaGlwKHBkZXYpKQogCXsKIAkJY2FzZSAwOgotCQkJcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gJmluZm9fc2xvdzsKKwkJCXBwaVswXSA9ICZpbmZvX3Nsb3c7CiAJCQlicmVhazsKIAkJY2FzZSAweDMwOgogCQkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBvcnRfaW5mbywgMik7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUocGRldiwgcHBpKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zaXMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKaW5kZXggZjU4MzhjYy4uZjIyMzEyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9zaXMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3Npcy5jCkBAIC0zOCw4ICszOCw4IEBACiAjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjUuMSIKIAogc3RydWN0IHNpc19jaGlwc2V0IHsKLQl1MTYgZGV2aWNlOwkJCS8qIFBDSSBob3N0IElEICovCi0Jc3RydWN0IGF0YV9wb3J0X2luZm8gKmluZm87CS8qIEluZm8gYmxvY2sgKi8KKwl1MTYgZGV2aWNlOwkJCQkvKiBQQ0kgaG9zdCBJRCAqLworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICppbmZvOwkvKiBJbmZvIGJsb2NrICovCiAJLyogUHJvYmFibHkgYWRkIGZhbWlseSwgY2FibGUgZGV0ZWN0IHR5cGUgZXRjIGhlcmUgdG8gY2xlYW4KIAkgICB1cCBjb2RlIGxhdGVyICovCiB9OwpAQCAtNTI0LDEwICs1MjQsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCi0jaWZkZWYgQ09ORklHX1BNCi0JLnJlc3VtZQkJCT0gYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZSwKLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLSNlbmRpZgogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIHNpc18xMzNfb3BzID0gewpAQCAtNzAwLDcgKzY5Niw3IEBACiAJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8gPSB7CiAJLnNodAkJPSAmc2lzX3NodCwKIAkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCkBAIC03MDgsNyArNzA0LDcgQEAKIAkudWRtYV9tYXNrCT0gMCwKIAkucG9ydF9vcHMJPSAmc2lzX29sZF9vcHMsCiB9Owotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHNpc19pbmZvMzMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8zMyA9IHsKIAkuc2h0CQk9ICZzaXNfc2h0LAogCS5mbGFncwkJPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KQEAgLTcxNiwzNSArNzEyLDM1IEBACiAJLnVkbWFfbWFzawk9IEFUQV9VRE1BMiwJLyogVURNQSAzMyAqLwogCS5wb3J0X29wcwk9ICZzaXNfb2xkX29wcywKIH07Ci1zdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm82NiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBzaXNfaW5mbzY2ID0gewogCS5zaHQJCT0gJnNpc19zaHQsCiAJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCS5waW9fbWFzawk9IDB4MWYsCS8qIHBpbzAtNCAqLwogCS51ZG1hX21hc2sJPSBBVEFfVURNQTQsCS8qIFVETUEgNjYgKi8KIAkucG9ydF9vcHMJPSAmc2lzXzY2X29wcywKIH07Ci1zdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8xMDAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8xMDAgPSB7CiAJLnNodAkJPSAmc2lzX3NodCwKIAkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJLnVkbWFfbWFzawk9IEFUQV9VRE1BNSwKIAkucG9ydF9vcHMJPSAmc2lzXzEwMF9vcHMsCiB9Owotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHNpc19pbmZvMTAwX2Vhcmx5ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIHNpc19pbmZvMTAwX2Vhcmx5ID0gewogCS5zaHQJCT0gJnNpc19zaHQsCiAJLmZsYWdzCQk9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCS51ZG1hX21hc2sJPSBBVEFfVURNQTUsCiAJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCiAJLnBvcnRfb3BzCT0gJnNpc182Nl9vcHMsCiB9Owotc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8xMzMgPSB7Citjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBzaXNfaW5mbzEzMyA9IHsKIAkuc2h0CQk9ICZzaXNfc2h0LAogCS5mbGFncwkJPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkucGlvX21hc2sJPSAweDFmLAkvKiBwaW8wLTQgKi8KIAkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAogCS5wb3J0X29wcwk9ICZzaXNfMTMzX29wcywKIH07Ci1zdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8xMzNfZWFybHkgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8xMzNfZWFybHkgPSB7CiAJLnNodAkJPSAmc2lzX3NodCwKIAkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJLnBpb19tYXNrCT0gMHgxZiwJLyogcGlvMC00ICovCkBAIC04MjcsOCArODIzLDggQEAKIHN0YXRpYyBpbnQgc2lzX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXTsKLQlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcG9ydDsKKwlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBwb3J0OworCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnBvcnQsIE5VTEwgfTsKIAlzdHJ1Y3QgcGNpX2RldiAqaG9zdCA9IE5VTEw7CiAJc3RydWN0IHNpc19jaGlwc2V0ICpjaGlwc2V0ID0gTlVMTDsKIAlzdHJ1Y3Qgc2lzX2NoaXBzZXQgKnNldHM7CkBAIC05NjgsMTMgKzk2NCwxMiBAQAogCWlmIChjaGlwc2V0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcG9ydCA9IGNoaXBzZXQtPmluZm87Ci0JcG9ydC0+cHJpdmF0ZV9kYXRhID0gY2hpcHNldDsKKwlwb3J0ID0gKmNoaXBzZXQtPmluZm87CisJcG9ydC5wcml2YXRlX2RhdGEgPSBjaGlwc2V0OwogCiAJc2lzX2ZpeHVwKHBkZXYsIGNoaXBzZXQpOwogCi0JcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gcG9ydDsKLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBwaSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzaXNfcGNpX3RibFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jIGIvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCmluZGV4IDlhZWZmZGIuLmY0ODQ5MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKQEAgLTMwMSwyMCArMzAxLDIyIEBACiAKIHN0YXRpYyBpbnQgc2w4MmMxMDVfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2RtYSA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gaW5mb19kbWEgPSB7CiAJCS5zaHQgPSAmc2w4MmMxMDVfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU1JTVCwKIAkJLnBpb19tYXNrID0gMHgxZiwKIAkJLm13ZG1hX21hc2sgPSAweDA3LAogCQkucG9ydF9vcHMgPSAmc2w4MmMxMDVfcG9ydF9vcHMKIAl9OwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2Vhcmx5ID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBpbmZvX2Vhcmx5ID0gewogCQkuc2h0ID0gJnNsODJjMTA1X3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1QsCiAJCS5waW9fbWFzayA9IDB4MWYsCiAJCS5wb3J0X29wcyA9ICZzbDgyYzEwNV9wb3J0X29wcwogCX07Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0gPSB7ICZpbmZvX2Vhcmx5LCAmaW5mb19lYXJseSB9OworCS8qIGZvciBub3cgdXNlIG9ubHkgdGhlIGZpcnN0IHBvcnQgKi8KKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7ICZpbmZvX2Vhcmx5LAorCQkJCQkgICAgICAgJmF0YV9kdW1teV9wb3J0X2luZm8gfTsKIAl1MzIgdmFsOwogCWludCByZXY7CiAKQEAgLTMyNCwxNyArMzI2LDE0IEBACiAJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmZGV2LT5kZXYsICJwYXRhX3NsODJjMTA1OiBVbmFibGUgdG8gZmluZCBicmlkZ2UsIGRpc2FibGluZyBETUEuXG4iKTsKIAllbHNlIGlmIChyZXYgPD0gNSkKIAkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZkZXYtPmRldiwgInBhdGFfc2w4MmMxMDU6IEVhcmx5IGJyaWRnZSByZXZpc2lvbiwgbm8gRE1BIGF2YWlsYWJsZS5cbiIpOwotCWVsc2UgewotCQlwb3J0X2luZm9bMF0gPSAmaW5mb19kbWE7Ci0JCXBvcnRfaW5mb1sxXSA9ICZpbmZvX2RtYTsKLQl9CisJZWxzZQorCQlwcGlbMF0gPSAmaW5mb19kbWE7CiAKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDQwLCAmdmFsKTsKIAl2YWwgfD0gQ1RSTF9QMEVOIHwgQ1RSTF9QMEYxNiB8IENUUkxfUDFGMTY7CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NDAsIHZhbCk7CiAKLQotCXJldHVybiBhdGFfcGNpX2luaXRfb25lKGRldiwgcG9ydF9pbmZvLCAxKTsgLyogRm9yIG5vdyAqLworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKGRldiwgcHBpKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNsODJjMTA1W10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3RyaWZsZXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jCmluZGV4IDM0OTg4N2IuLmIxZDMwNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jCkBAIC0xOTQsMTAgKzE5NCw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgdHJpZmxleF9wb3J0X29wcyA9IHsKQEAgLTIzNywyMCArMjMzLDIwIEBACiAKIHN0YXRpYyBpbnQgdHJpZmxleF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIGluZm8gPSB7CiAJCS5zaHQgPSAmdHJpZmxleF9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNULAogCQkucGlvX21hc2sgPSAweDFmLAogCQkubXdkbWFfbWFzayA9IDB4MDcsCiAJCS5wb3J0X29wcyA9ICZ0cmlmbGV4X3BvcnRfb3BzCiAJfTsKLQlzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnRfaW5mb1syXSA9IHsgJmluZm8sICZpbmZvIH07CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmaW5mbywgTlVMTCB9OwogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwogCiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShkZXYsIHBvcnRfaW5mbywgMik7CisJcmV0dXJuIGF0YV9wY2lfaW5pdF9vbmUoZGV2LCBwcGkpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgdHJpZmxleFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV92aWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMKaW5kZXggMzYyYmViMi4uZTRjNzFmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV92aWEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jCkBAIC0zMDEsMTAgKzMwMSw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgdmlhX3BvcnRfb3BzID0gewpAQCAtNDI1LDcgKzQyMSw3IEBACiBzdGF0aWMgaW50IHZpYV9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCS8qIEVhcmx5IFZJQSB3aXRob3V0IFVETUEgc3VwcG9ydCAqLwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB2aWFfbXdkbWFfaW5mbyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gdmlhX213ZG1hX2luZm8gPSB7CiAJCS5zaHQgPSAmdmlhX3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NFVFhGRVJfUE9MTElORywKIAkJLnBpb19tYXNrID0gMHgxZiwKQEAgLTQzMyw3ICs0MjksNyBAQAogCQkucG9ydF9vcHMgPSAmdmlhX3BvcnRfb3BzCiAJfTsKIAkvKiBEaXR0byB3aXRoIElSUSBtYXNraW5nIHJlcXVpcmVkICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHZpYV9td2RtYV9pbmZvX2JvcmtlZCA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gdmlhX213ZG1hX2luZm9fYm9ya2VkID0gewogCQkuc2h0ID0gJnZpYV9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TRVRYRkVSX1BPTExJTkcsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC00NDEsNyArNDM3LDcgQEAKIAkJLnBvcnRfb3BzID0gJnZpYV9wb3J0X29wc19ub2lycSwKIAl9OwogCS8qIFZJQSBVRE1BIDMzIGRldmljZXMgKGFuZCBib3JrZWQgNjYpICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHZpYV91ZG1hMzNfaW5mbyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gdmlhX3VkbWEzM19pbmZvID0gewogCQkuc2h0ID0gJnZpYV9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TRVRYRkVSX1BPTExJTkcsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC00NTAsNyArNDQ2LDcgQEAKIAkJLnBvcnRfb3BzID0gJnZpYV9wb3J0X29wcwogCX07CiAJLyogVklBIFVETUEgNjYgZGV2aWNlcyAqLwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB2aWFfdWRtYTY2X2luZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIHZpYV91ZG1hNjZfaW5mbyA9IHsKIAkJLnNodCA9ICZ2aWFfc2h0LAogCQkuZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTIHwgQVRBX0ZMQUdfU0VUWEZFUl9QT0xMSU5HLAogCQkucGlvX21hc2sgPSAweDFmLApAQCAtNDU5LDcgKzQ1NSw3IEBACiAJCS5wb3J0X29wcyA9ICZ2aWFfcG9ydF9vcHMKIAl9OwogCS8qIFZJQSBVRE1BIDEwMCBkZXZpY2VzICovCi0Jc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHZpYV91ZG1hMTAwX2luZm8gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIHZpYV91ZG1hMTAwX2luZm8gPSB7CiAJCS5zaHQgPSAmdmlhX3NodCwKIAkJLmZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NFVFhGRVJfUE9MTElORywKIAkJLnBpb19tYXNrID0gMHgxZiwKQEAgLTQ2OCw3ICs0NjQsNyBAQAogCQkucG9ydF9vcHMgPSAmdmlhX3BvcnRfb3BzCiAJfTsKIAkvKiBVRE1BMTMzIHdpdGggYmFkIEFTVCAoQWxsIGN1cnJlbnQgMTMzKSAqLwotCXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB2aWFfdWRtYTEzM19pbmZvID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB2aWFfdWRtYTEzM19pbmZvID0gewogCQkuc2h0ID0gJnZpYV9zaHQsCiAJCS5mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TRVRYRkVSX1BPTExJTkcsCiAJCS5waW9fbWFzayA9IDB4MWYsCkBAIC00NzYsNyArNDcyLDggQEAKIAkJLnVkbWFfbWFzayA9IDB4N2YsCS8qIEZJWE1FOiBzaG91bGQgY2hlY2sgbm9ydGggYnJpZGdlICovCiAJCS5wb3J0X29wcyA9ICZ2aWFfcG9ydF9vcHMKIAl9OwotCXN0cnVjdCBhdGFfcG9ydF9pbmZvICpwb3J0X2luZm9bMl0sICp0eXBlOworCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHR5cGU7CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmdHlwZSwgTlVMTCB9OwogCXN0cnVjdCBwY2lfZGV2ICppc2EgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCB2aWFfaXNhX2JyaWRnZSAqY29uZmlnOwogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOwpAQCAtNTIxLDI1ICs1MTgsMjUgQEAKIAlzd2l0Y2goY29uZmlnLT5mbGFncyAmIFZJQV9VRE1BKSB7CiAJCWNhc2UgVklBX1VETUFfTk9ORToKIAkJCWlmIChjb25maWctPmZsYWdzICYgVklBX05PX1VOTUFTSykKLQkJCQl0eXBlID0gJnZpYV9td2RtYV9pbmZvX2JvcmtlZDsKKwkJCQl0eXBlID0gdmlhX213ZG1hX2luZm9fYm9ya2VkOwogCQkJZWxzZQotCQkJCXR5cGUgPSAmdmlhX213ZG1hX2luZm87CisJCQkJdHlwZSA9IHZpYV9td2RtYV9pbmZvOwogCQkJYnJlYWs7CiAJCWNhc2UgVklBX1VETUFfMzM6Ci0JCQl0eXBlID0gJnZpYV91ZG1hMzNfaW5mbzsKKwkJCXR5cGUgPSB2aWFfdWRtYTMzX2luZm87CiAJCQlicmVhazsKIAkJY2FzZSBWSUFfVURNQV82NjoKLQkJCXR5cGUgPSAmdmlhX3VkbWE2Nl9pbmZvOworCQkJdHlwZSA9IHZpYV91ZG1hNjZfaW5mbzsKIAkJCS8qIFRoZSA2NiBNSHogZGV2aWNlcyByZXF1aXJlIHdlIGVuYWJsZSB0aGUgY2xvY2sgKi8KIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCAmdGltaW5nKTsKIAkJCXRpbWluZyB8PSAweDgwMDA4OwogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCB0aW1pbmcpOwogCQkJYnJlYWs7CiAJCWNhc2UgVklBX1VETUFfMTAwOgotCQkJdHlwZSA9ICZ2aWFfdWRtYTEwMF9pbmZvOworCQkJdHlwZSA9IHZpYV91ZG1hMTAwX2luZm87CiAJCQlicmVhazsKIAkJY2FzZSBWSUFfVURNQV8xMzM6Ci0JCQl0eXBlID0gJnZpYV91ZG1hMTMzX2luZm87CisJCQl0eXBlID0gdmlhX3VkbWExMzNfaW5mbzsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJV0FSTl9PTigxKTsKQEAgLTU1NCwxMCArNTUxLDkgQEAKIAl9CiAKIAkvKiBXZSBoYXZlIGVzdGFibGlzaGVkIHRoZSBkZXZpY2UgdHlwZSwgbm93IGZpcmUgaXQgdXAgKi8KLQl0eXBlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKWNvbmZpZzsKKwl0eXBlLnByaXZhdGVfZGF0YSA9ICh2b2lkICopY29uZmlnOwogCi0JcG9ydF9pbmZvWzBdID0gcG9ydF9pbmZvWzFdID0gdHlwZTsKLQlyZXR1cm4gYXRhX3BjaV9pbml0X29uZShwZGV2LCBwb3J0X2luZm8sIDIpOworCXJldHVybiBhdGFfcGNpX2luaXRfb25lKHBkZXYsIHBwaSk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfaW5pYzE2MnguYyBiL2RyaXZlcnMvYXRhL3NhdGFfaW5pYzE2MnguYwppbmRleCBiM2I2MmU5Li5iZGE1ZTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX2luaWMxNjJ4LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9pbmljMTYyeC5jCkBAIC0xMzUsMTAgKzEzNSw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGluaWNfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQgc2NyX21hcFtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9udi5jIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCmluZGV4IGEwOTc1OTUuLjRjZWEzZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX252LmMKQEAgLTMyNSwxMCArMzI1LDYgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIG52X2FkbWFfc2h0ID0gewpAQCAtMzQ3LDEwICszNDMsNiBAQAogCS5zbGF2ZV9jb25maWd1cmUJPSBudl9hZG1hX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbnZfZ2VuZXJpY19vcHMgPSB7CkBAIC00NjUsNyArNDU3LDcgQEAKIAkuaG9zdF9zdG9wCQk9IG52X2FkbWFfaG9zdF9zdG9wLAogfTsKIAotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIG52X3BvcnRfaW5mb1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIG52X3BvcnRfaW5mb1tdID0gewogCS8qIGdlbmVyaWMgKi8KIAl7CiAJCS5zaHQJCT0gJm52X3NodCwKQEAgLTE1NDUsNyArMTUzNyw3IEBACiBzdGF0aWMgaW50IG52X2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKIHsKIAlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbiA9IDA7Ci0JY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVsyXTsKKwljb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpW10gPSB7IE5VTEwsIE5VTEwgfTsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJc3RydWN0IG52X2hvc3RfcHJpdiAqaHByaXY7CiAJaW50IHJjOwpAQCAtMTU3Myw4ICsxNTY1LDggQEAKIAkJdHlwZSA9IEFETUE7CiAJfQogCi0JcHBpWzBdID0gcHBpWzFdID0gJm52X3BvcnRfaW5mb1t0eXBlXTsKLQlyYyA9IGF0YV9wY2lfcHJlcGFyZV9uYXRpdmVfaG9zdChwZGV2LCBwcGksIDIsICZob3N0KTsKKwlwcGlbMF0gPSAmbnZfcG9ydF9pbmZvW3R5cGVdOworCXJjID0gYXRhX3BjaV9wcmVwYXJlX25hdGl2ZV9ob3N0KHBkZXYsIHBwaSwgJmhvc3QpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwuYwppbmRleCAwYTFlNDE3Li5lODQ4M2FhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKQEAgLTE4MiwxMCArMTgyLDYgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBzaWxfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCmluZGV4IGI5N2VlOWYuLmE2OWQ3OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKQEAgLTM4MCwxMCArMzgwLDYgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAogCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCQk9IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBzaWwyNF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaXMuYwppbmRleCBkOGVlMDYyLi5lZTY2YzVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3Npcy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lzLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogCS5wb3J0X3N0YXJ0CQk9IGF0YV9wb3J0X3N0YXJ0LAogfTsKIAotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHNpc19wb3J0X2luZm8gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX3BvcnRfaW5mbyA9IHsKIAkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSwKIAkucGlvX21hc2sJPSAweDFmLAogCS5td2RtYV9tYXNrCT0gMHg3LApAQCAtMjU1LDcgKzI1NSw3IEBACiB7CiAJc3RhdGljIGludCBwcmludGVkX3ZlcnNpb247CiAJc3RydWN0IGF0YV9wb3J0X2luZm8gcGkgPSBzaXNfcG9ydF9pbmZvOwotCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbMl0gPSB7ICZwaSwgJnBpIH07CisJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBwaVtdID0geyAmcGksIE5VTEwgfTsKIAlzdHJ1Y3QgYXRhX2hvc3QgKmhvc3Q7CiAJdTMyIGdlbmN0bCwgdmFsOwogCXU4IHBtcjsKQEAgLTMzNSw3ICszMzUsNyBAQAogCQlicmVhazsKIAl9CiAKLQlyYyA9IGF0YV9wY2lfcHJlcGFyZV9uYXRpdmVfaG9zdChwZGV2LCBwcGksIDIsICZob3N0KTsKKwlyYyA9IGF0YV9wY2lfcHJlcGFyZV9uYXRpdmVfaG9zdChwZGV2LCBwcGksICZob3N0KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV91bGkuYyBiL2RyaXZlcnMvYXRhL3NhdGFfdWxpLmMKaW5kZXggZjc0ZTM4My4uMDA2ZjVlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV91bGkuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3VsaS5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAkucG9ydF9zdGFydAkJPSBhdGFfcG9ydF9zdGFydCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyB1bGlfcG9ydF9pbmZvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvIHVsaV9wb3J0X2luZm8gPSB7CiAJLmZsYWdzCQk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAogCQkJICBBVEFfRkxBR19JR05fU0lNUExFWCwKIAkucGlvX21hc2sgICAgICAgPSAweDFmLAkJLyogcGlvMC00ICovCkBAIC0yMDEsMTkgKzIwMSwzMyBAQAogCW5fcG9ydHMgPSAyOwogCWlmIChib2FyZF9pZHggPT0gdWxpXzUyODcpCiAJCW5fcG9ydHMgPSA0OwotCXJjID0gYXRhX3BjaV9wcmVwYXJlX25hdGl2ZV9ob3N0KHBkZXYsIHBwaSwgbl9wb3J0cywgJmhvc3QpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOworCisJLyogYWxsb2NhdGUgdGhlIGhvc3QgKi8KKwlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oJnBkZXYtPmRldiwgcHBpLCBuX3BvcnRzKTsKKwlpZiAoIWhvc3QpCisJCXJldHVybiAtRU5PTUVNOwogCiAJaHByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpocHJpdiksIEdGUF9LRVJORUwpOwogCWlmICghaHByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCWhvc3QtPnByaXZhdGVfZGF0YSA9IGhwcml2OwogCisJLyogdGhlIGZpcnN0IHR3byBwb3J0cyBhcmUgc3RhbmRhcmQgU0ZGICovCisJcmMgPSBhdGFfcGNpX2luaXRfbmF0aXZlX2hvc3QoaG9zdCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGF0YV9wY2lfaW5pdF9ibWRtYShob3N0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwogCWlvbWFwID0gaG9zdC0+aW9tYXA7CiAKIAlzd2l0Y2ggKGJvYXJkX2lkeCkgewogCWNhc2UgdWxpXzUyODc6CisJCS8qIElmIHRoZXJlIGFyZSBmb3VyLCB0aGUgbGFzdCB0d28gbGl2ZSByaWdodCBhZnRlcgorCQkgKiB0aGUgc3RhbmRhcmQgU0ZGIHBvcnRzLgorCQkgKi8KIAkJaHByaXYtPnNjcl9jZmdfYWRkclswXSA9IFVMSTUyODdfQkFTRTsKIAkJaHByaXYtPnNjcl9jZmdfYWRkclsxXSA9IFVMSTUyODdfQkFTRSArIFVMSTUyODdfT0ZGUzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV92aWEuYyBiL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKaW5kZXggOTM5YzkyNC4uZDEwNWQyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV92aWEuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCkBAIC0xMTYsMTAgKzExNiw2IEBACiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKIAkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZAkJPSBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZCwKLQkucmVzdW1lCQkJPSBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgdnQ2NDIwX3NhdGFfb3BzID0gewpAQCAtNDE1LDcgKzQxMSw3IEBACiAJc3RydWN0IGF0YV9ob3N0ICpob3N0OwogCWludCByYzsKIAotCXJjID0gYXRhX3BjaV9wcmVwYXJlX25hdGl2ZV9ob3N0KHBkZXYsIHBwaSwgMiwgJmhvc3QpOworCXJjID0gYXRhX3BjaV9wcmVwYXJlX25hdGl2ZV9ob3N0KHBkZXYsIHBwaSwgJmhvc3QpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCSpyX2hvc3QgPSBob3N0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2lzLmggYi9kcml2ZXJzL2F0YS9zaXMuaAppbmRleCAyMzFkYThmLi4wZjIyMDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zaXMuaAorKysgYi9kcml2ZXJzL2F0YS9zaXMuaApAQCAtMiw0ICsyLDQgQEAKIHN0cnVjdCBhdGFfcG9ydF9pbmZvOwogCiAvKiBwYXRhX3Npcy5jICovCi1leHRlcm4gc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8xMzM7CitleHRlcm4gY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gc2lzX2luZm8xMzM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9LY29uZmlnIGIvZHJpdmVycy9hdG0vS2NvbmZpZwppbmRleCAzMzY4NzQ1Li5mNWE0N2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYXRtL0tjb25maWcKQEAgLTIsMTkgKzIsMjIgQEAKICMgQVRNIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIkFUTSBkcml2ZXJzIgorbWVudWNvbmZpZyBBVE1fRFJJVkVSUworCWJvb2wgIkFUTSBkcml2ZXJzIgogCWRlcGVuZHMgb24gTkVUREVWSUNFUyAmJiBBVE0KKwlkZWZhdWx0IHkKKworaWYgQVRNX0RSSVZFUlMKIAogY29uZmlnIEFUTV9EVU1NWQogCXRyaXN0YXRlICJEdW1teSBBVE0gZHJpdmVyIgotCWRlcGVuZHMgb24gQVRNCiAJaGVscAogCSAgRHVtbXkgQVRNIGRyaXZlci4gVXNlZnVsIGZvciBwcm94eSBzaWduYWxsaW5nLCB0ZXN0aW5nLAogCSAgYW5kIGRldmVsb3BtZW50LiAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIEFUTV9UQ1AKIAl0cmlzdGF0ZSAiQVRNIG92ZXIgVENQIgotCWRlcGVuZHMgb24gSU5FVCAmJiBBVE0KKwlkZXBlbmRzIG9uIElORVQKIAloZWxwCiAJICBBVE0gb3ZlciBUQ1AgZHJpdmVyLiBVc2VmdWwgbWFpbmx5IGZvciBkZXZlbG9wbWVudCBhbmQgZm9yCiAJICBleHBlcmltZW50cy4gSWYgdW5zdXJlLCBzYXkgTi4KQEAgLTMwLDcgKzMzLDcgQEAKIAogY29uZmlnIEFUTV9FTkkKIAl0cmlzdGF0ZSAiRWZmaWNpZW50IE5ldHdvcmtzIEVOSTE1NVAiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgQVRNCisJZGVwZW5kcyBvbiBQQ0kKIAktLS1oZWxwLS0tCiAJICBEcml2ZXIgZm9yIHRoZSBFZmZpY2llbnQgTmV0d29ya3MgRU5JMTU1cCBzZXJpZXMgYW5kIFNNQyBBVE0KIAkgIFBvd2VyMTU1IDE1NSBNYnBzIEFUTSBhZGFwdGVycy4gQm90aCwgdGhlIHZlcnNpb25zIHdpdGggNTEyS0IgYW5kCkBAIC0xMzksNyArMTQyLDcgQEAKIAogY29uZmlnIEFUTV9GSVJFU1RSRUFNCiAJdHJpc3RhdGUgIkZ1aml0c3UgRmlyZVN0cmVhbSAoRlM1MC9GUzE1NSkgIgotCWRlcGVuZHMgb24gUENJICYmIEFUTQorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgRHJpdmVyIGZvciB0aGUgRnVqaXRzdSBGaXJlU3RyZWFtIDE1NSAoTUI4NjY5NykgYW5kCiAJICBGaXJlU3RyZWFtIDUwIChNQjg2Njk1KSBBVE0gUENJIGNoaXBzLgpAQCAtMTQ5LDcgKzE1Miw3IEBACiAKIGNvbmZpZyBBVE1fWkFUTQogCXRyaXN0YXRlICJaZWl0TmV0IFpOMTIyMS9aTjEyMjUiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgQVRNCisJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICBEcml2ZXIgZm9yIHRoZSBaZWl0TmV0IFpOMTIyMSAoTU1GKSBhbmQgWk4xMjI1IChVVFAtNSkgMTU1IE1icHMgQVRNCiAJICBhZGFwdGVycy4KQEAgLTE2OSw3ICsxNzIsNyBAQAogCiBjb25maWcgQVRNX05JQ1NUQVIKIAl0cmlzdGF0ZSAiSURUIDc3MjAxIChOSUNTdEFSKSAoRm9yZVJ1bm5lckxFKSIKLQlkZXBlbmRzIG9uIFBDSSAmJiBBVE0gJiYgITY0QklUCisJZGVwZW5kcyBvbiBQQ0kgJiYgITY0QklUCiAJaGVscAogCSAgVGhlIE5JQ1N0QVIgY2hpcHNldCBmYW1pbHkgaXMgdXNlZCBpbiBhIGxhcmdlIG51bWJlciBvZiBBVE0gTklDcyBmb3IKIAkgIDI1IGFuZCBmb3IgMTU1IE1icHMsIGluY2x1ZGluZyBJRFQgY2FyZHMgYW5kIHRoZSBGb3JlIEZvcmVSdW5uZXJMRQpAQCAtMjAyLDcgKzIwNSw3IEBACiAKIGNvbmZpZyBBVE1fSURUNzcyNTIKIAl0cmlzdGF0ZSAiSURUIDc3MjUyIChOSUNTdEFSIElJKSIKLQlkZXBlbmRzIG9uIFBDSSAmJiBBVE0KKwlkZXBlbmRzIG9uIFBDSQogCWhlbHAKIAkgIERyaXZlciBmb3IgdGhlIElEVCA3NzI1MiBBVE0gUENJIGNoaXBzLgogCkBAIC0yMzcsNyArMjQwLDcgQEAKIAogY29uZmlnIEFUTV9BTUJBU1NBRE9SCiAJdHJpc3RhdGUgIk1hZGdlIEFtYmFzc2Fkb3IgKENvbGxhZ2UgUENJIDE1NSBTZXJ2ZXIpIgotCWRlcGVuZHMgb24gUENJICYmIEFUTQorCWRlcGVuZHMgb24gUENJCiAJc2VsZWN0IEJJVFJFVkVSU0UKIAloZWxwCiAJICBUaGlzIGlzIGEgZHJpdmVyIGZvciBBVE1pemVyIGJhc2VkIEFUTSBjYXJkIHByb2R1Y2VkIGJ5IE1hZGdlCkBAIC0yNjIsNyArMjY1LDcgQEAKIAogY29uZmlnIEFUTV9IT1JJWk9OCiAJdHJpc3RhdGUgIk1hZGdlIEhvcml6b24gW1VsdHJhXSAoQ29sbGFnZSBQQ0kgMjUgYW5kIENvbGxhZ2UgUENJIDE1NSBDbGllbnQpIgotCWRlcGVuZHMgb24gUENJICYmIEFUTQorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEhvcml6b24gY2hpcHNldCBBVE0gYWRhcHRlciBjYXJkcyBvbmNlCiAJICBwcm9kdWNlZCBieSBNYWRnZSBOZXR3b3JrcyBMdGQuIFNheSBZIChvciBNIHRvIGNvbXBpbGUgYXMgYSBtb2R1bGUKQEAgLTI4Niw3ICsyODksNyBAQAogCiBjb25maWcgQVRNX0lBCiAJdHJpc3RhdGUgIkludGVycGhhc2UgQVRNIFBDSSB4NTc1L3g1MjUveDUzMSIKLQlkZXBlbmRzIG9uIFBDSSAmJiBBVE0gJiYgITY0QklUCisJZGVwZW5kcyBvbiBQQ0kgJiYgITY0QklUCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEludGVycGhhc2UgKGkpQ2hpcFNBUiBhZGFwdGVyIGNhcmRzCiAJICB3aGljaCBpbmNsdWRlIGEgdmFyaWV0eSBvZiB2YXJpYW50cyBpbiB0ZXJtIG9mIHRoZSBzaXplIG9mIHRoZQpAQCAtMzE5LDcgKzMyMiw3IEBACiAKIGNvbmZpZyBBVE1fRk9SRTIwMEVfTUFZQkUKIAl0cmlzdGF0ZSAiRk9SRSBTeXN0ZW1zIDIwMEUtc2VyaWVzIgotCWRlcGVuZHMgb24gKFBDSSB8fCBTQlVTKSAmJiBBVE0KKwlkZXBlbmRzIG9uIFBDSSB8fCBTQlVTCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIEZPUkUgU3lzdGVtcyAyMDBFLXNlcmllcyBBVE0gYWRhcHRlcgogCSAgY2FyZHMuIEl0IHNpbXVsdGFuZW91c2x5IHN1cHBvcnRzIFBDQS0yMDBFIGFuZCBTQkEtMjAwRSBtb2RlbHMKQEAgLTQzNiw3ICs0MzksNyBAQAogCiBjb25maWcgQVRNX0hFCiAJdHJpc3RhdGUgIkZvcmVSdW5uZXIgSEUgU2VyaWVzIgotCWRlcGVuZHMgb24gUENJICYmIEFUTQorCWRlcGVuZHMgb24gUENJCiAJaGVscAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIE1hcmNvbmkgRm9yZVJ1bm5lciBIRS1zZXJpZXMgQVRNIGFkYXB0ZXIKIAkgIGNhcmRzLiBJdCBzaW11bHRhbmVvdXNseSBzdXBwb3J0cyB0aGUgMTU1IGFuZCA2MjIgdmVyc2lvbnMuCkBAIC00NDgsNSArNDUxLDQgQEAKIAkgIFN1cHBvcnQgZm9yIHRoZSBTL1VOSS1VbHRyYSBhbmQgUy9VTkktNjIyIGZvdW5kIGluIHRoZSBGb3JlUnVubmVyCiAJICBIRSBjYXJkcy4gIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGNhcnJpZXIgZGV0ZWN0aW9uIHNvbWUgc3RhdGlzdGljcy4KIAotZW5kbWVudQotCitlbmRpZiAjIEFUTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9sb29wLmMgYi9kcml2ZXJzL2Jsb2NrL2xvb3AuYwppbmRleCAxOGNkZDhjLi5lMmZjNGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2xvb3AuYwpAQCAtMTMxNywxOCArMTMxNyw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBsb29wX2RldmljZSAqbG9vcF9maW5kX2RldihpbnQgbnVtYmVyKQotewotCXN0cnVjdCBsb29wX2RldmljZSAqbG87Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvLCAmbG9vcF9kZXZpY2VzLCBsb19saXN0KSB7Ci0JCWlmIChsby0+bG9fbnVtYmVyID09IG51bWJlcikKLQkJCXJldHVybiBsbzsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvb3BfaW5pdF9vbmUoaW50IGkpOwogc3RhdGljIGludCBsb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7CkBAIC0xMzM3LDExICsxMzI1LDYgQEAKIAlsby0+bG9fcmVmY250Kys7CiAJbXV0ZXhfdW5sb2NrKCZsby0+bG9fY3RsX211dGV4KTsKIAotCW11dGV4X2xvY2soJmxvb3BfZGV2aWNlc19tdXRleCk7Ci0JaWYgKCFsb29wX2ZpbmRfZGV2KGxvLT5sb19udW1iZXIgKyAxKSkKLQkJbG9vcF9pbml0X29uZShsby0+bG9fbnVtYmVyICsgMSk7Ci0JbXV0ZXhfdW5sb2NrKCZsb29wX2RldmljZXNfbXV0ZXgpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NDgsNyArMTQzMSw3IEBACiBvdXRfZnJlZV9kZXY6CiAJa2ZyZWUobG8pOwogb3V0OgotCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBsb29wX2RlbF9vbmUoc3RydWN0IGxvb3BfZGV2aWNlICpsbykKQEAgLTE0NjAsMzYgKzE0NDMsMzAgQEAKIAlrZnJlZShsbyk7CiB9CiAKK3N0YXRpYyBpbnQgbG9vcF9sb2NrKGRldl90IGRldiwgdm9pZCAqZGF0YSkKK3sKKwltdXRleF9sb2NrKCZsb29wX2RldmljZXNfbXV0ZXgpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGtvYmplY3QgKmxvb3BfcHJvYmUoZGV2X3QgZGV2LCBpbnQgKnBhcnQsIHZvaWQgKmRhdGEpCiB7Ci0JdW5zaWduZWQgaW50IG51bWJlciA9IGRldiAmIE1JTk9STUFTSzsKLQlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvOworCXN0cnVjdCBsb29wX2RldmljZSAqbG8gPSBsb29wX2luaXRfb25lKGRldiAmIE1JTk9STUFTSyk7CisJc3RydWN0IGtvYmplY3QgKmtvYmo7CiAKLQltdXRleF9sb2NrKCZsb29wX2RldmljZXNfbXV0ZXgpOwotCWxvID0gbG9vcF9maW5kX2RldihudW1iZXIpOwotCWlmIChsbyA9PSBOVUxMKQotCQlsbyA9IGxvb3BfaW5pdF9vbmUobnVtYmVyKTsKKwlrb2JqID0gbG8gPyBnZXRfZGlzayhsby0+bG9fZGlzaykgOiBFUlJfUFRSKC1FTk9NRU0pOwogCW11dGV4X3VubG9jaygmbG9vcF9kZXZpY2VzX211dGV4KTsKIAogCSpwYXJ0ID0gMDsKLQlpZiAoSVNfRVJSKGxvKSkKLQkJcmV0dXJuICh2b2lkICopbG87Ci0JZWxzZQotCQlyZXR1cm4gJmxvLT5sb19kaXNrLT5rb2JqOworCXJldHVybiBrb2JqOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBsb29wX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvOwotCiAJaWYgKHJlZ2lzdGVyX2Jsa2RldihMT09QX01BSk9SLCAibG9vcCIpKQogCQlyZXR1cm4gLUVJTzsKIAlibGtfcmVnaXN0ZXJfcmVnaW9uKE1LREVWKExPT1BfTUFKT1IsIDApLCAxVUwgPDwgTUlOT1JCSVRTLAotCQkJCSAgVEhJU19NT0RVTEUsIGxvb3BfcHJvYmUsIE5VTEwsIE5VTEwpOwotCi0JbG8gPSBsb29wX2luaXRfb25lKDApOwotCWlmIChJU19FUlIobG8pKQotCQlnb3RvIG91dDsKKwkJCQkgIFRISVNfTU9EVUxFLCBsb29wX3Byb2JlLCBsb29wX2xvY2ssIE5VTEwpOwogCiAJaWYgKG1heF9sb29wKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImxvb3A6IHRoZSBtYXhfbG9vcCBvcHRpb24gaXMgb2Jzb2xldGUgIgpAQCAtMTQ5OCwxMSArMTQ3NSw2IEBACiAJfQogCXByaW50ayhLRVJOX0lORk8gImxvb3A6IG1vZHVsZSBsb2FkZWRcbiIpOwogCXJldHVybiAwOwotCi1vdXQ6Ci0JdW5yZWdpc3Rlcl9ibGtkZXYoTE9PUF9NQUpPUiwgImxvb3AiKTsKLQlwcmludGsoS0VSTl9FUlIgImxvb3A6IHJhbiBvdXQgb2YgbWVtb3J5XG4iKTsKLQlyZXR1cm4gLUVOT01FTTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGxvb3BfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYwppbmRleCAwZjQyMDNiLi42MDU1YjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYwpAQCAtMzA3LDcgKzMwNyw5IEBACiAKIAlpZiAoaHUpIHsKIAkJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBodS0+aGRldjsKLQkJaGNpX3VhcnRfY2xvc2UoaGRldik7CisKKwkJaWYgKGhkZXYpCisJCQloY2lfdWFydF9jbG9zZShoZGV2KTsKIAogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9VQVJUX1BST1RPX1NFVCwgJmh1LT5mbGFncykpIHsKIAkJCWh1LT5wcm90by0+Y2xvc2UoaHUpOwpAQCAtNDczLDEyICs0NzUsMTggQEAKIAkJCXR0eS0+bG93X2xhdGVuY3kgPSAxOwogCQl9IGVsc2UKIAkJCXJldHVybiAtRUJVU1k7CisJCWJyZWFrOwogCiAJY2FzZSBIQ0lVQVJUR0VUUFJPVE86CiAJCWlmICh0ZXN0X2JpdChIQ0lfVUFSVF9QUk9UT19TRVQsICZodS0+ZmxhZ3MpKQogCQkJcmV0dXJuIGh1LT5wcm90by0+aWQ7CiAJCXJldHVybiAtRVVOQVRDSDsKIAorCWNhc2UgSENJVUFSVEdFVERFVklDRToKKwkJaWYgKHRlc3RfYml0KEhDSV9VQVJUX1BST1RPX1NFVCwgJmh1LT5mbGFncykpCisJCQlyZXR1cm4gaHUtPmhkZXYtPmlkOworCQlyZXR1cm4gLUVVTkFUQ0g7CisKIAlkZWZhdWx0OgogCQllcnIgPSBuX3R0eV9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdWFydC5oIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VhcnQuaAppbmRleCBiMjUwZTY3Li4xMDk3Y2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdWFydC5oCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91YXJ0LmgKQEAgLTI4LDggKzI4LDkgQEAKICNlbmRpZgogCiAvKiBJb2N0bHMgKi8KLSNkZWZpbmUgSENJVUFSVFNFVFBST1RPCV9JT1coJ1UnLCAyMDAsIGludCkKLSNkZWZpbmUgSENJVUFSVEdFVFBST1RPCV9JT1IoJ1UnLCAyMDEsIGludCkKKyNkZWZpbmUgSENJVUFSVFNFVFBST1RPCQlfSU9XKCdVJywgMjAwLCBpbnQpCisjZGVmaW5lIEhDSVVBUlRHRVRQUk9UTwkJX0lPUignVScsIDIwMSwgaW50KQorI2RlZmluZSBIQ0lVQVJUR0VUREVWSUNFCV9JT1IoJ1UnLCAyMDIsIGludCkKIAogLyogVUFSVCBwcm90b2NvbHMgKi8KICNkZWZpbmUgSENJX1VBUlRfTUFYX1BST1RPCTQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCmluZGV4IGM5ZjBmMjUuLjgwMWFiZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJCXByaW50ayhLRVJOX0VSUiBQRlggIkFwZXJ0dXJlIHRvbyBzbWFsbCAoJWQgTUIpXG4iLCBzaXplPj4yMCk7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoYXBlciArIHNpemUgPiAweGZmZmZmZmZmKSB7CisgICAgICAgaWYgKCh1NjQpYXBlciArIHNpemUgPiAweDEwMDAwMDAwMFVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJBcGVydHVyZSBvdXQgb2YgYm91bmRzXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zaV9pbnRmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwppbmRleCA2YzVkMTVkLi43OGUxYjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYwpAQCAtMTkxNSwxMCArMTkxNSwxMCBAQAogCiAJaWYgKHNwbWktPmFkZHIuc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkgewogCQlpbmZvLT5pb19zZXR1cCA9IG1lbV9zZXR1cDsKLQkJaW5mby0+aW8uYWRkcl90eXBlID0gSVBNSV9JT19BRERSX1NQQUNFOworCQlpbmZvLT5pby5hZGRyX3R5cGUgPSBJUE1JX01FTV9BRERSX1NQQUNFOwogCX0gZWxzZSBpZiAoc3BtaS0+YWRkci5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pIHsKIAkJaW5mby0+aW9fc2V0dXAgPSBwb3J0X3NldHVwOwotCQlpbmZvLT5pby5hZGRyX3R5cGUgPSBJUE1JX01FTV9BRERSX1NQQUNFOworCQlpbmZvLT5pby5hZGRyX3R5cGUgPSBJUE1JX0lPX0FERFJfU1BBQ0U7CiAJfSBlbHNlIHsKIAkJa2ZyZWUoaW5mbyk7CiAJCXByaW50aygiaXBtaV9zaTogVW5rbm93biBBQ1BJIEkvTyBBZGRyZXNzIHR5cGVcbiIpOwpAQCAtMjk3NCw2ICsyOTc0LDEwIEBACiAjaWZkZWYgQ09ORklHX1BDSQogCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlwbWlfcGNpX2RyaXZlcik7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19QUENfT0YKKwkJb2ZfdW5yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJmlwbWlfb2ZfcGxhdGZvcm1fZHJpdmVyKTsKKyNlbmRpZgogCQlkcml2ZXJfdW5yZWdpc3RlcigmaXBtaV9kcml2ZXIpOwogCQlwcmludGsoImlwbWlfc2k6IFVuYWJsZSB0byBmaW5kIGFueSBTeXN0ZW0gSW50ZXJmYWNlKHMpXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl90dHkuYyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCmluZGV4IDZhYzNjYTQuLmIzZDRjY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9uX3R0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9uX3R0eS5jCkBAIC0xNTQ0LDIxICsxNTQ0LDE4IEBACiB9CiAKIHN0cnVjdCB0dHlfbGRpc2MgdHR5X2xkaXNjX05fVFRZID0gewotCVRUWV9MRElTQ19NQUdJQywJLyogbWFnaWMgKi8KLQkibl90dHkiLAkJLyogbmFtZSAqLwotCTAsCQkJLyogbnVtICovCi0JMCwJCQkvKiBmbGFncyAqLwotCW5fdHR5X29wZW4sCQkvKiBvcGVuICovCi0Jbl90dHlfY2xvc2UsCQkvKiBjbG9zZSAqLwotCW5fdHR5X2ZsdXNoX2J1ZmZlciwJLyogZmx1c2hfYnVmZmVyICovCi0Jbl90dHlfY2hhcnNfaW5fYnVmZmVyLAkvKiBjaGFyc19pbl9idWZmZXIgKi8KLQlyZWFkX2NoYW4sCQkvKiByZWFkICovCi0Jd3JpdGVfY2hhbiwJCS8qIHdyaXRlICovCi0Jbl90dHlfaW9jdGwsCQkvKiBpb2N0bCAqLwotCW5fdHR5X3NldF90ZXJtaW9zLAkvKiBzZXRfdGVybWlvcyAqLwotCW5vcm1hbF9wb2xsLAkJLyogcG9sbCAqLwotCU5VTEwsCQkJLyogaGFuZ3VwICovCi0Jbl90dHlfcmVjZWl2ZV9idWYsCS8qIHJlY2VpdmVfYnVmICovCi0Jbl90dHlfd3JpdGVfd2FrZXVwCS8qIHdyaXRlX3dha2V1cCAqLworCS5tYWdpYyAgICAgICAgICAgPSBUVFlfTERJU0NfTUFHSUMsCisJLm5hbWUgICAgICAgICAgICA9ICJuX3R0eSIsCisJLm9wZW4gICAgICAgICAgICA9IG5fdHR5X29wZW4sCisJLmNsb3NlICAgICAgICAgICA9IG5fdHR5X2Nsb3NlLAorCS5mbHVzaF9idWZmZXIgICAgPSBuX3R0eV9mbHVzaF9idWZmZXIsCisJLmNoYXJzX2luX2J1ZmZlciA9IG5fdHR5X2NoYXJzX2luX2J1ZmZlciwKKwkucmVhZCAgICAgICAgICAgID0gcmVhZF9jaGFuLAorCS53cml0ZSAgICAgICAgICAgPSB3cml0ZV9jaGFuLAorCS5pb2N0bCAgICAgICAgICAgPSBuX3R0eV9pb2N0bCwKKwkuc2V0X3Rlcm1pb3MgICAgID0gbl90dHlfc2V0X3Rlcm1pb3MsCisJLnBvbGwgICAgICAgICAgICA9IG5vcm1hbF9wb2xsLAorCS5yZWNlaXZlX2J1ZiAgICAgPSBuX3R0eV9yZWNlaXZlX2J1ZiwKKwkud3JpdGVfd2FrZXVwICAgID0gbl90dHlfd3JpdGVfd2FrZXVwCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2NtZC5jIGIvZHJpdmVycy9jaGFyL3Jpby9yaW9jbWQuYwppbmRleCAyNDVmMDMxLi44Y2M2MGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmlvL3Jpb2NtZC5jCisrKyBiL2RyaXZlcnMvY2hhci9yaW8vcmlvY21kLmMKQEAgLTQwMiw3ICs0MDIsNyBAQAogCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiQ09OVFJPTCBpbmZvcm1hdGlvbjogSG9zdCBudW1iZXIgJVpkLCBuYW1lIGBgJXMnJ1xuIiwgSG9zdFAgLSBwLT5SSU9Ib3N0cywgSG9zdFAtPk5hbWUpOwogCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiQ09OVFJPTCBpbmZvcm1hdGlvbjogUnVwIG51bWJlciAgMHgleFxuIiwgcnVwKTsKIAotCQlpZiAoUnVwID49ICh1bnNpZ25lZCBzaG9ydCkgTUFYX1JVUCkgeworCQlpZiAoUnVwIDwgKHVuc2lnbmVkIHNob3J0KSBNQVhfUlVQKSB7CiAJCQlyaW9fZHByaW50ayhSSU9fREVCVUdfQ01ELCAiQ09OVFJPTCBpbmZvcm1hdGlvbjogVGhpcyBpcyB0aGUgUlVQIGZvciBSVEEgYGAlcycnXG4iLCBIb3N0UC0+TWFwcGluZ1tSdXBdLk5hbWUpOwogCQl9IGVsc2UKIAkJCXJpb19kcHJpbnRrKFJJT19ERUJVR19DTUQsICJDT05UUk9MIGluZm9ybWF0aW9uOiBUaGlzIGlzIHRoZSBSVVAgZm9yIGxpbmsgYGAlYycnIG9mIGhvc3QgYGAlcycnXG4iLCAoJ0EnICsgUnVwIC0gTUFYX1JVUCksIEhvc3RQLT5OYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXQuYyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwppbmRleCA2MWE2M2RhLi5hM2ZkN2U3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldC5jCkBAIC0xMDE0LDkgKzEwMTQsNiBAQAogCS8qCiAJICogSW5mby0+Y291bnQgaXMgbm93IDE7IHNvIGl0J3Mgc2FmZSB0byBzbGVlcCBub3cuCiAJICovCi0JaW5mby0+c2Vzc2lvbiA9IHByb2Nlc3Nfc2Vzc2lvbihjdXJyZW50KTsKLQlpbmZvLT5wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKLQogCWlmICgoaW5mby0+ZmxhZ3MgJiBST0NLRVRfSU5JVElBTElaRUQpID09IDApIHsKIAkJY3AgPSAmaW5mby0+Y2hhbm5lbDsKIAkJc1NldFJ4VHJpZ2dlcihjcCwgVFJJR18xKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXRfaW50LmggYi9kcml2ZXJzL2NoYXIvcm9ja2V0X2ludC5oCmluZGV4IDg5YjRkN2IuLmI0YzUzZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yb2NrZXRfaW50LmgKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldF9pbnQuaApAQCAtMTE1OCw4ICsxMTU4LDYgQEAKIAlpbnQgeG1pdF9oZWFkOwogCWludCB4bWl0X3RhaWw7CiAJaW50IHhtaXRfY250OwotCWludCBzZXNzaW9uOwotCWludCBwZ3JwOwogCWludCBjZF9zdGF0dXM7CiAJaW50IGlnbm9yZV9zdGF0dXNfbWFzazsKIAlpbnQgcmVhZF9zdGF0dXNfbWFzazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zbnNjX2V2ZW50LmMgYi9kcml2ZXJzL2NoYXIvc25zY19ldmVudC5jCmluZGV4IDJmNTZlOGMuLjFiNzViMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zbnNjX2V2ZW50LmMKKysrIGIvZHJpdmVycy9jaGFyL3Nuc2NfZXZlbnQuYwpAQCAtMjAzLDggKzIwMyw2IEBACiAJY2xhc3MgPSAoY29kZSAmIEVWX0NMQVNTX01BU0spOwogCiAJaWYgKGNsYXNzID09IEVWX0NMQVNTX1BXUkRfTk9USUZZIHx8IGNvZGUgPT0gRU5WX1BXUkROX1BFTkQpIHsKLQkJc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCiAJCWlmIChzbnNjX3NodXR0aW5nX2Rvd24pCiAJCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rX2d0LmMKaW5kZXggMmE3NzM2Yi4uMDJiNDliYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rX2d0LmMKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rX2d0LmMKQEAgLTExNzEsNiArMTE3MSwxMTIgQEAKIH0KIAogLyoKKyAqIHN1cHBvcnQgZm9yIDMyIGJpdCBpb2N0bCBjYWxscyBvbiA2NCBiaXQgc3lzdGVtcworICovCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGxvbmcgZ2V0X3BhcmFtczMyKHN0cnVjdCBzbGd0X2luZm8gKmluZm8sIHN0cnVjdCBNR1NMX1BBUkFNUzMyIF9fdXNlciAqdXNlcl9wYXJhbXMpCit7CisJc3RydWN0IE1HU0xfUEFSQU1TMzIgdG1wX3BhcmFtczsKKworCURCR0lORk8oKCIlcyBnZXRfcGFyYW1zMzJcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisJdG1wX3BhcmFtcy5tb2RlICAgICAgICAgICAgPSAoY29tcGF0X3Vsb25nX3QpaW5mby0+cGFyYW1zLm1vZGU7CisJdG1wX3BhcmFtcy5sb29wYmFjayAgICAgICAgPSBpbmZvLT5wYXJhbXMubG9vcGJhY2s7CisJdG1wX3BhcmFtcy5mbGFncyAgICAgICAgICAgPSBpbmZvLT5wYXJhbXMuZmxhZ3M7CisJdG1wX3BhcmFtcy5lbmNvZGluZyAgICAgICAgPSBpbmZvLT5wYXJhbXMuZW5jb2Rpbmc7CisJdG1wX3BhcmFtcy5jbG9ja19zcGVlZCAgICAgPSAoY29tcGF0X3Vsb25nX3QpaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkOworCXRtcF9wYXJhbXMuYWRkcl9maWx0ZXIgICAgID0gaW5mby0+cGFyYW1zLmFkZHJfZmlsdGVyOworCXRtcF9wYXJhbXMuY3JjX3R5cGUgICAgICAgID0gaW5mby0+cGFyYW1zLmNyY190eXBlOworCXRtcF9wYXJhbXMucHJlYW1ibGVfbGVuZ3RoID0gaW5mby0+cGFyYW1zLnByZWFtYmxlX2xlbmd0aDsKKwl0bXBfcGFyYW1zLnByZWFtYmxlICAgICAgICA9IGluZm8tPnBhcmFtcy5wcmVhbWJsZTsKKwl0bXBfcGFyYW1zLmRhdGFfcmF0ZSAgICAgICA9IChjb21wYXRfdWxvbmdfdClpbmZvLT5wYXJhbXMuZGF0YV9yYXRlOworCXRtcF9wYXJhbXMuZGF0YV9iaXRzICAgICAgID0gaW5mby0+cGFyYW1zLmRhdGFfYml0czsKKwl0bXBfcGFyYW1zLnN0b3BfYml0cyAgICAgICA9IGluZm8tPnBhcmFtcy5zdG9wX2JpdHM7CisJdG1wX3BhcmFtcy5wYXJpdHkgICAgICAgICAgPSBpbmZvLT5wYXJhbXMucGFyaXR5OworCWlmIChjb3B5X3RvX3VzZXIodXNlcl9wYXJhbXMsICZ0bXBfcGFyYW1zLCBzaXplb2Yoc3RydWN0IE1HU0xfUEFSQU1TMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIHNldF9wYXJhbXMzMihzdHJ1Y3Qgc2xndF9pbmZvICppbmZvLCBzdHJ1Y3QgTUdTTF9QQVJBTVMzMiBfX3VzZXIgKm5ld19wYXJhbXMpCit7CisJc3RydWN0IE1HU0xfUEFSQU1TMzIgdG1wX3BhcmFtczsKKworCURCR0lORk8oKCIlcyBzZXRfcGFyYW1zMzJcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXBfcGFyYW1zLCBuZXdfcGFyYW1zLCBzaXplb2Yoc3RydWN0IE1HU0xfUEFSQU1TMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzcGluX2xvY2soJmluZm8tPmxvY2spOworCWluZm8tPnBhcmFtcy5tb2RlICAgICAgICAgICAgPSB0bXBfcGFyYW1zLm1vZGU7CisJaW5mby0+cGFyYW1zLmxvb3BiYWNrICAgICAgICA9IHRtcF9wYXJhbXMubG9vcGJhY2s7CisJaW5mby0+cGFyYW1zLmZsYWdzICAgICAgICAgICA9IHRtcF9wYXJhbXMuZmxhZ3M7CisJaW5mby0+cGFyYW1zLmVuY29kaW5nICAgICAgICA9IHRtcF9wYXJhbXMuZW5jb2Rpbmc7CisJaW5mby0+cGFyYW1zLmNsb2NrX3NwZWVkICAgICA9IHRtcF9wYXJhbXMuY2xvY2tfc3BlZWQ7CisJaW5mby0+cGFyYW1zLmFkZHJfZmlsdGVyICAgICA9IHRtcF9wYXJhbXMuYWRkcl9maWx0ZXI7CisJaW5mby0+cGFyYW1zLmNyY190eXBlICAgICAgICA9IHRtcF9wYXJhbXMuY3JjX3R5cGU7CisJaW5mby0+cGFyYW1zLnByZWFtYmxlX2xlbmd0aCA9IHRtcF9wYXJhbXMucHJlYW1ibGVfbGVuZ3RoOworCWluZm8tPnBhcmFtcy5wcmVhbWJsZSAgICAgICAgPSB0bXBfcGFyYW1zLnByZWFtYmxlOworCWluZm8tPnBhcmFtcy5kYXRhX3JhdGUgICAgICAgPSB0bXBfcGFyYW1zLmRhdGFfcmF0ZTsKKwlpbmZvLT5wYXJhbXMuZGF0YV9iaXRzICAgICAgID0gdG1wX3BhcmFtcy5kYXRhX2JpdHM7CisJaW5mby0+cGFyYW1zLnN0b3BfYml0cyAgICAgICA9IHRtcF9wYXJhbXMuc3RvcF9iaXRzOworCWluZm8tPnBhcmFtcy5wYXJpdHkgICAgICAgICAgPSB0bXBfcGFyYW1zLnBhcml0eTsKKwlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisKKyAJY2hhbmdlX3BhcmFtcyhpbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBzbGd0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc2xndF9pbmZvICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmMgPSAtRU5PSU9DVExDTUQ7CisKKwlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgImNvbXBhdF9pb2N0bCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlEQkdJTkZPKCgiJXMgY29tcGF0X2lvY3RsKCkgY21kPSUwOFhcbiIsIGluZm8tPmRldmljZV9uYW1lLCBjbWQpKTsKKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIE1HU0xfSU9DU1BBUkFNUzMyOgorCQlyYyA9IHNldF9wYXJhbXMzMihpbmZvLCBjb21wYXRfcHRyKGFyZykpOworCQlicmVhazsKKworCWNhc2UgTUdTTF9JT0NHUEFSQU1TMzI6CisJCXJjID0gZ2V0X3BhcmFtczMyKGluZm8sIGNvbXBhdF9wdHIoYXJnKSk7CisJCWJyZWFrOworCisJY2FzZSBNR1NMX0lPQ0dQQVJBTVM6CisJY2FzZSBNR1NMX0lPQ1NQQVJBTVM6CisJY2FzZSBNR1NMX0lPQ0dUWElETEU6CisJY2FzZSBNR1NMX0lPQ0dTVEFUUzoKKwljYXNlIE1HU0xfSU9DV0FJVEVWRU5UOgorCWNhc2UgTUdTTF9JT0NHSUY6CisJY2FzZSBNR1NMX0lPQ1NHUElPOgorCWNhc2UgTUdTTF9JT0NHR1BJTzoKKwljYXNlIE1HU0xfSU9DV0FJVEdQSU86CisJY2FzZSBUSU9DR0lDT1VOVDoKKwkJcmMgPSBpb2N0bCh0dHksIGZpbGUsIGNtZCwgKHVuc2lnbmVkIGxvbmcpKGNvbXBhdF9wdHIoYXJnKSkpOworCQlicmVhazsKKworCWNhc2UgTUdTTF9JT0NTVFhJRExFOgorCWNhc2UgTUdTTF9JT0NUWEVOQUJMRToKKwljYXNlIE1HU0xfSU9DUlhFTkFCTEU6CisJY2FzZSBNR1NMX0lPQ1RYQUJPUlQ6CisJY2FzZSBUSU9DTUlXQUlUOgorCWNhc2UgTUdTTF9JT0NTSUY6CisJCXJjID0gaW9jdGwodHR5LCBmaWxlLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCX0KKworCURCR0lORk8oKCIlcyBjb21wYXRfaW9jdGwoKSBjbWQ9JTA4WCByYz0lZFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIGNtZCwgcmMpKTsKKwlyZXR1cm4gcmM7Cit9CisjZWxzZQorI2RlZmluZSBzbGd0X2NvbXBhdF9pb2N0bCBOVUxMCisjZW5kaWYgLyogaWZkZWYgQ09ORklHX0NPTVBBVCAqLworCisvKgogICogcHJvYyBmcyBzdXBwb3J0CiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGxpbmVfaW5mbyhjaGFyICpidWYsIHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCkBAIC0zNDQ2LDYgKzM1NTIsNyBAQAogCS5jaGFyc19pbl9idWZmZXIgPSBjaGFyc19pbl9idWZmZXIsCiAJLmZsdXNoX2J1ZmZlciA9IGZsdXNoX2J1ZmZlciwKIAkuaW9jdGwgPSBpb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gc2xndF9jb21wYXRfaW9jdGwsCiAJLnRocm90dGxlID0gdGhyb3R0bGUsCiAJLnVudGhyb3R0bGUgPSB1bnRocm90dGxlLAogCS5zZW5kX3hjaGFyID0gc2VuZF94Y2hhciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2F0bWVsLmggYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9hdG1lbC5oCmluZGV4IGM5MTJkODYuLjkzNjNiY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2F0bWVsLmgKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fYXRtZWwuaApAQCAtMjMsNiArMjMsOSBAQAogICovCiAKICNpZmRlZiBDT05GSUdfUFBDNjQKKworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKICNkZWZpbmUgYXRtZWxfZ2V0YihjaGlwLCBvZmZzZXQpIHJlYWRiKGNoaXAtPnZlbmRvci0+aW9iYXNlICsgb2Zmc2V0KTsKICNkZWZpbmUgYXRtZWxfcHV0Yih2YWwsIGNoaXAsIG9mZnNldCkgd3JpdGViKHZhbCwgY2hpcC0+dmVuZG9yLT5pb2Jhc2UgKyBvZmZzZXQpCiAjZGVmaW5lIGF0bWVsX3JlcXVlc3RfcmVnaW9uIHJlcXVlc3RfbWVtX3JlZ2lvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9pby5jIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCmluZGV4IGZjNjYyZTQuLjc1ZDJhNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfaW8uYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKQEAgLTE1MSw2ICsxNTEsMTIgQEAKIHN0YXRpYyBpbnQgdHR5X3JlbGVhc2Uoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwogaW50IHR0eV9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAogCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyB0dHlfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZyk7CisjZWxzZQorI2RlZmluZSB0dHlfY29tcGF0X2lvY3RsIE5VTEwKKyNlbmRpZgogc3RhdGljIGludCB0dHlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKiBmaWxwLCBpbnQgb24pOwogc3RhdGljIHZvaWQgcmVsZWFzZV90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGlkeCk7CiBzdGF0aWMgdm9pZCBfX3Byb2Nfc2V0X3R0eShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CkBAIC0zNjMsNiArMzY5LDI5IEBACiB9CiAKIC8qKgorICoJdHR5X2J1ZmZlcl9mbHVzaAkJLQlmbHVzaCBmdWxsIHR0eSBidWZmZXJzCisgKglAdHR5OiB0dHkgdG8gZmx1c2gKKyAqCisgKglmbHVzaCBhbGwgdGhlIGJ1ZmZlcnMgY29udGFpbmluZyByZWNlaXZlIGRhdGEKKyAqCisgKglMb2NraW5nOiBub25lCisgKi8KKworc3RhdGljIHZvaWQgdHR5X2J1ZmZlcl9mbHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfYnVmZmVyICp0aGVhZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eS0+YnVmLmxvY2ssIGZsYWdzKTsKKwl3aGlsZSgodGhlYWQgPSB0dHktPmJ1Zi5oZWFkKSAhPSBOVUxMKSB7CisJCXR0eS0+YnVmLmhlYWQgPSB0aGVhZC0+bmV4dDsKKwkJdHR5X2J1ZmZlcl9mcmVlKHR0eSwgdGhlYWQpOworCX0KKwl0dHktPmJ1Zi50YWlsID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPmJ1Zi5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgogICoJdHR5X2J1ZmZlcl9maW5kCQktCWZpbmQgYSBmcmVlIHR0eSBidWZmZXIKICAqCUB0dHk6IHR0eSBvd25pbmcgdGhlIGJ1ZmZlcgogICoJQHNpemU6IGNoYXJhY3RlcnMgd2FudGVkCkBAIC0xMTQzLDggKzExNzIsOCBAQAogCXJldHVybiBQT0xMSU4gfCBQT0xMT1VUIHwgUE9MTEVSUiB8IFBPTExIVVAgfCBQT0xMUkROT1JNIHwgUE9MTFdSTk9STTsKIH0KIAotc3RhdGljIGludCBodW5nX3VwX3R0eV9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAotCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBsb25nIGh1bmdfdXBfdHR5X2lvY3RsKHN0cnVjdCBmaWxlICogZmlsZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXJldHVybiBjbWQgPT0gVElPQ1NQR1JQID8gLUVOT1RUWSA6IC1FSU87CiB9CkBAIC0xMTU1LDYgKzExODQsNyBAQAogCS53cml0ZQkJPSB0dHlfd3JpdGUsCiAJLnBvbGwJCT0gdHR5X3BvbGwsCiAJLmlvY3RsCQk9IHR0eV9pb2N0bCwKKwkuY29tcGF0X2lvY3RsCT0gdHR5X2NvbXBhdF9pb2N0bCwKIAkub3BlbgkJPSB0dHlfb3BlbiwKIAkucmVsZWFzZQk9IHR0eV9yZWxlYXNlLAogCS5mYXN5bmMJCT0gdHR5X2Zhc3luYywKQEAgLTExNjcsNiArMTE5Nyw3IEBACiAJLndyaXRlCQk9IHR0eV93cml0ZSwKIAkucG9sbAkJPSB0dHlfcG9sbCwKIAkuaW9jdGwJCT0gdHR5X2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSB0dHlfY29tcGF0X2lvY3RsLAogCS5vcGVuCQk9IHB0bXhfb3BlbiwKIAkucmVsZWFzZQk9IHR0eV9yZWxlYXNlLAogCS5mYXN5bmMJCT0gdHR5X2Zhc3luYywKQEAgLTExNzksNiArMTIxMCw3IEBACiAJLndyaXRlCQk9IHJlZGlyZWN0ZWRfdHR5X3dyaXRlLAogCS5wb2xsCQk9IHR0eV9wb2xsLAogCS5pb2N0bAkJPSB0dHlfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAk9IHR0eV9jb21wYXRfaW9jdGwsCiAJLm9wZW4JCT0gdHR5X29wZW4sCiAJLnJlbGVhc2UJPSB0dHlfcmVsZWFzZSwKIAkuZmFzeW5jCQk9IHR0eV9mYXN5bmMsCkBAIC0xMTg5LDcgKzEyMjEsOCBAQAogCS5yZWFkCQk9IGh1bmdfdXBfdHR5X3JlYWQsCiAJLndyaXRlCQk9IGh1bmdfdXBfdHR5X3dyaXRlLAogCS5wb2xsCQk9IGh1bmdfdXBfdHR5X3BvbGwsCi0JLmlvY3RsCQk9IGh1bmdfdXBfdHR5X2lvY3RsLAorCS51bmxvY2tlZF9pb2N0bCA9IGh1bmdfdXBfdHR5X2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSBodW5nX3VwX3R0eV9pb2N0bCwKIAkucmVsZWFzZQk9IHR0eV9yZWxlYXNlLAogfTsKIApAQCAtMTIzOCw2ICsxMjcxLDcgQEAKIAkJCWxkLT5mbHVzaF9idWZmZXIodHR5KTsKIAkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKIAl9CisJdHR5X2J1ZmZlcl9mbHVzaCh0dHkpOwogfQogCiBFWFBPUlRfU1lNQk9MX0dQTCh0dHlfbGRpc2NfZmx1c2gpOwpAQCAtMzM0MCw2ICszMzc0LDE1IEBACiAJCWNhc2UgVElPQ01CSUM6CiAJCWNhc2UgVElPQ01CSVM6CiAJCQlyZXR1cm4gdHR5X3Rpb2Ntc2V0KHR0eSwgZmlsZSwgY21kLCBwKTsKKwkJY2FzZSBUQ0ZMU0g6CisJCQlzd2l0Y2ggKGFyZykgeworCQkJY2FzZSBUQ0lGTFVTSDoKKwkJCWNhc2UgVENJT0ZMVVNIOgorCQkJCS8qIGZsdXNoIHR0eSBidWZmZXIgYW5kIGFsbG93IGxkaXNjIHRvIHByb2Nlc3MgaW9jdGwgKi8KKwkJCQl0dHlfYnVmZmVyX2ZsdXNoKHR0eSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKIAl9CiAJaWYgKHR0eS0+ZHJpdmVyLT5pb2N0bCkgewogCQlyZXR2YWwgPSAodHR5LT5kcml2ZXItPmlvY3RsKSh0dHksIGZpbGUsIGNtZCwgYXJnKTsKQEAgLTMzNTcsNiArMzQwMCwzMiBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ09NUEFUCitzdGF0aWMgbG9uZyB0dHlfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKwlpbnQgcmV0dmFsID0gLUVOT0lPQ1RMQ01EOworCisJaWYgKHR0eV9wYXJhbm9pYV9jaGVjayh0dHksIGlub2RlLCAidHR5X2lvY3RsIikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHR0eS0+ZHJpdmVyLT5jb21wYXRfaW9jdGwpIHsKKwkJcmV0dmFsID0gKHR0eS0+ZHJpdmVyLT5jb21wYXRfaW9jdGwpKHR0eSwgZmlsZSwgY21kLCBhcmcpOworCQlpZiAocmV0dmFsICE9IC1FTk9JT0NUTENNRCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJbGQgPSB0dHlfbGRpc2NfcmVmX3dhaXQodHR5KTsKKwlpZiAobGQtPmNvbXBhdF9pb2N0bCkKKwkJcmV0dmFsID0gbGQtPmNvbXBhdF9pb2N0bCh0dHksIGZpbGUsIGNtZCwgYXJnKTsKKwl0dHlfbGRpc2NfZGVyZWYobGQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgogCiAvKgogICogVGhpcyBpbXBsZW1lbnRzIHRoZSAiU2VjdXJlIEF0dGVudGlvbiBLZXkiIC0tLSAgdGhlIGlkZWEgaXMgdG8KQEAgLTM2ODksNiArMzc1OCw3IEBACiAJZHJpdmVyLT53cml0ZV9yb29tID0gb3AtPndyaXRlX3Jvb207CiAJZHJpdmVyLT5jaGFyc19pbl9idWZmZXIgPSBvcC0+Y2hhcnNfaW5fYnVmZmVyOwogCWRyaXZlci0+aW9jdGwgPSBvcC0+aW9jdGw7CisJZHJpdmVyLT5jb21wYXRfaW9jdGwgPSBvcC0+Y29tcGF0X2lvY3RsOwogCWRyaXZlci0+c2V0X3Rlcm1pb3MgPSBvcC0+c2V0X3Rlcm1pb3M7CiAJZHJpdmVyLT50aHJvdHRsZSA9IG9wLT50aHJvdHRsZTsKIAlkcml2ZXItPnVudGhyb3R0bGUgPSBvcC0+dW50aHJvdHRsZTsKQEAgLTM4NDMsNiArMzkxMyw3IEBACiAJcC0+c2lnbmFsLT50dHkgPSBOVUxMOwogCXNwaW5fdW5sb2NrX2lycSgmcC0+c2lnaGFuZC0+c2lnbG9jayk7CiB9CitFWFBPUlRfU1lNQk9MKHByb2NfY2xlYXJfdHR5KTsKIAogc3RhdGljIHZvaWQgX19wcm9jX3NldF90dHkoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvaVRDT193ZHQuYyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3dkdC5jCmluZGV4IDNjOTY4NGMuLmVhYzRmOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3dkdC5jCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9pVENPX3dkdC5jCkBAIC01NzEsNyArNTcxLDcgQEAKIAkgKiAgICAgIEFDUElCQVNFIGlzIGJpdHMgWzE1OjddIGZyb20gMHg0MC0weDQzCiAJICovCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsICZiYXNlX2FkZHJlc3MpOwotCWJhc2VfYWRkcmVzcyAmPSAweDAwMDA3ZjgwOworCWJhc2VfYWRkcmVzcyAmPSAweDAwMDBmZjgwOwogCWlmIChiYXNlX2FkZHJlc3MgPT0gMHgwMDAwMDAwMCkgewogCQkvKiBTb21ldGhpbmcncyB3cm9uZyBoZXJlLCBBQ1BJQkFTRSBoYXMgdG8gYmUgc2V0ICovCiAJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBnZXQgVENPQkFTRSBhZGRyZXNzXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jIGIvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKaW5kZXggYTE5YjY1ZS4uN2Y4MTc4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKQEAgLTI0MCwxMSArMjQwLDk0IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfc2NhbmNvZGUoaW50IGNvZGUsIGludCBzY2FuY29kZSkKK3sKKwlpZiAoc2NhbmNvZGUgPT0gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuICgoY29kZSAmIChISURfVVNBR0VfUEFHRSB8IEhJRF9VU0FHRSkpID09IHNjYW5jb2RlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfa2V5Y29kZShpbnQgY29kZSwgaW50IGtleWNvZGUpCit7CisJaWYgKGtleWNvZGUgPT0gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIChjb2RlID09IGtleWNvZGUpOworfQorCitzdGF0aWMgc3RydWN0IGhpZF91c2FnZSAqaGlkaW5wdXRfZmluZF9rZXkoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwKKwkJaW50IHNjYW5jb2RlLCBpbnQga2V5Y29kZSkKK3sKKwlpbnQgaSwgaiwgazsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0OworCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlOworCisJZm9yIChrID0gSElEX0lOUFVUX1JFUE9SVDsgayA8PSBISURfT1VUUFVUX1JFUE9SVDsgaysrKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocmVwb3J0LCAmaGlkLT5yZXBvcnRfZW51bVtrXS5yZXBvcnRfbGlzdCwgbGlzdCkgeworCQkJZm9yIChpID0gMDsgaSA8IHJlcG9ydC0+bWF4ZmllbGQ7IGkrKykgeworCQkJCWZvciAoIGogPSAwOyBqIDwgcmVwb3J0LT5maWVsZFtpXS0+bWF4dXNhZ2U7IGorKykgeworCQkJCQl1c2FnZSA9IHJlcG9ydC0+ZmllbGRbaV0tPnVzYWdlICsgajsKKwkJCQkJaWYgKHVzYWdlLT50eXBlID09IEVWX0tFWSAmJgorCQkJCQkJbWF0Y2hfc2NhbmNvZGUodXNhZ2UtPmhpZCwgc2NhbmNvZGUpICYmCisJCQkJCQltYXRjaF9rZXljb2RlKHVzYWdlLT5jb2RlLCBrZXljb2RlKSkKKwkJCQkJCXJldHVybiB1c2FnZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaGlkaW5wdXRfZ2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBzY2FuY29kZSwKKwkJCQlpbnQgKmtleWNvZGUpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZTsKKwkKKwl1c2FnZSA9IGhpZGlucHV0X2ZpbmRfa2V5KGhpZCwgc2NhbmNvZGUsIDApOworCWlmICh1c2FnZSkgeworCQkqa2V5Y29kZSA9IHVzYWdlLT5jb2RlOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaGlkaW5wdXRfc2V0a2V5Y29kZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIGludCBzY2FuY29kZSwKKwkJCQlpbnQga2V5Y29kZSkKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlOworCWludCBvbGRfa2V5Y29kZTsKKwkKKwlpZiAoa2V5Y29kZSA8IDAgfHwga2V5Y29kZSA+IEtFWV9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCQorCXVzYWdlID0gaGlkaW5wdXRfZmluZF9rZXkoaGlkLCBzY2FuY29kZSwgMCk7CisJaWYgKHVzYWdlKSB7CisJCW9sZF9rZXljb2RlID0gdXNhZ2UtPmNvZGU7CisJCXVzYWdlLT5jb2RlID0ga2V5Y29kZTsKKwkJCisJCWNsZWFyX2JpdChvbGRfa2V5Y29kZSwgZGV2LT5rZXliaXQpOworCQlzZXRfYml0KHVzYWdlLT5jb2RlLCBkZXYtPmtleWJpdCk7CisjaWZkZWYgQ09ORklHX0hJRF9ERUJVRworCQlwcmludGsgKEtFUk5fREVCVUcgIkFzc2lnbmVkIGtleWNvZGUgJWQgdG8gSElEIHVzYWdlIGNvZGUgJXhcbiIsIGtleWNvZGUsIHNjYW5jb2RlKTsKKyNlbmRpZgorCQkvKiBTZXQgdGhlIGtleWJpdCBmb3IgdGhlIG9sZCBrZXljb2RlIGlmIHRoZSBvbGQga2V5Y29kZSBpcyB1c2VkCisJCSAqIGJ5IGFub3RoZXIga2V5ICovCisJCWlmIChoaWRpbnB1dF9maW5kX2tleSAoaGlkLCAwLCBvbGRfa2V5Y29kZSkpCisJCQlzZXRfYml0KG9sZF9rZXljb2RlLCBkZXYtPmtleWJpdCk7CisJCQorCQlyZXR1cm4gMDsKKwl9CisJCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKwogc3RhdGljIHZvaWQgaGlkaW5wdXRfY29uZmlndXJlX3VzYWdlKHN0cnVjdCBoaWRfaW5wdXQgKmhpZGlucHV0LCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKIAkJCQkgICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlKQogewogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0gaGlkaW5wdXQtPmlucHV0OwotCXN0cnVjdCBoaWRfZGV2aWNlICpkZXZpY2UgPSBpbnB1dC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqZGV2aWNlID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXQpOwogCWludCBtYXggPSAwLCBjb2RlOwogCXVuc2lnbmVkIGxvbmcgKmJpdCA9IE5VTEw7CiAKQEAgLTU1Myw2ICs2MzYsNyBAQAogCQkJCWNhc2UgMHgxMDE1OiBtYXBfa2V5X2NsZWFyKEtFWV9SRUNPUkQpOwkJYnJlYWs7CiAJCQkJY2FzZSAweDEwMTY6IG1hcF9rZXlfY2xlYXIoS0VZX1BMQVlFUik7CQlicmVhazsKIAkJCQljYXNlIDB4MTAxNzogbWFwX2tleV9jbGVhcihLRVlfRUpFQ1RDRCk7CWJyZWFrOworCQkJCWNhc2UgMHgxMDE4OiBtYXBfa2V5X2NsZWFyKEtFWV9NRURJQSk7ICAgICAgICAgIGJyZWFrOwogCQkJCWNhc2UgMHgxMDE5OiBtYXBfa2V5X2NsZWFyKEtFWV9QUk9HMSk7CQlicmVhazsKIAkJCQljYXNlIDB4MTAxYTogbWFwX2tleV9jbGVhcihLRVlfUFJPRzIpOwkJYnJlYWs7CiAJCQkJY2FzZSAweDEwMWI6IG1hcF9rZXlfY2xlYXIoS0VZX1BST0czKTsJCWJyZWFrOwpAQCAtNTYwLDkgKzY0NCwxMiBAQAogCQkJCWNhc2UgMHgxMDIwOiBtYXBfa2V5X2NsZWFyKEtFWV9aT09NT1VUKTsJYnJlYWs7CiAJCQkJY2FzZSAweDEwMjE6IG1hcF9rZXlfY2xlYXIoS0VZX1pPT01SRVNFVCk7CWJyZWFrOwogCQkJCWNhc2UgMHgxMDIzOiBtYXBfa2V5X2NsZWFyKEtFWV9DTE9TRSk7CQlicmVhazsKKwkJCQljYXNlIDB4MTAyNzogbWFwX2tleV9jbGVhcihLRVlfTUVOVSk7ICAgICAgICAgICBicmVhazsKIAkJCQkvKiB0aGlzIG9uZSBpcyBtYXJrZWQgYXMgJ1JvdGF0ZScgKi8KIAkJCQljYXNlIDB4MTAyODogbWFwX2tleV9jbGVhcihLRVlfQU5HTEUpOwkJYnJlYWs7CiAJCQkJY2FzZSAweDEwMjk6IG1hcF9rZXlfY2xlYXIoS0VZX1NIVUZGTEUpOwlicmVhazsKKwkJCQljYXNlIDB4MTAyYTogbWFwX2tleV9jbGVhcihLRVlfQkFDSyk7ICAgICAgICAgICBicmVhazsKKwkJCQljYXNlIDB4MTAyYjogbWFwX2tleV9jbGVhcihLRVlfQ1lDTEVXSU5ET1dTKTsgICBicmVhazsKIAkJCQljYXNlIDB4MTA0MTogbWFwX2tleV9jbGVhcihLRVlfQkFUVEVSWSk7CWJyZWFrOwogCQkJCWNhc2UgMHgxMDQyOiBtYXBfa2V5X2NsZWFyKEtFWV9XT1JEUFJPQ0VTU09SKTsJYnJlYWs7CiAJCQkJY2FzZSAweDEwNDM6IG1hcF9rZXlfY2xlYXIoS0VZX1NQUkVBRFNIRUVUKTsJYnJlYWs7CkBAIC04NTUsMTMgKzk0MiwxNSBAQAogCiBzdGF0aWMgaW50IGhpZGlucHV0X29wZW4oc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CisKIAlyZXR1cm4gaGlkLT5oaWRfb3BlbihoaWQpOwogfQogCiBzdGF0aWMgdm9pZCBoaWRpbnB1dF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKwogCWhpZC0+aGlkX2Nsb3NlKGhpZCk7CiB9CiAKQEAgLTkwOSwxMCArOTk4LDEyIEBACiAJCQkJCXJldHVybiAtMTsKIAkJCQl9CiAKLQkJCQlpbnB1dF9kZXYtPnByaXZhdGUgPSBoaWQ7CisJCQkJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBoaWQpOwogCQkJCWlucHV0X2Rldi0+ZXZlbnQgPSBoaWQtPmhpZGlucHV0X2lucHV0X2V2ZW50OwogCQkJCWlucHV0X2Rldi0+b3BlbiA9IGhpZGlucHV0X29wZW47CiAJCQkJaW5wdXRfZGV2LT5jbG9zZSA9IGhpZGlucHV0X2Nsb3NlOworCQkJCWlucHV0X2Rldi0+c2V0a2V5Y29kZSA9IGhpZGlucHV0X3NldGtleWNvZGU7CisJCQkJaW5wdXRfZGV2LT5nZXRrZXljb2RlID0gaGlkaW5wdXRfZ2V0a2V5Y29kZTsKIAogCQkJCWlucHV0X2Rldi0+bmFtZSA9IGhpZC0+bmFtZTsKIAkJCQlpbnB1dF9kZXYtPnBoeXMgPSBoaWQtPnBoeXM7CkBAIC05MjEsNyArMTAxMiw3IEBACiAJCQkJaW5wdXRfZGV2LT5pZC52ZW5kb3IgID0gaGlkLT52ZW5kb3I7CiAJCQkJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gaGlkLT5wcm9kdWN0OwogCQkJCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IGhpZC0+dmVyc2lvbjsKLQkJCQlpbnB1dF9kZXYtPmNkZXYuZGV2ID0gaGlkLT5kZXY7CisJCQkJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gaGlkLT5kZXY7CiAJCQkJaGlkaW5wdXQtPmlucHV0ID0gaW5wdXRfZGV2OwogCQkJCWxpc3RfYWRkX3RhaWwoJmhpZGlucHV0LT5saXN0LCAmaGlkLT5pbnB1dHMpOwogCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL0tjb25maWcgYi9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZwppbmRleCA3Yzg3YmRjLi4xYjRiNTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvS2NvbmZpZwpAQCAtMjUsMTIgKzI1LDEyIEBACiAJZGVwZW5kcyBvbiBVU0JfSElEICYmIElOUFVUPW4KIAogY29uZmlnIFVTQl9ISURJTlBVVF9QT1dFUkJPT0sKLQlib29sICJFbmFibGUgc3VwcG9ydCBmb3IgaUJvb2svUG93ZXJCb29rIHNwZWNpYWwga2V5cyIKKwlib29sICJFbmFibGUgc3VwcG9ydCBmb3IgaUJvb2svUG93ZXJCb29rL01hY0Jvb2svTWFjQm9va1BybyBzcGVjaWFsIGtleXMiCiAJZGVmYXVsdCBuCiAJZGVwZW5kcyBvbiBVU0JfSElECiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgc3BlY2lhbCBrZXlzIChGbiwgTnVtbG9jaykgb24KLQkgIEFwcGxlIGlCb29rcyBhbmQgUG93ZXJCb29rcy4KKwkgIEFwcGxlIGlCb29rcywgUG93ZXJCb29rcywgTWFjQm9va3MgYW5kIE1hY0Jvb2sgUHJvcy4KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwppbmRleCA5MWQ2MTAzLi5kOTFiOWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWNvcmUuYwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKIHN0YXRpYyBpbnQgdXNiX2hpZGlucHV0X2lucHV0X2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgdmFsdWUpCiB7Ci0Jc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZDsKIAlpbnQgb2Zmc2V0OwogCkBAIC02MjYsMTQgKzYyNiwxMCBAQAogewogCXN0cnVjdCB1c2JoaWRfZGV2aWNlICp1c2JoaWQgPSBoaWQtPmRyaXZlcl9kYXRhOwogCi0JaWYgKHVzYmhpZC0+aW5idWYpCi0JCXVzYl9idWZmZXJfZnJlZShkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgdXNiaGlkLT5pbmJ1ZiwgdXNiaGlkLT5pbmJ1Zl9kbWEpOwotCWlmICh1c2JoaWQtPm91dGJ1ZikKLQkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgdXNiaGlkLT5idWZzaXplLCB1c2JoaWQtPm91dGJ1ZiwgdXNiaGlkLT5vdXRidWZfZG1hKTsKLQlpZiAodXNiaGlkLT5jcikKLQkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgc2l6ZW9mKCoodXNiaGlkLT5jcikpLCB1c2JoaWQtPmNyLCB1c2JoaWQtPmNyX2RtYSk7Ci0JaWYgKHVzYmhpZC0+Y3RybGJ1ZikKLQkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgdXNiaGlkLT5idWZzaXplLCB1c2JoaWQtPmN0cmxidWYsIHVzYmhpZC0+Y3RybGJ1Zl9kbWEpOworCXVzYl9idWZmZXJfZnJlZShkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgdXNiaGlkLT5pbmJ1ZiwgdXNiaGlkLT5pbmJ1Zl9kbWEpOworCXVzYl9idWZmZXJfZnJlZShkZXYsIHVzYmhpZC0+YnVmc2l6ZSwgdXNiaGlkLT5vdXRidWYsIHVzYmhpZC0+b3V0YnVmX2RtYSk7CisJdXNiX2J1ZmZlcl9mcmVlKGRldiwgc2l6ZW9mKCoodXNiaGlkLT5jcikpLCB1c2JoaWQtPmNyLCB1c2JoaWQtPmNyX2RtYSk7CisJdXNiX2J1ZmZlcl9mcmVlKGRldiwgdXNiaGlkLT5idWZzaXplLCB1c2JoaWQtPmN0cmxidWYsIHVzYmhpZC0+Y3RybGJ1Zl9kbWEpOwogfQogCiAvKgpAQCAtNjkyLDYgKzY4OCwzMCBAQAogCX0KIH0KIAorLyoKKyAqIFNvbWUgVVNCIGJhcmNvZGUgcmVhZGVycyBmcm9tIGN5cHJlc3MgaGF2ZSB1c2FnZSBtaW4gYW5kIHVzYWdlIG1heCBpbgorICogdGhlIHdyb25nIG9yZGVyCisgKi8KK3N0YXRpYyB2b2lkIGhpZF9maXh1cF9jeXByZXNzX2Rlc2NyaXB0b3IodW5zaWduZWQgY2hhciAqcmRlc2MsIGludCByc2l6ZSkKK3sKKwlzaG9ydCBmaXhlZCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnNpemUgLSA0OyBpKyspIHsKKwkJaWYgKHJkZXNjW2ldID09IDB4MjkgJiYgcmRlc2MgW2krMl0gPT0gMHgxOSkgeworCQkJdW5zaWduZWQgY2hhciB0bXA7CisKKwkJCXJkZXNjW2ldID0gMHgxOTsgcmRlc2NbaSsyXSA9IDB4Mjk7CisJCQl0bXAgPSByZGVzY1tpKzNdOworCQkJcmRlc2NbaSszXSA9IHJkZXNjW2krMV07CisJCQlyZGVzY1tpKzFdID0gdG1wOworCQl9CisJfQorCisJaWYgKGZpeGVkKQorCQlpbmZvKCJGaXhpbmcgdXAgQ3lwcmVzcyByZXBvcnQgZGVzY3JpcHRvciIpOworfQorCiBzdGF0aWMgc3RydWN0IGhpZF9kZXZpY2UgKnVzYl9oaWRfY29uZmlndXJlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwpAQCAtNzU4LDYgKzc3OCw5IEBACiAJaWYgKHF1aXJrcyAmIEhJRF9RVUlSS19MT0dJVEVDSF9ERVNDUklQVE9SKQogCQloaWRfZml4dXBfbG9naXRlY2hfZGVzY3JpcHRvcihyZGVzYywgcnNpemUpOwogCisJaWYgKHF1aXJrcyAmIEhJRF9RVUlSS19TV0FQUEVEX01JTl9NQVgpCisJCWhpZF9maXh1cF9jeXByZXNzX2Rlc2NyaXB0b3IocmRlc2MsIHJzaXplKTsKKwogI2lmZGVmIENPTkZJR19ISURfREVCVUcKIAlwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyAiOiByZXBvcnQgZGVzY3JpcHRvciAoc2l6ZSAldSwgcmVhZCAlZCkgPSAiLCByc2l6ZSwgbik7CiAJZm9yIChuID0gMDsgbiA8IHJzaXplOyBuKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLWxnZmYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtbGdmZi5jCmluZGV4IDkyZDI1NTMuLmM1Y2Q0MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtbGdmZi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtbGdmZi5jCkBAIC02MCw3ICs2MCw3IEBACiAKIHN0YXRpYyBpbnQgaGlkX2xnZmZfcGxheShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKIHsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBsaXN0X2hlYWQgKnJlcG9ydF9saXN0ID0gJmhpZC0+cmVwb3J0X2VudW1bSElEX09VVFBVVF9SRVBPUlRdLnJlcG9ydF9saXN0OwogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQgPSBsaXN0X2VudHJ5KHJlcG9ydF9saXN0LT5uZXh0LCBzdHJ1Y3QgaGlkX3JlcG9ydCwgbGlzdCk7CiAJaW50IHgsIHk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBsZmYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGxmZi5jCmluZGV4IDc2ZDJlNmUuLmQ2YThmMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGxmZi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGxmZi5jCkBAIC0zNyw3ICszNyw3IEBACiBzdGF0aWMgaW50IGhpZF9wbGZmX3BsYXkoc3RydWN0IGlucHV0X2RldiAqZGV2LCB2b2lkICpkYXRhLAogCQkJIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKIHsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBwbGZmX2RldmljZSAqcGxmZiA9IGRhdGE7CiAJaW50IGxlZnQsIHJpZ2h0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwppbmRleCAxN2E4NzU1Li5mNmM0MTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKQEAgLTkyLDYgKzkyLDggQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX01PVVNFCTB4MDAwMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZUFJFU1NfSElEQ09NCTB4NTUwMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NZUFJFU1NfVUxUUkFNT1VTRQkweDc0MTcKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMQkweGRlNjEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9DWVBSRVNTX0JBUkNPREVfMgkweGRlNjQKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0RFTEwJCTB4NDEzYwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0RFTExfVzc2NTgJMHgyMDA1CkBAIC0xOTMsNiArMTk1LDcgQEAKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0xPR0lURUNICQkweDA0NmQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9SRUNFSVZFUgkweGMxMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSEVFTAkweGMyOTQKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9TNTEwX1JFQ0VJVkVSCTB4YzUwYwogI2RlZmluZSBVU0JfREVWSUNFX0lEX1M1MTBfUkVDRUlWRVJfMgkweGM1MTcKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9NWDMwMDBfUkVDRUlWRVIJMHhjNTEzCkBAIC00MjIsNiArNDI1LDcgQEAKIAl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOXzJQT1JUS1ZNLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOXzRQT1JUS1ZNLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfQVRFTiwgVVNCX0RFVklDRV9JRF9BVEVOXzRQT1JUS1ZNQywgSElEX1FVSVJLX05PR0VUIH0sCisJeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dIRUVMLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfU1VOLCBVU0JfREVWSUNFX0lEX1JBUklUQU5fS1ZNX0RPTkdMRSwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1RVUkJPWCwgVVNCX0RFVklDRV9JRF9UVVJCT1hfS0VZQk9BUkQsIEhJRF9RVUlSS19OT0dFVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfRFVBTF9VU0JfSk9ZUEFELCBISURfUVVJUktfTk9HRVQgfCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKQEAgLTQ0NSw2ICs0NDksOSBAQAogCiAJeyBVU0JfVkVORE9SX0lEX0RFTEwsIFVTQl9ERVZJQ0VfSURfREVMTF9XNzY1OCwgSElEX1FVSVJLX1JFU0VUX0xFRFMgfSwKIAorCXsgVVNCX1ZFTkRPUl9JRF9DWVBSRVNTLCBVU0JfREVWSUNFX0lEX0NZUFJFU1NfQkFSQ09ERV8xLCBISURfUVVJUktfU1dBUFBFRF9NSU5fTUFYIH0sCisJeyBVU0JfVkVORE9SX0lEX0NZUFJFU1MsIFVTQl9ERVZJQ0VfSURfQ1lQUkVTU19CQVJDT0RFXzIsIEhJRF9RVUlSS19TV0FQUEVEX01JTl9NQVggfSwKKwogCXsgMCwgMCB9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXRtZmYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtdG1mZi5jCmluZGV4IGFiNjczMzEuLmFiNWJhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtdG1mZi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtdG1mZi5jCkBAIC01OSw3ICs1OSw3IEBACiAKIHN0YXRpYyBpbnQgaGlkX3RtZmZfcGxheShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHZvaWQgKmRhdGEsIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKIHsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB0bWZmX2RldmljZSAqdG1mZiA9IGRhdGE7CiAJaW50IGxlZnQsIHJpZ2h0OwkvKiBSdW1ibGluZyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXpwZmYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtenBmZi5jCmluZGV4IDdiZDgyMzguLmE3ZmJmZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtenBmZi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtenBmZi5jCkBAIC0zNyw3ICszNyw3IEBACiBzdGF0aWMgaW50IGhpZF96cGZmX3BsYXkoc3RydWN0IGlucHV0X2RldiAqZGV2LCB2b2lkICpkYXRhLAogCQkJIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkKIHsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCB6cGZmX2RldmljZSAqenBmZiA9IGRhdGE7CiAJaW50IGxlZnQsIHJpZ2h0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkZGV2LmMKaW5kZXggYThiM2Q2Ni4uNDg4ZDYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZGRldi5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWRkZXYuYwpAQCAtNTEsNiArNTEsNyBAQAogCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhpZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3BpbmxvY2tfdCBsaXN0X2xvY2s7CiB9OwogCiBzdHJ1Y3QgaGlkZGV2X2xpc3QgewpAQCAtMTYxLDcgKzE2Miw5IEBACiB7CiAJc3RydWN0IGhpZGRldiAqaGlkZGV2ID0gaGlkLT5oaWRkZXY7CiAJc3RydWN0IGhpZGRldl9saXN0ICpsaXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaGlkZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpc3QsICZoaWRkZXYtPmxpc3QsIG5vZGUpIHsKIAkJaWYgKHVyZWYtPmZpZWxkX2luZGV4ICE9IEhJRF9GSUVMRF9JTkRFWF9OT05FIHx8CiAJCSAgICAobGlzdC0+ZmxhZ3MgJiBISURERVZfRkxBR19SRVBPUlQpICE9IDApIHsKQEAgLTE3MSw2ICsxNzQsNyBAQAogCQkJa2lsbF9mYXN5bmMoJmxpc3QtPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOwogCQl9CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhpZGRldi0+bGlzdF9sb2NrLCBmbGFncyk7CiAKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmhpZGRldi0+d2FpdCk7CiB9CkBAIC0yMzUsOSArMjM5LDEzIEBACiBzdGF0aWMgaW50IGhpZGRldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCiB7CiAJc3RydWN0IGhpZGRldl9saXN0ICpsaXN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAloaWRkZXZfZmFzeW5jKC0xLCBmaWxlLCAwKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5oaWRkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZsaXN0LT5ub2RlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0LT5oaWRkZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCEtLWxpc3QtPmhpZGRldi0+b3BlbikgewogCQlpZiAobGlzdC0+aGlkZGV2LT5leGlzdCkKQEAgLTI1Nyw2ICsyNjUsNyBAQAogc3RhdGljIGludCBoaWRkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgaGlkZGV2X2xpc3QgKmxpc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWludCBpID0gaW1pbm9yKGlub2RlKSAtIEhJRERFVl9NSU5PUl9CQVNFOwogCkBAIC0yNjcsNyArMjc2LDExIEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJbGlzdC0+aGlkZGV2ID0gaGlkZGV2X3RhYmxlW2ldOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3QtPmhpZGRldi0+bGlzdF9sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGRfdGFpbCgmbGlzdC0+bm9kZSwgJmhpZGRldl90YWJsZVtpXS0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdC0+aGlkZGV2LT5saXN0X2xvY2ssIGZsYWdzKTsKKwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGxpc3Q7CiAKIAlpZiAoIWxpc3QtPmhpZGRldi0+b3BlbisrKQpAQCAtNzczLDYgKzc4Niw3IEBACiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoaWRkZXYtPndhaXQpOwogCUlOSVRfTElTVF9IRUFEKCZoaWRkZXYtPmxpc3QpOworCXNwaW5fbG9ja19pbml0KCZoaWRkZXYtPmxpc3RfbG9jayk7CiAJaGlkZGV2LT5oaWQgPSBoaWQ7CiAJaGlkZGV2LT5leGlzdCA9IDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JrYmQuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC91c2JrYmQuYwppbmRleCA2NWFhMTJlLi4xMzA5Nzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNia2JkLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL3VzYmtiZC5jCkBAIC0xMzMsMTIgKzEzMywxMSBAQAogc3RhdGljIGludCB1c2Jfa2JkX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsCiAJCQkgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKIHsKLQlzdHJ1Y3QgdXNiX2tiZCAqa2JkID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCB1c2Jfa2JkICprYmQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaWYgKHR5cGUgIT0gRVZfTEVEKQogCQlyZXR1cm4gLTE7CiAKLQogCWtiZC0+bmV3bGVkcyA9ICghIXRlc3RfYml0KExFRF9LQU5BLCAgICBkZXYtPmxlZCkgPDwgMykgfCAoISF0ZXN0X2JpdChMRURfQ09NUE9TRSwgZGV2LT5sZWQpIDw8IDMpIHwKIAkJICAgICAgICghIXRlc3RfYml0KExFRF9TQ1JPTExMLCBkZXYtPmxlZCkgPDwgMikgfCAoISF0ZXN0X2JpdChMRURfQ0FQU0wsICAgZGV2LT5sZWQpIDw8IDEpIHwKIAkJICAgICAgICghIXRlc3RfYml0KExFRF9OVU1MLCAgICBkZXYtPmxlZCkpOwpAQCAtMTc1LDcgKzE3NCw3IEBACiAKIHN0YXRpYyBpbnQgdXNiX2tiZF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgdXNiX2tiZCAqa2JkID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCB1c2Jfa2JkICprYmQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJa2JkLT5pcnEtPmRldiA9IGtiZC0+dXNiZGV2OwogCWlmICh1c2Jfc3VibWl0X3VyYihrYmQtPmlycSwgR0ZQX0tFUk5FTCkpCkBAIC0xODYsNyArMTg1LDcgQEAKIAogc3RhdGljIHZvaWQgdXNiX2tiZF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHVzYl9rYmQgKmtiZCA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgdXNiX2tiZCAqa2JkID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXVzYl9raWxsX3VyYihrYmQtPmlycSk7CiB9CkBAIC0yMTEsMTIgKzIxMCw5IEBACiB7CiAJdXNiX2ZyZWVfdXJiKGtiZC0+aXJxKTsKIAl1c2JfZnJlZV91cmIoa2JkLT5sZWQpOwotCWlmIChrYmQtPm5ldykKLQkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgOCwga2JkLT5uZXcsIGtiZC0+bmV3X2RtYSk7Ci0JaWYgKGtiZC0+Y3IpCi0JCXVzYl9idWZmZXJfZnJlZShkZXYsIHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSwga2JkLT5jciwga2JkLT5jcl9kbWEpOwotCWlmIChrYmQtPmxlZHMpCi0JCXVzYl9idWZmZXJfZnJlZShkZXYsIDEsIGtiZC0+bGVkcywga2JkLT5sZWRzX2RtYSk7CisJdXNiX2J1ZmZlcl9mcmVlKGRldiwgOCwga2JkLT5uZXcsIGtiZC0+bmV3X2RtYSk7CisJdXNiX2J1ZmZlcl9mcmVlKGRldiwgc2l6ZW9mKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QpLCBrYmQtPmNyLCBrYmQtPmNyX2RtYSk7CisJdXNiX2J1ZmZlcl9mcmVlKGRldiwgMSwga2JkLT5sZWRzLCBrYmQtPmxlZHNfZG1hKTsKIH0KIAogc3RhdGljIGludCB1c2Jfa2JkX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSwKQEAgLTI3NCw4ICsyNzAsOSBAQAogCWlucHV0X2Rldi0+bmFtZSA9IGtiZC0+bmFtZTsKIAlpbnB1dF9kZXYtPnBoeXMgPSBrYmQtPnBoeXM7CiAJdXNiX3RvX2lucHV0X2lkKGRldiwgJmlucHV0X2Rldi0+aWQpOwotCWlucHV0X2Rldi0+Y2Rldi5kZXYgPSAmaWZhY2UtPmRldjsKLQlpbnB1dF9kZXYtPnByaXZhdGUgPSBrYmQ7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmlmYWNlLT5kZXY7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dF9kZXYsIGtiZCk7CiAKIAlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfTEVEKSB8IEJJVChFVl9SRVApOwogCWlucHV0X2Rldi0+bGVkYml0WzBdID0gQklUKExFRF9OVU1MKSB8IEJJVChMRURfQ0FQU0wpIHwgQklUKExFRF9TQ1JPTExMKSB8IEJJVChMRURfQ09NUE9TRSkgfCBCSVQoTEVEX0tBTkEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdXNiaGlkL3VzYm1vdXNlLmMgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNibW91c2UuYwppbmRleCA1NzM3NzZkLi41MzQ1YzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvdXNibW91c2UuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvdXNibW91c2UuYwpAQCAtOTYsNyArOTYsNyBAQAogCiBzdGF0aWMgaW50IHVzYl9tb3VzZV9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKLQlzdHJ1Y3QgdXNiX21vdXNlICptb3VzZSA9IGRldi0+cHJpdmF0ZTsKKwlzdHJ1Y3QgdXNiX21vdXNlICptb3VzZSA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CiAKIAltb3VzZS0+aXJxLT5kZXYgPSBtb3VzZS0+dXNiZGV2OwogCWlmICh1c2Jfc3VibWl0X3VyYihtb3VzZS0+aXJxLCBHRlBfS0VSTkVMKSkKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiBzdGF0aWMgdm9pZCB1c2JfbW91c2VfY2xvc2Uoc3RydWN0IGlucHV0X2RldiAqZGV2KQogewotCXN0cnVjdCB1c2JfbW91c2UgKm1vdXNlID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCB1c2JfbW91c2UgKm1vdXNlID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXVzYl9raWxsX3VyYihtb3VzZS0+aXJxKTsKIH0KQEAgLTE3MSw3ICsxNzEsNyBAQAogCWlucHV0X2Rldi0+bmFtZSA9IG1vdXNlLT5uYW1lOwogCWlucHV0X2Rldi0+cGh5cyA9IG1vdXNlLT5waHlzOwogCXVzYl90b19pbnB1dF9pZChkZXYsICZpbnB1dF9kZXYtPmlkKTsKLQlpbnB1dF9kZXYtPmNkZXYuZGV2ID0gJmludGYtPmRldjsKKwlpbnB1dF9kZXYtPmRldi5wYXJlbnQgPSAmaW50Zi0+ZGV2OwogCiAJaW5wdXRfZGV2LT5ldmJpdFswXSA9IEJJVChFVl9LRVkpIHwgQklUKEVWX1JFTCk7CiAJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fTU9VU0UpXSA9IEJJVChCVE5fTEVGVCkgfCBCSVQoQlROX1JJR0hUKSB8IEJJVChCVE5fTUlERExFKTsKQEAgLTE3OSw3ICsxNzksOCBAQAogCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX01PVVNFKV0gfD0gQklUKEJUTl9TSURFKSB8IEJJVChCVE5fRVhUUkEpOwogCWlucHV0X2Rldi0+cmVsYml0WzBdIHw9IEJJVChSRUxfV0hFRUwpOwogCi0JaW5wdXRfZGV2LT5wcml2YXRlID0gbW91c2U7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBtb3VzZSk7CisKIAlpbnB1dF9kZXYtPm9wZW4gPSB1c2JfbW91c2Vfb3BlbjsKIAlpbnB1dF9kZXYtPmNsb3NlID0gdXNiX21vdXNlX2Nsb3NlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2V2ZGV2LmMgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKaW5kZXggNTVhNzI1OS4uYjIzNDcyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9ldmRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvZXZkZXYuYwpAQCAtMzM2LDcgKzMzNiw3IEBACiAKIAlpZiAoY29tcGF0KSB7CiAJCWxlbiA9IE5CSVRTX0NPTVBBVChtYXhiaXQpICogc2l6ZW9mKGNvbXBhdF9sb25nX3QpOwotCQlpZiAobGVuIDwgbWF4bGVuKQorCQlpZiAobGVuID4gbWF4bGVuKQogCQkJbGVuID0gbWF4bGVuOwogCiAJCWZvciAoaSA9IDA7IGkgPCBsZW4gLyBzaXplb2YoY29tcGF0X2xvbmdfdCk7IGkrKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCA2NTgxNGIwLi5jMTBjZTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC01MTAzLDcgKzUxMDMsNyBAQAogCQkgKgogCQkgKiBOb3RlOiB0aGUgZm9sbG93aW5nIGlzIGFuIHVuc2lnbmVkIGNvbXBhcmlzb24uCiAJCSAqLwotCQlpZiAoKGN1cnJfZXZlbnRzIC0gcmRldi0+bGFzdF9ldmVudHMgKyA0MDk2KSA+IDgxOTIpIHsKKwkJaWYgKChsb25nKWN1cnJfZXZlbnRzIC0gKGxvbmcpcmRldi0+bGFzdF9ldmVudHMgPiA0MDk2KSB7CiAJCQlyZGV2LT5sYXN0X2V2ZW50cyA9IGN1cnJfZXZlbnRzOwogCQkJaWRsZSA9IDA7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvS2NvbmZpZwppbmRleCAzYTgwZTBjLi42MjRiMjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9LY29uZmlnCkBAIC04Nyw2ICs4NywxNCBAQAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBJMkMKIAorY29uZmlnIERBQgorCWJvb2xlYW4gIkRBQiBhZGFwdGVycyIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBBbGxvdyBzZWxlY3Rpbmcgc3VwcG9ydCBmb3IgZm9yIERpZ2l0YWwgQXVkaW8gQnJvYWRjYXN0aW5nIChEQUIpCisJICBSZWNlaXZlciBhZGFwdGVycy4KKworaWYgREFCCiBjb25maWcgVVNCX0RBQlVTQgogCXRyaXN0YXRlICJEQUJVU0IgZHJpdmVyIgogCWRlcGVuZHMgb24gVVNCCkBAIC0xMDAsNSArMTA4LDYgQEAKIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZGFidXNiLgorZW5kaWYgIyBEQUIKIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvTWFrZWZpbGUKaW5kZXggYzU3OGE1Mi4uOGZhMTk5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL01ha2VmaWxlCkBAIC01LDQgKzUsNCBAQAogb2JqLXkgOj0gY29tbW9uLwogb2JqLSQoQ09ORklHX1ZJREVPX0RFVikgKz0gdmlkZW8vCiBvYmotJChDT05GSUdfVklERU9fREVWKSArPSByYWRpby8KLW9iai0kKENPTkZJR19EVkIpICAgICAgICs9IGR2Yi8KK29iai0kKENPTkZJR19EVkJfQ09SRSkgICs9IGR2Yi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9jb3JlLmMKaW5kZXggODZjYmRiYy4uZWYzZTU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9jb3JlLmMKQEAgLTEzNiwyOCArMTM2LDQ1IEBACiAJY2hhciAqbWVtID0gdm1hbGxvY18zMihsZW5ndGgpOwogCWludCBzbGVuID0gMDsKIAotCWlmIChOVUxMID09IG1lbSkgewotCQlyZXR1cm4gTlVMTDsKLQl9CisJaWYgKE5VTEwgPT0gbWVtKQorCQlnb3RvIGVycl9udWxsOwogCi0JaWYgKCEocHQtPnNsaXN0ID0gdm1hbGxvY190b19zZyhtZW0sIHBhZ2VzKSkpIHsKLQkJdmZyZWUobWVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorCWlmICghKHB0LT5zbGlzdCA9IHZtYWxsb2NfdG9fc2cobWVtLCBwYWdlcykpKQorCQlnb3RvIGVycl9mcmVlX21lbTsKIAotCWlmIChzYWE3MTQ2X3BndGFibGVfYWxsb2MocGNpLCBwdCkpIHsKLQkJa2ZyZWUocHQtPnNsaXN0KTsKLQkJcHQtPnNsaXN0ID0gTlVMTDsKLQkJdmZyZWUobWVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorCWlmIChzYWE3MTQ2X3BndGFibGVfYWxsb2MocGNpLCBwdCkpCisJCWdvdG8gZXJyX2ZyZWVfc2xpc3Q7CiAKLQlzbGVuID0gcGNpX21hcF9zZyhwY2kscHQtPnNsaXN0LHBhZ2VzLFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JaWYgKDAgIT0gc2FhNzE0Nl9wZ3RhYmxlX2J1aWxkX3NpbmdsZShwY2ksIHB0LCBwdC0+c2xpc3QsIHNsZW4pKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKwlwdC0+bmVudHMgPSBwYWdlczsKKwlzbGVuID0gcGNpX21hcF9zZyhwY2kscHQtPnNsaXN0LHB0LT5uZW50cyxQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWlmICgwID09IHNsZW4pCisJCWdvdG8gZXJyX2ZyZWVfcGd0YWJsZTsKKworCWlmICgwICE9IHNhYTcxNDZfcGd0YWJsZV9idWlsZF9zaW5nbGUocGNpLCBwdCwgcHQtPnNsaXN0LCBzbGVuKSkKKwkJZ290byBlcnJfdW5tYXBfc2c7CiAKIAlyZXR1cm4gbWVtOworCitlcnJfdW5tYXBfc2c6CisJcGNpX3VubWFwX3NnKHBjaSwgcHQtPnNsaXN0LCBwdC0+bmVudHMsIFBDSV9ETUFfRlJPTURFVklDRSk7CitlcnJfZnJlZV9wZ3RhYmxlOgorCXNhYTcxNDZfcGd0YWJsZV9mcmVlKHBjaSwgcHQpOworZXJyX2ZyZWVfc2xpc3Q6CisJa2ZyZWUocHQtPnNsaXN0KTsKKwlwdC0+c2xpc3QgPSBOVUxMOworZXJyX2ZyZWVfbWVtOgorCXZmcmVlKG1lbSk7CitlcnJfbnVsbDoKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzYWE3MTQ2X3ZmcmVlX2Rlc3Ryb3lfcGd0YWJsZShzdHJ1Y3QgcGNpX2RldiAqcGNpLCBjaGFyICptZW0sIHN0cnVjdCBzYWE3MTQ2X3BndGFibGUgKnB0KQoreworCXBjaV91bm1hcF9zZyhwY2ksIHB0LT5zbGlzdCwgcHQtPm5lbnRzLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXNhYTcxNDZfcGd0YWJsZV9mcmVlKHBjaSwgcHQpOworCWtmcmVlKHB0LT5zbGlzdCk7CisJcHQtPnNsaXN0ID0gTlVMTDsKKwl2ZnJlZShtZW0pOwogfQogCiB2b2lkIHNhYTcxNDZfcGd0YWJsZV9mcmVlKHN0cnVjdCBwY2lfZGV2ICpwY2ksIHN0cnVjdCBzYWE3MTQ2X3BndGFibGUgKnB0KQpAQCAtMTY2LDggKzE4Myw2IEBACiAJCXJldHVybjsKIAlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaSwgcHQtPnNpemUsIHB0LT5jcHUsIHB0LT5kbWEpOwogCXB0LT5jcHUgPSBOVUxMOwotCWtmcmVlKHB0LT5zbGlzdCk7Ci0JcHQtPnNsaXN0ID0gTlVMTDsKIH0KIAogaW50IHNhYTcxNDZfcGd0YWJsZV9hbGxvYyhzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3Qgc2FhNzE0Nl9wZ3RhYmxlICpwdCkKQEAgLTUyOCw2ICs1NDMsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl9wZ3RhYmxlX2ZyZWUpOwogRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl9wZ3RhYmxlX2J1aWxkX3NpbmdsZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3ZtYWxsb2NfYnVpbGRfcGd0YWJsZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3ZmcmVlX2Rlc3Ryb3lfcGd0YWJsZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3dhaXRfZm9yX2RlYmlfZG9uZSk7CiAKIEVYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfc2V0Z3Bpbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfZm9wcy5jCmluZGV4IGMxOGE1ZGEuLmI0NzcwYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfZm9wcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfZm9wcy5jCkBAIC0zMDcsNyArMzA3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHNhYTcxNDZfdmlkZW9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiBzdGF0aWMgaW50IGZvcHNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnCmluZGV4IGE5N2M4ZjUuLmVmZDJiNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZwpAQCAtMiwyNSArMiwxNyBAQAogIyBNdWx0aW1lZGlhIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIkRpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMiCi0KLWNvbmZpZyBEVkIKLQlib29sICJEVkIgRm9yIExpbnV4IgotCWRlcGVuZHMgb24gTkVUICYmIElORVQKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0IERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIGhhcmR3YXJlLiAgRW5hYmxlIHRoaXMgaWYgeW91Ci0JICBvd24gYSBEVkIgYWRhcHRlciBhbmQgd2FudCB0byB1c2UgaXQgb3IgaWYgeW91IGNvbXBpbGUgTGludXggZm9yCi0JICBhIGRpZ2l0YWwgU2V0VG9wQm94LgotCi0JICBBUEkgc3BlY3MgYW5kIHVzZXIgdG9vbHMgYXJlIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LmxpbnV4dHYub3JnLz4uCi0KLQkgIFBsZWFzZSByZXBvcnQgcHJvYmxlbXMgcmVnYXJkaW5nIHRoaXMgZHJpdmVyIHRvIHRoZSBMaW51eERWQgotCSAgbWFpbGluZyBsaXN0LgotCi0JICBJZiB1bnN1cmUgc2F5IE4uCi0KIHNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvS2NvbmZpZyIKIAorbWVudWNvbmZpZyBEVkJfQ0FQVFVSRV9EUklWRVJTCisJYm9vbCAiRFZCL0FUU0MgYWRhcHRlcnMiCisJZGVwZW5kcyBvbiBEVkJfQ09SRQorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIHRvIHNlbGVjdCBEaWdpdGFsIFRWIGFkYXB0ZXJzCisKK2lmIERWQl9DQVBUVVJFX0RSSVZFUlMKKwogY29tbWVudCAiU3VwcG9ydGVkIFNBQTcxNDYgYmFzZWQgUENJIEFkYXB0ZXJzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUgJiYgUENJICYmIEkyQwogc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnIgpAQCAtNDgsNCArNDAsNCBAQAogCWRlcGVuZHMgb24gRFZCX0NPUkUKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWciCiAKLWVuZG1lbnUKK2VuZGlmICMgRFZCX0NBUFRVUkVfRFJJVkVSUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL0tjb25maWcKaW5kZXggMTk5MGVkYS4uZTNlNjgzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9LY29uZmlnCkBAIC0xLDEyICsxLDIyIEBACiBjb25maWcgRFZCX0NPUkUKLQl0cmlzdGF0ZSAiRFZCIENvcmUgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIERWQgorCXRyaXN0YXRlICJEVkIgZm9yIExpbnV4IgorCWRlcGVuZHMgb24gTkVUICYmIElORVQKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCisJICBTdXBwb3J0IERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIGhhcmR3YXJlLiAgRW5hYmxlIHRoaXMgaWYgeW91CisJICBvd24gYSBEVkIgYWRhcHRlciBhbmQgd2FudCB0byB1c2UgaXQgb3IgaWYgeW91IGNvbXBpbGUgTGludXggZm9yCisJICBhIGRpZ2l0YWwgU2V0VG9wQm94LgorCiAJICBEVkIgY29yZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZGV2aWNlIGhhbmRsaW5nLCBzb2Z0d2FyZSBmYWxsYmFja3MgZXRjLgogCSAgU2F5IFkgd2hlbiB5b3UgaGF2ZSBhIERWQiBjYXJkIGFuZCB3YW50IHRvIHVzZSBpdC4gU2F5IFkgaWYgeW91ciB3YW50CiAJICB0byBidWlsZCB5b3VyIGRyaXZlcnMgb3V0c2lkZSB0aGUga2VybmVsLCBidXQgbmVlZCB0aGUgRFZCIGNvcmUuIEFsbAogCSAgaW4ta2VybmVsIGRyaXZlcnMgd2lsbCBzZWxlY3QgdGhpcyBhdXRvbWF0aWNhbGx5IGlmIG5lZWRlZC4KKworCSAgQVBJIHNwZWNzIGFuZCB1c2VyIHRvb2xzIGFyZSBhdmFpbGFibGUgZnJvbSA8aHR0cDovL3d3dy5saW51eHR2Lm9yZy8+LgorCisJICBQbGVhc2UgcmVwb3J0IHByb2JsZW1zIHJlZ2FyZGluZyB0aGlzIGRyaXZlciB0byB0aGUgTGludXhEVkIKKwkgIG1haWxpbmcgbGlzdC4KKwogCSAgSWYgdW5zdXJlIHNheSBOLgogCiBjb25maWcgRFZCX0NPUkVfQVRUQUNICmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKaW5kZXggOTc3MTVmNy4uNDAzMDgxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBVU0JfVklEX0NPTVBST19VTksJCQkweDE0NWYKICNkZWZpbmUgVVNCX1ZJRF9DWVBSRVNTCQkJCTB4MDRiNAogI2RlZmluZSBVU0JfVklEX0RJQkNPTQkJCQkweDEwYjgKKyNkZWZpbmUgVVNCX1ZJRF9EUE9TSAkJCQkweDE0OTgKICNkZWZpbmUgVVNCX1ZJRF9EVklDTwkJCQkweDBmZTkKICNkZWZpbmUgVVNCX1ZJRF9FTVBJQQkJCQkweGViMWEKICNkZWZpbmUgVVNCX1ZJRF9HRU5QSVgJCQkJMHgwOWMwCkBAIC02MSw2ICs2Miw4IEBACiAjZGVmaW5lIFVTQl9QSURfRElCQ09NX1NUSzc3MDBQCQkJCTB4MWUxNAogI2RlZmluZSBVU0JfUElEX0RJQkNPTV9TVEs3NzAwUF9QQwkJCTB4MWU3OAogI2RlZmluZSBVU0JfUElEX0RJQkNPTV9BTkNIT1JfMjEzNV9DT0xECQkJMHgyMTMxCisjZGVmaW5lIFVTQl9QSURfRFBPU0hfTTkyMDZfQ09MRAkJCTB4OTIwNgorI2RlZmluZSBVU0JfUElEX0RQT1NIX005MjA2X1dBUk0JCQkweGEwOTAKICNkZWZpbmUgVVNCX1BJRF9VTklXSUxMX1NUSzc3MDBQCQkJMHg2MDAzCiAjZGVmaW5lIFVTQl9QSURfR1JBTkRURUNfRFZCVF9VU0JfQ09MRAkJCTB4MGZhMAogI2RlZmluZSBVU0JfUElEX0dSQU5EVEVDX0RWQlRfVVNCX1dBUk0JCQkweDBmYTEKQEAgLTE0NSw2ICsxNDgsOCBAQAogI2RlZmluZSBVU0JfUElEX01TSV9ESUdJX1ZPWF9NSU5JX0lJCQkJMHgxNTEzCiAjZGVmaW5lIFVTQl9QSURfT1BFUkExX0NPTEQJCQkJMHgyODMwCiAjZGVmaW5lIFVTQl9QSURfT1BFUkExX1dBUk0JCQkJMHgzODI5CisjZGVmaW5lIFVTQl9QSURfTElGRVZJRVdfVFZfV0FMS0VSX1RXSU5fQ09MRAkJMHgwNTE0CisjZGVmaW5lIFVTQl9QSURfTElGRVZJRVdfVFZfV0FMS0VSX1RXSU5fV0FSTQkJMHgwNTEzCiAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCmluZGV4IDBkNzIxNzMxLi42ZjgyNGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaApAQCAtMTE5LDcgKzExOSw3IEBACiAgKiBAY2FwczogY2FwYWJpbGl0aWVzIG9mIHRoZSBEVkIgVVNCIGRldmljZS4KICAqIEBwaWRfZmlsdGVyX2NvdW50OiBudW1iZXIgb2YgUElEIGZpbHRlciBwb3NpdGlvbiBpbiB0aGUgb3B0aW9uYWwgaGFyZHdhcmUKICAqICBQSUQtZmlsdGVyLgotICogQHN0cmVhbWluZ19jcnRsOiBjYWxsZWQgdG8gc3RhcnQgYW5kIHN0b3AgdGhlIE1QRUcyLVRTIHN0cmVhbWluZyBvZiB0aGUKKyAqIEBzdHJlYW1pbmdfY3RybDogY2FsbGVkIHRvIHN0YXJ0IGFuZCBzdG9wIHRoZSBNUEVHMi1UUyBzdHJlYW1pbmcgb2YgdGhlCiAgKiAgZGV2aWNlIChub3QgVVJCIHN1Ym1pdHRpbmcva2lsbGluZykuCiAgKiBAcGlkX2ZpbHRlcl9jdHJsOiBjYWxsZWQgdG8gZW4vZGlzYWJsZSB0aGUgUElEIGZpbHRlciwgaWYgYW55LgogICogQHBpZF9maWx0ZXI6IGNhbGxlZCB0byBzZXQvdW5zZXQgYSBQSUQgZm9yIGZpbHRlcmluZy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbTkyMHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbTkyMHguYwppbmRleCA0NWQ3YmMyLi5jNTQ2ZGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9tOTIweC5jCkBAIC0zLDggKzMsOCBAQAogICogQ29weXJpZ2h0IChDKSAyMDA2IEFhcG8gVGFoa29sYSAoYWV0QHJhc3RlcmJ1cm4ub3JnKQogICoKICAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQotICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KICAqCiAgKiBzZWUgRG9jdW1lbnRhdGlvbi9kdmIvUkVBRE1FLmR2Yi11c2IgZm9yIG1vcmUgaW5mb3JtYXRpb24KICAqLwpAQCAtMjIsMjYgKzIyLDcgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZyxkdmJfdXNiX205MjB4X2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCBkZWJ1Z2dpbmcgbGV2ZWwgKDE9cmMgKG9yLWFibGUpKS4iIERWQl9VU0JfREVCVUdfU1RBVFVTKTsKIAotc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSBtZWdhc2t5X3JjX2tleXMgW10gPSB7Ci0JeyAweDAsIDB4MTIsIEtFWV9QT1dFUiB9LAotCXsgMHgwLCAweDFlLCBLRVlfQ1lDTEVXSU5ET1dTIH0sIC8qIG1pbi9tYXggKi8KLQl7IDB4MCwgMHgwMiwgS0VZX0NIQU5ORUxVUCB9LAotCXsgMHgwLCAweDA1LCBLRVlfQ0hBTk5FTERPV04gfSwKLQl7IDB4MCwgMHgwMywgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweDAsIDB4MDYsIEtFWV9WT0xVTUVET1dOIH0sCi0JeyAweDAsIDB4MDQsIEtFWV9NVVRFIH0sCi0JeyAweDAsIDB4MDcsIEtFWV9PSyB9LCAvKiBUUyAqLwotCXsgMHgwLCAweDA4LCBLRVlfU1RPUCB9LAotCXsgMHgwLCAweDA5LCBLRVlfTUVOVSB9LCAvKiBzd2FwICovCi0JeyAweDAsIDB4MGEsIEtFWV9SRVdJTkQgfSwKLQl7IDB4MCwgMHgxYiwgS0VZX1BBVVNFIH0sCi0JeyAweDAsIDB4MWYsIEtFWV9GQVNURk9SV0FSRCB9LAotCXsgMHgwLCAweDBjLCBLRVlfUkVDT1JEIH0sCi0JeyAweDAsIDB4MGQsIEtFWV9DQU1FUkEgfSwgLyogc2NyZWVuc2hvdCAqLwotCXsgMHgwLCAweDBlLCBLRVlfQ09GRkVFIH0sIC8qICJNVFMiICovCi19OwotCi1zdGF0aWMgaW5saW5lIGludCBtOTIwNl9yZWFkKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsXAorc3RhdGljIGlubGluZSBpbnQgbTkyMHhfcmVhZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLAogCQkJICAgICB1MTYgaW5kZXgsIHZvaWQgKmRhdGEsIGludCBzaXplKQogewogCWludCByZXQ7CkBAIC01NSwxNCArMzYsMTQgQEAKIAl9CiAKIAlpZiAocmV0ICE9IHNpemUpIHsKLQkJZGViX3JjKCJtOTIweF9yZWFkID0gbm8gZGF0YVxuIik7CisJCWRlYigibTkyMHhfcmVhZCA9IG5vIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbTkyMDZfd3JpdGUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHU4IHJlcXVlc3QsCitzdGF0aWMgaW5saW5lIGludCBtOTIweF93cml0ZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgdTggcmVxdWVzdCwKIAkJCSAgICAgIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQogewogCWludCByZXQ7CkBAIC03NCwzMiArNTUsNDAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG05MjA2X2luaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQorc3RhdGljIGludCBtOTIweF9pbml0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgc3RydWN0IG05MjB4X2luaXRzICpyY19zZXEpCiB7CiAJaW50IHJldCA9IDA7CiAKIAkvKiBSZW1vdGUgY29udHJvbGxlciBpbml0LiAqLwogCWlmIChkLT5wcm9wcy5yY19xdWVyeSkgewotCQlpZiAoKHJldCA9IG05MjA2X3dyaXRlKGQtPnVkZXYsIE05MjA2X0NPUkUsIDB4YTgsIE05MjA2X1JDX0lOSVQyKSkgIT0gMCkKLQkJCXJldHVybiByZXQ7CisJCWRlYigiSW5pdGlhbGlzaW5nIHJlbW90ZSBjb250cm9sXG4iKTsKKwkJd2hpbGUgKHJjX3NlcS0+YWRkcmVzcykgeworCQkJaWYgKChyZXQgPSBtOTIweF93cml0ZShkLT51ZGV2LCBNOTIwNl9DT1JFLAorCQkJCQkgICAgICAgcmNfc2VxLT5kYXRhLAorCQkJCQkgICAgICAgcmNfc2VxLT5hZGRyZXNzKSkgIT0gMCkgeworCQkJCWRlYigiSW5pdGlhbGlzaW5nIHJlbW90ZSBjb250cm9sIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KIAotCQlpZiAoKHJldCA9IG05MjA2X3dyaXRlKGQtPnVkZXYsIE05MjA2X0NPUkUsIDB4NTEsIE05MjA2X1JDX0lOSVQxKSkgIT0gMCkKLQkJCXJldHVybiByZXQ7CisJCQlyY19zZXErKzsKKwkJfQorCisJCWRlYigiSW5pdGlhbGlzaW5nIHJlbW90ZSBjb250cm9sIHN1Y2Nlc3NcbiIpOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbTkyMDZfcmNfcXVlcnkoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1MzIgKmV2ZW50LCBpbnQgKnN0YXRlKQorc3RhdGljIGludCBtOTIweF9yY19xdWVyeShzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHUzMiAqZXZlbnQsIGludCAqc3RhdGUpCiB7Ci0Jc3RydWN0IG05MjA2X3N0YXRlICptID0gZC0+cHJpdjsKKwlzdHJ1Y3QgbTkyMHhfc3RhdGUgKm0gPSBkLT5wcml2OwogCWludCBpLCByZXQgPSAwOwogCXU4IHJjX3N0YXRlWzJdOwogCi0JaWYgKChyZXQgPSBtOTIwNl9yZWFkKGQtPnVkZXYsIE05MjA2X0NPUkUsIDB4MCwgTTkyMDZfUkNfU1RBVEUsIHJjX3N0YXRlLCAxKSkgIT0gMCkKKwlpZiAoKHJldCA9IG05MjB4X3JlYWQoZC0+dWRldiwgTTkyMDZfQ09SRSwgMHgwLCBNOTIwNl9SQ19TVEFURSwgcmNfc3RhdGUsIDEpKSAhPSAwKQogCQlnb3RvIHVubG9jazsKIAotCWlmICgocmV0ID0gbTkyMDZfcmVhZChkLT51ZGV2LCBNOTIwNl9DT1JFLCAweDAsIE05MjA2X1JDX0tFWSwgcmNfc3RhdGUgKyAxLCAxKSkgIT0gMCkKKwlpZiAoKHJldCA9IG05MjB4X3JlYWQoZC0+dWRldiwgTTkyMDZfQ09SRSwgMHgwLCBNOTIwNl9SQ19LRVksIHJjX3N0YXRlICsgMSwgMSkpICE9IDApCiAJCWdvdG8gdW5sb2NrOwogCiAJZm9yIChpID0gMDsgaSA8IGQtPnByb3BzLnJjX2tleV9tYXBfc2l6ZTsgaSsrKQpAQCAtMTExLDYgKzEwMCwxNCBAQAogCQkJCSpzdGF0ZSA9IFJFTU9URV9OT19LRVlfUFJFU1NFRDsKIAkJCQlnb3RvIHVubG9jazsKIAorCQkJY2FzZSAweDg4OiAvKiBmcmFtaW5nIGVycm9yIG9yICJpbnZhbGlkIGNvZGUiICovCisJCQljYXNlIDB4OTk6CisJCQljYXNlIDB4YzA6CisJCQljYXNlIDB4ZDg6CisJCQkJKnN0YXRlID0gUkVNT1RFX05PX0tFWV9QUkVTU0VEOworCQkJCW0tPnJlcF9jb3VudCA9IDA7CisJCQkJZ290byB1bmxvY2s7CisKIAkJCWNhc2UgMHg5MzoKIAkJCWNhc2UgMHg5MjoKIAkJCQltLT5yZXBfY291bnQgPSAwOwpAQCAtMTE4LDMxICsxMTUsMzIgQEAKIAkJCQlnb3RvIHVubG9jazsKIAogCQkJY2FzZSAweDkxOgotCQkJCS8qIEZvciBjb21mb3J0LiAqLworCQkJCS8qIHByZXZlbnQgaW1tZWRpYXRlIGF1dG8tcmVwZWF0ICovCiAJCQkJaWYgKCsrbS0+cmVwX2NvdW50ID4gMikKIAkJCQkJKnN0YXRlID0gUkVNT1RFX0tFWV9SRVBFQVQ7CisJCQkJZWxzZQorCQkJCQkqc3RhdGUgPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQ7CiAJCQkJZ290byB1bmxvY2s7CiAKIAkJCWRlZmF1bHQ6Ci0JCQkJZGViX3JjKCJVbmV4cGVjdGVkIHJjIHJlc3BvbnNlICV4XG4iLCByY19zdGF0ZVswXSk7CisJCQkJZGViKCJVbmV4cGVjdGVkIHJjIHN0YXRlICUwMnhcbiIsIHJjX3N0YXRlWzBdKTsKIAkJCQkqc3RhdGUgPSBSRU1PVEVfTk9fS0VZX1BSRVNTRUQ7CiAJCQkJZ290byB1bmxvY2s7CiAJCQl9CiAJCX0KIAogCWlmIChyY19zdGF0ZVsxXSAhPSAwKQotCQlkZWJfcmMoIlVua25vd24gcmMga2V5ICV4XG4iLCByY19zdGF0ZVsxXSk7CisJCWRlYigiVW5rbm93biByYyBrZXkgJTAyeFxuIiwgcmNfc3RhdGVbMV0pOwogCiAJKnN0YXRlID0gUkVNT1RFX05PX0tFWV9QUkVTU0VEOwogCi0JdW5sb2NrOgorIHVubG9jazoKIAogCXJldHVybiByZXQ7CiB9CiAKIC8qIEkyQyAqLwotc3RhdGljIGludCBtOTIwNl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ1tdLAotCQkJICBpbnQgbnVtKQorc3RhdGljIGludCBtOTIweF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ1tdLCBpbnQgbnVtKQogewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CiAJaW50IGksIGo7CkBAIC0xNTUsMzMgKzE1Myw0MCBAQAogCQlyZXR1cm4gLUVBR0FJTjsKIAogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlpZiAobXNnW2ldLmZsYWdzICYgKEkyQ19NX05PX1JEX0FDS3xJMkNfTV9JR05PUkVfTkFLfEkyQ19NX1RFTikgfHwKLQkJICAgIG1zZ1tpXS5sZW4gPT0gMCkgewotCQkJLyogRm9yIGEgMCBieXRlIG1lc3NhZ2UsIEkgdGhpbmsgc2VuZGluZyB0aGUgYWRkcmVzcyB0byBpbmRleCAweDgwfDB4NDAKLQkJCSAqIHdvdWxkIGJlIHRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvLiAgSG93ZXZlciwgemVybyBieXRlIG1lc3NhZ2VzIGFyZQotCQkJICogb25seSB1c2VkIGZvciBwcm9iaW5nLCBhbmQgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gZ2V0IHRoZSBzbGF2ZSdzCi0JCQkgKiBhY2ssIHdlIGNhbid0IHByb2JlLiAqLworCQlpZiAobXNnW2ldLmZsYWdzICYgKEkyQ19NX05PX1JEX0FDSyB8IEkyQ19NX0lHTk9SRV9OQUsgfCBJMkNfTV9URU4pIHx8IG1zZ1tpXS5sZW4gPT0gMCkgeworCQkJLyogRm9yIGEgMCBieXRlIG1lc3NhZ2UsIEkgdGhpbmsgc2VuZGluZyB0aGUgYWRkcmVzcworCQkJICogdG8gaW5kZXggMHg4MHwweDQwIHdvdWxkIGJlIHRoZSBjb3JyZWN0IHRoaW5nIHRvCisJCQkgKiBkby4gIEhvd2V2ZXIsIHplcm8gYnl0ZSBtZXNzYWdlcyBhcmUgb25seSB1c2VkIGZvcgorCQkJICogcHJvYmluZywgYW5kIHNpbmNlIHdlIGRvbid0IGtub3cgaG93IHRvIGdldCB0aGUKKwkJCSAqIHNsYXZlJ3MgYWNrLCB3ZSBjYW4ndCBwcm9iZS4gKi8KIAkJCXJldCA9IC1FTk9UU1VQUDsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAJCS8qIFNlbmQgU1RBUlQgJiBhZGRyZXNzL1JXIGJpdCAqLwogCQlpZiAoIShtc2dbaV0uZmxhZ3MgJiBJMkNfTV9OT1NUQVJUKSkgewotCQkJaWYgKChyZXQgPSBtOTIwNl93cml0ZShkLT51ZGV2LCBNOTIwNl9JMkMsIChtc2dbaV0uYWRkcjw8MSl8KG1zZ1tpXS5mbGFncyZJMkNfTV9SRD8weDAxOjApLCAweDgwKSkgIT0gMCkKKwkJCWlmICgocmV0ID0gbTkyMHhfd3JpdGUoZC0+dWRldiwgTTkyMDZfSTJDLAorCQkJCQkobXNnW2ldLmFkZHIgPDwgMSkgfAorCQkJCQkobXNnW2ldLmZsYWdzICYgSTJDX01fUkQgPyAweDAxIDogMCksIDB4ODApKSAhPSAwKQogCQkJCWdvdG8gdW5sb2NrOwogCQkJLyogU2hvdWxkIGNoZWNrIGZvciBhY2sgaGVyZSwgaWYgd2Uga25ldyBob3cuICovCiAJCX0KIAkJaWYgKG1zZ1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7CiAJCQlmb3IgKGogPSAwOyBqIDwgbXNnW2ldLmxlbjsgaisrKSB7Ci0JCQkJLyogTGFzdCBieXRlIG9mIHRyYW5zYWN0aW9uPyBTZW5kIFNUT1AsIG90aGVyd2lzZSBzZW5kIEFDSy4gKi8KLQkJCQlpbnQgc3RvcCA9IChpKzEgPT0gbnVtICYmIGorMSA9PSBtc2dbaV0ubGVuKT8weDQwOjB4MDE7Ci0JCQkJaWYgKChyZXQgPSBtOTIwNl9yZWFkKGQtPnVkZXYsIE05MjA2X0kyQywgMHgwLCAweDIwfHN0b3AsICZtc2dbaV0uYnVmW2pdLCAxKSkgIT0gMCkKKwkJCQkvKiBMYXN0IGJ5dGUgb2YgdHJhbnNhY3Rpb24/CisJCQkJICogU2VuZCBTVE9QLCBvdGhlcndpc2Ugc2VuZCBBQ0suICovCisJCQkJaW50IHN0b3AgPSAoaSsxID09IG51bSAmJiBqKzEgPT0gbXNnW2ldLmxlbikgPyAweDQwIDogMHgwMTsKKworCQkJCWlmICgocmV0ID0gbTkyMHhfcmVhZChkLT51ZGV2LCBNOTIwNl9JMkMsIDB4MCwKKwkJCQkJCSAgICAgIDB4MjAgfCBzdG9wLAorCQkJCQkJICAgICAgJm1zZ1tpXS5idWZbal0sIDEpKSAhPSAwKQogCQkJCQlnb3RvIHVubG9jazsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWZvciAoaiA9IDA7IGogPCBtc2dbaV0ubGVuOyBqKyspIHsKIAkJCQkvKiBMYXN0IGJ5dGUgb2YgdHJhbnNhY3Rpb24/IFRoZW4gc2VuZCBTVE9QLiAqLwotCQkJCWludCBzdG9wID0gKGkrMSA9PSBudW0gJiYgaisxID09IG1zZ1tpXS5sZW4pPzB4NDA6MHgwMDsKLQkJCQlpZiAoKHJldCA9IG05MjA2X3dyaXRlKGQtPnVkZXYsIE05MjA2X0kyQywgbXNnW2ldLmJ1ZltqXSwgc3RvcCkpICE9IDApCisJCQkJaW50IHN0b3AgPSAoaSsxID09IG51bSAmJiBqKzEgPT0gbXNnW2ldLmxlbikgPyAweDQwIDogMHgwMDsKKworCQkJCWlmICgocmV0ID0gbTkyMHhfd3JpdGUoZC0+dWRldiwgTTkyMDZfSTJDLCBtc2dbaV0uYnVmW2pdLCBzdG9wKSkgIT0gMCkKIAkJCQkJZ290byB1bmxvY2s7CiAJCQkJLyogU2hvdWxkIGNoZWNrIGZvciBhY2sgaGVyZSB0b28uICovCiAJCQl9CkBAIC0xODksMjUgKzE5NCwyNSBAQAogCX0KIAlyZXQgPSBudW07CiAKLXVubG9jazoKKyB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZkLT5pMmNfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHUzMiBtOTIwNl9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdTMyIG05MjB4X2kyY19mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlyZXR1cm4gSTJDX0ZVTkNfSTJDOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gbTkyMDZfaTJjX2FsZ28gPSB7Ci0JLm1hc3Rlcl94ZmVyICAgPSBtOTIwNl9pMmNfeGZlciwKLQkuZnVuY3Rpb25hbGl0eSA9IG05MjA2X2kyY19mdW5jLAorc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIG05MjB4X2kyY19hbGdvID0geworCS5tYXN0ZXJfeGZlciAgID0gbTkyMHhfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBtOTIweF9pMmNfZnVuYywKIH07CiAKLQotc3RhdGljIGludCBtOTIwNl9zZXRfZmlsdGVyKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAsIGludCB0eXBlLCBpbnQgaWR4LAotCQkJICAgIGludCBwaWQpCisvKiBwaWQgZmlsdGVyICovCitzdGF0aWMgaW50IG05MjB4X3NldF9maWx0ZXIoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCwKKwkJCSAgICBpbnQgdHlwZSwgaW50IGlkeCwgaW50IHBpZCkKIHsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjE2LDE4ICsyMjEsMTggQEAKIAogCXBpZCB8PSAweDgwMDA7CiAKLQlpZiAoKHJldCA9IG05MjA2X3dyaXRlKGFkYXAtPmRldi0+dWRldiwgTTkyMDZfRklMVEVSLCBwaWQsICh0eXBlIDw8IDgpIHwgKGlkeCAqIDQpICkpICE9IDApCisJaWYgKChyZXQgPSBtOTIweF93cml0ZShhZGFwLT5kZXYtPnVkZXYsIE05MjA2X0ZJTFRFUiwgcGlkLCAodHlwZSA8PCA4KSB8IChpZHggKiA0KSApKSAhPSAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKChyZXQgPSBtOTIwNl93cml0ZShhZGFwLT5kZXYtPnVkZXYsIE05MjA2X0ZJTFRFUiwgMCwgKHR5cGUgPDwgOCkgfCAoaWR4ICogNCkgKSkgIT0gMCkKKwlpZiAoKHJldCA9IG05MjB4X3dyaXRlKGFkYXAtPmRldi0+dWRldiwgTTkyMDZfRklMVEVSLCAwLCAodHlwZSA8PCA4KSB8IChpZHggKiA0KSApKSAhPSAwKQogCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtOTIwNl91cGRhdGVfZmlsdGVycyhzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQorc3RhdGljIGludCBtOTIweF91cGRhdGVfZmlsdGVycyhzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCXN0cnVjdCBtOTIwNl9zdGF0ZSAqbSA9IGFkYXAtPmRldi0+cHJpdjsKKwlzdHJ1Y3QgbTkyMHhfc3RhdGUgKm0gPSBhZGFwLT5kZXYtPnByaXY7CiAJaW50IGVuYWJsZWQgPSBtLT5maWx0ZXJpbmdfZW5hYmxlZDsKIAlpbnQgaSwgcmV0ID0gMCwgZmlsdGVyID0gMDsKIApAQCAtMjM2LDE0ICsyNDEsMTQgQEAKIAkJCWVuYWJsZWQgPSAwOwogCiAJLyogRGlzYWJsZSBhbGwgZmlsdGVycyAqLwotCWlmICgocmV0ID0gbTkyMDZfc2V0X2ZpbHRlcihhZGFwLCAweDgxLCAxLCBlbmFibGVkKSkgIT0gMCkKKwlpZiAoKHJldCA9IG05MjB4X3NldF9maWx0ZXIoYWRhcCwgMHg4MSwgMSwgZW5hYmxlZCkpICE9IDApCiAJCXJldHVybiByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTTkyMDZfTUFYX0ZJTFRFUlM7IGkrKykKLQkJaWYgKChyZXQgPSBtOTIwNl9zZXRfZmlsdGVyKGFkYXAsIDB4ODEsIGkgKyAyLCAwKSkgIT0gMCkKKwkJaWYgKChyZXQgPSBtOTIweF9zZXRfZmlsdGVyKGFkYXAsIDB4ODEsIGkgKyAyLCAwKSkgIT0gMCkKIAkJCXJldHVybiByZXQ7CiAKLQlpZiAoKHJldCA9IG05MjA2X3NldF9maWx0ZXIoYWRhcCwgMHg4MiwgMCwgMHgwKSkgIT0gMCkKKwlpZiAoKHJldCA9IG05MjB4X3NldF9maWx0ZXIoYWRhcCwgMHg4MiwgMCwgMHgwKSkgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIFNldCAqLwpAQCAtMjUyLDQwICsyNTcsMzggQEAKIAkJCWlmIChtLT5maWx0ZXJzW2ldID09IDApCiAJCQkJY29udGludWU7CiAKLQkJCWlmICgocmV0ID0gbTkyMDZfc2V0X2ZpbHRlcihhZGFwLCAweDgxLCBmaWx0ZXIgKyAyLCBtLT5maWx0ZXJzW2ldKSkgIT0gMCkKKwkJCWlmICgocmV0ID0gbTkyMHhfc2V0X2ZpbHRlcihhZGFwLCAweDgxLCBmaWx0ZXIgKyAyLCBtLT5maWx0ZXJzW2ldKSkgIT0gMCkKIAkJCQlyZXR1cm4gcmV0OwogCiAJCQlmaWx0ZXIrKzsKIAkJfQogCX0KIAotCWlmICgocmV0ID0gbTkyMDZfc2V0X2ZpbHRlcihhZGFwLCAweDgyLCAwLCAweDAyZjUpKSAhPSAwKQorCWlmICgocmV0ID0gbTkyMHhfc2V0X2ZpbHRlcihhZGFwLCAweDgyLCAwLCAweDAyZjUpKSAhPSAwKQogCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtOTIwNl9waWRfZmlsdGVyX2N0cmwoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCwgaW50IG9ub2ZmKQorc3RhdGljIGludCBtOTIweF9waWRfZmlsdGVyX2N0cmwoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCwgaW50IG9ub2ZmKQogewotCXN0cnVjdCBtOTIwNl9zdGF0ZSAqbSA9IGFkYXAtPmRldi0+cHJpdjsKKwlzdHJ1Y3QgbTkyMHhfc3RhdGUgKm0gPSBhZGFwLT5kZXYtPnByaXY7CiAKIAltLT5maWx0ZXJpbmdfZW5hYmxlZCA9IG9ub2ZmID8gMSA6IDA7CiAKLQlyZXR1cm4gbTkyMDZfdXBkYXRlX2ZpbHRlcnMoYWRhcCk7CisJcmV0dXJuIG05MjB4X3VwZGF0ZV9maWx0ZXJzKGFkYXApOwogfQogCi1zdGF0aWMgaW50IG05MjA2X3BpZF9maWx0ZXIoc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCwgaW50IGluZGV4LCB1MTYgcGlkLAotCQkJICAgIGludCBvbm9mZikKK3N0YXRpYyBpbnQgbTkyMHhfcGlkX2ZpbHRlcihzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwLCBpbnQgaW5kZXgsIHUxNiBwaWQsIGludCBvbm9mZikKIHsKLQlzdHJ1Y3QgbTkyMDZfc3RhdGUgKm0gPSBhZGFwLT5kZXYtPnByaXY7CisJc3RydWN0IG05MjB4X3N0YXRlICptID0gYWRhcC0+ZGV2LT5wcml2OwogCiAJbS0+ZmlsdGVyc1tpbmRleF0gPSBvbm9mZiA/IHBpZCA6IDA7CiAKLQlyZXR1cm4gbTkyMDZfdXBkYXRlX2ZpbHRlcnMoYWRhcCk7CisJcmV0dXJuIG05MjB4X3VwZGF0ZV9maWx0ZXJzKGFkYXApOwogfQogCi1zdGF0aWMgaW50IG05MjA2X2Zpcm13YXJlX2Rvd25sb2FkKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCitzdGF0aWMgaW50IG05MjB4X2Zpcm13YXJlX2Rvd25sb2FkKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQogewogCXUxNiB2YWx1ZSwgaW5kZXgsIHNpemU7CiAJdTggcmVhZFs0XSwgKmJ1ZmY7CkBAIC0yOTMsMTMgKzI5NiwxMyBAQAogCiAJYnVmZiA9IGttYWxsb2MoNjU1MzYsIEdGUF9LRVJORUwpOwogCi0JaWYgKChyZXQgPSBtOTIwNl9yZWFkKHVkZXYsIE05MjA2X0ZJTFRFUiwgMHgwLCAweDgwMDAsIHJlYWQsIDQpKSAhPSAwKQorCWlmICgocmV0ID0gbTkyMHhfcmVhZCh1ZGV2LCBNOTIwNl9GSUxURVIsIDB4MCwgMHg4MDAwLCByZWFkLCA0KSkgIT0gMCkKIAkJZ290byBkb25lOwotCWRlYl9yYygiJXggJXggJXggJXhcbiIsIHJlYWRbMF0sIHJlYWRbMV0sIHJlYWRbMl0sIHJlYWRbM10pOworCWRlYigiJXggJXggJXggJXhcbiIsIHJlYWRbMF0sIHJlYWRbMV0sIHJlYWRbMl0sIHJlYWRbM10pOwogCi0JaWYgKChyZXQgPSBtOTIwNl9yZWFkKHVkZXYsIE05MjA2X0ZXLCAweDAsIDB4MCwgcmVhZCwgMSkpICE9IDApCisJaWYgKChyZXQgPSBtOTIweF9yZWFkKHVkZXYsIE05MjA2X0ZXLCAweDAsIDB4MCwgcmVhZCwgMSkpICE9IDApCiAJCWdvdG8gZG9uZTsKLQlkZWJfcmMoIiV4XG4iLCByZWFkWzBdKTsKKwlkZWIoIiV4XG4iLCByZWFkWzBdKTsKIAogCWZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspIHsKIAkJZm9yIChpID0gMDsgaSArIChzaXplb2YodTE2KSAqIDMpIDwgZnctPnNpemU7KSB7CkBAIC0zMTcsMTEgKzMyMCwxMSBAQAogCQkJCW1lbWNweShidWZmLCBmdy0+ZGF0YSArIGksIHNpemUpOwogCiAJCQkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LDApLAotCQkJCQkgICAgTTkyMDZfRlcsCi0JCQkJCSAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCwKLQkJCQkJICAgIHZhbHVlLCBpbmRleCwgYnVmZiwgc2l6ZSwgMjApOworCQkJCQkJICAgICAgTTkyMDZfRlcsCisJCQkJCQkgICAgICBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfRElSX09VVCwKKwkJCQkJCSAgICAgIHZhbHVlLCBpbmRleCwgYnVmZiwgc2l6ZSwgMjApOwogCQkJCWlmIChyZXQgIT0gc2l6ZSkgewotCQkJCQlkZWJfcmMoImVycm9yIHdoaWxlIHVwbG9hZGluZyBmdyFcbiIpOworCQkJCQlkZWIoImVycm9yIHdoaWxlIHVwbG9hZGluZyBmdyFcbiIpOwogCQkJCQlyZXQgPSAtRUlPOwogCQkJCQlnb3RvIGRvbmU7CiAJCQkJfQpAQCAtMzMwLDcgKzMzMyw3IEBACiAJCQlpICs9IHNpemU7CiAJCX0KIAkJaWYgKGkgIT0gZnctPnNpemUpIHsKLQkJCWRlYl9yYygiYmFkIGZpcm13YXJlIGZpbGUhXG4iKTsKKwkJCWRlYigiYmFkIGZpcm13YXJlIGZpbGUhXG4iKTsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIGRvbmU7CiAJCX0KQEAgLTMzOCwxMSArMzQxLDExIEBACiAKIAltc2xlZXAoMzYpOwogCi0JLyogbTkyMDYgd2lsbCBkaXNjb25uZWN0IGl0c2VsZiBmcm9tIHRoZSBidXMgYWZ0ZXIgdGhpcy4gKi8KLQkodm9pZCkgbTkyMDZfd3JpdGUodWRldiwgTTkyMDZfQ09SRSwgMHgwMSwgTTkyMDZfRldfR08pOwotCWRlYl9yYygiZmlybXdhcmUgdXBsb2FkZWQhXG4iKTsKKwkvKiBtOTIweCB3aWxsIGRpc2Nvbm5lY3QgaXRzZWxmIGZyb20gdGhlIGJ1cyBhZnRlciB0aGlzLiAqLworCSh2b2lkKSBtOTIweF93cml0ZSh1ZGV2LCBNOTIwNl9DT1JFLCAweDAxLCBNOTIwNl9GV19HTyk7CisJZGViKCJmaXJtd2FyZSB1cGxvYWRlZCFcbiIpOwogCi0JZG9uZToKKyBkb25lOgogCWtmcmVlKGJ1ZmYpOwogCiAJcmV0dXJuIHJldDsKQEAgLTM2Miw3ICszNjUsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1lZ2Fza3lfbXQzNTJfZGVtb2RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKKy8qIGRlbW9kIGNvbmZpZ3VyYXRpb25zICovCitzdGF0aWMgaW50IG05MjB4X210MzUyX2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJdTggY29uZmlnW10gPSB7IENPTkZJRywgMHgzZCB9OwogCXU4IGNsb2NrW10gPSB7IENMT0NLX0NUTCwgMHgzMCB9OwpAQCAtMzgyLDQxICszODYsMTggQEAKIAltdDM1Ml93cml0ZShmZSwgdW5rMSwgQVJSQVlfU0laRSh1bmsxKSk7CiAJbXQzNTJfd3JpdGUoZmUsIHVuazIsIEFSUkFZX1NJWkUodW5rMikpOwogCi0JZGViX3JjKCJEZW1vZCBpbml0IVxuIik7CisJZGViKCJEZW1vZCBpbml0IVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgbWVnYXNreV9tdDM1Ml9jb25maWcgPSB7CitzdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyBtOTIweF9tdDM1Ml9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5ub190dW5lciA9IDEsCi0JLmRlbW9kX2luaXQgPSBtZWdhc2t5X210MzUyX2RlbW9kX2luaXQsCisJLmRlbW9kX2luaXQgPSBtOTIweF9tdDM1Ml9kZW1vZF9pbml0LAogfTsKIAotc3RhdGljIGludCBtZWdhc2t5X210MzUyX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQotewotCWRlYl9yYygibWVnYXNreV9mcm9udGVuZF9hdHRhY2ghXG4iKTsKLQotCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwgJm1lZ2Fza3lfbXQzNTJfY29uZmlnLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcXQxMDEwX2NvbmZpZyBtZWdhc2t5X3F0MTAxMF9jb25maWcgPSB7Ci0JLmkyY19hZGRyZXNzID0gMHg2MgotfTsKLQotc3RhdGljIGludCBtZWdhc2t5X3F0MTAxMF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKLXsKLQlpZiAoZHZiX2F0dGFjaChxdDEwMTBfYXR0YWNoLCBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCi0JCSAgICAgICAmbWVnYXNreV9xdDEwMTBfY29uZmlnKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBkaWdpdm94X3RkYTEwMDQ2X2NvbmZpZyA9IHsKK3N0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIG05MjB4X3RkYTEwMDQ2XzA4X2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCiAJLmludmVydCA9IDAsCiAJLmludmVydF9vY2xrID0gMCwKQEAgLTQyOCwyOCArNDA5LDE1MSBAQAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gTlVMTCwKIH07CiAKLXN0YXRpYyBpbnQgZGlnaXZveF90ZGExMDA0Nl9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKLXsKLQlkZWJfcmMoImRpZ2l2b3hfdGRhMTAwNDZfZnJvbnRlbmRfYXR0YWNoIVxuIik7CitzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBtOTIweF90ZGExMDA0Nl8wYl9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDBiLAorCS5pbnZlcnQgPSAwLAorCS5pbnZlcnRfb2NsayA9IDAsCisJLnRzX21vZGUgPSBUREExMDA0Nl9UU19TRVJJQUwsCisJLnh0YWxfZnJlcSA9IFREQTEwMDQ2X1hUQUxfMTZNLAorCS5pZl9mcmVxID0gVERBMTAwNDZfRlJFUV8wNDUsCisJLmFnY19jb25maWcgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKKwkuZ3Bpb19jb25maWcgPSBUREExMDA0Nl9HUFRSSSwKKwkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsIC8qIHVzZXMgZmlybXdhcmUgRUVQUk9NICovCit9OwogCi0JaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLCAmZGlnaXZveF90ZGExMDA0Nl9jb25maWcsCisvKiB0dW5lciBjb25maWd1cmF0aW9ucyAqLworc3RhdGljIHN0cnVjdCBxdDEwMTBfY29uZmlnIG05MjB4X3F0MTAxMF9jb25maWcgPSB7CisJLmkyY19hZGRyZXNzID0gMHg2MgorfTsKKworLyogQ2FsbGJhY2tzIGZvciBEVkIgVVNCICovCitzdGF0aWMgaW50IG05MjB4X210MzUyX2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCWRlYigiJXNcbiIsX19GVU5DVElPTl9fKTsKKworCWlmICgoYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKG10MzUyX2F0dGFjaCwKKwkJCQkgICAmbTkyMHhfbXQzNTJfY29uZmlnLAogCQkJCSAgICZhZGFwLT5kZXYtPmkyY19hZGFwKSkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU87CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkaWdpdm94X3RkYTgyNzVfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCitzdGF0aWMgaW50IG05MjB4X3RkYTEwMDQ2XzA4X2Zyb250ZW5kX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQogewotCWlmIChkdmJfYXR0YWNoKHRkYTgyN3hfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MCwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCi0JCSAgICAgICBOVUxMKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlkZWIoIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoKGFkYXAtPmZlID0gZHZiX2F0dGFjaCh0ZGExMDA0Nl9hdHRhY2gsCisJCQkJICAgJm05MjB4X3RkYTEwMDQ2XzA4X2NvbmZpZywKKwkJCQkgICAmYWRhcC0+ZGV2LT5pMmNfYWRhcCkpID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbTkyMHhfdGRhMTAwNDZfMGJfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJZGViKCIlc1xuIixfX0ZVTkNUSU9OX18pOworCisJaWYgKChhZGFwLT5mZSA9IGR2Yl9hdHRhY2godGRhMTAwNDZfYXR0YWNoLAorCQkJCSAgICZtOTIweF90ZGExMDA0Nl8wYl9jb25maWcsCisJCQkJICAgJmFkYXAtPmRldi0+aTJjX2FkYXApKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG05MjB4X3F0MTAxMF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlkZWIoIiVzXG4iLF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoZHZiX2F0dGFjaChxdDEwMTBfYXR0YWNoLCBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsICZtOTIweF9xdDEwMTBfY29uZmlnKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG05MjB4X3RkYTgyNzVfNjBfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCit7CisJZGViKCIlc1xuIixfX0ZVTkNUSU9OX18pOworCisJaWYgKGR2Yl9hdHRhY2godGRhODI3eF9hdHRhY2gsIGFkYXAtPmZlLCAweDYwLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwgTlVMTCkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtOTIweF90ZGE4Mjc1XzYxX3R1bmVyX2F0dGFjaChzdHJ1Y3QgZHZiX3VzYl9hZGFwdGVyICphZGFwKQoreworCWRlYigiJXNcbiIsX19GVU5DVElPTl9fKTsKKworCWlmIChkdmJfYXR0YWNoKHRkYTgyN3hfYXR0YWNoLCBhZGFwLT5mZSwgMHg2MSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsIE5VTEwpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRldmljZS1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIHN0cnVjdCBtOTIweF9pbml0cyBtZWdhc2t5X3JjX2luaXQgW10gPSB7CisJeyBNOTIwNl9SQ19JTklUMiwgMHhhOCB9LAorCXsgTTkyMDZfUkNfSU5JVDEsIDB4NTEgfSwKKwl7IH0gLyogdGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgbTkyMHhfaW5pdHMgdHZ3YWxrZXJ0d2luX3JjX2luaXQgW10gPSB7CisJeyBNOTIwNl9SQ19JTklUMiwgMHgwMCB9LAorCXsgTTkyMDZfUkNfSU5JVDEsIDB4ZWYgfSwKKwl7IDB4ZmYyOCwgICAgICAgICAweDAwIH0sCisJeyAweGZmMjMsICAgICAgICAgMHgwMCB9LAorCXsgMHhmZjIxLCAgICAgICAgIDB4MzAgfSwKKwl7IH0gLyogdGVybWluYXRpbmcgZW50cnkgKi8KK307CisKKy8qIGlyIGtleW1hcHMgKi8KK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9yY19rZXkgbWVnYXNreV9yY19rZXlzIFtdID0geworCXsgMHgwLCAweDEyLCBLRVlfUE9XRVIgfSwKKwl7IDB4MCwgMHgxZSwgS0VZX0NZQ0xFV0lORE9XUyB9LCAvKiBtaW4vbWF4ICovCisJeyAweDAsIDB4MDIsIEtFWV9DSEFOTkVMVVAgfSwKKwl7IDB4MCwgMHgwNSwgS0VZX0NIQU5ORUxET1dOIH0sCisJeyAweDAsIDB4MDMsIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgwLCAweDA2LCBLRVlfVk9MVU1FRE9XTiB9LAorCXsgMHgwLCAweDA0LCBLRVlfTVVURSB9LAorCXsgMHgwLCAweDA3LCBLRVlfT0sgfSwgLyogVFMgKi8KKwl7IDB4MCwgMHgwOCwgS0VZX1NUT1AgfSwKKwl7IDB4MCwgMHgwOSwgS0VZX01FTlUgfSwgLyogc3dhcCAqLworCXsgMHgwLCAweDBhLCBLRVlfUkVXSU5EIH0sCisJeyAweDAsIDB4MWIsIEtFWV9QQVVTRSB9LAorCXsgMHgwLCAweDFmLCBLRVlfRkFTVEZPUldBUkQgfSwKKwl7IDB4MCwgMHgwYywgS0VZX1JFQ09SRCB9LAorCXsgMHgwLCAweDBkLCBLRVlfQ0FNRVJBIH0sIC8qIHNjcmVlbnNob3QgKi8KKwl7IDB4MCwgMHgwZSwgS0VZX0NPRkZFRSB9LCAvKiAiTVRTIiAqLworfTsKKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3JjX2tleSB0dndhbGtlcnR3aW5fcmNfa2V5cyBbXSA9IHsKKwl7IDB4MCwgMHgwMSwgS0VZX1pPT00gfSwgLyogRnVsbCBTY3JlZW4gKi8KKwl7IDB4MCwgMHgwMiwgS0VZX0NBTUVSQSB9LCAvKiBzbmFwc2hvdCAqLworCXsgMHgwLCAweDAzLCBLRVlfTVVURSB9LAorCXsgMHgwLCAweDA0LCBLRVlfUkVXSU5EIH0sCisJeyAweDAsIDB4MDUsIEtFWV9QTEFZUEFVU0UgfSwgLyogUGxheS9QYXVzZSAqLworCXsgMHgwLCAweDA2LCBLRVlfRkFTVEZPUldBUkQgfSwKKwl7IDB4MCwgMHgwNywgS0VZX1JFQ09SRCB9LAorCXsgMHgwLCAweDA4LCBLRVlfU1RPUCB9LAorCXsgMHgwLCAweDA5LCBLRVlfVElNRSB9LCAvKiBUaW1lc2hpZnQgKi8KKwl7IDB4MCwgMHgwYywgS0VZX0NPRkZFRSB9LCAvKiBSZWNhbGwgKi8KKwl7IDB4MCwgMHgwZSwgS0VZX0NIQU5ORUxVUCB9LAorCXsgMHgwLCAweDEyLCBLRVlfUE9XRVIgfSwKKwl7IDB4MCwgMHgxNSwgS0VZX01FTlUgfSwgLyogc291cmNlICovCisJeyAweDAsIDB4MTgsIEtFWV9DWUNMRVdJTkRPV1MgfSwgLyogVFdJTiBQSVAgKi8KKwl7IDB4MCwgMHgxYSwgS0VZX0NIQU5ORUxET1dOIH0sCisJeyAweDAsIDB4MWIsIEtFWV9WT0xVTUVET1dOIH0sCisJeyAweDAsIDB4MWUsIEtFWV9WT0xVTUVVUCB9LAorfTsKKwogLyogRFZCIFVTQiBEcml2ZXIgc3R1ZmYgKi8KIHN0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9kZXZpY2VfcHJvcGVydGllcyBtZWdhc2t5X3Byb3BlcnRpZXM7CiBzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgZGlnaXZveF9taW5pX2lpX3Byb3BlcnRpZXM7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgdHZ3YWxrZXJ0d2luX3Byb3BlcnRpZXM7CitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgZHBvc2hfcHJvcGVydGllczsKIAogc3RhdGljIGludCBtOTIweF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKIAkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKQEAgLTQ1NywxOSArNTYxLDU3IEBACiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKIAlpbnQgcmV0OworCXN0cnVjdCBtOTIweF9pbml0cyAqcmNfaW5pdF9zZXEgPSBOVUxMOworCWludCBiSW50ZXJmYWNlTnVtYmVyID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKIAotCWRlYl9yYygiUHJvYmVkIVxuIik7CisJZGViKCJQcm9iaW5nIGZvciBtOTIweCBkZXZpY2UgYXQgaW50ZXJmYWNlICVkXG4iLCBiSW50ZXJmYWNlTnVtYmVyKTsKIAotCWlmICgoKHJldCA9IGR2Yl91c2JfZGV2aWNlX2luaXQoaW50ZiwgJm1lZ2Fza3lfcHJvcGVydGllcywgVEhJU19NT0RVTEUsICZkKSkgPT0gMCkgfHwKLQkgICAgKChyZXQgPSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsICZkaWdpdm94X21pbmlfaWlfcHJvcGVydGllcywgVEhJU19NT0RVTEUsICZkKSkgPT0gMCkpCi0JCWdvdG8gZm91bmQ7CisJaWYgKGJJbnRlcmZhY2VOdW1iZXIgPT0gMCkgeworCQkvKiBTaW5nbGUtdHVuZXIgZGV2aWNlLCBvciBmaXJzdCBpbnRlcmZhY2Ugb24KKwkJICogbXVsdGktdHVuZXIgZGV2aWNlCisJCSAqLwogCi0JcmV0dXJuIHJldDsKKwkJaWYgKChyZXQgPSBkdmJfdXNiX2RldmljZV9pbml0KGludGYsICZtZWdhc2t5X3Byb3BlcnRpZXMsCisJCQkJCSAgICAgICBUSElTX01PRFVMRSwgJmQpKSA9PSAwKSB7CisJCQlyY19pbml0X3NlcSA9IG1lZ2Fza3lfcmNfaW5pdDsKKwkJCWdvdG8gZm91bmQ7CisJCX0KIAotZm91bmQ6CisJCWlmICgocmV0ID0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmZGlnaXZveF9taW5pX2lpX3Byb3BlcnRpZXMsCisJCQkJCSAgICAgICBUSElTX01PRFVMRSwgJmQpKSA9PSAwKSB7CisJCQkvKiBObyByZW1vdGUgY29udHJvbCwgc28gbm8gcmNfaW5pdF9zZXEgKi8KKwkJCWdvdG8gZm91bmQ7CisJCX0KKworCQkvKiBUaGlzIGNvbmZpZ3VyZXMgYm90aCB0dW5lcnMgb24gdGhlIFRWIFdhbGtlciBUd2luICovCisJCWlmICgocmV0ID0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmdHZ3YWxrZXJ0d2luX3Byb3BlcnRpZXMsCisJCQkJCSAgICAgICBUSElTX01PRFVMRSwgJmQpKSA9PSAwKSB7CisJCQlyY19pbml0X3NlcSA9IHR2d2Fsa2VydHdpbl9yY19pbml0OworCQkJZ290byBmb3VuZDsKKwkJfQorCisJCWlmICgocmV0ID0gZHZiX3VzYl9kZXZpY2VfaW5pdChpbnRmLCAmZHBvc2hfcHJvcGVydGllcywKKwkJCQkJICAgICAgIFRISVNfTU9EVUxFLCAmZCkpID09IDApIHsKKwkJCS8qIFJlbW90ZSBjb250cm9sbGVyIG5vdCBzdXBwb3J0ZWQgeWV0LiAqLworCQkJZ290byBmb3VuZDsKKwkJfQorCisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJLyogQW5vdGhlciBpbnRlcmZhY2Ugb24gYSBtdWx0aS10dW5lciBkZXZpY2UgKi8KKworCQkvKiBUaGUgTGlmZVZpZXcgVFYgV2Fsa2VyIFR3aW4gZ2V0cyBoZXJlLCBidXQgc3RydWN0CisJCSAqIHR2d2Fsa2VydHdpbl9wcm9wZXJ0aWVzIGFscmVhZHkgY29uZmlndXJlZCBib3RoCisJCSAqIHR1bmVycywgc28gdGhlcmUgaXMgbm90aGluZyBmb3IgdXMgdG8gZG8gaGVyZQorCQkgKi8KKworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKyBmb3VuZDoKIAlhbHQgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaW50ZiwgMSk7CiAJaWYgKGFsdCA9PSBOVUxMKSB7Ci0JCWRlYl9yYygiTm8gYWx0IGZvdW5kIVxuIik7CisJCWRlYigiTm8gYWx0IGZvdW5kIVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNDc4LDcgKzYyMCw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoKHJldCA9IG05MjA2X2luaXQoZCkpICE9IDApCisJaWYgKChyZXQgPSBtOTIweF9pbml0KGQsIHJjX2luaXRfc2VxKSkgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldHVybiByZXQ7CkBAIC00ODgsNiArNjMwLDEyIEBACiAJCXsgVVNCX0RFVklDRShVU0JfVklEX01TSSwgVVNCX1BJRF9NU0lfTUVHQVNLWTU4MCkgfSwKIAkJeyBVU0JfREVWSUNFKFVTQl9WSURfQU5VQklTX0VMRUNUUk9OSUMsCiAJCQkgICAgIFVTQl9QSURfTVNJX0RJR0lfVk9YX01JTklfSUkpIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX0FOVUJJU19FTEVDVFJPTklDLAorCQkJICAgICBVU0JfUElEX0xJRkVWSUVXX1RWX1dBTEtFUl9UV0lOX0NPTEQpIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX0FOVUJJU19FTEVDVFJPTklDLAorCQkJICAgICBVU0JfUElEX0xJRkVWSUVXX1RWX1dBTEtFUl9UV0lOX1dBUk0pIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX0RQT1NILCBVU0JfUElEX0RQT1NIX005MjA2X0NPTEQpIH0sCisJCXsgVVNCX0RFVklDRShVU0JfVklEX0RQT1NILCBVU0JfUElEX0RQT1NIX005MjA2X1dBUk0pIH0sCiAJCXsgfQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIG05MjB4X3RhYmxlKTsKQEAgLTQ5NywxNCArNjQ1LDE0IEBACiAKIAkudXNiX2N0cmwgPSBERVZJQ0VfU1BFQ0lGSUMsCiAJLmZpcm13YXJlID0gImR2Yi11c2ItbWVnYXNreS0wMi5mdyIsCi0JLmRvd25sb2FkX2Zpcm13YXJlID0gbTkyMDZfZmlybXdhcmVfZG93bmxvYWQsCisJLmRvd25sb2FkX2Zpcm13YXJlID0gbTkyMHhfZmlybXdhcmVfZG93bmxvYWQsCiAKIAkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKIAkucmNfa2V5X21hcCAgICAgICA9IG1lZ2Fza3lfcmNfa2V5cywKIAkucmNfa2V5X21hcF9zaXplICA9IEFSUkFZX1NJWkUobWVnYXNreV9yY19rZXlzKSwKLQkucmNfcXVlcnkgICAgICAgICA9IG05MjA2X3JjX3F1ZXJ5LAorCS5yY19xdWVyeSAgICAgICAgID0gbTkyMHhfcmNfcXVlcnksCiAKLQkuc2l6ZV9vZl9wcml2ICAgICA9IHNpemVvZihzdHJ1Y3QgbTkyMDZfc3RhdGUpLAorCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBtOTIweF9zdGF0ZSksCiAKIAkuaWRlbnRpZnlfc3RhdGUgICA9IG05MjB4X2lkZW50aWZ5X3N0YXRlLAogCS5udW1fYWRhcHRlcnMgPSAxLApAQCAtNTEzLDExICs2NjEsMTEgQEAKIAkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAogCiAJCS5waWRfZmlsdGVyX2NvdW50ID0gOCwKLQkJLnBpZF9maWx0ZXIgICAgICAgPSBtOTIwNl9waWRfZmlsdGVyLAotCQkucGlkX2ZpbHRlcl9jdHJsICA9IG05MjA2X3BpZF9maWx0ZXJfY3RybCwKKwkJLnBpZF9maWx0ZXIgICAgICAgPSBtOTIweF9waWRfZmlsdGVyLAorCQkucGlkX2ZpbHRlcl9jdHJsICA9IG05MjB4X3BpZF9maWx0ZXJfY3RybCwKIAotCQkuZnJvbnRlbmRfYXR0YWNoICA9IG1lZ2Fza3lfbXQzNTJfZnJvbnRlbmRfYXR0YWNoLAotCQkudHVuZXJfYXR0YWNoICAgICA9IG1lZ2Fza3lfcXQxMDEwX3R1bmVyX2F0dGFjaCwKKwkJLmZyb250ZW5kX2F0dGFjaCAgPSBtOTIweF9tdDM1Ml9mcm9udGVuZF9hdHRhY2gsCisJCS50dW5lcl9hdHRhY2ggICAgID0gbTkyMHhfcXQxMDEwX3R1bmVyX2F0dGFjaCwKIAogCQkuc3RyZWFtID0gewogCQkJLnR5cGUgPSBVU0JfQlVMSywKQEAgLTUzMCw3ICs2NzgsNyBAQAogCQkJfQogCQl9LAogCX19LAotCS5pMmNfYWxnbyAgICAgICAgID0gJm05MjA2X2kyY19hbGdvLAorCS5pMmNfYWxnbyAgICAgICAgID0gJm05MjB4X2kyY19hbGdvLAogCiAJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAogCS5kZXZpY2VzID0gewpAQCAtNTQ2LDIyICs2OTQsMjIgQEAKIAogCS51c2JfY3RybCA9IERFVklDRV9TUEVDSUZJQywKIAkuZmlybXdhcmUgPSAiZHZiLXVzYi1kaWdpdm94LTAyLmZ3IiwKLQkuZG93bmxvYWRfZmlybXdhcmUgPSBtOTIwNl9maXJtd2FyZV9kb3dubG9hZCwKKwkuZG93bmxvYWRfZmlybXdhcmUgPSBtOTIweF9maXJtd2FyZV9kb3dubG9hZCwKIAotCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBtOTIwNl9zdGF0ZSksCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IG05MjB4X3N0YXRlKSwKIAogCS5pZGVudGlmeV9zdGF0ZSAgID0gbTkyMHhfaWRlbnRpZnlfc3RhdGUsCiAJLm51bV9hZGFwdGVycyA9IDEsCiAJLmFkYXB0ZXIgPSB7ewogCQkuY2FwcyA9IERWQl9VU0JfQURBUF9IQVNfUElEX0ZJTFRFUiB8Ci0JCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAorCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCiAKIAkJLnBpZF9maWx0ZXJfY291bnQgPSA4LAotCQkucGlkX2ZpbHRlciAgICAgICA9IG05MjA2X3BpZF9maWx0ZXIsCi0JCS5waWRfZmlsdGVyX2N0cmwgID0gbTkyMDZfcGlkX2ZpbHRlcl9jdHJsLAorCQkucGlkX2ZpbHRlciAgICAgICA9IG05MjB4X3BpZF9maWx0ZXIsCisJCS5waWRfZmlsdGVyX2N0cmwgID0gbTkyMHhfcGlkX2ZpbHRlcl9jdHJsLAogCi0JCS5mcm9udGVuZF9hdHRhY2ggID0gZGlnaXZveF90ZGExMDA0Nl9mcm9udGVuZF9hdHRhY2gsCi0JCS50dW5lcl9hdHRhY2ggICAgID0gZGlnaXZveF90ZGE4Mjc1X3R1bmVyX2F0dGFjaCwKKwkJLmZyb250ZW5kX2F0dGFjaCAgPSBtOTIweF90ZGExMDA0Nl8wOF9mcm9udGVuZF9hdHRhY2gsCisJCS50dW5lcl9hdHRhY2ggICAgID0gbTkyMHhfdGRhODI3NV82MF90dW5lcl9hdHRhY2gsCiAKIAkJLnN0cmVhbSA9IHsKIAkJCS50eXBlID0gVVNCX0JVTEssCkBAIC01NzQsNyArNzIyLDcgQEAKIAkJCX0KIAkJfSwKIAl9fSwKLQkuaTJjX2FsZ28gICAgICAgICA9ICZtOTIwNl9pMmNfYWxnbywKKwkuaTJjX2FsZ28gICAgICAgICA9ICZtOTIweF9pMmNfYWxnbywKIAogCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKIAkuZGV2aWNlcyA9IHsKQEAgLTU4NSw2ICs3MzMsMTIyIEBACiAJfQogfTsKIAorLyogTGlmZVZpZXcgVFYgV2Fsa2VyIFR3aW4gc3VwcG9ydCBieSBOaWNrIEFuZHJldyA8bmlja0BuaWNrLWFuZHJldy5uZXQ+CisgKgorICogTGlmZVZpZXcgVFYgV2Fsa2VyIFR3aW4gaGFzIDEgeCBNOTIwNiwgMiB4IFREQTEwMDQ2LCAyIHggVERBODI3NUEKKyAqIFREQTEwMDQ2ICMwIGlzIGxvY2F0ZWQgYXQgaTJjIGFkZHJlc3MgMHgwOAorICogVERBMTAwNDYgIzEgaXMgbG9jYXRlZCBhdCBpMmMgYWRkcmVzcyAweDBiIChwcmVzZW50bHkgZGlzYWJsZWQgLSBub3QgeWV0IHdvcmtpbmcpCisgKiBUREE4Mjc1QSAjMCBpcyBsb2NhdGVkIGF0IGkyYyBhZGRyZXNzIDB4NjAKKyAqIFREQTgyNzVBICMxIGlzIGxvY2F0ZWQgYXQgaTJjIGFkZHJlc3MgMHg2MSAocHJlc2VudGx5IGRpc2FibGVkIC0gbm90IHlldCB3b3JraW5nKQorICovCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgdHZ3YWxrZXJ0d2luX3Byb3BlcnRpZXMgPSB7CisJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLAorCisJLnVzYl9jdHJsID0gREVWSUNFX1NQRUNJRklDLAorCS5maXJtd2FyZSA9ICJkdmItdXNiLXR2d2Fsa2VydC5mdyIsCisJLmRvd25sb2FkX2Zpcm13YXJlID0gbTkyMHhfZmlybXdhcmVfZG93bmxvYWQsCisKKwkucmNfaW50ZXJ2YWwgICAgICA9IDEwMCwKKwkucmNfa2V5X21hcCAgICAgICA9IHR2d2Fsa2VydHdpbl9yY19rZXlzLAorCS5yY19rZXlfbWFwX3NpemUgID0gQVJSQVlfU0laRSh0dndhbGtlcnR3aW5fcmNfa2V5cyksCisJLnJjX3F1ZXJ5ICAgICAgICAgPSBtOTIweF9yY19xdWVyeSwKKworCS5zaXplX29mX3ByaXYgICAgID0gc2l6ZW9mKHN0cnVjdCBtOTIweF9zdGF0ZSksCisKKwkuaWRlbnRpZnlfc3RhdGUgICA9IG05MjB4X2lkZW50aWZ5X3N0YXRlLAorCS5udW1fYWRhcHRlcnMgPSAxLAorCS5hZGFwdGVyID0ge3sKKwkJLmNhcHMgPSBEVkJfVVNCX0FEQVBfSEFTX1BJRF9GSUxURVIgfAorCQkJRFZCX1VTQl9BREFQX1BJRF9GSUxURVJfQ0FOX0JFX1RVUk5FRF9PRkYsCisKKwkJLnBpZF9maWx0ZXJfY291bnQgPSA4LAorCQkucGlkX2ZpbHRlciAgICAgICA9IG05MjB4X3BpZF9maWx0ZXIsCisJCS5waWRfZmlsdGVyX2N0cmwgID0gbTkyMHhfcGlkX2ZpbHRlcl9jdHJsLAorCisJCS5mcm9udGVuZF9hdHRhY2ggID0gbTkyMHhfdGRhMTAwNDZfMDhfZnJvbnRlbmRfYXR0YWNoLAorCQkudHVuZXJfYXR0YWNoICAgICA9IG05MjB4X3RkYTgyNzVfNjBfdHVuZXJfYXR0YWNoLAorCisJCS5zdHJlYW0gPSB7CisJCQkudHlwZSA9IFVTQl9CVUxLLAorCQkJLmNvdW50ID0gOCwKKwkJCS5lbmRwb2ludCA9IDB4ODEsCisJCQkudSA9IHsKKwkJCQkgLmJ1bGsgPSB7CisJCQkJCSAuYnVmZmVyc2l6ZSA9IDUxMiwKKwkJCQkgfQorCQkJfQorCQl9fSx7CisJCS5jYXBzID0gRFZCX1VTQl9BREFQX0hBU19QSURfRklMVEVSIHwKKwkJCURWQl9VU0JfQURBUF9QSURfRklMVEVSX0NBTl9CRV9UVVJORURfT0ZGLAorCisJCS5waWRfZmlsdGVyX2NvdW50ID0gOCwKKwkJLnBpZF9maWx0ZXIgICAgICAgPSBtOTIweF9waWRfZmlsdGVyLAorCQkucGlkX2ZpbHRlcl9jdHJsICA9IG05MjB4X3BpZF9maWx0ZXJfY3RybCwKKworCQkuZnJvbnRlbmRfYXR0YWNoICA9IG05MjB4X3RkYTEwMDQ2XzBiX2Zyb250ZW5kX2F0dGFjaCwKKwkJLnR1bmVyX2F0dGFjaCAgICAgPSBtOTIweF90ZGE4Mjc1XzYxX3R1bmVyX2F0dGFjaCwKKworCQkuc3RyZWFtID0geworCQkJLnR5cGUgPSBVU0JfQlVMSywKKwkJCS5jb3VudCA9IDgsCisJCQkuZW5kcG9pbnQgPSAweDgyLAorCQkJLnUgPSB7CisJCQkJIC5idWxrID0geworCQkJCQkgLmJ1ZmZlcnNpemUgPSA1MTIsCisJCQkJIH0KKwkJCX0KKwkJfSwKKwl9fSwKKwkuaTJjX2FsZ28gICAgICAgICA9ICZtOTIweF9pMmNfYWxnbywKKworCS5udW1fZGV2aWNlX2Rlc2NzID0gMSwKKwkuZGV2aWNlcyA9IHsKKwkJeyAgIC5uYW1lID0gIkxpZmVWaWV3IFRWIFdhbGtlciBUd2luIERWQi1UIFVTQjIuMCIsCisJCSAgICAuY29sZF9pZHMgPSB7ICZtOTIweF90YWJsZVsyXSwgTlVMTCB9LAorCQkgICAgLndhcm1faWRzID0geyAmbTkyMHhfdGFibGVbM10sIE5VTEwgfSwKKwkJfSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGR2Yl91c2JfZGV2aWNlX3Byb3BlcnRpZXMgZHBvc2hfcHJvcGVydGllcyA9IHsKKwkuY2FwcyA9IERWQl9VU0JfSVNfQU5fSTJDX0FEQVBURVIsCisKKwkudXNiX2N0cmwgPSBERVZJQ0VfU1BFQ0lGSUMsCisJLmZpcm13YXJlID0gImR2Yi11c2ItZHBvc2gtMDEuZnciLAorCS5kb3dubG9hZF9maXJtd2FyZSA9IG05MjB4X2Zpcm13YXJlX2Rvd25sb2FkLAorCisJLnNpemVfb2ZfcHJpdiAgICAgPSBzaXplb2Yoc3RydWN0IG05MjB4X3N0YXRlKSwKKworCS5pZGVudGlmeV9zdGF0ZSAgID0gbTkyMHhfaWRlbnRpZnlfc3RhdGUsCisJLm51bV9hZGFwdGVycyA9IDEsCisJLmFkYXB0ZXIgPSB7eworCQkvKiBIYXJkd2FyZSBwaWQgZmlsdGVycyBkb24ndCB3b3JrIHdpdGggdGhpcyBkZXZpY2UvZmlybXdhcmUgKi8KKworCQkuZnJvbnRlbmRfYXR0YWNoICA9IG05MjB4X210MzUyX2Zyb250ZW5kX2F0dGFjaCwKKwkJLnR1bmVyX2F0dGFjaCAgICAgPSBtOTIweF9xdDEwMTBfdHVuZXJfYXR0YWNoLAorCisJCS5zdHJlYW0gPSB7CisJCQkudHlwZSA9IFVTQl9CVUxLLAorCQkJLmNvdW50ID0gOCwKKwkJCS5lbmRwb2ludCA9IDB4ODEsCisJCQkudSA9IHsKKwkJCQkgLmJ1bGsgPSB7CisJCQkJCSAuYnVmZmVyc2l6ZSA9IDUxMiwKKwkJCQkgfQorCQkJfQorCQl9LAorCX19LAorCS5pMmNfYWxnbyAgICAgICAgID0gJm05MjB4X2kyY19hbGdvLAorCisJLm51bV9kZXZpY2VfZGVzY3MgPSAxLAorCS5kZXZpY2VzID0geworCQkgeyAgIC5uYW1lID0gIkRwb3NoIERWQi1UIFVTQjIuMCIsCisJCSAgICAgLmNvbGRfaWRzID0geyAmbTkyMHhfdGFibGVbNF0sIE5VTEwgfSwKKwkJICAgICAud2FybV9pZHMgPSB7ICZtOTIweF90YWJsZVs1XSwgTlVMTCB9LAorCQkgfSwKKwkgfQorfTsKKwogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG05MjB4X2RyaXZlciA9IHsKIAkubmFtZQkJPSAiZHZiX3VzYl9tOTIweCIsCiAJLnByb2JlCQk9IG05MjB4X3Byb2JlLApAQCAtNjE1LDYgKzg3OSwxMSBAQAogbW9kdWxlX2V4aXQgKG05MjB4X21vZHVsZV9leGl0KTsKIAogTU9EVUxFX0FVVEhPUigiQWFwbyBUYWhrb2xhIDxhZXRAcmFzdGVyYnVybi5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBNU0kgTWVnYSBTa3kgNTgwIERWQi1UIFVTQjIuMCAvIFVsaSBtOTIweCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEVkIgRHJpdmVyIGZvciBVTEkgTTkyMHgiKTsKIE1PRFVMRV9WRVJTSU9OKCIwLjEiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbTkyMHguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvbTkyMHguaAppbmRleCA3ZGQzZGI2Li4yYzg5NDJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL205MjB4LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9tOTIweC5oCkBAIC00LDcgKzQsNyBAQAogI2RlZmluZSBEVkJfVVNCX0xPR19QUkVGSVggIm05MjB4IgogI2luY2x1ZGUgImR2Yi11c2IuaCIKIAotI2RlZmluZSBkZWJfcmMoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfbTkyMHhfZGVidWcsMHgwMSxhcmdzKQorI2RlZmluZSBkZWIoYXJncy4uLikgICBkcHJpbnRrKGR2Yl91c2JfbTkyMHhfZGVidWcsMHgwMSxhcmdzKQogCiAjZGVmaW5lIE05MjA2X0NPUkUJMHgyMgogI2RlZmluZSBNOTIwNl9SQ19TVEFURQkweGZmNTEKQEAgLTU5LDkgKzU5LDE4IEBACiByZXNwb25zZSB0byBhIHdyaXRlLCBpcyB1bmtub3duLgogKi8KIAotc3RydWN0IG05MjA2X3N0YXRlIHsKK3N0cnVjdCBtOTIweF9zdGF0ZSB7CiAJdTE2IGZpbHRlcnNbTTkyMDZfTUFYX0ZJTFRFUlNdOwogCWludCBmaWx0ZXJpbmdfZW5hYmxlZDsKIAlpbnQgcmVwX2NvdW50OwogfTsKKworLyogSW5pdGlhbGlzYXRpb24gZGF0YSBmb3IgdGhlIG05MjB4CisgKi8KKworc3RydWN0IG05MjB4X2luaXRzIHsKKwl1MTYgYWRkcmVzczsKKwl1OCAgZGF0YTsKK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMngtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LWZlLmMKaW5kZXggM2VjYjJlMC4uYzNmZGM3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMngtZmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC1mZS5jCkBAIC0yMDQsOCArMjA0LDggQEAKIHN0YXRpYyBpbnQgdnA3MDJ4X2ZlX3NlbmRfZGlzZXFjX21zZyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCiAJCQkJICAgIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKm0pCiB7Ci0JLy9zdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCXU4IGNtZFs4XTsvLyxpYnVmWzEwXTsKKwlzdHJ1Y3QgdnA3MDJ4X2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGNtZFs4XSxpYnVmWzEwXTsKIAltZW1zZXQoY21kLDAsOCk7CiAKIAlkZWJfZmUoIiVzXG4iLF9fRlVOQ1RJT05fXyk7CkBAIC0yMTgsMTIgKzIxOCwxMiBAQAogCW1lbWNweSgmY21kWzNdLCBtLT5tc2csIG0tPm1zZ19sZW4pOwogCWNtZFs3XSA9IHZwNzAyeF9jaGtzdW0oY21kLDAsNyk7CiAKLS8vCXZwNzAyeF91c2JfaW5vdXRfb3Aoc3QtPmQsY21kLDgsaWJ1ZiwxMCwxMDApOworCXZwNzAyeF91c2JfaW5vdXRfb3Aoc3QtPmQsY21kLDgsaWJ1ZiwxMCwxMDApOwogCi0vLwlpZiAoaWJ1ZlsyXSA9PSAwICYmIGlidWZbM10gPT0gMCkKLS8vCQlkZWJfZmUoImRpc2VxYyBjbWQgZmFpbGVkLlxuIik7Ci0vLwllbHNlCi0vLwkJZGViX2ZlKCJkaXNlcWMgY21kIHN1Y2NlZWRlZC5cbiIpOworCWlmIChpYnVmWzJdID09IDAgJiYgaWJ1ZlszXSA9PSAwKQorCQlkZWJfZmUoImRpc2VxYyBjbWQgZmFpbGVkLlxuIik7CisJZWxzZQorCQlkZWJfZmUoImRpc2VxYyBjbWQgc3VjY2VlZGVkLlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYwppbmRleCAwNThkZjVjLi4wOGEyNTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL3BsdXRvMi5jCkBAIC0yOTMsMTIgKzI5MywyMCBAQAogCSAqICAgICBidXQgbm8gcGFja2V0cyBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KIAkgKiBbMl0gU29tZXRpbWVzIChhY3R1YWxseSB2ZXJ5IG9mdGVuKSBOQlBBQ0tFVFMgc3RheXMgYXQgemVybwogCSAqICAgICBhbHRob3VnaCBvbmUgcGFja2V0IGhhcyBiZWVuIHRyYW5zZmVyZWQuCisJICogWzNdIFNvbWV0aW1lcyAoYWN0dWFsbHkgcmFyZWx5KSwgdGhlIGNhcmQgZ2V0cyBpbnRvIGFuIGVycm9uZW91cworCSAqICAgICBtb2RlIHdoZXJlIGl0IGNvbnRpbnVvdXNseSBnZW5lcmF0ZXMgaW50ZXJydXB0cywgY2xhaW1pbmcgaXQKKwkgKiAgICAgaGFzIHJlY2lldmVkIG5icGFja2V0cz5UU19ETUFfUEFDS0VUUyBwYWNrZXRzLCBidXQgbm8gcGFja2V0CisJICogICAgIGhhcyBiZWVuIHRyYW5zZmVyZWQuIE9ubHkgYSByZXNldCBzZWVtcyB0byBzb2x2ZSB0aGlzCiAJICovCiAJaWYgKChuYnBhY2tldHMgPT0gMCkgfHwgKG5icGFja2V0cyA+IFRTX0RNQV9QQUNLRVRTKSkgewogCQl1bnNpZ25lZCBpbnQgaSA9IDA7CiAJCXdoaWxlIChwbHV0by0+ZG1hX2J1ZltpXSA9PSAweDQ3KQogCQkJaSArPSAxODg7CiAJCW5icGFja2V0cyA9IGkgLyAxODg7CisJCWlmIChpID09IDApIHsKKwkJCXBsdXRvX3Jlc2V0X3RzKHBsdXRvLCAxKTsKKwkJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBsdXRvLT5wZGV2LT5kZXYsICJyZXNldHRpbmcgVFMgYmVjYXVzZSBvZiBpbnZhbGlkIHBhY2tldCBjb3VudGVyXG4iKTsKKwkJfQogCX0KIAogCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cygmcGx1dG8tPmRlbXV4LCBwbHV0by0+ZG1hX2J1ZiwgbmJwYWNrZXRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKaW5kZXggNjdiZWNkZC4uZWYxMTA4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKQEAgLTEyNDYsNiArMTI0Niw5IEBACiAJaWYgKCFidWRnZXQtPmZlZWRpbmcxIHx8IChuZXdkbWEgPT0gb2xkZG1hKSkKIAkJcmV0dXJuOwogCisJLyogRW5zdXJlIHN0cmVhbWVkIFBDSSBkYXRhIGlzIHN5bmNlZCB0byBDUFUgKi8KKwlwY2lfZG1hX3N5bmNfc2dfZm9yX2NwdShidWRnZXQtPmRldi0+cGNpLCBidWRnZXQtPnB0LnNsaXN0LCBidWRnZXQtPnB0Lm5lbnRzLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCiAjaWYgMAogCS8qIHRyYWNrIHJwczEgYWN0aXZpdHkgKi8KIAlwcmludGsoInZwZWlycTogJTAyeCBFdmVudCBDb3VudGVyIDEgMHglMDR4XG4iLApAQCAtMjY3OSw4ICsyNjgyLDggQEAKIGVycl9wY2lfZnJlZV81OgogCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgODE5MiwgYXY3MTEwLT5kZWJpX3ZpcnQsIGF2NzExMC0+ZGViaV9idXMpOwogZXJyX3NhYTcxNDY2X3ZmcmVlXzQ6Ci0JaWYgKCFhdjcxMTAtPmdyYWJiaW5nKQotCQlzYWE3MTQ2X3BndGFibGVfZnJlZShwZGV2LCAmYXY3MTEwLT5wdCk7CisJaWYgKGF2NzExMC0+Z3JhYmJpbmcpCisJCXNhYTcxNDZfdmZyZWVfZGVzdHJveV9wZ3RhYmxlKHBkZXYsIGF2NzExMC0+Z3JhYmJpbmcsICZhdjcxMTAtPnB0KTsKIGVycl9pMmNfZGVsXzM6CiAJaTJjX2RlbF9hZGFwdGVyKCZhdjcxMTAtPmkyY19hZGFwKTsKIGVycl9kdmJfdW5yZWdpc3Rlcl9hZGFwdGVyXzI6CkBAIC0yNzEwLDcgKzI3MTMsNyBAQAogCQlTQUE3MTQ2X0lTUl9DTEVBUihzYWEsIE1BU0tfMTApOwogCQltc2xlZXAoNTApOwogCQl0YXNrbGV0X2tpbGwoJmF2NzExMC0+dnBlX3Rhc2tsZXQpOwotCQlzYWE3MTQ2X3BndGFibGVfZnJlZShzYWEtPnBjaSwgJmF2NzExMC0+cHQpOworCQlzYWE3MTQ2X3ZmcmVlX2Rlc3Ryb3lfcGd0YWJsZShzYWEtPnBjaSwgYXY3MTEwLT5ncmFiYmluZywgJmF2NzExMC0+cHQpOwogCX0KIAlhdjcxMTBfZXhpdF92NGwoYXY3MTEwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwppbmRleCA0ZWQ0NTk5Li45ZDQyZjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY2kuYwpAQCAtOTA0LDcgKzkwNCw3IEBACiAJCWJhbmQgPSAxOwogCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMjAwMDAwMDAwKSB7CiAJCWNwID0gNjsKLQkJYmFuZCA9IDI7CisJCWJhbmQgPSAxOwogCX0gZWxzZSBpZiAodHVuZXJfZnJlcXVlbmN5IDwgMjkwMDAwMDAwKSB7CiAJCWNwID0gMzsKIAkJYmFuZCA9IDI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYwppbmRleCA2Yjk3ZGMxLi4yNTU3YWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMKQEAgLTE5NSw2ICsxOTUsOSBAQAogCXUzMiBuZXdkbWEgPSBzYWE3MTQ2X3JlYWQoYnVkZ2V0LT5kZXYsIFBDSV9WRFAzKTsKIAl1MzIgY291bnQ7CiAKKwkvKiBFbnN1cmUgc3RyZWFtZWQgUENJIGRhdGEgaXMgc3luY2VkIHRvIENQVSAqLworCXBjaV9kbWFfc3luY19zZ19mb3JfY3B1KGJ1ZGdldC0+ZGV2LT5wY2ksIGJ1ZGdldC0+cHQuc2xpc3QsIGJ1ZGdldC0+cHQubmVudHMsIFBDSV9ETUFfRlJPTURFVklDRSk7CisKIAkvKiBuZWFyZXN0IGxvd2VyIHBvc2l0aW9uIGRpdmlzaWJsZSBieSAxODggKi8KIAluZXdkbWEgLT0gbmV3ZG1hICUgMTg4OwogCkBAIC01MDQsMTYgKzUwNywxNiBAQAogCXN0cmNweShidWRnZXQtPmkyY19hZGFwLm5hbWUsIGJ1ZGdldC0+Y2FyZC0+bmFtZSk7CiAKIAlpZiAoaTJjX2FkZF9hZGFwdGVyKCZidWRnZXQtPmkyY19hZGFwKSA8IDApIHsKLQkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmYnVkZ2V0LT5kdmJfYWRhcHRlcik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kdmJfdW5yZWdpc3RlcjsKIAl9CiAKIAl0dHBjaV9lZXByb21fcGFyc2VfbWFjKCZidWRnZXQtPmkyY19hZGFwLCBidWRnZXQtPmR2Yl9hZGFwdGVyLnByb3Bvc2VkX21hYyk7CiAKLQlpZiAoTlVMTCA9PQotCSAgICAoYnVkZ2V0LT5ncmFiYmluZyA9IHNhYTcxNDZfdm1hbGxvY19idWlsZF9wZ3RhYmxlKGRldi0+cGNpLCBidWRnZXQtPmJ1ZmZlcl9zaXplLCAmYnVkZ2V0LT5wdCkpKSB7CisJYnVkZ2V0LT5ncmFiYmluZyA9IHNhYTcxNDZfdm1hbGxvY19idWlsZF9wZ3RhYmxlKGRldi0+cGNpLCBidWRnZXQtPmJ1ZmZlcl9zaXplLCAmYnVkZ2V0LT5wdCk7CisJaWYgKE5VTEwgPT0gYnVkZ2V0LT5ncmFiYmluZykgewogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfZGVsX2kyYzsKIAl9CiAKIAlzYWE3MTQ2X3dyaXRlKGRldiwgUENJX0JUX1YxLCAweDAwMWMwMDAwKTsKQEAgLTUyNiwxNCArNTI5LDE2IEBACiAJaWYgKGJpLT50eXBlICE9IEJVREdFVF9GU19BQ1RJVlkpCiAJCXNhYTcxNDZfc2V0Z3BpbyhkZXYsIDIsIFNBQTcxNDZfR1BJT19PVVRISSk7CiAKLQlpZiAoYnVkZ2V0X3JlZ2lzdGVyKGJ1ZGdldCkgPT0gMCkgewotCQlyZXR1cm4gMDsKLQl9Ci1lcnI6CisJaWYgKGJ1ZGdldF9yZWdpc3RlcihidWRnZXQpID09IDApCisJCXJldHVybiAwOyAvKiBFdmVyeXRoaW5nIE9LICovCisKKwkvKiBBbiBlcnJvciBvY2N1cnJlZCwgY2xlYW51cCByZXNvdXJjZXMgKi8KKwlzYWE3MTQ2X3ZmcmVlX2Rlc3Ryb3lfcGd0YWJsZShkZXYtPnBjaSwgYnVkZ2V0LT5ncmFiYmluZywgJmJ1ZGdldC0+cHQpOworCitlcnJfZGVsX2kyYzoKIAlpMmNfZGVsX2FkYXB0ZXIoJmJ1ZGdldC0+aTJjX2FkYXApOwogCi0JdmZyZWUoYnVkZ2V0LT5ncmFiYmluZyk7Ci0KK2Vycl9kdmJfdW5yZWdpc3RlcjoKIAlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZidWRnZXQtPmR2Yl9hZGFwdGVyKTsKIAogCXJldHVybiByZXQ7CkBAIC01NTUsMTYgKzU2MCwxNCBAQAogCiAJYnVkZ2V0X3VucmVnaXN0ZXIoYnVkZ2V0KTsKIAorCXRhc2tsZXRfa2lsbCgmYnVkZ2V0LT52cGVfdGFza2xldCk7CisKKwlzYWE3MTQ2X3ZmcmVlX2Rlc3Ryb3lfcGd0YWJsZShkZXYtPnBjaSwgYnVkZ2V0LT5ncmFiYmluZywgJmJ1ZGdldC0+cHQpOworCiAJaTJjX2RlbF9hZGFwdGVyKCZidWRnZXQtPmkyY19hZGFwKTsKIAogCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmJ1ZGdldC0+ZHZiX2FkYXB0ZXIpOwogCi0JdGFza2xldF9raWxsKCZidWRnZXQtPnZwZV90YXNrbGV0KTsKLQotCXNhYTcxNDZfcGd0YWJsZV9mcmVlKGRldi0+cGNpLCAmYnVkZ2V0LT5wdCk7Ci0KLQl2ZnJlZShidWRnZXQtPmdyYWJiaW5nKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKaW5kZXggYWY2NmE1ZC4uYTZhYzgyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZwpAQCAtMiw4ICsyLDE0IEBACiAjIE11bHRpbWVkaWEgVmlkZW8gZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiUmFkaW8gQWRhcHRlcnMiCittZW51Y29uZmlnIFJBRElPX0FEQVBURVJTCisJYm9vbCAiUmFkaW8gQWRhcHRlcnMiCiAJZGVwZW5kcyBvbiBWSURFT19ERVYKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzZWxlY3RpbmcgQU0vRk0gcmFkaW8gYWRhcHRlcnMuCisKK2lmIFJBRElPX0FEQVBURVJTCiAKIGNvbmZpZyBSQURJT19DQURFVAogCXRyaXN0YXRlICJBRFMgQ2FkZXQgQU0vRk0gVHVuZXIiCkBAIC0zMjgsNCArMzM0LDUgQEAKIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHNicjEwMC4KLWVuZG1lbnUKKworZW5kaWYgIyBSQURJT19BREFQVEVSUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9kc2JyMTAwLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL2RzYnIxMDAuYwppbmRleCA0NDlkZjFiLi4zYmQwN2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL2RzYnIxMDAuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL2RzYnIxMDAuYwpAQCAtMzMsNiArMzMsMTAgQEAKIAogIEhpc3Rvcnk6CiAKKyBWZXJzaW9uIDAuNDI6CisJQ29udmVydGVkIGRzYnIxMDAgdG8gdXNlIHZpZGVvX2lvY3RsMgorCWJ5IERvdWdsYXMgTGFuZGdyYWYgPGRvdWdzbGFuZEBnbWFpbC5jb20+CisKICBWZXJzaW9uIDAuNDEtYWMxOgogCUFsYW4gQ294OiBTb21lIGNsZWFudXBzIGFuZCBmaXhlcwogCkBAIC0xMjEsOCArMTI1LDYgQEAKIHN0YXRpYyBpbnQgdXNiX2RzYnIxMDBfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCk7CiBzdGF0aWMgdm9pZCB1c2JfZHNicjEwMF9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLXN0YXRpYyBpbnQgdXNiX2RzYnIxMDBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgdXNiX2RzYnIxMDBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgaW50IHVzYl9kc2JyMTAwX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIApAQCAtMTQyLDI2ICsxNDQsNiBAQAogfTsKIAogCi0vKiBGaWxlIHN5c3RlbSBpbnRlcmZhY2UgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYl9kc2JyMTAwX2ZvcHMgPSB7Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLm9wZW4gPQkJdXNiX2RzYnIxMDBfb3BlbiwKLQkucmVsZWFzZSA9ICAgICAJdXNiX2RzYnIxMDBfY2xvc2UsCi0JLmlvY3RsID0gICAgICAgIHVzYl9kc2JyMTAwX2lvY3RsLAotCS5jb21wYXRfaW9jdGwgPSB2NGxfY29tcGF0X2lvY3RsMzIsCi0JLmxsc2VlayA9ICAgICAgIG5vX2xsc2VlaywKLX07Ci0KLS8qIFY0TCBpbnRlcmZhY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGRzYnIxMDBfdmlkZW9kZXZfdGVtcGxhdGU9Ci17Ci0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLm5hbWUgPQkJIkQtTGluayBEU0ItUiAxMDAiLAotCS50eXBlID0JCVZJRF9UWVBFX1RVTkVSLAotCS5mb3BzID0gICAgICAgICAmdXNiX2RzYnIxMDBfZm9wcywKLQkucmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlLAotfTsKLQogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYl9kc2JyMTAwX2RldmljZV90YWJsZSBbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoRFNCMTAwX1ZFTkRPUiwgRFNCMTAwX1BST0RVQ1QpIH0sCiAJeyB9CQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KQEAgLTI1MiwzNyArMjM0LDYgQEAKIAogLyogVVNCIHN1YnN5c3RlbSBpbnRlcmZhY2UgYmVnaW5zIGhlcmUgKi8KIAotLyogY2hlY2sgaWYgdGhlIGRldmljZSBpcyBwcmVzZW50IGFuZCByZWdpc3RlciB3aXRoIHY0bCBhbmQKLXVzYiBpZiBpdCBpcyAqLwotc3RhdGljIGludCB1c2JfZHNicjEwMF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKLQkJCSBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbzsKLQotCWlmICghKHJhZGlvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRzYnIxMDBfZGV2aWNlKSwgR0ZQX0tFUk5FTCkpKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoIShyYWRpby0+dmlkZW9kZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKSkpIHsKLQkJa2ZyZWUocmFkaW8pOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JbWVtY3B5KHJhZGlvLT52aWRlb2RldiwgJmRzYnIxMDBfdmlkZW9kZXZfdGVtcGxhdGUsCi0JCXNpemVvZihkc2JyMTAwX3ZpZGVvZGV2X3RlbXBsYXRlKSk7Ci0JcmFkaW8tPnJlbW92ZWQgPSAwOwotCXJhZGlvLT51c2VycyA9IDA7Ci0JcmFkaW8tPnVzYmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0JcmFkaW8tPmN1cmZyZXEgPSBGUkVRX01JTipGUkVRX01VTDsKLQl2aWRlb19zZXRfZHJ2ZGF0YShyYWRpby0+dmlkZW9kZXYsIHJhZGlvKTsKLQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHJhZGlvLT52aWRlb2RldiwgVkZMX1RZUEVfUkFESU8sCi0JCXJhZGlvX25yKSkgewotCQl3YXJuKCJDb3VsZCBub3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlIik7Ci0JCXZpZGVvX2RldmljZV9yZWxlYXNlKHJhZGlvLT52aWRlb2Rldik7Ci0JCWtmcmVlKHJhZGlvKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcmFkaW8pOwotCXJldHVybiAwOwotfQotCiAvKiBoYW5kbGUgdW5wbHVnZ2luZyBvZiB0aGUgZGV2aWNlLCByZWxlYXNlIGRhdGEgc3RydWN0dXJlcwogaWYgbm90aGluZyBrZWVwcyB1cyBmcm9tIGRvaW5nIGl0LiAgSWYgc29tZXRoaW5nIGlzIHN0aWxsCiBrZWVwaW5nIHVzIGJ1c3ksIHRoZSByZWxlYXNlIGNhbGxiYWNrIG9mIHY0bCB3aWxsIHRha2UgY2FyZQpAQCAtMzA3LDEzMyArMjU4LDE0NyBAQAogfQogCiAKLS8qIFZpZGVvIGZvciBMaW51eCBpbnRlcmZhY2UgKi8KLQotc3RhdGljIGludCB1c2JfZHNicjEwMF9kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdikKIHsKLQlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvPXZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOwotCi0JaWYgKCFyYWRpbykKLQkJcmV0dXJuIC1FSU87Ci0KLQlzd2l0Y2goY21kKSB7Ci0JCWNhc2UgVklESU9DX1FVRVJZQ0FQOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICp2ID0gYXJnOwotCQkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKLQkJCXN0cmxjcHkodi0+ZHJpdmVyLCAiZHNicjEwMCIsIHNpemVvZiAodi0+ZHJpdmVyKSk7Ci0JCQlzdHJsY3B5KHYtPmNhcmQsICJELUxpbmsgUi0xMDAgVVNCIEZNIFJhZGlvIiwgc2l6ZW9mICh2LT5jYXJkKSk7Ci0JCQlzcHJpbnRmKHYtPmJ1c19pbmZvLCJJU0EiKTsKLQkJCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwotCQkJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfVFVORVI6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2ID0gYXJnOwotCi0JCQlpZiAodi0+aW5kZXggPiAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlkc2JyMTAwX2dldHN0YXQocmFkaW8pOwotCi0JCQltZW1zZXQodiwwLHNpemVvZigqdikpOwotCQkJc3RyY3B5KHYtPm5hbWUsICJGTSIpOwotCQkJdi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Ci0KLQkJCXYtPnJhbmdlbG93ID0gRlJFUV9NSU4qRlJFUV9NVUw7Ci0JCQl2LT5yYW5nZWhpZ2ggPSBGUkVRX01BWCpGUkVRX01VTDsKLQkJCXYtPnJ4c3ViY2hhbnMgPVY0TDJfVFVORVJfU1VCX01PTk98VjRMMl9UVU5FUl9TVUJfU1RFUkVPOwotCQkJdi0+Y2FwYWJpbGl0eT1WNEwyX1RVTkVSX0NBUF9MT1c7Ci0JCQlpZihyYWRpby0+c3RlcmVvKQotCQkJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOwotCQkJZWxzZQotCQkJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKLQkJCXYtPnNpZ25hbCA9IDB4RkZGRjsgICAgIC8qIFdlIGNhbid0IGdldCB0aGUgc2lnbmFsIHN0cmVuZ3RoICovCi0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2ID0gYXJnOwotCi0JCQlpZiAodi0+aW5kZXggPiAwKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQkJewotCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwotCi0JCQlyYWRpby0+Y3VyZnJlcSA9IGYtPmZyZXF1ZW5jeTsKLQkJCWlmIChkc2JyMTAwX3NldGZyZXEocmFkaW8sIHJhZGlvLT5jdXJmcmVxKT09LTEpCi0JCQkJd2FybigiU2V0IGZyZXF1ZW5jeSBmYWlsZWQiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfRlJFUVVFTkNZOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYgPSBhcmc7Ci0KLQkJCWYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCQkJZi0+ZnJlcXVlbmN5ID0gcmFkaW8tPmN1cmZyZXE7Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYyA9IGFyZzsKLQkJCWludCBpOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYWRpb19xY3RybCk7IGkrKykgewotCQkJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHJhZGlvX3FjdHJsW2ldLmlkKSB7Ci0JCQkJCW1lbWNweShxYywgJihyYWRpb19xY3RybFtpXSksCi0JCQkJCQkJCXNpemVvZigqcWMpKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19DVFJMOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsPSBhcmc7Ci0KLQkJCXN3aXRjaCAoY3RybC0+aWQpIHsKLQkJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJCQljdHJsLT52YWx1ZT1yYWRpby0+bXV0ZWQ7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmw9IGFyZzsKLQotCQkJc3dpdGNoIChjdHJsLT5pZCkgewotCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQkJCWlmIChjdHJsLT52YWx1ZSkgewotCQkJCQlpZiAoZHNicjEwMF9zdG9wKHJhZGlvKT09LTEpCi0JCQkJCQl3YXJuKCJSYWRpbyBkaWQgbm90IHJlc3BvbmQgcHJvcGVybHkiKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoZHNicjEwMF9zdGFydChyYWRpbyk9PS0xKQotCQkJCQkJd2FybigiUmFkaW8gZGlkIG5vdCByZXNwb25kIHByb3Blcmx5Iik7Ci0JCQkJfQotCQkJCXJldHVybiAwOwotCQkJfQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiB2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bChpbm9kZSxmaWxlLGNtZCxhcmcsCi0JCQkJCQkJICB1c2JfZHNicjEwMF9kb19pb2N0bCk7Ci0JfQorCXN0cmxjcHkodi0+ZHJpdmVyLCAiZHNicjEwMCIsIHNpemVvZih2LT5kcml2ZXIpKTsKKwlzdHJsY3B5KHYtPmNhcmQsICJELUxpbmsgUi0xMDAgVVNCIEZNIFJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKKwlzcHJpbnRmKHYtPmJ1c19pbmZvLCAiSVNBIik7CisJdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CisJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVI7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdXNiX2RzYnIxMDBfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCB2aWRpb2NfZ190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCB1c2JfZHNicjEwMF9kb19pb2N0bCk7CisJc3RydWN0IGRzYnIxMDBfZGV2aWNlICpyYWRpbyA9IHZpZGVvX2dldF9kcnZkYXRhKHZpZGVvX2RldmRhdGEoZmlsZSkpOworCisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkc2JyMTAwX2dldHN0YXQocmFkaW8pOworCXN0cmNweSh2LT5uYW1lLCAiRk0iKTsKKwl2LT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwl2LT5yYW5nZWxvdyA9IEZSRVFfTUlOKkZSRVFfTVVMOworCXYtPnJhbmdlaGlnaCA9IEZSRVFfTUFYKkZSRVFfTVVMOworCXYtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05PfFY0TDJfVFVORVJfU1VCX1NURVJFTzsKKwl2LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTE9XOworCWlmKHJhZGlvLT5zdGVyZW8pCisJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCWVsc2UKKwkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POworCXYtPnNpZ25hbCA9IDB4ZmZmZjsgICAgIC8qIFdlIGNhbid0IGdldCB0aGUgc2lnbmFsIHN0cmVuZ3RoICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfdHVuZXIgKnYpCit7CisJaWYgKHYtPmluZGV4ID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW8gPSB2aWRlb19nZXRfZHJ2ZGF0YSh2aWRlb19kZXZkYXRhKGZpbGUpKTsKKworCXJhZGlvLT5jdXJmcmVxID0gZi0+ZnJlcXVlbmN5OworCWlmIChkc2JyMTAwX3NldGZyZXEocmFkaW8sIHJhZGlvLT5jdXJmcmVxKT09LTEpCisJCXdhcm4oIlNldCBmcmVxdWVuY3kgZmFpbGVkIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisKKwlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKKwlmLT5mcmVxdWVuY3kgPSByYWRpby0+Y3VyZnJlcTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYWRpb19xY3RybCk7IGkrKykgeworCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKKwkJCQkJCXNpemVvZigqcWMpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQljdHJsLT52YWx1ZSA9IHJhZGlvLT5tdXRlZDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgZHNicjEwMF9kZXZpY2UgKnJhZGlvID0gdmlkZW9fZ2V0X2RydmRhdGEodmlkZW9fZGV2ZGF0YShmaWxlKSk7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQlpZiAoY3RybC0+dmFsdWUpIHsKKwkJCWlmIChkc2JyMTAwX3N0b3AocmFkaW8pPT0tMSkKKwkJCQl3YXJuKCJSYWRpbyBkaWQgbm90IHJlc3BvbmQgcHJvcGVybHkiKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChkc2JyMTAwX3N0YXJ0KHJhZGlvKT09LTEpCisJCQkJd2FybigiUmFkaW8gZGlkIG5vdCByZXNwb25kIHByb3Blcmx5Iik7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQoreworCWlmIChhLT5pbmRleCA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RyY3B5KGEtPm5hbWUsICJSYWRpbyIpOworCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKK3sKKwkqaSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQoreworCWlmIChpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdXNiX2RzYnIxMDBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTQ2NSw2ICs0MzAsNjggQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogRmlsZSBzeXN0ZW0gaW50ZXJmYWNlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JfZHNicjEwMF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB1c2JfZHNicjEwMF9vcGVuLAorCS5yZWxlYXNlCT0gdXNiX2RzYnIxMDBfY2xvc2UsCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKKwkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorfTsKKworLyogVjRMMiBpbnRlcmZhY2UgKi8KK3N0YXRpYyBzdHJ1Y3QgdmlkZW9fZGV2aWNlIGRzYnIxMDBfdmlkZW9kZXZfdGVtcGxhdGUgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiRC1MaW5rIERTQi1SIDEwMCIsCisJLnR5cGUJCT0gVklEX1RZUEVfVFVORVIsCisJLmZvcHMJCT0gJnVzYl9kc2JyMTAwX2ZvcHMsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKwkudmlkaW9jX3F1ZXJ5Y2FwICAgID0gdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZ190dW5lciAgICAgPSB2aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgICAgID0gdmlkaW9jX3NfdHVuZXIsCisJLnZpZGlvY19nX2ZyZXF1ZW5jeSA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5ID0gdmlkaW9jX3NfZnJlcXVlbmN5LAorCS52aWRpb2NfcXVlcnljdHJsICAgPSB2aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2NfZ19jdHJsICAgICAgPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsICAgICAgPSB2aWRpb2Nfc19jdHJsLAorCS52aWRpb2NfZ19hdWRpbyAgICAgPSB2aWRpb2NfZ19hdWRpbywKKwkudmlkaW9jX3NfYXVkaW8gICAgID0gdmlkaW9jX3NfYXVkaW8sCisJLnZpZGlvY19nX2lucHV0ICAgICA9IHZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCAgICAgPSB2aWRpb2Nfc19pbnB1dCwKK307CisKKy8qIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgcHJlc2VudCBhbmQgcmVnaXN0ZXIgd2l0aCB2NGwgYW5kCit1c2IgaWYgaXQgaXMgKi8KK3N0YXRpYyBpbnQgdXNiX2RzYnIxMDBfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBkc2JyMTAwX2RldmljZSAqcmFkaW87CisKKwlpZiAoIShyYWRpbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkc2JyMTAwX2RldmljZSksIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCEocmFkaW8tPnZpZGVvZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCkpKSB7CisJCWtmcmVlKHJhZGlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbWNweShyYWRpby0+dmlkZW9kZXYsICZkc2JyMTAwX3ZpZGVvZGV2X3RlbXBsYXRlLAorCQlzaXplb2YoZHNicjEwMF92aWRlb2Rldl90ZW1wbGF0ZSkpOworCXJhZGlvLT5yZW1vdmVkID0gMDsKKwlyYWRpby0+dXNlcnMgPSAwOworCXJhZGlvLT51c2JkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXJhZGlvLT5jdXJmcmVxID0gRlJFUV9NSU4qRlJFUV9NVUw7CisJdmlkZW9fc2V0X2RydmRhdGEocmFkaW8tPnZpZGVvZGV2LCByYWRpbyk7CisJaWYgKHZpZGVvX3JlZ2lzdGVyX2RldmljZShyYWRpby0+dmlkZW9kZXYsIFZGTF9UWVBFX1JBRElPLHJhZGlvX25yKSkgeworCQl3YXJuKCJDb3VsZCBub3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlIik7CisJCXZpZGVvX2RldmljZV9yZWxlYXNlKHJhZGlvLT52aWRlb2Rldik7CisJCWtmcmVlKHJhZGlvKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcmFkaW8pOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBkc2JyMTAwX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZ1c2JfZHNicjEwMF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jCmluZGV4IDhmYmYwZDguLjhjZjJlOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMKQEAgLTQ4LDYgKzQ4LDI1IEBACiAKICNkZWZpbmUgQ0FERVRfVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLDMsMykKIAorc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCByYWRpb19xY3RybFtdID0geworCXsKKwkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLAorCQkubmFtZSAgICAgICAgICA9ICJNdXRlIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCX0seworCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKKwkJLm5hbWUgICAgICAgICAgPSAiVm9sdW1lIiwKKwkJLm1pbmltdW0gICAgICAgPSAwLAorCQkubWF4aW11bSAgICAgICA9IDB4ZmYsCisJCS5zdGVwICAgICAgICAgID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAweGZmLAorCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJfQorfTsKKwogc3RhdGljIGludCBpbz0tMTsJCS8qIGRlZmF1bHQgdG8gaXNhcG5wIGFjdGl2YXRpb24gKi8KIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKIHN0YXRpYyBpbnQgdXNlcnM9MDsKQEAgLTM0NywxMzUgKzM2NiwxNjUgQEAKIH0KIAogCi0KLXN0YXRpYyBpbnQgY2FkZXRfZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKnYpCiB7Ci0Jc3dpdGNoKGNtZCkKLQl7Ci0JCWNhc2UgVklESU9DX1FVRVJZQ0FQOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7Ci0JCQltZW1zZXQoY2FwLDAsc2l6ZW9mKCpjYXApKTsKLQkJCWNhcC0+Y2FwYWJpbGl0aWVzID0KLQkJCQlWNEwyX0NBUF9UVU5FUiB8Ci0JCQkJVjRMMl9DQVBfUkVBRFdSSVRFOwotCQkJY2FwLT52ZXJzaW9uID0gQ0FERVRfVkVSU0lPTjsKLQkJCXN0cmNweShjYXAtPmRyaXZlciwgIkFEUyBDYWRldCIpOwotCQkJc3RyY3B5KGNhcC0+Y2FyZCwgIkFEUyBDYWRldCIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19UVU5FUjoKLQkJewotCQkJc3RydWN0IHY0bDJfdHVuZXIgKnQgPSBhcmc7Ci0JCQltZW1zZXQodCwwLHNpemVvZigqdCkpOwotCQkJdC0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Ci0JCQlzd2l0Y2ggKHQtPmluZGV4KQotCQkJewotCQkJCWNhc2UgMDogc3RyY3B5KHQtPm5hbWUsICJGTSIpOwotCQkJCQl0LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfU1RFUkVPOwotCQkJCQl0LT5yYW5nZWxvdyA9IDE0MDA7ICAgICAvKiA4Ny41IE1IeiAqLwotCQkJCQl0LT5yYW5nZWhpZ2ggPSAxNzI4OyAgICAvKiAxMDguMCBNSHogKi8KLQkJCQkJdC0+cnhzdWJjaGFucz1jYWRldF9nZXRzdGVyZW8oKTsKLQkJCQkJc3dpdGNoICh0LT5yeHN1YmNoYW5zKXsKLQkJCQkJCWNhc2UgVjRMMl9UVU5FUl9TVUJfTU9OTzoKLQkJCQkJCQl0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIFY0TDJfVFVORVJfU1VCX1NURVJFTzoKLQkJCQkJCQl0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWRlZmF1bHQ6IDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6IHN0cmNweSh0LT5uYW1lLCAiQU0iKTsKLQkJCQkJdC0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX0xPVzsKLQkJCQkJdC0+cmFuZ2Vsb3cgPSA4MzIwOyAgICAgIC8qIDUyMCBrSHogKi8KLQkJCQkJdC0+cmFuZ2VoaWdoID0gMjY0MDA7ICAgIC8qIDE2NTAga0h6ICovCi0JCQkJCXQtPnJ4c3ViY2hhbnMgPSBWNEwyX1RVTkVSX1NVQl9NT05POwotCQkJCQl0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCi0JCQl0LT5zaWduYWwgPSBzaWdzdHJlbmd0aDsgLyogV2UgbWlnaHQgbmVlZCB0byBtb2RpZnkgc2NhbGluZyBvZiB0aGlzICovCi0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19TX1RVTkVSOgotCQl7Ci0JCQlzdHJ1Y3QgdjRsMl90dW5lciAqdCA9IGFyZzsKLQkJCWlmKCh0LT5pbmRleCAhPSAwKSYmKHQtPmluZGV4ICE9IDEpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQljdXJ0dW5lciA9IHQtPmluZGV4OwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJY2FzZSBWSURJT0NfR19GUkVRVUVOQ1k6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZiA9IGFyZzsKLQkJCW1lbXNldChmLDAsc2l6ZW9mKCpmKSk7Ci0JCQlmLT50dW5lciA9IGN1cnR1bmVyOwotCQkJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87Ci0JCQlmLT5mcmVxdWVuY3kgPSBjYWRldF9nZXRmcmVxKCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQkJewotCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwotCQkJaWYgKGYtPnR5cGUgIT0gVjRMMl9UVU5FUl9SQURJTyl7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlpZigoY3VydHVuZXI9PTApJiYoKGYtPmZyZXF1ZW5jeTwxNDAwKXx8KGYtPmZyZXF1ZW5jeT4xNzI4KSkpIHsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWlmKChjdXJ0dW5lcj09MSkmJigoZi0+ZnJlcXVlbmN5PDgzMjApfHwoZi0+ZnJlcXVlbmN5PjI2NDAwKSkpIHsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWNhZGV0X3NldGZyZXEoZi0+ZnJlcXVlbmN5KTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWNhc2UgVklESU9DX0dfQ1RSTDoKLQkJewotCQkJc3RydWN0IHY0bDJfY29udHJvbCAqYyA9IGFyZzsKLQkJCXN3aXRjaCAoYy0+aWQpewotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURTogLyogVE9ETzogSGFuZGxlIHRoaXMgY29ycmVjdGx5ICovCi0JCQkJCWMtPnZhbHVlID0gKGNhZGV0X2dldHZvbCgpID09IDApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJCQkJYy0+dmFsdWUgPSBjYWRldF9nZXR2b2woKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXsKLQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmMgPSBhcmc7Ci0JCQlzd2l0Y2ggKGMtPmlkKXsKLQkJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IC8qIFRPRE86IEhhbmRsZSB0aGlzIGNvcnJlY3RseSAqLwotCQkJCQlpZiAoYy0+dmFsdWUpIGNhZGV0X3NldHZvbCgwKTsKLQkJCQkJCWVsc2UgY2FkZXRfc2V0dm9sKDB4ZmZmZik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQkJCQljYWRldF9zZXR2b2woYy0+dmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRU5PSU9DVExDTUQ7Ci0JfQorCXYtPmNhcGFiaWxpdGllcyA9CisJCVY0TDJfQ0FQX1RVTkVSIHwKKwkJVjRMMl9DQVBfUkVBRFdSSVRFOworCXYtPnZlcnNpb24gPSBDQURFVF9WRVJTSU9OOworCXN0cmNweSh2LT5kcml2ZXIsICJBRFMgQ2FkZXQiKTsKKwlzdHJjcHkodi0+Y2FyZCwgIkFEUyBDYWRldCIpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1jYWRldF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCB2aWRpb2NfZ190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKIHsKLQlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBjYWRldF9kb19pb2N0bCk7CisJdi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisJc3dpdGNoICh2LT5pbmRleCkgeworCWNhc2UgMDoKKwkJc3RyY3B5KHYtPm5hbWUsICJGTSIpOworCQl2LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfU1RFUkVPOworCQl2LT5yYW5nZWxvdyA9IDE0MDA7ICAgICAvKiA4Ny41IE1IeiAqLworCQl2LT5yYW5nZWhpZ2ggPSAxNzI4OyAgICAvKiAxMDguMCBNSHogKi8KKwkJdi0+cnhzdWJjaGFucz1jYWRldF9nZXRzdGVyZW8oKTsKKwkJc3dpdGNoICh2LT5yeHN1YmNoYW5zKXsKKwkJY2FzZSBWNEwyX1RVTkVSX1NVQl9NT05POgorCQkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9NT05POworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9UVU5FUl9TVUJfU1RFUkVPOgorCQkJdi0+YXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CisJCQlicmVhazsKKwkJZGVmYXVsdDogOworCQl9CisJCWJyZWFrOworCWNhc2UgMToKKwkJc3RyY3B5KHYtPm5hbWUsICJBTSIpOworCQl2LT5jYXBhYmlsaXR5ID0gVjRMMl9UVU5FUl9DQVBfTE9XOworCQl2LT5yYW5nZWxvdyA9IDgzMjA7ICAgICAgLyogNTIwIGtIeiAqLworCQl2LT5yYW5nZWhpZ2ggPSAyNjQwMDsgICAgLyogMTY1MCBrSHogKi8KKwkJdi0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX01PTk87CisJCXYtPmF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXYtPnNpZ25hbCA9IHNpZ3N0cmVuZ3RoOyAvKiBXZSBtaWdodCBuZWVkIHRvIG1vZGlmeSBzY2FsaW5nIG9mIHRoaXMgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKK3sKKwlpZigodi0+aW5kZXggIT0gMCkmJih2LT5pbmRleCAhPSAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY3VydHVuZXIgPSB2LT5pbmRleDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoreworCWYtPnR1bmVyID0gY3VydHVuZXI7CisJZi0+dHlwZSA9IFY0TDJfVFVORVJfUkFESU87CisJZi0+ZnJlcXVlbmN5ID0gY2FkZXRfZ2V0ZnJlcSgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKK3sKKwlpZiAoZi0+dHlwZSAhPSBWNEwyX1RVTkVSX1JBRElPKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZigoY3VydHVuZXI9PTApJiYoKGYtPmZyZXF1ZW5jeTwxNDAwKXx8KGYtPmZyZXF1ZW5jeT4xNzI4KSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmKChjdXJ0dW5lcj09MSkmJigoZi0+ZnJlcXVlbmN5PDgzMjApfHwoZi0+ZnJlcXVlbmN5PjI2NDAwKSkpCisJCXJldHVybiAtRUlOVkFMOworCWNhZGV0X3NldGZyZXEoZi0+ZnJlcXVlbmN5KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYWRpb19xY3RybCk7IGkrKykgeworCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSByYWRpb19xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmKHJhZGlvX3FjdHJsW2ldKSwKKwkJCQkJCXNpemVvZigqcWMpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzd2l0Y2ggKGN0cmwtPmlkKXsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6IC8qIFRPRE86IEhhbmRsZSB0aGlzIGNvcnJlY3RseSAqLworCQljdHJsLT52YWx1ZSA9IChjYWRldF9nZXR2b2woKSA9PSAwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCWN0cmwtPnZhbHVlID0gY2FkZXRfZ2V0dm9sKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3dpdGNoIChjdHJsLT5pZCl7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOiAvKiBUT0RPOiBIYW5kbGUgdGhpcyBjb3JyZWN0bHkgKi8KKwkJaWYgKGN0cmwtPnZhbHVlKQorCQkJY2FkZXRfc2V0dm9sKDApOworCQllbHNlCisJCQljYWRldF9zZXR2b2woMHhmZmZmKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCWNhZGV0X3NldHZvbChjdHJsLT52YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19hdWRpbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKK3sKKwlpZiAoYS0+aW5kZXggPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzdHJjcHkoYS0+bmFtZSwgIlJhZGlvIik7CisJYS0+Y2FwYWJpbGl0eSA9IFY0TDJfQVVEQ0FQX1NURVJFTzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZ19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50ICppKQoreworCSppID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX3NfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpCit7CisJaWYgKGEtPmluZGV4ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CkBAIC01MTIsNyArNTYxLDcgQEAKIAkub3BlbgkJPSBjYWRldF9vcGVuLAogCS5yZWxlYXNlICAgICAgIAk9IGNhZGV0X3JlbGVhc2UsCiAJLnJlYWQJCT0gY2FkZXRfcmVhZCwKLQkuaW9jdGwJCT0gY2FkZXRfaW9jdGwsCisJLmlvY3RsCQk9IHZpZGVvX2lvY3RsMiwKIAkucG9sbAkJPSBjYWRldF9wb2xsLAogCS5jb21wYXRfaW9jdGwJPSB2NGxfY29tcGF0X2lvY3RsMzIsCiAJLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLApAQCAtNTI0LDYgKzU3MywxOCBAQAogCS5uYW1lCQk9ICJDYWRldCByYWRpbyIsCiAJLnR5cGUJCT0gVklEX1RZUEVfVFVORVIsCiAJLmZvcHMgICAgICAgICAgID0gJmNhZGV0X2ZvcHMsCisJLnZpZGlvY19xdWVyeWNhcCAgICA9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2dfdHVuZXIgICAgID0gdmlkaW9jX2dfdHVuZXIsCisJLnZpZGlvY19zX3R1bmVyICAgICA9IHZpZGlvY19zX3R1bmVyLAorCS52aWRpb2NfZ19mcmVxdWVuY3kgPSB2aWRpb2NfZ19mcmVxdWVuY3ksCisJLnZpZGlvY19zX2ZyZXF1ZW5jeSA9IHZpZGlvY19zX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3F1ZXJ5Y3RybCAgID0gdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybCAgICAgID0gdmlkaW9jX2dfY3RybCwKKwkudmlkaW9jX3NfY3RybCAgICAgID0gdmlkaW9jX3NfY3RybCwKKwkudmlkaW9jX2dfYXVkaW8gICAgID0gdmlkaW9jX2dfYXVkaW8sCisJLnZpZGlvY19zX2F1ZGlvICAgICA9IHZpZGlvY19zX2F1ZGlvLAorCS52aWRpb2NfZ19pbnB1dCAgICAgPSB2aWRpb2NfZ19pbnB1dCwKKwkudmlkaW9jX3NfaW5wdXQgICAgID0gdmlkaW9jX3NfaW5wdXQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBucF9kZXZpY2VfaWQgY2FkZXRfcG5wX2RldmljZXNbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYWVzdHJvLmMKaW5kZXggMTFmODBjYS4uOGUzM2ExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYWVzdHJvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYWVzdHJvLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgpAQCAtMTEwLDcgKzEwOSw2IEBACiAJCW11dGVkLAkvKiBWSURFT19BVURJT19NVVRFICovCiAJCXN0ZXJlbywJLyogVklERU9fVFVORVJfU1RFUkVPX09OICovCiAJCXR1bmVkOwkvKiBzaWduYWwgc3RyZW5ndGggKDAgb3IgMHhmZmZmKSAqLwotCXN0cnVjdCBtdXRleCBsb2NrOwogfTsKIAogc3RhdGljIHUzMiByYWRpb19iaXRzX2dldChzdHJ1Y3QgcmFkaW9fZGV2aWNlICpkZXYpCkBAIC0zOTQsNyArMzkyLDYgQEAKIAl9CiAKIAlyYWRpb191bml0LT5pbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSArIEdQSU9fREFUQTsKLQltdXRleF9pbml0KCZyYWRpb191bml0LT5sb2NrKTsKIAogCW1hZXN0cm9fcmFkaW9faW5zdCA9IHZpZGVvX2RldmljZV9hbGxvYygpOwogCWlmIChtYWVzdHJvX3JhZGlvX2luc3QgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYwppbmRleCBhNDcxNTkwLi4yMDNmNDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXpvbHRyaXguYwpAQCAtNDEwLDcgKzQxMCw2IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQk9ICJab2x0cml4IFJhZGlvIFBsdXMiLAogCS50eXBlCQk9IFZJRF9UWVBFX1RVTkVSLAotCS5oYXJkd2FyZQk9IDAsCiAJLmZvcHMgICAgICAgICAgID0gJnpvbHRyaXhfZm9wcywKIAkudmlkaW9jX3F1ZXJ5Y2FwICAgID0gdmlkaW9jX3F1ZXJ5Y2FwLAogCS52aWRpb2NfZ190dW5lciAgICAgPSB2aWRpb2NfZ190dW5lciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwppbmRleCBiYzc3Mzc4Li41Y2IzZjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCkBAIC0yLDE0ICsyLDE5IEBACiAjIE11bHRpbWVkaWEgVmlkZW8gZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiVmlkZW8gQ2FwdHVyZSBBZGFwdGVycyIKK21lbnVjb25maWcgVklERU9fQ0FQVFVSRV9EUklWRVJTCisJYm9vbCAiVmlkZW8gY2FwdHVyZSBhZGFwdGVycyIKIAlkZXBlbmRzIG9uIFZJREVPX0RFVgorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHNlbGVjdGluZyB0aGUgdmlkZW8gYWRhcHRlcnMgZm9yCisJICB3ZWJjYW1zLCBhbmFsb2cgVFYsIGFuZCBoeWJyaWQgYW5hbG9nL2RpZ2l0YWwgVFYuCisJICBTb21lIG9mIHRob3NlIGRldmljZXMgYWxzbyBzdXBwb3J0cyBGTSByYWRpby4KIAotY29tbWVudCAiVmlkZW8gQ2FwdHVyZSBBZGFwdGVycyIKK2lmIFZJREVPX0NBUFRVUkVfRFJJVkVSUwogCiBjb25maWcgVklERU9fQURWX0RFQlVHCiAJYm9vbCAiRW5hYmxlIGFkdmFuY2VkIGRlYnVnIGZ1bmN0aW9uYWxpdHkiCi0JZGVwZW5kcyBvbiBWSURFT19ERVYKIAlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBhZHZhbmNlZCBkZWJ1Z2dpbmcgZnVuY3Rpb25hbGl0eSBvbiBzb21lCkBAIC0zNCw3ICszOSw3IEBACiAjCiAKIG1lbnUgIkVuY29kZXJzL2RlY29kZXJzIGFuZCBvdGhlciBoZWxwZXIgY2hpcHMiCi0JZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgIVZJREVPX0hFTFBFUl9DSElQU19BVVRPCisJZGVwZW5kcyBvbiAhVklERU9fSEVMUEVSX0NISVBTX0FVVE8KIAogY29tbWVudCAiQXVkaW8gZGVjb2RlcnMiCiAKQEAgLTYxLDcgKzY2LDcgQEAKIAogY29uZmlnIFZJREVPX1REQTk4NDAKIAl0cmlzdGF0ZSAiUGhpbGlwcyBUREE5ODQwIGF1ZGlvIHByb2Nlc3NvciIKLQlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJMkMKKwlkZXBlbmRzIG9uIEkyQwogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgZm9yIHRkYTk4NDAgYXVkaW8gZGVjb2RlciBjaGlwIGZvdW5kIG9uIHNvbWUgWm9yYW4gYm9hcmRzLgogCkBAIC03OSw3ICs4NCw3IEBACiAKIGNvbmZpZyBWSURFT19URUE2NDE1QwogCXRyaXN0YXRlICJQaGlsaXBzIFRFQTY0MTVDIGF1ZGlvIHByb2Nlc3NvciIKLQlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJMkMKKwlkZXBlbmRzIG9uIEkyQwogCS0tLWhlbHAtLS0KIAkgIFN1cHBvcnQgZm9yIHRlYTY0MTVjIGF1ZGlvIGRlY29kZXIgY2hpcCBmb3VuZCBvbiBzb21lIGJ0OHh4IGJvYXJkcy4KIApAQCAtODgsNyArOTMsNyBAQAogCiBjb25maWcgVklERU9fVEVBNjQyMAogCXRyaXN0YXRlICJQaGlsaXBzIFRFQTY0MjAgYXVkaW8gcHJvY2Vzc29yIgotCWRlcGVuZHMgb24gVklERU9fREVWICYmIEkyQworCWRlcGVuZHMgb24gSTJDCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgdGVhNjQyMCBhdWRpbyBkZWNvZGVyIGNoaXAgZm91bmQgb24gc29tZSBidDh4eCBib2FyZHMuCiAKQEAgLTQ2OSw3ICs0NzQsNyBAQAogCiBjb25maWcgVklERU9fU0FBNTI0OQogCXRyaXN0YXRlICJTQUE1MjQ5IFRlbGV0ZXh0IHByb2Nlc3NvciIKLQlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJMkMgJiYgVklERU9fVjRMMgorCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIKIAloZWxwCiAJICBTdXBwb3J0IGZvciBJMkMgYnVzIGJhc2VkIHRlbGV0ZXh0IHVzaW5nIHRoZSBTQUE1MjQ5IGNoaXAuIEF0IHRoZQogCSAgbW9tZW50IHRoaXMgaXMgb25seSB1c2VmdWwgb24gc29tZSBFdXJvcGVhbiBXaW5UViBjYXJkcy4KQEAgLTQ3OSw3ICs0ODQsNyBAQAogCiBjb25maWcgVFVORVJfMzAzNgogCXRyaXN0YXRlICJTQUIzMDM2IHR1bmVyIgotCWRlcGVuZHMgb24gVklERU9fREVWICYmIEkyQyAmJiBWSURFT19WNEwxCisJZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMQogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBQaGlsaXBzIFNBQjMwMzYgY29tcGF0aWJsZSB0dW5lcnMuCiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCkBAIC02ODEsOCArNjg2LDEyIEBACiAjIFVTQiBNdWx0aW1lZGlhIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIlY0TCBVU0IgZGV2aWNlcyIKLQlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19ERVYKK21lbnVjb25maWcgVjRMX1VTQl9EUklWRVJTCisJYm9vbCAiVjRMIFVTQiBkZXZpY2VzIgorCWRlcGVuZHMgb24gVVNCCisJZGVmYXVsdCB5CisKK2lmIFY0TF9VU0JfRFJJVkVSUwogCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9LY29uZmlnIgogCkBAIC03MDcsNyArNzE2LDcgQEAKIAogY29uZmlnIFVTQl9XOTk2OENGCiAJdHJpc3RhdGUgIlVTQiBXOTk2Wzg3XUNGIEpQRUcgRHVhbCBNb2RlIENhbWVyYSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX1Y0TDEgJiYgSTJDCisJZGVwZW5kcyBvbiBWSURFT19WNEwxICYmIEkyQwogCXNlbGVjdCBWSURFT19PVkNBTUNISVAKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gT1Y2ODEgb3IKQEAgLTcyNSw3ICs3MzQsNyBAQAogCiBjb25maWcgVVNCX09WNTExCiAJdHJpc3RhdGUgIlVTQiBPVjUxMSBDYW1lcmEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19WNEwxCisJZGVwZW5kcyBvbiBWSURFT19WNEwxCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IHRoaXMgdHlwZSBvZiBjYW1lcmEgdG8geW91cgogCSAgY29tcHV0ZXIncyBVU0IgcG9ydC4gU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vdmlkZW80bGludXgvb3Y1MTEudHh0PgpAQCAtNzM2LDcgKzc0NSw3IEBACiAKIGNvbmZpZyBVU0JfU0U0MDEKIAl0cmlzdGF0ZSAiVVNCIFNFNDAxIENhbWVyYSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX1Y0TDEKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDEKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgdGhpcyB0eXBlIG9mIGNhbWVyYSB0byB5b3VyCiAJICBjb21wdXRlcidzIFVTQiBwb3J0LiBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zZTQwMS50eHQ+CkBAIC03NDksNyArNzU4LDcgQEAKIAogY29uZmlnIFVTQl9TVFY2ODAKIAl0cmlzdGF0ZSAiVVNCIFNUVjY4MCAoUGVuY2FtKSBDYW1lcmEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19WNEwxCisJZGVwZW5kcyBvbiBWSURFT19WNEwxCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IHRoaXMgdHlwZSBvZiBjYW1lcmEgdG8geW91cgogCSAgY29tcHV0ZXIncyBVU0IgcG9ydC4gVGhpcyBpbmNsdWRlcyB0aGUgUGVuY2FtIGxpbmUgb2YgY2FtZXJhcy4KQEAgLTc2NSw3ICs3NzQsNyBAQAogCiBjb25maWcgVVNCX1pSMzY0WFgKIAl0cmlzdGF0ZSAiVVNCIFpSMzY0WFggQ2FtZXJhIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBVU0IgJiYgVklERU9fVjRMMgorCWRlcGVuZHMgb24gVklERU9fVjRMMgogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0aGlzIHR5cGUgb2YgY2FtZXJhIHRvIHlvdXIKIAkgIGNvbXB1dGVyJ3MgVVNCIHBvcnQuCkBAIC03NzUsNiArNzg0LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHpyMzY0eHguCiAKLWVuZG1lbnUgIyBWNEwgVVNCIGRldmljZXMKK2VuZGlmICMgVjRMX1VTQl9EUklWRVJTCiAKLWVuZG1lbnUKK2VuZGlmICMgVklERU9fQ0FQVFVSRV9EUklWRVJTCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMKaW5kZXggMTc1N2E1OC4uNjdiZGE5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuYwpAQCAtNTU1LDcgKzU1NSw3IEBACiB7CiAJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4OwogCWludCBIU0MsIFZTQywgVnNyYywgSHNyYywgZmlsdGVyLCBWbGluZXM7Ci0JaW50IGlzX3BhbCA9ICEoY3gyNTg0MF9nZXRfdjRsc3RkKGNsaWVudCkgJiBWNEwyX1NURF9OVFNDKTsKKwlpbnQgaXNfNTBIeiA9ICEoY3gyNTg0MF9nZXRfdjRsc3RkKGNsaWVudCkgJiBWNEwyX1NURF81MjVfNjApOwogCiAJc3dpdGNoIChmbXQtPnR5cGUpIHsKIAljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKQEAgLTU2Nyw3ICs1NjcsNyBAQAogCQlIc3JjID0gKGN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDcyKSAmIDB4M2YpIDw8IDQ7CiAJCUhzcmMgfD0gKGN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDcxKSAmIDB4ZjApID4+IDQ7CiAKLQkJVmxpbmVzID0gcGl4LT5oZWlnaHQgKyAoaXNfcGFsID8gNCA6IDcpOworCQlWbGluZXMgPSBwaXgtPmhlaWdodCArIChpc181MEh6ID8gNCA6IDcpOwogCiAJCWlmICgocGl4LT53aWR0aCAqIDE2IDwgSHNyYykgfHwgKEhzcmMgPCBwaXgtPndpZHRoKSB8fAogCQkgICAgKFZsaW5lcyAqIDggPCBWc3JjKSB8fCAoVnNyYyA8IFZsaW5lcykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwppbmRleCAyZWJkZTJmLi41NDNiMDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGFzbS9kZWxheS5oPgogCiAjaW5jbHVkZSAiY3g4OC5oIgpAQCAtNjEyLDcgKzYxMyw3IEBACiB9CiAKIC8qIERyaXZlciBhc2tlZCBmb3IgaGFyZHdhcmUgYWNjZXNzLiAqLwotaW50IGN4ODgwMl9yZXF1ZXN0X2FjcXVpcmUoc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydikKK3N0YXRpYyBpbnQgY3g4ODAyX3JlcXVlc3RfYWNxdWlyZShzdHJ1Y3QgY3g4ODAyX2RyaXZlciAqZHJ2KQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkcnYtPmNvcmU7CiAKQEAgLTYzMiw3ICs2MzMsNyBAQAogfQogCiAvKiBEcml2ZXIgYXNrZWQgdG8gcmVsZWFzZSBoYXJkd2FyZS4gKi8KLWludCBjeDg4MDJfcmVxdWVzdF9yZWxlYXNlKHN0cnVjdCBjeDg4MDJfZHJpdmVyICpkcnYpCitzdGF0aWMgaW50IGN4ODgwMl9yZXF1ZXN0X3JlbGVhc2Uoc3RydWN0IGN4ODgwMl9kcml2ZXIgKmRydikKIHsKIAlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZHJ2LT5jb3JlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYwppbmRleCBiOTRlZjhhLi45OGZhMzU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKICNpbmNsdWRlICJjeDg4LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12cDMwNTQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12cDMwNTQtaTJjLmMKaW5kZXggNjA2OGM5Yi4uODJiYzNhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdnAzMDU0LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZwMzA1NC1pMmMuYwpAQCAtMTExLDEwICsxMTEsNiBAQAogCS5pZCAgICAgICAgICAgICAgICA9IEkyQ19IV19CX0NYMjM4OHgsCiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgdnAzMDU0X2kyY19jbGllbnRfdGVtcGxhdGUgPSB7Ci0JLm5hbWUJPSAiVlAtMzA1NCIsCi19OwotCiBpbnQgdnAzMDU0X2kyY19wcm9iZShzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CkBAIC0xMzMsOCArMTI5LDYgQEAKIAkgICAgICAgc2l6ZW9mKHZwMzA1NF9pMmMtPmFkYXApKTsKIAltZW1jcHkoJnZwMzA1NF9pMmMtPmFsZ28sICZ2cDMwNTRfaTJjX2FsZ29fdGVtcGxhdGUsCiAJICAgICAgIHNpemVvZih2cDMwNTRfaTJjLT5hbGdvKSk7Ci0JbWVtY3B5KCZ2cDMwNTRfaTJjLT5jbGllbnQsICZ2cDMwNTRfaTJjX2NsaWVudF90ZW1wbGF0ZSwKLQkgICAgICAgc2l6ZW9mKHZwMzA1NF9pMmMtPmNsaWVudCkpOwogCiAJdnAzMDU0X2kyYy0+YWRhcC5jbGFzcyB8PSBJMkNfQ0xBU1NfVFZfRElHSVRBTDsKIApAQCAtMTQ0LDcgKzEzOCw2IEBACiAJdnAzMDU0X2kyYy0+YWxnby5kYXRhID0gZGV2OwogCWkyY19zZXRfYWRhcGRhdGEoJnZwMzA1NF9pMmMtPmFkYXAsIGRldik7CiAJdnAzMDU0X2kyYy0+YWRhcC5hbGdvX2RhdGEgPSAmdnAzMDU0X2kyYy0+YWxnbzsKLQl2cDMwNTRfaTJjLT5jbGllbnQuYWRhcHRlciA9ICZ2cDMwNTRfaTJjLT5hZGFwOwogCiAJdnAzMDU0X2JpdF9zZXRzY2woZGV2LDEpOwogCXZwMzA1NF9iaXRfc2V0c2RhKGRldiwxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZwMzA1NC1pMmMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZwMzA1NC1pMmMuaAppbmRleCBiN2EwYTA0Li42MzdhN2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12cDMwNTQtaTJjLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdnAzMDU0LWkyYy5oCkBAIC0yNiw3ICsyNiw2IEBACiBzdHJ1Y3QgdnAzMDU0X2kyY19zdGF0ZSB7CiAJc3RydWN0IGkyY19hZGFwdGVyICAgICAgICAgYWRhcDsKIAlzdHJ1Y3QgaTJjX2FsZ29fYml0X2RhdGEgICBhbGdvOwotCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICAgIGNsaWVudDsKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9LY29uZmlnCmluZGV4IDkyODVhNTguLjM4MjNiNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBWSURFT19FTTI4WFgKIAl0cmlzdGF0ZSAiRW1waWEgRU0yODAwLzI4MjAvMjg0MCBVU0IgdmlkZW8gY2FwdHVyZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVklERU9fVjRMMSAmJiBVU0IgJiYgSTJDCisJZGVwZW5kcyBvbiBWSURFT19WNEwxICYmIEkyQwogCXNlbGVjdCBWSURFT19CVUYKIAlzZWxlY3QgVklERU9fVFVORVIKIAlzZWxlY3QgVklERU9fVFZFRVBST00KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvS2NvbmZpZwppbmRleCBjNmJmZjcwLi42NjQ2NzZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIFVTQl9FVDYxWDI1MQogCXRyaXN0YXRlICJVU0IgRVQ2MVhbMTJdNTEgUEMgQ2FtZXJhIENvbnRyb2xsZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19WNEwxCisJZGVwZW5kcyBvbiBWSURFT19WNEwxCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIEV0b21zIEVUNjFYMTUxCiAJICBvciBFVDYxWDI1MSBQQyBDYW1lcmEgQ29udHJvbGxlcnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCmluZGV4IDQ1YjkzMjguLmUyOWY5NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5jCkBAIC03NCw3ICs3NCw3IEBACiBzdHJ1Y3QgaXZ0diAqaXZ0dl9jYXJkc1tJVlRWX01BWF9DQVJEU107CiAKIC8qIFByb3RlY3RzIGl2dHZfY2FyZHNfYWN0aXZlICovCi1zcGlubG9ja190IGl2dHZfY2FyZHNfbG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKK0RFRklORV9TUElOTE9DSyhpdnR2X2NhcmRzX2xvY2spOwogCiAvKiBhZGQgeW91ciByZXZpc2lvbiBhbmQgd2hhdG5vdCBoZXJlICovCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXZ0dl9wY2lfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYwppbmRleCAxNjM3MDk3Li44OTc2NDg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jCkBAIC04MDQsNyArODA0LDcgQEAKIAlzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppdGVtOwogCXN0cnVjdCBpdnR2ICppdHYgPSBOVUxMOwogCXN0cnVjdCBpdnR2X3N0cmVhbSAqcyA9IE5VTEw7Ci0JaW50IG1pbm9yID0gTUlOT1IoaW5vZGUtPmlfcmRldik7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKIAogCS8qIEZpbmQgd2hpY2ggY2FyZCB0aGlzIG9wZW4gd2FzIG9uICovCiAJc3Bpbl9sb2NrKCZpdnR2X2NhcmRzX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvS2NvbmZpZwppbmRleCA1NjQ1YzkzLi5kMGMyY2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBWSURFT19QVlJVU0IyCiAJdHJpc3RhdGUgIkhhdXBwYXVnZSBXaW5UVi1QVlIgVVNCMiBzdXBwb3J0IgotCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0IgJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBWSURFT19UVU5FUgogCXNlbGVjdCBWSURFT19UVkVFUFJPTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZW5jb2Rlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItZW5jb2Rlci5jCmluZGV4IDU2NjljOGMuLjIwYjYxNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWVuY29kZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1lbmNvZGVyLmMKQEAgLTM5MSwyMiArMzkxLDI5IEBACiBpbnQgcHZyMl9lbmNvZGVyX2NvbmZpZ3VyZShzdHJ1Y3QgcHZyMl9oZHcgKmhkdykKIHsKIAlpbnQgcmV0OworCWludCB2YWw7CiAJcHZyMl90cmFjZShQVlIyX1RSQUNFX0VOQ09ERVIsInB2cjJfZW5jb2Rlcl9jb25maWd1cmUiCiAJCSAgICIgKGN4MjM0MXggbW9kdWxlKSIpOwogCWhkdy0+ZW5jX2N0bF9zdGF0ZS5wb3J0ID0gQ1gyMzQxWF9QT1JUX1NUUkVBTUlORzsKIAloZHctPmVuY19jdGxfc3RhdGUud2lkdGggPSBoZHctPnJlc19ob3JfdmFsOwogCWhkdy0+ZW5jX2N0bF9zdGF0ZS5oZWlnaHQgPSBoZHctPnJlc192ZXJfdmFsOwotCWhkdy0+ZW5jX2N0bF9zdGF0ZS5pc181MGh6ID0gKChoZHctPnN0ZF9tYXNrX2N1ciAmCi0JCQkJICAgICAgIChWNEwyX1NURF9OVFNDfFY0TDJfU1REX1BBTF9NKSkgPworCWhkdy0+ZW5jX2N0bF9zdGF0ZS5pc181MGh6ID0gKChoZHctPnN0ZF9tYXNrX2N1ciAmIFY0TDJfU1REXzUyNV82MCkgPwogCQkJCSAgICAgIDAgOiAxKTsKIAogCXJldCA9IDA7CiAKIAlyZXQgfD0gcHZyMl9lbmNvZGVyX3ByZXBfY29uZmlnKGhkdyk7CiAKKwkvKiBzYWE3MTE1OiAweGYwICovCisJdmFsID0gMHhmMDsKKwlpZiAoaGR3LT5oZHdfdHlwZSA9PSBQVlIyX0hEV19UWVBFXzI0WFhYKSB7CisJCS8qIGl2dHYgY3gyNTg0MDogMHgxNDAgKi8KKwkJdmFsID0gMHgxNDA7CisJfQorCiAJaWYgKCFyZXQpIHJldCA9IHB2cjJfZW5jb2Rlcl92Y21kKAogCQloZHcsQ1gyMzQxWF9FTkNfU0VUX05VTV9WU1lOQ19MSU5FUywgMiwKLQkJMHhmMCwgMHhmMCk7CisJCXZhbCwgdmFsKTsKIAogCS8qIHNldHVwIGZpcm13YXJlIHRvIG5vdGlmeSB1cyBhYm91dCBzb21lIGV2ZW50cyAoZG9uJ3Qga25vdyB3aHkuLi4pICovCiAJaWYgKCFyZXQpIHJldCA9IHB2cjJfZW5jb2Rlcl92Y21kKApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaGR3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYwppbmRleCBhY2Y2NTFlLi4xMzExODkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1oZHcuYwpAQCAtODMsNyArODMsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwdnIyX2hkdyAqdW5pdF9wb2ludGVyc1tQVlJfTlVNXSA9IHtbIDAgLi4uIFBWUl9OVU0tMSBdID0gTlVMTH07Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChwdnIyX3VuaXRfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocHZyMl91bml0X210eCk7CiAKIHN0YXRpYyBpbnQgY3RsY2hnID0gMDsKIHN0YXRpYyBpbnQgaW5pdHVzYnJlc2V0ID0gMTsKQEAgLTIwNzYsMTQgKzIwNzYsMTQgQEAKIAloZHctPmN0bF9yZWFkX3VyYiA9IHVzYl9hbGxvY191cmIoMCxHRlBfS0VSTkVMKTsKIAlpZiAoIWhkdy0+Y3RsX3JlYWRfdXJiKSBnb3RvIGZhaWw7CiAKLQlkb3duKCZwdnIyX3VuaXRfc2VtKTsgZG8geworCW11dGV4X2xvY2soJnB2cjJfdW5pdF9tdHgpOyBkbyB7CiAJCWZvciAoaWR4ID0gMDsgaWR4IDwgUFZSX05VTTsgaWR4KyspIHsKIAkJCWlmICh1bml0X3BvaW50ZXJzW2lkeF0pIGNvbnRpbnVlOwogCQkJaGR3LT51bml0X251bWJlciA9IGlkeDsKIAkJCXVuaXRfcG9pbnRlcnNbaWR4XSA9IGhkdzsKIAkJCWJyZWFrOwogCQl9Ci0JfSB3aGlsZSAoMCk7IHVwKCZwdnIyX3VuaXRfc2VtKTsKKwl9IHdoaWxlICgwKTsgbXV0ZXhfdW5sb2NrKCZwdnIyX3VuaXRfbXR4KTsKIAogCWNudDEgPSAwOwogCWNudDIgPSBzY25wcmludGYoaGR3LT5uYW1lK2NudDEsc2l6ZW9mKGhkdy0+bmFtZSktY250MSwicHZydXNiMiIpOwpAQCAtMjE4NiwxMyArMjE4NiwxMyBAQAogCX0KIAlwdnIyX2kyY19jb3JlX2RvbmUoaGR3KTsKIAlwdnIyX2hkd19yZW1vdmVfdXNiX3N0dWZmKGhkdyk7Ci0JZG93bigmcHZyMl91bml0X3NlbSk7IGRvIHsKKwltdXRleF9sb2NrKCZwdnIyX3VuaXRfbXR4KTsgZG8gewogCQlpZiAoKGhkdy0+dW5pdF9udW1iZXIgPj0gMCkgJiYKIAkJICAgIChoZHctPnVuaXRfbnVtYmVyIDwgUFZSX05VTSkgJiYKIAkJICAgICh1bml0X3BvaW50ZXJzW2hkdy0+dW5pdF9udW1iZXJdID09IGhkdykpIHsKIAkJCXVuaXRfcG9pbnRlcnNbaGR3LT51bml0X251bWJlcl0gPSBOVUxMOwogCQl9Ci0JfSB3aGlsZSAoMCk7IHVwKCZwdnIyX3VuaXRfc2VtKTsKKwl9IHdoaWxlICgwKTsgbXV0ZXhfdW5sb2NrKCZwdnIyX3VuaXRfbXR4KTsKIAlrZnJlZShoZHctPmNvbnRyb2xzKTsKIAlrZnJlZShoZHctPm1wZWdfY3RybF9pbmZvKTsKIAlrZnJlZShoZHctPnN0ZF9kZWZzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1pMmMtY29yZS5jCmluZGV4IDU4ZmMzYzcuLjY3ODZkM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLWkyYy1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItaTJjLWNvcmUuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgInB2cnVzYjItaGR3LWludGVybmFsLmgiCiAjaW5jbHVkZSAicHZydXNiMi1kZWJ1Zy5oIgogI2luY2x1ZGUgInB2cnVzYjItZngyLWNtZC5oIgorI2luY2x1ZGUgInB2cnVzYjIuaCIKIAogI2RlZmluZSB0cmFjZV9pMmMoLi4uKSBwdnIyX3RyYWNlKFBWUjJfVFJBQ0VfSTJDLF9fVkFfQVJHU19fKQogCkBAIC0zOCw2ICszOSwxMCBAQAogbW9kdWxlX3BhcmFtKGkyY19zY2FuLCBpbnQsIFNfSVJVR098U19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGkyY19zY2FuLCJzY2FuIGkyYyBidXMgYXQgaW5zbW9kIHRpbWUiKTsKIAorc3RhdGljIGludCBpcl9tb2RlW1BWUl9OVU1dID0geyBbMCAuLi4gUFZSX05VTS0xXSA9IDEgfTsKK21vZHVsZV9wYXJhbV9hcnJheShpcl9tb2RlLCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpcl9tb2RlLCJzcGVjaWZ5OiAwPWRpc2FibGUgSVIgcmVjZXB0aW9uLCAxPW5vcm1hbCBJUiIpOworCiBzdGF0aWMgdW5zaWduZWQgaW50IHB2cjJfaTJjX2NsaWVudF9kZXNjcmliZShzdHJ1Y3QgcHZyMl9pMmNfY2xpZW50ICpjcCwKIAkJCQkJICAgICB1bnNpZ25lZCBpbnQgZGV0YWlsLAogCQkJCQkgICAgIGNoYXIgKmJ1Zix1bnNpZ25lZCBpbnQgbWF4bGVuKTsKQEAgLTI3Myw2ICsyNzgsMTUgQEAKIAlyZXR1cm4gcHZyMl9pMmNfYmFzaWNfb3AoaGR3LGkyY19hZGRyLHdkYXRhLHdsZW4scmRhdGEscmxlbik7CiB9CiAKKy8qIFRoaXMgaXMgYW4gZW50cnkgcG9pbnQgZGVzaWduZWQgdG8gYWx3YXlzIGZhaWwgYW55IGF0dGVtcHQgdG8gcGVyZm9ybSBhCisgICB0cmFuc2Zlci4gIFdlIHVzZSB0aGlzIHRvIGNhdXNlIGNlcnRhaW4gSTJDIGFkZHJlc3NlcyB0byBub3QgYmUKKyAgIHByb2JlZC4gKi8KK3N0YXRpYyBpbnQgaTJjX2JsYWNrX2hvbGUoc3RydWN0IHB2cjJfaGR3ICpoZHcsCisJCQkgICB1OCBpMmNfYWRkcix1OCAqd2RhdGEsdTE2IHdsZW4sdTggKnJkYXRhLHUxNiBybGVuKQoreworCXJldHVybiAtRUlPOworfQorCiAvKiBUaGlzIGlzIGEgc3BlY2lhbCBlbnRyeSBwb2ludCB0aGF0IGlzIGVudGVyZWQgaWYgYW4gSTJDIG9wZXJhdGlvbiBpcwogICAgYXR0ZW1wdGVkIHRvIGEgY3gyNTg0MCBjaGlwIG9uIG1vZGVsIDI0eHh4IGhhcmR3YXJlLiAgVGhpcyBjaGlwIGNhbgogICAgc29tZXRpbWVzIHdlZGdlIGl0c2VsZi4gIFdvcnNlIHN0aWxsLCB3aGVuIHRoaXMgaGFwcGVucyBtc3AzNDAwIGNhbgpAQCAtOTk0LDEwICsxMDA4LDE3IEBACiAJfQogCiAJLyogSG93ZXZlciwgZGVhbCB3aXRoIHZhcmlvdXMgc3BlY2lhbCBjYXNlcyBmb3IgMjR4eHggaGFyZHdhcmUuICovCisJaWYgKGlyX21vZGVbaGR3LT51bml0X251bWJlcl0gPT0gMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogSVIgZGlzYWJsZWRcbiIsaGR3LT5uYW1lKTsKKwkJaGR3LT5pMmNfZnVuY1sweDE4XSA9IGkyY19ibGFja19ob2xlOworCX0gZWxzZSBpZiAoaXJfbW9kZVtoZHctPnVuaXRfbnVtYmVyXSA9PSAxKSB7CisJCWlmIChoZHctPmhkd190eXBlID09IFBWUjJfSERXX1RZUEVfMjRYWFgpIHsKKwkJCWhkdy0+aTJjX2Z1bmNbMHgxOF0gPSBpMmNfMjR4eHhfaXI7CisJCX0KKwl9CiAJaWYgKGhkdy0+aGR3X3R5cGUgPT0gUFZSMl9IRFdfVFlQRV8yNFhYWCkgewogCQloZHctPmkyY19mdW5jWzB4MWJdID0gaTJjX2hhY2tfd204Nzc1OwogCQloZHctPmkyY19mdW5jWzB4NDRdID0gaTJjX2hhY2tfY3gyNTg0MDsKLQkJaGR3LT5pMmNfZnVuY1sweDE4XSA9IGkyY18yNHh4eF9pcjsKIAl9CiAKIAkvLyBDb25maWd1cmUgdGhlIGFkYXB0ZXIgYW5kIHNldCB1cCBldmVyeXRoaW5nIGVsc2UgcmVsYXRlZCB0byBpdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXN5c2ZzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1zeXNmcy5jCmluZGV4IGE3NDFjNTU2Li43YWI3OWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1zeXNmcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXN5c2ZzLmMKQEAgLTUxOCw0MCArNTE4LDMyIEBACiAJfQogCXNmcC0+aXRlbV9sYXN0ID0gY2lwOwogCi0JY2lwLT5hdHRyX25hbWUuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwogCWNpcC0+YXR0cl9uYW1lLmF0dHIubmFtZSA9ICJuYW1lIjsKIAljaXAtPmF0dHJfbmFtZS5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCWNpcC0+YXR0cl9uYW1lLnNob3cgPSBmcC0+c2hvd19uYW1lOwogCi0JY2lwLT5hdHRyX3R5cGUuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwogCWNpcC0+YXR0cl90eXBlLmF0dHIubmFtZSA9ICJ0eXBlIjsKIAljaXAtPmF0dHJfdHlwZS5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCWNpcC0+YXR0cl90eXBlLnNob3cgPSBmcC0+c2hvd190eXBlOwogCi0JY2lwLT5hdHRyX21pbi5hdHRyLm93bmVyID0gVEhJU19NT0RVTEU7CiAJY2lwLT5hdHRyX21pbi5hdHRyLm5hbWUgPSAibWluX3ZhbCI7CiAJY2lwLT5hdHRyX21pbi5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCWNpcC0+YXR0cl9taW4uc2hvdyA9IGZwLT5zaG93X21pbjsKIAotCWNpcC0+YXR0cl9tYXguYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwogCWNpcC0+YXR0cl9tYXguYXR0ci5uYW1lID0gIm1heF92YWwiOwogCWNpcC0+YXR0cl9tYXguYXR0ci5tb2RlID0gU19JUlVHTzsKIAljaXAtPmF0dHJfbWF4LnNob3cgPSBmcC0+c2hvd19tYXg7CiAKLQljaXAtPmF0dHJfdmFsLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKIAljaXAtPmF0dHJfdmFsLmF0dHIubmFtZSA9ICJjdXJfdmFsIjsKIAljaXAtPmF0dHJfdmFsLmF0dHIubW9kZSA9IFNfSVJVR087CiAKLQljaXAtPmF0dHJfY3VzdG9tLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKIAljaXAtPmF0dHJfY3VzdG9tLmF0dHIubmFtZSA9ICJjdXN0b21fdmFsIjsKIAljaXAtPmF0dHJfY3VzdG9tLmF0dHIubW9kZSA9IFNfSVJVR087CiAKLQljaXAtPmF0dHJfZW51bS5hdHRyLm93bmVyID0gVEhJU19NT0RVTEU7CiAJY2lwLT5hdHRyX2VudW0uYXR0ci5uYW1lID0gImVudW1fdmFsIjsKIAljaXAtPmF0dHJfZW51bS5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCWNpcC0+YXR0cl9lbnVtLnNob3cgPSBmcC0+c2hvd19lbnVtOwogCi0JY2lwLT5hdHRyX2JpdHMuYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwogCWNpcC0+YXR0cl9iaXRzLmF0dHIubmFtZSA9ICJiaXRfdmFsIjsKIAljaXAtPmF0dHJfYml0cy5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCWNpcC0+YXR0cl9iaXRzLnNob3cgPSBmcC0+c2hvd19iaXRzOwpAQCAtNjE2LDEyICs2MDgsMTAgQEAKIAogCWRpcCA9IGt6YWxsb2Moc2l6ZW9mKCpkaXApLEdGUF9LRVJORUwpOwogCWlmICghZGlwKSByZXR1cm47Ci0JZGlwLT5hdHRyX2RlYnVnY21kLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKIAlkaXAtPmF0dHJfZGVidWdjbWQuYXR0ci5uYW1lID0gImRlYnVnY21kIjsKIAlkaXAtPmF0dHJfZGVidWdjbWQuYXR0ci5tb2RlID0gU19JUlVHT3xTX0lXVVNSfFNfSVdHUlA7CiAJZGlwLT5hdHRyX2RlYnVnY21kLnNob3cgPSBkZWJ1Z2NtZF9zaG93OwogCWRpcC0+YXR0cl9kZWJ1Z2NtZC5zdG9yZSA9IGRlYnVnY21kX3N0b3JlOwotCWRpcC0+YXR0cl9kZWJ1Z2luZm8uYXR0ci5vd25lciA9IFRISVNfTU9EVUxFOwogCWRpcC0+YXR0cl9kZWJ1Z2luZm8uYXR0ci5uYW1lID0gImRlYnVnaW5mbyI7CiAJZGlwLT5hdHRyX2RlYnVnaW5mby5hdHRyLm1vZGUgPSBTX0lSVUdPOwogCWRpcC0+YXR0cl9kZWJ1Z2luZm8uc2hvdyA9IGRlYnVnaW5mb19zaG93OwpAQCAtODExLDcgKzgwMSw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlzZnAtPmF0dHJfdjRsX21pbm9yX251bWJlci5hdHRyLm93bmVyID0gVEhJU19NT0RVTEU7CiAJc2ZwLT5hdHRyX3Y0bF9taW5vcl9udW1iZXIuYXR0ci5uYW1lID0gInY0bF9taW5vcl9udW1iZXIiOwogCXNmcC0+YXR0cl92NGxfbWlub3JfbnVtYmVyLmF0dHIubW9kZSA9IFNfSVJVR087CiAJc2ZwLT5hdHRyX3Y0bF9taW5vcl9udW1iZXIuc2hvdyA9IHY0bF9taW5vcl9udW1iZXJfc2hvdzsKQEAgLTgyNSw3ICs4MTQsNiBAQAogCQlzZnAtPnY0bF9taW5vcl9udW1iZXJfY3JlYXRlZF9vayA9ICEwOwogCX0KIAotCXNmcC0+YXR0cl92NGxfcmFkaW9fbWlub3JfbnVtYmVyLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKIAlzZnAtPmF0dHJfdjRsX3JhZGlvX21pbm9yX251bWJlci5hdHRyLm5hbWUgPSAidjRsX3JhZGlvX21pbm9yX251bWJlciI7CiAJc2ZwLT5hdHRyX3Y0bF9yYWRpb19taW5vcl9udW1iZXIuYXR0ci5tb2RlID0gU19JUlVHTzsKIAlzZnAtPmF0dHJfdjRsX3JhZGlvX21pbm9yX251bWJlci5zaG93ID0gdjRsX3JhZGlvX21pbm9yX251bWJlcl9zaG93OwpAQCAtODM5LDcgKzgyNyw2IEBACiAJCXNmcC0+djRsX3JhZGlvX21pbm9yX251bWJlcl9jcmVhdGVkX29rID0gITA7CiAJfQogCi0Jc2ZwLT5hdHRyX3VuaXRfbnVtYmVyLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKIAlzZnAtPmF0dHJfdW5pdF9udW1iZXIuYXR0ci5uYW1lID0gInVuaXRfbnVtYmVyIjsKIAlzZnAtPmF0dHJfdW5pdF9udW1iZXIuYXR0ci5tb2RlID0gU19JUlVHTzsKIAlzZnAtPmF0dHJfdW5pdF9udW1iZXIuc2hvdyA9IHVuaXRfbnVtYmVyX3Nob3c7CkBAIC04NTIsNyArODM5LDYgQEAKIAkJc2ZwLT51bml0X251bWJlcl9jcmVhdGVkX29rID0gITA7CiAJfQogCi0Jc2ZwLT5hdHRyX2J1c19pbmZvLmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKIAlzZnAtPmF0dHJfYnVzX2luZm8uYXR0ci5uYW1lID0gImJ1c19pbmZvX3N0ciI7CiAJc2ZwLT5hdHRyX2J1c19pbmZvLmF0dHIubW9kZSA9IFNfSVJVR087CiAJc2ZwLT5hdHRyX2J1c19pbmZvLnNob3cgPSBidXNfaW5mb19zaG93OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL0tjb25maWcKaW5kZXggOGZkZjcxMC4uNzI5OGNmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIFVTQl9QV0MKIAl0cmlzdGF0ZSAiVVNCIFBoaWxpcHMgQ2FtZXJhcyIKLQlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19WNEwxCisJZGVwZW5kcyBvbiBWSURFT19WNEwxCiAJLS0taGVscC0tLQogCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBvbmUgb2YgdGhlc2UgUGhpbGlwcyAmIE9FTQogCSAgd2ViY2FtczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCmluZGV4IDRlYTQ3OWIuLjUwZjE1YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwpAQCAtMTE3MCw2ICsxMTcwLDQyIEBACiAJCQkuYW11eCAgID0gTElORTIsCiAJCX0sCiAJfSwKKyAgICBbU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXzRDQjZdID0geworCQkvKiBCYXJyeSBTY290dCA8YmFycnkuc2NvdHRAb25lbGFuLmNvLnVrPiAqLworCQkubmFtZQkJPSAiRWxpdGVncm91cCBFQ1MgVFZQM1hQIEZNMTI0NiBUdW5lciBDYXJkIChQQUwsRk0pIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfUEFMX0ksCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyCT0gQUREUl9VTlNFVCwKKwkJLmlucHV0cyAgICAgICAgID0ge3sKKwkJCS5uYW1lICAgPSBuYW1lX3R2LAorCQkJLnZtdXggICA9IDEsCisJCQkuYW11eCAgID0gVFYsCisJCQkudHYgICAgID0gMSwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV90dl9tb25vLAorCQkJLnZtdXggICA9IDEsCisJCQkuYW11eCAgID0gTElORTIsCisJCQkudHYgICAgID0gMSwKKwkJfSx7CisJCQkubmFtZSAgID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ICAgPSAzLAorCQkJLmFtdXggICA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ICAgPSA4LAorCQkJLmFtdXggICA9IExJTkUxLAorCQl9LHsKKwkJCS5uYW1lICAgPSAiQ1ZpZCBvdmVyIFNWaWQiLAorCQkJLnZtdXggICA9IDAsCisJCQkuYW11eCAgID0gTElORTEsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBMSU5FMiwKKwkJfSwKKwl9LAogCVtTQUE3MTM0X0JPQVJEX0FWQUNTU01BUlRUVl0gPSB7CiAJCS8qIFJvbWFuIFBzem9uY3plbmtvIDxyb21rYUBrb2xvcy5tYXRoLnVuaS5sb2R6LnBsPiAqLwogCQkubmFtZSAgICAgICAgICAgPSAiQVZBQ1MgU21hcnRUViIsCkBAIC0yNzU0LDYgKzI3OTAsMzUgQEAKIAkJCS5hbXV4ICAgPSBMSU5FMSwKIAkJfSwKIAl9LAorCVtTQUE3MTM0X0JPQVJEX0tXT1JMRF9EVkJUXzIxMF0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJLV29ybGQgRFZCLVQgMjEwIiwKKwkJLmF1ZGlvX2Nsb2NrICAgID0gMHgwMDE4N2RlNywKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfUEhJTElQU19UREE4MjkwLAorCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCisJCS5ncGlvbWFzayAgICAgICA9IDEgPDwgMjEsCisJCS5pbnB1dHMgPSB7eworCQkJLm5hbWUgICA9IG5hbWVfdHYsCisJCQkudm11eCAgID0gMSwKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS50diAgICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lICAgPSBuYW1lX2NvbXAxLAorCQkJLnZtdXggICA9IDMsCisJCQkuYW11eCAgID0gTElORTEsCisJCX0seworCQkJLm5hbWUgICA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggICA9IDgsCisJCQkuYW11eCAgID0gTElORTEsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkubmFtZSAgID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ICAgPSBUViwKKwkJCS5ncGlvICAgPSAweDAyMDAwMDAsCisJCX0sCisJfSwKIAlbU0FBNzEzNF9CT0FSRF9LV09STERfQVRTQzExMF0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJLd29ybGQgQVRTQzExMCIsCiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCkBAIC0zNDA3LDYgKzM0NzIsMzYgQEAKIAkJCS5ncGlvID0gMHgwMjAwMDAwLAogCQl9LAogCX0sCisJW1NBQTcxMzRfQk9BUkRfU0FCUkVOVF9UVl9QQ0IwNV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJTYWJyZW50IFBDTUNJQSBUVi1QQ0IwNSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5pbnB1dHMgICAgICAgICA9IHt7CisJCQkubmFtZSA9IG5hbWVfdHYsCisJCQkudm11eCA9IDEsCisJCQkuYW11eCA9IFRWLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMywKKwkJCS5hbXV4ID0gTElORTEsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX2NvbXAyLAorCQkJLnZtdXggPSAwLAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfc3ZpZGVvLAorCQkJLnZtdXggPSA4LAorCQkJLmFtdXggPSBMSU5FMSwKKwkJfX0sCisJCS5tdXRlID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IFRWLAorCQl9LAorCX0sCiB9OwogCiBjb25zdCB1bnNpZ25lZCBpbnQgc2FhNzEzNF9iY291bnQgPSBBUlJBWV9TSVpFKHNhYTcxMzRfYm9hcmRzKTsKQEAgLTM1MTUsNyArMzYxMCwxMyBAQAogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzMsCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDUxNjgsCS8qIEFuaW1hdGlvbiBUZWNobm9sb2dpZXMgKExpZmVWaWV3KSAqLwotCQkuc3ViZGV2aWNlICAgID0gMHgwMjE0LCAvKiBTdGFuZGFyZCBQQ0ksIExSMjE0V0YgKi8KKwkJLnN1YmRldmljZSAgICA9IDB4MDIxNCwgLyogU3RhbmRhcmQgUENJLCBMUjIxNCBSZXYgRSBhbmQgZWFybGllciAoU0FBNzEzNSkgKi8KKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVFZQTEFUSU5VTV9GTSwKKwl9LHsKKwkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHg1MTY4LAkvKiBBbmltYXRpb24gVGVjaG5vbG9naWVzIChMaWZlVmlldykgKi8KKwkJLnN1YmRldmljZSAgICA9IDB4NTIxNCwgLyogU3RhbmRhcmQgUENJLCBMUjIxNCBSZXYgRiBvbndhcmRzIChTQUE3MTMxKSAqLwogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9GTFlUVlBMQVRJTlVNX0ZNLAogCX0sewogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLApAQCAtMzY4OSw2ICszNzkwLDEyIEBACiAJCS5kcml2ZXJfZGF0YSAgPSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBfNENCNSwKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTM0LAorCQkuc3VidmVuZG9yICAgID0gMHgxMDE5LAorCQkuc3ViZGV2aWNlICAgID0gMHg0Y2I2LAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXzRDQjYsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywKIAkJLnN1YnZlbmRvciAgICA9IDB4MTJhYiwKIAkJLnN1YmRldmljZSAgICA9IDB4MDgwMCwKQEAgLTM5MTUsNiArNDAyMiwxMiBAQAogCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9URVZJT05fRFZCVF8yMjBSRiwKIAl9LHsKIAkJLnZlbmRvciAgICAgICA9IFBDSV9WRU5ET1JfSURfUEhJTElQUywKKwkJLmRldmljZSAgICAgICA9IFBDSV9ERVZJQ0VfSURfUEhJTElQU19TQUE3MTMzLAorCQkuc3VidmVuZG9yICAgID0gMHgxN2RlLAorCQkuc3ViZGV2aWNlICAgID0gMHg3MjUwLAorCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9LV09STERfRFZCVF8yMTAsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzMywgLyogU0FBNzEzNUhMICovCiAJCS5zdWJ2ZW5kb3IgICAgPSAweDE3ZGUsCiAJCS5zdWJkZXZpY2UgICAgPSAweDczNTAsCkBAIC00MTAwLDYgKzQyMTMsMTIgQEAKIAkJLnN1YmRldmljZSAgICA9IDB4NDg1NywKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMLAogCX0seworCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAorCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCisJCS5zdWJ2ZW5kb3IgICAgPSAweDA5MTksIC8qIFNpbm9WaWRlbyBQQ0kgMjMwOSBQcm90ZXVzICg3MTM0KSAqLworCQkuc3ViZGV2aWNlICAgID0gMHgyMDAzLCAvKiBPRU0gY2FyZGJ1cyAqLworCQkuZHJpdmVyX2RhdGEgID0gU0FBNzEzNF9CT0FSRF9TQUJSRU5UX1RWX1BDQjA1LAorCX0sewogCQkvKiAtLS0gYm9hcmRzIHdpdGhvdXQgZWVwcm9tICsgc3Vic3lzdGVtIElEIC0tLSAqLwogCQkudmVuZG9yICAgICAgID0gUENJX1ZFTkRPUl9JRF9QSElMSVBTLAogCQkuZGV2aWNlICAgICAgID0gUENJX0RFVklDRV9JRF9QSElMSVBTX1NBQTcxMzQsCkBAIC00MTc4LDYgKzQyOTcsNyBAQAogCWNhc2UgU0FBNzEzNF9CT0FSRF9DSU5FUkdZNjAwX01LMzoKIAljYXNlIFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUDoKIAljYXNlIFNBQTcxMzRfQk9BUkRfRUNTX1RWUDNYUF80Q0I1OgorCWNhc2UgU0FBNzEzNF9CT0FSRF9FQ1NfVFZQM1hQXzRDQjY6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX01EMjgxOToKIAljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX1ZTVFJFQU1fWFBFUlQ6CiAJY2FzZSBTQUE3MTM0X0JPQVJEX0tXT1JMRF9YUEVSVDoKQEAgLTQ0MjYsNiArNDU0Niw3IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1BJTk5BQ0xFX1BDVFZfMzEwaToKKwljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX0RWQlRfMjEwOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9URVZJT05fRFZCVF8yMjBSRjoKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9BU1VTVGVLX1A3MTMxX0hZQlJJRF9MTkE6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCmluZGV4IDY1YWVjODguLmUwZWVjODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCkBAIC04ODcsNiArODg3LDIwIEBACiAJLmFudGVubmFfc3dpdGNoPSAyLAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlCiB9Oworc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcga3dvcmxkX2R2Yl90XzIxMF9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAorCS5pbnZlcnQgICAgICAgID0gMSwKKwkuaW52ZXJ0X29jbGsgICA9IDAsCisJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKKwkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYLAorCS5ncGlvX2NvbmZpZyAgID0gVERBMTAwNDZfR1AxMV9JLAorCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCisJLmkyY19nYXRlICAgICAgPSAweDRiLAorCS50dW5lcl9hZGRyZXNzID0gMHg2MSwKKwkudHVuZXJfY29uZmlnICA9IDIsCisJLmFudGVubmFfc3dpdGNoPSAxLAorCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZGExMDA0eF9yZXF1ZXN0X2Zpcm13YXJlCit9OwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBzcGVjaWFsIGNhc2U6IHRoaXMgY2FyZCB1c2VzIHNhYTcxM3ggR1BJTzIyIGZvciB0aGUgbW9kZSBzd2l0Y2gKICAqLwpAQCAtMTAzOSw2ICsxMDUzLDkgQEAKIAkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RkYTY2NTFfcGxsX3NldDsKIAkJfQogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfS1dPUkxEX0RWQlRfMjEwOgorCQljb25maWd1cmVfdGRhODI3eF9mZShkZXYsICZrd29ybGRfZHZiX3RfMjEwX2NvbmZpZyk7CisJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9QSElMSVBTX1RJR0VSOgogCQljb25maWd1cmVfdGRhODI3eF9mZShkZXYsICZwaGlsaXBzX3RpZ2VyX2NvbmZpZyk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKaW5kZXggNjIyMjRjYy4uMTU2MjNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCkBAIC0yMzUsNiArMjM1LDkgQEAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfTTEwMgkgICAxMTAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BU1VTX1A3MTMxXzQ4NzEJICAgMTExCiAjZGVmaW5lIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9IWUJSSURfTE5BIDExMgorI2RlZmluZSBTQUE3MTM0X0JPQVJEX0VDU19UVlAzWFBfNENCNiAgMTEzCisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfS1dPUkxEX0RWQlRfMjEwIDExNAorI2RlZmluZSBTQUE3MTM0X0JPQVJEX1NBQlJFTlRfVFZfUENCMDUgICAgIDExNQogCiAjZGVmaW5lIFNBQTcxMzRfTUFYQk9BUkRTIDgKICNkZWZpbmUgU0FBNzEzNF9JTlBVVF9NQVggOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvS2NvbmZpZwppbmRleCAxOTIwNGY1Li5mNzFmMjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBVU0JfU045QzEwMgogCXRyaXN0YXRlICJVU0IgU045QzF4eCBQQyBDYW1lcmEgQ29udHJvbGxlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gU09OaVggU045QzEwMSwKIAkgIFNOOUMxMDIsIFNOOUMxMDMsIFNOOUMxMDUgYW5kIFNOOUMxMjAgUEMgQ2FtZXJhIENvbnRyb2xsZXJzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyLmgKaW5kZXggNjgwZTc0Ni4uMTFmY2I0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMi5oCkBAIC0xNDEsNyArMTQxLDcgQEAKIAogdm9pZAogc245YzEwMl9hdHRhY2hfc2Vuc29yKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAotCQkgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvcikKKwkJICAgICAgY29uc3Qgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IpCiB7CiAJbWVtY3B5KCZjYW0tPnNlbnNvciwgc2Vuc29yLCBzaXplb2Yoc3RydWN0IHNuOWMxMDJfc2Vuc29yKSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKaW5kZXggODlmODMzNS4uNzRhMjA0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwpAQCAtNDgsOCArNDgsOCBAQAogI2RlZmluZSBTTjlDMTAyX01PRFVMRV9BVVRIT1IgICAiKEMpIDIwMDQtMjAwNyBMdWNhIFJpc29saWEiCiAjZGVmaW5lIFNOOUMxMDJfQVVUSE9SX0VNQUlMICAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCiAjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX0xJQ0VOU0UgICJHUEwiCi0jZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04gICIxOjEuMzkiCi0jZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT05fQ09ERSAgS0VSTkVMX1ZFUlNJT04oMSwgMSwgMzkpCisjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04gICIxOjEuNDQiCisjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT05fQ09ERSAgS0VSTkVMX1ZFUlNJT04oMSwgMSwgNDQpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMjA5LDM4ICsyMDksNDEgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAvKgotICogV3JpdGUgYSBzZXF1ZW5jZSBvZiBjb3VudCB2YWx1ZS9yZWdpc3RlciBwYWlycy4gIFJldHVybnMgLTEgYWZ0ZXIgdGhlCi0gKiBmaXJzdCBmYWlsZWQgd3JpdGUsIG9yIDAgZm9yIG5vIGVycm9ycy4KLSAqLworICAgV3JpdGUgYSBzZXF1ZW5jZSBvZiBjb3VudCB2YWx1ZS9yZWdpc3RlciBwYWlycy4gUmV0dXJucyAtMSBhZnRlciB0aGUgZmlyc3QKKyAgIGZhaWxlZCB3cml0ZSwgb3IgMCBmb3Igbm8gZXJyb3JzLgorKi8KIGludCBzbjljMTAyX3dyaXRlX3JlZ3Moc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIGNvbnN0IHU4IHZhbHJlZ1tdWzJdLAogCQkgICAgICAgaW50IGNvdW50KQogewogCXN0cnVjdCB1c2JfZGV2aWNlKiB1ZGV2ID0gY2FtLT51c2JkZXY7Ci0JdTgqIHZhbHVlID0gY2FtLT5jb250cm9sX2J1ZmZlcjsgIC8qIE5lZWRlZCBmb3IgRE1BJ2FibGUgbWVtb3J5ICovCisJdTgqIGJ1ZmYgPSBjYW0tPmNvbnRyb2xfYnVmZmVyOwogCWludCBpLCByZXM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQl1OCBpbmRleCA9IHZhbHJlZ1tpXVsxXTsKIAogCQkvKgotCQkgKiBpbmRleCBpcyBhIHU4LCBzbyBpdCBtdXN0IGJlIDwyNTYgYW5kIGNhbid0IGJlIG91dCBvZiByYW5nZS4KLQkJICogSWYgd2UgcHV0IGluIGEgY2hlY2sgYW55d2F5LCBnY2MgYW5ub3lzIHVzIHdpdGggYSB3YXJuaW5nCi0JCSAqIHRoYXQgb3VyIGNoZWNrIGlzIHVzZWxlc3MuICBQZW9wbGUgZ2V0IGFsbCB1cHBpdHkgd2hlbiB0aGV5Ci0JCSAqIHNlZSB3YXJuaW5ncyBpbiB0aGUga2VybmVsIGNvbXBpbGUuCi0JCSAqLworCQkgICBpbmRleCBpcyBhIHU4LCBzbyBpdCBtdXN0IGJlIDwyNTYgYW5kIGNhbid0IGJlIG91dCBvZiByYW5nZS4KKwkJICAgSWYgd2UgcHV0IGluIGEgY2hlY2sgYW55d2F5LCBnY2MgYW5ub3lzIHVzIHdpdGggYSB3YXJuaW5nCisJCSAgIGhhdCBvdXIgY2hlY2sgaXMgdXNlbGVzcy4gUGVvcGxlIGdldCBhbGwgdXBwaXR5IHdoZW4gdGhleQorCQkgICBzZWUgd2FybmluZ3MgaW4gdGhlIGtlcm5lbCBjb21waWxlLgorCQkqLwogCi0JCSp2YWx1ZSA9IHZhbHJlZ1tpXVswXTsKLQkJcmVzID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCQkgICAgICAweDA4LCAweDQxLCBpbmRleCwgMCwKLQkJCQkgICAgICB2YWx1ZSwgMSwgU045QzEwMl9DVFJMX1RJTUVPVVQpOworCQkqYnVmZiA9IHZhbHJlZ1tpXVswXTsKKworCQlyZXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLCAweDA4LAorCQkJCSAgICAgIDB4NDEsIGluZGV4LCAwLCBidWZmLCAxLAorCQkJCSAgICAgIFNOOUMxMDJfQ1RSTF9USU1FT1VUKTsKKwogCQlpZiAocmVzIDwgMCkgewogCQkJREJHKDMsICJGYWlsZWQgdG8gd3JpdGUgYSByZWdpc3RlciAodmFsdWUgMHglMDJYLCAiCi0JCQkgICAgICAgImluZGV4IDB4JTAyWCwgZXJyb3IgJWQpIiwgKnZhbHVlLCBpbmRleCwgcmVzKTsKKwkJCSAgICAgICAiaW5kZXggMHglMDJYLCBlcnJvciAlZCkiLCAqYnVmZiwgaW5kZXgsIHJlcyk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAotCQljYW0tPnJlZ1tpbmRleF0gPSAqdmFsdWU7CisJCWNhbS0+cmVnW2luZGV4XSA9ICpidWZmOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjcyLDggKzI3NSw4IEBACiB9CiAKIAotLyogTk9URTogcmVhZGluZyBzb21lIHJlZ2lzdGVycyBhbHdheXMgcmV0dXJucyAwICovCi1zdGF0aWMgaW50IHNuOWMxMDJfcmVhZF9yZWcoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHUxNiBpbmRleCkKKy8qIE5PVEU6IHdpdGggdGhlIFNOOUMxMFsxMjNdIHJlYWRpbmcgc29tZSByZWdpc3RlcnMgYWx3YXlzIHJldHVybnMgMCAqLworaW50IHNuOWMxMDJfcmVhZF9yZWcoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHUxNiBpbmRleCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSogdWRldiA9IGNhbS0+dXNiZGV2OwogCXU4KiBidWZmID0gY2FtLT5jb250cm9sX2J1ZmZlcjsKQEAgLTI5OSw3ICszMDIsOCBAQAogCiAKIHN0YXRpYyBpbnQKLXNuOWMxMDJfaTJjX3dhaXQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yKQorc245YzEwMl9pMmNfd2FpdChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKKwkJIGNvbnN0IHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yKQogewogCWludCBpLCByOwogCkBAIC0zMjAsNyArMzI0LDcgQEAKIAogc3RhdGljIGludAogc245YzEwMl9pMmNfZGV0ZWN0X3JlYWRfZXJyb3Ioc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCi0JCQkgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvcikKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yKQogewogCWludCByICwgZXJyID0gMDsKIApAQCAtMzQyLDcgKzM0Niw3IEBACiAKIHN0YXRpYyBpbnQKIHNuOWMxMDJfaTJjX2RldGVjdF93cml0ZV9lcnJvcihzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKLQkJCSAgICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvcikKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvcikKIHsKIAlpbnQgcjsKIAlyID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDgpOwpAQCAtMzUyLDEyICszNTYsMTIgQEAKIAogaW50CiBzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCi0JCQkgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IsIHU4IGRhdGEwLCB1OCBkYXRhMSwKLQkJCSB1OCBuLCB1OCBidWZmZXJbXSkKKwkJCSBjb25zdCBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvciwgdTggZGF0YTAsCisJCQkgdTggZGF0YTEsIHU4IG4sIHU4IGJ1ZmZlcltdKQogewogCXN0cnVjdCB1c2JfZGV2aWNlKiB1ZGV2ID0gY2FtLT51c2JkZXY7CiAJdTgqIGRhdGEgPSBjYW0tPmNvbnRyb2xfYnVmZmVyOwotCWludCBlcnIgPSAwLCByZXM7CisJaW50IGkgPSAwLCBlcnIgPSAwLCByZXM7CiAKIAkvKiBXcml0ZSBjeWNsZSAqLwogCWRhdGFbMF0gPSAoKHNlbnNvci0+aW50ZXJmYWNlID09IFNOOUMxMDJfSTJDXzJXSVJFUykgPyAweDgwIDogMCkgfApAQCAtNDAyLDcgKzQwNiw4IEBACiAJfQogCiAJaWYgKGJ1ZmZlcikKLQkJbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc2l6ZW9mKGJ1ZmZlcikpOworCQlmb3IgKGkgPSAwOyBpIDwgbiAmJiBpIDwgNTsgaSsrKQorCQkJYnVmZmVyW24taS0xXSA9IGRhdGFbNC1pXTsKIAogCXJldHVybiAoaW50KWRhdGFbNF07CiB9CkBAIC00MTAsNyArNDE1LDcgQEAKIAogaW50CiBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLAotCQkJICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvciwgdTggbiwgdTggZGF0YTAsCisJCQkgIGNvbnN0IHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yLCB1OCBuLCB1OCBkYXRhMCwKIAkJCSAgdTggZGF0YTEsIHU4IGRhdGEyLCB1OCBkYXRhMywgdTggZGF0YTQsIHU4IGRhdGE1KQogewogCXN0cnVjdCB1c2JfZGV2aWNlKiB1ZGV2ID0gY2FtLT51c2JkZXY7CkBAIC00NDksNyArNDU0LDcgQEAKIAogaW50CiBzbjljMTAyX2kyY190cnlfcmVhZChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqIGNhbSwKLQkJICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvciwgdTggYWRkcmVzcykKKwkJICAgICBjb25zdCBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvciwgdTggYWRkcmVzcykKIHsKIAlyZXR1cm4gc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgc2Vuc29yLCBzZW5zb3ItPmkyY19zbGF2ZV9pZCwKIAkJCQkJYWRkcmVzcywgMSwgTlVMTCk7CkBAIC00NTgsNyArNDYzLDcgQEAKIAogaW50CiBzbjljMTAyX2kyY190cnlfd3JpdGUoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCi0JCSAgICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yLCB1OCBhZGRyZXNzLCB1OCB2YWx1ZSkKKwkJICAgICAgY29uc3Qgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IsIHU4IGFkZHJlc3MsIHU4IHZhbHVlKQogewogCXJldHVybiBzbjljMTAyX2kyY190cnlfcmF3X3dyaXRlKGNhbSwgc2Vuc29yLCAzLAogCQkJCQkgc2Vuc29yLT5pMmNfc2xhdmVfaWQsIGFkZHJlc3MsCkBAIC02NTcsMTYgKzY2Miw2IEBACiB9CiAKIAotc3RhdGljIHZvaWQKLXNuOWMxMDJfd3JpdGVfZW9pbWFya2VyKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtLCBzdHJ1Y3Qgc245YzEwMl9mcmFtZV90KiBmKQotewotCXN0YXRpYyBjb25zdCB1OCBlb2lfbWFya2VyWzJdID0gezB4ZmYsIDB4ZDl9OwotCi0JbWVtY3B5KGYtPmJ1Zm1lbSArIGYtPmJ1Zi5ieXRlc3VzZWQsIGVvaV9tYXJrZXIsIHNpemVvZihlb2lfbWFya2VyKSk7Ci0JZi0+YnVmLmJ5dGVzdXNlZCArPSBzaXplb2YoZW9pX21hcmtlcik7Ci19Ci0KLQogc3RhdGljIHZvaWQgc245YzEwMl91cmJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtID0gdXJiLT5jb250ZXh0OwpAQCAtMzE4MSwxNCArMzE3NiwxNCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbjljMTAyX2ZvcHMgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSAgICBzbjljMTAyX29wZW4sCisJLm9wZW4gPSBzbjljMTAyX29wZW4sCiAJLnJlbGVhc2UgPSBzbjljMTAyX3JlbGVhc2UsCi0JLmlvY3RsID0gICBzbjljMTAyX2lvY3RsLAorCS5pb2N0bCA9IHNuOWMxMDJfaW9jdGwsCiAJLmNvbXBhdF9pb2N0bCA9IHY0bF9jb21wYXRfaW9jdGwzMiwKLQkucmVhZCA9ICAgIHNuOWMxMDJfcmVhZCwKLQkucG9sbCA9ICAgIHNuOWMxMDJfcG9sbCwKLQkubW1hcCA9ICAgIHNuOWMxMDJfbW1hcCwKLQkubGxzZWVrID0gIG5vX2xsc2VlaywKKwkucmVhZCA9IHNuOWMxMDJfcmVhZCwKKwkucG9sbCA9IHNuOWMxMDJfcG9sbCwKKwkubW1hcCA9IHNuOWMxMDJfbW1hcCwKKwkubGxzZWVrID0gbm9fbGxzZWVrLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzI1MSw3ICszMjQ2LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JZm9yICAoaSA9IDA7IHNuOWMxMDJfc2Vuc29yX3RhYmxlW2ldOyBpKyspIHsKKwlmb3IgIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc245YzEwMl9zZW5zb3JfdGFibGUpOyBpKyspIHsKIAkJZXJyID0gc245YzEwMl9zZW5zb3JfdGFibGVbaV0oY2FtKTsKIAkJaWYgKCFlcnIpCiAJCQlicmVhazsKQEAgLTMyNjIsNyArMzI1Nyw3IEBACiAJCURCRygzLCAiU3VwcG9ydCBmb3IgJXMgbWFpbnRhaW5lZCBieSAlcyIsCiAJCSAgICBjYW0tPnNlbnNvci5uYW1lLCBjYW0tPnNlbnNvci5tYWludGFpbmVyKTsKIAl9IGVsc2UgewotCQlEQkcoMSwgIk5vIHN1cHBvcnRlZCBpbWFnZSBzZW5zb3IgZGV0ZWN0ZWQiKTsKKwkJREJHKDEsICJObyBzdXBwb3J0ZWQgaW1hZ2Ugc2Vuc29yIGRldGVjdGVkIGZvciB0aGlzIGJyaWRnZSIpOwogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGZhaWw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfZGV2dGFibGUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2RldnRhYmxlLmgKaW5kZXggZjQ5YmQ4Yy4uOTE2MDU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfZGV2dGFibGUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9kZXZ0YWJsZS5oCkBAIC04Niw2ICs4Niw4IEBACiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYwYmMsIEJSSURHRV9TTjlDMTAzKSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjBiZSwgQlJJREdFX1NOOUMxMDMpLCB9LAogCS8qIFNOOUMxMDUgKi8KKwl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDA0NWUsIDB4MDBmNSwgQlJJREdFX1NOOUMxMDUpLCB9LAorCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MDQ1ZSwgMHgwMGY3LCBCUklER0VfU045QzEwNSksIH0sCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMjcsIEJSSURHRV9TTjlDMTA1KSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDA0NzEsIDB4MDMyOCwgQlJJREdFX1NOOUMxMDUpLCB9LAogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MGMwLCBCUklER0VfU045QzEwNSksIH0sCkBAIC0xMDAsNiArMTAyLDcgQEAKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjBmYywgQlJJREdFX1NOOUMxMDUpLCB9LAogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MGZlLCBCUklER0VfU045QzEwNSksIH0sCiAJLyogU045QzEyMCAqLworCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MDQ1OCwgMHg3MDI1LCBCUklER0VfU045QzEyMCksIH0sCiAJeyBTTjlDMTAyX1VTQl9ERVZJQ0UoMHgwYzQ1LCAweDYxMDIsIEJSSURHRV9TTjlDMTIwKSwgfSwKIAl7IFNOOUMxMDJfVVNCX0RFVklDRSgweDBjNDUsIDB4NjEwOCwgQlJJREdFX1NOOUMxMjApLCB9LAogCXsgU045QzEwMl9VU0JfREVWSUNFKDB4MGM0NSwgMHg2MTBmLCBCUklER0VfU045QzEyMCksIH0sCkBAIC0xNDgsNyArMTUxLDYgQEAKIAkmc245YzEwMl9wcm9iZV90YXM1MTEwYzFiLCAvKiBkZXRlY3Rpb24gYmFzZWQgb24gVVNCIHBpZC92aWQgKi8KIAkmc245YzEwMl9wcm9iZV90YXM1MTEwZCwgLyogZGV0ZWN0aW9uIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovCiAJJnNuOWMxMDJfcHJvYmVfdGFzNTEzMGQxYiwgLyogZGV0ZWN0aW9uIGJhc2VkIG9uIFVTQiBwaWQvdmlkICovCi0JTlVMTCwKIH07CiAKICNlbmRpZiAvKiBfU045QzEwMl9ERVZUQUJMRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfaHY3MTMxZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfaHY3MTMxZC5jCmluZGV4IDI4YTg2MWEuLmVhZjlhZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2h2NzEzMWQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9odjcxMzFkLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgaHY3MTMxZCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgaHY3MTMxZCA9IHsKIAkubmFtZSA9ICJIVjcxMzFEIiwKIAkubWFpbnRhaW5lciA9ICJMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+IiwKIAkuc3VwcG9ydGVkX2JyaWRnZSA9IEJSSURHRV9TTjlDMTAxIHwgQlJJREdFX1NOOUMxMDIsCkBAIC0yNDgsMTIgKzI0OCwxMCBAQAogCiAJZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDEsIDB4MDF9LCB7MHgwMCwgMHgwMX0sCiAJCQkJICAgICAgIHsweDI4LCAweDE3fSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIC1FSU87CiAKIAlyMCA9IHNuOWMxMDJfaTJjX3RyeV9yZWFkKGNhbSwgJmh2NzEzMWQsIDB4MDApOwogCXIxID0gc245YzEwMl9pMmNfdHJ5X3JlYWQoY2FtLCAmaHY3MTMxZCwgMHgwMSk7Ci0JaWYgKHIwIDwgMCB8fCByMSA8IDApCisJaWYgKGVyciB8fCByMCA8IDAgfHwgcjEgPCAwKQogCQlyZXR1cm4gLUVJTzsKIAogCWlmIChyMCAhPSAweDAwIHx8IHIxICE9IDB4MDQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9odjcxMzFyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9odjcxMzFyLmMKaW5kZXggNWE0OTViYS4uMGZjNDAxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfaHY3MTMxci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2h2NzEzMXIuYwpAQCAtNDQsNyArNDQsNiBAQAogCQkJCQkgICAgICAgezB4YjAsIDB4MmJ9LCB7MHhjMCwgMHgyY30sCiAJCQkJCSAgICAgICB7MHhkMCwgMHgyZH0sIHsweGUwLCAweDJlfSwKIAkJCQkJICAgICAgIHsweGYwLCAweDJmfSwgezB4ZmYsIDB4MzB9KTsKLQogCQlicmVhazsKIAljYXNlIEJSSURHRV9TTjlDMTA1OgogCWNhc2UgQlJJREdFX1NOOUMxMjA6CkBAIC0yNTQsNyArMjUzLDcgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIGh2NzEzMXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuOWMxMDJfc2Vuc29yIGh2NzEzMXIgPSB7CiAJLm5hbWUgPSAiSFY3MTMxUiIsCiAJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCiAJLnN1cHBvcnRlZF9icmlkZ2UgPSBCUklER0VfU045QzEwMyB8IEJSSURHRV9TTjlDMTA1IHwgQlJJREdFX1NOOUMxMjAsCkBAIC0zNTAsMTEgKzM0OSw4IEBACiAJCQkJICAgICAgIHsweDM0LCAweDAxfSwgezB4MjAsIDB4MTd9LAogCQkJCSAgICAgICB7MHgzNCwgMHgwMX0sIHsweDQ2LCAweDAxfSk7CiAKLQlpZiAoZXJyKQotCQlyZXR1cm4gLUVJTzsKLQogCWRldmlkID0gc245YzEwMl9pMmNfdHJ5X3JlYWQoY2FtLCAmaHY3MTMxciwgMHgwMCk7Ci0JaWYgKGRldmlkIDwgMCkKKwlpZiAoZXJyIHx8IGRldmlkIDwgMCkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoZGV2aWQgIT0gMHgwMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM0My5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfbWkwMzQzLmMKaW5kZXggOTIwMDg0NS4uMDBiMTM0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfbWkwMzQzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfbWkwMzQzLmMKQEAgLTU1LDQ1ICs1NSw0NSBAQAogCQkJICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKIHsKIAlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBzbjljMTAyX2dldF9zZW5zb3IoY2FtKTsKLQl1OCBkYXRhWzUrMV07CisJdTggZGF0YVsyXTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDA5LAotCQkJCQkgICAgIDIrMSwgZGF0YSkgPCAwKQorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDA5LCAyLAorCQkJCQkgICAgIGRhdGEpIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9IGRhdGFbMl07CisJCWN0cmwtPnZhbHVlID0gZGF0YVswXTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDM1LAotCQkJCQkgICAgIDIrMSwgZGF0YSkgPCAwKQorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDM1LCAyLAorCQkJCQkgICAgIGRhdGEpIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDIwLAotCQkJCQkgICAgIDIrMSwgZGF0YSkgPCAwKQorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDIwLCAyLAorCQkJCQkgICAgIGRhdGEpIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9IGRhdGFbM10gJiAweDIwID8gMSA6IDA7CisJCWN0cmwtPnZhbHVlID0gZGF0YVsxXSAmIDB4MjAgPyAxIDogMDsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyMCwKLQkJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyMCwgMiwKKwkJCQkJICAgICBkYXRhKSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSBkYXRhWzNdICYgMHg4MCA/IDEgOiAwOworCQljdHJsLT52YWx1ZSA9IGRhdGFbMV0gJiAweDgwID8gMSA6IDA7CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzLCBzLT5pMmNfc2xhdmVfaWQsIDB4MmQsCi0JCQkJCSAgICAgMisxLCBkYXRhKSA8IDApCisJCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzLCBzLT5pMmNfc2xhdmVfaWQsIDB4MmQsIDIsCisJCQkJCSAgICAgZGF0YSkgPCAwKQogCQkJcmV0dXJuIC1FSU87CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgotCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDJjLAotCQkJCQkgICAgIDIrMSwgZGF0YSkgPCAwKQorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDJjLCAyLAorCQkJCQkgICAgIGRhdGEpIDwgMCkKIAkJCXJldHVybiAtRUlPOwogCQlicmVhazsKIAljYXNlIFNOOUMxMDJfVjRMMl9DSURfR1JFRU5fQkFMQU5DRToKLQkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyZSwKLQkJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyZSwgMiwKKwkJCQkJICAgICBkYXRhKSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTEwNSw3ICsxMDUsNyBAQAogCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CiAJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6Ci0JCWN0cmwtPnZhbHVlID0gZGF0YVszXSB8IChkYXRhWzJdIDw8IDgpOworCQljdHJsLT52YWx1ZSA9IGRhdGFbMV0gfCAoZGF0YVswXSA8PCA4KTsKIAkJaWYgKGN0cmwtPnZhbHVlID49IDB4MTAgJiYgY3RybC0+dmFsdWUgPD0gMHgzZikKIAkJCWN0cmwtPnZhbHVlIC09IDB4MTA7CiAJCWVsc2UgaWYgKGN0cmwtPnZhbHVlID49IDB4NjAgJiYgY3RybC0+dmFsdWUgPD0gMHg3ZikKQEAgLTIyMyw3ICsyMjMsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgbWkwMzQzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbjljMTAyX3NlbnNvciBtaTAzNDMgPSB7CiAJLm5hbWUgPSAiTUktMDM0MyIsCiAJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCiAJLnN1cHBvcnRlZF9icmlkZ2UgPSBCUklER0VfU045QzEwMSB8IEJSSURHRV9TTjlDMTAyLApAQCAtMzMyLDIwICszMzIsMTcgQEAKIAogaW50IHNuOWMxMDJfcHJvYmVfbWkwMzQzKHN0cnVjdCBzbjljMTAyX2RldmljZSogY2FtKQogewotCXU4IGRhdGFbNSsxXTsKLQlpbnQgZXJyID0gMDsKKwl1OCBkYXRhWzJdOwogCi0JZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDEsIDB4MDF9LCB7MHgwMCwgMHgwMX0sCi0JCQkJICAgICAgIHsweDI4LCAweDE3fSk7Ci0KLQlpZiAoZXJyKQorCWlmIChzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMSwgMHgwMX0sIHsweDAwLCAweDAxfSwKKwkJCQkgICAgIHsweDI4LCAweDE3fSkpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNDMsIG1pMDM0My5pMmNfc2xhdmVfaWQsIDB4MDAsCiAJCQkJICAgICAyLCBkYXRhKSA8IDApCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKGRhdGFbNF0gIT0gMHgzMiB8fCBkYXRhWzNdICE9IDB4ZTMpCisJaWYgKGRhdGFbMV0gIT0gMHg0MiB8fCBkYXRhWzBdICE9IDB4ZTMpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc245YzEwMl9hdHRhY2hfc2Vuc29yKGNhbSwgJm1pMDM0Myk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9taTAzNjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM2MC5jCmluZGV4IDY0Njk4YWMuLmY4ZDgxZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM2MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX21pMDM2MC5jCkBAIC0yNywyMCArMjcsMTA1IEBACiAJc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzID0gc245YzEwMl9nZXRfc2Vuc29yKGNhbSk7CiAJaW50IGVyciA9IDA7CiAKLQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMCwgMHgxMH0sIHsweDAwLCAweDExfSwKLQkJCQkgICAgICAgezB4MGEsIDB4MTR9LCB7MHg0MCwgMHgwMX0sCi0JCQkJICAgICAgIHsweDIwLCAweDE3fSwgezB4MDcsIDB4MTh9LAotCQkJCSAgICAgICB7MHhhMCwgMHgxOX0sIHsweDAyLCAweDFjfSwKLQkJCQkgICAgICAgezB4MDMsIDB4MWR9LCB7MHgwZiwgMHgxZX0sCi0JCQkJICAgICAgIHsweDBjLCAweDFmfSwgezB4MDAsIDB4MjB9LAotCQkJCSAgICAgICB7MHgxMCwgMHgyMX0sIHsweDIwLCAweDIyfSwKLQkJCQkgICAgICAgezB4MzAsIDB4MjN9LCB7MHg0MCwgMHgyNH0sCi0JCQkJICAgICAgIHsweDUwLCAweDI1fSwgezB4NjAsIDB4MjZ9LAotCQkJCSAgICAgICB7MHg3MCwgMHgyN30sIHsweDgwLCAweDI4fSwKLQkJCQkgICAgICAgezB4OTAsIDB4Mjl9LCB7MHhhMCwgMHgyYX0sCi0JCQkJICAgICAgIHsweGIwLCAweDJifSwgezB4YzAsIDB4MmN9LAotCQkJCSAgICAgICB7MHhkMCwgMHgyZH0sIHsweGUwLCAweDJlfSwKLQkJCQkgICAgICAgezB4ZjAsIDB4MmZ9LCB7MHhmZiwgMHgzMH0pOworCXN3aXRjaCAoc245YzEwMl9nZXRfYnJpZGdlKGNhbSkpIHsKKwljYXNlIEJSSURHRV9TTjlDMTAzOgorCQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMCwgMHgxMH0sIHsweDAwLCAweDExfSwKKwkJCQkJICAgICAgIHsweDBhLCAweDE0fSwgezB4NDAsIDB4MDF9LAorCQkJCQkgICAgICAgezB4MjAsIDB4MTd9LCB7MHgwNywgMHgxOH0sCisJCQkJCSAgICAgICB7MHhhMCwgMHgxOX0sIHsweDAyLCAweDFjfSwKKwkJCQkJICAgICAgIHsweDAzLCAweDFkfSwgezB4MGYsIDB4MWV9LAorCQkJCQkgICAgICAgezB4MGMsIDB4MWZ9LCB7MHgwMCwgMHgyMH0sCisJCQkJCSAgICAgICB7MHgxMCwgMHgyMX0sIHsweDIwLCAweDIyfSwKKwkJCQkJICAgICAgIHsweDMwLCAweDIzfSwgezB4NDAsIDB4MjR9LAorCQkJCQkgICAgICAgezB4NTAsIDB4MjV9LCB7MHg2MCwgMHgyNn0sCisJCQkJCSAgICAgICB7MHg3MCwgMHgyN30sIHsweDgwLCAweDI4fSwKKwkJCQkJICAgICAgIHsweDkwLCAweDI5fSwgezB4YTAsIDB4MmF9LAorCQkJCQkgICAgICAgezB4YjAsIDB4MmJ9LCB7MHhjMCwgMHgyY30sCisJCQkJCSAgICAgICB7MHhkMCwgMHgyZH0sIHsweGUwLCAweDJlfSwKKwkJCQkJICAgICAgIHsweGYwLCAweDJmfSwgezB4ZmYsIDB4MzB9KTsKKwkJYnJlYWs7CisJY2FzZSBCUklER0VfU045QzEwNToKKwljYXNlIEJSSURHRV9TTjlDMTIwOgorCQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHg0NCwgMHgwMX0sIHsweDQwLCAweDAyfSwKKwkJCQkJICAgICAgIHsweDAwLCAweDAzfSwgezB4MWEsIDB4MDR9LAorCQkJCQkgICAgICAgezB4NTAsIDB4MDV9LCB7MHgyMCwgMHgwNn0sCisJCQkJCSAgICAgICB7MHgxMCwgMHgwN30sIHsweDAzLCAweDEwfSwKKwkJCQkJICAgICAgIHsweDA4LCAweDE0fSwgezB4YTIsIDB4MTd9LAorCQkJCQkgICAgICAgezB4NDcsIDB4MTh9LCB7MHgwMCwgMHgxOX0sCisJCQkJCSAgICAgICB7MHgxZCwgMHgxYX0sIHsweDEwLCAweDFifSwKKwkJCQkJICAgICAgIHsweDAyLCAweDFjfSwgezB4MDMsIDB4MWR9LAorCQkJCQkgICAgICAgezB4MGYsIDB4MWV9LCB7MHgwYywgMHgxZn0sCisJCQkJCSAgICAgICB7MHgwMCwgMHgyMH0sIHsweDI5LCAweDIxfSwKKwkJCQkJICAgICAgIHsweDQwLCAweDIyfSwgezB4NTQsIDB4MjN9LAorCQkJCQkgICAgICAgezB4NjYsIDB4MjR9LCB7MHg3NiwgMHgyNX0sCisJCQkJCSAgICAgICB7MHg4NSwgMHgyNn0sIHsweDk0LCAweDI3fSwKKwkJCQkJICAgICAgIHsweGExLCAweDI4fSwgezB4YWUsIDB4Mjl9LAorCQkJCQkgICAgICAgezB4YmIsIDB4MmF9LCB7MHhjNywgMHgyYn0sCisJCQkJCSAgICAgICB7MHhkMywgMHgyY30sIHsweGRlLCAweDJkfSwKKwkJCQkJICAgICAgIHsweGVhLCAweDJlfSwgezB4ZjQsIDB4MmZ9LAorCQkJCQkgICAgICAgezB4ZmYsIDB4MzB9LCB7MHgwMCwgMHgzRn0sCisJCQkJCSAgICAgICB7MHhDNywgMHg0MH0sIHsweDAxLCAweDQxfSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDQyfSwgezB4MDAsIDB4NDN9LAorCQkJCQkgICAgICAgezB4NDQsIDB4NDR9LCB7MHgwMCwgMHg0NX0sCisJCQkJCSAgICAgICB7MHg0NCwgMHg0Nn0sIHsweDAwLCAweDQ3fSwKKwkJCQkJICAgICAgIHsweEM3LCAweDQ4fSwgezB4MDEsIDB4NDl9LAorCQkJCQkgICAgICAgezB4QzcsIDB4NEF9LCB7MHgwMSwgMHg0Qn0sCisJCQkJCSAgICAgICB7MHhDNywgMHg0Q30sIHsweDAxLCAweDREfSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDRFfSwgezB4MDAsIDB4NEZ9LAorCQkJCQkgICAgICAgezB4NDQsIDB4NTB9LCB7MHgwMCwgMHg1MX0sCisJCQkJCSAgICAgICB7MHg0NCwgMHg1Mn0sIHsweDAwLCAweDUzfSwKKwkJCQkJICAgICAgIHsweEM3LCAweDU0fSwgezB4MDEsIDB4NTV9LAorCQkJCQkgICAgICAgezB4QzcsIDB4NTZ9LCB7MHgwMSwgMHg1N30sCisJCQkJCSAgICAgICB7MHhDNywgMHg1OH0sIHsweDAxLCAweDU5fSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDVBfSwgezB4MDAsIDB4NUJ9LAorCQkJCQkgICAgICAgezB4NDQsIDB4NUN9LCB7MHgwMCwgMHg1RH0sCisJCQkJCSAgICAgICB7MHg0NCwgMHg1RX0sIHsweDAwLCAweDVGfSwKKwkJCQkJICAgICAgIHsweEM3LCAweDYwfSwgezB4MDEsIDB4NjF9LAorCQkJCQkgICAgICAgezB4QzcsIDB4NjJ9LCB7MHgwMSwgMHg2M30sCisJCQkJCSAgICAgICB7MHhDNywgMHg2NH0sIHsweDAxLCAweDY1fSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDY2fSwgezB4MDAsIDB4Njd9LAorCQkJCQkgICAgICAgezB4NDQsIDB4Njh9LCB7MHgwMCwgMHg2OX0sCisJCQkJCSAgICAgICB7MHg0NCwgMHg2QX0sIHsweDAwLCAweDZCfSwKKwkJCQkJICAgICAgIHsweEM3LCAweDZDfSwgezB4MDEsIDB4NkR9LAorCQkJCQkgICAgICAgezB4QzcsIDB4NkV9LCB7MHgwMSwgMHg2Rn0sCisJCQkJCSAgICAgICB7MHhDNywgMHg3MH0sIHsweDAxLCAweDcxfSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDcyfSwgezB4MDAsIDB4NzN9LAorCQkJCQkgICAgICAgezB4NDQsIDB4NzR9LCB7MHgwMCwgMHg3NX0sCisJCQkJCSAgICAgICB7MHg0NCwgMHg3Nn0sIHsweDAwLCAweDc3fSwKKwkJCQkJICAgICAgIHsweEM3LCAweDc4fSwgezB4MDEsIDB4Nzl9LAorCQkJCQkgICAgICAgezB4QzcsIDB4N0F9LCB7MHgwMSwgMHg3Qn0sCisJCQkJCSAgICAgICB7MHhDNywgMHg3Q30sIHsweDAxLCAweDdEfSwKKwkJCQkJICAgICAgIHsweDQ0LCAweDdFfSwgezB4MDAsIDB4N0Z9LAorCQkJCQkgICAgICAgezB4MTQsIDB4ODR9LCB7MHgwMCwgMHg4NX0sCisJCQkJCSAgICAgICB7MHgyNywgMHg4Nn0sIHsweDAwLCAweDg3fSwKKwkJCQkJICAgICAgIHsweDA3LCAweDg4fSwgezB4MDAsIDB4ODl9LAorCQkJCQkgICAgICAgezB4RUMsIDB4OEF9LCB7MHgwZiwgMHg4Qn0sCisJCQkJCSAgICAgICB7MHhEOCwgMHg4Q30sIHsweDBmLCAweDhEfSwKKwkJCQkJICAgICAgIHsweDNELCAweDhFfSwgezB4MDAsIDB4OEZ9LAorCQkJCQkgICAgICAgezB4M0QsIDB4OTB9LCB7MHgwMCwgMHg5MX0sCisJCQkJCSAgICAgICB7MHhDRCwgMHg5Mn0sIHsweDBmLCAweDkzfSwKKwkJCQkJICAgICAgIHsweGY3LCAweDk0fSwgezB4MGYsIDB4OTV9LAorCQkJCQkgICAgICAgezB4MEMsIDB4OTZ9LCB7MHgwMCwgMHg5N30sCisJCQkJCSAgICAgICB7MHgwMCwgMHg5OH0sIHsweDY2LCAweDk5fSwKKwkJCQkJICAgICAgIHsweDA1LCAweDlBfSwgezB4MDAsIDB4OUJ9LAorCQkJCQkgICAgICAgezB4MDQsIDB4OUN9LCB7MHgwMCwgMHg5RH0sCisJCQkJCSAgICAgICB7MHgwOCwgMHg5RX0sIHsweDAwLCAweDlGfSwKKwkJCQkJICAgICAgIHsweDJELCAweEMwfSwgezB4MkQsIDB4QzF9LAorCQkJCQkgICAgICAgezB4M0EsIDB4QzJ9LCB7MHgwNSwgMHhDM30sCisJCQkJCSAgICAgICB7MHgwNCwgMHhDNH0sIHsweDNGLCAweEM1fSwKKwkJCQkJICAgICAgIHsweDAwLCAweEM2fSwgezB4MDAsIDB4Qzd9LAorCQkJCQkgICAgICAgezB4NTAsIDB4Qzh9LCB7MHgzQywgMHhDOX0sCisJCQkJCSAgICAgICB7MHgyOCwgMHhDQX0sIHsweEQ4LCAweENCfSwKKwkJCQkJICAgICAgIHsweDE0LCAweENDfSwgezB4RUMsIDB4Q0R9LAorCQkJCQkgICAgICAgezB4MzIsIDB4Q0V9LCB7MHhERCwgMHhDRn0sCisJCQkJCSAgICAgICB7MHgzMiwgMHhEMH0sIHsweERELCAweEQxfSwKKwkJCQkJICAgICAgIHsweDZBLCAweEQyfSwgezB4NTAsIDB4RDN9LAorCQkJCQkgICAgICAgezB4MDAsIDB4RDR9LCB7MHgwMCwgMHhENX0sCisJCQkJCSAgICAgICB7MHgwMCwgMHhENn0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIAllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwgMHgwZCwKIAkJCQkJIDB4MDAsIDB4MDEsIDAsIDApOwpAQCAtNjUsNTAgKzE1MCw1MCBAQAogCQkJICAgc3RydWN0IHY0bDJfY29udHJvbCogY3RybCkKIHsKIAlzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHMgPSBzbjljMTAyX2dldF9zZW5zb3IoY2FtKTsKLQl1OCBkYXRhWzUrMV07CisJdTggZGF0YVsyXTsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDA5LAotCQkJCQkgICAgIDIrMSwgZGF0YSkgPCAwKQorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDA5LCAyLAorCQkJCQkgICAgIGRhdGEpIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9IGRhdGFbMl07CisJCWN0cmwtPnZhbHVlID0gZGF0YVswXTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDM1LAotCQkJCQkgICAgIDIrMSwgZGF0YSkgPCAwKQorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDM1LCAyLAorCQkJCQkgICAgIGRhdGEpIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9IGRhdGFbM107CisJCWN0cmwtPnZhbHVlID0gZGF0YVsxXTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyYywKLQkJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyYywgMiwKKwkJCQkJICAgICBkYXRhKSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSBkYXRhWzNdOworCQljdHJsLT52YWx1ZSA9IGRhdGFbMV07CiAJCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgotCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDJkLAotCQkJCQkgICAgIDIrMSwgZGF0YSkgPCAwKQorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDJkLCAyLAorCQkJCQkgICAgIGRhdGEpIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9IGRhdGFbM107CisJCWN0cmwtPnZhbHVlID0gZGF0YVsxXTsKIAkJcmV0dXJuIDA7CiAJY2FzZSBTTjlDMTAyX1Y0TDJfQ0lEX0dSRUVOX0JBTEFOQ0U6Ci0JCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzLCBzLT5pMmNfc2xhdmVfaWQsIDB4MmUsCi0JCQkJCSAgICAgMisxLCBkYXRhKSA8IDApCisJCWlmIChzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoY2FtLCBzLCBzLT5pMmNfc2xhdmVfaWQsIDB4MmUsIDIsCisJCQkJCSAgICAgZGF0YSkgPCAwKQogCQkJcmV0dXJuIC1FSU87Ci0JCWN0cmwtPnZhbHVlID0gZGF0YVszXTsKKwkJY3RybC0+dmFsdWUgPSBkYXRhWzFdOwogCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX0hGTElQOgotCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDIwLAotCQkJCQkgICAgIDIrMSwgZGF0YSkgPCAwKQorCQlpZiAoc245YzEwMl9pMmNfdHJ5X3Jhd19yZWFkKGNhbSwgcywgcy0+aTJjX3NsYXZlX2lkLCAweDIwLCAyLAorCQkJCQkgICAgIGRhdGEpIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSA9IGRhdGFbM10gJiAweDIwID8gMSA6IDA7CisJCWN0cmwtPnZhbHVlID0gZGF0YVsxXSAmIDB4MjAgPyAxIDogMDsKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKLQkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyMCwKLQkJCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKKwkJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sIHMsIHMtPmkyY19zbGF2ZV9pZCwgMHgyMCwgMiwKKwkJCQkJICAgICBkYXRhKSA8IDApCiAJCQlyZXR1cm4gLUVJTzsKLQkJY3RybC0+dmFsdWUgPSBkYXRhWzNdICYgMHg4MCA/IDEgOiAwOworCQljdHJsLT52YWx1ZSA9IGRhdGFbMV0gJiAweDgwID8gMSA6IDA7CiAJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTc4LDggKzI2MywxOSBAQAogewogCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9IHNuOWMxMDJfZ2V0X3NlbnNvcihjYW0pOwogCWludCBlcnIgPSAwOwotCXU4IGhfc3RhcnQgPSAodTgpKHJlY3QtPmxlZnQgLSBzLT5jcm9wY2FwLmJvdW5kcy5sZWZ0KSArIDAsCi0JICAgdl9zdGFydCA9ICh1OCkocmVjdC0+dG9wIC0gcy0+Y3JvcGNhcC5ib3VuZHMudG9wKSArIDE7CisJdTggaF9zdGFydCA9IDAsIHZfc3RhcnQgPSAodTgpKHJlY3QtPnRvcCAtIHMtPmNyb3BjYXAuYm91bmRzLnRvcCkgKyAxOworCisJc3dpdGNoIChzbjljMTAyX2dldF9icmlkZ2UoY2FtKSkgeworCWNhc2UgQlJJREdFX1NOOUMxMDM6CisJCWhfc3RhcnQgPSAodTgpKHJlY3QtPmxlZnQgLSBzLT5jcm9wY2FwLmJvdW5kcy5sZWZ0KSArIDA7CisJCWJyZWFrOworCWNhc2UgQlJJREdFX1NOOUMxMDU6CisJY2FzZSBCUklER0VfU045QzEyMDoKKwkJaF9zdGFydCA9ICh1OCkocmVjdC0+bGVmdCAtIHMtPmNyb3BjYXAuYm91bmRzLmxlZnQpICsgMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCiAJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgaF9zdGFydCwgMHgxMik7CiAJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgdl9zdGFydCwgMHgxMyk7CkBAIC0xOTQsMjQgKzI5MCwzMCBAQAogCXN0cnVjdCBzbjljMTAyX3NlbnNvciogcyA9IHNuOWMxMDJfZ2V0X3NlbnNvcihjYW0pOwogCWludCBlcnIgPSAwOwogCi0JaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NOOUMxMFgpIHsKLQkJZXJyICs9IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoY2FtLCBzLCA0LCBzLT5pMmNfc2xhdmVfaWQsCi0JCQkJCQkgMHgwYSwgMHgwMCwgMHgwMiwgMCwgMCk7Ci0JCWVyciArPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MjAsIDB4MTkpOwotCX0gZWxzZSB7CisJaWYgKHBpeC0+cGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1NCR0dSOCkgewogCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwKIAkJCQkJCSAweDBhLCAweDAwLCAweDA1LCAwLCAwKTsKIAkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHg2MCwgMHgxOSk7CisJCWlmIChzbjljMTAyX2dldF9icmlkZ2UoY2FtKSA9PSBCUklER0VfU045QzEwNSB8fAorCQkgICAgc245YzEwMl9nZXRfYnJpZGdlKGNhbSkgPT0gQlJJREdFX1NOOUMxMjApCisJCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGE2LCAweDE3KTsKKwl9IGVsc2UgeworCQllcnIgKz0gc245YzEwMl9pMmNfdHJ5X3Jhd193cml0ZShjYW0sIHMsIDQsIHMtPmkyY19zbGF2ZV9pZCwKKwkJCQkJCSAweDBhLCAweDAwLCAweDAyLCAwLCAwKTsKKwkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgyMCwgMHgxOSk7CisJCWlmIChzbjljMTAyX2dldF9icmlkZ2UoY2FtKSA9PSBCUklER0VfU045QzEwNSB8fAorCQkgICAgc245YzEwMl9nZXRfYnJpZGdlKGNhbSkgPT0gQlJJREdFX1NOOUMxMjApCisJCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCAweGEyLCAweDE3KTsKIAl9CiAKIAlyZXR1cm4gZXJyOwogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgbWkwMzYwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbjljMTAyX3NlbnNvciBtaTAzNjAgPSB7CiAJLm5hbWUgPSAiTUktMDM2MCIsCiAJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCi0JLnN1cHBvcnRlZF9icmlkZ2UgPSBCUklER0VfU045QzEwMywKKwkuc3VwcG9ydGVkX2JyaWRnZSA9IEJSSURHRV9TTjlDMTAzIHwgQlJJREdFX1NOOUMxMDUgfCBCUklER0VfU045QzEyMCwKIAkuZnJlcXVlbmN5ID0gU045QzEwMl9JMkNfMTAwS0haLAogCS5pbnRlcmZhY2UgPSBTTjlDMTAyX0kyQ18yV0lSRVMsCiAJLmkyY19zbGF2ZV9pZCA9IDB4NWQsCkBAIC0zMTcsMTkgKzQxOSwzMSBAQAogCiBpbnQgc245YzEwMl9wcm9iZV9taTAzNjAoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCiB7Ci0JdTggZGF0YVs1KzFdOwotCWludCBlcnI7CiAKLQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMSwgMHgwMX0sIHsweDAwLCAweDAxfSwKLQkJCQkgICAgICAgezB4MjgsIDB4MTd9KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gLUVJTzsKKwl1OCBkYXRhWzJdOworCisJc3dpdGNoIChzbjljMTAyX2dldF9icmlkZ2UoY2FtKSkgeworCWNhc2UgQlJJREdFX1NOOUMxMDM6CisJCWlmIChzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMSwgMHgwMX0sIHsweDAwLCAweDAxfSwKKwkJCQkJICAgICB7MHgyOCwgMHgxN30pKQorCQkJcmV0dXJuIC1FSU87CisJCWJyZWFrOworCWNhc2UgQlJJREdFX1NOOUMxMDU6CisJY2FzZSBCUklER0VfU045QzEyMDoKKwkJaWYgKHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAxLCAweGYxfSwgezB4MDAsIDB4ZjF9LAorCQkJCQkgICAgIHsweDAxLCAweDAxfSwgezB4MDAsIDB4MDF9LAorCQkJCQkgICAgIHsweDI4LCAweDE3fSkpCisJCQlyZXR1cm4gLUVJTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQogCiAJaWYgKHNuOWMxMDJfaTJjX3RyeV9yYXdfcmVhZChjYW0sICZtaTAzNjAsIG1pMDM2MC5pMmNfc2xhdmVfaWQsIDB4MDAsCi0JCQkJICAgICAyKzEsIGRhdGEpIDwgMCkKKwkJCQkgICAgIDIsIGRhdGEpIDwgMCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoZGF0YVsyXSAhPSAweDgyIHx8IGRhdGFbM10gIT0gMHg0MykKKwlpZiAoZGF0YVswXSAhPSAweDgyIHx8IGRhdGFbMV0gIT0gMHg0MykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzbjljMTAyX2F0dGFjaF9zZW5zb3IoY2FtLCAmbWkwMzYwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX292NzYzMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfb3Y3NjMwLmMKaW5kZXggMzFiNjA4MC4uZTY4MzIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfb3Y3NjMwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfb3Y3NjMwLmMKQEAgLTI5LDkgKzI5LDggQEAKIAlzd2l0Y2ggKHNuOWMxMDJfZ2V0X2JyaWRnZShjYW0pKSB7CiAJY2FzZSBCUklER0VfU045QzEwMToKIAljYXNlIEJSSURHRV9TTjlDMTAyOgotCQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMCwgMHgxNH0sCi0JCQkJCSAgICAgICB7MHg2MCwgMHgxN30sIHsweDBmLCAweDE4fSwKLQkJCQkJICAgICAgIHsweDUwLCAweDE5fSk7CisJCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAwLCAweDE0fSwgezB4NjAsIDB4MTd9LAorCQkJCQkgICAgICAgezB4MGYsIDB4MTh9LCB7MHg1MCwgMHgxOX0pOwogCiAJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTIsIDB4OGQpOwogCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEyLCAweDBkKTsKQEAgLTYxLDcgKzYwLDYgQEAKIAkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHg3MSwgMHgwMCk7CiAJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4NzQsIDB4MjEpOwogCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDdkLCAweGY3KTsKLQogCQlicmVhazsKIAljYXNlIEJSSURHRV9TTjlDMTAzOgogCQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMCwgMHgwMn0sIHsweDAwLCAweDAzfSwKQEAgLTI1Myw3ICsyNTEsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc245YzEwMl9zZW5zb3Igb3Y3NjMwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbjljMTAyX3NlbnNvciBvdjc2MzAgPSB7CiAJLm5hbWUgPSAiT1Y3NjMwIiwKIAkubWFpbnRhaW5lciA9ICJMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+IiwKIAkuc3VwcG9ydGVkX2JyaWRnZSA9IEJSSURHRV9TTjlDMTAxIHwgQlJJREdFX1NOOUMxMDIgfCBCUklER0VfU045QzEwMywKQEAgLTQwOCwxOSArNDA2LDE2IEBACiAJc3dpdGNoIChzbjljMTAyX2dldF9icmlkZ2UoY2FtKSkgewogCWNhc2UgQlJJREdFX1NOOUMxMDE6CiAJY2FzZSBCUklER0VfU045QzEwMjoKLQkJZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDEsIDB4MDF9LAotCQkJCQkgICAgICAgezB4MDAsIDB4MDF9LCB7MHgyOCwgMHgxN30pOwotCisJCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAxLCAweDAxfSwgezB4MDAsIDB4MDF9LAorCQkJCQkgICAgICAgezB4MjgsIDB4MTd9KTsKIAkJYnJlYWs7CiAJY2FzZSBCUklER0VfU045QzEwMzogLyogZG8gX25vdF8gY2hhbmdlIGFueXRoaW5nISAqLwotCQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwOSwgMHgwMX0sCi0JCQkJCSAgICAgICB7MHg0MiwgMHgwMX0sIHsweDI4LCAweDE3fSwKLQkJCQkJICAgICAgIHsweDQ0LCAweDAyfSk7CisJCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDA5LCAweDAxfSwgezB4NDIsIDB4MDF9LAorCQkJCQkgICAgICAgezB4MjgsIDB4MTd9LCB7MHg0NCwgMHgwMn0pOwogCQlwaWQgPSBzbjljMTAyX2kyY190cnlfcmVhZChjYW0sICZvdjc2MzAsIDB4MGEpOwotCQlpZiAoZXJyIHx8IHBpZCA8IDApIHsgLyogdHJ5IGEgZGlmZmVyZW50IGluaXRpYWxpemF0aW9uICovCi0JCQllcnIgPSBzbjljMTAyX3dyaXRlX3JlZyhjYW0sIDB4MDEsIDB4MDEpOwotCQkJZXJyICs9IHNuOWMxMDJfd3JpdGVfcmVnKGNhbSwgMHgwMCwgMHgwMSk7Ci0JCX0KKwkJaWYgKGVyciB8fCBwaWQgPCAwKSAvKiB0cnkgYSBkaWZmZXJlbnQgaW5pdGlhbGl6YXRpb24gKi8KKwkJCWVyciArPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMSwgMHgwMX0sCisJCQkJCQkJezB4MDAsIDB4MDF9KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX292NzY2MC5jCmluZGV4IGM4OThlOTQ4Li40YjY0NzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9vdjc2NjAuYwpAQCAtMTA0LDggKzEwNCw4IEBACiAJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMiwgMHg4MCk7CiAJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgxMSwgMHgwOSk7CiAJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMCwgMHgwQSk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMSwgMHg3OCk7Ci0JZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMiwgMHg5MCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMSwgMHg4MCk7CisJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMiwgMHg4MCk7CiAJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMywgMHgwMCk7CiAJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNCwgMHgwMCk7CiAJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwNSwgMHgwOCk7CkBAIC0xMjIsNyArMTIyLDcgQEAKIAllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEwLCAweDIwKTsKIAllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDExLCAweDAzKTsKIAllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEyLCAweDA1KTsKLQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEzLCAweEY4KTsKKwllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEzLCAweEM3KTsKIAllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE0LCAweDJDKTsKIAllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE1LCAweDAwKTsKIAllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDE2LCAweDAyKTsKQEAgLTE2Miw3ICsxNjIsNyBAQAogCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzgsIDB4MDIpOwogCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MzksIDB4NDMpOwogCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4M0EsIDB4MDApOwotCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4M0IsIDB4MDIpOworCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4M0IsIDB4MEEpOwogCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4M0MsIDB4NkMpOwogCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4M0QsIDB4OTkpOwogCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4M0UsIDB4MEUpOwpAQCAtMjgxLDI1ICsyODEsMzQgQEAKIAkJCXJldHVybiAtRUlPOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0RPX1dISVRFX0JBTEFOQ0U6Ci0JCWN0cmwtPnZhbHVlID0gc245YzEwMl9wcmVhZF9yZWcoY2FtLCAweDAyKTsKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDAyKSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlID0gKGN0cmwtPnZhbHVlICYgMHgwNCkgPyAxIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9SRURfQkFMQU5DRToKLQkJY3RybC0+dmFsdWUgPSBzbjljMTAyX3ByZWFkX3JlZyhjYW0sIDB4MDUpOworCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9yZWFkX3JlZyhjYW0sIDB4MDUpKSA8IDApCisJCQlyZXR1cm4gLUVJTzsKIAkJY3RybC0+dmFsdWUgJj0gMHg3ZjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCWN0cmwtPnZhbHVlID0gc245YzEwMl9wcmVhZF9yZWcoY2FtLCAweDA2KTsKKwkJaWYgKChjdHJsLT52YWx1ZSA9IHNuOWMxMDJfcmVhZF9yZWcoY2FtLCAweDA2KSkgPCAwKQorCQkJcmV0dXJuIC1FSU87CiAJCWN0cmwtPnZhbHVlICY9IDB4N2Y7CiAJCWJyZWFrOwogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgotCQljdHJsLT52YWx1ZSA9IHNuOWMxMDJfcHJlYWRfcmVnKGNhbSwgMHgwNyk7CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX3JlYWRfcmVnKGNhbSwgMHgwNykpIDwgMCkKKwkJCXJldHVybiAtRUlPOwogCQljdHJsLT52YWx1ZSAmPSAweDdmOwogCQlicmVhazsKKwljYXNlIFNOOUMxMDJfVjRMMl9DSURfQkFORF9GSUxURVI6CisJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgzYikpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQljdHJsLT52YWx1ZSAmPSAweDA4OworCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0dBSU46CiAJCWlmICgoY3RybC0+dmFsdWUgPSBzbjljMTAyX2kyY19yZWFkKGNhbSwgMHgwMCkpIDwgMCkKIAkJCXJldHVybiAtRUlPOwotCQljdHJsLT52YWx1ZSAmPSAweDdmOworCQljdHJsLT52YWx1ZSAmPSAweDFmOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgogCQlpZiAoKGN0cmwtPnZhbHVlID0gc245YzEwMl9pMmNfcmVhZChjYW0sIDB4MTMpKSA8IDApCkBAIC0zMzUsMTIgKzM0NCwxNSBAQAogCWNhc2UgU045QzEwMl9WNEwyX0NJRF9HUkVFTl9CQUxBTkNFOgogCQllcnIgKz0gc245YzEwMl93cml0ZV9yZWcoY2FtLCBjdHJsLT52YWx1ZSwgMHgwNyk7CiAJCWJyZWFrOworCWNhc2UgU045QzEwMl9WNEwyX0NJRF9CQU5EX0ZJTFRFUjoKKwkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgY3RybC0+dmFsdWUgPDwgMywgMHgzYik7CisJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfR0FJTjoKLQkJZXJyICs9IHNuOWMxMDJfaTJjX3dyaXRlKGNhbSwgMHgwMCwgY3RybC0+dmFsdWUpOworCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDAwLCAweDYwICsgY3RybC0+dmFsdWUpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgotCQllcnIgKz0gc245YzEwMl9pMmNfd3JpdGUoY2FtLCAweDEzLCAweGYwIHwgY3RybC0+dmFsdWUgfAotCQkJCQkJICAgIChjdHJsLT52YWx1ZSA8PCAxKSk7CisJCWVyciArPSBzbjljMTAyX2kyY193cml0ZShjYW0sIDB4MTMsIDB4YzAgfAorCQkJCQkJICAgIChjdHJsLT52YWx1ZSAqIDB4MDcpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zODYsNyArMzk4LDcgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIG92NzY2MCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc245YzEwMl9zZW5zb3Igb3Y3NjYwID0gewogCS5uYW1lID0gIk9WNzY2MCIsCiAJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCiAJLnN1cHBvcnRlZF9icmlkZ2UgPSBCUklER0VfU045QzEwNSB8IEJSSURHRV9TTjlDMTIwLApAQCAtNDAxLDkgKzQxMyw5IEBACiAJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCiAJCQkubmFtZSA9ICJnbG9iYWwgZ2FpbiIsCiAJCQkubWluaW11bSA9IDB4MDAsCi0JCQkubWF4aW11bSA9IDB4N2YsCisJCQkubWF4aW11bSA9IDB4MWYsCiAJCQkuc3RlcCA9IDB4MDEsCi0JCQkuZGVmYXVsdF92YWx1ZSA9IDB4MGEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDksCiAJCQkuZmxhZ3MgPSAwLAogCQl9LAogCQl7CkBAIC00MTMsNyArNDI1LDcgQEAKIAkJCS5taW5pbXVtID0gMHgwMCwKIAkJCS5tYXhpbXVtID0gMHhmZiwKIAkJCS5zdGVwID0gMHgwMSwKLQkJCS5kZWZhdWx0X3ZhbHVlID0gMHg1MCwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgyNywKIAkJCS5mbGFncyA9IDAsCiAJCX0sCiAJCXsKQEAgLTQzMyw3ICs0NDUsNyBAQAogCQkJLm1pbmltdW0gPSAweDAwLAogCQkJLm1heGltdW0gPSAweDdmLAogCQkJLnN0ZXAgPSAweDAxLAotCQkJLmRlZmF1bHRfdmFsdWUgPSAweDFmLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDE0LAogCQkJLmZsYWdzID0gMCwKIAkJfSwKIAkJewpAQCAtNDQzLDcgKzQ1NSw3IEBACiAJCQkubWluaW11bSA9IDB4MDAsCiAJCQkubWF4aW11bSA9IDB4N2YsCiAJCQkuc3RlcCA9IDB4MDEsCi0JCQkuZGVmYXVsdF92YWx1ZSA9IDB4MWUsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MTQsCiAJCQkuZmxhZ3MgPSAwLAogCQl9LAogCQl7CkBAIC00NTMsNyArNDY1LDcgQEAKIAkJCS5taW5pbXVtID0gMHgwMCwKIAkJCS5tYXhpbXVtID0gMHgwMSwKIAkJCS5zdGVwID0gMHgwMSwKLQkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMCwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgwMSwKIAkJCS5mbGFncyA9IDAsCiAJCX0sCiAJCXsKQEAgLTQ2Myw3ICs0NzUsMTcgQEAKIAkJCS5taW5pbXVtID0gMHgwMCwKIAkJCS5tYXhpbXVtID0gMHg3ZiwKIAkJCS5zdGVwID0gMHgwMSwKLQkJCS5kZWZhdWx0X3ZhbHVlID0gMHgyMCwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMHgxNCwKKwkJCS5mbGFncyA9IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IFNOOUMxMDJfVjRMMl9DSURfQkFORF9GSUxURVIsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCQkubmFtZSA9ICJiYW5kIGZpbHRlciIsCisJCQkubWluaW11bSA9IDB4MDAsCisJCQkubWF4aW11bSA9IDB4MDEsCisJCQkuc3RlcCA9IDB4MDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAsCiAJCQkuZmxhZ3MgPSAwLAogCQl9LAogCX0sCkBAIC01MDgsNiArNTMwLDcgQEAKIAkJcmV0dXJuIC1FSU87CiAJaWYgKHBpZCAhPSAweDc2IHx8IHZlciAhPSAweDYwKQogCQlyZXR1cm4gLUVOT0RFVjsKKwogCXNuOWMxMDJfYXR0YWNoX3NlbnNvcihjYW0sICZvdjc2NjApOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9wYXMxMDZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9wYXMxMDZiLmMKaW5kZXggNjcxNTE5Ni4uMzYwZjJhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfcGFzMTA2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczEwNmIuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBwYXMxMDZiID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbjljMTAyX3NlbnNvciBwYXMxMDZiID0gewogCS5uYW1lID0gIlBBUzEwNkIiLAogCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAogCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDEgfCBCUklER0VfU045QzEwMiwKQEAgLTI3MywyMyArMjczLDIxIEBACiAKIGludCBzbjljMTAyX3Byb2JlX3BhczEwNmIoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0pCiB7Ci0JaW50IHIwID0gMCwgcjEgPSAwLCBlcnI7CisJaW50IHIwID0gMCwgcjEgPSAwOwogCXVuc2lnbmVkIGludCBwaWQgPSAwOwogCiAJLyoKIAkgICBNaW5pbWFsIGluaXRpYWxpemF0aW9uIHRvIGVuYWJsZSB0aGUgSTJDIGNvbW11bmljYXRpb24KIAkgICBOT1RFOiBkbyBOT1QgY2hhbmdlIHRoZSB2YWx1ZXMhCiAJKi8KLQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLAotCQkJCSAgICAgICB7MHgwMSwgMHgwMX0sIC8qIHNlbnNvciBwb3dlciBkb3duICovCi0JCQkJICAgICAgIHsweDAwLCAweDAxfSwgLyogc2Vuc29yIHBvd2VyIG9uICovCi0JCQkJICAgICAgIHsweDI4LCAweDE3fSk7Lyogc2Vuc29yIGNsb2NrIDI0IE1IeiAqLwotCWlmIChlcnIpCisJaWYgKHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sCisJCQkJICAgICB7MHgwMSwgMHgwMX0sIC8qIHNlbnNvciBwb3dlciBkb3duICovCisJCQkJICAgICB7MHgwMCwgMHgwMX0sIC8qIHNlbnNvciBwb3dlciBvbiAqLworCQkJCSAgICB7MHgyOCwgMHgxN30pKSAvKiBzZW5zb3IgY2xvY2sgYXQgMjQgTUh6ICovCiAJCXJldHVybiAtRUlPOwogCiAJcjAgPSBzbjljMTAyX2kyY190cnlfcmVhZChjYW0sICZwYXMxMDZiLCAweDAwKTsKIAlyMSA9IHNuOWMxMDJfaTJjX3RyeV9yZWFkKGNhbSwgJnBhczEwNmIsIDB4MDEpOwotCiAJaWYgKHIwIDwgMCB8fCByMSA8IDApCiAJCXJldHVybiAtRUlPOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9wYXMyMDJiY2IuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCmluZGV4IGMxYjhkNmIuLmNhNGExNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3BhczIwMmJjYi5jCkBAIC0zNSwyOSArMzUsMjggQEAKIAlzd2l0Y2ggKHNuOWMxMDJfZ2V0X2JyaWRnZShjYW0pKSB7CiAJY2FzZSBCUklER0VfU045QzEwMToKIAljYXNlIEJSSURHRV9TTjlDMTAyOgotCQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMCwgMHgxMH0sCi0JCQkJCSAgICAgICB7MHgwMCwgMHgxMX0sIHsweDAwLCAweDE0fSwKLQkJCQkJICAgICAgIHsweDIwLCAweDE3fSwgezB4MzAsIDB4MTl9LAotCQkJCQkgICAgICAgezB4MDksIDB4MTh9KTsKKwkJZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDAsIDB4MTB9LCB7MHgwMCwgMHgxMX0sCisJCQkJCSAgICAgICB7MHgwMCwgMHgxNH0sIHsweDIwLCAweDE3fSwKKwkJCQkJICAgICAgIHsweDMwLCAweDE5fSwgezB4MDksIDB4MTh9KTsKIAkJYnJlYWs7CiAJY2FzZSBCUklER0VfU045QzEwMzoKLQkJZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDAsIDB4MDJ9LAotCQkJCQkgICAgICAgezB4MDAsIDB4MDN9LCB7MHgxYSwgMHgwNH0sCi0JCQkJCSAgICAgICB7MHgyMCwgMHgwNX0sIHsweDIwLCAweDA2fSwKLQkJCQkJICAgICAgIHsweDIwLCAweDA3fSwgezB4MDAsIDB4MTB9LAotCQkJCQkgICAgICAgezB4MDAsIDB4MTF9LCB7MHgwMCwgMHgxNH0sCi0JCQkJCSAgICAgICB7MHgyMCwgMHgxN30sIHsweDMwLCAweDE5fSwKLQkJCQkJICAgICAgIHsweDA5LCAweDE4fSwgezB4MDIsIDB4MWN9LAotCQkJCQkgICAgICAgezB4MDMsIDB4MWR9LCB7MHgwZiwgMHgxZX0sCi0JCQkJCSAgICAgICB7MHgwYywgMHgxZn0sIHsweDAwLCAweDIwfSwKLQkJCQkJICAgICAgIHsweDEwLCAweDIxfSwgezB4MjAsIDB4MjJ9LAotCQkJCQkgICAgICAgezB4MzAsIDB4MjN9LCB7MHg0MCwgMHgyNH0sCi0JCQkJCSAgICAgICB7MHg1MCwgMHgyNX0sIHsweDYwLCAweDI2fSwKLQkJCQkJICAgICAgIHsweDcwLCAweDI3fSwgezB4ODAsIDB4Mjh9LAotCQkJCQkgICAgICAgezB4OTAsIDB4Mjl9LCB7MHhhMCwgMHgyYX0sCi0JCQkJCSAgICAgICB7MHhiMCwgMHgyYn0sIHsweGMwLCAweDJjfSwKLQkJCQkJICAgICAgIHsweGQwLCAweDJkfSwgezB4ZTAsIDB4MmV9LAotCQkJCQkgICAgICAgezB4ZjAsIDB4MmZ9LCB7MHhmZiwgMHgzMH0pOworCQllcnIgPSBzbjljMTAyX3dyaXRlX2NvbnN0X3JlZ3MoY2FtLCB7MHgwMCwgMHgwMn0sIHsweDAwLCAweDAzfSwKKwkJCQkJICAgICAgIHsweDFhLCAweDA0fSwgezB4MjAsIDB4MDV9LAorCQkJCQkgICAgICAgezB4MjAsIDB4MDZ9LCB7MHgyMCwgMHgwN30sCisJCQkJCSAgICAgICB7MHgwMCwgMHgxMH0sIHsweDAwLCAweDExfSwKKwkJCQkJICAgICAgIHsweDAwLCAweDE0fSwgezB4MjAsIDB4MTd9LAorCQkJCQkgICAgICAgezB4MzAsIDB4MTl9LCB7MHgwOSwgMHgxOH0sCisJCQkJCSAgICAgICB7MHgwMiwgMHgxY30sIHsweDAzLCAweDFkfSwKKwkJCQkJICAgICAgIHsweDBmLCAweDFlfSwgezB4MGMsIDB4MWZ9LAorCQkJCQkgICAgICAgezB4MDAsIDB4MjB9LCB7MHgxMCwgMHgyMX0sCisJCQkJCSAgICAgICB7MHgyMCwgMHgyMn0sIHsweDMwLCAweDIzfSwKKwkJCQkJICAgICAgIHsweDQwLCAweDI0fSwgezB4NTAsIDB4MjV9LAorCQkJCQkgICAgICAgezB4NjAsIDB4MjZ9LCB7MHg3MCwgMHgyN30sCisJCQkJCSAgICAgICB7MHg4MCwgMHgyOH0sIHsweDkwLCAweDI5fSwKKwkJCQkJICAgICAgIHsweGEwLCAweDJhfSwgezB4YjAsIDB4MmJ9LAorCQkJCQkgICAgICAgezB4YzAsIDB4MmN9LCB7MHhkMCwgMHgyZH0sCisJCQkJCSAgICAgICB7MHhlMCwgMHgyZX0sIHsweGYwLCAweDJmfSwKKwkJCQkJICAgICAgIHsweGZmLCAweDMwfSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMTk3LDcgKzE5Niw3IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciBwYXMyMDJiY2IgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHBhczIwMmJjYiA9IHsKIAkubmFtZSA9ICJQQVMyMDJCQ0IiLAogCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAogCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDEgfCBCUklER0VfU045QzEwMiB8IEJSSURHRV9TTjlDMTAzLApAQCAtMzEzLDkgKzMxMiw4IEBACiAJCQkJCSAgICAgICB7MHgyOCwgMHgxN30pOy8qIGNsb2NrIDI0IE1IeiAqLwogCQlicmVhazsKIAljYXNlIEJSSURHRV9TTjlDMTAzOiAvKiBkbyBfbm90XyBjaGFuZ2UgYW55dGhpbmchICovCi0JCWVyciA9IHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDA5LCAweDAxfSwKLQkJCQkJICAgICAgIHsweDQ0LCAweDAxfSwgezB4NDQsIDB4MDJ9LAotCQkJCQkgICAgICAgezB4MjksIDB4MTd9KTsKKwkJZXJyID0gc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDksIDB4MDF9LCB7MHg0NCwgMHgwMX0sCisJCQkJCSAgICAgICB7MHg0NCwgMHgwMn0sIHsweDI5LCAweDE3fSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfc2Vuc29yLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9zZW5zb3IuaAppbmRleCAxYmJmNjRjLi4yZDdkNzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9zZW5zb3IuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9zZW5zb3IuaApAQCAtMjIsNyArMjIsNyBAQAogI2RlZmluZSBfU045QzEwMl9TRU5TT1JfSF8KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTc0LDcgKzc0LDcgQEAKIC8qIEF0dGFjaCBhIHByb2JlZCBzZW5zb3IgdG8gdGhlIGNhbWVyYS4gKi8KIGV4dGVybiB2b2lkCiBzbjljMTAyX2F0dGFjaF9zZW5zb3Ioc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCi0JCSAgICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yKTsKKwkJICAgICAgY29uc3Qgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IpOwogCiAvKgogICAgUmVhZC93cml0ZSByb3V0aW5lczogdGhleSBhbHdheXMgcmV0dXJuIC0xIG9uIGVycm9yLCAwIG9yIHRoZSByZWFkIHZhbHVlCkBAIC04NSwxMCArODUsMTEgQEAKICovCiAKIC8qIFRoZSAidHJ5IiBJMkMgSS9PIHZlcnNpb25zIGFyZSB1c2VkIHdoZW4gcHJvYmluZyB0aGUgc2Vuc29yICovCi1leHRlcm4gaW50IHNuOWMxMDJfaTJjX3RyeV93cml0ZShzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLHN0cnVjdCBzbjljMTAyX3NlbnNvciosCi0JCQkJIHU4IGFkZHJlc3MsIHU4IHZhbHVlKTsKLWV4dGVybiBpbnQgc245YzEwMl9pMmNfdHJ5X3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKixzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqLAotCQkJCXU4IGFkZHJlc3MpOworZXh0ZXJuIGludCBzbjljMTAyX2kyY190cnlfd3JpdGUoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiwKKwkJCQkgY29uc3Qgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiwgdTggYWRkcmVzcywKKwkJCQkgdTggdmFsdWUpOworZXh0ZXJuIGludCBzbjljMTAyX2kyY190cnlfcmVhZChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLAorCQkJCWNvbnN0IHN0cnVjdCBzbjljMTAyX3NlbnNvciosIHU4IGFkZHJlc3MpOwogCiAvKgogICAgVGhlc2UgbXVzdCBiZSB1c2VkIGlmIGFuZCBvbmx5IGlmIHRoZSBzZW5zb3IgZG9lc24ndCBpbXBsZW1lbnQgdGhlIHN0YW5kYXJkCkBAIC0xMDIsMjkgKzEwMywzMSBAQAogICAgYnl0ZS4KICovCiBleHRlcm4gaW50IHNuOWMxMDJfaTJjX3RyeV9yYXdfd3JpdGUoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCi0JCQkJICAgICBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IqIHNlbnNvciwgdTggbiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yLCB1OCBuLAogCQkJCSAgICAgdTggZGF0YTAsIHU4IGRhdGExLCB1OCBkYXRhMiwgdTggZGF0YTMsCiAJCQkJICAgICB1OCBkYXRhNCwgdTggZGF0YTUpOwogZXh0ZXJuIGludCBzbjljMTAyX2kyY190cnlfcmF3X3JlYWQoc3RydWN0IHNuOWMxMDJfZGV2aWNlKiBjYW0sCi0JCQkJICAgIHN0cnVjdCBzbjljMTAyX3NlbnNvciogc2Vuc29yLCB1OCBkYXRhMCwKLQkJCQkgICAgdTggZGF0YTEsIHU4IG4sIHU4IGJ1ZmZlcltdKTsKKwkJCQkgICAgY29uc3Qgc3RydWN0IHNuOWMxMDJfc2Vuc29yKiBzZW5zb3IsCisJCQkJICAgIHU4IGRhdGEwLCB1OCBkYXRhMSwgdTggbiwgdTggYnVmZmVyW10pOwogCiAvKiBUbyBiZSB1c2VkIGFmdGVyIHRoZSBzZW5zb3Igc3RydWN0IGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBjYW1lcmEgc3RydWN0ICovCiBleHRlcm4gaW50IHNuOWMxMDJfaTJjX3dyaXRlKHN0cnVjdCBzbjljMTAyX2RldmljZSosIHU4IGFkZHJlc3MsIHU4IHZhbHVlKTsKIGV4dGVybiBpbnQgc245YzEwMl9pMmNfcmVhZChzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLCB1OCBhZGRyZXNzKTsKIAogLyogSS9PIG9uIHJlZ2lzdGVycyBpbiB0aGUgYnJpZGdlLiBDb3VsZCBiZSB1c2VkIGJ5IHRoZSBzZW5zb3IgbWV0aG9kcyB0b28gKi8KK2V4dGVybiBpbnQgc245YzEwMl9yZWFkX3JlZyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLCB1MTYgaW5kZXgpOwogZXh0ZXJuIGludCBzbjljMTAyX3ByZWFkX3JlZyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLCB1MTYgaW5kZXgpOwogZXh0ZXJuIGludCBzbjljMTAyX3dyaXRlX3JlZyhzdHJ1Y3Qgc245YzEwMl9kZXZpY2UqLCB1OCB2YWx1ZSwgdTE2IGluZGV4KTsKIGV4dGVybiBpbnQgc245YzEwMl93cml0ZV9yZWdzKHN0cnVjdCBzbjljMTAyX2RldmljZSosIGNvbnN0IHU4IHZhbHJlZ1tdWzJdLAogCQkJICAgICAgaW50IGNvdW50KTsKIC8qCi0gKiBXcml0ZSBtdWx0aXBsZSByZWdpc3RlcnMgd2l0aCBjb25zdGFudCB2YWx1ZXMuICBGb3IgZXhhbXBsZToKLSAqIHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhjYW0sIHsweDAwLCAweDE0fSwgezB4NjAsIDB4MTd9LCB7MHgwZiwgMHgxOH0pOwotICovCi0jZGVmaW5lIHNuOWMxMDJfd3JpdGVfY29uc3RfcmVncyhkZXZpY2UsIGRhdGEuLi4pIFwKLQkoeyBjb25zdCBzdGF0aWMgdTggX2RhdGFbXVsyXSA9IHtkYXRhfTsgXAotCXNuOWMxMDJfd3JpdGVfcmVncyhkZXZpY2UsIF9kYXRhLCBBUlJBWV9TSVpFKF9kYXRhKSk7IH0pCisgICBXcml0ZSBtdWx0aXBsZSByZWdpc3RlcnMgd2l0aCBjb25zdGFudCB2YWx1ZXMuIEZvciBleGFtcGxlOgorICAgc245YzEwMl93cml0ZV9jb25zdF9yZWdzKGNhbSwgezB4MDAsIDB4MTR9LCB7MHg2MCwgMHgxN30sIHsweDBmLCAweDE4fSk7CisgICBSZWdpc3RlciBhZHJlc3NlcyBtdXN0IGJlIDwgMjU2LgorKi8KKyNkZWZpbmUgc245YzEwMl93cml0ZV9jb25zdF9yZWdzKHNuOWMxMDJfZGV2aWNlLCBkYXRhLi4uKSAgICAgICAgICAgICAgICAgICAgIFwKKwkoeyBjb25zdCBzdGF0aWMgdTggX3ZhbHJlZ1tdWzJdID0ge2RhdGF9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXNuOWMxMDJfd3JpdGVfcmVncyhzbjljMTAyX2RldmljZSwgX3ZhbHJlZywgQVJSQVlfU0laRShfdmFscmVnKSk7IH0pCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGMxYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGMxYi5jCmluZGV4IDBlN2VjODYuLmU3ZDJkZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMTBjMWIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl90YXM1MTEwYzFiLmMKQEAgLTg4LDcgKzg4LDcgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHRhczUxMTBjMWIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuOWMxMDJfc2Vuc29yIHRhczUxMTBjMWIgPSB7CiAJLm5hbWUgPSAiVEFTNTExMEMxQiIsCiAJLm1haW50YWluZXIgPSAiTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiIsCiAJLnN1cHBvcnRlZF9icmlkZ2UgPSBCUklER0VfU045QzEwMSB8IEJSSURHRV9TTjlDMTAyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMTBkLmMKaW5kZXggODNhMzllOC4uZDMyZmRiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTExMGQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl90YXM1MTEwZC5jCkBAIC02OCw3ICs2OCw3IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciB0YXM1MTEwZCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc245YzEwMl9zZW5zb3IgdGFzNTExMGQgPSB7CiAJLm5hbWUgPSAiVEFTNTExMEQiLAogCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAogCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDEgfCBCUklER0VfU045QzEwMiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMzBkMWIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX3RhczUxMzBkMWIuYwppbmRleCA1MDQwNjUwLi41NmZiMWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl90YXM1MTMwZDFiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfdGFzNTEzMGQxYi5jCkBAIC04OSw3ICs4OSw3IEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBzbjljMTAyX3NlbnNvciB0YXM1MTMwZDFiID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbjljMTAyX3NlbnNvciB0YXM1MTMwZDFiID0gewogCS5uYW1lID0gIlRBUzUxMzBEMUIiLAogCS5tYWludGFpbmVyID0gIkx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iLAogCS5zdXBwb3J0ZWRfYnJpZGdlID0gQlJJREdFX1NOOUMxMDEgfCBCUklER0VfU045QzEwMiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vS2NvbmZpZwppbmRleCBhMGZkODJiLi5lNGNiOTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9LY29uZmlnCkBAIC0zLDcgKzMsNyBAQAogCiBjb25maWcgVVNCX1ZJQ0FNCiAJdHJpc3RhdGUgIlVTQiAzY29tIEhvbWVDb25uZWN0IChha2EgdmljYW0pIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgVklERU9fREVWICYmIFZJREVPX1Y0TDEgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBWSURFT19WNEwxICYmIEVYUEVSSU1FTlRBTAogCXNlbGVjdCBWSURFT19VU0JWSURFTwogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgM2NvbSBob21lY29ubmVjdCBjYW1lcmEgKHZpY2FtKS4KQEAgLTEzLDcgKzEzLDcgQEAKIAogY29uZmlnIFVTQl9JQk1DQU0KIAl0cmlzdGF0ZSAiVVNCIElCTSAoWGlybGluaykgQy1pdCBDYW1lcmEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19ERVYgJiYgVklERU9fVjRMMQorCWRlcGVuZHMgb24gVklERU9fVjRMMQogCXNlbGVjdCBWSURFT19VU0JWSURFTwogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBhIElCTSAiQy1JdCIgY2FtZXJhLCBhbHNvIGtub3duIGFzCkBAIC0yOCw3ICsyOCw3IEBACiAKIGNvbmZpZyBVU0JfS09OSUNBV0MKIAl0cmlzdGF0ZSAiVVNCIEtvbmljYSBXZWJjYW0gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQiAmJiBWSURFT19ERVYgJiYgVklERU9fVjRMMQorCWRlcGVuZHMgb24gVklERU9fVjRMMQogCXNlbGVjdCBWSURFT19VU0JWSURFTwogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3Igd2ViY2FtcyBiYXNlZCBvbiBhIEtvbmljYQpAQCAtMzksNyArMzksNyBAQAogCiBjb25maWcgVVNCX1FVSUNLQ0FNX01FU1NFTkdFUgogCXRyaXN0YXRlICJVU0IgTG9naXRlY2ggUXVpY2tjYW0gTWVzc2VuZ2VyIgotCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFViAmJiBWSURFT19WNEwxCisJZGVwZW5kcyBvbiBWSURFT19WNEwxCiAJc2VsZWN0IFZJREVPX1VTQlZJREVPCiAJLS0taGVscC0tLQogCSAgU2F5IFkgb3IgTSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgVVNCIExvZ2l0ZWNoIFF1aWNrY2FtCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vS2NvbmZpZwppbmRleCBjNDNhNWQ4Li5mYzI0ZWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpc2lvbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgVklERU9fVVNCVklTSU9OCiAJdHJpc3RhdGUgIlVTQiB2aWRlbyBkZXZpY2VzIGJhc2VkIG9uIE5vZ2F0ZWNoIE5UMTAwMy8xMDA0LzEwMDUiCi0JZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMiAmJiBVU0IKKwlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwyCiAJc2VsZWN0IFZJREVPX1RVTkVSCiAJc2VsZWN0IFZJREVPX1NBQTcxMVggaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKaW5kZXggYTg2MWUxNS4uZWRlODU0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgcGFsZXR0ZTJwaXhlbGZvcm1hdFtdID0geworY29uc3Qgc3RhdGljIHVuc2lnbmVkIGludCBwYWxldHRlMnBpeGVsZm9ybWF0W10gPSB7CiAJW1ZJREVPX1BBTEVUVEVfR1JFWV0gICAgPSBWNEwyX1BJWF9GTVRfR1JFWSwKIAlbVklERU9fUEFMRVRURV9SR0I1NTVdICA9IFY0TDJfUElYX0ZNVF9SR0I1NTUsCiAJW1ZJREVPX1BBTEVUVEVfUkdCNTY1XSAgPSBWNEwyX1BJWF9GTVRfUkdCNTY1LApAQCAtMTQ1LDcgKzE0NSw3IEBACiAJW1ZJREVPX1BBTEVUVEVfWVVWNDIyUF0gPSBWNEwyX1BJWF9GTVRfWVVWNDIyUCwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfcHVyZV9fCiBwYWxldHRlX3RvX3BpeGVsZm9ybWF0KHVuc2lnbmVkIGludCBwYWxldHRlKQogewogCWlmIChwYWxldHRlIDwgQVJSQVlfU0laRShwYWxldHRlMnBpeGVsZm9ybWF0KSkKQEAgLTE1NCw4ICsxNTQsOCBAQAogCQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludAotcGl4ZWxmb3JtYXRfdG9fcGFsZXR0ZShpbnQgcGl4ZWxmb3JtYXQpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18KK3BpeGVsZm9ybWF0X3RvX3BhbGV0dGUodW5zaWduZWQgaW50IHBpeGVsZm9ybWF0KQogewogCWludAlwYWxldHRlID0gMDsKIAlzd2l0Y2ggKHBpeGVsZm9ybWF0KQpAQCAtNjE2LDYgKzYxNiw4IEBACiAJY2FzZSBWSURJT0NTUElDVDogLyogIHNldCB0b25lIGNvbnRyb2xzICYgcGFydGlhbCBjYXB0dXJlIGZvcm1hdCAgKi8KIAl7CiAJCXN0cnVjdCB2aWRlb19waWN0dXJlCSpwaWN0ID0gYXJnOworCQlpbnQgbWVtX2VyciA9IDAsIG92bF9lcnIgPSAwOworCiAJCW1lbXNldCgmZmJ1ZjIsIDAsIHNpemVvZihmYnVmMikpOwogCiAJCXNldF92NGxfY29udHJvbChpbm9kZSwgZmlsZSwKQEAgLTYyOCwzMyArNjMwLDU5IEBACiAJCQkJVjRMMl9DSURfU0FUVVJBVElPTiwgcGljdC0+Y29sb3VyLCBkcnYpOwogCQlzZXRfdjRsX2NvbnRyb2woaW5vZGUsIGZpbGUsCiAJCQkJVjRMMl9DSURfV0hJVEVORVNTLCBwaWN0LT53aGl0ZW5lc3MsIGRydik7CisJCS8qCisJCSAqIFY0TDEgdXNlcyB0aGlzIGlvY3RsIHRvIHNldCBib3RoIG1lbW9yeSBjYXB0dXJlIGFuZCBvdmVybGF5CisJCSAqIHBpeGVsIGZvcm1hdCwgd2hpbGUgVjRMMiBoYXMgdHdvIGRpZmZlcmVudCBpb2N0bHMgZm9yIHRoaXMuCisJCSAqIFNvbWUgY2FyZHMgbWF5IG5vdCBzdXBwb3J0IG9uZSBvciB0aGUgb3RoZXIsIGFuZCBtYXkgc3VwcG9ydAorCQkgKiBkaWZmZXJlbnQgcGl4ZWwgZm9ybWF0cyBmb3IgbWVtb3J5IHZzIG92ZXJsYXkuCisJCSAqLwogCiAJCWZtdDIgPSBremFsbG9jKHNpemVvZigqZm10MiksR0ZQX0tFUk5FTCk7CiAJCWZtdDItPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CiAJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfRk1ULCBmbXQyKTsKLQkJaWYgKGVyciA8IDApCisJCS8qIElmIFZJRElPQ19HX0ZNVCBmYWlsZWQsIHRoZW4gdGhlIGRyaXZlciBsaWtlbHkgZG9lc24ndAorCQkgICBzdXBwb3J0IG1lbW9yeSBjYXB0dXJlLiAgVHJ5aW5nIHRvIHNldCB0aGUgbWVtb3J5IGNhcHR1cmUKKwkJICAgcGFyYW1ldGVycyB3b3VsZCBiZSBwb2ludGxlc3MuICAqLworCQlpZiAoZXJyIDwgMCkgewogCQkJZHByaW50aygiVklESU9DU1BJQ1QgLyBWSURJT0NfR19GTVQ6ICVkXG4iLGVycik7Ci0JCWlmIChmbXQyLT5mbXQucGl4LnBpeGVsZm9ybWF0ICE9Ci0JCSAgICBwYWxldHRlX3RvX3BpeGVsZm9ybWF0KHBpY3QtPnBhbGV0dGUpKSB7CisJCQltZW1fZXJyID0gLTEwMDA7ICAvKiBkaWRuJ3QgZXZlbiB0cnkgKi8KKwkJfSBlbHNlIGlmIChmbXQyLT5mbXQucGl4LnBpeGVsZm9ybWF0ICE9CisJCQkgcGFsZXR0ZV90b19waXhlbGZvcm1hdChwaWN0LT5wYWxldHRlKSkgewogCQkJZm10Mi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9IHBhbGV0dGVfdG9fcGl4ZWxmb3JtYXQoCiAJCQkJcGljdC0+cGFsZXR0ZSk7Ci0JCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0ZNVCwgZm10Mik7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlkcHJpbnRrKCJWSURJT0NTUElDVCAvIFZJRElPQ19TX0ZNVDogJWRcbiIsZXJyKTsKKwkJCW1lbV9lcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0ZNVCwgZm10Mik7CisJCQlpZiAobWVtX2VyciA8IDApCisJCQkJZHByaW50aygiVklESU9DU1BJQ1QgLyBWSURJT0NfU19GTVQ6ICVkXG4iLAorCQkJCQltZW1fZXJyKTsKIAkJfQogCiAJCWVyciA9IGRydihpbm9kZSwgZmlsZSwgVklESU9DX0dfRkJVRiwgJmZidWYyKTsKLQkJaWYgKGVyciA8IDApCisJCS8qIElmIFZJRElPQ19HX0ZCVUYgZmFpbGVkLCB0aGVuIHRoZSBkcml2ZXIgbGlrZWx5IGRvZXNuJ3QKKwkJICAgc3VwcG9ydCBvdmVybGF5LiAgVHJ5aW5nIHRvIHNldCB0aGUgb3ZlcmxheSBwYXJhbWV0ZXJzCisJCSAgIHdvdWxkIGJlIHF1aXRlIHBvaW50bGVzcy4gICovCisJCWlmIChlcnIgPCAwKSB7CiAJCQlkcHJpbnRrKCJWSURJT0NTUElDVCAvIFZJRElPQ19HX0ZCVUY6ICVkXG4iLGVycik7Ci0JCWlmIChmYnVmMi5mbXQucGl4ZWxmb3JtYXQgIT0KLQkJICAgIHBhbGV0dGVfdG9fcGl4ZWxmb3JtYXQocGljdC0+cGFsZXR0ZSkpIHsKKwkJCW92bF9lcnIgPSAtMTAwMDsgIC8qIGRpZG4ndCBldmVuIHRyeSAqLworCQl9IGVsc2UgaWYgKGZidWYyLmZtdC5waXhlbGZvcm1hdCAhPQorCQkJIHBhbGV0dGVfdG9fcGl4ZWxmb3JtYXQocGljdC0+cGFsZXR0ZSkpIHsKIAkJCWZidWYyLmZtdC5waXhlbGZvcm1hdCA9IHBhbGV0dGVfdG9fcGl4ZWxmb3JtYXQoCiAJCQkJcGljdC0+cGFsZXR0ZSk7Ci0JCQllcnIgPSBkcnYoaW5vZGUsIGZpbGUsIFZJRElPQ19TX0ZCVUYsICZmYnVmMik7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlkcHJpbnRrKCJWSURJT0NTUElDVCAvIFZJRElPQ19TX0ZCVUY6ICVkXG4iLGVycik7Ci0JCQllcnIgPSAwOyAvKiBsaWtlbHkgZmFpbHMgZm9yIG5vbi1yb290ICovCisJCQlvdmxfZXJyID0gZHJ2KGlub2RlLCBmaWxlLCBWSURJT0NfU19GQlVGLCAmZmJ1ZjIpOworCQkJaWYgKG92bF9lcnIgPCAwKQorCQkJCWRwcmludGsoIlZJRElPQ1NQSUNUIC8gVklESU9DX1NfRkJVRjogJWRcbiIsCisJCQkJCW92bF9lcnIpOwogCQl9CisJCWlmIChvdmxfZXJyIDwgMCAmJiBtZW1fZXJyIDwgMCkKKwkJCS8qIGlvY3RsIGZhaWxlZCwgY291bGRuJ3Qgc2V0IGVpdGhlciBwYXJhbWV0ZXIgKi8KKwkJCWlmIChtZW1fZXJyICE9IC0xMDAwKSB7CisJCQkgICAgZXJyID0gbWVtX2VycjsKKwkJCX0gZWxzZSBpZiAob3ZsX2VyciA9PSAtRVBFUk0pIHsKKwkJCSAgICBlcnIgPSAwOworCQkJfSBlbHNlIHsKKwkJCSAgICBlcnIgPSBvdmxfZXJyOworCQkJfQorCQllbHNlCisJCQllcnIgPSAwOwogCQlicmVhazsKIAl9CiAJY2FzZSBWSURJT0NHVFVORVI6IC8qICBnZXQgdHVuZXIgaW5mb3JtYXRpb24gICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYuYwppbmRleCA0NTk3ODZmLi5hMzJkZmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvLWJ1Zi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLmMKQEAgLTcwMiw5ICs3MDIsNyBAQAogCQlkcHJpbnRrKDEsInFidWY6IG1lbW9yeSB0eXBlIGlzIHdyb25nLlxuIik7CiAJCWdvdG8gZG9uZTsKIAl9Ci0JaWYgKGJ1Zi0+c3RhdGUgPT0gU1RBVEVfUVVFVUVEIHx8Ci0JICAgIGJ1Zi0+c3RhdGUgPT0gU1RBVEVfUFJFUEFSRUQgfHwKLQkgICAgYnVmLT5zdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKKwlpZiAoYnVmLT5zdGF0ZSAhPSBTVEFURV9ORUVEU19JTklUICYmIGJ1Zi0+c3RhdGUgIT0gU1RBVEVfSURMRSkgewogCQlkcHJpbnRrKDEsInFidWY6IGJ1ZmZlciBpcyBhbHJlYWR5IHF1ZXVlZCBvciBhY3RpdmUuXG4iKTsKIAkJZ290byBkb25lOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYwppbmRleCA1MjYzYjUwLi5iODc2YWNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2Rldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYwpAQCAtNDMzLDEzICs0MzMsNDMgQEAKIAlpbnQgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOwogCiAJaWYgKCAodmZkLT5kZWJ1ZyAmIFY0TDJfREVCVUdfSU9DVEwpICYmCi0JCQkJISh2ZmQtPmRlYnVnIHwgVjRMMl9ERUJVR19JT0NUTF9BUkcpKSB7CisJCQkJISh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTF9BUkcpKSB7CiAJCXY0bF9wcmludF9pb2N0bCh2ZmQtPm5hbWUsIGNtZCk7CiAJfQogCisjaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJIEhhbmRsZXMgY2FsbHMgdG8gdGhlIG9ic29sZXRlZCBWNEwxIEFQSQorCSBEdWUgdG8gdGhlIG5hdHVyZSBvZiBWSURJT0NHTUJVRiwgZWFjaCBkcml2ZXIgdGhhdCBzdXBwb3J0cworCSBWNEwxIHNob3VsZCBpbXBsZW1lbnQgaXRzIG93biBoYW5kbGVyIGZvciB0aGlzIGlvY3RsLgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIC0tLSBzdHJlYW1pbmcgY2FwdHVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJaWYgKGNtZCA9PSBWSURJT0NHTUJVRikgeworCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqcD1hcmc7CisKKwkJbWVtc2V0KHAsMCxzaXplb2YocCkpOworCisJCWlmICghdmZkLT52aWRpb2NnbWJ1ZikKKwkJCXJldHVybiByZXQ7CisJCXJldD12ZmQtPnZpZGlvY2dtYnVmKGZpbGUsIGZoLCBwKTsKKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcgKGNtZCwgInNpemU9JWQsIGZyYW1lcz0lZCwgb2Zmc2V0cz0weCUwOGx4XG4iLAorCQkJCQkJcC0+c2l6ZSwgcC0+ZnJhbWVzLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcpcC0+b2Zmc2V0cyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJIEFsbCBvdGhlciBWNEwxIGNhbGxzIGFyZSBoYW5kbGVkIGJ5IHY0bDFfY29tcGF0IG1vZHVsZS4KKwkgVGhvc2UgY2FsbHMgd2lsbCBiZSB0cmFuc2xhdGVkIGludG8gVjRMMiBjYWxscywgYW5kCisJIF9fdmlkZW9fZG9faW9jdGwgd2lsbCBiZSBjYWxsZWQgYWdhaW4sIHdpdGggb25lIG9yIG1vcmUKKwkgVjRMMiBpb2N0bHMuCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCWlmIChfSU9DX1RZUEUoY21kKT09J3YnKQogCQlyZXR1cm4gdjRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoaW5vZGUsZmlsZSxjbWQsYXJnLAogCQkJCQkJX192aWRlb19kb19pb2N0bCk7CisjZW5kaWYKIAogCXN3aXRjaChjbWQpIHsKIAkvKiAtLS0gY2FwYWJpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNzkxLDI0ICs4MjEsNiBAQAogCQlyZXQ9dmZkLT52aWRpb2Nfb3ZlcmxheShmaWxlLCBmaCwgKmkpOwogCQlicmVhazsKIAl9Ci0jaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCi0JLyogLS0tIHN0cmVhbWluZyBjYXB0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQljYXNlIFZJRElPQ0dNQlVGOgotCXsKLQkJc3RydWN0IHZpZGVvX21idWYgKnA9YXJnOwotCi0JCW1lbXNldChwLDAsc2l6ZW9mKHApKTsKLQotCQlpZiAoIXZmZC0+dmlkaW9jZ21idWYpCi0JCQlicmVhazsKLQkJcmV0PXZmZC0+dmlkaW9jZ21idWYoZmlsZSwgZmgsIHApOwotCQlpZiAoIXJldCkKLQkJCWRiZ2FyZyAoY21kLCAic2l6ZT0lZCwgZnJhbWVzPSVkLCBvZmZzZXRzPTB4JTA4bHhcbiIsCi0JCQkJCQlwLT5zaXplLCBwLT5mcmFtZXMsCi0JCQkJCQkodW5zaWduZWQgbG9uZylwLT5vZmZzZXRzKTsKLQkJYnJlYWs7Ci0JfQotI2VuZGlmCiAJY2FzZSBWSURJT0NfR19GQlVGOgogCXsKIAkJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKnA9YXJnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL0tjb25maWcKaW5kZXggYTg1OWE2OS4uNDdjZDkzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIFVTQl9aQzAzMDEKIAl0cmlzdGF0ZSAiVVNCIFpDMDMwMVtQXSBJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcCBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX1Y0TDEKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDEKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIGNhbWVyYXMgYmFzZWQgb24gdGhlIFpDMDMwMSBvcgogCSAgWkMwMzAxUCBJbWFnZSBQcm9jZXNzb3JzIGFuZCBDb250cm9sIENoaXBzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L0tjb25maWcKaW5kZXggZmE0ODliMS4uZmI5OWNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9LY29uZmlnCkBAIC0xODk4LDggKzE4OTgsMTIgQEAKICMJR2lnYWJpdCBFdGhlcm5ldAogIwogCi1tZW51ICJFdGhlcm5ldCAoMTAwMCBNYml0KSIKK21lbnVjb25maWcgTkVUREVWXzEwMDAKKwlib29sICJFdGhlcm5ldCAoMTAwMCBNYml0KSIKIAlkZXBlbmRzIG9uICFVTUwKKwlkZWZhdWx0IHkKKworaWYgTkVUREVWXzEwMDAKIAogY29uZmlnIEFDRU5JQwogCXRyaXN0YXRlICJBbHRlb24gQWNlTklDLzNDb20gM0M5ODUvTmV0R2VhciBHQTYyMCBHaWdhYml0IHN1cHBvcnQiCkBAIC0yMjk5LDcgKzIzMDMsNyBAQAogCiBjb25maWcgTVY2NDNYWF9FVEgKIAl0cmlzdGF0ZSAiTVYtNjQzWFggRXRoZXJuZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE1PTUVOQ09fT0NFTE9UX0MgfHwgTU9NRU5DT19KQUdVQVJfQVRYIHx8IE1WNjQzNjAgfHwgTU9NRU5DT19PQ0VMT1RfMyB8fCAoUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDMzIpCisJZGVwZW5kcyBvbiBNT01FTkNPX09DRUxPVF9DIHx8IE1PTUVOQ09fSkFHVUFSX0FUWCB8fCBNVjY0MzYwIHx8IE1WNjRYNjAgfHwgTU9NRU5DT19PQ0VMT1RfMyB8fCAoUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDMzIpCiAJc2VsZWN0IE1JSQogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBnaWdhYml0IEV0aGVybmV0IG9uIHRoZSBNYXJ2ZWxsIE1WNjQzWFgKQEAgLTIzMjYsMTQgKzIzMzAsMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBUaGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBhdGwxLgogCi1lbmRtZW51CitlbmRpZiAjIE5FVERFVl8xMDAwCiAKICMKICMJMTAgR2lnYWJpdCBFdGhlcm5ldAogIwogCi1tZW51ICJFdGhlcm5ldCAoMTAwMDAgTWJpdCkiCittZW51Y29uZmlnIE5FVERFVl8xMDAwMAorCWJvb2wgIkV0aGVybmV0ICgxMDAwMCBNYml0KSIKIAlkZXBlbmRzIG9uICFVTUwKKwlkZWZhdWx0IHkKKworaWYgTkVUREVWXzEwMDAwCiAKIGNvbmZpZyBDSEVMU0lPX1QxCiAgICAgICAgIHRyaXN0YXRlICJDaGVsc2lvIDEwR2IgRXRoZXJuZXQgc3VwcG9ydCIKQEAgLTI1MDcsNyArMjUxNSw3IEBACiAJICBkZWJ1Z19sZXZlbCBtb2R1bGUgcGFyYW1ldGVyICh3aGljaCBjYW4gYWxzbyBiZSBzZXQgYWZ0ZXIKIAkgIHRoZSBkcml2ZXIgaXMgbG9hZGVkIHRocm91Z2ggc3lzZnMpLgogCi1lbmRtZW51CitlbmRpZiAjIE5FVERFVl8xMDAwMAogCiBzb3VyY2UgImRyaXZlcnMvbmV0L3Rva2VucmluZy9LY29uZmlnIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL0tjb25maWcgYi9kcml2ZXJzL25ldC9pcmRhL0tjb25maWcKaW5kZXggN2M4Y2NjMC4uODI5ZGE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvS2NvbmZpZwpAQCAtMTQxLDYgKzE0MSwyMCBAQAogCSAgVG8gYWN0aXZhdGUgc3VwcG9ydCBmb3IgQUNUaVNZUyBJUi0yMDBMIGRvbmdsZSB5b3Ugd2lsbCBoYXZlIHRvCiAJICBzdGFydCBpcmF0dGFjaCBsaWtlIHRoaXM6ICJpcmF0dGFjaCAtZCBhY3QyMDBsIi4KIAorY29uZmlnIEtJTkdTVU5fRE9OR0xFCisJdHJpc3RhdGUgIktpbmdTdW4vRG9uU2hpbmUgRFMtNjIwIElyREEtVVNCIGRvbmdsZSIKKwlkZXBlbmRzIG9uIElSREEgJiYgVVNCICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgS2luZ1N1bi9Eb25TaGluZQorCSAgRFMtNjIwIElyREEtVVNCIGJyaWRnZSBkZXZpY2UgZHJpdmVyLgorCisJICBUaGlzIFVTQiBicmlkZ2UgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgSXJEQS1VU0IgZGV2aWNlIGNsYXNzCisJICBzcGVjaWZpY2F0aW9uLCBhbmQgdGhlcmVmb3JlIG5lZWRzIGl0cyBvd24gc3BlY2lmaWMgZHJpdmVyLiBUaGlzCisJICBkb25nbGUgc3VwcG9ydHMgU0lSIHNwZWVkIG9ubHkgKDk2MDAgYnBzKS4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAga2luZ3N1bi1zaXIuCisKIGNvbW1lbnQgIk9sZCBTSVIgZGV2aWNlIGRyaXZlcnMiCiAKIGNvbmZpZyBJUlBPUlRfU0lSCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvaXJkYS9NYWtlZmlsZQppbmRleCA1YmUwOWYxLi4yMzNhMmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvTWFrZWZpbGUKQEAgLTQ1LDYgKzQ1LDcgQEAKIG9iai0kKENPTkZJR19BQ1QyMDBMX0RPTkdMRSkJKz0gYWN0MjAwbC1zaXIubwogb2JqLSQoQ09ORklHX01BNjAwX0RPTkdMRSkJKz0gbWE2MDAtc2lyLm8KIG9iai0kKENPTkZJR19UT0lNMzIzMl9ET05HTEUpCSs9IHRvaW0zMjMyLXNpci5vCitvYmotJChDT05GSUdfS0lOR1NVTl9ET05HTEUpCSs9IGtpbmdzdW4tc2lyLm8KIAogIyBUaGUgU0lSIGhlbHBlciBtb2R1bGUKIHNpci1kZXYtb2JqcyA6PSBzaXJfZGV2Lm8gc2lyX2RvbmdsZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL2tpbmdzdW4tc2lyLmMgYi9kcml2ZXJzL25ldC9pcmRhL2tpbmdzdW4tc2lyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3NDI5MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEva2luZ3N1bi1zaXIuYwpAQCAtMCwwICsxLDY1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGVuYW1lOiAgICAgIGtpbmdzdW4tc2lyLmMKKyogVmVyc2lvbjogICAgICAgMC4xLjEKKyogRGVzY3JpcHRpb246ICAgSXJkYSBLaW5nU3VuL0RvblNoaW5lIFVTQiBEb25nbGUKKyogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsCisqIEF1dGhvcjogICAgICAgIEFsZXggVmlsbGFj77+9cyBMYXNzbyA8YV92aWxsYWNpc0BwYWxvc2FudG8uY29tPgorKgorKiAgCUJhc2VkIG9uIHN0aXI0MjAwIGFuZCBtY3M3NzgwIGRyaXZlcnMsIHdpdGggKHN0cmFuZ2U/KSBkaWZmZXJlbmNlcworKgorKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorKgorKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhpcyBpcyBteSBjdXJyZW50ICgyMDA3LTA0LTI1KSB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGlzIGRvbmdsZSBpcyBzdXBwb3NlZAorICogdG8gd29yay4gVGhpcyBpcyBiYXNlZCBvbiByZXZlcnNlLWVuZ2luZWVyaW5nIGFuZCBleGFtaW5hdGlvbiBvZiB0aGUgcGFja2V0CisgKiBkYXRhIHNlbnQgYW5kIHJlY2VpdmVkIGJ5IHRoZSBXaW5YUCBkcml2ZXIgdXNpbmcgVVNCU25vb3B5LiBGZWVsIGZyZWUgdG8KKyAqIHVwZGF0ZSBoZXJlIGFzIG1vcmUgb2YgdGhpcyBkb25nbGUgaXMga25vd246CisgKgorICogR2VuZXJhbDogVW5saWtlIHRoZSBvdGhlciBVU0IgSXJEQSBkb25nbGVzLCB0aGlzIHBhcnRpY3VsYXIgZG9uZ2xlIGV4cG9zZXMsCisgKiBub3QgdHdvIGJ1bGsgKGluIGFuZCBvdXQpIGVuZHBvaW50cywgYnV0IHR3byAqaW50ZXJydXB0KiBvbmVzLiBUaGlzIGRvbmdsZSwKKyAqIGxpa2UgdGhlIGJ1bGsgYmFzZWQgb25lcyAoc3RpcjQyMDAuYyBhbmQgbWNzNzc4MC5jKSwgcmVxdWlyZXMgcG9sbGluZyBpbgorICogb3JkZXIgdG8gcmVjZWl2ZSBkYXRhLgorICogVHJhbnNtaXNzaW9uOiBKdXN0IGxpa2Ugc3RpcjQyMDAsIHRoaXMgZG9uZ2xlIHVzZXMgYSByYXcgc3RyZWFtIG9mIGRhdGEsCisgKiB3aGljaCBuZWVkcyB0byBiZSB3cmFwcGVkIGFuZCBlc2NhcGVkIGluIGEgc2ltaWxhciB3YXkgYXMgaW4gc3RpcjQyMDAuYy4KKyAqIFJlY2VwdGlvbjogUG9sbC1iYXNlZCwgYXMgaW4gc3RpcjQyMDAuIEVhY2ggcmVhZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiBhCisgKiA4LWJ5dGUgYnVmZmVyLCBvZiB3aGljaCB0aGUgZmlyc3QgYnl0ZSAoTFNCKSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcworICogKDEtNykgb2YgdmFsaWQgZGF0YSBjb250YWluZWQgd2l0aGluIHRoZSByZW1haW5pbmcgNyBieXRlcy4gRm9yIGV4YW1wbGUsIGlmCisgKiB0aGUgYnVmZmVyIGhhZCB0aGUgZm9sbG93aW5nIGNvbnRlbnRzOgorICogIDA2IGZmIGZmIGZmIGMwIDAxIDA0IGFhCisgKiBUaGlzIG1lYW5zIHRoYXQgKDA2KSB0aGVyZSBhcmUgNiBieXRlcyBvZiB2YWxpZCBkYXRhLiBUaGUgYnl0ZSAweGFhIGF0IHRoZQorICogZW5kIGlzIGdhcmJhZ2UgKGxlZnQgb3ZlciBmcm9tIGEgcHJldmlvdXMgcmVjZXB0aW9uKSBhbmQgaXMgZGlzY2FyZGVkLgorICogSWYgYSByZWFkIHJldHVybnMgYW4gImltcG9zc2libGUiIHZhbHVlIGFzIHRoZSBsZW5ndGggb2YgdmFsaWQgZGF0YSAoc3VjaCBhcworICogMHgzNikgaW4gdGhlIGZpcnN0IGJ5dGUsIHRoZW4gdGhlIGJ1ZmZlciBpcyB1bmluaXRpYWxpemVkIChhcyBpcyB0aGUgY2FzZSBvZgorICogZmlyc3QgcGx1Zy1pbikgYW5kIGl0cyBjb250ZW50cyBzaG91bGQgYmUgZGlzY2FyZGVkLiBUaGVyZSBpcyBjdXJyZW50bHkgbm8KKyAqIGV2aWRlbmNlIHRoYXQgdGhlIHRvcCA1IGJpdHMgb2YgdGhlIDFzdCBieXRlIG9mIHRoZSBidWZmZXIgY2FuIGhhdmUgdmFsdWVzCisgKiBvdGhlciB0aGFuIDAgb25jZSByZWNlcHRpb24gYmVnaW5zLgorICogT25jZSB2YWxpZCBieXRlcyBhcmUgY29sbGVjdGVkLCB0aGUgYXNzZW1ibGVkIHN0cmVhbSBpcyBhIHNlcXVlbmNlIG9mCisgKiB3cmFwcGVkIElyREEgZnJhbWVzIHRoYXQgaXMgdW53cmFwcGVkIGFuZCB1bmVzY2FwZWQgYXMgaW4gc3RpcjQyMDAuYy4KKyAqIEJJRyBGQVQgV0FSTklORzogdGhlIGRvbmdsZSBkb2VzICpub3QqIHJlc2V0IHRoZSBSWCBidWZmZXIgaW4gYW55IHdheSBhZnRlcgorICogYSBzdWNjZXNzZnVsIHJlYWQgZnJvbSB0aGUgaG9zdCwgd2hpY2ggbWVhbnMgdGhhdCBpbiBhYnNlbmNlIG9mIGZ1cnRoZXIKKyAqIHJlY2VwdGlvbiwgcmVwZWF0ZWQgcmVhZHMgZnJvbSB0aGUgZG9uZ2xlIHdpbGwgcmV0dXJuIHRoZSBleGFjdCBzYW1lCisgKiBjb250ZW50cyByZXBlYXRlZGx5LiBBdHRlbXB0cyB0byBiZSBzbWFydCBhbmQgY2FjaGUgYSBwcmV2aW91cyByZWFkIHNlZW0KKyAqIHRvIHJlc3VsdCBpbiBjb3JydXB0ZWQgcGFja2V0cywgc28gdGhpcyBkcml2ZXIgZGVwZW5kcyBvbiB0aGUgdW53cmFwIGxvZ2ljCisgKiB0byBzb3J0IG91dCBhbnkgcmVwZWF0ZWQgcmVhZHMuCisgKiBTcGVlZCBjaGFuZ2U6IG5vIGNvbW1hbmRzIG9ic2VydmVkIHNvIGZhciB0byBjaGFuZ2Ugc3BlZWQsIGFzc3VtZWQgZml4ZWQKKyAqIDk2MDBicHMgKFNJUikuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvd3JhcHBlci5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2NyYy5oPgorCisvKgorICogQWNjb3JkaW5nIHRvIGxzdXNiLCAweDA3YzAgaXMgYXNzaWduZWQgdG8KKyAqICJDb2RlIE1lcmNlbmFyaWVzIEhhcmQtIHVuZCBTb2Z0d2FyZSBHbWJIIgorICovCisjZGVmaW5lIEtJTkdfVkVORE9SX0lEIDB4MDdjMAorI2RlZmluZSBLSU5HX1BST0RVQ1RfSUQgMHg0MjAwCisKKy8qIFRoZXNlIGFyZSB0aGUgY3VycmVudGx5IGtub3duIFVTQiBpZHMgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkb25nbGVzW10gPSB7CisgICAgLyogS2luZ1N1biBDbyxMdGQgIElyREEvVVNCIEJyaWRnZSAqLworICAgIHsgVVNCX0RFVklDRShLSU5HX1ZFTkRPUl9JRCwgS0lOR19QUk9EVUNUX0lEKSB9LAorICAgIHsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRvbmdsZXMpOworCisjZGVmaW5lIEtJTkdTVU5fTVRUIDB4MDcKKworI2RlZmluZSBLSU5HU1VOX0ZJRk9fU0laRQkJNDA5NgorI2RlZmluZSBLSU5HU1VOX0VQX0lOCQkJMAorI2RlZmluZSBLSU5HU1VOX0VQX09VVAkJCTEKKworc3RydWN0IGtpbmdzdW5fY2IgeworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7ICAgICAgLyogaW5pdDogcHJvYmVfaXJkYSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7ICAgICAgLyogbmV0d29yayBsYXllciAqLworCXN0cnVjdCBpcmxhcF9jYiAgICppcmxhcDsgICAgICAgLyogVGhlIGxpbmsgbGF5ZXIgd2UgYXJlIGJpbmRlZCB0byAqLworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwkvKiBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgcW9zX2luZm8gICBxb3M7CisKKwlfX3U4CQkgICppbl9idWY7CS8qIHJlY2VpdmUgYnVmZmVyICovCisJX191OAkJICAqb3V0X2J1ZjsJLyogdHJhbnNtaXQgYnVmZmVyICovCisJX191OAkJICBtYXhfcng7CS8qIG1heC4gYXRvbWljIHJlYWQgZnJvbSBkb25nbGUKKwkJCQkJICAgKHVzdWFsbHkgOCksIGFsc28gc2l6ZSBvZiBpbl9idWYgKi8KKwlfX3U4CQkgIG1heF90eDsJLyogbWF4LiBhdG9taWMgd3JpdGUgdG8gZG9uZ2xlCisJCQkJCSAgICh1c3VhbGx5IDgpICovCisKKwlpb2J1ZmZfdCAgCSAgcnhfYnVmZjsJLyogcmVjZWl2ZSB1bndyYXAgc3RhdGUgbWFjaGluZSAqLworCXN0cnVjdCB0aW1ldmFsCSAgcnhfdGltZTsKKwlzcGlubG9ja190IGxvY2s7CisJaW50IHJlY2VpdmluZzsKKworCV9fdTggZXBfaW47CisJX191OCBlcF9vdXQ7CisKKwlzdHJ1Y3QgdXJiCSAqdHhfdXJiOworCXN0cnVjdCB1cmIJICpyeF91cmI7Cit9OworCisvKiBDYWxsYmFjayB0cmFuc21pc3Npb24gcm91dGluZSAqLworc3RhdGljIHZvaWQga2luZ3N1bl9zZW5kX2lycShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IGtpbmdzdW5fY2IgKmtpbmdzdW4gPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGtpbmdzdW4tPm5ldGRldjsKKworCS8qIGluIHByb2Nlc3Mgb2Ygc3RvcHBpbmcsIGp1c3QgZHJvcCBkYXRhICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGtpbmdzdW4tPm5ldGRldikpIHsKKwkJZXJyKCJraW5nc3VuX3NlbmRfaXJxOiBOZXR3b3JrIG5vdCBydW5uaW5nISIpOworCQlyZXR1cm47CisJfQorCisJLyogdW5saW5rLCBzaHV0ZG93biwgdW5wbHVnLCBvdGhlciBuYXN0aWVzICovCisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwkJZXJyKCJraW5nc3VuX3NlbmRfaXJxOiB1cmIgYXN5bmNocm9ub3VzbHkgZmFpbGVkIC0gJWQiLAorCQkgICAgdXJiLT5zdGF0dXMpOworCX0KKwluZXRpZl93YWtlX3F1ZXVlKG5ldGRldik7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBuZXQvY29yZSB3aGVuIG5ldyBmcmFtZSBpcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpbnQga2luZ3N1bl9oYXJkX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3Qga2luZ3N1bl9jYiAqa2luZ3N1bjsKKwlpbnQgd3JhcGxlbjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChza2IgPT0gTlVMTCB8fCBuZXRkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkvKiB0aGUgSVJEQSB3cmFwcGluZyByb3V0aW5lcyBkb24ndCBkZWFsIHdpdGggbm9uIGxpbmVhciBza2IgKi8KKwlTS0JfTElORUFSX0FTU0VSVChza2IpOworCisJa2luZ3N1biA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlzcGluX2xvY2soJmtpbmdzdW4tPmxvY2spOworCisJLyogQXBwZW5kIGRhdGEgdG8gdGhlIGVuZCBvZiB3aGF0ZXZlciBkYXRhIHJlbWFpbnMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KKwl3cmFwbGVuID0gYXN5bmNfd3JhcF9za2Ioc2tiLAorCQlraW5nc3VuLT5vdXRfYnVmLAorCQlLSU5HU1VOX0ZJRk9fU0laRSk7CisKKwkvKiBDYWxjdWxhdGUgaG93IG11Y2ggZGF0YSBjYW4gYmUgdHJhbnNtaXR0ZWQgaW4gdGhpcyB1cmIgKi8KKwl1c2JfZmlsbF9pbnRfdXJiKGtpbmdzdW4tPnR4X3VyYiwga2luZ3N1bi0+dXNiZGV2LAorCQl1c2Jfc25kaW50cGlwZShraW5nc3VuLT51c2JkZXYsIGtpbmdzdW4tPmVwX291dCksCisJCWtpbmdzdW4tPm91dF9idWYsIHdyYXBsZW4sIGtpbmdzdW5fc2VuZF9pcnEsCisJCWtpbmdzdW4sIDEpOworCisJaWYgKChyZXQgPSB1c2Jfc3VibWl0X3VyYihraW5nc3VuLT50eF91cmIsIEdGUF9BVE9NSUMpKSkgeworCQllcnIoImtpbmdzdW5faGFyZF94bWl0OiBmYWlsZWQgdHhfdXJiIHN1Ym1pdDogJWQiLCByZXQpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIC1FTk9ERVY6CisJCWNhc2UgLUVQSVBFOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlraW5nc3VuLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisJCX0KKwl9IGVsc2UgeworCQlraW5nc3VuLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCWtpbmdzdW4tPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOworCX0KKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlzcGluX3VubG9jaygma2luZ3N1bi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZWNlaXZlIGNhbGxiYWNrIGZ1bmN0aW9uICovCitzdGF0aWMgdm9pZCBraW5nc3VuX3Jjdl9pcnEoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBraW5nc3VuX2NiICpraW5nc3VuID0gdXJiLT5jb250ZXh0OworCWludCByZXQ7CisKKwkvKiBpbiBwcm9jZXNzIG9mIHN0b3BwaW5nLCBqdXN0IGRyb3AgZGF0YSAqLworCWlmICghbmV0aWZfcnVubmluZyhraW5nc3VuLT5uZXRkZXYpKSB7CisJCWtpbmdzdW4tPnJlY2VpdmluZyA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKiB1bmxpbmssIHNodXRkb3duLCB1bnBsdWcsIG90aGVyIG5hc3RpZXMgKi8KKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCQllcnIoImtpbmdzdW5fcmN2X2lycTogdXJiIGFzeW5jaHJvbm91c2x5IGZhaWxlZCAtICVkIiwKKwkJICAgIHVyYi0+c3RhdHVzKTsKKwkJa2luZ3N1bi0+cmVjZWl2aW5nID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPT0ga2luZ3N1bi0+bWF4X3J4KSB7CisJCV9fdTggKmJ5dGVzID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJCWludCBpOworCisJCS8qIFRoZSB2ZXJ5IGZpcnN0IGJ5dGUgaW4gdGhlIGJ1ZmZlciBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZgorCQkgICB2YWxpZCBkYXRhIGluIHRoZSByZWFkLiBUaGlzIGJ5dGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UKKwkJICAgMS4ua2luZ3N1bi0+bWF4X3J4IC0xIC4gVmFsdWVzIG91dHNpZGUgdGhpcyByYW5nZSBpbmRpY2F0ZQorCQkgICBhbiB1bmluaXRpYWxpemVkIFJ4IGJ1ZmZlciB3aGVuIHRoZSBkb25nbGUgaGFzIGp1c3QgYmVlbgorCQkgICBwbHVnZ2VkIGluLiAqLworCQlpZiAoYnl0ZXNbMF0gPj0gMSAmJiBieXRlc1swXSA8IGtpbmdzdW4tPm1heF9yeCkgeworCQkJZm9yIChpID0gMTsgaSA8PSBieXRlc1swXTsgaSsrKSB7CisJCQkJYXN5bmNfdW53cmFwX2NoYXIoa2luZ3N1bi0+bmV0ZGV2LAorCQkJCQkJICAma2luZ3N1bi0+c3RhdHMsCisJCQkJCQkgICZraW5nc3VuLT5yeF9idWZmLCBieXRlc1tpXSk7CisJCQl9CisJCQlraW5nc3VuLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQkJZG9fZ2V0dGltZW9mZGF5KCZraW5nc3VuLT5yeF90aW1lKTsKKwkJCWtpbmdzdW4tPnJlY2VpdmluZyA9CisJCQkJKGtpbmdzdW4tPnJ4X2J1ZmYuc3RhdGUgIT0gT1VUU0lERV9GUkFNRSkKKwkJCQk/IDEgOiAwOworCQl9CisJfSBlbHNlIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7CisJCWVycigiJXMoKTogVW5leHBlY3RlZCByZXNwb25zZSBsZW5ndGgsIGV4cGVjdGVkICVkIGdvdCAlZCIsCisJCSAgICBfX0ZVTkNUSU9OX18sIGtpbmdzdW4tPm1heF9yeCwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwl9CisJLyogVGhpcyB1cmIgaGFzIGFscmVhZHkgYmVlbiBmaWxsZWQgaW4ga2luZ3N1bl9uZXRfb3BlbiAqLworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBraW5nc3VuX25ldF9vcGVuIChkZXYpCisgKgorICogICAgTmV0d29yayBkZXZpY2UgaXMgdGFrZW4gdXAuIFVzdWFsbHkgdGhpcyBpcyBkb25lIGJ5ICJpZmNvbmZpZyBpcmRhMCB1cCIKKyAqLworc3RhdGljIGludCBraW5nc3VuX25ldF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGtpbmdzdW5fY2IgKmtpbmdzdW4gPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnIgPSAtRU5PTUVNOworCWNoYXIgaHduYW1lWzE2XTsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHVyYnMgYXJlIE5VTEwsIGFuZCBza2IgaXMgTlVMTCAoc2VlIGtpbmdzdW5fcHJvYmUpICovCisJa2luZ3N1bi0+cmVjZWl2aW5nID0gMDsKKworCS8qIEluaXRpYWxpemUgZm9yIFNJUiB0byBjb3B5IGRhdGEgZGlyZWN0bHkgaW50byBza2IuICAqLworCWtpbmdzdW4tPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlraW5nc3VuLT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwlraW5nc3VuLT5yeF9idWZmLnRydWVzaXplID0gSVJEQV9TS0JfTUFYX01UVTsKKwlraW5nc3VuLT5yeF9idWZmLnNrYiA9IGRldl9hbGxvY19za2IoSVJEQV9TS0JfTUFYX01UVSk7CisJaWYgKCFraW5nc3VuLT5yeF9idWZmLnNrYikKKwkJZ290byBmcmVlX21lbTsKKworCXNrYl9yZXNlcnZlKGtpbmdzdW4tPnJ4X2J1ZmYuc2tiLCAxKTsKKwlraW5nc3VuLT5yeF9idWZmLmhlYWQgPSBraW5nc3VuLT5yeF9idWZmLnNrYi0+ZGF0YTsKKwlkb19nZXR0aW1lb2ZkYXkoJmtpbmdzdW4tPnJ4X3RpbWUpOworCisJa2luZ3N1bi0+cnhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtpbmdzdW4tPnJ4X3VyYikKKwkJZ290byBmcmVlX21lbTsKKworCWtpbmdzdW4tPnR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFraW5nc3VuLT50eF91cmIpCisJCWdvdG8gZnJlZV9tZW07CisKKwkvKgorCSAqIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIGluaXRpYWxpemVkIHByb3Blcmx5LAorCSAqIE9wZW4gbmV3IElyTEFQIGxheWVyIGluc3RhbmNlIHRvIHRha2UgY2FyZSBvZiB1cy4uLgorCSAqLworCXNwcmludGYoaHduYW1lLCAidXNiIyVkIiwga2luZ3N1bi0+dXNiZGV2LT5kZXZudW0pOworCWtpbmdzdW4tPmlybGFwID0gaXJsYXBfb3BlbihuZXRkZXYsICZraW5nc3VuLT5xb3MsIGh3bmFtZSk7CisJaWYgKCFraW5nc3VuLT5pcmxhcCkgeworCQllcnIoImtpbmdzdW4tc2lyOiBpcmxhcF9vcGVuIGZhaWxlZCIpOworCQlnb3RvIGZyZWVfbWVtOworCX0KKworCS8qIFN0YXJ0IGZpcnN0IHJlY2VwdGlvbiAqLworCXVzYl9maWxsX2ludF91cmIoa2luZ3N1bi0+cnhfdXJiLCBraW5nc3VuLT51c2JkZXYsCisJCQkgIHVzYl9yY3ZpbnRwaXBlKGtpbmdzdW4tPnVzYmRldiwga2luZ3N1bi0+ZXBfaW4pLAorCQkJICBraW5nc3VuLT5pbl9idWYsIGtpbmdzdW4tPm1heF9yeCwKKwkJCSAga2luZ3N1bl9yY3ZfaXJxLCBraW5nc3VuLCAxKTsKKwlraW5nc3VuLT5yeF91cmItPnN0YXR1cyA9IDA7CisJZXJyID0gdXNiX3N1Ym1pdF91cmIoa2luZ3N1bi0+cnhfdXJiLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXJyKSB7CisJCWVycigia2luZ3N1bi1zaXI6IGZpcnN0IHVyYi1zdWJtaXQgZmFpbGVkOiAlZCIsIGVycik7CisJCWdvdG8gY2xvc2VfaXJsYXA7CisJfQorCisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKworCS8qIFNpdHVhdGlvbiBhdCB0aGlzIHBvaW50OgorCSAgIC0gYWxsIHdvcmsgYnVmZmVycyBhbGxvY2F0ZWQKKwkgICAtIHVyYnMgYWxsb2NhdGVkIGFuZCByZWFkeSB0byBmaWxsCisJICAgLSBtYXggcnggcGFja2V0IGtub3duIChpbiBtYXhfcngpCisJICAgLSB1bndyYXAgc3RhdGUgbWFjaGluZSBpbml0aWFsaXplZCwgaW4gc3RhdGUgb3V0c2lkZSBvZiBhbnkgZnJhbWUKKwkgICAtIHJlY2VpdmUgcmVxdWVzdCBpbiBwcm9ncmVzcworCSAgIC0gSXJMQVAgbGF5ZXIgc3RhcnRlZCwgYWJvdXQgdG8gaGFuZCBvdmVyIHBhY2tldHMgdG8gc2VuZAorCSAqLworCisJcmV0dXJuIDA7CisKKyBjbG9zZV9pcmxhcDoKKwlpcmxhcF9jbG9zZShraW5nc3VuLT5pcmxhcCk7CisgZnJlZV9tZW06CisJaWYgKGtpbmdzdW4tPnR4X3VyYikgeworCQl1c2JfZnJlZV91cmIoa2luZ3N1bi0+dHhfdXJiKTsKKwkJa2luZ3N1bi0+dHhfdXJiID0gTlVMTDsKKwl9CisJaWYgKGtpbmdzdW4tPnJ4X3VyYikgeworCQl1c2JfZnJlZV91cmIoa2luZ3N1bi0+cnhfdXJiKTsKKwkJa2luZ3N1bi0+cnhfdXJiID0gTlVMTDsKKwl9CisJaWYgKGtpbmdzdW4tPnJ4X2J1ZmYuc2tiKSB7CisJCWtmcmVlX3NrYihraW5nc3VuLT5yeF9idWZmLnNrYik7CisJCWtpbmdzdW4tPnJ4X2J1ZmYuc2tiID0gTlVMTDsKKwkJa2luZ3N1bi0+cnhfYnVmZi5oZWFkID0gTlVMTDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGtpbmdzdW5fbmV0X2Nsb3NlIChraW5nc3VuKQorICoKKyAqICAgIE5ldHdvcmsgZGV2aWNlIGlzIHRha2VuIGRvd24uIFVzdWFsbHkgdGhpcyBpcyBkb25lIGJ5CisgKiAgICAiaWZjb25maWcgaXJkYTAgZG93biIKKyAqLworc3RhdGljIGludCBraW5nc3VuX25ldF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBraW5nc3VuX2NiICpraW5nc3VuID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFN0b3AgdHJhbnNtaXQgcHJvY2Vzc2luZyAqLworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKworCS8qIE1vcCB1cCByZWNlaXZlICYmIHRyYW5zbWl0IHVyYidzICovCisJdXNiX2tpbGxfdXJiKGtpbmdzdW4tPnR4X3VyYik7CisJdXNiX2tpbGxfdXJiKGtpbmdzdW4tPnJ4X3VyYik7CisKKwl1c2JfZnJlZV91cmIoa2luZ3N1bi0+dHhfdXJiKTsKKwl1c2JfZnJlZV91cmIoa2luZ3N1bi0+cnhfdXJiKTsKKworCWtpbmdzdW4tPnR4X3VyYiA9IE5VTEw7CisJa2luZ3N1bi0+cnhfdXJiID0gTlVMTDsKKworCWtmcmVlX3NrYihraW5nc3VuLT5yeF9idWZmLnNrYik7CisJa2luZ3N1bi0+cnhfYnVmZi5za2IgPSBOVUxMOworCWtpbmdzdW4tPnJ4X2J1ZmYuaGVhZCA9IE5VTEw7CisJa2luZ3N1bi0+cnhfYnVmZi5pbl9mcmFtZSA9IEZBTFNFOworCWtpbmdzdW4tPnJ4X2J1ZmYuc3RhdGUgPSBPVVRTSURFX0ZSQU1FOworCWtpbmdzdW4tPnJlY2VpdmluZyA9IDA7CisKKwkvKiBTdG9wIGFuZCByZW1vdmUgaW5zdGFuY2Ugb2YgSXJMQVAgKi8KKwlpZiAoa2luZ3N1bi0+aXJsYXApCisJCWlybGFwX2Nsb3NlKGtpbmdzdW4tPmlybGFwKTsKKworCWtpbmdzdW4tPmlybGFwID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKgorICogSU9DVExzIDogRXh0cmEgb3V0LW9mLWJhbmQgbmV0d29yayBjb21tYW5kcy4uLgorICovCitzdGF0aWMgaW50IGtpbmdzdW5fbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqcnEsCisJCQkgICAgIGludCBjbWQpCit7CisJc3RydWN0IGlmX2lyZGFfcmVxICppcnEgPSAoc3RydWN0IGlmX2lyZGFfcmVxICopIHJxOworCXN0cnVjdCBraW5nc3VuX2NiICpraW5nc3VuID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTSU9DU0JBTkRXSURUSDogLyogU2V0IGJhbmR3aWR0aCAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCS8qIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgc3RpbGwgdGhlcmUgKi8KKwkJaWYgKG5ldGlmX2RldmljZV9wcmVzZW50KGtpbmdzdW4tPm5ldGRldikpCisJCQkvKiBObyBvYnNlcnZlZCBjb21tYW5kcyBmb3Igc3BlZWQgY2hhbmdlICovCisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisKKwljYXNlIFNJT0NTTUVESUFCVVNZOiAvKiBTZXQgbWVkaWEgYnVzeSAqLworCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCS8qIENoZWNrIGlmIHRoZSBJckRBIHN0YWNrIGlzIHN0aWxsIHRoZXJlICovCisJCWlmIChuZXRpZl9ydW5uaW5nKGtpbmdzdW4tPm5ldGRldikpCisJCQlpcmRhX2RldmljZV9zZXRfbWVkaWFfYnVzeShraW5nc3VuLT5uZXRkZXYsIFRSVUUpOworCQlicmVhazsKKworCWNhc2UgU0lPQ0dSRUNFSVZJTkc6CisJCS8qIE9ubHkgYXBwcm94aW1hdGVseSB0cnVlICovCisJCWlycS0+aWZyX3JlY2VpdmluZyA9IGtpbmdzdW4tPnJlY2VpdmluZzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogR2V0IGRldmljZSBzdGF0cyAoZm9yIC9wcm9jL25ldC9kZXYgYW5kIGlmY29uZmlnKQorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKgora2luZ3N1bl9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGtpbmdzdW5fY2IgKmtpbmdzdW4gPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXJldHVybiAma2luZ3N1bi0+c3RhdHM7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBVU0Igc3Vic3lzdGVtIGZvciBlYWNoIG5ldyBkZXZpY2UKKyAqIGluIHRoZSBzeXN0ZW0uIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGRldmljZSBpcyBvdXJzLCBhbmQgaW4KKyAqIHRoaXMgY2FzZSBzdGFydCBoYW5kbGluZyBpdC4KKyAqLworc3RhdGljIGludCBraW5nc3VuX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3Qga2luZ3N1bl9jYiAqa2luZ3N1biA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IE5VTEw7CisJaW50IHJldCA9IC1FTk9NRU07CisJaW50IHBpcGUsIG1heHBfaW4sIG1heHBfb3V0OworCV9fdTggZXBfaW47CisJX191OCBlcF9vdXQ7CisKKwkvKiBDaGVjayB0aGF0IHRoZXJlIHJlYWxseSBhcmUgdHdvIGludGVycnVwdCBlbmRwb2ludHMuCisJICAgQ2hlY2sgYmFzZWQgb24gdGhlIG9uZSBpbiBkcml2ZXJzL3VzYi9pbnB1dC91c2Jtb3VzZS5jCisJICovCisJaW50ZXJmYWNlID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisJaWYgKGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDIpIHsKKwkJZXJyKCJraW5nc3VuLXNpcjogZXhwZWN0ZWQgMiBlbmRwb2ludHMsIGZvdW5kICVkIiwKKwkJICAgIGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbS0lOR1NVTl9FUF9JTl0uZGVzYzsKKwlpZiAoIXVzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKSB7CisJCWVycigia2luZ3N1bi1zaXI6IGVuZHBvaW50IDAgaXMgbm90IGludGVycnVwdCBJTiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcF9pbiA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOworCXBpcGUgPSB1c2JfcmN2aW50cGlwZShkZXYsIGVwX2luKTsKKwltYXhwX2luID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKwlpZiAobWF4cF9pbiA+IDI1NSB8fCBtYXhwX2luIDw9IDEpIHsKKwkJZXJyKCIlczogZW5kcG9pbnQgMCBoYXMgbWF4IHBhY2tldCBzaXplICVkIG5vdCBpbiByYW5nZSIsCisJCSAgICBfX0ZJTEVfXywgbWF4cF9pbik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbS0lOR1NVTl9FUF9PVVRdLmRlc2M7CisJaWYgKCF1c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpIHsKKwkJZXJyKCJraW5nc3VuLXNpcjogZW5kcG9pbnQgMSBpcyBub3QgaW50ZXJydXB0IE9VVCIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcF9vdXQgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKwlwaXBlID0gdXNiX3NuZGludHBpcGUoZGV2LCBlcF9vdXQpOworCW1heHBfb3V0ID0gdXNiX21heHBhY2tldChkZXYsIHBpcGUsIHVzYl9waXBlb3V0KHBpcGUpKTsKKworCS8qIEFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlIGNvbnRhaW5lci4gKi8KKwluZXQgPSBhbGxvY19pcmRhZGV2KHNpemVvZigqa2luZ3N1bikpOworCWlmKCFuZXQpCisJCWdvdG8gZXJyX291dDE7CisKKwlTRVRfTU9EVUxFX09XTkVSKG5ldCk7CisJU0VUX05FVERFVl9ERVYobmV0LCAmaW50Zi0+ZGV2KTsKKwlraW5nc3VuID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlraW5nc3VuLT5pcmxhcCA9IE5VTEw7CisJa2luZ3N1bi0+dHhfdXJiID0gTlVMTDsKKwlraW5nc3VuLT5yeF91cmIgPSBOVUxMOworCWtpbmdzdW4tPmVwX2luID0gZXBfaW47CisJa2luZ3N1bi0+ZXBfb3V0ID0gZXBfb3V0OworCWtpbmdzdW4tPmluX2J1ZiA9IE5VTEw7CisJa2luZ3N1bi0+b3V0X2J1ZiA9IE5VTEw7CisJa2luZ3N1bi0+bWF4X3J4ID0gKF9fdTgpbWF4cF9pbjsKKwlraW5nc3VuLT5tYXhfdHggPSAoX191OCltYXhwX291dDsKKwlraW5nc3VuLT5uZXRkZXYgPSBuZXQ7CisJa2luZ3N1bi0+dXNiZGV2ID0gZGV2OworCWtpbmdzdW4tPnJ4X2J1ZmYuaW5fZnJhbWUgPSBGQUxTRTsKKwlraW5nc3VuLT5yeF9idWZmLnN0YXRlID0gT1VUU0lERV9GUkFNRTsKKwlraW5nc3VuLT5yeF9idWZmLnNrYiA9IE5VTEw7CisJa2luZ3N1bi0+cmVjZWl2aW5nID0gMDsKKwlzcGluX2xvY2tfaW5pdCgma2luZ3N1bi0+bG9jayk7CisKKwkvKiBBbGxvY2F0ZSBpbnB1dCBidWZmZXIgKi8KKwlraW5nc3VuLT5pbl9idWYgPSAoX191OCAqKWttYWxsb2Moa2luZ3N1bi0+bWF4X3J4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtpbmdzdW4tPmluX2J1ZikKKwkJZ290byBmcmVlX21lbTsKKworCS8qIEFsbG9jYXRlIG91dHB1dCBidWZmZXIgKi8KKwlraW5nc3VuLT5vdXRfYnVmID0gKF9fdTggKilrbWFsbG9jKEtJTkdTVU5fRklGT19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtpbmdzdW4tPm91dF9idWYpCisJCWdvdG8gZnJlZV9tZW07CisKKwlwcmludGsoS0VSTl9JTkZPICJLaW5nU3VuL0RvblNoaW5lIElSREEvVVNCIGZvdW5kIGF0IGFkZHJlc3MgJWQsICIKKwkJIlZlbmRvcjogJXgsIFByb2R1Y3Q6ICV4XG4iLAorCSAgICAgICBkZXYtPmRldm51bSwgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkgICAgICAgbGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOworCisJLyogSW5pdGlhbGl6ZSBRb1MgZm9yIHRoaXMgZGV2aWNlICovCisJaXJkYV9pbml0X21heF9xb3NfY2FwYWJpbGllcygma2luZ3N1bi0+cW9zKTsKKworCS8qIFRoYXQncyB0aGUgUnggY2FwYWJpbGl0eS4gKi8KKwlraW5nc3VuLT5xb3MuYmF1ZF9yYXRlLmJpdHMgICAgICAgJj0gSVJfOTYwMDsKKwlraW5nc3VuLT5xb3MubWluX3R1cm5fdGltZS5iaXRzICAgJj0gS0lOR1NVTl9NVFQ7CisJaXJkYV9xb3NfYml0c190b192YWx1ZSgma2luZ3N1bi0+cW9zKTsKKworCS8qIE92ZXJyaWRlIHRoZSBuZXR3b3JrIGZ1bmN0aW9ucyB3ZSBuZWVkIHRvIHVzZSAqLworCW5ldC0+aGFyZF9zdGFydF94bWl0ID0ga2luZ3N1bl9oYXJkX3htaXQ7CisJbmV0LT5vcGVuICAgICAgICAgICAgPSBraW5nc3VuX25ldF9vcGVuOworCW5ldC0+c3RvcCAgICAgICAgICAgID0ga2luZ3N1bl9uZXRfY2xvc2U7CisJbmV0LT5nZXRfc3RhdHMJICAgICA9IGtpbmdzdW5fbmV0X2dldF9zdGF0czsKKwluZXQtPmRvX2lvY3RsICAgICAgICA9IGtpbmdzdW5fbmV0X2lvY3RsOworCisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldCk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGZyZWVfbWVtOworCisJaW5mbygiSXJEQTogUmVnaXN0ZXJlZCBLaW5nU3VuL0RvblNoaW5lIGRldmljZSAlcyIsIG5ldC0+bmFtZSk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGtpbmdzdW4pOworCisJLyogU2l0dWF0aW9uIGF0IHRoaXMgcG9pbnQ6CisJICAgLSBhbGwgd29yayBidWZmZXJzIGFsbG9jYXRlZAorCSAgIC0gdXJicyBub3QgYWxsb2NhdGVkLCBzZXQgdG8gTlVMTAorCSAgIC0gbWF4IHJ4IHBhY2tldCBrbm93biAoaW4gbWF4X3J4KQorCSAgIC0gdW53cmFwIHN0YXRlIG1hY2hpbmUgKHBhcnRpYWxseSkgaW5pdGlhbGl6ZWQsIGJ1dCBza2IgPT0gTlVMTAorCSAqLworCisJcmV0dXJuIDA7CisKK2ZyZWVfbWVtOgorCWlmIChraW5nc3VuLT5vdXRfYnVmKSBrZnJlZShraW5nc3VuLT5vdXRfYnVmKTsKKwlpZiAoa2luZ3N1bi0+aW5fYnVmKSBrZnJlZShraW5nc3VuLT5pbl9idWYpOworCWZyZWVfbmV0ZGV2KG5ldCk7CitlcnJfb3V0MToKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhlIGN1cnJlbnQgZGV2aWNlIGlzIHJlbW92ZWQsIHRoZSBVU0IgbGF5ZXIgdGVsbCB1cyB0byBzaHV0IGl0IGRvd24uLi4KKyAqLworc3RhdGljIHZvaWQga2luZ3N1bl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCBraW5nc3VuX2NiICpraW5nc3VuID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCWlmICgha2luZ3N1bikKKwkJcmV0dXJuOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoa2luZ3N1bi0+bmV0ZGV2KTsKKworCS8qIE1vcCB1cCByZWNlaXZlICYmIHRyYW5zbWl0IHVyYidzICovCisJaWYgKGtpbmdzdW4tPnR4X3VyYiAhPSBOVUxMKSB7CisJCXVzYl9raWxsX3VyYihraW5nc3VuLT50eF91cmIpOworCQl1c2JfZnJlZV91cmIoa2luZ3N1bi0+dHhfdXJiKTsKKwkJa2luZ3N1bi0+dHhfdXJiID0gTlVMTDsKKwl9CisJaWYgKGtpbmdzdW4tPnJ4X3VyYiAhPSBOVUxMKSB7CisJCXVzYl9raWxsX3VyYihraW5nc3VuLT5yeF91cmIpOworCQl1c2JfZnJlZV91cmIoa2luZ3N1bi0+cnhfdXJiKTsKKwkJa2luZ3N1bi0+cnhfdXJiID0gTlVMTDsKKwl9CisKKwlrZnJlZShraW5nc3VuLT5vdXRfYnVmKTsKKwlrZnJlZShraW5nc3VuLT5pbl9idWYpOworCWZyZWVfbmV0ZGV2KGtpbmdzdW4tPm5ldGRldik7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisvKiBVU0Igc3VzcGVuZCwgc28gcG93ZXIgb2ZmIHRoZSB0cmFuc21pdHRlci9yZWNlaXZlciAqLworc3RhdGljIGludCBraW5nc3VuX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCXN0cnVjdCBraW5nc3VuX2NiICpraW5nc3VuID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCW5ldGlmX2RldmljZV9kZXRhY2goa2luZ3N1bi0+bmV0ZGV2KTsKKwlpZiAoa2luZ3N1bi0+dHhfdXJiICE9IE5VTEwpIHVzYl9raWxsX3VyYihraW5nc3VuLT50eF91cmIpOworCWlmIChraW5nc3VuLT5yeF91cmIgIT0gTlVMTCkgdXNiX2tpbGxfdXJiKGtpbmdzdW4tPnJ4X3VyYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENvbWluZyBvdXQgb2Ygc3VzcGVuZCwgc28gcmVzZXQgaGFyZHdhcmUgKi8KK3N0YXRpYyBpbnQga2luZ3N1bl9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IGtpbmdzdW5fY2IgKmtpbmdzdW4gPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCisJaWYgKGtpbmdzdW4tPnJ4X3VyYiAhPSBOVUxMKQorCQl1c2Jfc3VibWl0X3VyYihraW5nc3VuLT5yeF91cmIsIEdGUF9LRVJORUwpOworCW5ldGlmX2RldmljZV9hdHRhY2goa2luZ3N1bi0+bmV0ZGV2KTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiBVU0IgZGV2aWNlIGNhbGxiYWNrcworICovCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgaXJkYV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImtpbmdzdW4tc2lyIiwKKwkucHJvYmUJCT0ga2luZ3N1bl9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IGtpbmdzdW5fZGlzY29ubmVjdCwKKwkuaWRfdGFibGUJPSBkb25nbGVzLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0ga2luZ3N1bl9zdXNwZW5kLAorCS5yZXN1bWUJCT0ga2luZ3N1bl9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qCisgKiBNb2R1bGUgaW5zZXJ0aW9uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGtpbmdzdW5faW5pdCh2b2lkKQoreworCXJldHVybiB1c2JfcmVnaXN0ZXIoJmlyZGFfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGtpbmdzdW5faW5pdCk7CisKKy8qCisgKiBNb2R1bGUgcmVtb3ZhbAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQga2luZ3N1bl9jbGVhbnVwKHZvaWQpCit7CisJLyogRGVyZWdpc3RlciB0aGUgZHJpdmVyIGFuZCByZW1vdmUgYWxsIHBlbmRpbmcgaW5zdGFuY2VzICovCisJdXNiX2RlcmVnaXN0ZXIoJmlyZGFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGtpbmdzdW5fY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkFsZXggVmlsbGFj77+9cyBMYXNzbyA8YV92aWxsYWNpc0BwYWxvc2FudG8uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJckRBLVVTQiBEb25nbGUgRHJpdmVyIGZvciBLaW5nU3VuL0RvblNoaW5lIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tbHg0L2VxLmMgYi9kcml2ZXJzL25ldC9tbHg0L2VxLmMKaW5kZXggYWNmMWM4MC4uYWYwMTZkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWx4NC9lcS5jCisrKyBiL2RyaXZlcnMvbmV0L21seDQvZXEuYwpAQCAtNjIzLDcgKzYyMyw3IEBACiAJCXByaXYtPmVxX3RhYmxlLmVxW01MWDRfRVFfQ0FUQVNdLmhhdmVfaXJxID0gMTsKIAl9IGVsc2UgewogCQllcnIgPSByZXF1ZXN0X2lycShkZXYtPnBkZXYtPmlycSwgbWx4NF9pbnRlcnJ1cHQsCi0JCQkJICBTQV9TSElSUSwgRFJWX05BTUUsIGRldik7CisJCQkJICBJUlFGX1NIQVJFRCwgRFJWX05BTUUsIGRldik7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9vdXRfYXN5bmM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwppbmRleCA0ZTMyYmI2Li4yYzVjNmQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCkBAIC03MzUsNyArNzM1LDcgQEAKIAkJfQogCQlhZGFwdGVyLT5pcnEgPSBhZGFwdGVyLT5haHcucGRldi0+aXJxOwogCQllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5haHcucGRldi0+aXJxLCBuZXR4ZW5faW50ciwKLQkJCQkgIFNBX1NISVJRIHwgU0FfU0FNUExFX1JBTkRPTSwgbmV0ZGV2LT5uYW1lLAorCQkJCSAgSVJRRl9TSEFSRUR8SVJRRl9TQU1QTEVfUkFORE9NLCBuZXRkZXYtPm5hbWUsCiAJCQkJICBhZGFwdGVyKTsKIAkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJyZXF1ZXN0X2lycSBmYWlsZWQgd2l0aDogJWRcbiIsIGVycik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wY21jaWEvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9LY29uZmlnCmluZGV4IDc0Zjg2MjAuLjVkNjU4YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9LY29uZmlnCkBAIC0yLDExICsyLDkgQEAKICMgUENNQ0lBIE5ldHdvcmsgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIFBDTUNJQSE9bgotCi1jb25maWcgTkVUX1BDTUNJQQorbWVudWNvbmZpZyBORVRfUENNQ0lBCiAJYm9vbCAiUENNQ0lBIG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQ01DSUEKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBpZiB5b3Ugd291bGQgbGlrZSB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIGFueSBQQ01DSUEgb3IgQ2FyZEJ1cwogCSAgbmV0d29yayBhZGFwdGVycywgdGhlbiBzYXkgWSB0byB0aGUgZHJpdmVyIGZvciB5b3VyIHBhcnRpY3VsYXIgY2FyZApAQCAtMjEsOSArMTksMTAgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAoraWYgTkVUX1BDTUNJQQorCiBjb25maWcgUENNQ0lBXzNDNTg5CiAJdHJpc3RhdGUgIjNDb20gM2M1ODkgUENNQ0lBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYSAzQ29tIDNjNTg5IG9yIGNvbXBhdGlibGUgUENNQ0lBCiAJICAoUEMtY2FyZCkgRXRoZXJuZXQgY2FyZCB0byB5b3VyIGNvbXB1dGVyLgpAQCAtMzMsNyArMzIsNiBAQAogCiBjb25maWcgUENNQ0lBXzNDNTc0CiAJdHJpc3RhdGUgIjNDb20gM2M1NzQgUENNQ0lBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYSAzQ29tIDNjNTc0IG9yIGNvbXBhdGlibGUgUENNQ0lBCiAJICAoUEMtY2FyZCkgRmFzdCBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCkBAIC00Myw3ICs0MSw2IEBACiAKIGNvbmZpZyBQQ01DSUFfRk1WSjE4WAogCXRyaXN0YXRlICJGdWppdHN1IEZNVi1KMTh4IFBDTUNJQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGEgRnVqaXRzdSBGTVYtSjE4eCBvciBjb21wYXRpYmxlCkBAIC01NCw3ICs1MSw2IEBACiAKIGNvbmZpZyBQQ01DSUFfUENORVQKIAl0cmlzdGF0ZSAiTkUyMDAwIGNvbXBhdGlibGUgUENNQ0lBIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIFBDTUNJQQogCXNlbGVjdCBDUkMzMgogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggYW4gTkUyMDAwIGNvbXBhdGlibGUgUENNQ0lBCkBAIC02NSw3ICs2MSw2IEBACiAKIGNvbmZpZyBQQ01DSUFfTk1DTEFOCiAJdHJpc3RhdGUgIk5ldyBNZWRpYSBQQ01DSUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgUENNQ0lBCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhIE5ldyBNZWRpYSBFdGhlcm5ldCBvciBMaXZlV2lyZQogCSAgUENNQ0lBIChQQy1jYXJkKSBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCkBAIC03NSw3ICs3MCw2IEBACiAKIGNvbmZpZyBQQ01DSUFfU01DOTFDOTIKIAl0cmlzdGF0ZSAiU01DIDkxQ3h4IFBDTUNJQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKIAlzZWxlY3QgQ1JDMzIKIAlzZWxlY3QgTUlJCiAJaGVscApAQCAtODcsNyArODEsNiBAQAogCiBjb25maWcgUENNQ0lBX1hJUkMyUFMKIAl0cmlzdGF0ZSAiWGlyY29tIDE2LWJpdCBQQ01DSUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIE5FVF9QQ01DSUEgJiYgUENNQ0lBCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIGF0dGFjaCBhIFhpcmNvbSAxNi1iaXQgUENNQ0lBIChQQy1jYXJkKQogCSAgRXRoZXJuZXQgb3IgRmFzdCBFdGhlcm5ldCBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuCkBAIC05Nyw3ICs5MCw2IEBACiAKIGNvbmZpZyBQQ01DSUFfQVhORVQKIAl0cmlzdGF0ZSAiQXNpeCBBWDg4MTkwIFBDTUNJQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBQQ01DSUEKIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIGFuIEFzaXggQVg4ODE5MC1iYXNlZCBQQ01DSUEKIAkgIChQQy1jYXJkKSBGYXN0IEV0aGVybmV0IGNhcmQgdG8geW91ciBjb21wdXRlci4gIFRoZXNlIGNhcmRzIGFyZQpAQCAtMTA5LDcgKzEwMSw3IEBACiAKIGNvbmZpZyBBUkNORVRfQ09NMjAwMjBfQ1MKIAl0cmlzdGF0ZSAiQ09NMjAwMjAgQVJDbmV0IFBDTUNJQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTkVUX1BDTUNJQSAmJiBBUkNORVRfQ09NMjAwMjAgJiYgUENNQ0lBCisJZGVwZW5kcyBvbiBBUkNORVRfQ09NMjAwMjAKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gYXR0YWNoIHRoaXMgdHlwZSBvZiBBUkNuZXQgUENNQ0lBIGNhcmQKIAkgIHRvIHlvdXIgY29tcHV0ZXIuCkBAIC0xMTksNyArMTExLDcgQEAKIAogY29uZmlnIFBDTUNJQV9JQk1UUgogCXRyaXN0YXRlICJJQk0gUENNQ0lBIHRva2VucmluZyBhZGFwdGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRfUENNQ0lBICYmIElCTVRSIT15ICYmIFRSICYmIFBDTUNJQSAmJiAhNjRCSVQKKwlkZXBlbmRzIG9uIElCTVRSIT15ICYmIFRSICYmICE2NEJJVAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBhdHRhY2ggdGhpcyB0eXBlIG9mIFRva2VuIFJpbmcgUENNQ0lBCiAJICBjYXJkIHRvIHlvdXIgY29tcHV0ZXIuIFlvdSB0aGVuIGFsc28gbmVlZCB0byBzYXkgWSB0byAiVG9rZW4gUmluZwpAQCAtMTI4LDUgKzEyMCw0IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBpYm10cl9jcy4KIAotZW5kbWVudQotCitlbmRpZiAjIE5FVF9QQ01DSUEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnIGIvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKaW5kZXggYzBkMzEwMS4uMDliNmYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKQEAgLTIsNzAgKzIsNjEgQEAKICMgUEhZIExheWVyIENvbmZpZ3VyYXRpb24KICMKIAotbWVudSAiUEhZIGRldmljZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gIVMzOTAKLQotY29uZmlnIFBIWUxJQgorbWVudWNvbmZpZyBQSFlMSUIKIAl0cmlzdGF0ZSAiUEhZIERldmljZSBzdXBwb3J0IGFuZCBpbmZyYXN0cnVjdHVyZSIKKwlkZXBlbmRzIG9uICFTMzkwCiAJZGVwZW5kcyBvbiBORVRfRVRIRVJORVQgJiYgKEJST0tFTiB8fCAhUzM5MCkKIAloZWxwCiAJICBFdGhlcm5ldCBjb250cm9sbGVycyBhcmUgdXN1YWxseSBhdHRhY2hlZCB0byBQSFkKIAkgIGRldmljZXMuICBUaGlzIG9wdGlvbiBwcm92aWRlcyBpbmZyYXN0cnVjdHVyZSBmb3IKIAkgIG1hbmFnaW5nIFBIWSBkZXZpY2VzLgogCitpZiBQSFlMSUIKKwogY29tbWVudCAiTUlJIFBIWSBkZXZpY2UgZHJpdmVycyIKLQlkZXBlbmRzIG9uIFBIWUxJQgogCiBjb25maWcgTUFSVkVMTF9QSFkKIAl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgTWFydmVsbCBQSFlzIgotCWRlcGVuZHMgb24gUEhZTElCCiAJLS0taGVscC0tLQogCSAgQ3VycmVudGx5IGhhcyBhIGRyaXZlciBmb3IgdGhlIDg4RTEwMTFTCiAJCiBjb25maWcgREFWSUNPTV9QSFkKIAl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgRGF2aWNvbSBQSFlzIgotCWRlcGVuZHMgb24gUEhZTElCCiAJLS0taGVscC0tLQogCSAgQ3VycmVudGx5IHN1cHBvcnRzIGRtOTE2MWUgYW5kIGRtOTEzMQogCiBjb25maWcgUVNFTUlfUEhZCiAJdHJpc3RhdGUgIkRyaXZlcnMgZm9yIFF1YWxpdHkgU2VtaWNvbmR1Y3RvciBQSFlzIgotCWRlcGVuZHMgb24gUEhZTElCCiAJLS0taGVscC0tLQogCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBxczY2MTIKIAogY29uZmlnIExYVF9QSFkKIAl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgdGhlIEludGVsIExYVCBQSFlzIgotCWRlcGVuZHMgb24gUEhZTElCCiAJLS0taGVscC0tLQogCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBseHQ5NzAsIGx4dDk3MQogCiBjb25maWcgQ0lDQURBX1BIWQogCXRyaXN0YXRlICJEcml2ZXJzIGZvciB0aGUgQ2ljYWRhIFBIWXMiCi0JZGVwZW5kcyBvbiBQSFlMSUIKIAktLS1oZWxwLS0tCiAJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGNpczgyMDQKKwogY29uZmlnIFZJVEVTU0VfUEhZCiAgICAgICAgIHRyaXN0YXRlICJEcml2ZXJzIGZvciB0aGUgVml0ZXNzZSBQSFlzIgotICAgICAgICBkZXBlbmRzIG9uIFBIWUxJQgogICAgICAgICAtLS1oZWxwLS0tCiAgICAgICAgICAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSB2c2M4MjQ0CiAKIGNvbmZpZyBTTVNDX1BIWQogCXRyaXN0YXRlICJEcml2ZXJzIGZvciBTTVNDIFBIWXMiCi0JZGVwZW5kcyBvbiBQSFlMSUIKIAktLS1oZWxwLS0tCiAJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIExBTjgzQzE4NSBQSFkKIAogY29uZmlnIEJST0FEQ09NX1BIWQogCXRyaXN0YXRlICJEcml2ZXJzIGZvciBCcm9hZGNvbSBQSFlzIgotCWRlcGVuZHMgb24gUEhZTElCCiAJLS0taGVscC0tLQogCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBCQ001NDExLCBCQ001NDIxIGFuZCBCQ001NDYxIFBIWXMuCiAKIGNvbmZpZyBGSVhFRF9QSFkKIAl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgUEhZIGVtdWxhdGlvbiBvbiBmaXhlZCBzcGVlZC9saW5rIgotCWRlcGVuZHMgb24gUEhZTElCCiAJLS0taGVscC0tLQogCSAgQWRkcyB0aGUgZHJpdmVyIHRvIFBIWSBsYXllciB0byBjb3ZlciB0aGUgYm9hcmRzIHRoYXQgZG8gbm90IGhhdmUgYW55IFBIWSBib3VuZCwKIAkgIGJ1dCB3aXRoIHRoZSBhYmlsaXR5IHRvIG1hbmlwdWxhdGUgdGhlIHNwZWVkL2xpbmsgaW4gc29mdHdhcmUuIFRoZSByZWxldmFudCBNSUkKQEAgLTgwLDUgKzcxLDQgQEAKIAlib29sICJFbXVsYXRpb24gZm9yIDEwME0gRmR4IGZpeGVkIFBIWSBiZWhhdmlvciIKIAlkZXBlbmRzIG9uIEZJWEVEX1BIWQogCi1lbmRtZW51Ci0KK2VuZGlmICMgUEhZTElCCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvZGF2aWNvbS5jIGIvZHJpdmVycy9uZXQvcGh5L2Rhdmljb20uYwppbmRleCA1MTliYWEzLi43ZWQ2MzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvZGF2aWNvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9kYXZpY29tLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgZG05MTYxX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGh5X2RyaXZlciBkbTkxNjFlX2RyaXZlciA9IHsKIAkucGh5X2lkCQk9IDB4MDE4MWI4ODAsCiAJLm5hbWUJCT0gIkRhdmljb20gRE05MTYxRSIsCiAJLnBoeV9pZF9tYXNrCT0gMHgwZmZmZmZmMCwKQEAgLTE0Nyw3ICsxNDcsMTggQEAKIAkuY29uZmlnX2luaXQJPSBkbTkxNjFfY29uZmlnX2luaXQsCiAJLmNvbmZpZ19hbmVnCT0gZG05MTYxX2NvbmZpZ19hbmVnLAogCS5yZWFkX3N0YXR1cwk9IGdlbnBoeV9yZWFkX3N0YXR1cywKLQkuZHJpdmVyIAk9IHsgLm93bmVyID0gVEhJU19NT0RVTEUsfSwKKwkuZHJpdmVyCQk9IHsgLm93bmVyID0gVEhJU19NT0RVTEUsfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5X2RyaXZlciBkbTkxNjFhX2RyaXZlciA9IHsKKwkucGh5X2lkCQk9IDB4MDE4MWI4YTAsCisJLm5hbWUJCT0gIkRhdmljb20gRE05MTYxQSIsCisJLnBoeV9pZF9tYXNrCT0gMHgwZmZmZmZmMCwKKwkuZmVhdHVyZXMJPSBQSFlfQkFTSUNfRkVBVFVSRVMsCisJLmNvbmZpZ19pbml0CT0gZG05MTYxX2NvbmZpZ19pbml0LAorCS5jb25maWdfYW5lZwk9IGRtOTE2MV9jb25maWdfYW5lZywKKwkucmVhZF9zdGF0dXMJPSBnZW5waHlfcmVhZF9zdGF0dXMsCisJLmRyaXZlcgkJPSB7IC5vd25lciA9IFRISVNfTU9EVUxFLH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgZG05MTMxX2RyaXZlciA9IHsKQEAgLTE2MCwzMSArMTcxLDM4IEBACiAJLnJlYWRfc3RhdHVzCT0gZ2VucGh5X3JlYWRfc3RhdHVzLAogCS5hY2tfaW50ZXJydXB0CT0gZG05MTYxX2Fja19pbnRlcnJ1cHQsCiAJLmNvbmZpZ19pbnRyCT0gZG05MTYxX2NvbmZpZ19pbnRyLAotCS5kcml2ZXIgCT0geyAub3duZXIgPSBUSElTX01PRFVMRSx9LAorCS5kcml2ZXIJCT0geyAub3duZXIgPSBUSElTX01PRFVMRSx9LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgZGF2aWNvbV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHBoeV9kcml2ZXJfcmVnaXN0ZXIoJmRtOTE2MV9kcml2ZXIpOworCXJldCA9IHBoeV9kcml2ZXJfcmVnaXN0ZXIoJmRtOTE2MWVfZHJpdmVyKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycjE7CiAKLQlyZXQgPSBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZkbTkxMzFfZHJpdmVyKTsKKwlyZXQgPSBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZkbTkxNjFhX2RyaXZlcik7CiAJaWYgKHJldCkKIAkJZ290byBlcnIyOworCisJcmV0ID0gcGh5X2RyaXZlcl9yZWdpc3RlcigmZG05MTMxX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBlcnIzOwogCXJldHVybiAwOwogCi0gZXJyMjoJCi0JcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZkbTkxNjFfZHJpdmVyKTsKKyBlcnIzOgorCXBoeV9kcml2ZXJfdW5yZWdpc3RlcigmZG05MTYxYV9kcml2ZXIpOworIGVycjI6CisJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZkbTkxNjFlX2RyaXZlcik7CiAgZXJyMToKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZGF2aWNvbV9leGl0KHZvaWQpCiB7Ci0JcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZkbTkxNjFfZHJpdmVyKTsKKwlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmRtOTE2MWVfZHJpdmVyKTsKKwlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmRtOTE2MWFfZHJpdmVyKTsKIAlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmRtOTEzMV9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zMmlvLmMgYi9kcml2ZXJzL25ldC9zMmlvLmMKaW5kZXggMjkwZTFjMS4uZTNlNmQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L3MyaW8uYwpAQCAtODQsNyArODQsNyBAQAogI2luY2x1ZGUgInMyaW8uaCIKICNpbmNsdWRlICJzMmlvLXJlZ3MuaCIKIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4wLjIyLjEiCisjZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMjMuMSIKIAogLyogUzJpbyBEcml2ZXIgbmFtZSAmIHZlcnNpb24uICovCiBzdGF0aWMgY2hhciBzMmlvX2RyaXZlcl9uYW1lW10gPSAiTmV0ZXJpb24iOwpAQCAtMjgxLDYgKzI4MSwyOCBAQAogCSgibHJvX291dF9vZl9zZXF1ZW5jZV9wa3RzIiksCiAJKCJscm9fZmx1c2hfZHVlX3RvX21heF9wa3RzIiksCiAJKCJscm9fYXZnX2FnZ3JfcGt0cyIpLAorCSgibWVtX2FsbG9jX2ZhaWxfY250IiksCisJKCJ3YXRjaGRvZ190aW1lcl9jbnQiKSwKKwkoIm1lbV9hbGxvY2F0ZWQiKSwKKwkoIm1lbV9mcmVlZCIpLAorCSgibGlua191cF9jbnQiKSwKKwkoImxpbmtfZG93bl9jbnQiKSwKKwkoImxpbmtfdXBfdGltZSIpLAorCSgibGlua19kb3duX3RpbWUiKSwKKwkoInR4X3Rjb2RlX2J1Zl9hYm9ydF9jbnQiKSwKKwkoInR4X3Rjb2RlX2Rlc2NfYWJvcnRfY250IiksCisJKCJ0eF90Y29kZV9wYXJpdHlfZXJyX2NudCIpLAorCSgidHhfdGNvZGVfbGlua19sb3NzX2NudCIpLAorCSgidHhfdGNvZGVfbGlzdF9wcm9jX2Vycl9jbnQiKSwKKwkoInJ4X3Rjb2RlX3Bhcml0eV9lcnJfY250IiksCisJKCJyeF90Y29kZV9hYm9ydF9jbnQiKSwKKwkoInJ4X3Rjb2RlX3Bhcml0eV9hYm9ydF9jbnQiKSwKKwkoInJ4X3Rjb2RlX3JkYV9mYWlsX2NudCIpLAorCSgicnhfdGNvZGVfdW5rbl9wcm90X2NudCIpLAorCSgicnhfdGNvZGVfZmNzX2Vycl9jbnQiKSwKKwkoInJ4X3Rjb2RlX2J1Zl9zaXplX2Vycl9jbnQiKSwKKwkoInJ4X3Rjb2RlX3J4ZF9jb3JydXB0X2NudCIpLAorCSgicnhfdGNvZGVfdW5rbl9lcnJfY250IikKIH07CiAKICNkZWZpbmUgUzJJT19YRU5BX1NUQVRfTEVOIHNpemVvZihldGh0b29sX3hlbmFfc3RhdHNfa2V5cykvIEVUSF9HU1RSSU5HX0xFTgpAQCAtNDkwLDYgKzUxMiw3IEBACiAKIAlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWVtX2FsbG9jYXRlZCA9IDA7CiAKIAltYWNfY29udHJvbCA9ICZuaWMtPm1hY19jb250cm9sOwogCWNvbmZpZyA9ICZuaWMtPmNvbmZpZzsKQEAgLTUxOSw2ICs1NDIsNyBAQAogCQkJCSAgIk1hbGxvYyBmYWlsZWQgZm9yIGxpc3RfaW5mb1xuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQorCQltZW1fYWxsb2NhdGVkICs9IGxpc3RfaG9sZGVyX3NpemU7CiAJCW1lbXNldChtYWNfY29udHJvbC0+Zmlmb3NbaV0ubGlzdF9pbmZvLCAwLCBsaXN0X2hvbGRlcl9zaXplKTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+dHhfZmlmb19udW07IGkrKykgewpAQCAtNTY1LDYgKzU4OSw3IEBACiAJCQkJCURCR19QUklOVChJTkZPX0RCRywgImZhaWxlZCBmb3IgVHhETFxuIik7CiAJCQkJCXJldHVybiAtRU5PTUVNOwogCQkJCX0KKwkJCQltZW1fYWxsb2NhdGVkICs9IFBBR0VfU0laRTsKIAkJCX0KIAkJCXdoaWxlIChrIDwgbHN0X3Blcl9wYWdlKSB7CiAJCQkJaW50IGwgPSAoaiAqIGxzdF9wZXJfcGFnZSkgKyBrOwpAQCAtNTgyLDYgKzYwNyw3IEBACiAJbmljLT51Zm9faW5fYmFuZF92ID0ga2NhbGxvYyhzaXplLCBzaXplb2YodTY0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuaWMtPnVmb19pbl9iYW5kX3YpCiAJCXJldHVybiAtRU5PTUVNOworCSBtZW1fYWxsb2NhdGVkICs9IChzaXplICogc2l6ZW9mKHU2NCkpOwogCiAJLyogQWxsb2NhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gb2YgUlhEcyBpbiBSaW5ncyAqLwogCXNpemUgPSAwOwpAQCAtNjM5LDYgKzY2NSw3IEBACiAJCQkJcnhfYmxvY2tzLT5ibG9ja192aXJ0X2FkZHIgPSB0bXBfdl9hZGRyOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQorCQkJbWVtX2FsbG9jYXRlZCArPSBzaXplOwogCQkJbWVtc2V0KHRtcF92X2FkZHIsIDAsIHNpemUpOwogCQkJcnhfYmxvY2tzLT5ibG9ja192aXJ0X2FkZHIgPSB0bXBfdl9hZGRyOwogCQkJcnhfYmxvY2tzLT5ibG9ja19kbWFfYWRkciA9IHRtcF9wX2FkZHI7CkBAIC02NDcsNiArNjc0LDggQEAKIAkJCQkJCSAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXJ4X2Jsb2Nrcy0+cnhkcykKIAkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCW1lbV9hbGxvY2F0ZWQgKz0gCisJCQkoc2l6ZW9mKHN0cnVjdCByeGRfaW5mbykqIHJ4ZF9jb3VudFtuaWMtPnJ4ZF9tb2RlXSk7CiAJCQlmb3IgKGw9MDsgbDxyeGRfY291bnRbbmljLT5yeGRfbW9kZV07bCsrKSB7CiAJCQkJcnhfYmxvY2tzLT5yeGRzW2xdLnZpcnRfYWRkciA9CiAJCQkJCXJ4X2Jsb2Nrcy0+YmxvY2tfdmlydF9hZGRyICsKQEAgLTY4OSw2ICs3MTgsNyBAQAogCQkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW1hY19jb250cm9sLT5yaW5nc1tpXS5iYSkKIAkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCW1lbV9hbGxvY2F0ZWQgKz0oc2l6ZW9mKHN0cnVjdCBidWZmQWRkICopICogYmxrX2NudCk7CiAJCQlmb3IgKGogPSAwOyBqIDwgYmxrX2NudDsgaisrKSB7CiAJCQkJaW50IGsgPSAwOwogCQkJCW1hY19jb250cm9sLT5yaW5nc1tpXS5iYVtqXSA9CkBAIC02OTcsNiArNzI3LDggQEAKIAkJCQkJCUdGUF9LRVJORUwpOwogCQkJCWlmICghbWFjX2NvbnRyb2wtPnJpbmdzW2ldLmJhW2pdKQogCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQltZW1fYWxsb2NhdGVkICs9IChzaXplb2Yoc3RydWN0IGJ1ZmZBZGQpICogIFwKKwkJCQkJKHJ4ZF9jb3VudFtuaWMtPnJ4ZF9tb2RlXSArIDEpKTsKIAkJCQl3aGlsZSAoayAhPSByeGRfY291bnRbbmljLT5yeGRfbW9kZV0pIHsKIAkJCQkJYmEgPSAmbWFjX2NvbnRyb2wtPnJpbmdzW2ldLmJhW2pdW2tdOwogCkBAIC03MDQsNiArNzM2LDggQEAKIAkJCQkJICAgIChCVUYwX0xFTiArIEFMSUdOX1NJWkUsIEdGUF9LRVJORUwpOwogCQkJCQlpZiAoIWJhLT5iYV8wX29yZykKIAkJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCQltZW1fYWxsb2NhdGVkICs9IAorCQkJCQkJKEJVRjBfTEVOICsgQUxJR05fU0laRSk7CiAJCQkJCXRtcCA9ICh1bnNpZ25lZCBsb25nKWJhLT5iYV8wX29yZzsKIAkJCQkJdG1wICs9IEFMSUdOX1NJWkU7CiAJCQkJCXRtcCAmPSB+KCh1bnNpZ25lZCBsb25nKSBBTElHTl9TSVpFKTsKQEAgLTcxMyw2ICs3NDcsOCBAQAogCQkJCQkgICAgKEJVRjFfTEVOICsgQUxJR05fU0laRSwgR0ZQX0tFUk5FTCk7CiAJCQkJCWlmICghYmEtPmJhXzFfb3JnKQogCQkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJCW1lbV9hbGxvY2F0ZWQgCisJCQkJCQkrPSAoQlVGMV9MRU4gKyBBTElHTl9TSVpFKTsKIAkJCQkJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGJhLT5iYV8xX29yZzsKIAkJCQkJdG1wICs9IEFMSUdOX1NJWkU7CiAJCQkJCXRtcCAmPSB+KCh1bnNpZ25lZCBsb25nKSBBTElHTl9TSVpFKTsKQEAgLTczNiw2ICs3NzIsNyBAQAogCQkgKi8KIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCW1lbV9hbGxvY2F0ZWQgKz0gc2l6ZTsKIAltYWNfY29udHJvbC0+c3RhdHNfbWVtX3N6ID0gc2l6ZTsKIAogCXRtcF92X2FkZHIgPSBtYWNfY29udHJvbC0+c3RhdHNfbWVtOwpAQCAtNzQzLDcgKzc4MCw3IEBACiAJbWVtc2V0KHRtcF92X2FkZHIsIDAsIHNpemUpOwogCURCR19QUklOVChJTklUX0RCRywgIiVzOlJpbmcgTWVtIFBIWTogMHglbGx4XG4iLCBkZXYtPm5hbWUsCiAJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdG1wX3BfYWRkcik7Ci0KKwltYWNfY29udHJvbC0+c3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NhdGVkICs9IG1lbV9hbGxvY2F0ZWQ7CiAJcmV0dXJuIFNVQ0NFU1M7CiB9CiAKQEAgLTc1NywxMiArNzk0LDE0IEBACiBzdGF0aWMgdm9pZCBmcmVlX3NoYXJlZF9tZW0oc3RydWN0IHMyaW9fbmljICpuaWMpCiB7CiAJaW50IGksIGosIGJsa19jbnQsIHNpemU7CisJdTMyIHVmb19zaXplID0gMDsKIAl2b2lkICp0bXBfdl9hZGRyOwogCWRtYV9hZGRyX3QgdG1wX3BfYWRkcjsKIAlzdHJ1Y3QgbWFjX2luZm8gKm1hY19jb250cm9sOwogCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKIAlpbnQgbHN0X3NpemUsIGxzdF9wZXJfcGFnZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmljLT5kZXY7CisJaW50IHBhZ2VfbnVtID0gMDsKIAogCWlmICghbmljKQogCQlyZXR1cm47CkBAIC03NzQsOCArODEzLDkgQEAKIAlsc3RfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyBsc3Rfc2l6ZTsKIAogCWZvciAoaSA9IDA7IGkgPCBjb25maWctPnR4X2ZpZm9fbnVtOyBpKyspIHsKLQkJaW50IHBhZ2VfbnVtID0gVFhEX01FTV9QQUdFX0NOVChjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbiwKLQkJCQkJCWxzdF9wZXJfcGFnZSk7CisJCXVmb19zaXplICs9IGNvbmZpZy0+dHhfY2ZnW2ldLmZpZm9fbGVuOworCQlwYWdlX251bSA9IFRYRF9NRU1fUEFHRV9DTlQoY29uZmlnLT50eF9jZmdbaV0uZmlmb19sZW4sCisJCQkJCQkJbHN0X3Blcl9wYWdlKTsKIAkJZm9yIChqID0gMDsgaiA8IHBhZ2VfbnVtOyBqKyspIHsKIAkJCWludCBtZW1fYmxrcyA9IChqICogbHN0X3Blcl9wYWdlKTsKIAkJCWlmICghbWFjX2NvbnRyb2wtPmZpZm9zW2ldLmxpc3RfaW5mbykKQEAgLTc5MCw2ICs4MzAsOCBAQAogCQkJCQkgICAgbWFjX2NvbnRyb2wtPmZpZm9zW2ldLgogCQkJCQkgICAgbGlzdF9pbmZvW21lbV9ibGtzXS4KIAkJCQkJICAgIGxpc3RfcGh5X2FkZHIpOworCQkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCAKKwkJCQkJCSs9IFBBR0VfU0laRTsKIAkJfQogCQkvKiBJZiB3ZSBnb3QgYSB6ZXJvIERNQSBhZGRyZXNzIGR1cmluZyBhbGxvY2F0aW9uLAogCQkgKiBmcmVlIHRoZSBwYWdlIG5vdwpAQCAtODAzLDggKzg0NSwxMiBAQAogCQkJCWRldi0+bmFtZSk7CiAJCQlEQkdfUFJJTlQoSU5JVF9EQkcsICJWaXJ0dWFsIGFkZHJlc3MgJXBcbiIsCiAJCQkJbWFjX2NvbnRyb2wtPnplcm9kbWFfdmlydF9hZGRyKTsKKwkJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fZnJlZWQgCisJCQkJCQkrPSBQQUdFX1NJWkU7CiAJCX0KIAkJa2ZyZWUobWFjX2NvbnRyb2wtPmZpZm9zW2ldLmxpc3RfaW5mbyk7CisJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fZnJlZWQgKz0gCisJCShuaWMtPmNvbmZpZy50eF9jZmdbaV0uZmlmb19sZW4gKnNpemVvZihzdHJ1Y3QgbGlzdF9pbmZvX2hvbGQpKTsKIAl9CiAKIAlzaXplID0gU0laRV9PRl9CTE9DSzsKQEAgLTgxOSw3ICs4NjUsMTAgQEAKIAkJCQlicmVhazsKIAkJCXBjaV9mcmVlX2NvbnNpc3RlbnQobmljLT5wZGV2LCBzaXplLAogCQkJCQkgICAgdG1wX3ZfYWRkciwgdG1wX3BfYWRkcik7CisJCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubWVtX2ZyZWVkICs9IHNpemU7CiAJCQlrZnJlZShtYWNfY29udHJvbC0+cmluZ3NbaV0ucnhfYmxvY2tzW2pdLnJ4ZHMpOworCQkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCArPSAKKwkJCSggc2l6ZW9mKHN0cnVjdCByeGRfaW5mbykqIHJ4ZF9jb3VudFtuaWMtPnJ4ZF9tb2RlXSk7CiAJCX0KIAl9CiAKQEAgLTgzNiwxMiArODg1LDIwIEBACiAJCQkJCXN0cnVjdCBidWZmQWRkICpiYSA9CiAJCQkJCQkmbWFjX2NvbnRyb2wtPnJpbmdzW2ldLmJhW2pdW2tdOwogCQkJCQlrZnJlZShiYS0+YmFfMF9vcmcpOworCQkJCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuXAorCQkJCQltZW1fZnJlZWQgKz0gKEJVRjBfTEVOICsgQUxJR05fU0laRSk7CiAJCQkJCWtmcmVlKGJhLT5iYV8xX29yZyk7CisJCQkJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5cCisJCQkJCW1lbV9mcmVlZCArPSAoQlVGMV9MRU4gKyBBTElHTl9TSVpFKTsKIAkJCQkJaysrOwogCQkJCX0KIAkJCQlrZnJlZShtYWNfY29udHJvbC0+cmluZ3NbaV0uYmFbal0pOworCQkJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fZnJlZWQgCQkJCSs9IChzaXplb2Yoc3RydWN0IGJ1ZmZBZGQpICogCisJCQkJKHJ4ZF9jb3VudFtuaWMtPnJ4ZF9tb2RlXSArIDEpKTsKIAkJCX0KIAkJCWtmcmVlKG1hY19jb250cm9sLT5yaW5nc1tpXS5iYSk7CisJCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubWVtX2ZyZWVkICs9IAorCQkJKHNpemVvZihzdHJ1Y3QgYnVmZkFkZCAqKSAqIGJsa19jbnQpOwogCQl9CiAJfQogCkBAIC04NTAsOSArOTA3LDE0IEBACiAJCQkJICAgIG1hY19jb250cm9sLT5zdGF0c19tZW1fc3osCiAJCQkJICAgIG1hY19jb250cm9sLT5zdGF0c19tZW0sCiAJCQkJICAgIG1hY19jb250cm9sLT5zdGF0c19tZW1fcGh5KTsKKwkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCArPSAKKwkJCW1hY19jb250cm9sLT5zdGF0c19tZW1fc3o7CiAJfQotCWlmIChuaWMtPnVmb19pbl9iYW5kX3YpCisJaWYgKG5pYy0+dWZvX2luX2JhbmRfdikgewogCQlrZnJlZShuaWMtPnVmb19pbl9iYW5kX3YpOworCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubWVtX2ZyZWVkIAorCQkJKz0gKHVmb19zaXplICogc2l6ZW9mKHU2NCkpOworCX0KIH0KIAogLyoqCkBAIC0yMTIyLDEwICsyMTg0LDEyIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT50eF9maWZvX251bTsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCBjb25maWctPnR4X2NmZ1tpXS5maWZvX2xlbiAtIDE7IGorKykgewotCQkJdHhkcCA9IChzdHJ1Y3QgVHhEICopIG1hY19jb250cm9sLT5maWZvc1tpXS5saXN0X2luZm9bal0uCi0JCQkgICAgbGlzdF92aXJ0X2FkZHI7CisJCQl0eGRwID0gKHN0cnVjdCBUeEQgKikgXAorCQkJbWFjX2NvbnRyb2wtPmZpZm9zW2ldLmxpc3RfaW5mb1tqXS5saXN0X3ZpcnRfYWRkcjsKIAkJCXNrYiA9IHMyaW9fdHhkbF9nZXRza2IoJm1hY19jb250cm9sLT5maWZvc1tpXSwgdHhkcCwgaik7CiAJCQlpZiAoc2tiKSB7CisJCQkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCAKKwkJCQkJKz0gc2tiLT50cnVlc2l6ZTsKIAkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCQkJY250Kys7CiAJCQl9CkBAIC0yMTg2LDExICsyMjUwLDE0IEBACiAJLyogc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Qgd2lsbCBoYXZlIEw0IGRhdGEgcGF5bG9hZCAqLwogCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ID0gZGV2X2FsbG9jX3NrYihkZXYtPm10dSArIEFMSUdOX1NJWkUpOwogCWlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9PSBOVUxMKSB7CisJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NfZmFpbF9jbnQrKzsKIAkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6IGRldl9hbGxvY19za2IgZmFpbGVkXG4gIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FTk9NRU0gOwogCX0KIAlmcmFnX2xpc3QgPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdDsKIAlza2ItPnRydWVzaXplICs9IGZyYWdfbGlzdC0+dHJ1ZXNpemU7CisJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9hbGxvY2F0ZWQgCisJCSs9IGZyYWdfbGlzdC0+dHJ1ZXNpemU7CiAJZnJhZ19saXN0LT5uZXh0ID0gTlVMTDsKIAl0bXAgPSAodm9pZCAqKUFMSUdOKChsb25nKWZyYWdfbGlzdC0+ZGF0YSwgQUxJR05fU0laRSArIDEpOwogCWZyYWdfbGlzdC0+ZGF0YSA9IHRtcDsKQEAgLTIzMTksOCArMjM4NiwxMiBAQAogCQkJCXdtYigpOwogCQkJCWZpcnN0X3J4ZHAtPkNvbnRyb2xfMSB8PSBSWERfT1dOX1hFTkE7CiAJCQl9CisJCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuIFwKKwkJCQltZW1fYWxsb2NfZmFpbF9jbnQrKzsKIAkJCXJldHVybiAtRU5PTUVNIDsKIAkJfQorCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubWVtX2FsbG9jYXRlZCAKKwkJCSs9IHNrYi0+dHJ1ZXNpemU7CiAJCWlmIChuaWMtPnJ4ZF9tb2RlID09IFJYRF9NT0RFXzEpIHsKIAkJCS8qIDEgYnVmZmVyIG1vZGUgLSBub3JtYWwgb3BlcmF0aW9uIG1vZGUgKi8KIAkJCW1lbXNldChyeGRwLCAwLCBzaXplb2Yoc3RydWN0IFJ4RDEpKTsKQEAgLTIzMjgsNyArMjM5OSw4IEBACiAJCQkoKHN0cnVjdCBSeEQxKilyeGRwKS0+QnVmZmVyMF9wdHIgPSBwY2lfbWFwX3NpbmdsZQogCQkJICAgIChuaWMtPnBkZXYsIHNrYi0+ZGF0YSwgc2l6ZSAtIE5FVF9JUF9BTElHTiwKIAkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJcnhkcC0+Q29udHJvbF8yID0gU0VUX0JVRkZFUjBfU0laRV8xKHNpemUgLSBORVRfSVBfQUxJR04pOworCQkJcnhkcC0+Q29udHJvbF8yID0gCisJCQkJU0VUX0JVRkZFUjBfU0laRV8xKHNpemUgLSBORVRfSVBfQUxJR04pOwogCiAJCX0gZWxzZSBpZiAobmljLT5yeGRfbW9kZSA+PSBSWERfTU9ERV8zQSkgewogCQkJLyoKQEAgLTIzNDIsNyArMjQxNCw3IEBACiAJCQkgKiBwYXlsb2FkCiAJCQkgKi8KIAotCQkJLyogc2F2ZSB0aGUgYnVmZmVyIHBvaW50ZXJzIHRvIGF2b2lkIGZyZXF1ZW50IGRtYSBtYXBwaW5nICovCisJCQkvKiBzYXZlIGJ1ZmZlciBwb2ludGVycyB0byBhdm9pZCBmcmVxdWVudCBkbWEgbWFwcGluZyAqLwogCQkJQnVmZmVyMF9wdHIgPSAoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHI7CiAJCQlCdWZmZXIxX3B0ciA9ICgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIxX3B0cjsKIAkJCW1lbXNldChyeGRwLCAwLCBzaXplb2Yoc3RydWN0IFJ4RDMpKTsKQEAgLTIzNjQsNyArMjQzNiw3IEBACiAJCQkJCSAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQllbHNlCiAJCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKG5pYy0+cGRldiwKLQkJCQkgICAgKGRtYV9hZGRyX3QpICgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIwX3B0ciwKKwkJCQkoZG1hX2FkZHJfdCkgKChzdHJ1Y3QgUnhEMyopcnhkcCktPkJ1ZmZlcjBfcHRyLAogCQkJCSAgICBCVUYwX0xFTiwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAkJCXJ4ZHAtPkNvbnRyb2xfMiA9IFNFVF9CVUZGRVIwX1NJWkVfMyhCVUYwX0xFTik7CiAJCQlpZiAobmljLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8zQikgewpAQCAtMjM5MSw2ICsyNDYzLDggQEAKIAkJCX0gZWxzZSB7CiAJCQkJLyogMyBidWZmZXIgbW9kZSAqLwogCQkJCWlmIChmaWxsX3J4ZF8zYnVmKG5pYywgcnhkcCwgc2tiKSA9PSAtRU5PTUVNKSB7CisJCQkJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5cCisJCQkJCW1lbV9mcmVlZCArPSBza2ItPnRydWVzaXplOwogCQkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogCQkJCQlpZiAoZmlyc3RfcnhkcCkgewogCQkJCQkJd21iKCk7CkBAIC0yNDkxLDYgKzI1NjUsNyBAQAogCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7CiAJCQltZW1zZXQocnhkcCwgMCwgc2l6ZW9mKHN0cnVjdCBSeEQzKSk7CiAJCX0KKwkJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubWVtX2ZyZWVkICs9IHNrYi0+dHJ1ZXNpemU7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJYXRvbWljX2RlYygmc3AtPnJ4X2J1ZnNfbGVmdFtyaW5nX25vXSk7CiAJfQpAQCAtMjgyMCwxMyArMjg5NSwzNSBAQAogCQkJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4KIAkJCQkJCXBhcml0eV9lcnJfY250Kys7CiAJCQl9Ci0JCQlpZiAoKGVyciA+PiA0OCkgPT0gMHhBKSB7Ci0JCQkJREJHX1BSSU5UKFRYX0RCRywgIlR4RCByZXR1cm5lZCBkdWUgXAotCQkJCQkJdG8gbG9zcyBvZiBsaW5rXG4iKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCURCR19QUklOVChFUlJfREJHLCAiKioqVHhEIGVycm9yICVsbHhcbiIsIGVycik7Ci0JCQl9CisKKwkJCS8qIHVwZGF0ZSB0X2NvZGUgc3RhdGlzdGljcyAqLworCQkJZXJyID4+PSA0ODsKKwkJCXN3aXRjaChlcnIpIHsKKwkJCQljYXNlIDI6CisJCQkJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4KKwkJCQkJCQl0eF9idWZfYWJvcnRfY250Kys7CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIDM6CisJCQkJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4KKwkJCQkJCQl0eF9kZXNjX2Fib3J0X2NudCsrOworCQkJCWJyZWFrOworCisJCQkJY2FzZSA3OgorCQkJCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuCisJCQkJCQkJdHhfcGFyaXR5X2Vycl9jbnQrKzsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgMTA6CisJCQkJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4KKwkJCQkJCQl0eF9saW5rX2xvc3NfY250Kys7CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIDE1OgorCQkJCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuCisJCQkJCQkJdHhfbGlzdF9wcm9jX2Vycl9jbnQrKzsKKwkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAkJfQogCiAJCXNrYiA9IHMyaW9fdHhkbF9nZXRza2IoZmlmb19kYXRhLCB0eGRscCwgZ2V0X2luZm8ub2Zmc2V0KTsKQEAgLTI4MzksNiArMjkzNiw3IEBACiAKIAkJLyogVXBkYXRpbmcgdGhlIHN0YXRpc3RpY3MgYmxvY2sgKi8KIAkJbmljLT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCArPSBza2ItPnRydWVzaXplOwogCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogCiAJCWdldF9pbmZvLm9mZnNldCsrOwpAQCAtMzMxNCw3ICszNDEyLDkgQEAKIAl1MTYgc3ViaWQsIHBjaV9jbWQ7CiAJaW50IGk7CiAJdTE2IHZhbDE2OwotCXVuc2lnbmVkIGxvbmcgbG9uZyByZXNldF9jbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgbG9uZyB1cF9jbnQsIGRvd25fY250LCB1cF90aW1lLCBkb3duX3RpbWUsIHJlc2V0X2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWVtX2FsbG9jX2NudCwgbWVtX2ZyZWVfY250LCB3YXRjaGRvZ19jbnQ7CisKIAlEQkdfUFJJTlQoSU5JVF9EQkcsIiVzIC0gUmVzZXR0aW5nIFhGcmFtZSBjYXJkICVzXG4iLAogCQkJX19GVU5DVElPTl9fLCBzcC0+ZGV2LT5uYW1lKTsKIApAQCAtMzM4MCwxMSArMzQ4MCwyNiBAQAogCiAJLyogUmVzZXQgZGV2aWNlIHN0YXRpc3RpY3MgbWFpbnRhaW5lZCBieSBPUyAqLwogCW1lbXNldCgmc3AtPnN0YXRzLCAwLCBzaXplb2YgKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSk7Ci0JLyogc2F2ZSByZXNldCBjb3VudCAqLworCQorCXVwX2NudCA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LmxpbmtfdXBfY250OworCWRvd25fY250ID0gc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubGlua19kb3duX2NudDsKKwl1cF90aW1lID0gc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubGlua191cF90aW1lOworCWRvd25fdGltZSA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LmxpbmtfZG93bl90aW1lOwogCXJlc2V0X2NudCA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LnNvZnRfcmVzZXRfY250OworCW1lbV9hbGxvY19jbnQgPSBzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NhdGVkOworCW1lbV9mcmVlX2NudCA9IHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZDsKKwl3YXRjaGRvZ19jbnQgPSBzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC53YXRjaGRvZ190aW1lcl9jbnQ7CisJLyogc2F2ZSBsaW5rIHVwL2Rvd24gdGltZS9jbnQsIHJlc2V0L21lbW9yeS93YXRjaGRvZyBjbnQgKi8KIAltZW1zZXQoc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8sIDAsIHNpemVvZihzdHJ1Y3Qgc3RhdF9ibG9jaykpOwotCS8qIHJlc3RvcmUgcmVzZXQgY291bnQgKi8KKwkvKiByZXN0b3JlIGxpbmsgdXAvZG93biB0aW1lL2NudCwgcmVzZXQvbWVtb3J5L3dhdGNoZG9nIGNudCAqLworCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LmxpbmtfdXBfY250ID0gdXBfY250OworCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LmxpbmtfZG93bl9jbnQgPSBkb3duX2NudDsKKwlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5saW5rX3VwX3RpbWUgPSB1cF90aW1lOworCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LmxpbmtfZG93bl90aW1lID0gZG93bl90aW1lOwogCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LnNvZnRfcmVzZXRfY250ID0gcmVzZXRfY250OworCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9hbGxvY2F0ZWQgPSBtZW1fYWxsb2NfY250OworCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCA9IG1lbV9mcmVlX2NudDsKKwlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC53YXRjaGRvZ190aW1lcl9jbnQgPSB3YXRjaGRvZ19jbnQ7CiAKIAkvKiBTWEUtMDAyOiBDb25maWd1cmUgbGluayBhbmQgYWN0aXZpdHkgTEVEIHRvIHR1cm4gaXQgb2ZmICovCiAJc3ViaWQgPSBzcC0+cGRldi0+c3Vic3lzdGVtX2RldmljZTsKQEAgLTM2NzIsMTkgKzM3ODcsMjkgQEAKIAluaWMtPmVudHJpZXMgPSBrbWFsbG9jKE1BWF9SRVFVRVNURURfTVNJX1ggKiBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLAogCQkJICAgICAgIEdGUF9LRVJORUwpOwogCWlmIChuaWMtPmVudHJpZXMgPT0gTlVMTCkgewotCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18pOworCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubWVtX2FsbG9jX2ZhaWxfY250Kys7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQltZW1zZXQobmljLT5lbnRyaWVzLCAwLCBNQVhfUkVRVUVTVEVEX01TSV9YICogc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSk7CisJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9hbGxvY2F0ZWQgCisJCSs9IChNQVhfUkVRVUVTVEVEX01TSV9YICogc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSk7CisJbWVtc2V0KG5pYy0+ZW50cmllcywgMCxNQVhfUkVRVUVTVEVEX01TSV9YICogc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSk7CiAKIAluaWMtPnMyaW9fZW50cmllcyA9CiAJCWttYWxsb2MoTUFYX1JFUVVFU1RFRF9NU0lfWCAqIHNpemVvZihzdHJ1Y3QgczJpb19tc2l4X2VudHJ5KSwKIAkJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAobmljLT5zMmlvX2VudHJpZXMgPT0gTlVMTCkgewotCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iLCAKKwkJCV9fRlVOQ1RJT05fXyk7CisJCW5pYy0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NfZmFpbF9jbnQrKzsKIAkJa2ZyZWUobmljLT5lbnRyaWVzKTsKKwkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCAKKwkJCSs9IChNQVhfUkVRVUVTVEVEX01TSV9YICogc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKwkgbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9hbGxvY2F0ZWQgCisJCSs9IChNQVhfUkVRVUVTVEVEX01TSV9YICogc2l6ZW9mKHN0cnVjdCBzMmlvX21zaXhfZW50cnkpKTsKIAltZW1zZXQobmljLT5zMmlvX2VudHJpZXMsIDAsCiAJICAgICAgIE1BWF9SRVFVRVNURURfTVNJX1ggKiBzaXplb2Yoc3RydWN0IHMyaW9fbXNpeF9lbnRyeSkpOwogCkBAIC0zNzA4LDcgKzM4MzMsOCBAQAogCQlyeF9tYXQgPSByZWFkcSgmYmFyMC0+cnhfbWF0KTsKIAkJZm9yIChqPTA7IGo8bmljLT5jb25maWcucnhfcmluZ19udW07IGorKywgbXNpeF9pbmR4KyspIHsKIAkJCXJ4X21hdCB8PSBSWF9NQVRfU0VUKGosIG1zaXhfaW5keCk7Ci0JCQluaWMtPnMyaW9fZW50cmllc1ttc2l4X2luZHhdLmFyZyA9ICZuaWMtPm1hY19jb250cm9sLnJpbmdzW2pdOworCQkJbmljLT5zMmlvX2VudHJpZXNbbXNpeF9pbmR4XS5hcmcgCisJCQkJPSAmbmljLT5tYWNfY29udHJvbC5yaW5nc1tqXTsKIAkJCW5pYy0+czJpb19lbnRyaWVzW21zaXhfaW5keF0udHlwZSA9IE1TSVhfUklOR19UWVBFOwogCQkJbmljLT5zMmlvX2VudHJpZXNbbXNpeF9pbmR4XS5pbl91c2UgPSBNU0lYX0ZMRzsKIAkJfQpAQCAtMzcxNyw3ICszODQzLDggQEAKIAkJdHhfbWF0ID0gcmVhZHEoJmJhcjAtPnR4X21hdDBfbls3XSk7CiAJCWZvciAoaj0wOyBqPG5pYy0+Y29uZmlnLnJ4X3JpbmdfbnVtOyBqKyssIG1zaXhfaW5keCsrKSB7CiAJCQl0eF9tYXQgfD0gVFhfTUFUX1NFVChpLCBtc2l4X2luZHgpOwotCQkJbmljLT5zMmlvX2VudHJpZXNbbXNpeF9pbmR4XS5hcmcgPSAmbmljLT5tYWNfY29udHJvbC5yaW5nc1tqXTsKKwkJCW5pYy0+czJpb19lbnRyaWVzW21zaXhfaW5keF0uYXJnIAorCQkJCT0gJm5pYy0+bWFjX2NvbnRyb2wucmluZ3Nbal07CiAJCQluaWMtPnMyaW9fZW50cmllc1ttc2l4X2luZHhdLnR5cGUgPSBNU0lYX1JJTkdfVFlQRTsKIAkJCW5pYy0+czJpb19lbnRyaWVzW21zaXhfaW5keF0uaW5fdXNlID0gTVNJWF9GTEc7CiAJCX0KQEAgLTM3MzQsNyArMzg2MSwxMSBAQAogCWlmIChyZXQpIHsKIAkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogRW5hYmxpbmcgTVNJWCBmYWlsZWRcbiIsIG5pYy0+ZGV2LT5uYW1lKTsKIAkJa2ZyZWUobmljLT5lbnRyaWVzKTsKKwkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCAKKwkJCSs9IChNQVhfUkVRVUVTVEVEX01TSV9YICogc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSk7CiAJCWtmcmVlKG5pYy0+czJpb19lbnRyaWVzKTsKKwkJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCAKKwkJKz0gKE1BWF9SRVFVRVNURURfTVNJX1ggKiBzaXplb2Yoc3RydWN0IHMyaW9fbXNpeF9lbnRyeSkpOwogCQluaWMtPmVudHJpZXMgPSBOVUxMOwogCQluaWMtPnMyaW9fZW50cmllcyA9IE5VTEw7CiAJCW5pYy0+YXZhaWxfbXNpeF92ZWN0b3JzID0gMDsKQEAgLTM4MDIsMTAgKzM5MzMsMTYgQEAKIAogaHdfaW5pdF9mYWlsZWQ6CiAJaWYgKHNwLT5pbnRyX3R5cGUgPT0gTVNJX1gpIHsKLQkJaWYgKHNwLT5lbnRyaWVzKQorCQlpZiAoc3AtPmVudHJpZXMpIHsKIAkJCWtmcmVlKHNwLT5lbnRyaWVzKTsKLQkJaWYgKHNwLT5zMmlvX2VudHJpZXMpCisJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fZnJlZWQgCisJCQkrPSAoTUFYX1JFUVVFU1RFRF9NU0lfWCAqIHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSkpOworCQl9CisJCWlmIChzcC0+czJpb19lbnRyaWVzKSB7CiAJCQlrZnJlZShzcC0+czJpb19lbnRyaWVzKTsKKwkJCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCAKKwkJCSs9IChNQVhfUkVRVUVTVEVEX01TSV9YICogc2l6ZW9mKHN0cnVjdCBzMmlvX21zaXhfZW50cnkpKTsKKwkJfQogCX0KIAlyZXR1cm4gZXJyOwogfQpAQCAtMzg2Niw2ICs0MDAzLDEzIEBACiAJY29uZmlnID0gJnNwLT5jb25maWc7CiAKIAlEQkdfUFJJTlQoVFhfREJHLCAiJXM6IEluIE5ldGVyaW9uIFR4IHJvdXRpbmVcbiIsIGRldi0+bmFtZSk7CisKKwlpZiAodW5saWtlbHkoc2tiLT5sZW4gPD0gMCkpIHsKKwkJREJHX1BSSU5UKFRYX0RCRywgIiVzOkJ1ZmZlciBoYXMgbm8gZGF0YS4uXG4iLCBkZXYtPm5hbWUpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gMDsKK30KKwogCXNwaW5fbG9ja19pcnFzYXZlKCZzcC0+dHhfbG9jaywgZmxhZ3MpOwogCWlmIChhdG9taWNfcmVhZCgmc3AtPmNhcmRfc3RhdGUpID09IENBUkRfRE9XTikgewogCQlEQkdfUFJJTlQoVFhfREJHLCAiJXM6IENhcmQgZ29pbmcgZG93biBmb3IgcmVzZXRcbiIsCkBAIC0zODc2LDcgKzQwMjAsNiBAQAogCX0KIAogCXF1ZXVlID0gMDsKLQogCS8qIEdldCBGaWZvIG51bWJlciB0byBUcmFuc21pdCBiYXNlZCBvbiB2bGFuIHByaW9yaXR5ICovCiAJaWYgKHNwLT52bGdycCAmJiB2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpIHsKIAkJdmxhbl90YWcgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKQEAgLTM5MDAsMTQgKzQwNDMsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBBIGJ1ZmZlciB3aXRoIG5vIGRhdGEgd2lsbCBiZSBkcm9wcGVkICovCi0JaWYgKCFza2ItPmxlbikgewotCQlEQkdfUFJJTlQoVFhfREJHLCAiJXM6QnVmZmVyIGhhcyBubyBkYXRhLi5cbiIsIGRldi0+bmFtZSk7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3AtPnR4X2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJb2ZmbG9hZF90eXBlID0gczJpb19vZmZsb2FkX3R5cGUoc2tiKTsKIAlpZiAob2ZmbG9hZF90eXBlICYgKFNLQl9HU09fVENQVjQgfCBTS0JfR1NPX1RDUFY2KSkgewogCQl0eGRwLT5Db250cm9sXzEgfD0gVFhEX1RDUF9MU09fRU47CkBAIC00MDAzLDcgKzQxMzgsNyBAQAogCQkJICBwdXRfb2ZmLCBnZXRfb2ZmKTsKIAkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCX0KLQorCW1hY19jb250cm9sLT5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9hbGxvY2F0ZWQgKz0gc2tiLT50cnVlc2l6ZTsKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcC0+dHhfbG9jaywgZmxhZ3MpOwogCkBAIC00Nzc1LDYgKzQ5MTAsNDAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgczJpb19ldGh0b29sX2dyaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZXJpbmcpCit7CisJc3RydWN0IHMyaW9fbmljICpzcCA9IGRldi0+cHJpdjsKKwlpbnQgaSx0eF9kZXNjX2NvdW50PTAscnhfZGVzY19jb3VudD0wOworCisJaWYgKHNwLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8xKQorCQllcmluZy0+cnhfbWF4X3BlbmRpbmcgPSBNQVhfUlhfREVTQ18xOworCWVsc2UgaWYgKHNwLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8zQikKKwkJZXJpbmctPnJ4X21heF9wZW5kaW5nID0gTUFYX1JYX0RFU0NfMjsKKwllbHNlIGlmIChzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfM0EpCisJCWVyaW5nLT5yeF9tYXhfcGVuZGluZyA9IE1BWF9SWF9ERVNDXzM7CisKKwllcmluZy0+dHhfbWF4X3BlbmRpbmcgPSBNQVhfVFhfREVTQzsKKwlmb3IgKGkgPSAwIDsgaSA8IHNwLT5jb25maWcudHhfZmlmb19udW0gOyBpKyspIHsKKwkJdHhfZGVzY19jb3VudCArPSBzcC0+Y29uZmlnLnR4X2NmZ1tpXS5maWZvX2xlbjsKKwl9CisJREJHX1BSSU5UKElORk9fREJHLCJcbm1heCB0eGRzIDogJWRcbiIsc3AtPmNvbmZpZy5tYXhfdHhkcyk7CisJZXJpbmctPnR4X3BlbmRpbmcgPSB0eF9kZXNjX2NvdW50OworCXJ4X2Rlc2NfY291bnQgPSAwOworCWZvciAoaSA9IDAgOyBpIDwgc3AtPmNvbmZpZy5yeF9yaW5nX251bSA7IGkrKykgeworCQlyeF9kZXNjX2NvdW50ICs9IHNwLT5jb25maWcucnhfY2ZnW2ldLm51bV9yeGQ7CisJfQorCWVyaW5nLT5yeF9wZW5kaW5nID0gcnhfZGVzY19jb3VudDsKKworCWVyaW5nLT5yeF9taW5pX21heF9wZW5kaW5nID0gMDsKKwllcmluZy0+cnhfbWluaV9wZW5kaW5nID0gMDsKKwlpZihzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfMSkKKwkJZXJpbmctPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gTUFYX1JYX0RFU0NfMTsKKwllbHNlIGlmIChzcC0+cnhkX21vZGUgPT0gUlhEX01PREVfM0IpCisJCWVyaW5nLT5yeF9qdW1ib19tYXhfcGVuZGluZyA9IE1BWF9SWF9ERVNDXzI7CisJZXJpbmctPnJ4X2p1bWJvX3BlbmRpbmcgPSByeF9kZXNjX2NvdW50OworfQorCiAvKioKICAqIHMyaW9fZXRodG9vbF9nZXRwYXVzZV9kYXRhIC1QYXVzZSBmcmFtZSBmcmFtZSBnZW5lcmF0aW9uIGFuZCByZWNlcHRpb24uCiAgKiBAc3AgOiBwcml2YXRlIG1lbWJlciBvZiB0aGUgZGV2aWNlIHN0cnVjdHVyZSwgd2hpY2ggaXMgYSBwb2ludGVyIHRvIHRoZQpAQCAtNDk4MSw4ICs1MTUwLDExIEBACiAJc3RyY3B5KG5pYy0+c2VyaWFsX251bSwgIk5PVCBBVkFJTEFCTEUiKTsKIAogCXZwZF9kYXRhID0ga21hbGxvYygyNTYsIEdGUF9LRVJORUwpOwotCWlmICghdnBkX2RhdGEpCisJaWYgKCF2cGRfZGF0YSkgeworCQluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubWVtX2FsbG9jX2ZhaWxfY250Kys7CiAJCXJldHVybjsKKwl9CisJbmljLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9hbGxvY2F0ZWQgKz0gMjU2OwogCiAJZm9yIChpID0gMDsgaSA8IDI1NjsgaSArPTQgKSB7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShuaWMtPnBkZXYsICh2cGRfYWRkciArIDIpLCBpKTsKQEAgLTUwMjIsNiArNTE5NCw3IEBACiAJCW1lbWNweShuaWMtPnByb2R1Y3RfbmFtZSwgJnZwZF9kYXRhWzNdLCB2cGRfZGF0YVsxXSk7CiAJfQogCWtmcmVlKHZwZF9kYXRhKTsKKwluaWMtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubWVtX2ZyZWVkICs9IDI1NjsKIH0KIAogLyoqCkBAIC01NzQyLDYgKzU5MTUsMzAgQEAKIAl9CiAJZWxzZQogCQl0bXBfc3RhdHNbaSsrXSA9IDA7CisJdG1wX3N0YXRzW2krK10gPSBzdGF0X2luZm8tPnN3X3N0YXQubWVtX2FsbG9jX2ZhaWxfY250OworCXRtcF9zdGF0c1tpKytdID0gc3RhdF9pbmZvLT5zd19zdGF0LndhdGNoZG9nX3RpbWVyX2NudDsKKwl0bXBfc3RhdHNbaSsrXSA9IHN0YXRfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NhdGVkOworCXRtcF9zdGF0c1tpKytdID0gc3RhdF9pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZDsKKwl0bXBfc3RhdHNbaSsrXSA9IHN0YXRfaW5mby0+c3dfc3RhdC5saW5rX3VwX2NudDsKKwl0bXBfc3RhdHNbaSsrXSA9IHN0YXRfaW5mby0+c3dfc3RhdC5saW5rX2Rvd25fY250OworCXRtcF9zdGF0c1tpKytdID0gc3RhdF9pbmZvLT5zd19zdGF0LmxpbmtfdXBfdGltZTsKKwl0bXBfc3RhdHNbaSsrXSA9IHN0YXRfaW5mby0+c3dfc3RhdC5saW5rX2Rvd25fdGltZTsKKworCXRtcF9zdGF0c1tpKytdID0gc3RhdF9pbmZvLT5zd19zdGF0LnR4X2J1Zl9hYm9ydF9jbnQ7CisJdG1wX3N0YXRzW2krK10gPSBzdGF0X2luZm8tPnN3X3N0YXQudHhfZGVzY19hYm9ydF9jbnQ7CisJdG1wX3N0YXRzW2krK10gPSBzdGF0X2luZm8tPnN3X3N0YXQudHhfcGFyaXR5X2Vycl9jbnQ7CisJdG1wX3N0YXRzW2krK10gPSBzdGF0X2luZm8tPnN3X3N0YXQudHhfbGlua19sb3NzX2NudDsKKwl0bXBfc3RhdHNbaSsrXSA9IHN0YXRfaW5mby0+c3dfc3RhdC50eF9saXN0X3Byb2NfZXJyX2NudDsKKworCXRtcF9zdGF0c1tpKytdID0gc3RhdF9pbmZvLT5zd19zdGF0LnJ4X3Bhcml0eV9lcnJfY250OworCXRtcF9zdGF0c1tpKytdID0gc3RhdF9pbmZvLT5zd19zdGF0LnJ4X2Fib3J0X2NudDsKKwl0bXBfc3RhdHNbaSsrXSA9IHN0YXRfaW5mby0+c3dfc3RhdC5yeF9wYXJpdHlfYWJvcnRfY250OworCXRtcF9zdGF0c1tpKytdID0gc3RhdF9pbmZvLT5zd19zdGF0LnJ4X3JkYV9mYWlsX2NudDsKKwl0bXBfc3RhdHNbaSsrXSA9IHN0YXRfaW5mby0+c3dfc3RhdC5yeF91bmtuX3Byb3RfY250OworCXRtcF9zdGF0c1tpKytdID0gc3RhdF9pbmZvLT5zd19zdGF0LnJ4X2Zjc19lcnJfY250OworCXRtcF9zdGF0c1tpKytdID0gc3RhdF9pbmZvLT5zd19zdGF0LnJ4X2J1Zl9zaXplX2Vycl9jbnQ7CisJdG1wX3N0YXRzW2krK10gPSBzdGF0X2luZm8tPnN3X3N0YXQucnhfcnhkX2NvcnJ1cHRfY250OworCXRtcF9zdGF0c1tpKytdID0gc3RhdF9pbmZvLT5zd19zdGF0LnJ4X3Vua25fZXJyX2NudDsKIH0KIAogc3RhdGljIGludCBzMmlvX2V0aHRvb2xfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC01ODU0LDYgKzYwNTEsNyBAQAogCS5nZXRfZWVwcm9tX2xlbiA9IHMyaW9fZ2V0X2VlcHJvbV9sZW4sCiAJLmdldF9lZXByb20gPSBzMmlvX2V0aHRvb2xfZ2VlcHJvbSwKIAkuc2V0X2VlcHJvbSA9IHMyaW9fZXRodG9vbF9zZWVwcm9tLAorCS5nZXRfcmluZ3BhcmFtID0gczJpb19ldGh0b29sX2dyaW5ncGFyYW0sCiAJLmdldF9wYXVzZXBhcmFtID0gczJpb19ldGh0b29sX2dldHBhdXNlX2RhdGEsCiAJLnNldF9wYXVzZXBhcmFtID0gczJpb19ldGh0b29sX3NldHBhdXNlX2RhdGEsCiAJLmdldF9yeF9jc3VtID0gczJpb19ldGh0b29sX2dldF9yeF9jc3VtLApAQCAtNTk2Miw3ICs2MTYwLDcgQEAKIAkJCWlmIChyZXQgPT0gLUVOT01FTSkgewogCQkJCURCR19QUklOVChJTkZPX0RCRywgIiVzOiBPdXQgb2YgIiwKIAkJCQkJICBkZXYtPm5hbWUpOwotCQkJCURCR19QUklOVChFUlJfREJHLCAibWVtb3J5IGluIHRhc2tsZXRcbiIpOworCQkJCURCR19QUklOVChJTkZPX0RCRywgIm1lbW9yeSBpbiB0YXNrbGV0XG4iKTsKIAkJCQlicmVhazsKIAkJCX0gZWxzZSBpZiAocmV0ID09IC1FRklMTCkgewogCQkJCURCR19QUklOVChJTkZPX0RCRywKQEAgLTYwNzcsOSArNjI3NSwxNCBAQAogCQkJKnNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZSk7CiAJCQlpZiAoISgqc2tiKSkgewogCQkJCURCR19QUklOVChJTkZPX0RCRywgIiVzOiBPdXQgb2YgIiwgZGV2LT5uYW1lKTsKLQkJCQlEQkdfUFJJTlQoSU5GT19EQkcsICJtZW1vcnkgdG8gYWxsb2NhdGUgU0tCc1xuIik7CisJCQkJREJHX1BSSU5UKElORk9fREJHLCAibWVtb3J5IHRvIGFsbG9jYXRlICIpOworCQkJCURCR19QUklOVChJTkZPX0RCRywgIjEgYnVmIG1vZGUgU0tCc1xuIik7CisJCQkJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuIFwKKwkJCQkJbWVtX2FsbG9jX2ZhaWxfY250Kys7CiAJCQkJcmV0dXJuIC1FTk9NRU0gOwogCQkJfQorCQkJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubWVtX2FsbG9jYXRlZCAKKwkJCQkrPSAoKnNrYiktPnRydWVzaXplOwogCQkJLyogc3RvcmluZyB0aGUgbWFwcGVkIGFkZHIgaW4gYSB0ZW1wIHZhcmlhYmxlCiAJCQkgKiBzdWNoIGl0IHdpbGwgYmUgdXNlZCBmb3IgbmV4dCByeGQgd2hvc2UKIAkJCSAqIEhvc3QgQ29udHJvbCBpcyBOVUxMCkBAIC02MDk5LDEwICs2MzAyLDE1IEBACiAJCX0gZWxzZSB7CiAJCQkqc2tiID0gZGV2X2FsbG9jX3NrYihzaXplKTsKIAkJCWlmICghKCpza2IpKSB7Ci0JCQkJREJHX1BSSU5UKElORk9fREJHLCAiJXM6IGRldl9hbGxvY19za2IgZmFpbGVkXG4iLAotCQkJCQlkZXYtPm5hbWUpOworCQkJCURCR19QUklOVChJTkZPX0RCRywgIiVzOiBPdXQgb2YgIiwgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoSU5GT19EQkcsICJtZW1vcnkgdG8gYWxsb2NhdGUgIik7CisJCQkJREJHX1BSSU5UKElORk9fREJHLCAiMiBidWYgbW9kZSBTS0JzXG4iKTsKKwkJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4gXAorCQkJCQltZW1fYWxsb2NfZmFpbF9jbnQrKzsKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCX0KKwkJCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9hbGxvY2F0ZWQgCisJCQkJKz0gKCpza2IpLT50cnVlc2l6ZTsKIAkJCSgoc3RydWN0IFJ4RDMqKXJ4ZHApLT5CdWZmZXIyX3B0ciA9ICp0ZW1wMiA9CiAJCQkJcGNpX21hcF9zaW5nbGUoc3AtPnBkZXYsICgqc2tiKS0+ZGF0YSwKIAkJCQkJICAgICAgIGRldi0+bXR1ICsgNCwKQEAgLTYxMjYsMTAgKzYzMzQsMTUgQEAKIAkJfSBlbHNlIHsKIAkJCSpza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemUpOwogCQkJaWYgKCEoKnNrYikpIHsKLQkJCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogZGV2X2FsbG9jX3NrYiBmYWlsZWRcbiIsCi0JCQkJCSAgZGV2LT5uYW1lKTsKKwkJCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogT3V0IG9mICIsIGRldi0+bmFtZSk7CisJCQkJREJHX1BSSU5UKElORk9fREJHLCAibWVtb3J5IHRvIGFsbG9jYXRlICIpOworCQkJCURCR19QUklOVChJTkZPX0RCRywgIjMgYnVmIG1vZGUgU0tCc1xuIik7CisJCQkJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuIFwKKwkJCQkJbWVtX2FsbG9jX2ZhaWxfY250Kys7CiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQl9CisJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5tZW1fYWxsb2NhdGVkIAorCQkJCSs9ICgqc2tiKS0+dHJ1ZXNpemU7CiAJCQkoKHN0cnVjdCBSeEQzKilyeGRwKS0+QnVmZmVyMF9wdHIgPSAqdGVtcDAgPQogCQkJCXBjaV9tYXBfc2luZ2xlKHNwLT5wZGV2LCBiYS0+YmFfMCwgQlVGMF9MRU4sCiAJCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwpAQCAtNjE0NywxMCArNjM2MCwxNCBAQAogCQkJaWYgKHNrYl9zaGluZm8oKnNrYiktPmZyYWdfbGlzdCA9PSBOVUxMKSB7CiAJCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczogZGV2X2FsbG9jX3NrYiBcCiAJCQkJCSAgZmFpbGVkXG4gIiwgZGV2LT5uYW1lKTsKKwkJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4gXAorCQkJCQltZW1fYWxsb2NfZmFpbF9jbnQrKzsKIAkJCQlyZXR1cm4gLUVOT01FTSA7CiAJCQl9CiAJCQlmcmFnX2xpc3QgPSBza2Jfc2hpbmZvKCpza2IpLT5mcmFnX2xpc3Q7CiAJCQlmcmFnX2xpc3QtPm5leHQgPSBOVUxMOworCQkJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubWVtX2FsbG9jYXRlZCAKKwkJCQkrPSBmcmFnX2xpc3QtPnRydWVzaXplOwogCQkJLyoKIAkJCSAqIEJ1ZmZlci0yIHJlY2VpdmVzIEw0IGRhdGEgcGF5bG9hZAogCQkJICovCkBAIC02NTY2LDYgKzY3ODMsNyBAQAogCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBkZXYtPnByaXY7CiAKIAlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKSB7CisJCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LndhdGNoZG9nX3RpbWVyX2NudCsrOwogCQlzY2hlZHVsZV93b3JrKCZzcC0+cnN0X3RpbWVyX3Rhc2spOwogCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5zb2Z0X3Jlc2V0X2NudCsrOwogCX0KQEAgLTY2MDYsNyArNjgyNCw1MyBAQAogCQlpZiAoZXJyICYgMHgxKSB7CiAJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5wYXJpdHlfZXJyX2NudCsrOwogCQl9CisJCWVyciA+Pj0gNDg7CisJCXN3aXRjaChlcnIpIHsKKwkJCWNhc2UgMToKKwkJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4KKwkJCQlyeF9wYXJpdHlfZXJyX2NudCsrOworCQkJYnJlYWs7CiAKKwkJCWNhc2UgMjoKKwkJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4KKwkJCQlyeF9hYm9ydF9jbnQrKzsKKwkJCWJyZWFrOworCisJCQljYXNlIDM6CisJCQkJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuCisJCQkJcnhfcGFyaXR5X2Fib3J0X2NudCsrOworCQkJYnJlYWs7CisKKwkJCWNhc2UgNDoKKwkJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4KKwkJCQlyeF9yZGFfZmFpbF9jbnQrKzsKKwkJCWJyZWFrOworCisJCQljYXNlIDU6CisJCQkJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuCisJCQkJcnhfdW5rbl9wcm90X2NudCsrOworCQkJYnJlYWs7CisKKwkJCWNhc2UgNjoKKwkJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4KKwkJCQlyeF9mY3NfZXJyX2NudCsrOworCQkJYnJlYWs7CisKKwkJCWNhc2UgNzoKKwkJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC4KKwkJCQlyeF9idWZfc2l6ZV9lcnJfY250Kys7CisJCQlicmVhazsKKworCQkJY2FzZSA4OgorCQkJCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LgorCQkJCXJ4X3J4ZF9jb3JydXB0X2NudCsrOworCQkJYnJlYWs7CisKKwkJCWNhc2UgMTU6CisJCQkJc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQuCisJCQkJcnhfdW5rbl9lcnJfY250Kys7CisJCQlicmVhazsKKwkJfQogCQkvKgogCQkqIERyb3AgdGhlIHBhY2tldCBpZiBiYWQgdHJhbnNmZXIgY29kZS4gRXhjZXB0aW9uIGJlaW5nCiAJCSogMHg1LCB3aGljaCBjb3VsZCBiZSBkdWUgdG8gdW5zdXBwb3J0ZWQgSVB2NiBleHRlbnNpb24gaGVhZGVyLgpAQCAtNjYxNCwxMCArNjg3OCwxMiBAQAogCQkqIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UsIHNpbmNlIGNoZWNrc3VtIHdpbGwgYmUgaW5jb3JyZWN0LAogCQkqIHN0YWNrIHdpbGwgdmFsaWRhdGUgdGhlIHNhbWUuCiAJCSovCi0JCWlmIChlcnIgJiYgKChlcnIgPj4gNDgpICE9IDB4NSkpIHsKKwkJaWYgKGVyciAhPSAweDUpIHsKIAkJCURCR19QUklOVChFUlJfREJHLCAiJXM6IFJ4IGVycm9yIFZhbHVlOiAweCVsbHhcbiIsCiAJCQkJZGV2LT5uYW1lLCBlcnIpOwogCQkJc3AtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKKwkJCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCAKKwkJCQkrPSBza2ItPnRydWVzaXplOwogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJYXRvbWljX2RlYygmc3AtPnJ4X2J1ZnNfbGVmdFtyaW5nX25vXSk7CiAJCQlyeGRwLT5Ib3N0X0NvbnRyb2wgPSAwOwpAQCAtNjYyNyw3ICs2ODkzLDYgQEAKIAogCS8qIFVwZGF0aW5nIHN0YXRpc3RpY3MgKi8KIAlyeGRwLT5Ib3N0X0NvbnRyb2wgPSAwOwotCXNwLT5zdGF0cy5yeF9wYWNrZXRzKys7CiAJaWYgKHNwLT5yeGRfbW9kZSA9PSBSWERfTU9ERV8xKSB7CiAJCWludCBsZW4gPSBSWERfR0VUX0JVRkZFUjBfU0laRV8xKHJ4ZHAtPkNvbnRyb2xfMik7CiAKQEAgLTY3MzEsNyArNjk5Niw3IEBACiAJfSBlbHNlIHsKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCX0KLQorCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0Lm1lbV9mcmVlZCArPSBza2ItPnRydWVzaXplOwogCWlmICghc3AtPmxybykgewogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQlpZiAoKHNwLT52bGdycCAmJiBSWERfR0VUX1ZMQU5fVEFHKHJ4ZHAtPkNvbnRyb2xfMikgJiYKQEAgLTY3ODAsMTIgKzcwNDUsMjEgQEAKIAkJaWYgKGxpbmsgPT0gTElOS19ET1dOKSB7CiAJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBMaW5rIGRvd25cbiIsIGRldi0+bmFtZSk7CiAJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJaWYoc3AtPm1hY19jb250cm9sLnN0YXRzX2luZm8tPnN3X3N0YXQubGlua191cF9jbnQpCisJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5saW5rX3VwX3RpbWUgPSAKKwkJCQlqaWZmaWVzIC0gc3AtPnN0YXJ0X3RpbWU7CisJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5saW5rX2Rvd25fY250Kys7CiAJCX0gZWxzZSB7CiAJCQlEQkdfUFJJTlQoRVJSX0RCRywgIiVzOiBMaW5rIFVwXG4iLCBkZXYtPm5hbWUpOworCQkJaWYgKHNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LmxpbmtfZG93bl9jbnQpCisJCQlzcC0+bWFjX2NvbnRyb2wuc3RhdHNfaW5mby0+c3dfc3RhdC5saW5rX2Rvd25fdGltZSA9IAorCQkJCWppZmZpZXMgLSBzcC0+c3RhcnRfdGltZTsKKwkJCXNwLT5tYWNfY29udHJvbC5zdGF0c19pbmZvLT5zd19zdGF0LmxpbmtfdXBfY250Kys7CiAJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAJCX0KIAl9CiAJc3AtPmxhc3RfbGlua19zdGF0ZSA9IGxpbms7CisJc3AtPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3MyaW8uaCBiL2RyaXZlcnMvbmV0L3MyaW8uaAppbmRleCBhNjU2ZDE4Li41NGJhYTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zMmlvLmgKKysrIGIvZHJpdmVycy9uZXQvczJpby5oCkBAIC05NSw2ICs5NSwzMiBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyBmbHVzaF9tYXhfcGt0czsKIAl1bnNpZ25lZCBsb25nIGxvbmcgc3VtX2F2Z19wa3RzX2FnZ3JlZ2F0ZWQ7CiAJdW5zaWduZWQgbG9uZyBsb25nIG51bV9hZ2dyZWdhdGlvbnM7CisJLyogT3RoZXIgc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBtZW1fYWxsb2NfZmFpbF9jbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHdhdGNoZG9nX3RpbWVyX2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWVtX2FsbG9jYXRlZDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWVtX2ZyZWVkOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsaW5rX3VwX2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGlua19kb3duX2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbGlua191cF90aW1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsaW5rX2Rvd25fdGltZTsKKworCS8qIFRyYW5zZmVyIENvZGUgc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyB0eF9idWZfYWJvcnRfY250OworCXVuc2lnbmVkIGxvbmcgbG9uZyB0eF9kZXNjX2Fib3J0X2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdHhfcGFyaXR5X2Vycl9jbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHR4X2xpbmtfbG9zc19jbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHR4X2xpc3RfcHJvY19lcnJfY250OworCisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X3Bhcml0eV9lcnJfY250OworCXVuc2lnbmVkIGxvbmcgbG9uZyByeF9hYm9ydF9jbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X3Bhcml0eV9hYm9ydF9jbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X3JkYV9mYWlsX2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcnhfdW5rbl9wcm90X2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcnhfZmNzX2Vycl9jbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X2J1Zl9zaXplX2Vycl9jbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X3J4ZF9jb3JydXB0X2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcnhfdW5rbl9lcnJfY250OwogfTsKIAogLyogWHBhayByZWxlYXRlZCBhbGFybSBhbmQgd2FybmluZ3MgKi8KQEAgLTMwOCw2ICszMzQsMTEgQEAKICNkZWZpbmUgTUFYX1RYX0ZJRk9TIDgKICNkZWZpbmUgTUFYX1JYX1JJTkdTIDgKIAorI2RlZmluZSBNQVhfUlhfREVTQ18xICAoTUFYX1JYX1JJTkdTICogTUFYX1JYX0JMT0NLU19QRVJfUklORyAqIDEyNyApCisjZGVmaW5lIE1BWF9SWF9ERVNDXzIgIChNQVhfUlhfUklOR1MgKiBNQVhfUlhfQkxPQ0tTX1BFUl9SSU5HICogODUgKQorI2RlZmluZSBNQVhfUlhfREVTQ18zICAoTUFYX1JYX1JJTkdTICogTUFYX1JYX0JMT0NLU19QRVJfUklORyAqIDg1ICkKKyNkZWZpbmUgTUFYX1RYX0RFU0MgICAgKE1BWF9BVkFJTEFCTEVfVFhEUykKKwogLyogRklGTyBtYXBwaW5ncyBmb3IgYWxsIHBvc3NpYmxlIG51bWJlciBvZiBmaWZvcyBjb25maWd1cmVkICovCiBzdGF0aWMgaW50IGZpZm9fbWFwW11bTUFYX1RYX0ZJRk9TXSA9IHsKIAl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCkBAIC04MTksNiArODUwLDcgQEAKICNkZWZpbmUJTElOS19VUAkJMgogCiAJaW50IHRhc2tfZmxhZzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnRfdGltZTsKICNkZWZpbmUgQ0FSRF9ET1dOIDEKICNkZWZpbmUgQ0FSRF9VUCAyCiAJYXRvbWljX3QgY2FyZF9zdGF0ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NnaXNlZXEuYyBiL2RyaXZlcnMvbmV0L3NnaXNlZXEuYwppbmRleCAxZmM3NzMwLi4yMTA2YmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zZ2lzZWVxLmMKKysrIGIvZHJpdmVycy9uZXQvc2dpc2VlcS5jCkBAIC0xNiwxMSArMTYsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKICNpbmNsdWRlIDxhc20vc2dpL2hwYzMuaD4KICNpbmNsdWRlIDxhc20vc2dpL2lwMjIuaD4KKyNpbmNsdWRlIDxhc20vc2dpL3NlZXEuaD4KIAogI2luY2x1ZGUgInNnaXNlZXEuaCIKIApAQCAtOTIsMTMgKzk0LDkgQEAKIAogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCi0Jc3RydWN0IG5ldF9kZXZpY2UgKm5leHRfbW9kdWxlOwogCXNwaW5sb2NrX3QgdHhfbG9jazsKIH07CiAKLS8qIEEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIHNlZXEgZGV2aWNlcywgZm9yIHJlbW92aW5nIHRoZSBkcml2ZXIgbW9kdWxlLiAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpyb290X3NnaXNlZXFfZGV2OwotCiBzdGF0aWMgaW5saW5lIHZvaWQgaHBjM19ldGhfcmVzZXQoc3RydWN0IGhwYzNfZXRocmVncyAqaHJlZ3MpCiB7CiAJaHJlZ3MtPnJlc2V0ID0gSFBDM19FUlNUX0NSRVNFVCB8IEhQQzNfRVJTVF9DTFJJUlE7CkBAIC02MjQsOSArNjIyLDEyIEBACiAKICNkZWZpbmUgQUxJR05FRCh4KSAgKCgoKHVuc2lnbmVkIGxvbmcpKHgpKSArIDB4ZikgJiB+KDB4ZikpCiAKLXN0YXRpYyBpbnQgc2dpc2VlcV9pbml0KHN0cnVjdCBocGMzX3JlZ3MqIGhwY3JlZ3MsIGludCBpcnEsIGludCBoYXNfZWVwcm9tKQorc3RhdGljIGludCBfX2luaXQgc2dpc2VlcV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBzZ2lzZWVxX3BsYXRmb3JtX2RhdGEgKnBkID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGhwYzNfcmVncyAqaHBjcmVncyA9IHBkLT5ocGM7CiAJc3RydWN0IHNnaXNlZXFfaW5pdF9ibG9jayAqc3I7CisJdW5zaWduZWQgaW50IGlycSA9IHBkLT5pcnE7CiAJc3RydWN0IHNnaXNlZXFfcHJpdmF0ZSAqc3A7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlpbnQgZXJyLCBpOwpAQCAtNjM3LDYgKzYzOCw4IEBACiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX291dDsKIAl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCXNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCS8qIE1ha2UgcHJpdmF0ZSBkYXRhIHBhZ2UgYWxpZ25lZCAqLwpAQCAtNjQ4LDE1ICs2NTEsNyBAQAogCX0KIAlzcC0+c3JpbmdzID0gc3I7CiAKLSNkZWZpbmUgRUFERFJfTlZPRlMgICAgIDI1MAotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJdW5zaWduZWQgc2hvcnQgdG1wID0gaGFzX2VlcHJvbSA/Ci0JCQlpcDIyX2VlcHJvbV9yZWFkKCZocGNyZWdzLT5lZXByb20sIEVBRERSX05WT0ZTIC8gMitpKSA6Ci0JCQlpcDIyX252cmFtX3JlYWQoRUFERFJfTlZPRlMgLyAyK2kpOwotCi0JCWRldi0+ZGV2X2FkZHJbMiAqIGldICAgICA9IHRtcCA+PiA4OwotCQlkZXYtPmRldl9hZGRyWzIgKiBpICsgMV0gPSB0bXAgJiAweGZmOwotCX0KKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgcGQtPm1hYywgRVRIX0FMRU4pOwogCiAjaWZkZWYgREVCVUcKIAlncHJpdiA9IHNwOwpAQCAtNzIwLDkgKzcxNSw2IEBACiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJcHJpbnRrKCIlMi4yeCVjIiwgZGV2LT5kZXZfYWRkcltpXSwgaSA9PSA1ID8gJ1xuJyA6ICc6Jyk7CiAKLQlzcC0+bmV4dF9tb2R1bGUgPSByb290X3NnaXNlZXFfZGV2OwotCXJvb3Rfc2dpc2VlcV9kZXYgPSBkZXY7Ci0KIAlyZXR1cm4gMDsKIAogZXJyX291dF9mcmVlX3BhZ2U6CkBAIC03MzQsNDMgKzcyNiw0MiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHNnaXNlZXFfcHJvYmUodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZ2lzZWVxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXVuc2lnbmVkIGludCB0bXAsIHJldDEsIHJldDIgPSAwOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcCA9IG5ldGRldl9wcml2KGRldik7CiAKLQkvKiBPbiBib2FyZCBhZGFwdGVyIG9uIDFzdCBIUEMgaXMgYWx3YXlzIHByZXNlbnQgKi8KLQlyZXQxID0gc2dpc2VlcV9pbml0KGhwYzNjMCwgU0dJX0VORVRfSVJRLCAwKTsKLQkvKiBMZXQncyBzZWUgaWYgc2Vjb25kIEhQQyBpcyB0aGVyZSAqLwotCWlmICghKGlwMjJfaXNfZnVsbGhvdXNlKCkpICYmCi0JICAgIGdldF9kYmUodG1wLCAodW5zaWduZWQgaW50ICopJmhwYzNjMS0+cGJkbWFbMV0pID09IDApIHsKLQkJc2dpbWMtPmdpb3BhciB8PSBTR0lNQ19HSU9QQVJfTUFTVEVSRVhQMSB8Ci0JCQkJIFNHSU1DX0dJT1BBUl9FWFAxNjQgfAotCQkJCSBTR0lNQ19HSU9QQVJfSFBDMjY0OwotCQlocGMzYzEtPnBidXNfcGlvY2ZnWzBdWzBdID0gMHgzZmZmZjsKLQkJLyogaW50ZXJydXB0L2NvbmZpZyByZWdpc3RlciBvbiBDaGFsbGVuZ2UgUyBNZXp6IGJvYXJkICovCi0JCWhwYzNjMS0+cGJ1c19leHRyZWdzWzBdWzBdID0gMHgzMDsKLQkJcmV0MiA9IHNnaXNlZXFfaW5pdChocGMzYzEsIFNHSV9HSU9fMF9JUlEsIDEpOwotCX0KLQotCXJldHVybiAocmV0MSAmIHJldDIpID8gcmV0MSA6IDA7CisJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHNwLT5zcmluZ3MpOworCWZyZWVfbmV0ZGV2KGRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBzZ2lzZWVxX2V4aXQodm9pZCkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV4dCwgKmRldjsKLQlzdHJ1Y3Qgc2dpc2VlcV9wcml2YXRlICpzcDsKLQotCWZvciAoZGV2ID0gcm9vdF9zZ2lzZWVxX2RldjsgZGV2OyBkZXYgPSBuZXh0KSB7Ci0JCXNwID0gKHN0cnVjdCBzZ2lzZWVxX3ByaXZhdGUgKikgbmV0ZGV2X3ByaXYoZGV2KTsKLQkJbmV4dCA9IHNwLT5uZXh0X21vZHVsZTsKLQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBzcC0+c3JpbmdzKTsKLQkJZnJlZV9uZXRkZXYoZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNnaXNlZXFfZHJpdmVyID0geworCS5wcm9iZQk9IHNnaXNlZXFfcHJvYmUsCisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHNnaXNlZXFfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJzZ2lzZWVxIgogCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNnaXNlZXFfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZ2lzZWVxX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEcml2ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOwogfQogCi1tb2R1bGVfaW5pdChzZ2lzZWVxX3Byb2JlKTsKLW1vZHVsZV9leGl0KHNnaXNlZXFfZXhpdCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgc2dpc2VlcV9tb2R1bGVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzZ2lzZWVxX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNnaXNlZXFfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQoc2dpc2VlcV9tb2R1bGVfZXhpdCk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiU0dJIFNlZXEgODAwMyBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkxpbnV4L01JUFMgTWFpbGluZyBMaXN0IDxsaW51eC1taXBzQGxpbnV4LW1pcHMub3JnPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2tnZS5jIGIvZHJpdmVycy9uZXQvc2tnZS5jCmluZGV4IGUwNDg5NTcuLjc3NjY5MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrZ2UuYworKysgYi9kcml2ZXJzL25ldC9za2dlLmMKQEAgLTM4MDIsNiArMzgwMiw5IEBACiAJc3RydWN0IHNrZ2VfaHcgKmh3ICA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQgaSwgZXJyLCB3b2wgPSAwOwogCisJaWYgKCFodykKKwkJcmV0dXJuIDA7CisKIAllcnIgPSBwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtMzgzMCw2ICszODMzLDkgQEAKIAlzdHJ1Y3Qgc2tnZV9odyAqaHcgID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBpLCBlcnI7CiAKKwlpZiAoIWh3KQorCQlyZXR1cm4gMDsKKwogCWVyciA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKQEAgLTM4NjgsNiArMzg3NCw5IEBACiAJc3RydWN0IHNrZ2VfaHcgKmh3ICA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQgaSwgd29sID0gMDsKIAorCWlmICghaHcpCisJCXJldHVybjsKKwogCWZvciAoaSA9IDA7IGkgPCBody0+cG9ydHM7IGkrKykgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaHctPmRldltpXTsKIAkJc3RydWN0IHNrZ2VfcG9ydCAqc2tnZSA9IG5ldGRldl9wcml2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9za3kyLmMgYi9kcml2ZXJzL25ldC9za3kyLmMKaW5kZXggYTMwNzMxMC4uMTA0ZTIwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2t5Mi5jCisrKyBiL2RyaXZlcnMvbmV0L3NreTIuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCkBAIC0xMzAsNyArMTMxLDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjgpIH0sIC8qIDg4RUMwMzQgKi8KIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNjkpIH0sIC8qIDg4RUMwNDIgKi8KIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNkEpIH0sIC8qIDg4RTgwNTggKi8KLQl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDQzNkIpIH0sIC8qIDg4RTgwNzEgKi8KKy8vCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsIDB4NDM2QikgfSwgLyogODhFODA3MSAqLwogCXsgMCB9CiB9OwogCkBAIC0xNTAsNiArMTUxLDggQEAKIAkiRkUiLAkJLyogMHhiNyAqLwogfTsKIAorc3RhdGljIGludCBkbWlfYmxhY2tsaXN0ZWQ7CisKIC8qIEFjY2VzcyB0byBleHRlcm5hbCBQSFkgKi8KIHN0YXRpYyBpbnQgZ21fcGh5X3dyaXRlKHN0cnVjdCBza3kyX2h3ICpodywgdW5zaWduZWQgcG9ydCwgdTE2IHJlZywgdTE2IHZhbCkKIHsKQEAgLTI1MzEsNiArMjUzNCwxNyBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCisKKwkvKiBTb21lIEdpZ2FieXRlIG1vdGhlcmJvYXJkcyBoYXZlIDg4ZTgwNTYgYnV0IGNhdXNlIHByb2JsZW1zCisJICogVGhlcmUgaXMgc29tZSB1bnJlc29sdmVkIGhhcmR3YXJlIHJlbGF0ZWQgcHJvYmxlbSB0aGF0IGNhdXNlcworCSAqIGRlc2NyaXB0b3IgZXJyb3JzIGFuZCByZWNlaXZlIGRhdGEgY29ycnVwdGlvbi4KKwkgKi8KKwlpZiAoaHctPmNoaXBfaWQgPT0gQ0hJUF9JRF9ZVUtPTl9FQ19VICYmIGRtaV9ibGFja2xpc3RlZCkgeworCQlkZXZfZXJyKCZody0+cGRldi0+ZGV2LAorCQkJIjg4RTgwNTYgb24gdGhpcyBtb3RoZXJib2FyZCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwogCWh3LT5wbWRfdHlwZSA9IHNreTJfcmVhZDgoaHcsIEIyX1BNRF9UWVApOwogCWh3LT5wb3J0cyA9IDE7CiAJdDggPSBza3kyX3JlYWQ4KGh3LCBCMl9ZMl9IV19SRVMpOwpAQCAtMzU3OCwxNyArMzU5Miw2IEBACiAJCWdvdG8gZXJyX291dDsKIAl9CiAKLQkvKiBTb21lIEdpZ2FieXRlIG1vdGhlcmJvYXJkcyBoYXZlIDg4ZTgwNTYgYnV0IGNhdXNlIHByb2JsZW1zCi0JICogVGhlcmUgaXMgc29tZSB1bnJlc29sdmVkIGhhcmR3YXJlIHJlbGF0ZWQgcHJvYmxlbSB0aGF0IGNhdXNlcwotCSAqIGRlc2NyaXB0b3IgZXJyb3JzIGFuZCByZWNlaXZlIGRhdGEgY29ycnVwdGlvbi4KLQkgKi8KLQlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfTUFSVkVMTCAmJgotCSAgICBwZGV2LT5kZXZpY2UgPT0gMHg0MzY0ICYmIHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxNDU4KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSI4OEU4MDU2IG9uIEdpZ2FieXRlIG1vdGhlcmJvYXJkcyBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJZ290byBlcnJfb3V0X2Rpc2FibGU7Ci0JfQotCiAJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXNcbiIpOwpAQCAtMzczMiw2ICszNzM1LDcgQEAKIGVycl9vdXRfZGlzYWJsZToKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBlcnJfb3V0OgorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zNzg0LDYgKzM3ODgsOSBAQAogCXN0cnVjdCBza3kyX2h3ICpodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQgaSwgd29sID0gMDsKIAorCWlmICghaHcpCisJCXJldHVybiAwOworCiAJZGVsX3RpbWVyX3N5bmMoJmh3LT5pZGxlX3RpbWVyKTsKIAluZXRpZl9wb2xsX2Rpc2FibGUoaHctPmRldlswXSk7CiAKQEAgLTM4MTUsNiArMzgyMiw5IEBACiAJc3RydWN0IHNreTJfaHcgKmh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBpLCBlcnI7CiAKKwlpZiAoIWh3KQorCQlyZXR1cm4gMDsKKwogCWVyciA9IHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKQEAgLTM4NjEsNiArMzg3MSw5IEBACiAJc3RydWN0IHNreTJfaHcgKmh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBpLCB3b2wgPSAwOwogCisJaWYgKCFodykKKwkJcmV0dXJuOworCiAJZGVsX3RpbWVyX3N5bmMoJmh3LT5pZGxlX3RpbWVyKTsKIAluZXRpZl9wb2xsX2Rpc2FibGUoaHctPmRldlswXSk7CiAKQEAgLTM4OTcsOCArMzkxMCwyNCBAQAogCS5zaHV0ZG93biA9IHNreTJfc2h1dGRvd24sCiB9OwogCitzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSBicm9rZW5fZG1pX3RhYmxlW10gPSB7CisJeworCQkuaWRlbnQgPSAiR2lnYWJ5dGUgOTY1UC1TMyIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiR2lnYWJ5dGUgVGVjaG5vbG9neSBDby4sIEx0ZC4iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiOTY1UC1TMyIpLAorCisJCX0sCisJfSwKKwl7IH0KK307CisKIHN0YXRpYyBpbnQgX19pbml0IHNreTJfaW5pdF9tb2R1bGUodm9pZCkKIHsKKwkvKiBMb29rIGZvciBzaWNrIG1vdGhlcmJvYXJkcyAqLworCWlmIChkbWlfY2hlY2tfc3lzdGVtKGJyb2tlbl9kbWlfdGFibGUpKQorCQlkbWlfYmxhY2tsaXN0ZWQgPSAxOworCiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNreTJfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jIGIvZHJpdmVycy9uZXQvc3BpZGVyX25ldC5jCmluZGV4IGMxNWU5NzIuLjEwOGFkYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NwaWRlcl9uZXQuYworKysgYi9kcml2ZXJzL25ldC9zcGlkZXJfbmV0LmMKQEAgLTE3NSwxMiArMTc1LDEwIEBACiB7CiAJc3RydWN0IG1paV9waHkgKnBoeSA9ICZjYXJkLT5waHk7CiAJdTMyIGFkdmVydGlzZSA9IDA7Ci0JdTE2IGJtY3IsIGJtc3IsIHN0YXQxMDAwLCBlc3RhdDsKKwl1MTYgYm1zciwgZXN0YXQ7CiAKLQlibWNyICAgICA9IHNwaWRlcl9uZXRfcmVhZF9waHkoY2FyZC0+bmV0ZGV2LCBwaHktPm1paV9pZCwgTUlJX0JNQ1IpOwotCWJtc3IgICAgID0gc3BpZGVyX25ldF9yZWFkX3BoeShjYXJkLT5uZXRkZXYsIHBoeS0+bWlpX2lkLCBNSUlfQk1TUik7Ci0Jc3RhdDEwMDAgPSBzcGlkZXJfbmV0X3JlYWRfcGh5KGNhcmQtPm5ldGRldiwgcGh5LT5taWlfaWQsIE1JSV9TVEFUMTAwMCk7Ci0JZXN0YXQgICAgPSBzcGlkZXJfbmV0X3JlYWRfcGh5KGNhcmQtPm5ldGRldiwgcGh5LT5taWlfaWQsIE1JSV9FU1RBVFVTKTsKKwlibXNyICA9IHNwaWRlcl9uZXRfcmVhZF9waHkoY2FyZC0+bmV0ZGV2LCBwaHktPm1paV9pZCwgTUlJX0JNU1IpOworCWVzdGF0ID0gc3BpZGVyX25ldF9yZWFkX3BoeShjYXJkLT5uZXRkZXYsIHBoeS0+bWlpX2lkLCBNSUlfRVNUQVRVUyk7CiAKIAlpZiAoYm1zciAmIEJNU1JfMTBIQUxGKQogCQlhZHZlcnRpc2UgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCmluZGV4IDg4OTdmNTMuLjRmYzg2ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9LY29uZmlnCkBAIC0yLDEwICsyLDcgQEAKICMgd2FuIGRldmljZXMgY29uZmlndXJhdGlvbgogIwogCi1tZW51ICJXYW4gaW50ZXJmYWNlcyIKLQlkZXBlbmRzIG9uIE5FVERFVklDRVMKLQotY29uZmlnIFdBTgorbWVudWNvbmZpZyBXQU4KIAlib29sICJXYW4gaW50ZXJmYWNlcyBzdXBwb3J0IgogCS0tLWhlbHAtLS0KIAkgIFdpZGUgQXJlYSBOZXR3b3JrcyAoV0FOcyksIHN1Y2ggYXMgWC4yNSwgRnJhbWUgUmVsYXkgYW5kIGxlYXNlZApAQCAtMjMsMTAgKzIwLDEyIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2lmIFdBTgorCiAjIFRoZXJlIGlzIG5vIHdheSB0byBkZXRlY3QgYSBjb210cm9sIHN2MTEgLSBmb3JjZSBpdCBtb2R1bGFyIGZvciBub3cuCiBjb25maWcgSE9TVEVTU19TVjExCiAJdHJpc3RhdGUgIkNvbXRyb2wgSG9zdGVzcyBTVi0xMSBzdXBwb3J0IgotCWRlcGVuZHMgb24gV0FOICYmIElTQSAmJiBtICYmIElTQV9ETUFfQVBJICYmIElORVQKKwlkZXBlbmRzIG9uIElTQSAmJiBtICYmIElTQV9ETUFfQVBJICYmIElORVQKIAloZWxwCiAJICBEcml2ZXIgZm9yIENvbXRyb2wgSG9zdGVzcyBTVi0xMSBuZXR3b3JrIGNhcmQgd2hpY2gKIAkgIG9wZXJhdGVzIG9uIGxvdyBzcGVlZCBzeW5jaHJvbm91cyBzZXJpYWwgbGlua3MgYXQgdXAgdG8KQEAgLTM4LDcgKzM3LDcgQEAKICMgVGhlIENPU0EvU1JQIGRyaXZlciBoYXMgbm90IGJlZW4gdGVzdGVkIGFzIG5vbi1tb2R1bGFyIHlldC4KIGNvbmZpZyBDT1NBCiAJdHJpc3RhdGUgIkNPU0EvU1JQIHN5bmMgc2VyaWFsIGJvYXJkcyBzdXBwb3J0IgotCWRlcGVuZHMgb24gV0FOICYmIElTQSAmJiBtICYmIElTQV9ETUFfQVBJCisJZGVwZW5kcyBvbiBJU0EgJiYgbSAmJiBJU0FfRE1BX0FQSQogCS0tLWhlbHAtLS0KIAkgIERyaXZlciBmb3IgQ09TQSBhbmQgU1JQIHN5bmNocm9ub3VzIHNlcmlhbCBib2FyZHMuCiAKQEAgLTYyLDcgKzYxLDcgQEAKICMKIGNvbmZpZyBMQU5NRURJQQogCXRyaXN0YXRlICJMYW5NZWRpYSBDb3JwLiBTU0kvVi4zNSwgVDEvRTEsIEhTU0ksIFQzIGJvYXJkcyIKLQlkZXBlbmRzIG9uIFdBTiAmJiBQQ0kKKwlkZXBlbmRzIG9uIFBDSQogCS0tLWhlbHAtLS0KIAkgIERyaXZlciBmb3IgdGhlIGZvbGxvd2luZyBMYW4gTWVkaWEgZmFtaWx5IG9mIHNlcmlhbCBib2FyZHM6CiAKQEAgLTg5LDcgKzg4LDcgQEAKICMgVGhlcmUgaXMgbm8gd2F5IHRvIGRldGVjdCBhIFNlYWxldmVsIGJvYXJkLiBGb3JjZSBpdCBtb2R1bGFyCiBjb25maWcgU0VBTEVWRUxfNDAyMQogCXRyaXN0YXRlICJTZWFsZXZlbCBTeXN0ZW1zIDQwMjEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFdBTiAmJiBJU0EgJiYgbSAmJiBJU0FfRE1BX0FQSSAmJiBJTkVUCisJZGVwZW5kcyBvbiBJU0EgJiYgbSAmJiBJU0FfRE1BX0FQSSAmJiBJTkVUCiAJaGVscAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFNlYWxldmVsIFN5c3RlbXMgQUNCIDU2IHNlcmlhbCBJL08gYWRhcHRlci4KIApAQCAtOTksNyArOTgsNiBAQAogIyBHZW5lcmljIEhETEMKIGNvbmZpZyBIRExDCiAJdHJpc3RhdGUgIkdlbmVyaWMgSERMQyBsYXllciIKLQlkZXBlbmRzIG9uIFdBTgogCWhlbHAKIAkgIFNheSBZIHRvIHRoaXMgb3B0aW9uIGlmIHlvdXIgTGludXggYm94IGNvbnRhaW5zIGEgV0FOIChXaWRlIEFyZWEKIAkgIE5ldHdvcmspIGNhcmQgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyIGFuZCB5b3UgYXJlIHBsYW5uaW5nIHRvCkBAIC0xNjcsNyArMTY1LDcgQEAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbW1lbnQgIlguMjUvTEFQQiBzdXBwb3J0IGlzIGRpc2FibGVkIgotCWRlcGVuZHMgb24gV0FOICYmIEhETEMgJiYgKExBUEIhPW0gfHwgSERMQyE9bSkgJiYgTEFQQiE9eQorCWRlcGVuZHMgb24gSERMQyAmJiAoTEFQQiE9bSB8fCBIRExDIT1tKSAmJiBMQVBCIT15CiAKIGNvbmZpZyBQQ0kyMDBTWU4KIAl0cmlzdGF0ZSAiR29yYW1vIFBDSTIwMFNZTiBzdXBwb3J0IgpAQCAtMjMwLDEwICsyMjgsMTAgQEAKIAkgIE11bHRpbGluayBQUFAgb3ZlciB0aGUgUEMzMDAgc3luY2hyb25vdXMgY29tbXVuaWNhdGlvbiBib2FyZHMuCiAKIGNvbW1lbnQgIkN5Y2xhZGVzLVBDMzAwIE1MUFBQIHN1cHBvcnQgaXMgZGlzYWJsZWQuIgotCWRlcGVuZHMgb24gV0FOICYmIEhETEMgJiYgUEMzMDAgJiYgKFBQUD1uIHx8ICFQUFBfTVVMVElMSU5LIHx8IFBQUF9TWU5DX1RUWT1uIHx8ICFIRExDX1BQUCkKKwlkZXBlbmRzIG9uIEhETEMgJiYgUEMzMDAgJiYgKFBQUD1uIHx8ICFQUFBfTVVMVElMSU5LIHx8IFBQUF9TWU5DX1RUWT1uIHx8ICFIRExDX1BQUCkKIAogY29tbWVudCAiUmVmZXIgdG8gdGhlIGZpbGUgUkVBRE1FLm1scHBwLCBwcm92aWRlZCBieSBQQzMwMCBwYWNrYWdlLiIKLQlkZXBlbmRzIG9uIFdBTiAmJiBIRExDICYmIFBDMzAwICYmIChQUFA9biB8fCAhUFBQX01VTFRJTElOSyB8fCBQUFBfU1lOQ19UVFk9biB8fCAhSERMQ19QUFApCisJZGVwZW5kcyBvbiBIRExDICYmIFBDMzAwICYmIChQUFA9biB8fCAhUFBQX01VTFRJTElOSyB8fCBQUFBfU1lOQ19UVFk9biB8fCAhSERMQ19QUFApCiAKIGNvbmZpZyBQQzMwMFRPTwogCXRyaXN0YXRlICJDeWNsYWRlcyBQQzMwMCBSU1YvWDIxIGFsdGVybmF0aXZlIHN1cHBvcnQiCkBAIC0zMzgsNyArMzM2LDYgQEAKIAogY29uZmlnIERMQ0kKIAl0cmlzdGF0ZSAiRnJhbWUgUmVsYXkgRExDSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gV0FOCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgdGhlIEZyYW1lIFJlbGF5IHByb3RvY29sLgogCkBAIC0zODUsNyArMzgyLDcgQEAKICMgV2FuIHJvdXRlciBjb3JlLgogY29uZmlnIFdBTl9ST1VURVJfRFJJVkVSUwogCXRyaXN0YXRlICJXQU4gcm91dGVyIGRyaXZlcnMiCi0JZGVwZW5kcyBvbiBXQU4gJiYgV0FOX1JPVVRFUgorCWRlcGVuZHMgb24gV0FOX1JPVVRFUgogCS0tLWhlbHAtLS0KIAkgIENvbm5lY3QgTEFOIHRvIFdBTiB2aWEgTGludXggYm94LgogCkBAIC00NDAsNyArNDM3LDcgQEAKICMgWC4yNSBuZXR3b3JrIGRyaXZlcnMKIGNvbmZpZyBMQVBCRVRIRVIKIAl0cmlzdGF0ZSAiTEFQQiBvdmVyIEV0aGVybmV0IGRyaXZlciAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIFdBTiAmJiBMQVBCICYmIFgyNQorCWRlcGVuZHMgb24gTEFQQiAmJiBYMjUKIAktLS1oZWxwLS0tCiAJICBEcml2ZXIgZm9yIGEgcHNldWRvIGRldmljZSAodHlwaWNhbGx5IGNhbGxlZCAvZGV2L2xhcGIwKSB3aGljaCBhbGxvd3MKIAkgIHlvdSB0byBvcGVuIGFuIExBUEIgcG9pbnQtdG8tcG9pbnQgY29ubmVjdGlvbiB0byBzb21lIG90aGVyIGNvbXB1dGVyCkBAIC00NTYsNyArNDUzLDcgQEAKIAogY29uZmlnIFgyNV9BU1kKIAl0cmlzdGF0ZSAiWC4yNSBhc3luYyBkcml2ZXIgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBXQU4gJiYgTEFQQiAmJiBYMjUKKwlkZXBlbmRzIG9uIExBUEIgJiYgWDI1CiAJLS0taGVscC0tLQogCSAgU2VuZCBhbmQgcmVjZWl2ZSBYLjI1IGZyYW1lcyBvdmVyIHJlZ3VsYXIgYXN5bmNocm9ub3VzIHNlcmlhbAogCSAgbGluZXMgc3VjaCBhcyB0ZWxlcGhvbmUgbGluZXMgZXF1aXBwZWQgd2l0aCBvcmRpbmFyeSBtb2RlbXMuCkBAIC00NzEsNyArNDY4LDcgQEAKIAogY29uZmlnIFNCTkkKIAl0cmlzdGF0ZSAiR3JhbmNoIFNCTkkxMiBMZWFzZWQgTGluZSBhZGFwdGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBXQU4gJiYgWDg2CisJZGVwZW5kcyBvbiBYODYKIAktLS1oZWxwLS0tCiAJICBEcml2ZXIgZm9yIElTQSBTQk5JMTIteHggY2FyZHMgd2hpY2ggYXJlIGxvdyBjb3N0IGFsdGVybmF0aXZlcyB0bwogCSAgbGVhc2VkIGxpbmUgbW9kZW1zLgpAQCAtNDk3LDUgKzQ5NCw0IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKLWVuZG1lbnUKLQorZW5kaWYgIyBXQU4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvTWFrZWZpbGUKaW5kZXggMTljOTM1MC4uNTZhOGVhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvTWFrZWZpbGUKQEAgLTEsNSArMSwzIEBACi0jIEVYVFJBX0NGTEFHUyArPSAtV3BhY2tlZAotCiB1c2I4eHh4LW9ianMgOj0gbWFpbi5vIGZ3Lm8gd2V4dC5vIFwKIAkJcngubyB0eC5vIGNtZC5vIAkgIFwKIAkJY21kcmVzcC5vIHNjYW4ubwkgIFwKQEAgLTcsMTMgKzUsNiBAQAogCQlpb2N0bC5vIGRlYnVnZnMubwkgIFwKIAkJZXRodG9vbC5vIGFzc29jLm8KIAotaWZlcSAoJChDT05GSUdfTElCRVJUQVNfVVNCX0RFQlVHKSwgeSkKLUVYVFJBX0NGTEFHUyArPSAtRERFQlVHIC1EUFJPQ19ERUJVRwotZW5kaWYKLQotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIG5ld2VyIGJvb3QyIGJvb3Rsb2FkZXIgKHYgPj0gMzEwNCkKLUVYVFJBX0NGTEFHUyArPSAtRFNVUFBPUlRfQk9PVF9DT01NQU5ECiB1c2I4eHh4LW9ianMgKz0gaWZfYm9vdGNtZC5vCiB1c2I4eHh4LW9ianMgKz0gaWZfdXNiLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvUkVBRE1FIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvUkVBRE1FCmluZGV4IDY4OGRhNGMuLjM3ODU3NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL1JFQURNRQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9SRUFETUUKQEAgLTQwLDY0ICs0MCwxMSBAQAogU1lOT1BTSVMKIAlpd3ByaXYgPGV0aFg+IDxjb21tYW5kPiBbc3ViLWNvbW1hbmRdIC4uLgogCi0JaXdwcml2IGV0aFggdmVyc2lvbgotCWl3cHJpdiBldGhYIHNjYW50eXBlIFtzdWItY29tbWFuZF0KLQlpd3ByaXYgZXRoWCBnZXRTTlIgPG4+Ci0JaXdwcml2IGV0aFggZ2V0TkYgPG4+Ci0JaXdwcml2IGV0aFggZ2V0UlNTSSA8bj4KLQlpd3ByaXYgZXRoWCBzZXRyeGFudCA8bj4KLQlpd3ByaXYgZXRoWCBnZXRyeGFudAotCWl3cHJpdiBldGhYIHNldHR4YW50IDxuPgotCWl3cHJpdiBldGhYIGdldHR4YW50Ci0JaXdwcml2IGV0aFggYXV0aGFsZ3MgPG4+Ci0JaXdwcml2IGV0aFggcHJlLVRCVFQgPG4+Ci0JaXdwcml2IGV0aFggODAyMXhhdXRoYWxncyA8bj4KLQlpd3ByaXYgZXRoWCBlbmNyeXB0aW9ubW9kZSA8bj4KIAlpd3ByaXYgZXRoWCBzZXRyZWdpb25jb2RlIDxuPgogCWl3cHJpdiBldGhYIGdldHJlZ2lvbmNvZGUKLQlpd3ByaXYgZXRoWCBzZXRiY25hdmcgPG4+Ci0JaXdwcml2IGV0aFggZ2V0YmNuYXZnCi0JaXdwcml2IGV0aFggc2V0ZGF0YWF2ZyA8bj4KLQlpd3ByaXYgZXRoWCBzZXRsaXN0ZW5pbnRlciA8bj4KLQlpd3ByaXYgZXRoWCBnZXRsaXN0ZW5pbnRlcgotCWl3cHJpdiBldGhYIHNldG11bHRpcGxlZHRpbSA8bj4KLQlpd3ByaXYgZXRoWCBnZXRtdWx0aXBsZWR0aW0KLQlpd3ByaXYgZXRoWCBhdGltd2luZG93IDxuPgotCWl3cHJpdiBldGhYIGRlYXV0aAotCWl3cHJpdiBldGhYIGFkaG9jc3RvcAotCWl3cHJpdiBldGhYIHJhZGlvb24KLQlpd3ByaXYgZXRoWCByYWRpb29mZgotCWl3cHJpdiBldGhYIHJlYXNzby1vbgotCWl3cHJpdiBldGhYIHJlYXNzby1vZmYKLQlpd3ByaXYgZXRoWCBzY2FubW9kZSAgW3N1Yi1jb21tYW5kXQotCWl3cHJpdiBldGhYIHNldHdwYWllIDxuPgotCWl3cHJpdiBldGhYIHdsYW5pZGxlLW9mZgotCWl3cHJpdiBldGhYIHdsYW5pZGxlLW9uCi0JaXdwcml2IGV0aFggZ2V0Y2lzCi0JaXdwcml2IGV0aFggZ2V0bG9nCi0JaXdwcml2IGV0aFggZ2V0YWRob2NzdGF0dXMKLQlpd3ByaXYgZXRoWCBhZGhvY2dyYXRlIDxuPgotCi1WZXJzaW9uIDQgQ29tbWFuZDoKLQlpd3ByaXYgZXRoWCBpbmFjdHZpdHl0byA8bj4KLQlpd3ByaXYgZXRoWCBzbGVlcHBkIDxuPgotCWl3cHJpdiBldGhYIGVuYWJsZTExZCA8bj4KLQlpd3ByaXYgZXRoWCB0cGNjZmcgPG4+Ci0JaXdwcml2IGV0aFggcG93ZXJjZmcgPG4+Ci0JaXdwcml2IGV0aFggc2V0YWZjIDxuPgotCWl3cHJpdiBldGhYIGdldGFmYwogCiBWZXJzaW9uIDUgQ29tbWFuZDoKIAlpd3ByaXYgZXRoWCBsZWRncGlvIDxuPgotCWl3cHJpdiBldGhYIHNjYW5wcm9iZXMgPG4+Ci0JaXdwcml2IGV0aFggbG9saXN0ZW5pbnRlciA8bj4KLQlpd3ByaXYgZXRoWCByYXRlYWRhcHQgPG4+IDxtPgotCWl3cHJpdiBldGhYIHR4Y29udHJvbCA8bj4KLQlpd3ByaXYgZXRoWCBwc251bGxpbnRlcnZhbCA8bj4KLQlpd3ByaXYgZXRoWCBwcmVzY2FuIDxuPgotCWl3cHJpdiBldGhYIGdldHJ4aW5mbwotCWl3cHJpdiBldGhYIGdldHR4cmF0ZQotCWl3cHJpdiBldGhYIGJlYWNvbmludGVydmFsCiAKIEJUIENvbW1hbmRzOgogCVRoZSBibGluZGluZyB0YWJsZSAoQlQpIGNvbnRhaW5zIGEgbGlzdCBvZiBtYWMgYWRkcmVzc2VzIHRoYXQgc2hvdWxkIGJlCkBAIC0xNTAsMTE0ICs5Nyw2IEBACiAJVGhlIGV0aFggcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgbmV0d29yayBkZXZpY2UgdGhhdCBpcyB0byBiZSB1c2VkIHRvCiAJCXBlcmZvcm0gdGhpcyBjb21tYW5kIG9uLiBpdCBjb3VsZCBiZSBldGgwLCBldGgxIGV0Yy4KIAotdmVyc2lvbgotCVRoaXMgaXMgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGFuZCB0aGUgZmlybXdhcmUuCi0KLXNjYW50eXBlCi0JVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBzY2FuIHR5cGUgdG8gYmUgdXNlZCBieSB0aGUgZHJpdmVyIGluCi0JdGhlIHNjYW4gY29tbWFuZC4gVGhpcyBzZXR0aW5nIHdpbGwgbm90IGJlIHVzZWQgd2hpbGUgcGVyZm9ybWluZyBhIHNjYW4KLQlmb3IgYSBzcGVjaWZpYyBTU0lELCBhcyBpdCBpcyBhbHdheXMgZG9uZSB3aXRoIHNjYW4gdHlwZSBiZWluZyBhY3RpdmUuCi0KLQl3aGVyZSB0aGUgc3ViLWNvbW1hbmRzIGFyZTogLQotCQkJYWN0aXZlIAktLSB0byBzZXQgdGhlIHNjYW4gdHlwZSB0byBhY3RpdmUKLQkJCXBhc3NpdmUgLS0gdG8gc2V0IHRoZSBzY2FuIHR5cGUgdG8gcGFzc2l2ZQotCQkJZ2V0IAktLSB0byBnZXQgdGhlIHNjYW4gdHlwZSBzZXQgaW4gdGhlIGRyaXZlcgotCi1nZXRTTlIKLQlUaGlzIGNvbW1hbmQgZ2V0cyB0aGUgYXZlcmFnZSBhbmQgbm9uIGF2ZXJhZ2UgdmFsdWUgb2YgU2lnbmFsIHRvIE5vaXNlCi0JUmF0aW8gb2YgQmVhY29uIGFuZCBEYXRhLgotCi0Jd2hlcmUgdmFsdWUgaXM6LQotCQkJMCAJLS0gQmVhY29uIG5vbi1hdmVyYWdlLgotCQkJMSAJLS0gQmVhY29uIGF2ZXJhZ2UuCi0JCQkyIAktLSBEYXRhIG5vbi1hdmVyYWdlLgotCQkJMyAJLS0gRGF0YSBhdmVyYWdlLgotCi0JSWYgbm8gdmFsdWUgaXMgZ2l2ZW4sIGFsbCBmb3VyIHZhbHVlcyBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIG1lbnRpb25lZAotCWFib3ZlLgotCi0JTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KLQotZ2V0UlNTSQotCVRoaXMgY29tbWFuZCBnZXRzIHRoZSBhdmVyYWdlIGFuZCBub24gYXZlcmFnZSB2YWx1ZSBvcyBSZWNlaXZlIFNpZ25hbAotCVN0cmVuZ3RoIG9mIEJlYWNvbiBhbmQgRGF0YS4KLQotCXdoZXJlIHZhbHVlIGlzOi0KLQkJCTAgCS0tIEJlYWNvbiBub24tYXZlcmFnZS4KLQkJCTEgCS0tIEJlYWNvbiBhdmVyYWdlLgotCQkJMiAJLS0gRGF0YSBub24tYXZlcmFnZS4KLQkJCTMgCS0tIERhdGEgYXZlcmFnZS4KLQotCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCi0KLWdldE5GCi0JVGhpcyBjb21tYW5kIGdldHMgdGhlIGF2ZXJhZ2UgYW5kIG5vbiBhdmVyYWdlIHZhbHVlIG9mIE5vaXNlIEZsb29yIG9mCi0JQmVhY29uIGFuZCBEYXRhLgotCi0Jd2hlcmUgdmFsdWUgaXM6LQotCQkJMCAJLS0gQmVhY29uIG5vbi1hdmVyYWdlLgotCQkJMSAJLS0gQmVhY29uIGF2ZXJhZ2UuCi0JCQkyIAktLSBEYXRhIG5vbi1hdmVyYWdlLgotCQkJMyAJLS0gRGF0YSBhdmVyYWdlLgotCi0JTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KLQotc2V0cnhhbnQKLQlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIG1vZGUgZm9yIFJ4IGFudGVubmEuCi0KLQlUaGUgb3B0aW9ucyB0aGF0IGNhbiBiZSBzZW50IGFyZTotCi0JCQkxIAktLSBBbnRlbm5hIDEuCi0JCQkyIAktLSBBbnRlbm5hIDIuCi0JCQkweEZGRkYgCS0tIERpdmVyc2l0eS4KLQotCVVzYWdlOgotCQlpd3ByaXYgZXRoWCBzZXRyeGFudCAweDAxOiBzZWxlY3QgQW50ZW5uYSAxLgotCi1nZXRyeGFudAotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgbW9kZSBmb3IgUnggYW50ZW5uYS4KLQotCi1zZXR0eGFudAotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgbW9kZSBmb3IgVHggYW50ZW5uYS4KLQkJVGhlIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2VudCBhcmU6LQotCQkJMSAJLS0gQW50ZW5uYSAxLgotCQkJMiAJLS0gQW50ZW5uYSAyLgotCQkJMHhGRkZGIAktLSBEaXZlcnNpdHkuCi0JVXNhZ2U6Ci0JCWl3cHJpdiBldGhYIHNldHR4YW50IDB4MDE6IHNlbGVjdCBBbnRlbm5hIDEuCi0KLWdldHR4YW50Ci0JVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gZ2V0IHRoZSBtb2RlIGZvciBUeCBhbnRlbm5hLgotCi1hdXRoYWxncwotCVRoaXMgY29tbWFuZCBpcyB1c2VkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudCB0byBzZXQgdGhlIGF1dGhlbnRpY2F0aW9uCi0JYWxnb3JpdGhtcyBpbiB0aGUgc3RhdGlvbi4KLQotODAyMXhhdXRoYWxncwotCVRoaXMgY29tbWFuZCBpcyB1c2VkIGJ5IHRoZSBXUEEgc3VwcGxpY2FudCB0byBzZXQgdGhlIDgwMjEueCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gdHlwZQotCXN0YXRpb24uCi0KLQl3aGVyZSB2YWx1ZXMgY2FuIGJlOi0KLQkJCTEgCS0tIE5vbmUKLQkJCTIgCS0tIExFQVAKLQkJCTQgCS0tIFRMUwotCQkJOCAJLS0gVFRMcwotCQkJMTYJLS0gTUQ1Ci0KLQotZW5jcnlwdGlvbm1vZGUKLQlUaGlzIGNvbW1hbmQgaXMgdXNlZCBieSB0aGUgV1BBIHN1cHBsaWNhbnQgdG8gc2V0IHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobS4KLQotCXdoZXJlIHZhbHVlcyBjYW4gYmU6LQotCQkJMCAJLS0gTk9ORQotCQkJMSAJLS0gV0VQNDAKLQkJCTIgCS0tIFRLSVAKLQkJCTMgCS0tIENDTVAKLQkJCTQgCS0tIFdFUDEwNAotCi1wcmUtVEJUVAotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCBwcmUtVEJUVCB0aW1lIHBlcmlvZCB3aGVyZSB2YWx1ZSBpcyBpbiBtaWNyb3NlY29uZHMuCi0KIHNldHJlZ2lvbmNvZGUKIAlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIHJlZ2lvbiBjb2RlIGluIHRoZSBzdGF0aW9uLgogCXdoZXJlIHZhbHVlIGlzICdyZWdpb24gY29kZScgZm9yIHZhcmlvdXMgcmVnaW9ucyBsaWtlCkBAIC0yNzAsMTE0ICsxMDksNiBAQAogCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgcmVnaW9uIGNvZGUgaW5mb3JtYXRpb24gc2V0IGluIHRoZQogCXN0YXRpb24uCiAKLXNldGJjbmF2ZwotCVNldCB0aGUgd2VpZ2h0aW5nIGZhY3RvciBmb3IgY2FsY3VsYXRpbmcgUlNTSS4KLQotZ2V0YmNuYXZnCi0JR2V0IHdlaWdodGluZyBmYWN0b3IgZm9yIGNhbGN1bGF0aW5nIFJTU0kuCi0KLXNldGRhdGFhdmcKLQlTZXQgdGhlIHdlaWdodGluZyBmYWN0b3IgZm9yIGNhbGN1bGF0aW5nIFNOUi4KLQotc2V0bGlzdGVuaW50ZXIKLQlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQgdGhlIGxpc3RlbiBpbnRlcnZhbCBpbiB0aGUKLQlzdGF0aW9uLgotCi0Jd2hlcmUgdGhlIHZhbHVlIHJhbmdlcyBiZXR3ZWVuIDEgLSAyNTUKLQotZ2V0bGlzdGVuaW50ZXIKLQlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIGxpc3RlbiBpbnRlcnZhbCB2YWx1ZSBzZXQgaW4gdGhlCi0Jc3RhdGlvbi4KLQotc2V0bXVsdGlwbGVkdGltCi0JVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBtdWx0aXBsZSBkdGltIHZhbHVlIGluIHRoZQotCXN0YXRpb24uCi0JCXdoZXJlIHRoZSB2YWx1ZSBpcyAxLDIsMyw0LDUsMHhmZmZlCi0JCTB4ZmZmZSBtZWFucyB0aGUgZmlybXdhcmUgd2lsbCB1c2UgbGlzdGVuIGludGVydmFsIGluIGFzc29jaWF0aW9uCi0JCWNvbW1hbmQgZm9yIHdha2luZyB1cAotCi1nZXRtdWx0aXBsZWR0aW0KLQlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIG11bHRpcGxlIGR0aW0gdmFsdWUgc2V0IGluIHRoZSBzdGF0aW9uLgotCi1hdGltd2luZG93Ci0JVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBhdGltIHZhbHVlIGluIHRoZQotCXN0YXRpb24uCi0KLQl3aGVyZSB0aGUgdmFsdWUgcmFuZ2VzIGJldHdlZW4gMCAtIDUwCi0KLWRlYXV0aAotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNlbmQgdGhlIGRlLWF1dGhlbnRpY2F0aW9uIHRvIHRoZSBBUCB3aXRoIHdoaWNoCi0JdGhlIHN0YXRpb24gaXMgYXNzb2NpYXRlZC4gVGhpcyBjb21tYW5kIGlzIHZhbGlkIG9ubHkgd2hlbgotCXN0YXRpb24gaXMgaW4gSW5mcmFzdHJ1Y3R1cmUgbW9kZS4KLQotCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCi0KLWFkaG9jc3RvcAotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHN0b3AgYmVhY29uIHRyYW5zbWlzc2lvbiBmcm9tIHRoZSBzdGF0aW9uIGFuZAotCWdvIGludG8gaWRsZSBzdGF0ZSBpbiBhZC1ob2MgbW9kZS4KLQotCU5vdGU6IFRoaXMgY29tbWFuZCBpcyBhdmFpbGFibGUgb25seSB3aGVuIFNUQSBpcyBjb25uZWN0ZWQuCi0KLXJhZGlvb24KLQlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byB0dXJuIG9uIHRoZSBSRiBhbnRlbm5hLgotCi1yYWRpb29mZgotCVRoaXMgY29tbWFuZCBpcyBzdWVkIHRvIHR1cm4gb2ZmIHRoZSBSRiBhbnRlbm5hLgotCi1zY2FubW9kZQotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgc3RhdGlvbiB0byBzY2FuIGZvciBlaXRoZXIgSUJTUwotCW5ldHdvcmtzIG9yIEJTUyBuZXR3b3JrcyBvciBib3RoIEJTUyBhbmQgSUJTUyBuZXR3b3Jrcy4gVGhpcwotCWNvbW1hbmQgY2FuIGJlIHVzZWQgd2l0aCBzdWIgY29tbWFuZHMsCi0KLQl3aGVyZSB0aGUgdmFsdWUgZm9yCi0JCQlic3MgCS0tIFNjYW4gQWxsIHRoZSBCU1MgbmV0d29ya3MuCi0JCQlpYnNzIAktLSBTY2FuIEFsbCB0aGUgSUJTUyBuZXR3b3Jrcy4KLQkJCWFueSAJLS0gU2NhbiBib3RoIEJTUyBhbmQgSUJTUyBuZXR3b3Jrcy4KLQotCi0KLXNldHdwYWllCi0JVGhpcyBjb21tYW5kIGlzIHVzZWQgYnkgV1BBIHN1cHBsaWNhbnQgdG8gc2VuZCB0aGUgV1BBLUlFIHRvIHRoZSBkcml2ZXIuCi0KLXdsYW5pZGxlLW9mZgotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCBpbnRvIGlkbGUgc3RhdGUuCi0KLQlOb3RlOiBUaGlzIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBTVEEgaXMgY29ubmVjdGVkLgotCi13bGFuaWRsZS1vbgotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCBvZmYgdGhlIGlkbGUgc3RhdGUuCi0KLQlOb3RlOiBUaGlzIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgd2hlbiBTVEEgaXMgY29ubmVjdGVkLgotCi0KLWdldGxvZwotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGdldCB0aGUgODAyLjExIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGluIHRoZQotCQlzdGF0aW9uLgotCi0JTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KLQotZ2V0YWRob2NzdGF0dXMKLQlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBnZXQgdGhlIGFkLWhvYyBOZXR3b3JrIFN0YXR1cy4KLQotCVRoZSB2YXJpb3VzIHN0YXR1cyBjb2RlcyBhcmU6Ci0JCUFkaG9jU3RhcnRlZAotCQlBZGhvY0pvaW5lZAotCQlBZGhvY0lkbGUKLQkJSW5mcmFNb2RlCi0JCUF1dG9Vbmtub3duTW9kZQotCi0JTm90ZTogVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBvbmx5IHdoZW4gU1RBIGlzIGNvbm5lY3RlZC4KLQotYWRob2NncmF0ZQotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGVuYWJsZSgxKSBnX3JhdGUsIERpc2FibGUoMCkgZ19yYXRlCi0JYW5kIHJlcXVlc3QoMikgdGhlIHN0YXR1cyB3aGljaCBnX3JhdGUgaXMgZGlzYWJsZWQvZW5hYmxlZCwKLQlmb3IgQWQtaG9jIGNyZWF0b3IuCi0KLQl3aGVyZSB2YWx1ZSBpczotCi0JCTAJLS0gRGlzYWJsZWQKLQkJMQktLSBFbmFibGVkCi0JCTIJLS0gR2V0Ci0KIGxlZGdwaW8KIAlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBzZXQvZ2V0IExFRHMuCiAKQEAgLTQwMCwyNTMgKzEzMSw2IEBACiAJTm90ZTogTEVEMCBpcyBpbnZhbGlkCiAJTm90ZTogTWF4aW11bSBOdW1iZXIgb2YgTEVEcyBhcmUgMTYuCiAKLWluYWN0aXZpdHl0bwotCVRoaXMgY29tbWFuZCBpcyB1c2VkIGJ5IHRoZSBob3N0IHRvIHNldC9nZXQgdGhlIGluYWN0aXZpdHkgdGltZW91dCB2YWx1ZSwKLQl3aGljaCBzcGVjaWZpZXMgd2hlbiBXTEFOIGRldmljZSBpcyBwdXQgdG8gc2xlZXAuCi0KLQlVc2FnZToKLQkJaXdwcml2IGV0aFggaW5hY3Rpdml0eXRvIFs8dGltZW91dD5dCi0KLQl3aGVyZSB0aGUgcGFyYW1ldGVyIGFyZToKLQkJdGltZW91dDogdGltZW91dCB2YWx1ZSBpbiBtaWxsaXNlY29uZHMuCi0KLQlFeGFtcGxlOgotCQlpd3ByaXYgZXRoMSBpbmFjdGl2aXR5dG8KLQkJCSJnZXQgdGhlIHRpbWVvdXQgdmFsdWUiCi0KLQkJaXdwcml2IGV0aDEgaW5hY3Rpdml0eXRvIFgKLQkJCSJzZXQgdGltZW91dCB2YWx1ZSB0byBYIG1zIgotCi0KLXNsZWVwcGQKLQlUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIHNsZWVwIHBlcmlvZCBvZiB0aGUgV0xBTiBkZXZpY2UuCi0KLQlVc2FnZToKLQkJaXdwcml2IGV0aFggc2xlZXBwZCBbPHNsZWVwIHBlcmlvZD5dCi0KLQl3aGVyZSB0aGUgcGFyYW1ldGVyIGFyZToKLQkJUGVyaW9kOiBzbGVlcCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzLiBSYW5nZSAxMH42MC4KLQotCUV4YW1wbGU6Ci0JCWl3cHJpdiBldGgxIHNsZWVwcGQgMTAKLQkJCSJzZXQgcGVyaW9kIGFzIDEwIG1zIgotCQlpd3ByaXYgZXRoMSBzbGVlcHBkCi0JCQkiZ2V0IHRoZSBzbGVlcCBwZXJpb2QgY29uZmlndXJhdGlvbiIKLQotZW5hYmxlMTFkCi0JVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gY29udHJvbCAxMWQKLQl3aGVyZSB2YWx1ZSBpczotCi0JCTEJLS0gRW5hYmxlZAotCQkwCS0tIERpc2FibGVkCi0JCTIJLS0gR2V0Ci0KLQotCi0KLXRwY2NmZwotCUVuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljIHRyYW5zbWl0IHBvd2VyIGNvbnRyb2wuCi0KLQlUaGUgZmlyc3QgcGFyYW1ldGVyIHR1cm5zIHRoaXMgZmVhdHVyZSBvbiAoMSkgb3Igb2ZmICgwKS4gIFdoZW4gdHVybmluZwotCW9uLCB0aGUgdXNlciBtdXN0IGFsc28gc3VwcGx5IGZvdXIgbW9yZSBwYXJhbWV0ZXJzIGluIHRoZSBmb2xsb3dpbmcKLQlvcmRlcjoKLQkJLVVzZVNOUiAoVXNlIFNOUiAoaW4gYWRkaXRpb24gdG8gUEVSKSBmb3IgVFBDIGFsZ29yaXRobSksCi0JCS1QMCAoUDAgcG93ZXIgbGV2ZWwgZm9yIFRQQyksCi0JCS1QMSAoUDEgcG93ZXIgbGV2ZWwgZm9yIFRQQyksCi0JCS1QMiAoUDIgcG93ZXIgbGV2ZWwgZm9yIFRQQykuCi0KLQlVc2FnZToKLQkJaXdwcml2IGV0aFggdHBjY2ZnOiBHZXQgY3VycmVudCBjb25maWd1cmF0aW9uCi0JCWl3cHJpdiBldGhYIHRwY2NmZyAwOiBkaXNhYmxlIGF1dG8gVFBDCi0JCWl3cHJpdiBldGhYIHRwY2NmZyAweDAxIDB4MDAgMHgwNSAweDBhIDB4MGQ6IGVuYWJsZSBhdXRvIFRQQzsgZG8gbm90IHVzZSBTTlI7Ci0JCQkJCQkJICAgICBQMD0weDA1OyBQMT0weDBhOyBQMj0weDBkOwotCQlpd3ByaXYgZXRoWCB0cGNjZmcgMHgwMSAweDAxIDB4MDUgMHgwYSAweDBkOiBlbmFibGUgYXV0byBUUEM7IHVzZSBTTlI7Ci0JCQkJCQkJICAgICBQMD0weDA1OyBQMT0weDBhOyBQMj0weDBkLgotCi1wb3dlcmNmZwotCUVuYWJsZXMgb3IgZGlzYWJsZXMgcG93ZXIgYWRhcHRhdGlvbi4KLQotCVRoZSBmaXJzdCBwYXJhbWV0ZXIgdHVybnMgdGhpcyBmZWF0dXJlIG9uICgxKSBvciBvZmYgKDApLiAgV2hlbiB0dXJuaW5nCi0Jb24sIHRoZSB1c2VyIG11c3QgYWxzbyBzdXBwbHkgdGhyZWUgbW9yZSBwYXJhbWV0ZXJzIGluIHRoZSBmb2xsb3dpbmcKLQlvcmRlcjoKLQkJLVAwIChQMCBwb3dlciBsZXZlbCBmb3IgUG93ZXIgQWRhcHRhdGlvbiksCi0JCS1QMSAoUDEgcG93ZXIgbGV2ZWwgZm9yIFBvd2VyIEFkYXB0YXRpb24pLAotCQktUDIgKFAyIHBvd2VyIGxldmVsIGZvciBQb3dlciBBZGFwdGF0aW9uKS4KLQotCVVzYWdlOgotCQlpd3ByaXYgZXRoWCBwb3dlcmNmZzogR2V0IGN1cnJlbnQgY29uZmlndXJhdGlvbgotCQlpd3ByaXYgZXRoWCBwb3dlcmNmZyAwOiBkaXNhYmxlIHBvd2VyIGFkYXB0YXRpb24KLQkJaXdwcml2IGV0aFggcG93ZXJjZmcgMSAweDBkIDB4MGYgMHgxMjogZW5hYmxlIHBvd2VyIGFkYXB0YXRpb247Ci0JCQkJCQkgICAgICAgUDA9MHgwZDsgUDE9MHgwZjsgUDI9MHgxMi4KLQotZ2V0YWZjCi0JVGhpcyBjb21tYW5kIHJldHVybnMgYXV0b21hdGljIGZyZXF1ZW5jeSBjb250cm9sIHBhcmFtZXRlcnMuICBJdCByZXR1cm5zCi0JdGhyZWUgaW50ZWdlcnM6Ci0JCS1QMDogYXV0b21hdGljIGlzIG9uICgxKSwgb3Igb2ZmICgwKSwKLQkJLVAxOiBjdXJyZW50IHRpbWluZyBvZmZzZXQgaW4gUFBNIChwYXJ0IHBlciBtaWxsaW9uKSwgYW5kCi0JCS1QMjogY3VycmVudCBmcmVxdWVuY3kgb2Zmc2V0IGluIFBQTS4KLQotc2V0YWZjCi0JU2V0IGF1dG9tYXRpYyBmcmVxdWVuY3kgY29udHJvbCBvcHRpb25zLgotCi0JVGhlIGZpcnN0IHBhcmFtZXRlciB0dXJucyBhdXRvbWF0aWMgb24gKDEpIG9yIG9mZiAoMCkuCi0JVGhlIHVzZXIgbXVzdCBzdXBwbHkgdHdvIG1vcmUgcGFyYW1ldGVycyBpbiBlaXRoZXIgY2FzZSwgaW4gdGhlIGZvbGxvd2luZwotICBvcmRlcjoKLQotICBXaGVuIGF1dG8gaXMgb246Ci0KLQkJLVAwIChhdXRvbWF0aWMgYWRqdXN0bWVudCBmcmVxdWVuY3kgdGhyZXNob2xkIGluIFBQTSksCi0JCS1QMSAoYXV0b21hdGljIGFkanVzdG1lbnQgcGVyaW9kIGluIGJlYWNvbiBwZXJpb2QpLAotCi0gIFdoZW4gYXV0byBpcyBvZmY6Ci0KLQkJLVAwIChtYW51YWwgYWRqdXN0bWVudCB0aW1pbmcgb2Zmc2V0IGluIFBQTSksIGFuZAotCQktUDEgKG1hbnVhbCBhZGp1c3RtZW50IGZyZXF1ZW5jeSBvZmZzZXQgaW4gUFBNKS4KLQotCVVzYWdlOgotCQlpd3ByaXYgZXRoWCBzZXRhZmMgMCAxMCAxMDogbWFudWFsIGFkanVzdG1lbnQsIGJvdGggdGltaW5nIGFuZCBmcmVxdWNuY3kKLSAgICBvZmZzZXQgYXJlIDEwIFBQTS4KLQotCQlpd3ByaXYgZXRoWCBzZXRhZmMgMSAxMCAxMCBlbmFibGUgYWZjLCBhdXRvbWF0aWMgYWRqdXN0bWVudCwKLSAgICBmcmVxdWVuY3kgdGhyZXNob2xkIDEwIFBQTSwgZm9yIGV2ZXJ5IDEwIGJlYWNvbiBwZXJpb2RzLgotCi0KLQotc2NhbnByb2JlcwotCVRoaXMgY29tbWFuZCBzZXRzIG51bWJlciBvZiBwcm9iZSByZXF1ZXN0cyBwZXIgY2hhbm5lbC4KLQotCVVzYWdlOgotCQlpd3ByaXYgZXRoWCBzY2FucHJvYmVzIDMgKHNldCBzY2FuIHByb2JlcyB0byAzKQotCQlpd3ByaXYgZXRoWCBzY2FucHJvYmVzICAgKGdldCBzY2FuIHByb2JlcykKLQotbG9saXN0ZW5pbnRlcgotCVRoaXMgY29tbWFuZCBzZXRzIHRoZSB2YWx1ZSBvZiBsaXN0ZW4gaW50ZXJ2YWwuCi0KLQlVc2FnZToKLQlpd3ByaXYgZXRoWCBsb2xpc3RlbmludGVyIDIzNCAoc2V0IHRoZSBsb2xpc3RlbmludGVyIHRvIDIzNCkKLQlpd3ByaXYgZXRoWCBsb2xpc3RlbmludGVyICAgICAoZ2V0IHRoZSBsb2xpc3RlbmludGVyIHZhbHVlKQotCi1yYXRlYWRhcHQKLQlUaGlzIGNvbW1hbmQgc2V0cyB0aGUgZGF0YSByYXRlcyBiaXRtYXAuCi0JV2hlcmUgPG4+Ci0JCTA6IERpc2FibGUgYXV0byByYXRlIGFkYXB0Ci0JCTE6IEVuYWJsZSBhdXRvIHJhdGUgYWRhcHQKLQotCSAgICAgIDxtPgotCQkgZGF0YSByYXRlIGJpdG1hcAotCQkJQml0CURhdGEgcmF0ZQotCQkJMAkxIE1icHMKLQkJCTEJMiBNYnBzCi0JCQkyCTUuNSBNYnBzCi0JCQkzCTExIE1icHMKLQkJCTQJUmVzZXJ2ZWQKLQkJCTUJNiBNYnBzCi0JCQk2CTkgTWJwcwotCQkJNwkxMiBNYnBzCi0JCQk4CTE4IE1icHMKLQkJCTkJMjQgTWJwcwotCQkJMTAJMzYgTWJwcwotCQkJMTEJNDggTWJwcwotCQkJMTIJNTQgTWJwcwotCQkJMTItMTUJUmVzZXJ2ZWQKLQotCVVzYWdlOgotCWl3cHJpdiBldGhYIHJhdGVhZGFwdAotCQkJcmVhZCB0aGUgY3VycmVjdCBkYXRhIHJhdGUgc2V0dGluZwotCWl3cHJpdiBldGhYIHJhdGVhZGFwdCAxIDB4MDcKLQkJCWVuYWJsZSBhdXRvIGRhdGEgcmF0ZSBhZGFwdCBhbmQKLQkJCWRhdGEgcmF0ZXMgYXJlIDFNYnBzLCAyTWJzcCBhbmQgNS41TWJwcwotCi0KLXR4Y29udHJvbAotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCB0aGUgVHggcmF0ZSwgYWNrIHBvbGljeSwgYW5kIHJldHJ5IGxpbWl0IG9uIGEgcGVyIHBhY2tldCBiYXNpcy4KLQotCVdoZXJlIHZhbHVlIDxuPiBpczoKLQkgICAgaWYgYml0WzRdID09IDE6Ci0JCWJpdFszOjBdICAgICAgICAtLSAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgMTAgICAxMSAgIDEyICAgMTMtMTYKLQkJRGF0YSBSYXRlKE1icHMpIC0tIDEgICAyICAgNS41IDExICBSc3YgNiAgIDkgICAxMiAgMTggIDI0ICAzNiAgIDQ4ICAgNTQgICBSc3YKLQotCSAgICBiaXRbMTI6OF0KLQkJaWYgYml0WzEyXSA9PSAxLCBiaXRbMTE6OF0gc3BlY2lmaWVzIHRoZSBUeCByZXRyeSBsaW1pdC4KLQotCSAgICBiaXRbMTQ6MTNdIHNwZWNpZmllcyBwZXIgcGFja2V0IGFjayBwb2xpY3k6Ci0JCWJpdFsxNDoxM10KLQkJICAgICAxICAwCXVzZSBpbW1lZGlhdGUgYWNrIHBvbGljeSBmb3IgdGhpcyBwYWNrZXQKLQkJICAgICAxICAxICAgICAgIHVzZSBubyBhY2sgcG9saWN5IGZvciB0aGlzIHBhY2tldAotCQkgICAgIDAgIHgJdXNlIHRoZSBwZXItcGFja2V0IGFjayBwb2xpY3kgc2V0dGluZwotCi0JVXNhZ2U6Ci0JaXdwcml2IGV0aFggdHhjb250cm9sIDB4NzUxMwotCQkJVXNlIG5vLWFjayBwb2xpY3ksIDUgcmV0aXJlcyBmb3IgVHgsIDExTWJwcyByYXRlCi0KLQotCi1wc251bGxpbnRlcnZhbAotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldC9yZXF1ZXN0IE5VTEwgcGFja2FnZSBpbnRlcnZhbCBmb3IgUG93ZXIgU2F2ZQotCXVuZGVyIGluZnJhc3RydWN0dXJlIG1vZGUuCi0KLQl3aGVyZSB2YWx1ZSBpczotCi0JCS0xCS0tIERpc2FibGVkCi0JCW4+MAktLSBTZXQgaW50ZXJ2YWwgYXMgbiAoc2Vjb25kcykKLQotcHJlc2NhbgotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGVuYWJsZSAoMSkvZGlzYWJsZSgwKSBhdXRvIHByZXNjYW4gYmVmb3JlIGFzc29pY2F0ZSB0byB0aGUgYXAKLQotCXdoZXJlIHZhbHVlIGlzOi0KLQkJMAktLSBEaXNhYmxlZAotCQkxCS0tIEVuYWJsZWQKLQkJMiAgICAgICAtLSBHZXQKLQotZ2V0cnhpbmZvCi0JVGhpcyBjb21tYW5kIGdldHMgbm9uIGF2ZXJhZ2UgdmFsdWUgb2YgU2lnbmFsIHRvIE5vaXNlIFJhdGlvIG9mIERhdGEgYW5kIHJhdGUgaW5kZXguCi0KLQlUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIFJhdGVJbmRleCBhbmQgUmF0ZQotCi0JCSAgICAgUmF0ZUluZGV4CURhdGEgcmF0ZQotCQkJMAkxIE1icHMKLQkJCTEJMiBNYnBzCi0JCQkyCTUuNSBNYnBzCi0JCQkzCTExIE1icHMKLQkJCTQJUmVzZXJ2ZWQKLQkJCTUJNiBNYnBzCi0JCQk2CTkgTWJwcwotCQkJNwkxMiBNYnBzCi0JCQk4CTE4IE1icHMKLQkJCTkJMjQgTWJwcwotCQkJMTAJMzYgTWJwcwotCQkJMTEJNDggTWJwcwotCQkJMTIJNTQgTWJwcwotCQkJMTMtMTUJUmVzZXJ2ZWQKLQotZ2V0dHhyYXRlCi0JVGhpcyBjb21tYW5kIGdldHMgY3VycmVudCBUeCByYXRlIGluZGV4IG9mIHRoZSBmaXJzdCBwYWNrZXQgYXNzb2NpYXRlZCB3aXRoIFJhdGUgQWRhcHRhdGlvbi4KLQotCVRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgUmF0ZUluZGV4IGFuZCBSYXRlCi0KLQkJICAgICBSYXRlSW5kZXgJRGF0YSByYXRlCi0JCQkwCTEgTWJwcwotCQkJMQkyIE1icHMKLQkJCTIJNS41IE1icHMKLQkJCTMJMTEgTWJwcwotCQkJNAlSZXNlcnZlZAotCQkJNQk2IE1icHMKLQkJCTYJOSBNYnBzCi0JCQk3CTEyIE1icHMKLQkJCTgJMTggTWJwcwotCQkJOQkyNCBNYnBzCi0JCQkxMAkzNiBNYnBzCi0JCQkxMQk0OCBNYnBzCi0JCQkxMgk1NCBNYnBzCi0JCQkxMy0xNQlSZXNlcnZlZAotCi1iY25pbnRlcnZhbAotCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldHMgYmVhY29uIGludGVydmFsIGluIGFkaG9jIG1vZGUgd2hlbiBhbiBhcmd1bWVudCBpcyBnaXZlbiwgYW5kIGdldHMgY3VycmVudCBhZGhvYwotCWJlYWNvbiBpbnRlcnZhbCB3aGVuIG5vIGFyZ3VtZW50IGlzIGdpdmVuLiBUaGUgdmFsaWQgYmVhY29uIGludGVydmFsIGlzIGJldHdlZW4gMjAgLSAxMDAwLAotCWRlZmF1bHQgYmVhY29uIGludGVydmFsIGlzIDEwMC4KLQotCVVzYWdlOgotCQlpd3ByaXYgZXRoWCBiY25pbnRlcnZhbCAxMDAgIChzZXQgYWRob2MgYmVhY29uIGludGVydmFsIHRvIDEwMCkKLQkJaXdwcml2IGV0aFggYmNuaW50ZXJ2YWwgICAgICAoZ2V0IGFkaG9jIGJlYWNvbiBpbnRlcnZhbCkKLQogZnd0X2FkZAogCVRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBGV1QgdGFibGUuIFRoZSBsaXN0IG9mCiAJcGFyYW1ldGVycyBtdXN0IGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9hc3NvYy5jCmluZGV4IGI1NWM3ZjUuLmMyNjBiZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Fzc29jLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvYXNzb2MuYwpAQCAtMjMsMTMgKzIzLDEzIEBACiAJRU5URVIoKTsKIAogCWxic19wcl9kZWJ1ZygxLCAiTmV3IFNTSUQgcmVxdWVzdGVkOiAlc1xuIiwgYXNzb2NfcmVxLT5zc2lkLnNzaWQpOwotCWlmIChhc3NvY19yZXEtPm1vZGUgPT0gd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlKSB7CisJaWYgKGFzc29jX3JlcS0+bW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CiAJCWlmIChhZGFwdGVyLT5wcmVzY2FuKSB7CiAJCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX1NTSURfc2Nhbihwcml2LCAmYXNzb2NfcmVxLT5zc2lkLCAxKTsKIAkJfQogCiAJCWkgPSBsaWJlcnRhc19maW5kX1NTSURfaW5fbGlzdChhZGFwdGVyLCAmYXNzb2NfcmVxLT5zc2lkLAotCQkJCU5VTEwsIHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSk7CisJCQkJTlVMTCwgSVdfTU9ERV9JTkZSQSk7CiAJCWlmIChpID49IDApIHsKIAkJCWxic19wcl9kZWJ1ZygxLAogCQkJICAgICAgICJTU0lEIGZvdW5kIGluIHNjYW4gbGlzdCAuLi4gYXNzb2NpYXRpbmcuLi5cbiIpOwpAQCAtNDQsNyArNDQsNyBAQAogCQkJbGJzX3ByX2RlYnVnKDEsICJTU0lEICclcycgbm90IGZvdW5kOyBjYW5ub3QgYXNzb2NpYXRlXG4iLAogCQkJCWFzc29jX3JlcS0+c3NpZC5zc2lkKTsKIAkJfQotCX0gZWxzZSBpZiAoYXNzb2NfcmVxLT5tb2RlID09IHdsYW44MDJfMTFpYnNzKSB7CisJfSBlbHNlIGlmIChhc3NvY19yZXEtPm1vZGUgPT0gSVdfTU9ERV9BREhPQykgewogCQkvKiBTY2FuIGZvciB0aGUgbmV0d29yaywgZG8gbm90IHNhdmUgcHJldmlvdXMgcmVzdWx0cy4gIFN0YWxlCiAJCSAqICAgc2NhbiBkYXRhIHdpbGwgY2F1c2UgdXMgdG8gam9pbiBhIG5vbi1leGlzdGFudCBhZGhvYyBuZXR3b3JrCiAJCSAqLwpAQCAtNTIsNyArNTIsNyBAQAogCiAJCS8qIFNlYXJjaCBmb3IgdGhlIHJlcXVlc3RlZCBTU0lEIGluIHRoZSBzY2FuIHRhYmxlICovCiAJCWkgPSBsaWJlcnRhc19maW5kX1NTSURfaW5fbGlzdChhZGFwdGVyLCAmYXNzb2NfcmVxLT5zc2lkLCBOVUxMLAotCQkJCXdsYW44MDJfMTFpYnNzKTsKKwkJCQlJV19NT0RFX0FESE9DKTsKIAkJaWYgKGkgPj0gMCkgewogCQkJbGJzX3ByX2RlYnVnKDEsICJTU0lEIGZvdW5kIGF0ICVkIGluIExpc3QsIHNvIGpvaW5cbiIsIHJldCk7CiAJCQlsaWJlcnRhc19qb2luX2FkaG9jX25ldHdvcmsocHJpdiwgJmFkYXB0ZXItPnNjYW50YWJsZVtpXSk7CkBAIC05MCwxMCArOTAsMTAgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGFzc29jX3JlcS0+bW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKKwlpZiAoYXNzb2NfcmVxLT5tb2RlID09IElXX01PREVfSU5GUkEpIHsKIAkJcmV0ID0gd2xhbl9hc3NvY2lhdGUocHJpdiwgJmFkYXB0ZXItPnNjYW50YWJsZVtpXSk7CiAJCWxic19wcl9kZWJ1ZygxLCAiQVNTT0M6IHJldHVybiBmcm9tIHdsYW5fYXNzb2NpYXRlKGJzc2QpIHdhcyAlZFxuIiwgcmV0KTsKLQl9IGVsc2UgaWYgKGFzc29jX3JlcS0+bW9kZSA9PSB3bGFuODAyXzExaWJzcykgeworCX0gZWxzZSBpZiAoYXNzb2NfcmVxLT5tb2RlID09IElXX01PREVfQURIT0MpIHsKIAkJbGliZXJ0YXNfam9pbl9hZGhvY19uZXR3b3JrKHByaXYsICZhZGFwdGVyLT5zY2FudGFibGVbaV0pOwogCX0KIAltZW1jcHkoJmFzc29jX3JlcS0+c3NpZCwgJmFkYXB0ZXItPnNjYW50YWJsZVtpXS5zc2lkLApAQCAtMTQyLDIzICsxNDIsMjMgQEAKIAogCUVOVEVSKCk7CiAKLQlpZiAoYXNzb2NfcmVxLT5tb2RlID09IGFkYXB0ZXItPmluZnJhbW9kZSkgeworCWlmIChhc3NvY19yZXEtPm1vZGUgPT0gYWRhcHRlci0+bW9kZSkgewogCQlMRUFWRSgpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoYXNzb2NfcmVxLT5tb2RlID09IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSkgeworCWlmIChhc3NvY19yZXEtPm1vZGUgPT0gSVdfTU9ERV9JTkZSQSkgewogCQlpZiAoYWRhcHRlci0+cHNzdGF0ZSAhPSBQU19TVEFURV9GVUxMX1BPV0VSKQogCQkJbGliZXJ0YXNfcHNfd2FrZXVwKHByaXYsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCk7CiAJCWFkYXB0ZXItPnBzbW9kZSA9IHdsYW44MDJfMTFwb3dlcm1vZGVjYW07CiAJfQogCi0JYWRhcHRlci0+aW5mcmFtb2RlID0gYXNzb2NfcmVxLT5tb2RlOworCWFkYXB0ZXItPm1vZGUgPSBhc3NvY19yZXEtPm1vZGU7CiAJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCiAJCQkJICAgIGNtZF84MDJfMTFfc25tcF9taWIsCiAJCQkJICAgIDAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKIAkJCQkgICAgT0lEXzgwMl8xMV9JTkZSQVNUUlVDVFVSRV9NT0RFLAotCQkJCSAgICAodm9pZCAqKSBhc3NvY19yZXEtPm1vZGUpOworCQkJCSAgICAodm9pZCAqKSAoc2l6ZV90KSBhc3NvY19yZXEtPm1vZGUpOwogCiAJTEVBVkUoKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogZW5hYmxlL2Rpc2FibGUgdGhlIE1BQydzIFdFUCBwYWNrZXQgZmlsdGVyICovCi0JaWYgKGFzc29jX3JlcS0+c2VjaW5mby5XRVBzdGF0dXMgPT0gd2xhbjgwMl8xMVdFUGVuYWJsZWQpCisJaWYgKGFzc29jX3JlcS0+c2VjaW5mby53ZXBfZW5hYmxlZCkKIAkJYWRhcHRlci0+Y3VycmVudHBhY2tldGZpbHRlciB8PSBjbWRfYWN0X21hY193ZXBfZW5hYmxlOwogCWVsc2UKIAkJYWRhcHRlci0+Y3VycmVudHBhY2tldGZpbHRlciAmPSB+Y21kX2FjdF9tYWNfd2VwX2VuYWJsZTsKQEAgLTMwMCw4ICszMDAsNyBAQAogCX0KIAogCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX1NFQ0lORk8sICZhc3NvY19yZXEtPmZsYWdzKSkgewotCQlpZiAoYWRhcHRlci0+c2VjaW5mby5hdXRobW9kZSAhPQotCQkgICAgYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhtb2RlKSB7CisJCWlmIChhZGFwdGVyLT5zZWNpbmZvLmF1dGhfbW9kZSAhPSBhc3NvY19yZXEtPnNlY2luZm8uYXV0aF9tb2RlKSB7CiAJCQlsYnNfcHJfZGVidWcoMSwgIkRlYXV0aGVudGljYXRpbmcgZHVlIHRvIHVwZGF0ZWQgc2VjdXJpdHkgIgogCQkJCSJpbmZvIGluIGNvbmZpZ3VyYXRpb24gcmVxdWVzdC5cbiIpOwogCQkJcmV0dXJuIDE7CkBAIC0zMTYsNyArMzE1LDcgQEAKIAogCS8qIEZJWE1FOiBkZWFsIHdpdGggJ2F1dG8nIG1vZGUgc29tZWhvdyAqLwogCWlmICh0ZXN0X2JpdChBU1NPQ19GTEFHX01PREUsICZhc3NvY19yZXEtPmZsYWdzKSkgewotCQlpZiAoYXNzb2NfcmVxLT5tb2RlICE9IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSkKKwkJaWYgKGFzc29jX3JlcS0+bW9kZSAhPSBJV19NT0RFX0lORlJBKQogCQkJcmV0dXJuIDE7CiAJfQogCkBAIC0zMzMsMTIgKzMzMiwxMiBAQAogCWlmIChhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoICE9IGFzc29jX3JlcS0+c3NpZC5zc2lkbGVuZ3RoKQogCQlyZXR1cm4gMTsKIAlpZiAobWVtY21wKGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLnNzaWQsIGFzc29jX3JlcS0+c3NpZC5zc2lkLAotCQkJc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSkpCisJCQlhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZC5zc2lkbGVuZ3RoKSkKIAkJcmV0dXJuIDE7CiAKIAkvKiBGSVhNRTogZGVhbCB3aXRoICdhdXRvJyBtb2RlIHNvbWVob3cgKi8KIAlpZiAodGVzdF9iaXQoQVNTT0NfRkxBR19NT0RFLCAmYXNzb2NfcmVxLT5mbGFncykpIHsKLQkJaWYgKGFzc29jX3JlcS0+bW9kZSAhPSB3bGFuODAyXzExaWJzcykKKwkJaWYgKGFzc29jX3JlcS0+bW9kZSAhPSBJV19NT0RFX0FESE9DKQogCQkJcmV0dXJuIDE7CiAJfQogCkBAIC0zODIsNyArMzgxLDcgQEAKIAl9CiAKIAlpZiAoZmluZF9hbnlfc3NpZCkgewotCQllbnVtIFdMQU5fODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgbmV3X21vZGU7CisJCXU4IG5ld19tb2RlOwogCiAJCXJldCA9IGxpYmVydGFzX2ZpbmRfYmVzdF9uZXR3b3JrX1NTSUQocHJpdiwgJmFzc29jX3JlcS0+c3NpZCwKIAkJCQlhc3NvY19yZXEtPm1vZGUsICZuZXdfbW9kZSk7CkBAIC0zOTMsNyArMzkyLDcgQEAKIAkJfQogCiAJCS8qIEVuc3VyZSB3ZSBzd2l0Y2ggdG8gdGhlIG1vZGUgb2YgdGhlIEFQICovCi0JCWlmIChhc3NvY19yZXEtPm1vZGUgPT0gd2xhbjgwMl8xMWF1dG91bmtub3duKSB7CisJCWlmIChhc3NvY19yZXEtPm1vZGUgPT0gSVdfTU9ERV9BVVRPKSB7CiAJCQlzZXRfYml0KEFTU09DX0ZMQUdfTU9ERSwgJmFzc29jX3JlcS0+ZmxhZ3MpOwogCQkJYXNzb2NfcmVxLT5tb2RlID0gbmV3X21vZGU7CiAJCX0KQEAgLTQwMyw3ICs0MDIsNyBAQAogCSAqIENoZWNrIGlmIHRoZSBhdHRyaWJ1dGVzIGJlaW5nIGNoYW5naW5nIHJlcXVpcmUgZGVhdXRoZW50aWNhdGlvbgogCSAqIGZyb20gdGhlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGluZnJhc3RydWN0dXJlIGFjY2VzcyBwb2ludC4KIAkgKi8KLQlpZiAoYWRhcHRlci0+aW5mcmFtb2RlID09IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSkgeworCWlmIChhZGFwdGVyLT5tb2RlID09IElXX01PREVfSU5GUkEpIHsKIAkJaWYgKHNob3VsZF9kZWF1dGhfaW5mcmFzdHJ1Y3R1cmUoYWRhcHRlciwgYXNzb2NfcmVxKSkgewogCQkJcmV0ID0gbGliZXJ0YXNfc2VuZF9kZWF1dGhlbnRpY2F0aW9uKHByaXYpOwogCQkJaWYgKHJldCkgewpAQCAtNDEyLDcgKzQxMSw3IEBACiAJCQkJCXJldCk7CiAJCQl9CiAJCX0KLQl9IGVsc2UgaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgeworCX0gZWxzZSBpZiAoYWRhcHRlci0+bW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CiAJCWlmIChzaG91bGRfc3RvcF9hZGhvYyhhZGFwdGVyLCBhc3NvY19yZXEpKSB7CiAJCQlyZXQgPSBsaWJlcnRhc19zdG9wX2FkaG9jX25ldHdvcmsocHJpdik7CiAJCQlpZiAocmV0KSB7CkBAIC01NDMsNyArNTQyLDcgQEAKIAkJYXNzb2NfcmVxLT5jaGFubmVsID0gYWRhcHRlci0+Y3VyYnNzcGFyYW1zLmNoYW5uZWw7CiAKIAlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfTU9ERSwgJmFzc29jX3JlcS0+ZmxhZ3MpKQotCQlhc3NvY19yZXEtPm1vZGUgPSBhZGFwdGVyLT5pbmZyYW1vZGU7CisJCWFzc29jX3JlcS0+bW9kZSA9IGFkYXB0ZXItPm1vZGU7CiAKIAlpZiAoIXRlc3RfYml0KEFTU09DX0ZMQUdfQlNTSUQsICZhc3NvY19yZXEtPmZsYWdzKSkgewogCQltZW1jcHkoJmFzc29jX3JlcS0+YnNzaWQsIGFkYXB0ZXItPmN1cmJzc3BhcmFtcy5ic3NpZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKaW5kZXggYmZkYWM1OC4uZGU5Y2I0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kLmMKQEAgLTM4MSwxNSArMzgxLDE2IEBACiAJc3dpdGNoIChjbWRfb2lkKSB7CiAJY2FzZSBPSURfODAyXzExX0lORlJBU1RSVUNUVVJFX01PREU6CiAJewotCQllbnVtIFdMQU5fODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgbW9kZSA9Ci0JCQkoZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFKSBwZGF0YV9idWY7CisJCXU4IG1vZGUgPSAodTgpIChzaXplX3QpIHBkYXRhX2J1ZjsKIAkJcFNOTVBNSUItPnF1ZXJ5dHlwZSA9IGNwdV90b19sZTE2KGNtZF9hY3Rfc2V0KTsKIAkJcFNOTVBNSUItPm9pZCA9IGNwdV90b19sZTE2KCh1MTYpIGRlc2lyZWRfYnNzdHlwZV9pKTsKIAkJcFNOTVBNSUItPmJ1ZnNpemUgPSBzaXplb2YodTgpOwotCQlpZiAobW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpCi0JCQl1Y1RlbXAgPSBTTk1QX01JQl9WQUxVRV9JTkZSQTsKLQkJZWxzZQorCQlpZiAobW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CiAJCQl1Y1RlbXAgPSBTTk1QX01JQl9WQUxVRV9BREhPQzsKKwkJfSBlbHNlIHsKKwkJCS8qIEluZnJhIGFuZCBBdXRvIG1vZGVzICovCisJCQl1Y1RlbXAgPSBTTk1QX01JQl9WQUxVRV9JTkZSQTsKKwkJfQogCiAJCW1lbW1vdmUocFNOTVBNSUItPnZhbHVlLCAmdWNUZW1wLCBzaXplb2YodTgpKTsKIApAQCAtOTQ3LDggKzk0OCw4IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5kcml2ZXJfbG9jaywgZmxhZ3MpOwogCi0JbGJzX3ByX2RlYnVnKDEsICJRVUVVRV9DTUQ6IEluc2VydGVkIG5vZGU9MHgleCwgY21kPTB4JXggaW4gY21kcGVuZGluZ3FcbiIsCi0JICAgICAgICh1MzIpIGNtZG5vZGUsCisJbGJzX3ByX2RlYnVnKDEsICJRVUVVRV9DTUQ6IEluc2VydGVkIG5vZGU9JXAsIGNtZD0weCV4IGluIGNtZHBlbmRpbmdxXG4iLAorCSAgICAgICBjbWRub2RlLAogCSAgICAgICAoKHN0cnVjdCBjbWRfZHNfZ2VuKiljbWRub2RlLT5idWZ2aXJ0dWFsYWRkciktPmNvbW1hbmQpOwogCiBkb25lOgpAQCAtOTc2LDggKzk3Nyw4IEBACiAJRU5URVIoKTsKIAogCWlmICghYWRhcHRlciB8fCAhY21kbm9kZSkgewotCQlsYnNfcHJfZGVidWcoMSwgIkROTERfQ01EOiBhZGFwdGVyID0gJSN4LCBjbWRub2RlID0gJSN4XG4iLAotCQkgICAgICAgKGludClhZGFwdGVyLCAoaW50KWNtZG5vZGUpOworCQlsYnNfcHJfZGVidWcoMSwgIkROTERfQ01EOiBhZGFwdGVyID0gJXAsIGNtZG5vZGUgPSAlcFxuIiwKKwkJICAgICAgIGFkYXB0ZXIsIGNtZG5vZGUpOwogCQlpZiAoY21kbm9kZSkgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmRyaXZlcl9sb2NrLCBmbGFncyk7CiAJCQlfX2xpYmVydGFzX2NsZWFudXBfYW5kX2luc2VydF9jbWQocHJpdiwgY21kbm9kZSk7CkBAIC0xMTc0LDggKzExNzUsOCBAQAogCiAJY21kcHRyID0gKHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqKWNtZG5vZGUtPmJ1ZnZpcnR1YWxhZGRyOwogCi0JbGJzX3ByX2RlYnVnKDEsICJQUkVQX0NNRDogVmFsIG9mIGNtZCBwdHIgPTB4JXgsIGNvbW1hbmQ9MHglWFxuIiwKLQkgICAgICAgKHUzMikgY21kcHRyLCBjbWRfbm8pOworCWxic19wcl9kZWJ1ZygxLCAiUFJFUF9DTUQ6IFZhbCBvZiBjbWQgcHRyPSVwLCBjb21tYW5kPTB4JVhcbiIsCisJICAgICAgIGNtZHB0ciwgY21kX25vKTsKIAogCWlmICghY21kcHRyKSB7CiAJCWxic19wcl9kZWJ1ZygxLCAiUFJFUF9DTUQ6IGJ1ZnZpcnR1YWxhZGRyIG9mIGNtZG5vZGUgaXMgTlVMTFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWRyZXNwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jbWRyZXNwLmMKaW5kZXggY2RiMDEyYy4uYzg2NDU0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY21kcmVzcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NtZHJlc3AuYwpAQCAtNzIsOCArNzIsNiBAQAogCWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCA9IDA7CiAJYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDA7CiAJYWRhcHRlci0+d3BhX2llX2xlbiA9IDA7Ci0JYWRhcHRlci0+c2VjaW5mby5hdXRoMXhhbGcgPSBXTEFOXzFYX0FVVEhfQUxHX05PTkU7Ci0JYWRhcHRlci0+c2VjaW5mby5FbmNyeXB0aW9ubW9kZSA9IENJUEhFUl9OT05FOwogCiAJYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgPSBsaWJlcnRhc19kaXNjb25uZWN0ZWQ7CiAKQEAgLTgxMSw3ICs4MDksNyBAQAogCQlpZiAocmVzdWx0KSB7CiAJCQlsYnNfcHJfZGVidWcoMSwgIkNNRF9SRVNQOiBQUyBjb21tYW5kIGZhaWxlZC0gJSN4IFxuIiwKIAkJCSAgICAgICByZXNwLT5yZXN1bHQpOwotCQkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgeworCQkJaWYgKGFkYXB0ZXItPm1vZGUgPT0gSVdfTU9ERV9BREhPQykgewogCQkJCS8qCiAJCQkJICogV2Ugc2hvdWxkIG5vdCByZS10cnkgZW50ZXItcHMgY29tbWFuZCBpbgogCQkJCSAqIGFkLWhvYyBtb2RlLiBJdCB0YWtlcyBwbGFjZSBpbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jCmluZGV4IDUxZGZkMjAuLjdkN2JjNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAiZGV2LmgiCiAjaW5jbHVkZSAiZGVjbC5oIgogI2luY2x1ZGUgImhvc3QuaCIKKyNpbmNsdWRlICJkZWJ1Z2ZzLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpsaWJlcnRhc19kaXIgPSBOVUxMOwogc3RhdGljIGNoYXIgKnN6U3RhdGVzW10gPSB7CkBAIC0yNzYsNyArMjc3LDcgQEAKIAlpZiAoIWVuZCkKIAkJZW5kID0gYnVmICsgY291bnQgLSAxOwogCi0Jc2l6ZSA9IG1pbihJV19FU1NJRF9NQVhfU0laRSwgZW5kIC0gaG9sZCk7CisJc2l6ZSA9IG1pbigoc2l6ZV90KUlXX0VTU0lEX01BWF9TSVpFLCAoc2l6ZV90KSAoZW5kIC0gaG9sZCkpOwogCXN0cm5jcHkoc2Nhbl9jZmctPnNwZWNpZmljU1NJRCwgaG9sZCwgc2l6ZSk7CiAKIAlyZXR1cm47CkBAIC0xNjQ4LDcgKzE2NDksNyBAQAogCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wczsKIH07CiAKLXN0cnVjdCBsaWJlcnRhc19kZWJ1Z2ZzX2ZpbGVzIGRlYnVnZnNfZmlsZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgbGliZXJ0YXNfZGVidWdmc19maWxlcyBkZWJ1Z2ZzX2ZpbGVzW10gPSB7CiAJeyAiaW5mbyIsIDA0NDQsIEZPUFMobGliZXJ0YXNfZGV2X2luZm8sIHdyaXRlX2ZpbGVfZHVtbXkpLCB9LAogCXsgImdldHNjYW50YWJsZSIsIDA0NDQsIEZPUFMobGliZXJ0YXNfZ2V0c2NhbnRhYmxlLAogCQkJCQl3cml0ZV9maWxlX2R1bW15KSwgfSwKQEAgLTE2NTgsNyArMTY1OSw3IEBACiAJeyAic2V0dXNlcnNjYW4iLCAwNjAwLCBGT1BTKE5VTEwsIGxpYmVydGFzX3NldHVzZXJzY2FuKSwgfSwKIH07CiAKLXN0cnVjdCBsaWJlcnRhc19kZWJ1Z2ZzX2ZpbGVzIGRlYnVnZnNfZXZlbnRzX2ZpbGVzW10gPSB7CitzdGF0aWMgc3RydWN0IGxpYmVydGFzX2RlYnVnZnNfZmlsZXMgZGVidWdmc19ldmVudHNfZmlsZXNbXSA9IHsKIAl7Imxvd19yc3NpIiwgMDY0NCwgRk9QUyhsaWJlcnRhc19sb3dyc3NpX3JlYWQsCiAJCQkJbGliZXJ0YXNfbG93cnNzaV93cml0ZSksIH0sCiAJeyJsb3dfc25yIiwgMDY0NCwgRk9QUyhsaWJlcnRhc19sb3dzbnJfcmVhZCwKQEAgLTE2NzMsNyArMTY3NCw3IEBACiAJCQkJbGliZXJ0YXNfaGlnaHNucl93cml0ZSksIH0sCiB9OwogCi1zdHJ1Y3QgbGliZXJ0YXNfZGVidWdmc19maWxlcyBkZWJ1Z2ZzX3JlZ3NfZmlsZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgbGliZXJ0YXNfZGVidWdmc19maWxlcyBkZWJ1Z2ZzX3JlZ3NfZmlsZXNbXSA9IHsKIAl7InJkbWFjIiwgMDY0NCwgRk9QUyhsaWJlcnRhc19yZG1hY19yZWFkLCBsaWJlcnRhc19yZG1hY193cml0ZSksIH0sCiAJeyJ3cm1hYyIsIDA2MDAsIEZPUFMoTlVMTCwgbGliZXJ0YXNfd3JtYWNfd3JpdGUpLCB9LAogCXsicmRiYnAiLCAwNjQ0LCBGT1BTKGxpYmVydGFzX3JkYmJwX3JlYWQsIGxpYmVydGFzX3JkYmJwX3dyaXRlKSwgfSwKQEAgLTE3NzgsNyArMTc3OSw3IEBACiBzdHJ1Y3QgZGVidWdfZGF0YSB7CiAJY2hhciBuYW1lWzMyXTsKIAl1MzIgc2l6ZTsKLQl1MzIgYWRkcjsKKwlzaXplX3QgYWRkcjsKIH07CiAKIC8qIFRvIGRlYnVnIGFueSBtZW1iZXIgb2Ygd2xhbl9hZGFwdGVyLCBzaW1wbHkgYWRkIG9uZSBsaW5lIGhlcmUuCkBAIC0xODI1LDYgKzE4MjYsOCBAQAogCQkJdmFsID0gKigodTE2ICopIGRbaV0uYWRkcik7CiAJCWVsc2UgaWYgKGRbaV0uc2l6ZSA9PSA0KQogCQkJdmFsID0gKigodTMyICopIGRbaV0uYWRkcik7CisJCWVsc2UgaWYgKGRbaV0uc2l6ZSA9PSA4KQorCQkJdmFsID0gKigodTY0ICopIGRbaV0uYWRkcik7CiAKIAkJcG9zICs9IHNwcmludGYocCArIHBvcywgIiVzPSVkXG4iLCBkW2ldLm5hbWUsIHZhbCk7CiAJfQpAQCAtMTg0NCw3ICsxODQ3LDcgQEAKICAqICBAcGFyYW0gZGF0YSAgICBkYXRhIHRvIHdyaXRlCiAgKiAgQHJldHVybiAJICAgbnVtYmVyIG9mIGRhdGEKICAqLwotc3RhdGljIGludCB3bGFuX2RlYnVnZnNfd3JpdGUoc3RydWN0IGZpbGUgKmYsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCitzdGF0aWMgc3NpemVfdCB3bGFuX2RlYnVnZnNfd3JpdGUoc3RydWN0IGZpbGUgKmYsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQogewogCWludCByLCBpOwpAQCAtMTg4NiwxMiArMTg4OSwxNCBAQAogCQkJCSooKHUxNiAqKSBkW2ldLmFkZHIpID0gKHUxNikgcjsKIAkJCWVsc2UgaWYgKGRbaV0uc2l6ZSA9PSA0KQogCQkJCSooKHUzMiAqKSBkW2ldLmFkZHIpID0gKHUzMikgcjsKKwkJCWVsc2UgaWYgKGRbaV0uc2l6ZSA9PSA4KQorCQkJCSooKHU2NCAqKSBkW2ldLmFkZHIpID0gKHU2NCkgcjsKIAkJCWJyZWFrOwogCQl9IHdoaWxlICgxKTsKIAl9CiAJa2ZyZWUocGRhdGEpOwogCi0JcmV0dXJuIGNudDsKKwlyZXR1cm4gKHNzaXplX3QpY250OwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaWJlcnRhc19kZWJ1Z19mb3BzID0gewpAQCAtMTkxNiwyMCArMTkyMSwxMCBAQAogCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2l0ZW1zOyBpKyspCi0JCWl0ZW1zW2ldLmFkZHIgKz0gKHUzMikgcHJpdi0+YWRhcHRlcjsKKwkJaXRlbXNbaV0uYWRkciArPSAoc2l6ZV90KSBwcml2LT5hZGFwdGVyOwogCiAJcHJpdi0+ZGVidWdmc19kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImRlYnVnIiwgMDY0NCwKIAkJCQkJCSAgcHJpdi0+ZGVidWdmc19kaXIsICZpdGVtc1swXSwKIAkJCQkJCSAgJmxpYmVydGFzX2RlYnVnX2ZvcHMpOwogfQogCi0vKioKLSAqICBAYnJpZWYgcmVtb3ZlIHByb2MgZmlsZQotICoKLSAqICBAcGFyYW0gcHJpdgkgICBwb2ludGVyIHdsYW5fcHJpdmF0ZQotICogIEByZXR1cm4gCSAgIE4vQQotICovCi12b2lkIGxpYmVydGFzX2RlYnVnX3JlbW92ZSh3bGFuX3ByaXZhdGUgKiBwcml2KQotewotCWRlYnVnZnNfcmVtb3ZlKHByaXYtPmRlYnVnZnNfZGVidWcpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVmcy5oCmluZGV4IGZiMTQ3OGMuLjgwZGQ5ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlZnMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWZzLmgKQEAgLTksNiArOSwxMSBAQAogCiBleHRlcm4gdW5zaWduZWQgaW50IGxpYmVydGFzX2RlYnVnOwogCisjaWZkZWYgQ09ORklHX0xJQkVSVEFTX0RFQlVHCisjZGVmaW5lIERFQlVHCisjZGVmaW5lIFBST0NfREVCVUcKKyNlbmRpZgorCiAjZGVmaW5lIERSVl9OQU1FCQkidXNiOHh4eCIKIAogI2RlZmluZSBsYnNfcHJfaW5mbyhmb3JtYXQsIGFyZ3MuLi4pIFwKQEAgLTIyMywzMSArMjI4LDYgQEAKIAlNQVhfVFlQRV9BVkcKIH07CiAKLS8qKiBXTEFOXzgwMl8xMV9BVVRIX0FMRyovCi1lbnVtIFdMQU5fODAyXzExX0FVVEhfQUxHIHsKLQlBVVRIX0FMR19PUEVOX1NZU1RFTSA9IDEsCi0JQVVUSF9BTEdfU0hBUkVEX0tFWSA9IDIsCi0JQVVUSF9BTEdfTkVUV09SS19FQVAgPSA4LAotfTsKLQotLyoqIFdMQU5fODAyXzFYX0FVVEhfQUxHICovCi1lbnVtIFdMQU5fODAyXzFYX0FVVEhfQUxHIHsKLQlXTEFOXzFYX0FVVEhfQUxHX05PTkUgPSAxLAotCVdMQU5fMVhfQVVUSF9BTEdfTEVBUCA9IDIsCi0JV0xBTl8xWF9BVVRIX0FMR19UTFMgPSA0LAotCVdMQU5fMVhfQVVUSF9BTEdfVFRMUyA9IDgsCi0JV0xBTl8xWF9BVVRIX0FMR19NRDUgPSAxNiwKLX07Ci0KLS8qKiBXTEFOXzgwMl8xMV9FTkNSWVBUSU9OX01PREUgKi8KLWVudW0gV0xBTl84MDJfMTFfRU5DUllQVElPTl9NT0RFIHsKLQlDSVBIRVJfTk9ORSwKLQlDSVBIRVJfV0VQNDAsCi0JQ0lQSEVSX1RLSVAsCi0JQ0lQSEVSX0NDTVAsCi0JQ0lQSEVSX1dFUDEwNCwKLX07Ci0KIC8qKiBXTEFOXzgwMl8xMV9QT1dFUl9NT0RFICovCiBlbnVtIFdMQU5fODAyXzExX1BPV0VSX01PREUgewogCXdsYW44MDJfMTFwb3dlcm1vZGVjYW0sCkBAIC0yOTIsMjggKzI3Miw2IEBACiAJTVZNU19FVkVOVAogfTsKIAotLyoqIFdMQU5fODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgKi8KLWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSB7Ci0Jd2xhbjgwMl8xMWlic3MsCi0Jd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlLAotCXdsYW44MDJfMTFhdXRvdW5rbm93biwKLQkvKmRlZmluZWQgYXMgdXBwZXIgYm91bmQgKi8KLQl3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmVtYXgKLX07Ci0KLS8qKiBXTEFOXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFICovCi1lbnVtIFdMQU5fODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgewotCXdsYW44MDJfMTFhdXRobW9kZW9wZW4gPSAweDAwLAotCXdsYW44MDJfMTFhdXRobW9kZXNoYXJlZCA9IDB4MDEsCi0Jd2xhbjgwMl8xMWF1dGhtb2RlbmV0d29ya0VBUCA9IDB4ODAsCi19OwotCi0vKiogV0xBTl84MDJfMTFfV0VQX1NUQVRVUyAqLwotZW51bSBXTEFOXzgwMl8xMV9XRVBfU1RBVFVTIHsKLQl3bGFuODAyXzExV0VQZW5hYmxlZCwKLQl3bGFuODAyXzExV0VQZGlzYWJsZWQsCi19OwotCiAvKiogU05NUF9NSUJfSU5ERVhfZSAqLwogZW51bSBTTk1QX01JQl9JTkRFWF9lIHsKIAlkZXNpcmVkX2Jzc3R5cGVfaSA9IDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Rldi5oCmluZGV4IGIxZjg3NmYuLmU4YjkwMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Rldi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Rldi5oCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPG5ldC9pZWVlODAyMTEuaD4KIAogI2luY2x1ZGUgImRlZnMuaCIKICNpbmNsdWRlICJzY2FuLmgiCkBAIC01NiwxMCArNTcsOCBAQAogc3RydWN0IHdsYW5fODAyXzExX3NlY3VyaXR5IHsKIAl1OCBXUEFlbmFibGVkOwogCXU4IFdQQTJlbmFibGVkOwotCWVudW0gV0xBTl84MDJfMTFfV0VQX1NUQVRVUyBXRVBzdGF0dXM7Ci0JZW51bSBXTEFOXzgwMl8xMV9BVVRIRU5USUNBVElPTl9NT0RFIGF1dGhtb2RlOwotCWVudW0gV0xBTl84MDJfMVhfQVVUSF9BTEcgYXV0aDF4YWxnOwotCWVudW0gV0xBTl84MDJfMTFfRU5DUllQVElPTl9NT0RFIEVuY3J5cHRpb25tb2RlOworCXU4IHdlcF9lbmFibGVkOworCXU4IGF1dGhfbW9kZTsKIH07CiAKIC8qKiBDdXJyZW50IEJhc2ljIFNlcnZpY2UgU2V0IFN0YXRlIFN0cnVjdHVyZSAqLwpAQCAtMTg0LDcgKzE4Myw3IEBACiAKIAlzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCBzc2lkOwogCXU4IGNoYW5uZWw7Ci0JZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIG1vZGU7CisJdTggbW9kZTsKIAl1OCBic3NpZFtFVEhfQUxFTl07CiAKIAkvKiogV0VQIGtleXMgKi8KQEAgLTE5OCw3ICsxOTcsNiBAQAogCXN0cnVjdCB3bGFuXzgwMl8xMV9zZWN1cml0eSBzZWNpbmZvOwogCiAJLyoqIFdQQSBJbmZvcm1hdGlvbiBFbGVtZW50cyovCi0jZGVmaW5lIE1BWF9XUEFfSUVfTEVOIDY0CiAJdTggd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKIAl1OCB3cGFfaWVfbGVuOwogfTsKQEAgLTI1NCw3ICsyNTIsOCBAQAogCS8qKiBjdXJyZW50IHNzaWQvYnNzaWQgcmVsYXRlZCBwYXJhbWV0ZXJzKi8KIAlzdHJ1Y3QgY3VycmVudF9ic3NfcGFyYW1zIGN1cmJzc3BhcmFtczsKIAotCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBpbmZyYW1vZGU7CisJLyogSVdfTU9ERV8qICovCisJdTggbW9kZTsKIAogCXN0cnVjdCBic3NfZGVzY3JpcHRvciAqcGF0dGVtcHRlZGJzc2Rlc2M7CiAKQEAgLTMzOSw3ICszMzgsNiBAQAogCXN0cnVjdCBXTEFOXzgwMl8xMV9LRVkgd3BhX3VuaWNhc3Rfa2V5OwogCiAJLyoqIFdQQSBJbmZvcm1hdGlvbiBFbGVtZW50cyovCi0jZGVmaW5lIE1BWF9XUEFfSUVfTEVOIDY0CiAJdTggd3BhX2llW01BWF9XUEFfSUVfTEVOXTsKIAl1OCB3cGFfaWVfbGVuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9mdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZncuYwppbmRleCBiMTk0YTQ1Li40NDExMjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2Z3LmMKQEAgLTE5NCwxNiArMTk0LDEzIEBACiAJYWRhcHRlci0+c2Nhbm1vZGUgPSBjbWRfYnNzX3R5cGVfYW55OwogCiAJLyogODAyLjExIHNwZWNpZmljICovCi0JYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPSB3bGFuODAyXzExV0VQZGlzYWJsZWQ7CisJYWRhcHRlci0+c2VjaW5mby53ZXBfZW5hYmxlZCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IHNpemVvZihhZGFwdGVyLT53ZXBfa2V5cykgLyBzaXplb2YoYWRhcHRlci0+d2VwX2tleXNbMF0pOwogCSAgICAgaSsrKQogCQltZW1zZXQoJmFkYXB0ZXItPndlcF9rZXlzW2ldLCAwLCBzaXplb2Yoc3RydWN0IFdMQU5fODAyXzExX0tFWSkpOwogCWFkYXB0ZXItPndlcF90eF9rZXlpZHggPSAwOwotCWFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID0gd2xhbjgwMl8xMVdFUGRpc2FibGVkOwotCWFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUgPSB3bGFuODAyXzExYXV0aG1vZGVvcGVuOwotCWFkYXB0ZXItPnNlY2luZm8uYXV0aDF4YWxnID0gV0xBTl8xWF9BVVRIX0FMR19OT05FOwotCWFkYXB0ZXItPnNlY2luZm8uRW5jcnlwdGlvbm1vZGUgPSBDSVBIRVJfTk9ORTsKLQlhZGFwdGVyLT5pbmZyYW1vZGUgPSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmU7CisJYWRhcHRlci0+c2VjaW5mby5hdXRoX21vZGUgPSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKKwlhZGFwdGVyLT5tb2RlID0gSVdfTU9ERV9JTkZSQTsKIAogCWFkYXB0ZXItPmFzc29jX3JlcSA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKaW5kZXggNjk1ZmI2YS4uYWU2ZjcyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmMKQEAgLTM4OCw3ICszODgsNyBAQAogCXVzYl9maWxsX2J1bGtfdXJiKGNhcmRwLT5yeF91cmIsIGNhcmRwLT51ZGV2LAogCQkJICB1c2JfcmN2YnVsa3BpcGUoY2FyZHAtPnVkZXYsCiAJCQkJCSAgY2FyZHAtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyKSwKLQkJCSAgc2tiLT50YWlsICsgSVBGSUVMRF9BTElHTl9PRkZTRVQsCisJCQkgICh2b2lkICopIChza2ItPnRhaWwgKyAoc2l6ZV90KSBJUEZJRUxEX0FMSUdOX09GRlNFVCksCiAJCQkgIE1SVkRSVl9FVEhfUlhfUEFDS0VUX0JVRkZFUl9TSVpFLCBjYWxsYmFja2ZuLAogCQkJICByaW5mbyk7CiAKQEAgLTYyNiw2ICs2MjYsNyBAQAogCQkJICAgIGNhcmRwLT51c2JfZXZlbnRfY2F1c2UpOwogCQlpZiAoY2FyZHAtPnVzYl9ldmVudF9jYXVzZSAmIDB4ZmZmZjAwMDApIHsKIAkJCWxpYmVydGFzX3NlbmRfdHhfZmVlZGJhY2socHJpdik7CisJCQlzcGluX3VubG9jaygmcHJpdi0+YWRhcHRlci0+ZHJpdmVyX2xvY2spOwogCQkJYnJlYWs7CiAJCX0KIAkJY2FyZHAtPnVzYl9ldmVudF9jYXVzZSA9IGxlMzJfdG9fY3B1KGNhcmRwLT51c2JfZXZlbnRfY2F1c2UpIDw8IDM7CkBAIC03NzUsNyArNzc2LDYgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotI2lmZGVmIFNVUFBPUlRfQk9PVF9DT01NQU5ECiAJY2FyZHAtPmJvb3RjbWRyZXNwID0gMDsKIAlkbyB7CiAJCWludCBqID0gMDsKQEAgLTc5Niw3ICs3OTYsNiBAQAogCQl9CiAJCXJldHVybiAtMTsKIAl9Ci0jZW5kaWYKIAogCWkgPSAwOwogCXByaXYtPmFkYXB0ZXItPmZ3X3JlYWR5ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3VzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmgKaW5kZXggNzg1MTE2Ny4uMTcwZGZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfdXNiLmgKQEAgLTEyLDcgKzEyLDYgQEAKICNkZWZpbmUgVVNCODM4OF9WSURfMgkweDA1YTMKICNkZWZpbmUgVVNCODM4OF9QSURfMgkweDgzODgKIAotI2lmZGVmIFNVUFBPUlRfQk9PVF9DT01NQU5ECiAjZGVmaW5lIEJPT1RfQ01EX0ZXX0JZX1VTQiAgICAgMHgwMQogI2RlZmluZSBCT09UX0NNRF9GV19JTl9FRVBST00gIDB4MDIKICNkZWZpbmUgQk9PVF9DTURfVVBEQVRFX0JPT1QyICAweDAzCkBAIC0zNiw3ICszNSw2IEBACiAJdTggIHU4cmVzdWx0OwogCXU4ICBhdThkdW15WzJdOwogfTsKLSNlbmRpZiAvKiBTVVBQT1JUX0JPT1RfQ09NTUFORCAqLwogCiAvKiByZWFkIGNhbGxiYWNrIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IHJlYWRfY2JfaW5mbyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaW9jdGwuYwppbmRleCA4MmIzOTY0Li5hOGY3NmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lvY3RsLmMKQEAgLTI3LDk1ICsyNyw2IEBACiAKICNkZWZpbmUgV0FJVF9GT1JfU0NBTl9SUkVTVUxUX01BWF9USU1FICgxMCAqIEhaKQogCi1zdGF0aWMgaW50IHNldHJ4YW50ZW5uYSh3bGFuX3ByaXZhdGUgKiBwcml2LCBpbnQgbW9kZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwotCi0JaWYgKG1vZGUgIT0gUkZfQU5URU5OQV8xICYmIG1vZGUgIT0gUkZfQU5URU5OQV8yCi0JICAgICYmIG1vZGUgIT0gUkZfQU5URU5OQV9BVVRPKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWFkYXB0ZXItPnJ4YW50ZW5uYW1vZGUgPSBtb2RlOwotCi0JbGJzX3ByX2RlYnVnKDEsICJTRVQgUlggQW50ZW5uYSBtb2RlIHRvIDB4JTA0eFxuIiwgYWRhcHRlci0+cnhhbnRlbm5hbW9kZSk7Ci0KLQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwgY21kXzgwMl8xMV9yZl9hbnRlbm5hLAotCQkJCSAgICBjbWRfYWN0X3NldF9yeCwKLQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAotCQkJCSAgICAmYWRhcHRlci0+cnhhbnRlbm5hbW9kZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzZXR0eGFudGVubmEod2xhbl9wcml2YXRlICogcHJpdiwgaW50IG1vZGUpCi17Ci0JaW50IHJldCA9IDA7Ci0Jd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKLQotCWlmICgobW9kZSAhPSBSRl9BTlRFTk5BXzEpICYmIChtb2RlICE9IFJGX0FOVEVOTkFfMikKLQkgICAgJiYgKG1vZGUgIT0gUkZfQU5URU5OQV9BVVRPKSkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlhZGFwdGVyLT50eGFudGVubmFtb2RlID0gbW9kZTsKLQotCWxic19wcl9kZWJ1ZygxLCAiU0VUIFRYIEFudGVubmEgbW9kZSB0byAweCUwNHhcbiIsIGFkYXB0ZXItPnR4YW50ZW5uYW1vZGUpOwotCi0JcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcmZfYW50ZW5uYSwKLQkJCQkgICAgY21kX2FjdF9zZXRfdHgsCi0JCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwKLQkJCQkgICAgJmFkYXB0ZXItPnR4YW50ZW5uYW1vZGUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBnZXRyeGFudGVubmEod2xhbl9wcml2YXRlICogcHJpdiwgY2hhciAqYnVmKQotewotCWludCByZXQgPSAwOwotCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0KLQkvLyBjbGVhciBpdCwgc28gd2Ugd2lsbCBrbm93IGlmIHRoZSB2YWx1ZQotCS8vIHJldHVybmVkIGJlbG93IGlzIGNvcnJlY3Qgb3Igbm90LgotCWFkYXB0ZXItPnJ4YW50ZW5uYW1vZGUgPSAwOwotCi0JcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfcmZfYW50ZW5uYSwKLQkJCQkgICAgY21kX2FjdF9nZXRfcngsCi0JCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7Ci0KLQlpZiAocmV0KSB7Ci0JCUxFQVZFKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JbGJzX3ByX2RlYnVnKDEsICJHZXQgUnggQW50ZW5uYSBtb2RlOjB4JTA0eFxuIiwgYWRhcHRlci0+cnhhbnRlbm5hbW9kZSk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwNHgiLCBhZGFwdGVyLT5yeGFudGVubmFtb2RlKSArIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0dHhhbnRlbm5hKHdsYW5fcHJpdmF0ZSAqIHByaXYsIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0ID0gMDsKLQl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwotCi0JLy8gY2xlYXIgaXQsIHNvIHdlIHdpbGwga25vdyBpZiB0aGUgdmFsdWUKLQkvLyByZXR1cm5lZCBiZWxvdyBpcyBjb3JyZWN0IG9yIG5vdC4KLQlhZGFwdGVyLT50eGFudGVubmFtb2RlID0gMDsKLQotCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX3JmX2FudGVubmEsCi0JCQkJICAgIGNtZF9hY3RfZ2V0X3R4LAotCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsIE5VTEwpOwotCi0JaWYgKHJldCkgewotCQlMRUFWRSgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWxic19wcl9kZWJ1ZygxLCAiR2V0IFR4IEFudGVubmEgbW9kZToweCUwNHhcbiIsIGFkYXB0ZXItPnR4YW50ZW5uYW1vZGUpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDR4IiwgYWRhcHRlci0+dHhhbnRlbm5hbW9kZSkgKyAxOwotfQotCiBzdGF0aWMgaW50IHdsYW5fc2V0X3JlZ2lvbih3bGFuX3ByaXZhdGUgKiBwcml2LCB1MTYgcmVnaW9uX2NvZGUpCiB7CiAJaW50IGk7CkBAIC0xNDQsOTk4ICs1NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qKgotICogIEBicmllZiBHZXQvU2V0IEZpcm13YXJlIHdha2V1cCBtZXRob2QKLSAqCi0gKiAgQHBhcmFtIHByaXYJCUEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHBhcmFtIHdycQkgICAJQSBwb2ludGVyIHRvIHVzZXIgZGF0YQotICogIEByZXR1cm4gCSAgIAkwLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAotICovCi1zdGF0aWMgaW50IHdsYW5fdHhjb250cm9sKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQotewotCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0JaW50IGRhdGE7Ci0JRU5URVIoKTsKLQotCWlmICgoaW50KXdycS0+dS5kYXRhLmxlbmd0aCA9PSAwKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIKLQkJICAgICh3cnEtPnUuZGF0YS5wb2ludGVyLCAmYWRhcHRlci0+cGt0dHhjdHJsLCBzaXplb2YodTMyKSkpIHsKLQkJCWxic19wcl9hbGVydCgiY29weV90b191c2VyIGZhaWxlZCFcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoKGludCl3cnEtPnUuZGF0YS5sZW5ndGggPiAxKSB7Ci0JCQlsYnNfcHJfYWxlcnQoImlvY3RsIHRvbyBtYW55IGFyZ3MhXG4iKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGludCkpKSB7Ci0JCQlsYnNfcHJfYWxlcnQoIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWFkYXB0ZXItPnBrdHR4Y3RybCA9ICh1MzIpIGRhdGE7Ci0JfQotCi0Jd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKLQotCUxFQVZFKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogIEBicmllZiBHZXQvU2V0IE5VTEwgUGFja2FnZSBnZW5lcmF0aW9uIGludGVydmFsCi0gKgotICogIEBwYXJhbSBwcml2CQlBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSB3cnEJICAgCUEgcG9pbnRlciB0byB1c2VyIGRhdGEKLSAqICBAcmV0dXJuIAkgICAJMC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKLSAqLwotc3RhdGljIGludCB3bGFuX251bGxfcGt0X2ludGVydmFsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQotewotCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0JaW50IGRhdGE7Ci0JRU5URVIoKTsKLQotCWlmICgoaW50KXdycS0+dS5kYXRhLmxlbmd0aCA9PSAwKSB7Ci0JCWRhdGEgPSBhZGFwdGVyLT5udWxscGt0aW50ZXJ2YWw7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCAmZGF0YSwgc2l6ZW9mKGludCkpKSB7Ci0JCQlsYnNfcHJfYWxlcnQoICJjb3B5X3RvX3VzZXIgZmFpbGVkIVxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICgoaW50KXdycS0+dS5kYXRhLmxlbmd0aCA+IDEpIHsKLQkJCWxic19wcl9hbGVydCggImlvY3RsIHRvbyBtYW55IGFyZ3MhXG4iKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGludCkpKSB7Ci0JCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWFkYXB0ZXItPm51bGxwa3RpbnRlcnZhbCA9IGRhdGE7Ci0JfQotCi0Jd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKLQotCUxFQVZFKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2xhbl9nZXRfcnhpbmZvKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQotewotCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0JaW50IGRhdGFbMl07Ci0JRU5URVIoKTsKLQlkYXRhWzBdID0gYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9OT0FWR107Ci0JZGF0YVsxXSA9IGFkYXB0ZXItPnJ4cGRfcmF0ZTsKLQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsIHNpemVvZihpbnQpICogMikpIHsKLQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCXdycS0+dS5kYXRhLmxlbmd0aCA9IDI7Ci0JTEVBVkUoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3bGFuX2dldF9zbnIod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCi17Ci0JaW50IHJldCA9IDA7Ci0Jd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKLQlpbnQgZGF0YVs0XTsKLQotCUVOVEVSKCk7Ci0JbWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7Ci0JaWYgKHdycS0+dS5kYXRhLmxlbmd0aCkgewotCQlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgd3JxLT51LmRhdGEucG9pbnRlciwKLQkJICAgICBtaW5fdChzaXplX3QsIHdycS0+dS5kYXRhLmxlbmd0aCwgNCkgKiBzaXplb2YoaW50KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0JaWYgKCh3cnEtPnUuZGF0YS5sZW5ndGggPT0gMCkgfHwgKGRhdGFbMF0gPT0gMCkgfHwgKGRhdGFbMF0gPT0gMSkpIHsKLQkJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgewotCQkJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJCQkgICAgY21kXzgwMl8xMV9yc3NpLAotCQkJCQkJICAgIDAsCi0JCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAotCQkJCQkJICAgIDAsIE5VTEwpOwotCi0JCQlpZiAocmV0KSB7Ci0JCQkJTEVBVkUoKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA9PSAwKSB7Ci0JCWRhdGFbMF0gPSBhZGFwdGVyLT5TTlJbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddOwotCQlkYXRhWzFdID0gYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX0FWR107Ci0JCWRhdGFbMl0gPSBhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX05PQVZHXTsKLQkJZGF0YVszXSA9IGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRTsKLQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBkYXRhLCBzaXplb2YoaW50KSAqIDQpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXdycS0+dS5kYXRhLmxlbmd0aCA9IDQ7Ci0JfSBlbHNlIGlmIChkYXRhWzBdID09IDApIHsKLQkJZGF0YVswXSA9IGFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR107Ci0JCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwgZGF0YSwgc2l6ZW9mKGludCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7Ci0JfSBlbHNlIGlmIChkYXRhWzBdID09IDEpIHsKLQkJZGF0YVswXSA9IGFkYXB0ZXItPlNOUltUWVBFX0JFQUNPTl1bVFlQRV9BVkddOwotCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsIHNpemVvZihpbnQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOwotCX0gZWxzZSBpZiAoZGF0YVswXSA9PSAyKSB7Ci0JCWRhdGFbMF0gPSBhZGFwdGVyLT5TTlJbVFlQRV9SWFBEXVtUWVBFX05PQVZHXTsKLQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBkYXRhLCBzaXplb2YoaW50KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKLQl9IGVsc2UgaWYgKGRhdGFbMF0gPT0gMykgewotCQlkYXRhWzBdID0gYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9BVkddIC8gQVZHX1NDQUxFOwotCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsIHNpemVvZihpbnQpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQl3cnEtPnUuZGF0YS5sZW5ndGggPSAxOwotCX0gZWxzZQotCQlyZXR1cm4gLUVOT1RTVVBQOwotCi0JTEVBVkUoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3bGFuX2JlYWNvbl9pbnRlcnZhbCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKLXsKLQlpbnQgZGF0YTsKLQl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwotCi0JaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDApIHsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW50KSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQotCQlsYnNfcHJfZGVidWcoMSwgIldMQU4gU0VUIEJFQUNPTiBJTlRFUlZBTDogJWRcbiIsIGRhdGEpOwotCQlpZiAoKGRhdGEgPiBNUlZEUlZfTUFYX0JFQUNPTl9JTlRFUlZBTCkKLQkJICAgIHx8IChkYXRhIDwgTVJWRFJWX01JTl9CRUFDT05fSU5URVJWQUwpKQotCQkJcmV0dXJuIC1FTk9UU1VQUDsKLQkJYWRhcHRlci0+YmVhY29ucGVyaW9kID0gZGF0YTsKLQl9Ci0JZGF0YSA9IGFkYXB0ZXItPmJlYWNvbnBlcmlvZDsKLQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZkYXRhLCBzaXplb2YoaW50KSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0Jd3JxLT51LmRhdGEubGVuZ3RoID0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdsYW5fZ2V0X3Jzc2kod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCi17Ci0JaW50IHJldCA9IDA7Ci0Jd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKLQlpbnQgdGVtcDsKLQlpbnQgZGF0YSA9IDA7Ci0JaW50ICp2YWw7Ci0KLQlFTlRFUigpOwotCWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOwotCWlmICgoZGF0YSA9PSAwKSB8fCAoZGF0YSA9PSAxKSkgewotCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKLQkJCQkJICAgIGNtZF84MDJfMTFfcnNzaSwKLQkJCQkJICAgIDAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKLQkJCQkJICAgIDAsIE5VTEwpOwotCQlpZiAocmV0KSB7Ci0JCQlMRUFWRSgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXN3aXRjaCAoZGF0YSkgewotCWNhc2UgMDoKLQotCQl0ZW1wID0gQ0FMX1JTU0koYWRhcHRlci0+U05SW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXSwKLQkJCQlhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9OT0FWR10pOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXRlbXAgPSBDQUxfUlNTSShhZGFwdGVyLT5TTlJbVFlQRV9CRUFDT05dW1RZUEVfQVZHXSwKLQkJCQlhZGFwdGVyLT5ORltUWVBFX0JFQUNPTl1bVFlQRV9BVkddKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQl0ZW1wID0gQ0FMX1JTU0koYWRhcHRlci0+U05SW1RZUEVfUlhQRF1bVFlQRV9OT0FWR10sCi0JCQkJYWRhcHRlci0+TkZbVFlQRV9SWFBEXVtUWVBFX05PQVZHXSk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJdGVtcCA9IENBTF9SU1NJKGFkYXB0ZXItPlNOUltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSwKLQkJCQlhZGFwdGVyLT5ORltUWVBFX1JYUERdW1RZUEVfQVZHXSAvIEFWR19TQ0FMRSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PVFNVUFA7Ci0JfQotCXZhbCA9IChpbnQgKil3cnEtPnUubmFtZTsKLQkqdmFsID0gdGVtcDsKLQotCUxFQVZFKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2xhbl9nZXRfbmYod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCi17Ci0JaW50IHJldCA9IDA7Ci0Jd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKLQlpbnQgdGVtcDsKLQlpbnQgZGF0YSA9IDA7Ci0JaW50ICp2YWw7Ci0KLQlkYXRhID0gU1VCQ01EX0RBVEEod3JxKTsKLQlpZiAoKGRhdGEgPT0gMCkgfHwgKGRhdGEgPT0gMSkpIHsKLQkJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJCSAgICBjbWRfODAyXzExX3Jzc2ksCi0JCQkJCSAgICAwLCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCi0JCQkJCSAgICAwLCBOVUxMKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlMRUFWRSgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXN3aXRjaCAoZGF0YSkgewotCWNhc2UgMDoKLQkJdGVtcCA9IGFkYXB0ZXItPk5GW1RZUEVfQkVBQ09OXVtUWVBFX05PQVZHXTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQl0ZW1wID0gYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfQVZHXTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQl0ZW1wID0gYWRhcHRlci0+TkZbVFlQRV9SWFBEXVtUWVBFX05PQVZHXTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQl0ZW1wID0gYWRhcHRlci0+TkZbVFlQRV9SWFBEXVtUWVBFX0FWR10gLyBBVkdfU0NBTEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PVFNVUFA7Ci0JfQotCi0JdGVtcCA9IENBTF9ORih0ZW1wKTsKLQotCWxic19wcl9kZWJ1ZygxLCAiJXM6IHRlbXAgPSAlZFxuIiwgX19GVU5DVElPTl9fLCB0ZW1wKTsKLQl2YWwgPSAoaW50ICopd3JxLT51Lm5hbWU7Ci0JKnZhbCA9IHRlbXA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd2xhbl9nZXRfdHhyYXRlX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQotewotCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0JaW50ICpwZGF0YTsKLQlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7Ci0JaW50IHJldCA9IDA7Ci0JYWRhcHRlci0+dHhyYXRlID0gMDsKLQlsYnNfcHJfZGVidWcoMSwgIndsYW5fZ2V0X3R4cmF0ZV9pb2N0bFxuIik7Ci0JcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfdHhfcmF0ZV9xdWVyeSwKLQkJCQkgICAgY21kX2FjdF9nZXQsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwKLQkJCQkgICAgMCwgTlVMTCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXBkYXRhID0gKGludCAqKXdycS0+dS5uYW1lOwotCSpwZGF0YSA9IChpbnQpYWRhcHRlci0+dHhyYXRlOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdsYW5fZ2V0X2FkaG9jX3N0YXR1c19pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKLXsKLQljaGFyIHN0YXR1c1s2NF07Ci0Jd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKLQotCW1lbXNldChzdGF0dXMsIDAsIHNpemVvZihzdGF0dXMpKTsKLQotCXN3aXRjaCAoYWRhcHRlci0+aW5mcmFtb2RlKSB7Ci0JY2FzZSB3bGFuODAyXzExaWJzczoKLQkJaWYgKGFkYXB0ZXItPmNvbm5lY3Rfc3RhdHVzID09IGxpYmVydGFzX2Nvbm5lY3RlZCkgewotCQkJaWYgKGFkYXB0ZXItPmFkaG9jY3JlYXRlKQotCQkJCW1lbWNweSgmc3RhdHVzLCAiQWRob2NTdGFydGVkIiwgc2l6ZW9mKHN0YXR1cykpOwotCQkJZWxzZQotCQkJCW1lbWNweSgmc3RhdHVzLCAiQWRob2NKb2luZWQiLCBzaXplb2Yoc3RhdHVzKSk7Ci0JCX0gZWxzZSB7Ci0JCQltZW1jcHkoJnN0YXR1cywgIkFkaG9jSWRsZSIsIHNpemVvZihzdGF0dXMpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZToKLQkJbWVtY3B5KCZzdGF0dXMsICJJbmZyYW1vZGUiLCBzaXplb2Yoc3RhdHVzKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCW1lbWNweSgmc3RhdHVzLCAiQXV0b1Vua25vd25tb2RlIiwgc2l6ZW9mKHN0YXR1cykpOwotCQlicmVhazsKLQl9Ci0KLQlsYnNfcHJfZGVidWcoMSwgInN0YXR1cyA9ICVzXG4iLCBzdGF0dXMpOwotCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihzdGF0dXMpICsgMTsKLQotCWlmICh3cnEtPnUuZGF0YS5wb2ludGVyKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKLQkJCQkgJnN0YXR1cywgd3JxLT51LmRhdGEubGVuZ3RoKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCX0KLQotCUxFQVZFKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogIEBicmllZiBTZXQvR2V0IFdQQSBJRQotICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSByZXEJCQlBIHBvaW50ZXIgdG8gaWZyZXEgc3RydWN0dXJlCi0gKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKLSAqLwotc3RhdGljIGludCB3bGFuX3NldHdwYWllX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQotewotCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKLQl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwotCWludCByZXQgPSAwOwotCi0JRU5URVIoKTsKLQotCWlmICh3cnEtPnUuZGF0YS5sZW5ndGgpIHsKLQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IHNpemVvZihhZGFwdGVyLT53cGFfaWUpKSB7Ci0JCQlsYnNfcHJfZGVidWcoMSwgImZhaWxlZCB0byBjb3B5IFdQQSBJRSwgdG9vIGJpZyBcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKGFkYXB0ZXItPndwYV9pZSwgd3JxLT51LmRhdGEucG9pbnRlciwKLQkJCQkgICB3cnEtPnUuZGF0YS5sZW5ndGgpKSB7Ci0JCQlsYnNfcHJfZGVidWcoMSwgImZhaWxlZCB0byBjb3B5IFdQQSBJRSBcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJYWRhcHRlci0+d3BhX2llX2xlbiA9IHdycS0+dS5kYXRhLmxlbmd0aDsKLQkJbGJzX3ByX2RlYnVnKDEsICJTZXQgd3BhX2llX2xlbj0lZCBJRT0lI3hcbiIsIGFkYXB0ZXItPndwYV9pZV9sZW4sCi0JCSAgICAgICBhZGFwdGVyLT53cGFfaWVbMF0pOwotCQlsYnNfZGJnX2hleCgid3BhX2llIiwgYWRhcHRlci0+d3BhX2llLCBhZGFwdGVyLT53cGFfaWVfbGVuKTsKLQkJaWYgKGFkYXB0ZXItPndwYV9pZVswXSA9PSBXUEFfSUUpCi0JCQlhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAxOwotCQllbHNlIGlmIChhZGFwdGVyLT53cGFfaWVbMF0gPT0gV1BBMl9JRSkKLQkJCWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQgPSAxOwotCQllbHNlIHsKLQkJCWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCA9IDA7Ci0JCQlhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCW1lbXNldChhZGFwdGVyLT53cGFfaWUsIDAsIHNpemVvZihhZGFwdGVyLT53cGFfaWUpKTsKLQkJYWRhcHRlci0+d3BhX2llX2xlbiA9IHdycS0+dS5kYXRhLmxlbmd0aDsKLQkJbGJzX3ByX2RlYnVnKDEsICJSZXNldCB3cGFfaWVfbGVuPSVkIElFPSUjeFxuIiwKLQkJICAgICAgIGFkYXB0ZXItPndwYV9pZV9sZW4sIGFkYXB0ZXItPndwYV9pZVswXSk7Ci0JCWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCA9IDA7Ci0JCWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQgPSAwOwotCX0KLQotCS8vIGVuYWJsZS9kaXNhYmxlIFJTTiBpbiBmaXJtd2FyZSBpZiBXUEEgaXMgZW5hYmxlZC9kaXNhYmxlZAotCS8vIGRlcGVuZGluZyBvbiB2YXJpYWJsZSBhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQgaXMgc2V0IG9yIG5vdAotCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LCBjbWRfODAyXzExX2VuYWJsZV9yc24sCi0JCQkJICAgIGNtZF9hY3Rfc2V0LCBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsCi0JCQkJICAgIDAsIE5VTEwpOwotCi0JTEVBVkUoKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqICBAYnJpZWYgU2V0IEF1dG8gcHJlc2NhbgotICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSB3cnEJCQlBIHBvaW50ZXIgdG8gaXdyZXEgc3RydWN0dXJlCi0gKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKLSAqLwotc3RhdGljIGludCB3bGFuX3N1YmNtZF9zZXRwcmVzY2FuX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQotewotCWludCBkYXRhOwotCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0JaW50ICp2YWw7Ci0KLQlkYXRhID0gU1VCQ01EX0RBVEEod3JxKTsKLQlsYnNfcHJfZGVidWcoMSwgIldMQU5fU1VCQ01EX1NFVF9QUkVTQ0FOICVkXG4iLCBkYXRhKTsKLQlhZGFwdGVyLT5wcmVzY2FuID0gZGF0YTsKLQotCXZhbCA9IChpbnQgKil3cnEtPnUubmFtZTsKLQkqdmFsID0gZGF0YTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3bGFuX3NldF9tdWx0aXBsZV9kdGltX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQotewotCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKLQl1MzIgbWR0aW07Ci0JaW50IGlkYXRhOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JRU5URVIoKTsKLQotCWlkYXRhID0gU1VCQ01EX0RBVEEod3JxKTsKLQltZHRpbSA9ICh1MzIpIGlkYXRhOwotCWlmICgoKG1kdGltID49IE1SVkRSVl9NSU5fTVVMVElQTEVfRFRJTSkKLQkgICAgICYmIChtZHRpbSA8PSBNUlZEUlZfTUFYX01VTFRJUExFX0RUSU0pKQotCSAgICB8fCAobWR0aW0gPT0gTVJWRFJWX0lHTk9SRV9NVUxUSVBMRV9EVElNKSkgewotCQlwcml2LT5hZGFwdGVyLT5tdWx0aXBsZWR0aW0gPSBtZHRpbTsKLQkJcmV0ID0gMDsKLQl9Ci0JaWYgKHJldCkKLQkJbGJzX3ByX2RlYnVnKDEsICJJbnZhbGlkIHBhcmFtZXRlciwgbXVsdGlwbGVkdGltIG5vdCBjaGFuZ2VkLlxuIik7Ci0KLQlMRUFWRSgpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogIEBicmllZiBTZXQgYXV0aGVudGljYXRpb24gbW9kZQotICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSByZXEJCQlBIHBvaW50ZXIgdG8gaWZyZXEgc3RydWN0dXJlCi0gKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKLSAqLwotc3RhdGljIGludCB3bGFuX3NldGF1dGhhbGdfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGlmcmVxICpyZXEpCi17Ci0JaW50IGFsZzsKLQlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7Ci0Jd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKLQotCWlmICh3cnEtPnUuZGF0YS5mbGFncyA9PSAwKSB7Ci0JCS8vZnJvbSBpd3ByaXYgc3ViY21kCi0JCWFsZyA9IFNVQkNNRF9EQVRBKHdycSk7Ci0JfSBlbHNlIHsKLQkJLy9mcm9tIHdwYV9zdXBwbGljYW50IHN1YmNtZAotCQlpZiAoY29weV9mcm9tX3VzZXIoJmFsZywgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGFsZykpKSB7Ci0JCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQotCWxic19wcl9kZWJ1ZygxLCAiYXV0aCBhbGcgaXMgJSN4XG4iLCBhbGcpOwotCi0Jc3dpdGNoIChhbGcpIHsKLQljYXNlIEFVVEhfQUxHX1NIQVJFRF9LRVk6Ci0JCWFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUgPSB3bGFuODAyXzExYXV0aG1vZGVzaGFyZWQ7Ci0JCWJyZWFrOwotCWNhc2UgQVVUSF9BTEdfTkVUV09SS19FQVA6Ci0JCWFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUgPQotCQkgICAgd2xhbjgwMl8xMWF1dGhtb2RlbmV0d29ya0VBUDsKLQkJYnJlYWs7Ci0JY2FzZSBBVVRIX0FMR19PUEVOX1NZU1RFTToKLQlkZWZhdWx0OgotCQlhZGFwdGVyLT5zZWNpbmZvLmF1dGhtb2RlID0gd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqICBAYnJpZWYgU2V0IDgwMi4xeCBhdXRoZW50aWNhdGlvbiBtb2RlCi0gKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHBhcmFtIHJlcQkJCUEgcG9pbnRlciB0byBpZnJlcSBzdHJ1Y3R1cmUKLSAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAotICovCi1zdGF0aWMgaW50IHdsYW5fc2V0ODAyMXhhdXRoYWxnX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQotewotCWludCBhbGc7Ci0Jc3RydWN0IGl3cmVxICp3cnEgPSAoc3RydWN0IGl3cmVxICopcmVxOwotCi0JaWYgKHdycS0+dS5kYXRhLmZsYWdzID09IDApIHsKLQkJLy9mcm9tIGl3cHJpdiBzdWJjbWQKLQkJYWxnID0gU1VCQ01EX0RBVEEod3JxKTsKLQl9IGVsc2UgewotCQkvL2Zyb20gd3BhX3N1cHBsaWNhbnQgc3ViY21kCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmYWxnLCB3cnEtPnUuZGF0YS5wb2ludGVyLCBzaXplb2YoaW50KSkpIHsKLQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JfQotCWxic19wcl9kZWJ1ZygxLCAiODAyLjF4IGF1dGggYWxnIGlzICUjeFxuIiwgYWxnKTsKLQlwcml2LT5hZGFwdGVyLT5zZWNpbmZvLmF1dGgxeGFsZyA9IGFsZzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3bGFuX3NldGVuY3J5cHRpb25tb2RlX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQotewotCWludCBtb2RlOwotCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKLQotCUVOVEVSKCk7Ci0KLQlpZiAod3JxLT51LmRhdGEuZmxhZ3MgPT0gMCkgewotCQkvL2Zyb20gaXdwcml2IHN1YmNtZAotCQltb2RlID0gU1VCQ01EX0RBVEEod3JxKTsKLQl9IGVsc2UgewotCQkvL2Zyb20gd3BhX3N1cHBsaWNhbnQgc3ViY21kCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmbW9kZSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGludCkpKSB7Ci0JCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQlsYnNfcHJfZGVidWcoMSwgImVuY3J5cHRpb24gbW9kZSBpcyAlI3hcbiIsIG1vZGUpOwotCXByaXYtPmFkYXB0ZXItPnNlY2luZm8uRW5jcnlwdGlvbm1vZGUgPSBtb2RlOwotCi0JTEVBVkUoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYWRqdXN0X210dSh3bGFuX3ByaXZhdGUgKiBwcml2KQotewotCWludCBtdHVfaW5jcmVtZW50ID0gMDsKLQotCWlmIChwcml2LT5hZGFwdGVyLT5saW5rbW9kZSA9PSBXTEFOX0xJTktNT0RFXzgwMl8xMSkKLQkJbXR1X2luY3JlbWVudCArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIpOwotCi0JaWYgKHByaXYtPmFkYXB0ZXItPnJhZGlvbW9kZSA9PSBXTEFOX1JBRElPTU9ERV9SQURJT1RBUCkKLQkJbXR1X2luY3JlbWVudCArPSBtYXgoc2l6ZW9mKHN0cnVjdCB0eF9yYWRpb3RhcF9oZHIpLAotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCByeF9yYWRpb3RhcF9oZHIpKTsKLQlwcml2LT53bGFuX2Rldi5uZXRkZXYtPm10dSA9IEVUSF9GUkFNRV9MRU4KLQkgICAgLSBzaXplb2Yoc3RydWN0IGV0aGhkcikKLQkgICAgKyBtdHVfaW5jcmVtZW50OwotfQotCi0vKioKLSAqICBAYnJpZWYgU2V0IExpbmstTGF5ZXIgTGF5ZXIgbW9kZQotICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSByZXEJCQlBIHBvaW50ZXIgdG8gaWZyZXEgc3RydWN0dXJlCi0gKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKLSAqLwotc3RhdGljIGludCB3bGFuX3NldF9saW5rbW9kZV9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKLXsKLQlpbnQgbW9kZTsKLQotCW1vZGUgPSAoaW50KSgoc3RydWN0IGlmcmVxICopKCh1OCAqKSByZXEgKyA0KSktPmlmcl9kYXRhOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBXTEFOX0xJTktNT0RFXzgwMl8zOgotCQlwcml2LT5hZGFwdGVyLT5saW5rbW9kZSA9IG1vZGU7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9MSU5LTU9ERV84MDJfMTE6Ci0JCXByaXYtPmFkYXB0ZXItPmxpbmttb2RlID0gbW9kZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbGJzX3ByX2luZm8oInVzYjgzODgtNTogaW52YWxpZCBsaW5rLWxheWVyIG1vZGUgKCUjeClcbiIsCi0JCSAgICAgICBtb2RlKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQlsYnNfcHJfZGVidWcoMSwgInVzYjgzODgtNTogbGluay1sYXllciBtb2RlIGlzICUjeFxuIiwgbW9kZSk7Ci0KLQlhZGp1c3RfbXR1KHByaXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogIEBicmllZiBTZXQgUmFkaW8gaGVhZGVyIG1vZGUKLSAqICBAcGFyYW0gcHJpdiAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gcmVxCQkJQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQotICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCi0gKi8KLXN0YXRpYyBpbnQgd2xhbl9zZXRfcmFkaW9tb2RlX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQotewotCWludCBtb2RlOwotCi0JbW9kZSA9IChpbnQpKChzdHJ1Y3QgaWZyZXEgKikoKHU4ICopIHJlcSArIDQpKS0+aWZyX2RhdGE7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFdMQU5fUkFESU9NT0RFX05PTkU6Ci0JCXByaXYtPmFkYXB0ZXItPnJhZGlvbW9kZSA9IG1vZGU7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9SQURJT01PREVfUkFESU9UQVA6Ci0JCXByaXYtPmFkYXB0ZXItPnJhZGlvbW9kZSA9IG1vZGU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWxic19wcl9kZWJ1ZygxLCAidXNiODM4OC01OiBpbnZhbGlkIHJhZGlvIGhlYWRlciBtb2RlICglI3gpXG4iLAotCQkgICAgICAgbW9kZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlsYnNfcHJfZGVidWcoMSwgInVzYjgzODgtNTogcmFkaW8taGVhZGVyIG1vZGUgaXMgJSN4XG4iLCBtb2RlKTsKLQotCWFkanVzdF9tdHUocHJpdik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogIEBicmllZiBTZXQgRGVidWcgaGVhZGVyIG1vZGUKLSAqICBAcGFyYW0gcHJpdiAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcGFyYW0gcmVxCQkJQSBwb2ludGVyIHRvIGlmcmVxIHN0cnVjdHVyZQotICogIEByZXR1cm4gCSAgIAkJMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCi0gKi8KLXN0YXRpYyBpbnQgd2xhbl9zZXRfZGVidWdtb2RlX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQotewotCXByaXYtPmFkYXB0ZXItPmRlYnVnbW9kZSA9IChpbnQpKChzdHJ1Y3QgaWZyZXEgKikKLQkJCQkJICgodTggKikgcmVxICsgNCkpLT5pZnJfZGF0YTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3bGFuX3N1YmNtZF9nZXRyeGFudGVubmFfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwKLQkJCQkJICBzdHJ1Y3QgaWZyZXEgKnJlcSkKLXsKLQlpbnQgbGVuOwotCWNoYXIgYnVmWzhdOwotCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKLQotCWxic19wcl9kZWJ1ZygxLCAiV0xBTl9TVUJDTURfR0VUUlhBTlRFTk5BXG4iKTsKLQlsZW4gPSBnZXRyeGFudGVubmEocHJpdiwgYnVmKTsKLQotCXdycS0+dS5kYXRhLmxlbmd0aCA9IGxlbjsKLQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikgewotCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZidWYsIGxlbikpIHsKLQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weVRvVXNlciBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3bGFuX3N1YmNtZF9nZXR0eGFudGVubmFfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwKLQkJCQkJICBzdHJ1Y3QgaWZyZXEgKnJlcSkKLXsKLQlpbnQgbGVuOwotCWNoYXIgYnVmWzhdOwotCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKLQotCWxic19wcl9kZWJ1ZygxLCAiV0xBTl9TVUJDTURfR0VUVFhBTlRFTk5BXG4iKTsKLQlsZW4gPSBnZXR0eGFudGVubmEocHJpdiwgYnVmKTsKLQotCXdycS0+dS5kYXRhLmxlbmd0aCA9IGxlbjsKLQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikgewotCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZidWYsIGxlbikpIHsKLQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weVRvVXNlciBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogIEBicmllZiBHZXQgdGhlIE1BQyBUU0YgdmFsdWUgZnJvbSB0aGUgZmlybXdhcmUKLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSB3cnEgICAgICAgICAgQSBwb2ludGVyIHRvIGl3cmVxIHN0cnVjdHVyZSBjb250YWluaW5nIGJ1ZmZlcgotICogICAgICAgICAgICAgICAgICAgICAgc3BhY2UgdG8gc3RvcmUgYSBUU0YgdmFsdWUgcmV0cmlldmVkIGZyb20gdGhlIGZpcm13YXJlCi0gKgotICogIEByZXR1cm4gICAgICAgICAgICAgMCBpZiBzdWNjZXNzZnVsOyBJT0NUTCBlcnJvciBjb2RlIG90aGVyd2lzZQotICovCi1zdGF0aWMgaW50IHdsYW5fZ2V0X3RzZl9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKLXsKLQl1NjQgdHNmdmFsOwotCWludCByZXQ7Ci0KLQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKLQkJCQkgICAgY21kX2dldF90c2YsCi0JCQkJICAgIDAsIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgJnRzZnZhbCk7Ci0KLQlsYnNfcHJfZGVidWcoMSwgIklPQ1RMOiBHZXQgVFNGID0gMHglMDE2bGx4XG4iLCB0c2Z2YWwpOwotCi0JaWYgKHJldCAhPSAwKSB7Ci0JCWxic19wcl9kZWJ1ZygxLCAiSU9DVEw6IEdldCBUU0Y7IGNvbW1hbmQgZXhlYyBmYWlsZWRcbiIpOwotCQlyZXQgPSAtRUZBVUxUOwotCX0gZWxzZSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKLQkJCQkgJnRzZnZhbCwKLQkJCQkgbWluX3Qoc2l6ZV90LCB3cnEtPnUuZGF0YS5sZW5ndGgsCi0JCQkJICAgICBzaXplb2YodHNmdmFsKSkpICE9IDApIHsKLQotCQkJbGJzX3ByX2RlYnVnKDEsICJJT0NUTDogR2V0IFRTRjsgQ29weSB0byB1c2VyIGZhaWxlZFxuIik7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQl9IGVsc2UgewotCQkJcmV0ID0gMDsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqICBAYnJpZWYgR2V0L1NldCBhZGFwdCByYXRlCi0gKiAgQHBhcmFtIHByaXYgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHBhcmFtIHdycQkJCUEgcG9pbnRlciB0byBpd3JlcSBzdHJ1Y3R1cmUKLSAqICBAcmV0dXJuIAkgICAJCTAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAotICovCi1zdGF0aWMgaW50IHdsYW5fYWRhcHRfcmF0ZXNldCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKLXsKLQlpbnQgcmV0OwotCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0JaW50IGRhdGFbMl07Ci0KLQltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKLQlpZiAoIXdycS0+dS5kYXRhLmxlbmd0aCkgewotCQlsYnNfcHJfZGVidWcoMSwgIkdldCBBREFQVCBSQVRFIFNFVFxuIik7Ci0JCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAotCQkJCQkgICAgY21kXzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQsCi0JCQkJCSAgICBjbWRfYWN0X2dldCwKLQkJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7Ci0JCWRhdGFbMF0gPSBhZGFwdGVyLT5lbmFibGVod2F1dG87Ci0JCWRhdGFbMV0gPSBhZGFwdGVyLT5yYXRlYml0bWFwOwotCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsIHNpemVvZihpbnQpICogMikpIHsKLQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotI2RlZmluZSBHRVRfVFdPX0lOVAkyCi0JCXdycS0+dS5kYXRhLmxlbmd0aCA9IEdFVF9UV09fSU5UOwotCX0gZWxzZSB7Ci0JCWxic19wcl9kZWJ1ZygxLCAiU2V0IEFEQVBUIFJBVEUgU0VUXG4iKTsKLQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDIpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCSAgICAoZGF0YSwgd3JxLT51LmRhdGEucG9pbnRlciwKLQkJICAgICBzaXplb2YoaW50KSAqIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKLQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0KLQkJYWRhcHRlci0+ZW5hYmxlaHdhdXRvID0gZGF0YVswXTsKLQkJYWRhcHRlci0+cmF0ZWJpdG1hcCA9IGRhdGFbMV07Ci0JCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAotCQkJCQkgICAgY21kXzgwMl8xMV9yYXRlX2FkYXB0X3JhdGVzZXQsCi0JCQkJCSAgICBjbWRfYWN0X3NldCwKLQkJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwgTlVMTCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogIEBicmllZiBHZXQvU2V0IGluYWN0aXZpdHkgdGltZW91dAotICogIEBwYXJhbSBwcml2ICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQotICogIEBwYXJhbSB3cnEJCQlBIHBvaW50ZXIgdG8gaXdyZXEgc3RydWN0dXJlCi0gKiAgQHJldHVybiAJICAgCQkwIC0tc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWwKLSAqLwotc3RhdGljIGludCB3bGFuX2luYWN0aXZpdHlfdGltZW91dCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKLXsKLQlpbnQgcmV0OwotCWludCBkYXRhID0gMDsKLQl1MTYgdGltZW91dCA9IDA7Ci0KLQlFTlRFUigpOwotCWlmICh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKQotCQlyZXR1cm4gLUVOT1RTVVBQOwotCi0JaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA9PSAwKSB7Ci0JCS8qIEdldCAqLwotCQlyZXQgPSBsaWJlcnRhc19wcmVwYXJlX2FuZF9zZW5kX2NvbW1hbmQocHJpdiwKLQkJCQkJICAgIGNtZF84MDJfMTFfaW5hY3Rpdml0eV90aW1lb3V0LAotCQkJCQkgICAgY21kX2FjdF9nZXQsCi0JCQkJCSAgICBjbWRfb3B0aW9uX3dhaXRmb3Jyc3AsIDAsCi0JCQkJCSAgICAmdGltZW91dCk7Ci0JCWRhdGEgPSB0aW1lb3V0OwotCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsICZkYXRhLCBzaXplb2YoaW50KSkpIHsKLQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFNldCAqLwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsIHNpemVvZihpbnQpKSkgewotCQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQotCQl0aW1lb3V0ID0gZGF0YTsKLQkJcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJCSAgICBjbWRfODAyXzExX2luYWN0aXZpdHlfdGltZW91dCwKLQkJCQkJICAgIGNtZF9hY3Rfc2V0LAotCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLAotCQkJCQkgICAgJnRpbWVvdXQpOwotCX0KLQotCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7Ci0KLQlMRUFWRSgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2xhbl9kb19nZXRsb2dfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdiwgc3RydWN0IGl3cmVxICp3cnEpCi17Ci0JaW50IHJldDsKLQljaGFyIGJ1ZltHRVRMT0dfQlVGU0laRSAtIDFdOwotCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0KLQlsYnNfcHJfZGVidWcoMSwgIiBHRVQgU1RBVFNcbiIpOwotCi0JcmV0ID0gbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsIGNtZF84MDJfMTFfZ2V0X2xvZywKLQkJCQkgICAgMCwgY21kX29wdGlvbl93YWl0Zm9ycnNwLCAwLCBOVUxMKTsKLQotCWlmIChyZXQpIHsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAod3JxLT51LmRhdGEucG9pbnRlcikgewotCQlzcHJpbnRmKGJ1ZiwgIlxuICBtY2FzdHR4ZnJhbWUgJXUgZmFpbGVkICV1IHJldHJ5ICV1ICIKLQkJCSJtdWx0aXJldHJ5ICV1IGZyYW1lZHVwICV1ICIKLQkJCSJydHNzdWNjZXNzICV1IHJ0c2ZhaWx1cmUgJXUgYWNrZmFpbHVyZSAldVxuIgotCQkJInJ4ZnJhZyAldSBtY2FzdHJ4ZnJhbWUgJXUgZmNzZXJyb3IgJXUgIgotCQkJInR4ZnJhbWUgJXUgd2VwdW5kZWNyeXB0YWJsZSAldSAiLAotCQkJYWRhcHRlci0+bG9nbXNnLm1jYXN0dHhmcmFtZSwKLQkJCWFkYXB0ZXItPmxvZ21zZy5mYWlsZWQsCi0JCQlhZGFwdGVyLT5sb2dtc2cucmV0cnksCi0JCQlhZGFwdGVyLT5sb2dtc2cubXVsdGlyZXRyeSwKLQkJCWFkYXB0ZXItPmxvZ21zZy5mcmFtZWR1cCwKLQkJCWFkYXB0ZXItPmxvZ21zZy5ydHNzdWNjZXNzLAotCQkJYWRhcHRlci0+bG9nbXNnLnJ0c2ZhaWx1cmUsCi0JCQlhZGFwdGVyLT5sb2dtc2cuYWNrZmFpbHVyZSwKLQkJCWFkYXB0ZXItPmxvZ21zZy5yeGZyYWcsCi0JCQlhZGFwdGVyLT5sb2dtc2cubWNhc3RyeGZyYW1lLAotCQkJYWRhcHRlci0+bG9nbXNnLmZjc2Vycm9yLAotCQkJYWRhcHRlci0+bG9nbXNnLnR4ZnJhbWUsCi0JCQlhZGFwdGVyLT5sb2dtc2cud2VwdW5kZWNyeXB0YWJsZSk7Ci0JCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpICsgMTsKLQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLCBidWYsIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKLQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdsYW5fc2Nhbl90eXBlX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQotewotCXU4IGJ1ZlsxMl07Ci0JdTggKm9wdGlvbltdID0geyAiYWN0aXZlIiwgInBhc3NpdmUiLCAiZ2V0IiwgfTsKLQlpbnQgaSwgbWF4X29wdGlvbnMgPSAoc2l6ZW9mKG9wdGlvbikgLyBzaXplb2Yob3B0aW9uWzBdKSk7Ci0JaW50IHJldCA9IDA7Ci0Jd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKLQotCWlmIChwcml2LT5hZGFwdGVyLT5lbmFibGUxMWQpIHsKLQkJbGJzX3ByX2RlYnVnKDEsICIxMUQ6IENhbm5vdCBzZXQgc2NhbnR5cGUgd2hlbiAxMUQgZW5hYmxlZFxuIik7Ci0JCXJldHVybiAtRUZBVUxUOwotCX0KLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHdycS0+dS5kYXRhLnBvaW50ZXIsIG1pbl90KHNpemVfdCwgc2l6ZW9mKGJ1ZiksCi0JCQkJCQkJIHdycS0+dS5kYXRhLmxlbmd0aCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWxic19wcl9kZWJ1ZygxLCAiU2NhbiB0eXBlIE9wdGlvbiA9ICVzXG4iLCBidWYpOwotCi0JYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOwotCi0JZm9yIChpID0gMDsgaSA8IG1heF9vcHRpb25zOyBpKyspIHsKLQkJaWYgKCFzdHJjbXAoYnVmLCBvcHRpb25baV0pKQotCQkJYnJlYWs7Ci0JfQotCi0Jc3dpdGNoIChpKSB7Ci0JY2FzZSAwOgotCQlhZGFwdGVyLT5zY2FudHlwZSA9IGNtZF9zY2FuX3R5cGVfYWN0aXZlOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWFkYXB0ZXItPnNjYW50eXBlID0gY21kX3NjYW5fdHlwZV9wYXNzaXZlOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXdycS0+dS5kYXRhLmxlbmd0aCA9IHN0cmxlbihvcHRpb25bYWRhcHRlci0+c2NhbnR5cGVdKSArIDE7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcih3cnEtPnUuZGF0YS5wb2ludGVyLAotCQkJCSBvcHRpb25bYWRhcHRlci0+c2NhbnR5cGVdLAotCQkJCSB3cnEtPnUuZGF0YS5sZW5ndGgpKSB7Ci0JCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOwotCQkJcmV0ID0gLUVGQVVMVDsKLQkJfQotCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWxic19wcl9kZWJ1ZygxLCAiSW52YWxpZCBTY2FuIHR5cGUgSW9jdGwgT3B0aW9uXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3bGFuX3NjYW5fbW9kZV9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaXdyZXEgKndycSkKLXsKLQl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwotCXU4IGJ1ZlsxMl07Ci0JdTggKm9wdGlvbltdID0geyAiYnNzIiwgImlic3MiLCAiYW55IiwgImdldCIgfTsKLQlpbnQgaSwgbWF4X29wdGlvbnMgPSAoc2l6ZW9mKG9wdGlvbikgLyBzaXplb2Yob3B0aW9uWzBdKSk7Ci0JaW50IHJldCA9IDA7Ci0KLQlFTlRFUigpOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1Ziwgd3JxLT51LmRhdGEucG9pbnRlciwgbWluX3Qoc2l6ZV90LCBzaXplb2YoYnVmKSwKLQkJCQkJCQkgd3JxLT51LmRhdGEubGVuZ3RoKSkpIHsKLQkJbGJzX3ByX2RlYnVnKDEsICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlsYnNfcHJfZGVidWcoMSwgIlNjYW4gbW9kZSBPcHRpb24gPSAlc1xuIiwgYnVmKTsKLQotCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1wwJzsKLQotCWZvciAoaSA9IDA7IGkgPCBtYXhfb3B0aW9uczsgaSsrKSB7Ci0JCWlmICghc3RyY21wKGJ1Ziwgb3B0aW9uW2ldKSkKLQkJCWJyZWFrOwotCX0KLQotCXN3aXRjaCAoaSkgewotCi0JY2FzZSAwOgotCQlhZGFwdGVyLT5zY2FubW9kZSA9IGNtZF9ic3NfdHlwZV9ic3M7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJYWRhcHRlci0+c2Nhbm1vZGUgPSBjbWRfYnNzX3R5cGVfaWJzczsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlhZGFwdGVyLT5zY2FubW9kZSA9IGNtZF9ic3NfdHlwZV9hbnk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQotCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBzdHJsZW4ob3B0aW9uW2FkYXB0ZXItPnNjYW5tb2RlIC0gMV0pICsgMTsKLQotCQlsYnNfcHJfZGVidWcoMSwgIkdldCBTY2FuIG1vZGUgT3B0aW9uID0gJXNcbiIsCi0JCSAgICAgICBvcHRpb25bYWRhcHRlci0+c2Nhbm1vZGUgLSAxXSk7Ci0KLQkJbGJzX3ByX2RlYnVnKDEsICJTY2FuIG1vZGUgbGVuZ3RoICVkXG4iLCB3cnEtPnUuZGF0YS5sZW5ndGgpOwotCi0JCWlmIChjb3B5X3RvX3VzZXIod3JxLT51LmRhdGEucG9pbnRlciwKLQkJCQkgb3B0aW9uW2FkYXB0ZXItPnNjYW5tb2RlIC0gMV0sCi0JCQkJIHdycS0+dS5kYXRhLmxlbmd0aCkpIHsKLQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQl9Ci0JCWxic19wcl9kZWJ1ZygxLCAiR0VUIFNjYW4gdHlwZSBPcHRpb24gYWZ0ZXIgY29weSA9ICVzXG4iLAotCQkgICAgICAgKGNoYXIgKil3cnEtPnUuZGF0YS5wb2ludGVyKTsKLQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWxic19wcl9kZWJ1ZygxLCAiSW52YWxpZCBTY2FuIG1vZGUgSW9jdGwgT3B0aW9uXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JTEVBVkUoKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqICBAYnJpZWYgR2V0L1NldCBBZGhvYyBHIFJhdGUKLSAqCi0gKiAgQHBhcmFtIHByaXYJCUEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCi0gKiAgQHBhcmFtIHdycQkgICAJQSBwb2ludGVyIHRvIHVzZXIgZGF0YQotICogIEByZXR1cm4gCSAgIAkwLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAotICovCi1zdGF0aWMgaW50IHdsYW5fZG9fc2V0X2dyYXRlX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpd3JlcSAqd3JxKQotewotCXdsYW5fYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0JaW50IGRhdGEsIGRhdGExOwotCWludCAqdmFsOwotCi0JRU5URVIoKTsKLQotCWRhdGExID0gU1VCQ01EX0RBVEEod3JxKTsKLQlzd2l0Y2ggKGRhdGExKSB7Ci0JY2FzZSAwOgotCQlhZGFwdGVyLT5hZGhvY19ncmF0ZV9lbmFibGVkID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlhZGFwdGVyLT5hZGhvY19ncmF0ZV9lbmFibGVkID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JZGF0YSA9IGFkYXB0ZXItPmFkaG9jX2dyYXRlX2VuYWJsZWQ7Ci0JdmFsID0gKGludCAqKXdycS0+dS5uYW1lOwotCSp2YWwgPSBkYXRhOwotCUxFQVZFKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IGhleDJpbnQoY2hhciBjKQogewogCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKQEAgLTE3NjEsNiArNjgwLDcgQEAKICAqLwogc3RhdGljIGludCB3bGFuX2Z3dF9jbGVhbnVwX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQogeworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKIAlzdGF0aWMgc3RydWN0IGNtZF9kc19md3RfYWNjZXNzIGZ3dF9hY2Nlc3M7CiAJaW50IHJldDsKIApAQCAtMTc3Niw3ICs2OTYsNyBAQAogCQkJCSAgICAodm9pZCAqKSZmd3RfYWNjZXNzKTsKIAogCWlmIChyZXQgPT0gMCkKLQkJcmVxLT5pZnJfZGF0YSA9IChjaGFyICopKGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MucmVmZXJlbmNlcykpOworCQl3cnEtPnUucGFyYW0udmFsdWUgPSBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLnJlZmVyZW5jZXMpOwogCWVsc2UKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTE3OTIsNiArNzEyLDcgQEAKICAqLwogc3RhdGljIGludCB3bGFuX2Z3dF90aW1lX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYsIHN0cnVjdCBpZnJlcSAqcmVxKQogeworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJlcTsKIAlzdGF0aWMgc3RydWN0IGNtZF9kc19md3RfYWNjZXNzIGZ3dF9hY2Nlc3M7CiAJaW50IHJldDsKIApAQCAtMTgwNyw3ICs3MjgsNyBAQAogCQkJCSAgICAodm9pZCAqKSZmd3RfYWNjZXNzKTsKIAogCWlmIChyZXQgPT0gMCkKLQkJcmVxLT5pZnJfZGF0YSA9IChjaGFyICopKGxlMzJfdG9fY3B1KGZ3dF9hY2Nlc3MucmVmZXJlbmNlcykpOworCQl3cnEtPnUucGFyYW0udmFsdWUgPSBsZTMyX3RvX2NwdShmd3RfYWNjZXNzLnJlZmVyZW5jZXMpOwogCWVsc2UKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKQEAgLTE4MjMsNiArNzQ0LDcgQEAKICAqLwogc3RhdGljIGludCB3bGFuX21lc2hfZ2V0X3R0bF9pb2N0bCh3bGFuX3ByaXZhdGUgKiBwcml2LCBzdHJ1Y3QgaWZyZXEgKnJlcSkKIHsKKwlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilyZXE7CiAJc3RydWN0IGNtZF9kc19tZXNoX2FjY2VzcyBtZXNoX2FjY2VzczsKIAlpbnQgcmV0OwogCkBAIC0xODM1LDkgKzc1Nyw4IEBACiAJCQkJICAgIGNtZF9vcHRpb25fd2FpdGZvcnJzcCwgMCwKIAkJCQkgICAgKHZvaWQgKikmbWVzaF9hY2Nlc3MpOwogCi0JaWYgKHJldCA9PSAwKSB7Ci0JCXJlcS0+aWZyX2RhdGEgPSAoY2hhciAqKShsZTMyX3RvX2NwdShtZXNoX2FjY2Vzcy5kYXRhWzBdKSk7Ci0JfQorCWlmIChyZXQgPT0gMCkKKwkJd3JxLT51LnBhcmFtLnZhbHVlID0gbGUzMl90b19jcHUobWVzaF9hY2Nlc3MuZGF0YVswXSk7CiAJZWxzZQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMTg5OCwzNiArODE5LDggQEAKIAogCWxic19wcl9kZWJ1ZygxLCAibGliZXJ0YXNfZG9faW9jdGw6IGlvY3RsIGNtZCA9IDB4JXhcbiIsIGNtZCk7CiAJc3dpdGNoIChjbWQpIHsKLQljYXNlIFdMQU5TQ0FOX1RZUEU6Ci0JCWxic19wcl9kZWJ1ZygxLCAiU2NhbiB0eXBlIElvY3RsXG4iKTsKLQkJcmV0ID0gd2xhbl9zY2FuX3R5cGVfaW9jdGwocHJpdiwgd3JxKTsKLQkJYnJlYWs7Ci0KIAljYXNlIFdMQU5fU0VUTk9ORV9HRVROT05FOgkvKiBzZXQgV1BBIG1vZGUgb24vb2ZmIGlvY3RsICMyMCAqLwogCQlzd2l0Y2ggKHdycS0+dS5kYXRhLmZsYWdzKSB7Ci0JCWNhc2UgV0xBTkRFQVVUSDoKLQkJCWxic19wcl9kZWJ1ZygxLCAiRGVhdXRoXG4iKTsKLQkJCWxpYmVydGFzX3NlbmRfZGVhdXRoKHByaXYpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOQURIT0NTVE9QOgotCQkJbGJzX3ByX2RlYnVnKDEsICJBZGhvYyBzdG9wXG4iKTsKLQkJCXJldCA9IGxpYmVydGFzX2RvX2FkaG9jc3RvcF9pb2N0bChwcml2KTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTlJBRElPT046Ci0JCQl3bGFuX3JhZGlvX2lvY3RsKHByaXYsIDEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOUkFESU9PRkY6Ci0JCQl3bGFuX3JhZGlvX2lvY3RsKHByaXYsIDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTldMQU5JRExFT046Ci0JCQlsaWJlcnRhc19pZGxlX29uKHByaXYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTldMQU5JRExFT0ZGOgotCQkJbGliZXJ0YXNfaWRsZV9vZmYocHJpdik7Ci0JCQlicmVhazsKIAkJY2FzZSBXTEFOX1NVQkNNRF9CVF9SRVNFVDoJLyogYnRfcmVzZXQgKi8KIAkJCXdsYW5fYnRfcmVzZXRfaW9jdGwocHJpdik7CiAJCQlicmVhazsKQEAgLTE5MzcsMTYyICs4MzAsMTkgQEAKIAkJfQkJLyogRW5kIG9mIHN3aXRjaCAqLwogCQlicmVhazsKIAotCWNhc2UgV0xBTlNFVFdQQUlFOgotCQlyZXQgPSB3bGFuX3NldHdwYWllX2lvY3RsKHByaXYsIHJlcSk7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9TRVRJTlRfR0VUSU5UOgotCQkvKiBUaGUgZmlyc3QgNCBieXRlcyBvZiByZXEtPmlmcl9kYXRhIGlzIHN1Yi1pb2N0bCBudW1iZXIKLQkJICogYWZ0ZXIgNCBieXRlcyBzaXRzIHRoZSBwYXlsb2FkLgotCQkgKi8KLQkJc3ViY21kID0gKGludClyZXEtPmlmcl9kYXRhOwkvL2Zyb20gaXdwcml2IHN1YmNtZAotCQlzd2l0Y2ggKHN1YmNtZCkgewotCQljYXNlIFdMQU5ORjoKLQkJCXJldCA9IHdsYW5fZ2V0X25mKHByaXYsIHdycSk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOUlNTSToKLQkJCXJldCA9IHdsYW5fZ2V0X3Jzc2kocHJpdiwgd3JxKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5FTkFCTEUxMUQ6Ci0JCQlyZXQgPSBsaWJlcnRhc19jbWRfZW5hYmxlXzExZChwcml2LCB3cnEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTkFESE9DR1JBVEU6Ci0JCQlyZXQgPSB3bGFuX2RvX3NldF9ncmF0ZV9pb2N0bChwcml2LCB3cnEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9TVUJDTURfU0VUX1BSRVNDQU46Ci0JCQlyZXQgPSB3bGFuX3N1YmNtZF9zZXRwcmVzY2FuX2lvY3RsKHByaXYsIHdycSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgV0xBTl9TRVRPTkVJTlRfR0VUT05FSU5UOgotCQlzd2l0Y2ggKHdycS0+dS5kYXRhLmZsYWdzKSB7Ci0JCWNhc2UgV0xBTl9CRUFDT05fSU5URVJWQUw6Ci0JCQlyZXQgPSB3bGFuX2JlYWNvbl9pbnRlcnZhbChwcml2LCB3cnEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX0xJU1RFTklOVFJWTDoKLQkJCWlmICghd3JxLT51LmRhdGEubGVuZ3RoKSB7Ci0JCQkJaW50IGRhdGE7Ci0JCQkJbGJzX3ByX2RlYnVnKDEsICJHZXQgbG9jYWxsaXN0ZW5pbnRlcnZhbCB2YWx1ZVxuIik7Ci0jZGVmaW5lIEdFVF9PTkVfSU5UCTEKLQkJCQlkYXRhID0gYWRhcHRlci0+bG9jYWxsaXN0ZW5pbnRlcnZhbDsKLQkJCQlpZiAoY29weV90b191c2VyKHdycS0+dS5kYXRhLnBvaW50ZXIsCi0JCQkJCQkgJmRhdGEsIHNpemVvZihpbnQpKSkgewotCQkJCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0KLQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSBHRVRfT05FX0lOVDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGRhdGE7Ci0JCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkJICAgICgmZGF0YSwgd3JxLT51LmRhdGEucG9pbnRlciwgc2l6ZW9mKGludCkpKSB7Ci0JCQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCi0JCQkJbGJzX3ByX2RlYnVnKDEsICJTZXQgbG9jYWxsaXN0ZW5pbnRlcnZhbCA9ICVkXG4iLAotCQkJCSAgICAgICBkYXRhKTsKLSNkZWZpbmUgTUFYX1UxNl9WQUwJNjU1MzUKLQkJCQlpZiAoZGF0YSA+IE1BWF9VMTZfVkFMKSB7Ci0JCQkJCWxic19wcl9kZWJ1ZygxLCAiRXhjZWVkcyBVMTYgdmFsdWVcbiIpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQkJYWRhcHRlci0+bG9jYWxsaXN0ZW5pbnRlcnZhbCA9IGRhdGE7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX1RYQ09OVFJPTDoKLQkJCXJldCA9IHdsYW5fdHhjb250cm9sKHByaXYsIHdycSk7CS8vYWRkcyBmb3IgdHhjb250cm9sIGlvY3RsCi0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fTlVMTFBLVElOVEVSVkFMOgotCQkJcmV0ID0gd2xhbl9udWxsX3BrdF9pbnRlcnZhbChwcml2LCB3cnEpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldCA9IC1FT1BOT1RTVVBQOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KIAljYXNlIFdMQU5fU0VUT05FSU5UX0dFVE5PTkU6CiAJCS8qIFRoZSBmaXJzdCA0IGJ5dGVzIG9mIHJlcS0+aWZyX2RhdGEgaXMgc3ViLWlvY3RsIG51bWJlcgogCQkgKiBhZnRlciA0IGJ5dGVzIHNpdHMgdGhlIHBheWxvYWQuCiAJCSAqLwotCQlzdWJjbWQgPSB3cnEtPnUuZGF0YS5mbGFnczsJLy9mcm9tIHdwYV9zdXBwbGljYW50IHN1YmNtZAotCisJCXN1YmNtZCA9IHdycS0+dS5kYXRhLmZsYWdzOwogCQlpZiAoIXN1YmNtZCkKLQkJCXN1YmNtZCA9IChpbnQpcmVxLT5pZnJfZGF0YTsJLy9mcm9tIGl3cHJpdiBzdWJjbWQKKwkJCXN1YmNtZCA9IChpbnQpd3JxLT51LnBhcmFtLnZhbHVlOwogCiAJCXN3aXRjaCAoc3ViY21kKSB7Ci0JCWNhc2UgV0xBTl9TVUJDTURfU0VUUlhBTlRFTk5BOgkvKiBTRVRSWEFOVEVOTkEgKi8KLQkJCWlkYXRhID0gU1VCQ01EX0RBVEEod3JxKTsKLQkJCXJldCA9IHNldHJ4YW50ZW5uYShwcml2LCBpZGF0YSk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX1NVQkNNRF9TRVRUWEFOVEVOTkE6CS8qIFNFVFRYQU5URU5OQSAqLwotCQkJaWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOwotCQkJcmV0ID0gc2V0dHhhbnRlbm5hKHByaXYsIGlkYXRhKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fU0VUX0FUSU1fV0lORE9XOgotCQkJYWRhcHRlci0+YXRpbXdpbmRvdyA9IFNVQkNNRF9EQVRBKHdycSk7Ci0JCQlhZGFwdGVyLT5hdGltd2luZG93ID0gbWluX3QoX191MTYsIGFkYXB0ZXItPmF0aW13aW5kb3csIDUwKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5TRVRCQ05BVkc6Ci0JCQlhZGFwdGVyLT5iY25fYXZnX2ZhY3RvciA9IFNVQkNNRF9EQVRBKHdycSk7Ci0JCQlpZiAoYWRhcHRlci0+YmNuX2F2Z19mYWN0b3IgPT0gMCkKLQkJCQlhZGFwdGVyLT5iY25fYXZnX2ZhY3RvciA9Ci0JCQkJICAgIERFRkFVTFRfQkNOX0FWR19GQUNUT1I7Ci0JCQlpZiAoYWRhcHRlci0+YmNuX2F2Z19mYWN0b3IgPiBERUZBVUxUX0JDTl9BVkdfRkFDVE9SKQotCQkJCWFkYXB0ZXItPmJjbl9hdmdfZmFjdG9yID0KLQkJCQkgICAgREVGQVVMVF9CQ05fQVZHX0ZBQ1RPUjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5TRVREQVRBQVZHOgotCQkJYWRhcHRlci0+ZGF0YV9hdmdfZmFjdG9yID0gU1VCQ01EX0RBVEEod3JxKTsKLQkJCWlmIChhZGFwdGVyLT5kYXRhX2F2Z19mYWN0b3IgPT0gMCkKLQkJCQlhZGFwdGVyLT5kYXRhX2F2Z19mYWN0b3IgPQotCQkJCSAgICBERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUjsKLQkJCWlmIChhZGFwdGVyLT5kYXRhX2F2Z19mYWN0b3IgPiBERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUikKLQkJCQlhZGFwdGVyLT5kYXRhX2F2Z19mYWN0b3IgPQotCQkJCSAgICBERUZBVUxUX0RBVEFfQVZHX0ZBQ1RPUjsKLQkJCWJyZWFrOwogCQljYXNlIFdMQU5TRVRSRUdJT046CiAJCQlpZGF0YSA9IFNVQkNNRF9EQVRBKHdycSk7CiAJCQlyZXQgPSB3bGFuX3NldF9yZWdpb24ocHJpdiwgKHUxNikgaWRhdGEpOwogCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX1NFVF9MSVNURU5fSU5URVJWQUw6Ci0JCQlpZGF0YSA9IFNVQkNNRF9EQVRBKHdycSk7Ci0JCQlhZGFwdGVyLT5saXN0ZW5pbnRlcnZhbCA9ICh1MTYpIGlkYXRhOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX1NFVF9NVUxUSVBMRV9EVElNOgotCQkJcmV0ID0gd2xhbl9zZXRfbXVsdGlwbGVfZHRpbV9pb2N0bChwcml2LCByZXEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOU0VUQVVUSEFMRzoKLQkJCXJldCA9IHdsYW5fc2V0YXV0aGFsZ19pb2N0bChwcml2LCByZXEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOU0VUODAyMVhBVVRIQUxHOgotCQkJcmV0ID0gd2xhbl9zZXQ4MDIxeGF1dGhhbGdfaW9jdGwocHJpdiwgcmVxKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTlNFVEVOQ1JZUFRJT05NT0RFOgotCQkJcmV0ID0gd2xhbl9zZXRlbmNyeXB0aW9ubW9kZV9pb2N0bChwcml2LCByZXEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX1NFVF9MSU5LTU9ERToKLQkJCXJldCA9IHdsYW5fc2V0X2xpbmttb2RlX2lvY3RsKHByaXYsIHJlcSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fU0VUX1JBRElPTU9ERToKLQkJCXJldCA9IHdsYW5fc2V0X3JhZGlvbW9kZV9pb2N0bChwcml2LCByZXEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX1NFVF9ERUJVR01PREU6Ci0JCQlyZXQgPSB3bGFuX3NldF9kZWJ1Z21vZGVfaW9jdGwocHJpdiwgcmVxKTsKLQkJCWJyZWFrOwotCiAJCWNhc2UgV0xBTl9TVUJDTURfTUVTSF9TRVRfVFRMOgogCQkJaWRhdGEgPSBTVUJDTURfREFUQSh3cnEpOwogCQkJcmV0ID0gd2xhbl9tZXNoX3NldF90dGxfaW9jdGwocHJpdiwgaWRhdGEpOwpAQCAtMjEwNSwzOCArODU1LDggQEAKIAogCQlicmVhazsKIAotCWNhc2UgV0xBTl9TRVROT05FX0dFVFRXRUxWRV9DSEFSOgkvKiBHZXQgQW50ZW5uYSBzZXR0aW5ncyAqLwotCQkvKgotCQkgKiBXZSd2ZSBub3QgdXNlZCBJV19QUklWX1RZUEVfRklYRUQgc28gc3ViLWlvY3RsIG51bWJlciBpcwotCQkgKiBpbiBmbGFncyBvZiBpd3JlcSBzdHJ1Y3R1cmUsIG90aGVyd2lzZSBpdCB3aWxsIGJlIGluCi0JCSAqIG1vZGUgbWVtYmVyIG9mIGl3cmVxIHN0cnVjdHVyZS4KLQkJICovCi0JCXN3aXRjaCAoKGludCl3cnEtPnUuZGF0YS5mbGFncykgewotCQljYXNlIFdMQU5fU1VCQ01EX0dFVFJYQU5URU5OQToJLyogR2V0IFJ4IEFudGVubmEgKi8KLQkJCXJldCA9IHdsYW5fc3ViY21kX2dldHJ4YW50ZW5uYV9pb2N0bChwcml2LCByZXEpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX1NVQkNNRF9HRVRUWEFOVEVOTkE6CS8qIEdldCBUeCBBbnRlbm5hICovCi0JCQlyZXQgPSB3bGFuX3N1YmNtZF9nZXR0eGFudGVubmFfaW9jdGwocHJpdiwgcmVxKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9HRVRfVFNGOgotCQkJcmV0ID0gd2xhbl9nZXRfdHNmX2lvY3RsKHByaXYsIHdycSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQogCWNhc2UgV0xBTl9TRVQxMjhDSEFSX0dFVDEyOENIQVI6CiAJCXN3aXRjaCAoKGludCl3cnEtPnUuZGF0YS5mbGFncykgewotCi0JCWNhc2UgV0xBTlNDQU5fTU9ERToKLQkJCWxic19wcl9kZWJ1ZygxLCAiU2NhbiBtb2RlIElvY3RsXG4iKTsKLQkJCXJldCA9IHdsYW5fc2Nhbl9tb2RlX2lvY3RsKHByaXYsIHdycSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fR0VUX0FESE9DX1NUQVRVUzoKLQkJCXJldCA9IHdsYW5fZ2V0X2FkaG9jX3N0YXR1c19pb2N0bChwcml2LCB3cnEpOwotCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9TVUJDTURfQlRfQUREOgogCQkJcmV0ID0gd2xhbl9idF9hZGRfaW9jdGwocHJpdiwgcmVxKTsKIAkJCWJyZWFrOwpAQCAtMjE2OCw0MSArODg4LDExIEBACiAJCWJyZWFrOwogCiAJY2FzZSBXTEFOX1NFVE5PTkVfR0VUT05FSU5UOgotCQlzd2l0Y2ggKChpbnQpcmVxLT5pZnJfZGF0YSkgewotCQljYXNlIFdMQU5HRVRCQ05BVkc6Ci0JCQlwZGF0YSA9IChpbnQgKil3cnEtPnUubmFtZTsKLQkJCSpwZGF0YSA9IChpbnQpYWRhcHRlci0+YmNuX2F2Z19mYWN0b3I7Ci0JCQlicmVhazsKLQorCQlzd2l0Y2ggKHdycS0+dS5wYXJhbS52YWx1ZSkgewogCQljYXNlIFdMQU5HRVRSRUdJT046CiAJCQlwZGF0YSA9IChpbnQgKil3cnEtPnUubmFtZTsKIAkJCSpwZGF0YSA9IChpbnQpYWRhcHRlci0+cmVnaW9uY29kZTsKIAkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9HRVRfTElTVEVOX0lOVEVSVkFMOgotCQkJcGRhdGEgPSAoaW50ICopd3JxLT51Lm5hbWU7Ci0JCQkqcGRhdGEgPSAoaW50KWFkYXB0ZXItPmxpc3RlbmludGVydmFsOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX0dFVF9MSU5LTU9ERToKLQkJCXJlcS0+aWZyX2RhdGEgPSAoY2hhciAqKSgodTMyKSBhZGFwdGVyLT5saW5rbW9kZSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fR0VUX1JBRElPTU9ERToKLQkJCXJlcS0+aWZyX2RhdGEgPSAoY2hhciAqKSgodTMyKSBhZGFwdGVyLT5yYWRpb21vZGUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX0dFVF9ERUJVR01PREU6Ci0JCQlyZXEtPmlmcl9kYXRhID0gKGNoYXIgKikoKHUzMikgYWRhcHRlci0+ZGVidWdtb2RlKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9HRVRfTVVMVElQTEVfRFRJTToKLQkJCXBkYXRhID0gKGludCAqKXdycS0+dS5uYW1lOwotCQkJKnBkYXRhID0gKGludClhZGFwdGVyLT5tdWx0aXBsZWR0aW07Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0dFVF9UWF9SQVRFOgotCQkJcmV0ID0gd2xhbl9nZXRfdHhyYXRlX2lvY3RsKHByaXYsIHJlcSk7Ci0JCQlicmVhazsKIAkJY2FzZSBXTEFOX1NVQkNNRF9GV1RfQ0xFQU5VUDoJLyogZnd0X2NsZWFudXAgKi8KIAkJCXJldCA9IHdsYW5fZnd0X2NsZWFudXBfaW9jdGwocHJpdiwgcmVxKTsKIAkJCWJyZWFrOwpAQCAtMjIyMiwxOTYgKzkxMiw4IEBACiAKIAkJYnJlYWs7CiAKLQljYXNlIFdMQU5HRVRMT0c6Ci0JCXJldCA9IHdsYW5fZG9fZ2V0bG9nX2lvY3RsKHByaXYsIHdycSk7Ci0JCWJyZWFrOwotCiAJY2FzZSBXTEFOX1NFVF9HRVRfU0lYVEVFTl9JTlQ6CiAJCXN3aXRjaCAoKGludCl3cnEtPnUuZGF0YS5mbGFncykgewotCQljYXNlIFdMQU5fVFBDQ0ZHOgotCQkJewotCQkJCWludCBkYXRhWzVdOwotCQkJCXN0cnVjdCBjbWRfZHNfODAyXzExX3RwY19jZmcgY2ZnOwotCQkJCW1lbXNldCgmY2ZnLCAwLCBzaXplb2YoY2ZnKSk7Ci0JCQkJaWYgKCh3cnEtPnUuZGF0YS5sZW5ndGggPiAxKQotCQkJCSAgICAmJiAod3JxLT51LmRhdGEubGVuZ3RoICE9IDUpKQotCQkJCQlyZXR1cm4gLTE7Ci0KLQkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKLQkJCQkJY2ZnLmFjdGlvbiA9Ci0JCQkJCSAgICBjcHVfdG9fbGUxNgotCQkJCQkgICAgKGNtZF9hY3RfZ2V0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCQkJICAgIChkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLAotCQkJCQkgICAgIHNpemVvZihpbnQpICogNSkpIHsKLQkJCQkJCWxic19wcl9kZWJ1ZygxLAotCQkJCQkJICAgICAgICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOwotCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCX0KLQotCQkJCQljZmcuYWN0aW9uID0KLQkJCQkJICAgIGNwdV90b19sZTE2Ci0JCQkJCSAgICAoY21kX2FjdF9zZXQpOwotCQkJCQljZmcuZW5hYmxlID0gZGF0YVswXTsKLQkJCQkJY2ZnLnVzZXNuciA9IGRhdGFbMV07Ci0JCQkJCWNmZy5QMCA9IGRhdGFbMl07Ci0JCQkJCWNmZy5QMSA9IGRhdGFbM107Ci0JCQkJCWNmZy5QMiA9IGRhdGFbNF07Ci0JCQkJfQotCi0JCQkJcmV0ID0KLQkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJCQkJICBjbWRfODAyXzExX3RwY19jZmcsCi0JCQkJCQkJICAwLAotCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAotCQkJCQkJCSAgMCwgKHZvaWQgKikmY2ZnKTsKLQotCQkJCWRhdGFbMF0gPSBjZmcuZW5hYmxlOwotCQkJCWRhdGFbMV0gPSBjZmcudXNlc25yOwotCQkJCWRhdGFbMl0gPSBjZmcuUDA7Ci0JCQkJZGF0YVszXSA9IGNmZy5QMTsKLQkJCQlkYXRhWzRdID0gY2ZnLlAyOwotCQkJCWlmIChjb3B5X3RvX3VzZXIKLQkJCQkgICAgKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsCi0JCQkJICAgICBzaXplb2YoaW50KSAqIDUpKSB7Ci0JCQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDU7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fUE9XRVJDRkc6Ci0JCQl7Ci0JCQkJaW50IGRhdGFbNF07Ci0JCQkJc3RydWN0IGNtZF9kc184MDJfMTFfcHdyX2NmZyBjZmc7Ci0JCQkJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKLQkJCQlpZiAoKHdycS0+dS5kYXRhLmxlbmd0aCA+IDEpCi0JCQkJICAgICYmICh3cnEtPnUuZGF0YS5sZW5ndGggIT0gNCkpCi0JCQkJCXJldHVybiAtMTsKLQkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoID09IDApIHsKLQkJCQkJY2ZnLmFjdGlvbiA9Ci0JCQkJCSAgICBjcHVfdG9fbGUxNgotCQkJCQkgICAgKGNtZF9hY3RfZ2V0KTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCQkJICAgIChkYXRhLCB3cnEtPnUuZGF0YS5wb2ludGVyLAotCQkJCQkgICAgIHNpemVvZihpbnQpICogNCkpIHsKLQkJCQkJCWxic19wcl9kZWJ1ZygxLAotCQkJCQkJICAgICAgICJDb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOwotCQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJCX0KLQotCQkJCQljZmcuYWN0aW9uID0KLQkJCQkJICAgIGNwdV90b19sZTE2Ci0JCQkJCSAgICAoY21kX2FjdF9zZXQpOwotCQkJCQljZmcuZW5hYmxlID0gZGF0YVswXTsKLQkJCQkJY2ZnLlBBX1AwID0gZGF0YVsxXTsKLQkJCQkJY2ZnLlBBX1AxID0gZGF0YVsyXTsKLQkJCQkJY2ZnLlBBX1AyID0gZGF0YVszXTsKLQkJCQl9Ci0JCQkJcmV0ID0KLQkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJCQkJICBjbWRfODAyXzExX3B3cl9jZmcsCi0JCQkJCQkJICAwLAotCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAotCQkJCQkJCSAgMCwgKHZvaWQgKikmY2ZnKTsKLQkJCQlkYXRhWzBdID0gY2ZnLmVuYWJsZTsKLQkJCQlkYXRhWzFdID0gY2ZnLlBBX1AwOwotCQkJCWRhdGFbMl0gPSBjZmcuUEFfUDE7Ci0JCQkJZGF0YVszXSA9IGNmZy5QQV9QMjsKLQkJCQlpZiAoY29weV90b191c2VyCi0JCQkJICAgICh3cnEtPnUuZGF0YS5wb2ludGVyLCBkYXRhLAotCQkJCSAgICAgc2l6ZW9mKGludCkgKiA0KSkgewotCQkJCQlsYnNfcHJfZGVidWcoMSwgIkNvcHkgdG8gdXNlciBmYWlsZWRcbiIpOwotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCQl9Ci0KLQkJCQl3cnEtPnUuZGF0YS5sZW5ndGggPSA0OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9BVVRPX0ZSRVFfU0VUOgotCQkJewotCQkJCWludCBkYXRhWzNdOwotCQkJCXN0cnVjdCBjbWRfZHNfODAyXzExX2FmYyBhZmM7Ci0JCQkJbWVtc2V0KCZhZmMsIDAsIHNpemVvZihhZmMpKTsKLQkJCQlpZiAod3JxLT51LmRhdGEubGVuZ3RoICE9IDMpCi0JCQkJCXJldHVybiAtMTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIKLQkJCQkgICAgKGRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsCi0JCQkJICAgICBzaXplb2YoaW50KSAqIDMpKSB7Ci0JCQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJfQotCQkJCWFmYy5hZmNfYXV0byA9IGRhdGFbMF07Ci0KLQkJCQlpZiAoYWZjLmFmY19hdXRvICE9IDApIHsKLQkJCQkJYWZjLnRocmVzaG9sZCA9IGRhdGFbMV07Ci0JCQkJCWFmYy5wZXJpb2QgPSBkYXRhWzJdOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFmYy50aW1pbmdfb2Zmc2V0ID0gZGF0YVsxXTsKLQkJCQkJYWZjLmNhcnJpZXJfb2Zmc2V0ID0gZGF0YVsyXTsKLQkJCQl9Ci0JCQkJcmV0ID0KLQkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJCQkJICBjbWRfODAyXzExX3NldF9hZmMsCi0JCQkJCQkJICAwLAotCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAotCQkJCQkJCSAgMCwgKHZvaWQgKikmYWZjKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fQVVUT19GUkVRX0dFVDoKLQkJCXsKLQkJCQlpbnQgZGF0YVszXTsKLQkJCQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hZmMgYWZjOwotCQkJCW1lbXNldCgmYWZjLCAwLCBzaXplb2YoYWZjKSk7Ci0JCQkJcmV0ID0KLQkJCQkgICAgbGliZXJ0YXNfcHJlcGFyZV9hbmRfc2VuZF9jb21tYW5kKHByaXYsCi0JCQkJCQkJICBjbWRfODAyXzExX2dldF9hZmMsCi0JCQkJCQkJICAwLAotCQkJCQkJCSAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAotCQkJCQkJCSAgMCwgKHZvaWQgKikmYWZjKTsKLQkJCQlkYXRhWzBdID0gYWZjLmFmY19hdXRvOwotCQkJCWRhdGFbMV0gPSBhZmMudGltaW5nX29mZnNldDsKLQkJCQlkYXRhWzJdID0gYWZjLmNhcnJpZXJfb2Zmc2V0OwotCQkJCWlmIChjb3B5X3RvX3VzZXIKLQkJCQkgICAgKHdycS0+dS5kYXRhLnBvaW50ZXIsIGRhdGEsCi0JCQkJICAgICBzaXplb2YoaW50KSAqIDMpKSB7Ci0JCQkJCWxic19wcl9kZWJ1ZygxLCAiQ29weSB0byB1c2VyIGZhaWxlZFxuIik7Ci0JCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDM7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX1NDQU5QUk9CRVM6Ci0JCQl7Ci0JCQkJaW50IGRhdGE7Ci0JCQkJaWYgKHdycS0+dS5kYXRhLmxlbmd0aCA+IDApIHsKLQkJCQkJaWYgKGNvcHlfZnJvbV91c2VyCi0JCQkJCSAgICAoJmRhdGEsIHdycS0+dS5kYXRhLnBvaW50ZXIsCi0JCQkJCSAgICAgc2l6ZW9mKGludCkpKSB7Ci0JCQkJCQlsYnNfcHJfZGVidWcoMSwKLQkJCQkJCSAgICAgICAiQ29weSBmcm9tIHVzZXIgZmFpbGVkXG4iKTsKLQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQl9Ci0KLQkJCQkJYWRhcHRlci0+c2NhbnByb2JlcyA9IGRhdGE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZGF0YSA9IGFkYXB0ZXItPnNjYW5wcm9iZXM7Ci0JCQkJCWlmIChjb3B5X3RvX3VzZXIKLQkJCQkJICAgICh3cnEtPnUuZGF0YS5wb2ludGVyLCAmZGF0YSwKLQkJCQkJICAgICBzaXplb2YoaW50KSkpIHsKLQkJCQkJCWxic19wcl9kZWJ1ZygxLAotCQkJCQkJICAgICAgICJDb3B5IHRvIHVzZXIgZmFpbGVkXG4iKTsKLQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCQl9Ci0JCQkJfQotCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IDE7Ci0JCQl9Ci0JCQlicmVhazsKIAkJY2FzZSBXTEFOX0xFRF9HUElPX0NUUkw6CiAJCQl7CiAJCQkJaW50IGk7CkBAIC0yNDc1LDE3ICs5NzcsNiBAQAogCQkJCXdycS0+dS5kYXRhLmxlbmd0aCA9IGdwaW8tPmhlYWRlci5sZW47CiAJCQl9CiAJCQlicmVhazsKLQkJY2FzZSBXTEFOX0FEQVBUX1JBVEVTRVQ6Ci0JCQlyZXQgPSB3bGFuX2FkYXB0X3JhdGVzZXQocHJpdiwgd3JxKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fSU5BQ1RJVklUWV9USU1FT1VUOgotCQkJcmV0ID0gd2xhbl9pbmFjdGl2aXR5X3RpbWVvdXQocHJpdiwgd3JxKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5TTlI6Ci0JCQlyZXQgPSB3bGFuX2dldF9zbnIocHJpdiwgd3JxKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fR0VUX1JYSU5GTzoKLQkJCXJldCA9IHdsYW5fZ2V0X3J4aW5mbyhwcml2LCB3cnEpOwogCQl9CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9qb2luLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9qb2luLmMKaW5kZXggMTE2ODJjYi4uZDQ5MjZiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvam9pbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2pvaW4uYwpAQCAtMTUsNiArMTUsOCBAQAogI2luY2x1ZGUgImpvaW4uaCIKICNpbmNsdWRlICJkZXYuaCIKIAorI2RlZmluZSBBRF9IT0NfQ0FQX1BSSVZBQ1lfT04gMQorCiAvKioKICAqICBAYnJpZWYgVGhpcyBmdW5jdGlvbiBmaW5kcyBvdXQgdGhlIGNvbW1vbiByYXRlcyBiZXR3ZWVuIHJhdGUxIGFuZCByYXRlMi4KICAqCkBAIC04NSw3ICs4Nyw3IEBACiAJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChhZGFwdGVyLT5pbmZyYW1vZGUgPT0gd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlICYmCisJaWYgKGFkYXB0ZXItPm1vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJgogCSAgICBhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpCiAJCXJldCA9IGxpYmVydGFzX3NlbmRfZGVhdXRoZW50aWNhdGlvbihwcml2KTsKIAllbHNlCkBAIC05NCwyMCArOTYsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBsaWJlcnRhc19kb19hZGhvY3N0b3BfaW9jdGwod2xhbl9wcml2YXRlICogcHJpdikKLXsKLQl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwotCWludCByZXQgPSAwOwotCi0JaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcyAmJgotCSAgICBhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpCi0JCXJldCA9IGxpYmVydGFzX3N0b3BfYWRob2NfbmV0d29yayhwcml2KTsKLQllbHNlCi0JCXJldCA9IC1FTk9UU1VQUDsKLQotCXJldHVybiByZXQ7Ci19Ci0KIC8qKgogICogIEBicmllZiBBc3NvY2lhdGUgdG8gYSBzcGVjaWZpYyBCU1MgZGlzY292ZXJlZCBpbiBhIHNjYW4KICAqCkBAIC0yMDcsOCArMTk1LDcgQEAKIAkvKiBjaGVjayBpZiB0aGUgcmVxdWVzdGVkIFNTSUQgaXMgYWxyZWFkeSBqb2luZWQgKi8KIAlpZiAoYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQuc3NpZGxlbmd0aAogCSAgICAmJiAhbGliZXJ0YXNfU1NJRF9jbXAoJnBic3NkZXNjLT5zc2lkLCAmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQpCi0JICAgICYmIChhZGFwdGVyLT5jdXJic3NwYXJhbXMuYnNzZGVzY3JpcHRvci5pbmZyYW1vZGUgPT0KLQkJd2xhbjgwMl8xMWlic3MpKSB7CisJICAgICYmIChhZGFwdGVyLT5tb2RlID09IElXX01PREVfQURIT0MpKSB7CiAKICAgICAgICAgbGJzX3ByX2RlYnVnKDEsCiAJCSAgICAgICAiQURIT0NfSl9DTUQ6IE5ldyBhZC1ob2MgU1NJRCBpcyB0aGUgc2FtZSBhcyBjdXJyZW50LCAiCkBAIC0yNjEsMTMwICsyNDgsNiBAQAogfQogCiAvKioKLSAqICBAYnJpZWYgU2V0IElkbGUgT2ZmCi0gKgotICogIEBwYXJhbSBwcml2ICAgICAgICAgQSBwb2ludGVyIHRvIHdsYW5fcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqICBAcmV0dXJuICAgICAgICAgICAgIDAgLS1zdWNjZXNzLCBvdGhlcndpc2UgZmFpbAotICovCi1pbnQgbGliZXJ0YXNfaWRsZV9vZmYod2xhbl9wcml2YXRlICogcHJpdikKLXsKLQl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwotCWludCByZXQgPSAwOwotCWNvbnN0IHU4IHplcm9tYWNbXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwotCWludCBpOwotCi0JRU5URVIoKTsKLQotCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19kaXNjb25uZWN0ZWQpIHsKLQkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKLQkJCWlmIChtZW1jbXAoYWRhcHRlci0+cHJldmlvdXNic3NpZCwgemVyb21hYywKLQkJCQkgICBzaXplb2YoemVyb21hYykpICE9IDApIHsKLQotCQkJCWxic19wcl9kZWJ1ZygxLCAiUHJldmlvdXMgU1NJRCA9ICVzXG4iLAotCQkJCSAgICAgICBhZGFwdGVyLT5wcmV2aW91c3NzaWQuc3NpZCk7Ci0JCQkJbGJzX3ByX2RlYnVnKDEsICJQcmV2aW91cyBCU1NJRCA9ICIKLQkJCQkgICAgICAgIiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OlxuIiwKLQkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFswXSwKLQkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFsxXSwKLQkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFsyXSwKLQkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFszXSwKLQkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFs0XSwKLQkJCQkgICAgICAgYWRhcHRlci0+cHJldmlvdXNic3NpZFs1XSk7Ci0KLQkJCQlpID0gbGliZXJ0YXNfZmluZF9TU0lEX2luX2xpc3QoYWRhcHRlciwKLQkJCQkJCSAgICZhZGFwdGVyLT5wcmV2aW91c3NzaWQsCi0JCQkJCQkgICBhZGFwdGVyLT5wcmV2aW91c2Jzc2lkLAotCQkJCQkJICAgYWRhcHRlci0+aW5mcmFtb2RlKTsKLQotCQkJCWlmIChpIDwgMCkgewotCQkJCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX0JTU0lEX3NjYW4ocHJpdiwKLQkJCQkJCQkgICAgICBhZGFwdGVyLT4KLQkJCQkJCQkgICAgICBwcmV2aW91c2Jzc2lkLAotCQkJCQkJCSAgICAgIDEpOwotCQkJCQlpID0gbGliZXJ0YXNfZmluZF9TU0lEX2luX2xpc3QoYWRhcHRlciwKLQkJCQkJCQkgICAmYWRhcHRlci0+Ci0JCQkJCQkJICAgcHJldmlvdXNzc2lkLAotCQkJCQkJCSAgIGFkYXB0ZXItPgotCQkJCQkJCSAgIHByZXZpb3VzYnNzaWQsCi0JCQkJCQkJICAgYWRhcHRlci0+Ci0JCQkJCQkJICAgaW5mcmFtb2RlKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaSA8IDApIHsKLQkJCQkJLyogSWYgdGhlIEJTU0lEIGNvdWxkIG5vdCBiZSBmb3VuZCwgdHJ5IGp1c3QgdGhlIFNTSUQgKi8KLQkJCQkJaSA9IGxpYmVydGFzX2ZpbmRfU1NJRF9pbl9saXN0KGFkYXB0ZXIsCi0JCQkJCQkJICAgJmFkYXB0ZXItPgotCQkJCQkJCSAgIHByZXZpb3Vzc3NpZCwgTlVMTCwKLQkJCQkJCQkgICBhZGFwdGVyLT4KLQkJCQkJCQkgICBpbmZyYW1vZGUpOwotCQkJCX0KLQotCQkJCWlmIChpIDwgMCkgewotCQkJCQlsaWJlcnRhc19zZW5kX3NwZWNpZmljX1NTSURfc2Nhbihwcml2LAotCQkJCQkJCSAgICAgJmFkYXB0ZXItPgotCQkJCQkJCSAgICAgcHJldmlvdXNzc2lkLAotCQkJCQkJCSAgICAgMSk7Ci0JCQkJCWkgPSBsaWJlcnRhc19maW5kX1NTSURfaW5fbGlzdChhZGFwdGVyLAotCQkJCQkJCSAgICZhZGFwdGVyLT4KLQkJCQkJCQkgICBwcmV2aW91c3NzaWQsIE5VTEwsCi0JCQkJCQkJICAgYWRhcHRlci0+Ci0JCQkJCQkJICAgaW5mcmFtb2RlKTsKLQkJCQl9Ci0KLQkJCQlpZiAoaSA+PSAwKSB7Ci0JCQkJCXJldCA9Ci0JCQkJCSAgICB3bGFuX2Fzc29jaWF0ZShwcml2LAotCQkJCQkJCSAgICZhZGFwdGVyLT4KLQkJCQkJCQkgICBzY2FudGFibGVbaV0pOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChhZGFwdGVyLT5pbmZyYW1vZGUgPT0gd2xhbjgwMl8xMWlic3MpIHsKLQkJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAotCQkJCQkJICAgIGNtZF84MDJfMTFfYWRfaG9jX3N0YXJ0LAotCQkJCQkJICAgIDAsCi0JCQkJCQkgICAgY21kX29wdGlvbl93YWl0Zm9ycnNwLAotCQkJCQkJICAgIDAsICZhZGFwdGVyLT5wcmV2aW91c3NzaWQpOwotCQl9Ci0JfQotCS8qIGVsc2UgaXQgaXMgY29ubmVjdGVkICovCi0KLQlsYnNfcHJfZGVidWcoMSwgIlxud2xhbmlkbGUgaXMgb2ZmIik7Ci0JTEVBVkUoKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqICBAYnJpZWYgU2V0IElkbGUgT24KLSAqCi0gKiAgQHBhcmFtIHByaXYgICAgICAgICBBIHBvaW50ZXIgdG8gd2xhbl9wcml2YXRlIHN0cnVjdHVyZQotICogIEByZXR1cm4gICAgICAgICAgICAgMCAtLXN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsCi0gKi8KLWludCBsaWJlcnRhc19pZGxlX29uKHdsYW5fcHJpdmF0ZSAqIHByaXYpCi17Ci0Jd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyA9PSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKLQkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKLQkJCWxic19wcl9kZWJ1ZygxLCAiUHJldmlvdXMgU1NJRCA9ICVzXG4iLAotCQkJICAgICAgIGFkYXB0ZXItPnByZXZpb3Vzc3NpZC5zc2lkKTsKLQkJCW1lbW1vdmUoJmFkYXB0ZXItPnByZXZpb3Vzc3NpZCwKLQkJCQkmYWRhcHRlci0+Y3VyYnNzcGFyYW1zLnNzaWQsCi0JCQkJc2l6ZW9mKHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEKSk7Ci0JCQlsaWJlcnRhc19zZW5kX2RlYXV0aChwcml2KTsKLQotCQl9IGVsc2UgaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgewotCQkJcmV0ID0gbGliZXJ0YXNfc3RvcF9hZGhvY19uZXR3b3JrKHByaXYpOwotCQl9Ci0KLQl9Ci0KLQlsYnNfcHJfZGVidWcoMSwgIlxud2xhbmlkbGUgaXMgb24iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgogICogIEBicmllZiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGNvbW1hbmQgb2YgYXV0aGVudGljYXRlLgogICoKICAqICBAcGFyYW0gcHJpdiAgICAgIEEgcG9pbnRlciB0byB3bGFuX3ByaXZhdGUgc3RydWN0dXJlCkBAIC0zOTgsMjIgKzI2MSwzOSBAQAogCQkJCSB2b2lkICpwZGF0YV9idWYpCiB7CiAJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKLQlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hdXRoZW50aWNhdGUgKnBhdXRoZW50aWNhdGUgPQotCSAgICAmY21kLT5wYXJhbXMuYXV0aDsKKwlzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hdXRoZW50aWNhdGUgKnBhdXRoZW50aWNhdGUgPSAmY21kLT5wYXJhbXMuYXV0aDsKKwlpbnQgcmV0ID0gLTE7CiAJdTggKmJzc2lkID0gcGRhdGFfYnVmOwogCiAJY21kLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoY21kXzgwMl8xMV9hdXRoZW50aWNhdGUpOwotCWNtZC0+c2l6ZSA9Ci0JICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hdXRoZW50aWNhdGUpCi0JCQkgICAgICsgU19EU19HRU4pOworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgY21kX2RzXzgwMl8xMV9hdXRoZW50aWNhdGUpCisJICAgICAgICAgICAgICAgICAgICAgICAgKyBTX0RTX0dFTik7CiAKLQlwYXV0aGVudGljYXRlLT5hdXRodHlwZSA9IGFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGU7CisJLyogdHJhbnNsYXRlIGF1dGggbW9kZSB0byA4MDIuMTEgZGVmaW5lZCB3aXJlIHZhbHVlICovCisJc3dpdGNoIChhZGFwdGVyLT5zZWNpbmZvLmF1dGhfbW9kZSkgeworCWNhc2UgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU06CisJCXBhdXRoZW50aWNhdGUtPmF1dGh0eXBlID0gMHgwMDsKKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0FMR19TSEFSRURfS0VZOgorCQlwYXV0aGVudGljYXRlLT5hdXRodHlwZSA9IDB4MDE7CisJCWJyZWFrOworCWNhc2UgSVdfQVVUSF9BTEdfTEVBUDoKKwkJcGF1dGhlbnRpY2F0ZS0+YXV0aHR5cGUgPSAweDgwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsYnNfcHJfZGVidWcoMSwgIkFVVEhfQ01EOiBpbnZhbGlkIGF1dGggYWxnIDB4JVhcbiIsCisJCSAgICAgICAgICAgICBhZGFwdGVyLT5zZWNpbmZvLmF1dGhfbW9kZSk7CisJCWdvdG8gb3V0OworCX0KKwogCW1lbWNweShwYXV0aGVudGljYXRlLT5tYWNhZGRyLCBic3NpZCwgRVRIX0FMRU4pOwogCiAJbGJzX3ByX2RlYnVnKDEsICJBVVRIX0NNRDogQnNzaWQgaXMgOiAleDoleDoleDoleDoleDoleFxuIiwKIAkgICAgICAgYnNzaWRbMF0sIGJzc2lkWzFdLCBic3NpZFsyXSwgYnNzaWRbM10sIGJzc2lkWzRdLCBic3NpZFs1XSk7CisJcmV0ID0gMDsKIAotCXJldHVybiAwOworb3V0OgorCXJldHVybiByZXQ7CiB9CiAKIGludCBsaWJlcnRhc19jbWRfODAyMTFfZGVhdXRoZW50aWNhdGUod2xhbl9wcml2YXRlICogcHJpdiwKQEAgLTU1MCw3ICs0MzAsNyBAQAogCWxic19wcl9kZWJ1ZygxLCAiQVNTT0NfQ01EOiByYXRlcy0+aGVhZGVyLmxlbiA9ICVkXG4iLCByYXRlcy0+aGVhZGVyLmxlbik7CiAKIAkvKiBzZXQgSUJTUyBmaWVsZCAqLwotCWlmIChwYnNzZGVzYy0+aW5mcmFtb2RlID09IHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZSkgeworCWlmIChwYnNzZGVzYy0+bW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CiAjZGVmaW5lIENBUElORk9fRVNTX01PREUgMQogCQlwYXNzby0+Y2FwaW5mby5lc3MgPSBDQVBJTkZPX0VTU19NT0RFOwogCX0KQEAgLTYyNCw3ICs1MDQsNyBAQAogCiAJLyogc2V0IHRoZSBCU1MgdHlwZSAqLwogCWFkaHMtPmJzc3R5cGUgPSBjbWRfYnNzX3R5cGVfaWJzczsKLQlwYnNzZGVzYy0+aW5mcmFtb2RlID0gd2xhbjgwMl8xMWlic3M7CisJcGJzc2Rlc2MtPm1vZGUgPSBJV19NT0RFX0FESE9DOwogCWFkaHMtPmJlYWNvbnBlcmlvZCA9IGFkYXB0ZXItPmJlYWNvbnBlcmlvZDsKIAogCS8qIHNldCBQaHlzaWNhbCBwYXJhbSBzZXQgKi8KQEAgLTY2NiwxNSArNTQ2LDEyIEBACiAJYWRocy0+cHJvYmVkZWxheSA9IGNwdV90b19sZTE2KGNtZF9zY2FuX3Byb2JlX2RlbGF5X3RpbWUpOwogCiAJLyogc2V0IHVwIHByaXZhY3kgaW4gYWRhcHRlci0+c2NhbnRhYmxlW2ldICovCi0JaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBlbmFibGVkKSB7Ci0KLSNkZWZpbmUgQURfSE9DX0NBUF9QUklWQUNZX09OIDEKLQkJbGJzX3ByX2RlYnVnKDEsICJBREhPQ19TX0NNRDogV0VQc3RhdHVzIHNldCwgcHJpdmFjeSB0byBXRVBcbiIpOworCWlmIChhZGFwdGVyLT5zZWNpbmZvLndlcF9lbmFibGVkKSB7CisJCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfU19DTUQ6IFdFUCBlbmFibGVkLCBzZXR0aW5nIHByaXZhY3kgb25cbiIpOwogCQlwYnNzZGVzYy0+cHJpdmFjeSA9IHdsYW44MDJfMTFwcml2ZmlsdGVyODAyMXhXRVA7CiAJCWFkaHMtPmNhcC5wcml2YWN5ID0gQURfSE9DX0NBUF9QUklWQUNZX09OOwogCX0gZWxzZSB7Ci0JCWxic19wcl9kZWJ1ZygxLCAiQURIT0NfU19DTUQ6IFdFUHN0YXR1cyBOT1Qgc2V0LCBTZXR0aW5nICIKLQkJICAgICAgICJwcml2YWN5IHRvIEFDQ0VQVCBBTExcbiIpOworCQlsYnNfcHJfZGVidWcoMSwgIkFESE9DX1NfQ01EOiBXRVAgZGlzYWJsZWQsIHNldHRpbmcgcHJpdmFjeSBvZmZcbiIpOwogCQlwYnNzZGVzYy0+cHJpdmFjeSA9IHdsYW44MDJfMTFwcml2ZmlsdGVyYWNjZXB0YWxsOwogCX0KIApAQCAtNzg2LDkgKzY2Myw2IEBACiAJICAgICAgIHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuQlNTSURbNV0sCiAJICAgICAgIHBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuU1NJRCk7CiAKLQlsYnNfcHJfZGVidWcoMSwgIkFESE9DX0pfQ01EOiBEYXRhIFJhdGUgPSAleFxuIiwKLQkgICAgICAgKHUzMikgcGFkaG9jam9pbi0+YnNzZGVzY3JpcHRvci5kYXRhcmF0ZXMpOwotCiAJLyogZmFpbHRpbWVvdXQgKi8KIAlwYWRob2Nqb2luLT5mYWlsdGltZW91dCA9IGNwdV90b19sZTE2KE1SVkRSVl9BU1NPQ0lBVElPTl9USU1FX09VVCk7CiAKQEAgLTgzMiw3ICs3MDYsNyBAQAogCXBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3Iuc3NwYXJhbXNldC5pYnNzcGFyYW1zZXQuYXRpbXdpbmRvdyA9CiAJICAgIGNwdV90b19sZTE2KHBic3NkZXNjLT5hdGltd2luZG93KTsKIAotCWlmIChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZW5hYmxlZCkgeworCWlmIChhZGFwdGVyLT5zZWNpbmZvLndlcF9lbmFibGVkKSB7CiAJCXBhZGhvY2pvaW4tPmJzc2Rlc2NyaXB0b3IuY2FwLnByaXZhY3kgPSBBRF9IT0NfQ0FQX1BSSVZBQ1lfT047CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9qb2luLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9qb2luLmgKaW5kZXggOGVmYTI0NS4uMTE1ZjVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvam9pbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2pvaW4uaApAQCAtMSw2ICsxLDMgQEAKLS8qIC0qLSBtb2RlOiBDOyB0YWItd2lkdGg6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0gKi8KLS8qIHZpOiBzZXQgZXhwYW5kdGFiIHNoaWZ0d2lkdGg9NCB0YWJzdG9wPTQgdGV4dHdpZHRoPTc4OiAqLwotCiAvKioKICAgKiBJbnRlcmZhY2UgZm9yIHRoZSB3bGFuIGluZnJhc3RydWN0dXJlIGFuZCBhZGhvYyBqb2luIHJvdXRpbmVzCiAgICoKQEAgLTQwLDEwICszNyw2IEBACiBleHRlcm4gaW50IGxpYmVydGFzX3JldF84MDIxMV9hc3NvY2lhdGUod2xhbl9wcml2YXRlICogcHJpdiwKIAkJCQkgICAgIHN0cnVjdCBjbWRfZHNfY29tbWFuZCAqcmVzcCk7CiAKLWV4dGVybiBpbnQgbGliZXJ0YXNfaWRsZV9vbih3bGFuX3ByaXZhdGUgKiBwcml2KTsKLWV4dGVybiBpbnQgbGliZXJ0YXNfaWRsZV9vZmYod2xhbl9wcml2YXRlICogcHJpdik7Ci0KLWV4dGVybiBpbnQgbGliZXJ0YXNfZG9fYWRob2NzdG9wX2lvY3RsKHdsYW5fcHJpdmF0ZSAqIHByaXYpOwogZXh0ZXJuIGludCBsaWJlcnRhc19yZWFzc29jaWF0aW9uX3RocmVhZCh2b2lkICpkYXRhKTsKIAogc3RydWN0IFdMQU5fODAyXzExX1NTSUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKaW5kZXggZGNiZjEwMi4uYjliMjVjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYwpAQCAtMjEsNiArMjEsMTMgQEAKICNpbmNsdWRlICJkZWJ1Z2ZzLmgiCiAjaW5jbHVkZSAiYXNzb2MuaCIKIAorI2RlZmluZSBEUklWRVJfUkVMRUFTRV9WRVJTSU9OICIzMjAucDAiCitjb25zdCBjaGFyIGxpYmVydGFzX2RyaXZlcl92ZXJzaW9uW10gPSAiQ09NTS1VU0I4Mzg4LSIgRFJJVkVSX1JFTEVBU0VfVkVSU0lPTgorI2lmZGVmICBERUJVRworICAgICItZGJnIgorI2VuZGlmCisgICAgIiI7CisKICNpZmRlZiBFTkFCTEVfUE0KIHN0YXRpYyBzdHJ1Y3QgcG1fZGV2ICp3bGFuX3BtX2RldiA9IE5VTEw7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9yeC5jCmluZGV4IDdlM2Y3OGYuLmQxNzkyNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvcnguYwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlsYnNfcHJfZGVidWcoMSwgIlJYIERhdGE6IHNrYi0+bGVuIC0gc2l6ZW9mKFJ4UGQpID0gJWQgLSAlZCA9ICVkXG4iLAorCWxic19wcl9kZWJ1ZygxLCAiUlggRGF0YTogc2tiLT5sZW4gLSBzaXplb2YoUnhQZCkgPSAlZCAtICV6ZCA9ICV6ZFxuIiwKIAkgICAgICAgc2tiLT5sZW4sIHNpemVvZihzdHJ1Y3QgcnhwZCksIHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCByeHBkKSk7CiAKIAlsYnNfZGJnX2hleCgiUlggRGF0YTogRGVzdCIsIHBfcnhfcGt0LT5ldGg4MDNfaGRyLmRlc3RfYWRkciwKQEAgLTM2NCw3ICszNjQsNyBAQAogCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAl9CiAKLQlsYnNfcHJfZGVidWcoMSwgIlJYIERhdGE6IHNrYi0+bGVuIC0gc2l6ZW9mKFJ4UGQpID0gJWQgLSAlZCA9ICVkXG4iLAorCWxic19wcl9kZWJ1ZygxLCAiUlggRGF0YTogc2tiLT5sZW4gLSBzaXplb2YoUnhQZCkgPSAlZCAtICV6ZCA9ICV6ZFxuIiwKIAkgICAgICAgc2tiLT5sZW4sIHNpemVvZihzdHJ1Y3QgcnhwZCksIHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCByeHBkKSk7CiAKIAkvKiBjcmVhdGUgdGhlIGV4cG9ydGVkIHJhZGlvIGhlYWRlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5jCmluZGV4IGUxODcwNjIuLjNjMGIxYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3NjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmMKQEAgLTEsNiArMSwzIEBACi0vKiAtKi0gbW9kZTogQzsgdGFiLXdpZHRoOiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWwgLSotICovCi0vKiB2aTogc2V0IGV4cGFuZHRhYiBzaGlmdHdpZHRoPTQgdGFic3RvcD00IHRleHR3aWR0aD03ODogKi8KLQogLyoqCiAgICogRnVuY3Rpb25zIGltcGxlbWVudGluZyB3bGFuIHNjYW4gSU9DVEwgYW5kIGZpcm13YXJlIGNvbW1hbmQgQVBJcwogICAqCkBAIC04NywxMTggKzg0LDk1IEBACiAgKgogICogIEByZXR1cm4gICAgICAgIEluZGV4IGluIHNjYW50YWJsZSwgb3IgZXJyb3IgY29kZSBpZiBuZWdhdGl2ZQogICovCi1zdGF0aWMgaW50IGlzX25ldHdvcmtfY29tcGF0aWJsZSh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCBpbnQgaW5kZXgsIGludCBtb2RlKQorc3RhdGljIGludCBpc19uZXR3b3JrX2NvbXBhdGlibGUod2xhbl9hZGFwdGVyICogYWRhcHRlciwgaW50IGluZGV4LCB1OCBtb2RlKQogewogCUVOVEVSKCk7CiAKLQlpZiAoYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5pbmZyYW1vZGUgPT0gbW9kZSkgewotCQlpZiAoYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPT0gd2xhbjgwMl8xMVdFUGRpc2FibGVkCisJaWYgKGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ubW9kZSA9PSBtb2RlKSB7CisJCWlmICggICAhYWRhcHRlci0+c2VjaW5mby53ZXBfZW5hYmxlZAogCQkgICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZAogCQkgICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQKLQkJICAgICYmIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ud3BhX3N1cHBsaWNhbnQud3BhX2llWzBdICE9Ci0JCSAgICBXUEFfSUUKLQkJICAgICYmIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ud3BhMl9zdXBwbGljYW50LndwYV9pZVswXSAhPQotCQkgICAgV1BBMl9JRSAmJiBhZGFwdGVyLT5zZWNpbmZvLkVuY3J5cHRpb25tb2RlID09IENJUEhFUl9OT05FCisJCSAgICAmJiBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9pZVswXSAhPSBXUEFfSUUKKwkJICAgICYmIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucnNuX2llWzBdICE9IFdQQTJfSUUKIAkJICAgICYmICFhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLnByaXZhY3kpIHsKIAkJCS8qIG5vIHNlY3VyaXR5ICovCiAJCQlMRUFWRSgpOwogCQkJcmV0dXJuIGluZGV4OwotCQl9IGVsc2UgaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBlbmFibGVkCisJCX0gZWxzZSBpZiAoICAgYWRhcHRlci0+c2VjaW5mby53ZXBfZW5hYmxlZAogCQkJICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZAogCQkJICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQKIAkJCSAgICYmIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSkgewogCQkJLyogc3RhdGljIFdFUCBlbmFibGVkICovCiAJCQlMRUFWRSgpOwogCQkJcmV0dXJuIGluZGV4OwotCQl9IGVsc2UgaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBkaXNhYmxlZAorCQl9IGVsc2UgaWYgKCAgICFhZGFwdGVyLT5zZWNpbmZvLndlcF9lbmFibGVkCiAJCQkgICAmJiBhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQKIAkJCSAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkCi0JCQkgICAmJiAoYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS53cGFfc3VwcGxpY2FudC4KLQkJCSAgICAgICB3cGFfaWVbMF0KLQkJCSAgICAgICA9PSBXUEFfSUUpCisJCQkgICAmJiAoYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS53cGFfaWVbMF0gPT0gV1BBX0lFKQogCQkJICAgLyogcHJpdmFjeSBiaXQgbWF5IE5PVCBiZSBzZXQgaW4gc29tZSBBUHMgbGlrZSBMaW5rU3lzIFdSVDU0RwogCQkJICAgICAgJiYgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5wcml2YWN5ICovCiAJCSAgICApIHsKIAkJCS8qIFdQQSBlbmFibGVkICovCi0gICAgICAgICAgICBsYnNfcHJfZGVidWcoMSwKKwkJCWxic19wcl9kZWJ1ZygxLAogCQkJICAgICAgICJpc19uZXR3b3JrX2NvbXBhdGlibGUoKSBXUEE6IGluZGV4PSVkIHdwYV9pZT0lI3ggIgotCQkJICAgICAgICJ3cGEyX2llPSUjeCBXRVA9JXMgV1BBPSVzIFdQQTI9JXMgRW5jbW9kZT0lI3ggIgorCQkJICAgICAgICJ3cGEyX2llPSUjeCBXRVA9JXMgV1BBPSVzIFdQQTI9JXMgIgogCQkJICAgICAgICJwcml2YWN5PSUjeFxuIiwgaW5kZXgsCi0JCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS53cGFfc3VwcGxpY2FudC4KLQkJCSAgICAgICB3cGFfaWVbMF0sCi0JCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS53cGEyX3N1cHBsaWNhbnQuCi0JCQkgICAgICAgd3BhX2llWzBdLAotCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PQotCQkJCXdsYW44MDJfMTFXRVBlbmFibGVkKSA/ICJlIiA6ICJkIiwKLQkJCSAgICAgICAoYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkKSA/ICJlIiA6ICJkIiwKLQkJCSAgICAgICAoYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCkgPyAiZSIgOiAiZCIsCi0JCQkgICAgICAgYWRhcHRlci0+c2VjaW5mby5FbmNyeXB0aW9ubW9kZSwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9pZVswXSwKKwkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLnJzbl9pZVswXSwKKwkJCSAgICAgICBhZGFwdGVyLT5zZWNpbmZvLndlcF9lbmFibGVkID8gImUiIDogImQiLAorCQkJICAgICAgIGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCA/ICJlIiA6ICJkIiwKKwkJCSAgICAgICBhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkID8gImUiIDogImQiLAogCQkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSk7CiAJCQlMRUFWRSgpOwogCQkJcmV0dXJuIGluZGV4OwotCQl9IGVsc2UgaWYgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBkaXNhYmxlZAorCQl9IGVsc2UgaWYgKCAgICFhZGFwdGVyLT5zZWNpbmZvLndlcF9lbmFibGVkCiAJCQkgICAmJiAhYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkCiAJCQkgICAmJiBhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkCi0JCQkgICAmJiAoYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS53cGEyX3N1cHBsaWNhbnQuCi0JCQkgICAgICAgd3BhX2llWzBdCi0JCQkgICAgICAgPT0gV1BBMl9JRSkKKwkJCSAgICYmIChhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLnJzbl9pZVswXSA9PSBXUEEyX0lFKQogCQkJICAgLyogcHJpdmFjeSBiaXQgbWF5IE5PVCBiZSBzZXQgaW4gc29tZSBBUHMgbGlrZSBMaW5rU3lzIFdSVDU0RwogCQkJICAgICAgJiYgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5wcml2YWN5ICovCiAJCSAgICApIHsKIAkJCS8qIFdQQTIgZW5hYmxlZCAqLwotICAgICAgICAgICAgbGJzX3ByX2RlYnVnKDEsCisJCQlsYnNfcHJfZGVidWcoMSwKIAkJCSAgICAgICAiaXNfbmV0d29ya19jb21wYXRpYmxlKCkgV1BBMjogaW5kZXg9JWQgd3BhX2llPSUjeCAiCi0JCQkgICAgICAgIndwYTJfaWU9JSN4IFdFUD0lcyBXUEE9JXMgV1BBMj0lcyBFbmNtb2RlPSUjeCAiCisJCQkgICAgICAgIndwYTJfaWU9JSN4IFdFUD0lcyBXUEE9JXMgV1BBMj0lcyAiCiAJCQkgICAgICAgInByaXZhY3k9JSN4XG4iLCBpbmRleCwKLQkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgotCQkJICAgICAgIHdwYV9pZVswXSwKLQkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC4KLQkJCSAgICAgICB3cGFfaWVbMF0sCi0JCQkgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09Ci0JCQkJd2xhbjgwMl8xMVdFUGVuYWJsZWQpID8gImUiIDogImQiLAotCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQpID8gImUiIDogImQiLAotCQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSA/ICJlIiA6ICJkIiwKLQkJCSAgICAgICBhZGFwdGVyLT5zZWNpbmZvLkVuY3J5cHRpb25tb2RlLAorCQkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ud3BhX2llWzBdLAorCQkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucnNuX2llWzBdLAorCQkJICAgICAgIGFkYXB0ZXItPnNlY2luZm8ud2VwX2VuYWJsZWQgPyAiZSIgOiAiZCIsCisJCQkgICAgICAgYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkID8gImUiIDogImQiLAorCQkJICAgICAgIGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQgPyAiZSIgOiAiZCIsCiAJCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5wcml2YWN5KTsKIAkJCUxFQVZFKCk7CiAJCQlyZXR1cm4gaW5kZXg7Ci0JCX0gZWxzZSBpZiAoYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPT0gd2xhbjgwMl8xMVdFUGRpc2FibGVkCisJCX0gZWxzZSBpZiAoICAgIWFkYXB0ZXItPnNlY2luZm8ud2VwX2VuYWJsZWQKIAkJCSAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQKIAkJCSAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkCi0JCQkgICAmJiAoYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS53cGFfc3VwcGxpY2FudC4KLQkJCSAgICAgICB3cGFfaWVbMF0KLQkJCSAgICAgICAhPSBXUEFfSUUpCi0JCQkgICAmJiAoYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS53cGEyX3N1cHBsaWNhbnQuCi0JCQkgICAgICAgd3BhX2llWzBdCi0JCQkgICAgICAgIT0gV1BBMl9JRSkKLQkJCSAgICYmIGFkYXB0ZXItPnNlY2luZm8uRW5jcnlwdGlvbm1vZGUgIT0gQ0lQSEVSX05PTkUKKwkJCSAgICYmIChhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9pZVswXSAhPSBXUEFfSUUpCisJCQkgICAmJiAoYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5yc25faWVbMF0gIT0gV1BBMl9JRSkKIAkJCSAgICYmIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucHJpdmFjeSkgewogCQkJLyogZHluYW1pYyBXRVAgZW5hYmxlZCAqLwotICAgICAgICAgICAgbGJzX3ByX2RlYnVnKDEsCisJCQlsYnNfcHJfZGVidWcoMSwKIAkJCSAgICAgICAiaXNfbmV0d29ya19jb21wYXRpYmxlKCkgZHluYW1pYyBXRVA6IGluZGV4PSVkICIKLQkJCSAgICAgICAid3BhX2llPSUjeCB3cGEyX2llPSUjeCBFbmNtb2RlPSUjeCBwcml2YWN5PSUjeFxuIiwKKwkJCSAgICAgICAid3BhX2llPSUjeCB3cGEyX2llPSUjeCBwcml2YWN5PSUjeFxuIiwKIAkJCSAgICAgICBpbmRleCwKLQkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9zdXBwbGljYW50LgotCQkJICAgICAgIHdwYV9pZVswXSwKLQkJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYTJfc3VwcGxpY2FudC4KLQkJCSAgICAgICB3cGFfaWVbMF0sIGFkYXB0ZXItPnNlY2luZm8uRW5jcnlwdGlvbm1vZGUsCisJCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS53cGFfaWVbMF0sCisJCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5yc25faWVbMF0sCiAJCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS5wcml2YWN5KTsKIAkJCUxFQVZFKCk7CiAJCQlyZXR1cm4gaW5kZXg7CiAJCX0KIAogCQkvKiBzZWN1cml0eSBkb2Vzbid0IG1hdGNoICovCi0gICAgICAgIGxic19wcl9kZWJ1ZygxLAorCQlsYnNfcHJfZGVidWcoMSwKIAkJICAgICAgICJpc19uZXR3b3JrX2NvbXBhdGlibGUoKSBGQUlMRUQ6IGluZGV4PSVkIHdwYV9pZT0lI3ggIgotCQkgICAgICAgIndwYTJfaWU9JSN4IFdFUD0lcyBXUEE9JXMgV1BBMj0lcyBFbmNtb2RlPSUjeCBwcml2YWN5PSUjeFxuIiwKKwkJICAgICAgICJ3cGEyX2llPSUjeCBXRVA9JXMgV1BBPSVzIFdQQTI9JXMgcHJpdmFjeT0lI3hcbiIsCiAJCSAgICAgICBpbmRleCwKLQkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ud3BhX3N1cHBsaWNhbnQud3BhX2llWzBdLAotCQkgICAgICAgYWRhcHRlci0+c2NhbnRhYmxlW2luZGV4XS53cGEyX3N1cHBsaWNhbnQud3BhX2llWzBdLAotCQkgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09Ci0JCQl3bGFuODAyXzExV0VQZW5hYmxlZCkgPyAiZSIgOiAiZCIsCi0JCSAgICAgICAoYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkKSA/ICJlIiA6ICJkIiwKLQkJICAgICAgIChhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSA/ICJlIiA6ICJkIiwKLQkJICAgICAgIGFkYXB0ZXItPnNlY2luZm8uRW5jcnlwdGlvbm1vZGUsCisJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLndwYV9pZVswXSwKKwkJICAgICAgIGFkYXB0ZXItPnNjYW50YWJsZVtpbmRleF0ucnNuX2llWzBdLAorCQkgICAgICAgYWRhcHRlci0+c2VjaW5mby53ZXBfZW5hYmxlZCA/ICJlIiA6ICJkIiwKKwkJICAgICAgIGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCA/ICJlIiA6ICJkIiwKKwkJICAgICAgIGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQgPyAiZSIgOiAiZCIsCiAJCSAgICAgICBhZGFwdGVyLT5zY2FudGFibGVbaW5kZXhdLnByaXZhY3kpOwogCQlMRUFWRSgpOwogCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKQEAgLTkyNCw4ICs4OTgsNiBAQAogCXU4IGZvdW5kZGF0YXJhdGVpZTsKIAlpbnQgYnl0ZXNsZWZ0Zm9yY3VycmVudGJlYWNvbjsKIAotCXN0cnVjdCBXUEFfU1VQUExJQ0FOVCAqcHdwYV9zdXBwbGljYW50OwotCXN0cnVjdCBXUEFfU1VQUExJQ0FOVCAqcHdwYTJfc3VwcGxpY2FudDsKIAlzdHJ1Y3QgSUVfV1BBICpwSWU7CiAJY29uc3QgdTggb3VpMDFbNF0gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDB4MDEgfTsKIApAQCAtOTYyLDkgKzkzNCw2IEBACiAKIAlieXRlc2xlZnRmb3JjdXJyZW50YmVhY29uID0gYmVhY29uc2l6ZTsKIAotCXB3cGFfc3VwcGxpY2FudCA9ICZwQlNTRW50cnktPndwYV9zdXBwbGljYW50OwotCXB3cGEyX3N1cHBsaWNhbnQgPSAmcEJTU0VudHJ5LT53cGEyX3N1cHBsaWNhbnQ7Ci0KIAltZW1jcHkocEJTU0VudHJ5LT5tYWNhZGRyZXNzLCBwY3VycmVudHB0ciwgRVRIX0FMRU4pOwogCWxic19wcl9kZWJ1ZygxLCAiSW50ZXJwcmV0SUU6IEFQIE1BQyBBZGRyLSV4OiV4OiV4OiV4OiV4OiV4XG4iLAogCSAgICAgICBwQlNTRW50cnktPm1hY2FkZHJlc3NbMF0sIHBCU1NFbnRyeS0+bWFjYWRkcmVzc1sxXSwKQEAgLTEwMjcsOSArOTk2LDkgQEAKIAl9CiAKIAlpZiAocGNhcC0+aWJzcyA9PSAxKSB7Ci0JCXBCU1NFbnRyeS0+aW5mcmFtb2RlID0gd2xhbjgwMl8xMWlic3M7CisJCXBCU1NFbnRyeS0+bW9kZSA9IElXX01PREVfQURIT0M7CiAJfSBlbHNlIHsKLQkJcEJTU0VudHJ5LT5pbmZyYW1vZGUgPSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmU7CisJCXBCU1NFbnRyeS0+bW9kZSA9IElXX01PREVfSU5GUkE7CiAJfQogCiAJLyogcHJvY2VzcyB2YXJpYWJsZSBJRSAqLwpAQCAtMTExNiw3ICsxMDg1LDcgQEAKIAkJCSAgICBzaXplb2YocGNvdW50cnlpbmZvLT5jb3VudHJ5Y29kZSkKIAkJCSAgICB8fCBwY291bnRyeWluZm8tPmxlbiA+IDI1NCkgewogCQkJCWxic19wcl9kZWJ1ZygxLCAiSW50ZXJwcmV0SUU6IDExRC0gRXJyICIKLQkJCQkgICAgICAgIkNvdW50cnlJbmZvIGxlbiA9JWQgbWluPSVkIG1heD0yNTRcbiIsCisJCQkJICAgICAgICJDb3VudHJ5SW5mbyBsZW4gPSVkIG1pbj0lemQgbWF4PTI1NFxuIiwKIAkJCQkgICAgICAgcGNvdW50cnlpbmZvLT5sZW4sCiAJCQkJICAgICAgIHNpemVvZihwY291bnRyeWluZm8tPmNvdW50cnljb2RlKSk7CiAJCQkJTEVBVkUoKTsKQEAgLTExNjAsMjcgKzExMjksMjcgQEAKICNkZWZpbmUgSUVfSURfTEVOX0ZJRUxEU19CWVRFUyAyCiAJCQlwSWUgPSAoc3RydWN0IElFX1dQQSAqKXBjdXJyZW50cHRyOwogCi0JCQlpZiAoIW1lbWNtcChwSWUtPm91aSwgb3VpMDEsIHNpemVvZihvdWkwMSkpKSB7Ci0JCQkJcHdwYV9zdXBwbGljYW50LT53cGFfaWVfbGVuCi0JCQkJICAgID0gbWluX3Qoc2l6ZV90LCBlbGVtbGVuICsgSUVfSURfTEVOX0ZJRUxEU19CWVRFUywKLQkJCQkJICBzaXplb2YocHdwYV9zdXBwbGljYW50LT53cGFfaWUpKTsKLQkJCQltZW1jcHkocHdwYV9zdXBwbGljYW50LT53cGFfaWUsCi0JCQkJICAgICAgIHBjdXJyZW50cHRyLAotCQkJCSAgICAgICBwd3BhX3N1cHBsaWNhbnQtPndwYV9pZV9sZW4pOwotCQkJCWxic19kYmdfaGV4KCJJbnRlcnByZXRJRTogUmVzcCBXUEFfSUUiLAotCQkJCQlwd3BhX3N1cHBsaWNhbnQtPndwYV9pZSwgZWxlbWxlbik7Ci0JCQl9CisJCQlpZiAobWVtY21wKHBJZS0+b3VpLCBvdWkwMSwgc2l6ZW9mKG91aTAxKSkpCisJCQkJYnJlYWs7CisKKwkJCXBCU1NFbnRyeS0+d3BhX2llX2xlbiA9IG1pbl90KHNpemVfdCwKKwkJCQllbGVtbGVuICsgSUVfSURfTEVOX0ZJRUxEU19CWVRFUywKKwkJCQlzaXplb2YocEJTU0VudHJ5LT53cGFfaWUpKTsKKwkJCW1lbWNweShwQlNTRW50cnktPndwYV9pZSwgcGN1cnJlbnRwdHIsCisJCQkJcEJTU0VudHJ5LT53cGFfaWVfbGVuKTsKKwkJCWxic19kYmdfaGV4KCJJbnRlcnByZXRJRTogUmVzcCBXUEFfSUUiLAorCQkJCXBCU1NFbnRyeS0+d3BhX2llLCBlbGVtbGVuKTsKIAkJCWJyZWFrOwogCQljYXNlIFdQQTJfSUU6CiAJCQlwSWUgPSAoc3RydWN0IElFX1dQQSAqKXBjdXJyZW50cHRyOwotCQkJcHdwYTJfc3VwcGxpY2FudC0+d3BhX2llX2xlbgotCQkJICAgID0gbWluX3Qoc2l6ZV90LCBlbGVtbGVuICsgSUVfSURfTEVOX0ZJRUxEU19CWVRFUywKLQkJCQkgIHNpemVvZihwd3BhMl9zdXBwbGljYW50LT53cGFfaWUpKTsKLQkJCW1lbWNweShwd3BhMl9zdXBwbGljYW50LT53cGFfaWUsCi0JCQkgICAgICAgcGN1cnJlbnRwdHIsIHB3cGEyX3N1cHBsaWNhbnQtPndwYV9pZV9sZW4pOwogCisJCQlwQlNTRW50cnktPnJzbl9pZV9sZW4gPSBtaW5fdChzaXplX3QsCisJCQkJZWxlbWxlbiArIElFX0lEX0xFTl9GSUVMRFNfQllURVMsCisJCQkJc2l6ZW9mKHBCU1NFbnRyeS0+cnNuX2llKSk7CisJCQltZW1jcHkocEJTU0VudHJ5LT5yc25faWUsIHBjdXJyZW50cHRyLAorCQkJCXBCU1NFbnRyeS0+cnNuX2llX2xlbik7CiAJCQlsYnNfZGJnX2hleCgiSW50ZXJwcmV0SUU6IFJlc3AgV1BBMl9JRSIsCi0JCQkJcHdwYTJfc3VwcGxpY2FudC0+d3BhX2llLCBlbGVtbGVuKTsKKwkJCQlwQlNTRW50cnktPnJzbl9pZSwgZWxlbWxlbik7CiAJCQlicmVhazsKIAkJY2FzZSBUSU06CiAJCQlicmVhazsKQEAgLTEyMjcsNyArMTE5Niw3IEBACiAgKgogICogIEByZXR1cm4gICAgICAgICBpbmRleCBpbiBCU1NJRCBsaXN0LCBvciBlcnJvciByZXR1cm4gY29kZSAoPCAwKQogICovCi1pbnQgbGliZXJ0YXNfZmluZF9CU1NJRF9pbl9saXN0KHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsIHU4ICogYnNzaWQsIGludCBtb2RlKQoraW50IGxpYmVydGFzX2ZpbmRfQlNTSURfaW5fbGlzdCh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCB1OCAqIGJzc2lkLCB1OCBtb2RlKQogewogCWludCByZXQgPSAtRU5FVFVOUkVBQ0g7CiAJaW50IGk7CkBAIC0xMjQ3LDggKzEyMTYsOCBAQAogCWZvciAoaSA9IDA7IHJldCA8IDAgJiYgaSA8IGFkYXB0ZXItPm51bWluc2NhbnRhYmxlOyBpKyspIHsKIAkJaWYgKCFtZW1jbXAoYWRhcHRlci0+c2NhbnRhYmxlW2ldLm1hY2FkZHJlc3MsIGJzc2lkLCBFVEhfQUxFTikpIHsKIAkJCXN3aXRjaCAobW9kZSkgewotCQkJY2FzZSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmU6Ci0JCQljYXNlIHdsYW44MDJfMTFpYnNzOgorCQkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJY2FzZSBJV19NT0RFX0FESE9DOgogCQkJCXJldCA9IGlzX25ldHdvcmtfY29tcGF0aWJsZShhZGFwdGVyLCBpLCBtb2RlKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CkBAIC0xMjcyLDcgKzEyNDEsNyBAQAogICogIEByZXR1cm4gICAgICAgICBpbmRleCBpbiBCU1NJRCBsaXN0CiAgKi8KIGludCBsaWJlcnRhc19maW5kX1NTSURfaW5fbGlzdCh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLAotCQkgICBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqc3NpZCwgdTggKiBic3NpZCwgaW50IG1vZGUpCisJCSAgIHN0cnVjdCBXTEFOXzgwMl8xMV9TU0lEICpzc2lkLCB1OCAqIGJzc2lkLCB1OCBtb2RlKQogewogCWludCBuZXQgPSAtRU5FVFVOUkVBQ0g7CiAJdTggYmVzdHJzc2kgPSAwOwpAQCAtMTI4Nyw4ICsxMjU2LDggQEAKIAkJICAgICAhbWVtY21wKGFkYXB0ZXItPnNjYW50YWJsZVtpXS4KIAkJCSAgICAgbWFjYWRkcmVzcywgYnNzaWQsIEVUSF9BTEVOKSkpIHsKIAkJCXN3aXRjaCAobW9kZSkgewotCQkJY2FzZSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmU6Ci0JCQljYXNlIHdsYW44MDJfMTFpYnNzOgorCQkJY2FzZSBJV19NT0RFX0lORlJBOgorCQkJY2FzZSBJV19NT0RFX0FESE9DOgogCQkJCWogPSBpc19uZXR3b3JrX2NvbXBhdGlibGUoYWRhcHRlciwgaSwgbW9kZSk7CiAKIAkJCQlpZiAoaiA+PSAwKSB7CkBAIC0xMzExLDcgKzEyODAsNyBAQAogCQkJCQl9CiAJCQkJfQogCQkJCWJyZWFrOwotCQkJY2FzZSB3bGFuODAyXzExYXV0b3Vua25vd246CisJCQljYXNlIElXX01PREVfQVVUTzoKIAkJCWRlZmF1bHQ6CiAJCQkJaWYgKFNDQU5fUlNTSShhZGFwdGVyLT5zY2FudGFibGVbaV0ucnNzaSkKIAkJCQkgICAgPiBiZXN0cnNzaSkgewpAQCAtMTMzOCw4ICsxMzA3LDcgQEAKICAqCiAgKiAgQHJldHVybiAgICAgICAgIGluZGV4IGluIEJTU0lEIGxpc3QKICAqLwotaW50IGxpYmVydGFzX2ZpbmRfYmVzdF9TU0lEX2luX2xpc3Qod2xhbl9hZGFwdGVyICogYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBtb2RlKQoraW50IGxpYmVydGFzX2ZpbmRfYmVzdF9TU0lEX2luX2xpc3Qod2xhbl9hZGFwdGVyICogYWRhcHRlciwgdTggbW9kZSkKIHsKIAlpbnQgYmVzdG5ldCA9IC1FTkVUVU5SRUFDSDsKIAl1OCBiZXN0cnNzaSA9IDA7CkBAIC0xMzUxLDggKzEzMTksOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bWluc2NhbnRhYmxlOyBpKyspIHsKIAkJc3dpdGNoIChtb2RlKSB7Ci0JCWNhc2Ugd2xhbjgwMl8xMWluZnJhc3RydWN0dXJlOgotCQljYXNlIHdsYW44MDJfMTFpYnNzOgorCQljYXNlIElXX01PREVfSU5GUkE6CisJCWNhc2UgSVdfTU9ERV9BREhPQzoKIAkJCWlmIChpc19uZXR3b3JrX2NvbXBhdGlibGUoYWRhcHRlciwgaSwgbW9kZSkgPj0gMCkgewogCQkJCWlmIChTQ0FOX1JTU0koYWRhcHRlci0+c2NhbnRhYmxlW2ldLnJzc2kpID4KIAkJCQkgICAgYmVzdHJzc2kpIHsKQEAgLTEzNjMsNyArMTMzMSw3IEBACiAJCQkJfQogCQkJfQogCQkJYnJlYWs7Ci0JCWNhc2Ugd2xhbjgwMl8xMWF1dG91bmtub3duOgorCQljYXNlIElXX01PREVfQVVUTzoKIAkJZGVmYXVsdDoKIAkJCWlmIChTQ0FOX1JTU0koYWRhcHRlci0+c2NhbnRhYmxlW2ldLnJzc2kpID4gYmVzdHJzc2kpIHsKIAkJCQliZXN0cnNzaSA9CkBAIC0xMzg4LDggKzEzNTYsNyBAQAogICovCiBpbnQgbGliZXJ0YXNfZmluZF9iZXN0X25ldHdvcmtfU1NJRCh3bGFuX3ByaXZhdGUgKiBwcml2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnBTU0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIHByZWZlcnJlZF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFICpvdXRfbW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IHByZWZlcnJlZF9tb2RlLCB1OCAqb3V0X21vZGUpCiB7CiAJd2xhbl9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKIAlpbnQgcmV0ID0gMDsKQEAgLTE0MTQsNyArMTM4MSw3IEBACiAJcHJlcWJzc2lkID0gJmFkYXB0ZXItPnNjYW50YWJsZVtpXTsKIAltZW1jcHkocFNTSUQsICZwcmVxYnNzaWQtPnNzaWQsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCkpOwotCSpvdXRfbW9kZSA9IHByZXFic3NpZC0+aW5mcmFtb2RlOworCSpvdXRfbW9kZSA9IHByZXFic3NpZC0+bW9kZTsKIAogCWlmICghcFNTSUQtPnNzaWRsZW5ndGgpIHsKIAkJcmV0ID0gLTE7CkBAIC0xNTg0LDcgKzE1NTEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1pbnNjYW50YWJsZTsgaSsrKSB7CiAJCWlmICgoY3VycmVudF9ldiArIE1BWF9TQ0FOX0NFTExfU0laRSkgPj0gZW5kX2J1ZikgewogCQkJbGJzX3ByX2RlYnVnKDEsICJpPSVkIGJyZWFrIG91dDogY3VycmVudF9ldj0lcCBlbmRfYnVmPSVwICIKLQkJCSAgICAgICAiTUFYX1NDQU5fQ0VMTF9TSVpFPSVkXG4iLAorCQkJICAgICAgICJNQVhfU0NBTl9DRUxMX1NJWkU9JXpkXG4iLAogCQkJICAgICAgIGksIGN1cnJlbnRfZXYsIGVuZF9idWYsIE1BWF9TQ0FOX0NFTExfU0laRSk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTYzMiw3ICsxNTk5LDcgQEAKIAogCQkvL0FkZCBtb2RlCiAJCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKLQkJaXdlLnUubW9kZSA9IGFkYXB0ZXItPnNjYW50YWJsZVtpXS5pbmZyYW1vZGUgKyAxOworCQlpd2UudS5tb2RlID0gYWRhcHRlci0+c2NhbnRhYmxlW2ldLm1vZGU7CiAJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKIAkJY3VycmVudF9ldiA9CiAJCSAgICBpd2Vfc3RyZWFtX2FkZF9ldmVudChjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLCBpd2UubGVuKTsKQEAgLTE2NjYsNyArMTYzMyw3IEBACiAJCQlpd2UudS5xdWFsLm5vaXNlID0KIAkJCSAgICBDQUxfTkYoYWRhcHRlci0+TkZbVFlQRV9CRUFDT05dW1RZUEVfTk9BVkddKTsKIAkJfQotCQlpZiAoKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgJiYKKwkJaWYgKChhZGFwdGVyLT5tb2RlID09IElXX01PREVfQURIT0MpICYmCiAJCSAgICAhbGliZXJ0YXNfU1NJRF9jbXAoJmFkYXB0ZXItPmN1cmJzc3BhcmFtcy5zc2lkLAogCQkJICAgICAmYWRhcHRlci0+c2NhbnRhYmxlW2ldLnNzaWQpCiAJCSAgICAmJiBhZGFwdGVyLT5hZGhvY2NyZWF0ZSkgewpAQCAtMTczMSw3ICsxNjk4LDcgQEAKIAkJCQkJCSBlbmRfYnVmLCAmaXdlLCBpd2UubGVuKTsKIAogCQl9Ci0JCWlmICgoYWRhcHRlci0+c2NhbnRhYmxlW2ldLmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykKKwkJaWYgKChhZGFwdGVyLT5zY2FudGFibGVbaV0ubW9kZSA9PSBJV19NT0RFX0FESE9DKQogCQkgICAgJiYgIWxpYmVydGFzX1NTSURfY21wKCZhZGFwdGVyLT5jdXJic3NwYXJhbXMuc3NpZCwKIAkJCQkmYWRhcHRlci0+c2NhbnRhYmxlW2ldLnNzaWQpCiAJCSAgICAmJiBhZGFwdGVyLT5hZGhvY2NyZWF0ZSkgewpAQCAtMTc0NSwzMCArMTcxMiwyNCBAQAogCQkvKiBBZGQgbmV3IHZhbHVlIHRvIGV2ZW50ICovCiAJCWN1cnJlbnRfdmFsID0gY3VycmVudF9ldiArIElXX0VWX0xDUF9MRU47CiAKLQkJaWYgKGFkYXB0ZXItPnNjYW50YWJsZVtpXS53cGEyX3N1cHBsaWNhbnQud3BhX2llWzBdID09IFdQQTJfSUUpIHsKKwkJaWYgKGFkYXB0ZXItPnNjYW50YWJsZVtpXS5yc25faWVbMF0gPT0gV1BBMl9JRSkgewogCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAkJCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQkJCW1lbWNweShidWYsIGFkYXB0ZXItPnNjYW50YWJsZVtpXS4KLQkJCQkJCXdwYTJfc3VwcGxpY2FudC53cGFfaWUsCi0JCQkJCWFkYXB0ZXItPnNjYW50YWJsZVtpXS53cGEyX3N1cHBsaWNhbnQuCi0JCQkJCQl3cGFfaWVfbGVuKTsKKwkJCW1lbWNweShidWYsIGFkYXB0ZXItPnNjYW50YWJsZVtpXS5yc25faWUsCisJCQkJCWFkYXB0ZXItPnNjYW50YWJsZVtpXS5yc25faWVfbGVuKTsKIAkJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7Ci0JCQlpd2UudS5kYXRhLmxlbmd0aCA9IGFkYXB0ZXItPnNjYW50YWJsZVtpXS4KLQkJCQkJd3BhMl9zdXBwbGljYW50LndwYV9pZV9sZW47CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IGFkYXB0ZXItPnNjYW50YWJsZVtpXS5yc25faWVfbGVuOwogCQkJaXdlLmxlbiA9IElXX0VWX1BPSU5UX0xFTiArIGl3ZS51LmRhdGEubGVuZ3RoOwogCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCiAJCQkJCSZpd2UsIGJ1Zik7CiAJCX0KLQkJaWYgKGFkYXB0ZXItPnNjYW50YWJsZVtpXS53cGFfc3VwcGxpY2FudC53cGFfaWVbMF0gPT0gV1BBX0lFKSB7CisJCWlmIChhZGFwdGVyLT5zY2FudGFibGVbaV0ud3BhX2llWzBdID09IFdQQV9JRSkgewogCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAkJCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQkJCW1lbWNweShidWYsIGFkYXB0ZXItPnNjYW50YWJsZVtpXS4KLQkJCQkJCXdwYV9zdXBwbGljYW50LndwYV9pZSwKLQkJCQkJYWRhcHRlci0+c2NhbnRhYmxlW2ldLndwYV9zdXBwbGljYW50LgotCQkJCQkJd3BhX2llX2xlbik7CisJCQltZW1jcHkoYnVmLCBhZGFwdGVyLT5zY2FudGFibGVbaV0ud3BhX2llLAorCQkJCQlhZGFwdGVyLT5zY2FudGFibGVbaV0ud3BhX2llX2xlbik7CiAJCQlpd2UuY21kID0gSVdFVkdFTklFOwotCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBhZGFwdGVyLT5zY2FudGFibGVbaV0uCi0JCQkJCXdwYV9zdXBwbGljYW50LndwYV9pZV9sZW47CisJCQlpd2UudS5kYXRhLmxlbmd0aCA9IGFkYXB0ZXItPnNjYW50YWJsZVtpXS53cGFfaWVfbGVuOwogCQkJaXdlLmxlbiA9IElXX0VWX1BPSU5UX0xFTiArIGl3ZS51LmRhdGEubGVuZ3RoOwogCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGN1cnJlbnRfZXYsIGVuZF9idWYsCiAJCQkJCSZpd2UsIGJ1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9zY2FuLmgKaW5kZXggZDkzYWE3Zi4uNDA1ZjRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvc2Nhbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3NjYW4uaApAQCAtMSw2ICsxLDMgQEAKLS8qIC0qLSBtb2RlOiBDOyB0YWItd2lkdGg6IDQ7IGluZGVudC10YWJzLW1vZGU6IG5pbCAtKi0gKi8KLS8qIHZpOiBzZXQgZXhwYW5kdGFiIHNoaWZ0d2lkdGg9NCB0YWJzdG9wPTQgdGV4dHdpZHRoPTc4OiAqLwotCiAvKioKICAgKiBJbnRlcmZhY2UgZm9yIHRoZSB3bGFuIG5ldHdvcmsgc2NhbiByb3V0aW5lcwogICAqCkBAIC0xMCw2ICs3LDcgQEAKICNpZm5kZWYgX1dMQU5fU0NBTl9ICiAjZGVmaW5lIF9XTEFOX1NDQU5fSAogCisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMS5oPgogI2luY2x1ZGUgImhvc3RjbWQuaCIKIAogLyoqCkBAIC0xNTUsNyArMTUzLDcgQEAKIAogCXUzMiBhdGltd2luZG93OwogCi0JZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIGluZnJhbW9kZTsKKwl1OCBtb2RlOwogCXU4IGxpYmVydGFzX3N1cHBvcnRlZF9yYXRlc1tXTEFOX1NVUFBPUlRFRF9SQVRFU107CiAKIAlpbnQgZXh0cmFfaWU7CkBAIC0xNzAsMjIgKzE2OCwyMiBAQAogCiAJc3RydWN0IGllZWV0eXBlc19jb3VudHJ5aW5mb2Z1bGxzZXQgY291bnRyeWluZm87CiAKLQlzdHJ1Y3QgV1BBX1NVUFBMSUNBTlQgd3BhX3N1cHBsaWNhbnQ7Ci0Jc3RydWN0IFdQQV9TVVBQTElDQU5UIHdwYTJfc3VwcGxpY2FudDsKLQorCXU4IHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07CisJc2l6ZV90IHdwYV9pZV9sZW47CisJdTggcnNuX2llW01BWF9XUEFfSUVfTEVOXTsKKwlzaXplX3QgcnNuX2llX2xlbjsKIH07CiAKIGV4dGVybiBpbnQgbGliZXJ0YXNfU1NJRF9jbXAoc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnNzaWQxLAogCQkgICBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqc3NpZDIpOwogZXh0ZXJuIGludCBsaWJlcnRhc19maW5kX1NTSURfaW5fbGlzdCh3bGFuX2FkYXB0ZXIgKiBhZGFwdGVyLCBzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqc3NpZCwKLQkJCSAgdTggKiBic3NpZCwgaW50IG1vZGUpOwotaW50IGxpYmVydGFzX2ZpbmRfYmVzdF9TU0lEX2luX2xpc3Qod2xhbl9hZGFwdGVyICogYWRhcHRlciwgZW51bSBXTEFOXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIG1vZGUpOwotZXh0ZXJuIGludCBsaWJlcnRhc19maW5kX0JTU0lEX2luX2xpc3Qod2xhbl9hZGFwdGVyICogYWRhcHRlciwgdTggKiBic3NpZCwgaW50IG1vZGUpOworCQkJICB1OCAqIGJzc2lkLCB1OCBtb2RlKTsKK2ludCBsaWJlcnRhc19maW5kX2Jlc3RfU1NJRF9pbl9saXN0KHdsYW5fYWRhcHRlciAqIGFkYXB0ZXIsIHU4IG1vZGUpOworZXh0ZXJuIGludCBsaWJlcnRhc19maW5kX0JTU0lEX2luX2xpc3Qod2xhbl9hZGFwdGVyICogYWRhcHRlciwgdTggKiBic3NpZCwgdTggbW9kZSk7CiAKIGludCBsaWJlcnRhc19maW5kX2Jlc3RfbmV0d29ya19TU0lEKHdsYW5fcHJpdmF0ZSAqIHByaXYsCiAJCQlzdHJ1Y3QgV0xBTl84MDJfMTFfU1NJRCAqcFNTSUQsCi0JCQllbnVtIFdMQU5fODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgcHJlZmVycmVkX21vZGUsCi0JCQllbnVtIFdMQU5fODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgKm91dF9tb2RlKTsKKwkJCXU4IHByZWZlcnJlZF9tb2RlLCB1OCAqb3V0X21vZGUpOwogCiBleHRlcm4gaW50IGxpYmVydGFzX3NlbmRfc3BlY2lmaWNfU1NJRF9zY2FuKHdsYW5fcHJpdmF0ZSAqIHByaXYsCiAJCQkJc3RydWN0IFdMQU5fODAyXzExX1NTSUQgKnByZXF1ZXN0ZWRzc2lkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3R4LmMKaW5kZXggODJkMDYyMi4uZDRiMTM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy90eC5jCkBAIC03OCw3ICs3OCw3IEBACiAJCQkgbWluX3QodW5zaWduZWQgaW50LCBza2ItPmxlbiwgMTAwKSk7CiAKIAlpZiAoIXNrYi0+bGVuIHx8IChza2ItPmxlbiA+IE1SVkRSVl9FVEhfVFhfUEFDS0VUX0JVRkZFUl9TSVpFKSkgewotCQlsYnNfcHJfZGVidWcoMSwgIlR4IGVycm9yOiBCYWQgc2tiIGxlbmd0aCAlZCA6ICVkXG4iLAorCQlsYnNfcHJfZGVidWcoMSwgIlR4IGVycm9yOiBCYWQgc2tiIGxlbmd0aCAlZCA6ICV6ZFxuIiwKIAkJICAgICAgIHNrYi0+bGVuLCBNUlZEUlZfRVRIX1RYX1BBQ0tFVF9CVUZGRVJfU0laRSk7CiAJCXJldCA9IC0xOwogCQlnb3RvIGRvbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy92ZXJzaW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy92ZXJzaW9uLmgKaW5kZXggZTg2ZjY1YS4uOGIxMzc4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3ZlcnNpb24uaApAQCAtMSw4ICsxIEBACi0jZGVmaW5lIERSSVZFUl9SRUxFQVNFX1ZFUlNJT04gIjMyMC5wMCIKLWNvbnN0IGNoYXIgbGliZXJ0YXNfZHJpdmVyX3ZlcnNpb25bXSA9ICJDT01NLVVTQjgzODgtIiBEUklWRVJfUkVMRUFTRV9WRVJTSU9OCi0jaWZkZWYgIERFQlVHCi0gICAgIi1kYmciCi0jZW5kaWYKLSAgICAiIjsKLQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmMKaW5kZXggNGE1MjMzNi4uNjlmNTJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL3dleHQuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgImRlZnMuaCIKICNpbmNsdWRlICJkZXYuaCIKICNpbmNsdWRlICJqb2luLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgIndleHQuaCIKICNpbmNsdWRlICJhc3NvYy5oIgogCkBAIC0yMzMsNyArMjMyLDcgQEAKIAogCQkvLyBmaW5kIG91dCB0aGUgQlNTSUQgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IFNTSUQKIAkJaSA9IGxpYmVydGFzX2ZpbmRfU1NJRF9pbl9saXN0KGFkYXB0ZXIsICZjdXJhZGhvY3NzaWQsIE5VTEwsCi0JCQkJICAgd2xhbjgwMl8xMWlic3MpOworCQkJCSAgIElXX01PREVfQURIT0MpOwogCiAJCWlmIChpID49IDApIHsKIAkJCWxic19wcl9kZWJ1ZygxLCAiU1NJRCBmb3VuZCBhdCAlZCBpbiBMaXN0LCIKQEAgLTMxNiwxMyArMzE1LDExIEBACiAJRU5URVIoKTsKIAogCWlmIChhZGFwdGVyLT5jb25uZWN0X3N0YXR1cyAhPSBsaWJlcnRhc19jb25uZWN0ZWQpIHsKLQkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpIHsKLQkJCS8vSW5mcmEuIG1vZGUKKwkJaWYgKGFkYXB0ZXItPm1vZGUgPT0gSVdfTU9ERV9JTkZSQSkgewogCQkJbGJzX3ByX2RlYnVnKDEsICJJbmZyYVxuIik7CiAJCQlrID0gY29weXJhdGVzKHJhdGVzLCBrLCBsaWJlcnRhc19zdXBwb3J0ZWRfcmF0ZXMsCiAJCQkJICAgICAgc2l6ZW9mKGxpYmVydGFzX3N1cHBvcnRlZF9yYXRlcykpOwogCQl9IGVsc2UgewotCQkJLy9hZC1ob2MgbW9kZQogCQkJbGJzX3ByX2RlYnVnKDEsICJBZGhvYyBHXG4iKTsKIAkJCWsgPSBjb3B5cmF0ZXMocmF0ZXMsIGssIGxpYmVydGFzX2FkaG9jX3JhdGVzX2csCiAJCQkJICAgICAgc2l6ZW9mKGxpYmVydGFzX2FkaG9jX3JhdGVzX2cpKTsKQEAgLTU4NiwyMCArNTgzLDcgQEAKIAogCUVOVEVSKCk7CiAKLQlzd2l0Y2ggKGFkYXB0ZXItPmluZnJhbW9kZSkgewotCWNhc2Ugd2xhbjgwMl8xMWlic3M6Ci0JCSp1d3JxID0gSVdfTU9ERV9BREhPQzsKLQkJYnJlYWs7Ci0KLQljYXNlIHdsYW44MDJfMTFpbmZyYXN0cnVjdHVyZToKLQkJKnV3cnEgPSBJV19NT0RFX0lORlJBOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JY2FzZSB3bGFuODAyXzExYXV0b3Vua25vd246Ci0JCSp1d3JxID0gSVdfTU9ERV9BVVRPOwotCQlicmVhazsKLQl9CisJKnV3cnEgPSBhZGFwdGVyLT5tb2RlOwogCiAJTEVBVkUoKTsKIAlyZXR1cm4gMDsKQEAgLTEwMDIsMTQ5ICs5ODYsMTggQEAKIAkvKgogCSAqIHsgY21kLCBzZXRfYXJncywgZ2V0X2FyZ3MsIG5hbWUgfQogCSAqLwotCXsKLQkgV0xBTlNDQU5fVFlQRSwKLQkgSVdfUFJJVl9UWVBFX0NIQVIgfCA4LAotCSBJV19QUklWX1RZUEVfQ0hBUiB8IDgsCi0JICJzY2FudHlwZSJ9LAotCi0JewotCSBXTEFOX1NFVElOVF9HRVRJTlQsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKLQkgIiJ9LAotCXsKLQkgV0xBTk5GLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JICJnZXRORiJ9LAotCXsKLQkgV0xBTlJTU0ksCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKLQkgImdldFJTU0kifSwKLQl7Ci0JIFdMQU5FTkFCTEUxMUQsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKLQkgImVuYWJsZTExZCJ9LAotCXsKLQkgV0xBTkFESE9DR1JBVEUsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKLQkgImFkaG9jZ3JhdGUifSwKLQotCXsKLQkgV0xBTl9TVUJDTURfU0VUX1BSRVNDQU4sCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKLQkgInByZXNjYW4ifSwKLQl7Ci0JIFdMQU5fU0VUT05FSU5UX0dFVE9ORUlOVCwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDEsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxLAotCSAiIn0sCi0JewotCSBXTEFOX0JFQUNPTl9JTlRFUlZBTCwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDEsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxLAotCSAiYmNuaW50ZXJ2YWwifSwKLQl7Ci0JIFdMQU5fTElTVEVOSU5UUlZMLAotCSBJV19QUklWX1RZUEVfSU5UIHwgMSwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDEsCi0JICJsb2xpc3RlbmludGVyIn0sCi0JewotCSBXTEFOX1RYQ09OVFJPTCwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDEsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxLAotCSAidHhjb250cm9sIn0sCi0JewotCSBXTEFOX05VTExQS1RJTlRFUlZBTCwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDEsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxLAotCSAicHNudWxsaW50ZXJ2YWwifSwKIAkvKiBVc2luZyBpd3ByaXYgc3ViLWNvbW1hbmQgZmVhdHVyZSAqLwogCXsKIAkgV0xBTl9TRVRPTkVJTlRfR0VUTk9ORSwJLyogSU9DVEw6IDI0ICovCiAJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAogCSBJV19QUklWX1RZUEVfTk9ORSwKIAkgIiJ9LAotCi0JewotCSBXTEFOX1NVQkNNRF9TRVRSWEFOVEVOTkEsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgInNldHJ4YW50In0sCi0JewotCSBXTEFOX1NVQkNNRF9TRVRUWEFOVEVOTkEsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgInNldHR4YW50In0sCi0JewotCSBXTEFOU0VUQVVUSEFMRywKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSAiYXV0aGFsZ3MiLAotCSB9LAotCXsKLQkgV0xBTlNFVDgwMjFYQVVUSEFMRywKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSAiODAyMXhhdXRoYWxncyIsCi0JIH0sCi0JewotCSBXTEFOU0VURU5DUllQVElPTk1PREUsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgImVuY3J5cHRpb25tb2RlIiwKLQkgfSwKIAl7CiAJIFdMQU5TRVRSRUdJT04sCiAJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAogCSBJV19QUklWX1RZUEVfTk9ORSwKIAkgInNldHJlZ2lvbmNvZGUifSwKIAl7Ci0JIFdMQU5fU0VUX0xJU1RFTl9JTlRFUlZBTCwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSAic2V0bGlzdGVuaW50ZXIifSwKLQl7Ci0JIFdMQU5fU0VUX01VTFRJUExFX0RUSU0sCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgInNldG11bHRpcGxlZHRpbSJ9LAotCXsKLQkgV0xBTl9TRVRfQVRJTV9XSU5ET1csCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgImF0aW13aW5kb3cifSwKLQl7Ci0JIFdMQU5TRVRCQ05BVkcsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgInNldGJjbmF2ZyJ9LAotCXsKLQkgV0xBTlNFVERBVEFBVkcsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgInNldGRhdGFhdmcifSwKLQl7Ci0JIFdMQU5fU0VUX0xJTktNT0RFLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKLQkgSVdfUFJJVl9UWVBFX05PTkUsCi0JICJsaW5rbW9kZSJ9LAotCXsKLQkgV0xBTl9TRVRfUkFESU9NT0RFLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKLQkgSVdfUFJJVl9UWVBFX05PTkUsCi0JICJyYWRpb21vZGUifSwKLQl7Ci0JIFdMQU5fU0VUX0RFQlVHTU9ERSwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSAiZGVidWdtb2RlIn0sCi0JewogCSBXTEFOX1NVQkNNRF9NRVNIX1NFVF9UVEwsCiAJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAogCSBJV19QUklWX1RZUEVfTk9ORSwKQEAgLTExNjAsNDEgKzEwMTMsNiBAQAogCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKIAkgImdldHJlZ2lvbmNvZGUifSwKIAl7Ci0JIFdMQU5fR0VUX0xJU1RFTl9JTlRFUlZBTCwKLQkgSVdfUFJJVl9UWVBFX05PTkUsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSAiZ2V0bGlzdGVuaW50ZXIifSwKLQl7Ci0JIFdMQU5fR0VUX01VTFRJUExFX0RUSU0sCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKLQkgImdldG11bHRpcGxlZHRpbSJ9LAotCXsKLQkgV0xBTl9HRVRfVFhfUkFURSwKLQkgSVdfUFJJVl9UWVBFX05PTkUsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSAiZ2V0dHhyYXRlIn0sCi0JewotCSBXTEFOR0VUQkNOQVZHLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JICJnZXRiY25hdmcifSwKLQl7Ci0JIFdMQU5fR0VUX0xJTktNT0RFLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JICJnZXRfbGlua21vZGUifSwKLQl7Ci0JIFdMQU5fR0VUX1JBRElPTU9ERSwKLQkgSVdfUFJJVl9UWVBFX05PTkUsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLAotCSAiZ2V0X3JhZGlvbW9kZSJ9LAotCXsKLQkgV0xBTl9HRVRfREVCVUdNT0RFLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsCi0JICJnZXRfZGVidWdtb2RlIn0sCi0JewogCSBXTEFOX1NVQkNNRF9GV1RfQ0xFQU5VUCwKIAkgSVdfUFJJVl9UWVBFX05PTkUsCiAJIElXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLApAQCAtMTIxMCw2MSArMTAyOCwxMSBAQAogCSBJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwKIAkgIm1lc2hfZ2V0X3R0bCJ9LAogCXsKLQkgV0xBTl9TRVROT05FX0dFVFRXRUxWRV9DSEFSLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMiwKLQkgIiJ9LAotCXsKLQkgV0xBTl9TVUJDTURfR0VUUlhBTlRFTk5BLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgSVdfUFJJVl9UWVBFX0NIQVIgfCAxMiwKLQkgImdldHJ4YW50In0sCi0JewotCSBXTEFOX1NVQkNNRF9HRVRUWEFOVEVOTkEsCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyLAotCSAiZ2V0dHhhbnQifSwKLQl7Ci0JIFdMQU5fR0VUX1RTRiwKLQkgSVdfUFJJVl9UWVBFX05PTkUsCi0JIElXX1BSSVZfVFlQRV9DSEFSIHwgMTIsCi0JICJnZXR0c2YifSwKLQl7CiAJIFdMQU5fU0VUTk9ORV9HRVROT05FLAogCSBJV19QUklWX1RZUEVfTk9ORSwKIAkgSVdfUFJJVl9UWVBFX05PTkUsCiAJICIifSwKIAl7Ci0JIFdMQU5ERUFVVEgsCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgImRlYXV0aCJ9LAotCXsKLQkgV0xBTkFESE9DU1RPUCwKLQkgSVdfUFJJVl9UWVBFX05PTkUsCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSAiYWRob2NzdG9wIn0sCi0JewotCSBXTEFOUkFESU9PTiwKLQkgSVdfUFJJVl9UWVBFX05PTkUsCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSAicmFkaW9vbiJ9LAotCXsKLQkgV0xBTlJBRElPT0ZGLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgSVdfUFJJVl9UWVBFX05PTkUsCi0JICJyYWRpb29mZiJ9LAotCXsKLQkgV0xBTldMQU5JRExFT04sCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgIndsYW5pZGxlLW9uIn0sCi0JewotCSBXTEFOV0xBTklETEVPRkYsCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgIndsYW5pZGxlLW9mZiJ9LAotCXsKIAkgV0xBTl9TVUJDTURfRldUX1JFU0VULAogCSBJV19QUklWX1RZUEVfTk9ORSwKIAkgSVdfUFJJVl9UWVBFX05PTkUsCkBAIC0xMzI3LDkwICsxMDk1LDE1IEBACiAJIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAogCSAiZnd0X2xpc3Rfcm91dGUifSwKIAl7Ci0JIFdMQU5TQ0FOX01PREUsCi0JIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAotCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKLQkgInNjYW5tb2RlIn0sCi0JewotCSBXTEFOX0dFVF9BREhPQ19TVEFUVVMsCi0JIElXX1BSSVZfVFlQRV9DSEFSIHwgMTI4LAotCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKLQkgImdldGFkaG9jc3RhdHVzIn0sCi0JewotCSBXTEFOX1NFVE5PTkVfR0VUV09SRENIQVIsCi0JIElXX1BSSVZfVFlQRV9OT05FLAotCSBJV19QUklWX1RZUEVfQ0hBUiB8IDEyOCwKLQkgIiJ9LAotCXsKLQkgV0xBTlNFVFdQQUlFLAotCSBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDI0LAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgInNldHdwYWllIn0sCi0JewotCSBXTEFOR0VUTE9HLAotCSBJV19QUklWX1RZUEVfTk9ORSwKLQkgSVdfUFJJVl9UWVBFX0NIQVIgfCBHRVRMT0dfQlVGU0laRSwKLQkgImdldGxvZyJ9LAotCXsKIAkgV0xBTl9TRVRfR0VUX1NJWFRFRU5fSU5ULAogCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCiAJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKIAkgIiJ9LAogCXsKLQkgV0xBTl9UUENDRkcsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAotCSAidHBjY2ZnIn0sCi0JewotCSBXTEFOX1BPV0VSQ0ZHLAotCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKLQkgInBvd2VyY2ZnIn0sCi0JewotCSBXTEFOX0FVVE9fRlJFUV9TRVQsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAotCSAic2V0YWZjIn0sCi0JewotCSBXTEFOX0FVVE9fRlJFUV9HRVQsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAotCSAiZ2V0YWZjIn0sCi0JewotCSBXTEFOX1NDQU5QUk9CRVMsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAotCSAic2NhbnByb2JlcyJ9LAotCXsKIAkgV0xBTl9MRURfR1BJT19DVFJMLAogCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCiAJIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKIAkgImxlZGdwaW8ifSwKLQl7Ci0JIFdMQU5fQURBUFRfUkFURVNFVCwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAotCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCi0JICJyYXRlYWRhcHQifSwKLQl7Ci0JIFdMQU5fSU5BQ1RJVklUWV9USU1FT1VULAotCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKLQkgImluYWN0aXZpdHl0byJ9LAotCXsKLQkgV0xBTlNOUiwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAotCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCi0JICJnZXRTTlIifSwKLQl7Ci0JIFdMQU5fR0VUX1JBVEUsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKLQkgSVdfUFJJVl9UWVBFX0lOVCB8IDE2LAotCSAiZ2V0cmF0ZSJ9LAotCXsKLQkgV0xBTl9HRVRfUlhJTkZPLAotCSBJV19QUklWX1RZUEVfSU5UIHwgMTYsCi0JIElXX1BSSVZfVFlQRV9JTlQgfCAxNiwKLQkgImdldHJ4aW5mbyJ9LAogfTsKIAogc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICp3bGFuX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTQzNCw3ICsxMTI3LDcgQEAKIAogCUVOVEVSKCk7CiAKLQlwcml2LT53c3RhdHMuc3RhdHVzID0gYWRhcHRlci0+aW5mcmFtb2RlOworCXByaXYtPndzdGF0cy5zdGF0dXMgPSBhZGFwdGVyLT5tb2RlOwogCiAJLyogSWYgd2UncmUgbm90IGFzc29jaWF0ZWQsIGFsbCBxdWFsaXR5IHZhbHVlcyBhcmUgbWVhbmluZ2xlc3MgKi8KIAlpZiAoYWRhcHRlci0+Y29ubmVjdF9zdGF0dXMgIT0gbGliZXJ0YXNfY29ubmVjdGVkKQpAQCAtMTU2OCwxMyArMTI2MSwxMiBAQAogCQlpZiAoIWNmcCkgewogCQkJcmMgPSAtRUlOVkFMOwogCQl9IGVsc2UgewotCQkJaWYgKGFkYXB0ZXItPmluZnJhbW9kZSA9PSB3bGFuODAyXzExaWJzcykgeworCQkJaWYgKGFkYXB0ZXItPm1vZGUgPT0gSVdfTU9ERV9BREhPQykgewogCQkJCXJjID0gY2hhbmdlYWRob2NjaGFubmVsKHByaXYsIGNoYW5uZWwpOwogCQkJCS8qICBJZiBzdGF0aW9uIGlzIFdFUCBlbmFibGVkLCBzZW5kIHRoZQogCQkJCSAqICBjb21tYW5kIHRvIHNldCBXRVAgaW4gZmlybXdhcmUKIAkJCQkgKi8KLQkJCQlpZiAoYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPT0KLQkJCQkgICAgd2xhbjgwMl8xMVdFUGVuYWJsZWQpIHsKKwkJCQlpZiAoYWRhcHRlci0+c2VjaW5mby53ZXBfZW5hYmxlZCkgewogCQkJCQlsYnNfcHJfZGVidWcoMSwgInNldF9mcmVxOiBXRVAgZW5hYmxlZFxuIik7CiAJCQkJCXJldCA9IGxpYmVydGFzX3ByZXBhcmVfYW5kX3NlbmRfY29tbWFuZChwcml2LAogCQkJCQkJCQkgICAgY21kXzgwMl8xMV9zZXRfd2VwLApAQCAtMTcxNiw0OSArMTQwOCwzMSBAQAogCXdsYW5fcHJpdmF0ZSAqcHJpdiA9IGRldi0+cHJpdjsKIAl3bGFuX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwogCXN0cnVjdCBhc3NvY19yZXF1ZXN0ICogYXNzb2NfcmVxOwotCWVudW0gV0xBTl84MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBuZXdfbW9kZTsKIAogCUVOVEVSKCk7CiAKLQlzd2l0Y2ggKCp1d3JxKSB7Ci0JY2FzZSBJV19NT0RFX0FESE9DOgotCQlsYnNfcHJfZGVidWcoMSwgIldhbnRlZCBtb2RlIGlzIGFkLWhvYzogY3VycmVudCBkYXRhcmF0ZT0lI3hcbiIsCi0JCSAgICAgICBhZGFwdGVyLT5kYXRhcmF0ZSk7Ci0JCW5ld19tb2RlID0gd2xhbjgwMl8xMWlic3M7Ci0JCWFkYXB0ZXItPmFkaG9jY2hhbm5lbCA9IERFRkFVTFRfQURfSE9DX0NIQU5ORUw7Ci0JCWJyZWFrOwotCi0JY2FzZSBJV19NT0RFX0lORlJBOgotCQlsYnNfcHJfZGVidWcoMSwgIldhbnRlZCBtb2RlIGlzIEluZnJhc3RydWN0dXJlXG4iKTsKLQkJbmV3X21vZGUgPSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmU7Ci0JCWJyZWFrOwotCi0JY2FzZSBJV19NT0RFX0FVVE86Ci0JCWxic19wcl9kZWJ1ZygxLCAiV2FudGVkIG1vZGUgaXMgQXV0b1xuIik7Ci0JCW5ld19tb2RlID0gd2xhbjgwMl8xMWF1dG91bmtub3duOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWxic19wcl9kZWJ1ZygxLCAiV2FudGVkIG1vZGUgaXMgVW5rbm93bjogMHgleFxuIiwgKnV3cnEpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoICAgKCp1d3JxICE9IElXX01PREVfQURIT0MpCisJICAgICYmICgqdXdycSAhPSBJV19NT0RFX0lORlJBKQorCSAgICAmJiAoKnV3cnEgIT0gSVdfTU9ERV9BVVRPKSkgeworCQlsYnNfcHJfZGVidWcoMSwgIkludmFsaWQgbW9kZTogMHgleFxuIiwgKnV3cnEpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKIAl9CiAKIAltdXRleF9sb2NrKCZhZGFwdGVyLT5sb2NrKTsKIAlhc3NvY19yZXEgPSB3bGFuX2dldF9hc3NvY2lhdGlvbl9yZXF1ZXN0KGFkYXB0ZXIpOwogCWlmICghYXNzb2NfcmVxKSB7CiAJCXJldCA9IC1FTk9NRU07CisJCXdsYW5fY2FuY2VsX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7CiAJfSBlbHNlIHsKLQkJYXNzb2NfcmVxLT5tb2RlID0gbmV3X21vZGU7Ci0JfQotCi0JaWYgKHJldCA9PSAwKSB7CisJCWFzc29jX3JlcS0+bW9kZSA9ICp1d3JxOwogCQlzZXRfYml0KEFTU09DX0ZMQUdfTU9ERSwgJmFzc29jX3JlcS0+ZmxhZ3MpOwogCQl3bGFuX3Bvc3Rwb25lX2Fzc29jaWF0aW9uX3dvcmsocHJpdik7Ci0JfSBlbHNlIHsKLQkJd2xhbl9jYW5jZWxfYXNzb2NpYXRpb25fd29yayhwcml2KTsKKwkJbGJzX3ByX2RlYnVnKDEsICJTd2l0Y2hpbmcgdG8gbW9kZTogMHgleFxuIiwgKnV3cnEpOwogCX0KIAltdXRleF91bmxvY2soJmFkYXB0ZXItPmxvY2spOwogCitvdXQ6CiAJTEVBVkUoKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTc4OSwxMyArMTQ2MywxMyBAQAogCWR3cnEtPmZsYWdzID0gMDsKIAogCS8qIEF1dGhlbnRpY2F0aW9uIG1ldGhvZCAqLwotCXN3aXRjaCAoYWRhcHRlci0+c2VjaW5mby5hdXRobW9kZSkgewotCWNhc2Ugd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjoKKwlzd2l0Y2ggKGFkYXB0ZXItPnNlY2luZm8uYXV0aF9tb2RlKSB7CisJY2FzZSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTToKIAkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfT1BFTjsKIAkJYnJlYWs7CiAKLQljYXNlIHdsYW44MDJfMTFhdXRobW9kZXNoYXJlZDoKLQljYXNlIHdsYW44MDJfMTFhdXRobW9kZW5ldHdvcmtFQVA6CisJY2FzZSBJV19BVVRIX0FMR19TSEFSRURfS0VZOgorCWNhc2UgSVdfQVVUSF9BTEdfTEVBUDoKIAkJZHdycS0+ZmxhZ3MgPSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE4MDMsOCArMTQ3Nyw5IEBACiAJCWJyZWFrOwogCX0KIAotCWlmICgoYWRhcHRlci0+c2VjaW5mby5XRVBzdGF0dXMgPT0gd2xhbjgwMl8xMVdFUGVuYWJsZWQpCi0JICAgIHx8IGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCB8fCBhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CisJaWYgKCAgIGFkYXB0ZXItPnNlY2luZm8ud2VwX2VuYWJsZWQKKwkgICAgfHwgYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkCisJICAgIHx8IGFkYXB0ZXItPnNlY2luZm8uV1BBMmVuYWJsZWQpIHsKIAkJZHdycS0+ZmxhZ3MgJj0gfklXX0VOQ09ERV9ESVNBQkxFRDsKIAl9IGVsc2UgewogCQlkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CkBAIC0xODE4LDggKzE0OTMsNyBAQAogCWlmIChpbmRleCA8IDApCiAJCWluZGV4ID0gYWRhcHRlci0+d2VwX3R4X2tleWlkeDsKIAotCWlmICgoYWRhcHRlci0+d2VwX2tleXNbaW5kZXhdLmxlbikgJiYKLQkgICAgKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBlbmFibGVkKSkgeworCWlmICgoYWRhcHRlci0+d2VwX2tleXNbaW5kZXhdLmxlbikgJiYgYWRhcHRlci0+c2VjaW5mby53ZXBfZW5hYmxlZCkgewogCQltZW1jcHkoZXh0cmEsIGFkYXB0ZXItPndlcF9rZXlzW2luZGV4XS5rZXksCiAJCSAgICAgICBhZGFwdGVyLT53ZXBfa2V5c1tpbmRleF0ubGVuKTsKIAkJZHdycS0+bGVuZ3RoID0gYWRhcHRlci0+d2VwX2tleXNbaW5kZXhdLmxlbjsKQEAgLTE5MDMsNyArMTU3Nyw3IEBACiAJCWFzc29jX3JlcS0+d2VwX3R4X2tleWlkeCA9IGluZGV4OwogCX0KIAotCWFzc29jX3JlcS0+c2VjaW5mby5XRVBzdGF0dXMgPSB3bGFuODAyXzExV0VQZW5hYmxlZDsKKwlhc3NvY19yZXEtPnNlY2luZm8ud2VwX2VuYWJsZWQgPSAxOwogCiAJTEVBVkUoKTsKIAlyZXR1cm4gMDsKQEAgLTE5MzIsMTAgKzE2MDYsMTAgQEAKIAlpbnQgaTsKIAogCS8qIFNldCBPcGVuIFN5c3RlbSBhdXRoIG1vZGUgKi8KLQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPSB3bGFuODAyXzExYXV0aG1vZGVvcGVuOworCWFzc29jX3JlcS0+c2VjaW5mby5hdXRoX21vZGUgPSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKIAogCS8qIENsZWFyIFdFUCBrZXlzIGFuZCBtYXJrIFdFUCBhcyBkaXNhYmxlZCAqLwotCWFzc29jX3JlcS0+c2VjaW5mby5XRVBzdGF0dXMgPSB3bGFuODAyXzExV0VQZGlzYWJsZWQ7CisJYXNzb2NfcmVxLT5zZWNpbmZvLndlcF9lbmFibGVkID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQlhc3NvY19yZXEtPndlcF9rZXlzW2ldLmxlbiA9IDA7CiAKQEAgLTE5ODcsOCArMTY2MSw3IEBACiAJLyogSWYgV0VQIGlzbid0IGVuYWJsZWQsIG9yIGlmIHRoZXJlIGlzIG5vIGtleSBkYXRhIGJ1dCBhIHZhbGlkCiAJICogaW5kZXgsIHNldCB0aGUgVFgga2V5LgogCSAqLwotCWlmICgoYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyAhPSB3bGFuODAyXzExV0VQZW5hYmxlZCkKLQkgICAgfHwgKGR3cnEtPmxlbmd0aCA9PSAwICYmICFpc19kZWZhdWx0KSkKKwlpZiAoIWFzc29jX3JlcS0+c2VjaW5mby53ZXBfZW5hYmxlZCB8fCAoZHdycS0+bGVuZ3RoID09IDAgJiYgIWlzX2RlZmF1bHQpKQogCQlzZXRfdHhfa2V5ID0gMTsKIAogCXJldCA9IHdsYW5fc2V0X3dlcF9rZXkoYXNzb2NfcmVxLCBleHRyYSwgZHdycS0+bGVuZ3RoLCBpbmRleCwgc2V0X3R4X2tleSk7CkBAIC0yMDAxLDkgKzE2NzQsOSBAQAogCQlzZXRfYml0KEFTU09DX0ZMQUdfV0VQX1RYX0tFWUlEWCwgJmFzc29jX3JlcS0+ZmxhZ3MpOwogCiAJaWYgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpIHsKLQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhtb2RlID0gd2xhbjgwMl8xMWF1dGhtb2Rlc2hhcmVkOworCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aF9tb2RlID0gSVdfQVVUSF9BTEdfU0hBUkVEX0tFWTsKIAl9IGVsc2UgaWYgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pIHsKLQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhtb2RlID0gd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjsKKwkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhfbW9kZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOwogCX0KIAogb3V0OgpAQCAtMjA1NiwzMCArMTcyOSwzMSBAQAogCiAJaWYgKCFleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZICYmCiAJICAgIGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfV0VQKSB7Ci0JCWlmIChpbmRleCAhPSAwIHx8IGFkYXB0ZXItPmluZnJhbW9kZSAhPSB3bGFuODAyXzExaW5mcmFzdHJ1Y3R1cmUpCisJCWlmIChpbmRleCAhPSAwIHx8IGFkYXB0ZXItPm1vZGUgIT0gSVdfTU9ERV9JTkZSQSkKIAkJCWdvdG8gb3V0OwogCX0KIAogCWR3cnEtPmZsYWdzID0gaW5kZXggKyAxOwogCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CiAKLQlpZiAoKGFkYXB0ZXItPnNlY2luZm8uV0VQc3RhdHVzID09IHdsYW44MDJfMTFXRVBkaXNhYmxlZCkKLQkgICAgJiYgIWFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCAmJiAhYWRhcHRlci0+c2VjaW5mby5XUEEyZW5hYmxlZCkgeworCWlmICggICAhYWRhcHRlci0+c2VjaW5mby53ZXBfZW5hYmxlZAorCSAgICAmJiAhYWRhcHRlci0+c2VjaW5mby5XUEFlbmFibGVkCisJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CiAJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19OT05FOwogCQlleHQtPmtleV9sZW4gPSAwOwogCQlkd3JxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CiAJfSBlbHNlIHsKIAkJdTggKmtleSA9IE5VTEw7CiAKLQkJaWYgKChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZW5hYmxlZCkKKwkJaWYgKCAgIGFkYXB0ZXItPnNlY2luZm8ud2VwX2VuYWJsZWQKIAkJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQWVuYWJsZWQKIAkJICAgICYmICFhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CiAJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfV0VQOwogCQkJZXh0LT5rZXlfbGVuID0gYWRhcHRlci0+d2VwX2tleXNbaW5kZXhdLmxlbjsKIAkJCWtleSA9ICZhZGFwdGVyLT53ZXBfa2V5c1tpbmRleF0ua2V5WzBdOwotCQl9IGVsc2UgaWYgKChhZGFwdGVyLT5zZWNpbmZvLldFUHN0YXR1cyA9PSB3bGFuODAyXzExV0VQZGlzYWJsZWQpICYmCi0JCSAgICAgICAgICAgKGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCB8fAotCQkgICAgICAgICAgICBhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSkgeworCQl9IGVsc2UgaWYgKCAgICFhZGFwdGVyLT5zZWNpbmZvLndlcF9lbmFibGVkCisJCSAgICAgICAgICAgJiYgKGFkYXB0ZXItPnNlY2luZm8uV1BBZW5hYmxlZCB8fAorCQkgICAgICAgICAgICAgICBhZGFwdGVyLT5zZWNpbmZvLldQQTJlbmFibGVkKSkgewogCQkJLyogV1BBICovCiAJCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKIAkJCWV4dC0+a2V5X2xlbiA9IDA7CkBAIC0yMTQ5LDcgKzE4MjMsNyBAQAogCQkvKiBJZiBXRVAgaXNuJ3QgZW5hYmxlZCwgb3IgaWYgdGhlcmUgaXMgbm8ga2V5IGRhdGEgYnV0IGEgdmFsaWQKIAkJICogaW5kZXgsIG9yIGlmIHRoZSBzZXQtVFgta2V5IGZsYWcgd2FzIHBhc3NlZCwgc2V0IHRoZSBUWCBrZXkuCiAJCSAqLwotCQlpZiAoKGFzc29jX3JlcS0+c2VjaW5mby5XRVBzdGF0dXMgIT0gd2xhbjgwMl8xMVdFUGVuYWJsZWQpCisJCWlmICggICAhYXNzb2NfcmVxLT5zZWNpbmZvLndlcF9lbmFibGVkCiAJCSAgICB8fCAoZHdycS0+bGVuZ3RoID09IDAgJiYgIWlzX2RlZmF1bHQpCiAJCSAgICB8fCAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVkpKQogCQkJc2V0X3R4X2tleSA9IDE7CkBAIC0yMTYxLDExICsxODM1LDkgQEAKIAkJCWdvdG8gb3V0OwogCiAJCWlmIChkd3JxLT5mbGFncyAmIElXX0VOQ09ERV9SRVNUUklDVEVEKSB7Ci0JCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPQotCQkJICAgIHdsYW44MDJfMTFhdXRobW9kZXNoYXJlZDsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRoX21vZGUgPSBJV19BVVRIX0FMR19TSEFSRURfS0VZOwogCQl9IGVsc2UgaWYgKGR3cnEtPmZsYWdzICYgSVdfRU5DT0RFX09QRU4pIHsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9Ci0JCQkgICAgd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRoX21vZGUgPSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKIAkJfQogCiAJCS8qIE1hcmsgdGhlIHZhcmlvdXMgV0VQIGJpdHMgYXMgbW9kaWZpZWQgKi8KQEAgLTIzNTAsMTUgKzIwMjIsMTMgQEAKIAkJfQogCQlpZiAoZHdycS0+dmFsdWUgJiBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkgewogCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAxOwotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyA9IHdsYW44MDJfMTFXRVBkaXNhYmxlZDsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9Ci0JCQkgICAgd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby53ZXBfZW5hYmxlZCA9IDA7CisJCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aF9tb2RlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CiAJCX0KIAkJaWYgKGR3cnEtPnZhbHVlICYgSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEyKSB7CiAJCQlhc3NvY19yZXEtPnNlY2luZm8uV1BBMmVuYWJsZWQgPSAxOwotCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyA9IHdsYW44MDJfMTFXRVBkaXNhYmxlZDsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9Ci0JCQkgICAgd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby53ZXBfZW5hYmxlZCA9IDA7CisJCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aF9tb2RlID0gSVdfQVVUSF9BTEdfT1BFTl9TWVNURU07CiAJCX0KIAkJdXBkYXRlZCA9IDE7CiAJCWJyZWFrOwpAQCAtMjM3NiwxNCArMjA0NiwxMSBAQAogCiAJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgogCQlpZiAoZHdycS0+dmFsdWUgJiBJV19BVVRIX0FMR19TSEFSRURfS0VZKSB7Ci0JCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPQotCQkJICAgIHdsYW44MDJfMTFhdXRobW9kZXNoYXJlZDsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRoX21vZGUgPSBJV19BVVRIX0FMR19TSEFSRURfS0VZOwogCQl9IGVsc2UgaWYgKGR3cnEtPnZhbHVlICYgSVdfQVVUSF9BTEdfT1BFTl9TWVNURU0pIHsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9Ci0JCQkgICAgd2xhbjgwMl8xMWF1dGhtb2Rlb3BlbjsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRoX21vZGUgPSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKIAkJfSBlbHNlIGlmIChkd3JxLT52YWx1ZSAmIElXX0FVVEhfQUxHX0xFQVApIHsKLQkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRobW9kZSA9Ci0JCQkgICAgd2xhbjgwMl8xMWF1dGhtb2RlbmV0d29ya0VBUDsKKwkJCWFzc29jX3JlcS0+c2VjaW5mby5hdXRoX21vZGUgPSBJV19BVVRIX0FMR19MRUFQOwogCQl9IGVsc2UgewogCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQpAQCAtMjM5Niw5ICsyMDYzLDggQEAKIAkJCSAgICAhYXNzb2NfcmVxLT5zZWNpbmZvLldQQTJlbmFibGVkKSB7CiAJCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAxOwogCQkJCWFzc29jX3JlcS0+c2VjaW5mby5XUEEyZW5hYmxlZCA9IDE7Ci0JCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldFUHN0YXR1cyA9IHdsYW44MDJfMTFXRVBkaXNhYmxlZDsKLQkJCQlhc3NvY19yZXEtPnNlY2luZm8uYXV0aG1vZGUgPQotCQkJCSAgICB3bGFuODAyXzExYXV0aG1vZGVvcGVuOworCQkJCWFzc29jX3JlcS0+c2VjaW5mby53ZXBfZW5hYmxlZCA9IDA7CisJCQkJYXNzb2NfcmVxLT5zZWNpbmZvLmF1dGhfbW9kZSA9IElXX0FVVEhfQUxHX09QRU5fU1lTVEVNOwogCQkJfQogCQl9IGVsc2UgewogCQkJYXNzb2NfcmVxLT5zZWNpbmZvLldQQWVuYWJsZWQgPSAwOwpAQCAtMjQ1NSwxOSArMjEyMSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgotCQlzd2l0Y2ggKGFkYXB0ZXItPnNlY2luZm8uYXV0aG1vZGUpIHsKLQkJY2FzZSB3bGFuODAyXzExYXV0aG1vZGVzaGFyZWQ6Ci0JCQlkd3JxLT52YWx1ZSA9IElXX0FVVEhfQUxHX1NIQVJFRF9LRVk7Ci0JCQlicmVhazsKLQkJY2FzZSB3bGFuODAyXzExYXV0aG1vZGVvcGVuOgotCQkJZHdycS0+dmFsdWUgPSBJV19BVVRIX0FMR19PUEVOX1NZU1RFTTsKLQkJCWJyZWFrOwotCQljYXNlIHdsYW44MDJfMTFhdXRobW9kZW5ldHdvcmtFQVA6Ci0JCQlkd3JxLT52YWx1ZSA9IElXX0FVVEhfQUxHX0xFQVA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9CisJCWR3cnEtPnZhbHVlID0gYWRhcHRlci0+c2VjaW5mby5hdXRoX21vZGU7CiAJCWJyZWFrOwogCiAJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5oCmluZGV4IDM5ZjM2N2MzLi4xNWNmYWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy93ZXh0LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvd2V4dC5oCkBAIC0xMCw4OCArMTAsMjIgQEAKIC8qKiBQUklWQVRFIENNRCBJRCAqLwogI2RlZmluZQlXTEFOSU9DVEwJCQlTSU9DSVdGSVJTVFBSSVYKIAotI2RlZmluZSBXTEFOU0VUV1BBSUUJCQkoV0xBTklPQ1RMICsgMCkKLQotI2RlZmluZSBXTEFOX1NFVElOVF9HRVRJTlQJCShXTEFOSU9DVEwgKyA3KQotI2RlZmluZSBXTEFOTkYJCQkJCTEKLSNkZWZpbmUgV0xBTlJTU0kJCQkJMgotI2RlZmluZSBXTEFORU5BQkxFMTFECQkJCTUKLSNkZWZpbmUgV0xBTkFESE9DR1JBVEUJCQkJNgotI2RlZmluZSBXTEFOX1NVQkNNRF9TRVRfUFJFU0NBTgkJCTExCi0KICNkZWZpbmUgV0xBTl9TRVROT05FX0dFVE5PTkUJICAgICAgICAoV0xBTklPQ1RMICsgOCkKLSNkZWZpbmUgV0xBTkRFQVVUSCAgICAgICAgICAgICAgICAgIAkJMQotI2RlZmluZSBXTEFOUkFESU9PTiAgICAgICAgICAgICAgICAgCQkyCi0jZGVmaW5lIFdMQU5SQURJT09GRiAgICAgICAgICAgICAgICAJCTMKLSNkZWZpbmUgV0xBTlJFTU9WRUFESE9DQUVTICAgICAgICAgIAkJNAotI2RlZmluZSBXTEFOQURIT0NTVE9QICAgICAgICAgICAgICAgCQk1Ci0jZGVmaW5lIFdMQU5DSVBIRVJURVNUICAgICAgICAgICAgICAJCTYKLSNkZWZpbmUgV0xBTkNSWVBUT1RFU1QJCQkJNwotCi0jZGVmaW5lIFdMQU5XTEFOSURMRU9OCQkJCTEwCi0jZGVmaW5lIFdMQU5XTEFOSURMRU9GRgkJCQkxMQogI2RlZmluZSBXTEFOX1NVQkNNRF9CVF9SRVNFVAkJCTEzCiAjZGVmaW5lIFdMQU5fU1VCQ01EX0ZXVF9SRVNFVAkJCTE0CiAKLSNkZWZpbmUgV0xBTkdFVExPRyAgICAgICAgICAgICAgICAgIAkoV0xBTklPQ1RMICsgOSkKLSNkZWZpbmUgR0VUTE9HX0JVRlNJWkUgIDMwMAotCi0jZGVmaW5lIFdMQU5TQ0FOX1RZUEUJCQkoV0xBTklPQ1RMICsgMTEpCi0KICNkZWZpbmUgV0xBTl9TRVROT05FX0dFVE9ORUlOVAkJKFdMQU5JT0NUTCArIDE1KQogI2RlZmluZSBXTEFOR0VUUkVHSU9OCQkJCTEKLSNkZWZpbmUgV0xBTl9HRVRfTElTVEVOX0lOVEVSVkFMCQkyCi0jZGVmaW5lIFdMQU5fR0VUX01VTFRJUExFX0RUSU0JCQkzCi0jZGVmaW5lIFdMQU5fR0VUX1RYX1JBVEUJCQk0Ci0jZGVmaW5lCVdMQU5HRVRCQ05BVkcJCQkJNQogCi0jZGVmaW5lIFdMQU5fR0VUX0xJTktNT0RFCQkJNgotI2RlZmluZSBXTEFOX0dFVF9SQURJT01PREUJCQk3Ci0jZGVmaW5lIFdMQU5fR0VUX0RFQlVHTU9ERQkJCTgKICNkZWZpbmUgV0xBTl9TVUJDTURfRldUX0NMRUFOVVAJCQkxNQogI2RlZmluZSBXTEFOX1NVQkNNRF9GV1RfVElNRQkJCTE2CiAjZGVmaW5lIFdMQU5fU1VCQ01EX01FU0hfR0VUX1RUTAkJMTcKIAotI2RlZmluZSBXTEFOUkVHQ0ZSRFdSCQkJKFdMQU5JT0NUTCArIDE4KQotCi0jZGVmaW5lIFdMQU5fU0VUTk9ORV9HRVRUV0VMVkVfQ0hBUiAoV0xBTklPQ1RMICsgMTkpCi0jZGVmaW5lIFdMQU5fU1VCQ01EX0dFVFJYQU5URU5OQSAgICAxCi0jZGVmaW5lIFdMQU5fU1VCQ01EX0dFVFRYQU5URU5OQSAgICAyCi0jZGVmaW5lIFdMQU5fR0VUX1RTRiAgICAgICAgICAgICAgICAzCi0KLSNkZWZpbmUgV0xBTl9TRVROT05FX0dFVFdPUkRDSEFSCShXTEFOSU9DVEwgKyAyMSkKLSNkZWZpbmUgV0xBTkdFVEFESE9DQUVTCQkJCTEKLQotI2RlZmluZSBXTEFOX1NFVE9ORUlOVF9HRVRPTkVJTlQJKFdMQU5JT0NUTCArIDIzKQotI2RlZmluZSBXTEFOX0JFQUNPTl9JTlRFUlZBTAkJCTEKLSNkZWZpbmUJV0xBTl9MSVNURU5JTlRSVkwJCQk0Ci0KLSNkZWZpbmUgV0xBTl9UWENPTlRST0wJCQkJNgotI2RlZmluZSBXTEFOX05VTExQS1RJTlRFUlZBTAkJCTcKLQogI2RlZmluZSBXTEFOX1NFVE9ORUlOVF9HRVROT05FCQkoV0xBTklPQ1RMICsgMjQpCi0jZGVmaW5lIFdMQU5fU1VCQ01EX1NFVFJYQU5URU5OQQkJMQotI2RlZmluZSBXTEFOX1NVQkNNRF9TRVRUWEFOVEVOTkEJCTIKLSNkZWZpbmUgV0xBTlNFVEFVVEhBTEcJCQkJNQotI2RlZmluZSBXTEFOU0VUODAyMVhBVVRIQUxHCQkJNgotI2RlZmluZSBXTEFOU0VURU5DUllQVElPTk1PREUJCQk3CiAjZGVmaW5lIFdMQU5TRVRSRUdJT04JCQkJOAotI2RlZmluZSBXTEFOX1NFVF9MSVNURU5fSU5URVJWQUwJCTkKLQotI2RlZmluZSBXTEFOX1NFVF9NVUxUSVBMRV9EVElNCQkJMTAKLSNkZWZpbmUgV0xBTl9TRVRfQVRJTV9XSU5ET1cJCQkxMQotI2RlZmluZSBXTEFOU0VUQkNOQVZHCQkJCTEzCi0jZGVmaW5lIFdMQU5TRVREQVRBQVZHCQkJCTE0Ci0jZGVmaW5lIFdMQU5fU0VUX0xJTktNT0RFCQkJMTUKLSNkZWZpbmUgV0xBTl9TRVRfUkFESU9NT0RFCQkJMTYKLSNkZWZpbmUgV0xBTl9TRVRfREVCVUdNT0RFCQkJMTcKICNkZWZpbmUgV0xBTl9TVUJDTURfTUVTSF9TRVRfVFRMCQkxOAogCiAjZGVmaW5lIFdMQU5fU0VUMTI4Q0hBUl9HRVQxMjhDSEFSCShXTEFOSU9DVEwgKyAyNSkKLSNkZWZpbmUgV0xBTlNDQU5fTU9ERQkJCQk2Ci0KLSNkZWZpbmUgV0xBTl9HRVRfQURIT0NfU1RBVFVTCQkJOQotCiAjZGVmaW5lIFdMQU5fU1VCQ01EX0JUX0FERAkJCTE4CiAjZGVmaW5lIFdMQU5fU1VCQ01EX0JUX0RFTCAgIAkJCTE5CiAjZGVmaW5lIFdMQU5fU1VCQ01EX0JUX0xJU1QJCQkyMApAQCAtMTAzLDI3ICszNyw4IEBACiAjZGVmaW5lIFdMQU5fU1VCQ01EX0ZXVF9MSVNUX1JPVVRFCQkJMjYKIAogI2RlZmluZSBXTEFOX1NFVF9HRVRfU0lYVEVFTl9JTlQgICAgICAgKFdMQU5JT0NUTCArIDI5KQotI2RlZmluZSBXTEFOX1RQQ0NGRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBXTEFOX1BPV0VSQ0ZHICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotCi0jZGVmaW5lIFdMQU5fQVVUT19GUkVRX1NFVAkJCTMKLSNkZWZpbmUgV0xBTl9BVVRPX0ZSRVFfR0VUCQkJNAogI2RlZmluZSBXTEFOX0xFRF9HUElPX0NUUkwJCQk1Ci0jZGVmaW5lIFdMQU5fU0NBTlBST0JFUyAJCQk2Ci0jZGVmaW5lCVdMQU5fQURBUFRfUkFURVNFVAkJCTgKLSNkZWZpbmUJV0xBTl9JTkFDVElWSVRZX1RJTUVPVVQJCQk5Ci0jZGVmaW5lIFdMQU5TTlIJCQkJCTEwCi0jZGVmaW5lIFdMQU5fR0VUX1JBVEUJCQkJMTEKLSNkZWZpbmUJV0xBTl9HRVRfUlhJTkZPCQkJCTEyCiAKLSNkZWZpbmUgV0xBTkNNRDUyUkRXUgkJCShXTEFOSU9DVEwgKyAzMCkKLSNkZWZpbmUgV0xBTkNNRDUzUkRXUgkJCShXTEFOSU9DVEwgKyAzMSkKLSNkZWZpbmUgQ01ENTNCVUZMRU4JCQkJMzIKLQotI2RlZmluZQlSRUdfTUFDCQkJCQkweDE5Ci0jZGVmaW5lCVJFR19CQlAJCQkJCTB4MWEKLSNkZWZpbmUJUkVHX1JGCQkJCQkweDFiCi0jZGVmaW5lCVJFR19FRVBST00JCQkJMHg1OQogI2RlZmluZSBXTEFOX0xJTktNT0RFXzgwMl8zCQkJMAogI2RlZmluZSBXTEFOX0xJTktNT0RFXzgwMl8xMQkJCTIKICNkZWZpbmUgV0xBTl9SQURJT01PREVfTk9ORSAgICAJCQkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NnaV9ob3RwbHVnLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NnaV9ob3RwbHVnLmMKaW5kZXggNzhjZjA3MS4uZWYwN2MzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9zZ2lfaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2dpX2hvdHBsdWcuYwpAQCAtMjQ5LDE5ICsyNDksMTkgQEAKIAogCiAJaWYgKHJjID09IFBDSV9TTE9UX0FMUkVBRFlfVVApIHsKLQkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCAiaXMgYWxyZWFkeSBhY3RpdmVcbiIpOworCQlkZXZfZGJnKCZzbG90LT5wY2lfYnVzLT5zZWxmLT5kZXYsICJpcyBhbHJlYWR5IGFjdGl2ZVxuIik7CiAJCXJldHVybiAxOyAvKiByZXR1cm4gMSB0byB1c2VyICovCiAJfQogCiAJaWYgKHJjID09IFBDSV9MMV9FUlIpIHsKLQkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQlkZXZfZGJnKCZzbG90LT5wY2lfYnVzLT5zZWxmLT5kZXYsCiAJCQkiTDEgZmFpbHVyZSAlZCB3aXRoIG1lc3NhZ2U6ICVzIiwKIAkJCXJlc3AucmVzcF9zdWJfZXJybm8sIHJlc3AucmVzcF9sMV9tc2cpOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KIAogCWlmIChyYykgewotCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwKIAkJCSJpbnNlcnQgZmFpbGVkIHdpdGggZXJyb3IgJWQgc3ViLWVycm9yICVkXG4iLAogCQkJcmMsIHJlc3AucmVzcF9zdWJfZXJybm8pOwogCQlyZXR1cm4gLUVJTzsKQEAgLTI4NywyNSArMjg3LDI1IEBACiAKIAlpZiAoKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRUxJR0lCTEUpICYmCiAJICAgIChyYyA9PSBQQ0lfU0xPVF9BTFJFQURZX0RPV04pKSB7Ci0JCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwgIlNsb3QgJXMgYWxyZWFkeSBpbmFjdGl2ZVxuIik7CisJCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwgIlNsb3QgJXMgYWxyZWFkeSBpbmFjdGl2ZVxuIiwgc2xvdC0+cGh5c2ljYWxfcGF0aCk7CiAJCXJldHVybiAxOyAvKiByZXR1cm4gMSB0byB1c2VyICovCiAJfQogCiAJaWYgKChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFKSAmJiAocmMgPT0gUENJX0VNUFRZXzMzTUhaKSkgewotCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwKIAkJCSJDYW5ub3QgcmVtb3ZlIGxhc3QgMzNNSHogY2FyZFxuIik7CiAJCXJldHVybiAtRVBFUk07CiAJfQogCiAJaWYgKChhY3Rpb24gPT0gUENJX1JFUV9TTE9UX0VMSUdJQkxFKSAmJiAocmMgPT0gUENJX0wxX0VSUikpIHsKLQkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQlkZXZfZGJnKCZzbG90LT5wY2lfYnVzLT5zZWxmLT5kZXYsCiAJCQkiTDEgZmFpbHVyZSAlZCB3aXRoIG1lc3NhZ2UgXG4lc1xuIiwKIAkJCXJlc3AucmVzcF9zdWJfZXJybm8sIHJlc3AucmVzcF9sMV9tc2cpOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KIAogCWlmICgoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9FTElHSUJMRSkgJiYgcmMpIHsKLQkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQlkZXZfZGJnKCZzbG90LT5wY2lfYnVzLT5zZWxmLT5kZXYsCiAJCQkicmVtb3ZlIGZhaWxlZCB3aXRoIGVycm9yICVkIHN1Yi1lcnJvciAlZFxuIiwKIAkJCXJjLCByZXNwLnJlc3Bfc3ViX2Vycm5vKTsKIAkJcmV0dXJuIC1FSU87CkBAIC0zMTcsMTIgKzMxNywxMiBAQAogCWlmICgoYWN0aW9uID09IFBDSV9SRVFfU0xPVF9ESVNBQkxFKSAmJiAhcmMpIHsKIAkJcGNpYnVzX2luZm8gPSBTTl9QQ0lCVVNfQlVTU09GVF9JTkZPKHNsb3QtPnBjaV9idXMpOwogCQlwY2lidXNfaW5mby0+cGJpX2VuYWJsZWRfZGV2aWNlcyAmPSB+KDEgPDwgZGV2aWNlX251bSk7Ci0JCWRldl9kYmcoc2xvdC0+cGNpX2J1cy0+c2VsZiwgInJlbW92ZSBzdWNjZXNzZnVsXG4iKTsKKwkJZGV2X2RiZygmc2xvdC0+cGNpX2J1cy0+c2VsZi0+ZGV2LCAicmVtb3ZlIHN1Y2Nlc3NmdWxcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoKGFjdGlvbiA9PSBQQ0lfUkVRX1NMT1RfRElTQUJMRSkgJiYgcmMpIHsKLQkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLCJyZW1vdmUgZmFpbGVkIHJjID0gJWRcbiIsIHJjKTsKKwkJZGV2X2RiZygmc2xvdC0+cGNpX2J1cy0+c2VsZi0+ZGV2LCJyZW1vdmUgZmFpbGVkIHJjID0gJWRcbiIsIHJjKTsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC0zNzUsNyArMzc1LDcgQEAKIAludW1fZnVuY3MgPSBwY2lfc2Nhbl9zbG90KHNsb3QtPnBjaV9idXMsCiAJCQkJICBQQ0lfREVWRk4oc2xvdC0+ZGV2aWNlX251bSArIDEsIDApKTsKIAlpZiAoIW51bV9mdW5jcykgewotCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsICJubyBkZXZpY2UgaW4gc2xvdFxuIik7CisJCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwgIm5vIGRldmljZSBpbiBzbG90XG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZzbl9ob3RwbHVnX211dGV4KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNDI3LDcgKzQyNyw3IEBACiAJCXBoYW5kbGUgPSBQQ0lfQ09OVFJPTExFUihzbG90LT5wY2lfYnVzKS0+YWNwaV9oYW5kbGU7CiAKIAkJaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UocGhhbmRsZSwgJnBkZXZpY2UpKSB7Ci0JCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCQlkZXZfZGJnKCZzbG90LT5wY2lfYnVzLT5zZWxmLT5kZXYsCiAJCQkJIm5vIHBhcmVudCBkZXZpY2UsIGFzc3VtaW5nIE5VTExcbiIpOwogCQkJcGRldmljZSA9IE5VTEw7CiAJCX0KQEAgLTQ3OSwxMCArNDc5LDEwIEBACiAJbXV0ZXhfdW5sb2NrKCZzbl9ob3RwbHVnX211dGV4KTsKIAogCWlmIChyYyA9PSAwKQotCQlkZXZfZGJnKHNsb3QtPnBjaV9idXMtPnNlbGYsCisJCWRldl9kYmcoJnNsb3QtPnBjaV9idXMtPnNlbGYtPmRldiwKIAkJCSJpbnNlcnQgb3BlcmF0aW9uIHN1Y2Nlc3NmdWxcbiIpOwogCWVsc2UKLQkJZGV2X2RiZyhzbG90LT5wY2lfYnVzLT5zZWxmLAorCQlkZXZfZGJnKCZzbG90LT5wY2lfYnVzLT5zZWxmLT5kZXYsCiAJCQkiaW5zZXJ0IG9wZXJhdGlvbiBmYWlsZWQgcmMgPSAlZFxuIiwgcmMpOwogCiAJcmV0dXJuIHJjOwpAQCAtNjU5LDE2ICs2NTksMTYgQEAKIAkJaWYgKHJjKQogCQkJZ290byByZWdpc3Rlcl9lcnI7CiAJfQotCWRldl9kYmcocGNpX2J1cy0+c2VsZiwgIlJlZ2lzdGVyZWQgYnVzIHdpdGggaG90cGx1Z1xuIik7CisJZGV2X2RiZygmcGNpX2J1cy0+c2VsZi0+ZGV2LCAiUmVnaXN0ZXJlZCBidXMgd2l0aCBob3RwbHVnXG4iKTsKIAlyZXR1cm4gcmM7CiAKIHJlZ2lzdGVyX2VycjoKLQlkZXZfZGJnKHBjaV9idXMtPnNlbGYsICJidXMgZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggZXJyID0gJWRcbiIsCisJZGV2X2RiZygmcGNpX2J1cy0+c2VsZi0+ZGV2LCAiYnVzIGZhaWxlZCB0byByZWdpc3RlciB3aXRoIGVyciA9ICVkXG4iLAogCSAgICAgICAgcmMpOwogCiBhbGxvY19lcnI6CiAJaWYgKHJjID09IC1FTk9NRU0pCi0JCWRldl9kYmcocGNpX2J1cy0+c2VsZiwgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJZGV2X2RiZygmcGNpX2J1cy0+c2VsZi0+ZGV2LCAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOwogCiAJLyogZGVzdHJveSBUSElTIGVsZW1lbnQgKi8KIAlpZiAoYnNzX2hvdHBsdWdfc2xvdCkKQEAgLTcwMSwxMCArNzAxLDEwIEBACiAKIAkJcmMgPSBzbl9wY2lfYnVzX3ZhbGlkKHBjaV9idXMpOwogCQlpZiAocmMgIT0gMSkgewotCQkJZGV2X2RiZyhwY2lfYnVzLT5zZWxmLCAibm90IGEgdmFsaWQgaG90cGx1ZyBidXNcbiIpOworCQkJZGV2X2RiZygmcGNpX2J1cy0+c2VsZi0+ZGV2LCAibm90IGEgdmFsaWQgaG90cGx1ZyBidXNcbiIpOwogCQkJY29udGludWU7CiAJCX0KLQkJZGV2X2RiZyhwY2lfYnVzLT5zZWxmLCAidmFsaWQgaG90cGx1ZyBidXNcbiIpOworCQlkZXZfZGJnKCZwY2lfYnVzLT5zZWxmLT5kZXYsICJ2YWxpZCBob3RwbHVnIGJ1c1xuIik7CiAKIAkJcmMgPSBzbl9ob3RwbHVnX3Nsb3RfcmVnaXN0ZXIocGNpX2J1cyk7CiAJCWlmICghcmMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL21zaS5jIGIvZHJpdmVycy9wY2kvbXNpLmMKaW5kZXggZTY3NDBkMS4uZDljYmQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvbXNpLmMKKysrIGIvZHJpdmVycy9wY2kvbXNpLmMKQEAgLTU0OSw4ICs1NDksMTAgQEAKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5LCAqdG1wOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bXNpX2xpc3QsIGxpc3QpCi0JCUJVR19PTihpcnFfaGFzX2FjdGlvbihlbnRyeS0+aXJxKSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRldi0+bXNpX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGVudHJ5LT5pcnEpCisJCQlCVUdfT04oaXJxX2hhc19hY3Rpb24oZW50cnktPmlycSkpOworCX0KIAogCWFyY2hfdGVhcmRvd25fbXNpX2lycXMoZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcXVpcmtzLmMgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwppbmRleCAxNDdkODZmLi42Y2NjMmU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9xdWlya3MuYworKysgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwpAQCAtODc1LDYgKzg3NSw3IEBACiAJfQogfQogREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQVRJLCBQQ0lfREVWSUNFX0lEX0FUSV9JWFA2MDBfU0FUQSwgcXVpcmtfc2I2MDBfc2F0YSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9BVEksIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDcwMF9TQVRBLCBxdWlya19zYjYwMF9zYXRhKTsKIAogLyoKICAqCVNlcnZlcndvcmtzIENTQjUgSURFIGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgbmF0aXZlIG1vZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IDE3NTliYWEuLjk1Y2U4ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtMjQ2LDcgKzI0Niw3IEBACiBjb25maWcgUlRDX0RSVl9DTU9TCiAJdHJpc3RhdGUgIlBDLXN0eWxlICdDTU9TJyIKIAlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiAoWDg2IHx8IEFMUEhBIHx8IEFSTTI2IHx8IEFSTSBcCi0JCXx8IE0zMlIgfHwgQVRBUkkgfHwgUE9XRVJQQykKKwkJfHwgTTMyUiB8fCBBVEFSSSB8fCBQT1dFUlBDIHx8IE1JUFMpCiAJaGVscAogCSAgU2F5ICJ5ZXMiIGhlcmUgdG8gZ2V0IGRpcmVjdCBzdXBwb3J0IGZvciB0aGUgcmVhbCB0aW1lIGNsb2NrCiAJICBmb3VuZCBpbiBldmVyeSBQQyBvciBBQ1BJLWJhc2VkIHN5c3RlbSwgYW5kIHNvbWUgb3RoZXIgYm9hcmRzLgpAQCAtMzk3LDcgKzM5Nyw3IEBACiAKIGNvbmZpZyBSVENfRFJWX1JTNUMzMTMKIAl0cmlzdGF0ZSAiUmljb2ggUlM1QzMxMyIKLQlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBCUk9LRU4KKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTSF9MQU5ESVNLCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBSaWNvaCBSUzVDMzEzIFJUQyBjaGlwcy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXJzNWMzMTMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1yczVjMzEzLmMKaW5kZXggOWQ2ZGUzNy4uNjZlYjEzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXJzNWMzMTMuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtcnM1YzMxMy5jCkBAIC0xMjYsNyArMTI2LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHJzNWMzMTNfcmVhZF9kYXRhKHZvaWQpCiB7CiAJaW50IGk7Ci0JdW5zaWduZWQgY2hhciBkYXRhOworCXVuc2lnbmVkIGNoYXIgZGF0YSA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCW5kZWxheSg3MDApOwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJcmV0dXJuOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcnM1YzMxM19yZWFkX2NudHJlZyh1bnNpZ25lZCBjaGFyIGFkZHIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgcnM1YzMxM19yZWFkX2NudHJlZyh2b2lkKQogewogCXJldHVybiByczVjMzEzX3JlYWRfcmVnKFJTNUMzMTNfQUREUl9DTlRSRUcpOwogfQpAQCAtMjEyLDcgKzIxMiw5IEBACiBzdGF0aWMgaW50IHJzNWMzMTNfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCiB7CiAJaW50IGRhdGE7CisJaW50IGNudDsKIAorCWNudCA9IDA7CiAJd2hpbGUgKDEpIHsKIAkJUlM1QzMxM19DRUVOQUJMRTsJLyogQ0U6SCAqLwogCkBAIC0yMjUsNiArMjI3LDEwIEBACiAJCVJTNUMzMTNfQ0VESVNBQkxFOwogCQluZGVsYXkoNzAwKTsJLyogQ0U6TCAqLwogCisJCWlmIChjbnQrKyA+IDEwMCkgeworCQkJZGV2X2VycihkZXYsICIlczogdGltZW91dCBlcnJvclxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRUlPOworCQl9CiAJfQogCiAJZGF0YSA9IHJzNWMzMTNfcmVhZF9yZWcoUlM1QzMxM19BRERSX1NFQyk7CkBAIC0yNjYsNyArMjcyLDkgQEAKIHN0YXRpYyBpbnQgcnM1YzMxM19ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQogewogCWludCBkYXRhOworCWludCBjbnQ7CiAKKwljbnQgPSAwOwogCS8qIGJ1c3kgY2hlY2suICovCiAJd2hpbGUgKDEpIHsKIAkJUlM1QzMxM19DRUVOQUJMRTsJLyogQ0U6SCAqLwpAQCAtMjc5LDYgKzI4NywxMSBAQAogCQlSUzVDMzEzX01JU0NPUDsKIAkJUlM1QzMxM19DRURJU0FCTEU7CiAJCW5kZWxheSg3MDApOwkvKiBDRTpMICovCisKKwkJaWYgKGNudCsrID4gMTAwKSB7CisJCQlkZXZfZXJyKGRldiwgIiVzOiB0aW1lb3V0IGVycm9yXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FSU87CisJCX0KIAl9CiAKIAlkYXRhID0gQklOMkJDRCh0bS0+dG1fc2VjKTsKQEAgLTMxNyw2ICszMzAsNyBAQAogc3RhdGljIHZvaWQgcnM1YzMxM19jaGVja194c3RwX2JpdCh2b2lkKQogewogCXN0cnVjdCBydGNfdGltZSB0bTsKKwlpbnQgY250OwogCiAJUlM1QzMxM19DRUVOQUJMRTsJLyogQ0U6SCAqLwogCWlmIChyczVjMzEzX3JlYWRfY250cmVnKCkgJiBSUzVDMzEzX0NOVFJFR19XVEVOX1hTVFApIHsKQEAgLTMyNiwxMiArMzQwLDE2IEBACiAJCXJzNWMzMTNfd3JpdGVfY250cmVnKDB4MDcpOwogCiAJCS8qIGJ1c3kgY2hlY2suICovCi0JCXdoaWxlIChyczVjMzEzX3JlYWRfY250cmVnKCkgJiBSUzVDMzEzX0NOVFJFR19BREpfQlNZKQorCQlmb3IgKGNudCA9IDA7IGNudCA8IDEwMDsgY250KyspIHsKKwkJCWlmICghKHJzNWMzMTNfcmVhZF9jbnRyZWcoKSAmIFJTNUMzMTNfQ05UUkVHX0FESl9CU1kpKQorCQkJCWJyZWFrOwogCQkJUlM1QzMxM19NSVNDT1A7CisJCX0KIAogCQltZW1zZXQoJnRtLCAwLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CiAJCXRtLnRtX21kYXkgCT0gMTsKLQkJdG0udG1fbW9uIAk9IDE7CisJCXRtLnRtX21vbiAJPSAxIC0gMTsKKwkJdG0udG1feWVhciAJPSAyMDAwIC0gMTkwMDsKIAogCQlyczVjMzEzX3J0Y19zZXRfdGltZShOVUxMLCAmdG0pOwogCQlwcmludGsoS0VSTl9FUlIgIlJJQ0hPIFJTNUMzMTM6IGludmFsaWQgdmFsdWUsIHJlc2V0dGluZyB0byAiCkBAIC0zNTYsNyArMzc0LDcgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CiAKLQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCByczVjMzEzX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYwppbmRleCBmMmJlMmVhLi44MzI4YWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9lbnZjdHJsLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgRU5WQ1RSTF9NSU5PUgkxNjIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnaXdkOTMuYyBiL2RyaXZlcnMvc2NzaS9zZ2l3ZDkzLmMKaW5kZXggYTE1NzUyYi4uZWVmODI3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NnaXdkOTMuYworKysgYi9kcml2ZXJzL3Njc2kvc2dpd2Q5My5jCkBAIC02LDg3ICs2LDQ5IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTYgRGF2aWQgUy4gTWlsbGVyIChkbUBlbmdyLnNnaS5jb20pCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQW5kcmV3IFIuIEJha2VyIChhbmRyZXdiQHVhYi5lZHUpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgRmxvcmlhbiBMb2hvZmYgKGZsb0ByZmM4MjIub3JnKQotICogQ29weXJpZ2h0IChDKSAyMDAzIFJhbGYgQmFlY2hsZSAocmFsZkBsaW51eC1taXBzLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMDcgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQogICogCiAgKiAoSW4gYWxsIHRydXRoLCBKZWQgU2NoaW1tZWwgd3JvdGUgYWxsIHRoaXMgY29kZS4pCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorCisjdW5kZWYgREVCVUcKKwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCi0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9zZ2lhbGliLmg+Ci0jaW5jbHVkZSA8YXNtL3NnaS9zZ2kuaD4KLSNpbmNsdWRlIDxhc20vc2dpL21jLmg+CiAjaW5jbHVkZSA8YXNtL3NnaS9ocGMzLmg+CiAjaW5jbHVkZSA8YXNtL3NnaS9pcDIyLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvd2QuaD4KIAogI2luY2x1ZGUgInNjc2kuaCIKLSNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgIndkMzNjOTMuaCIKIAotI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KLQotI2lmIDAKLSNkZWZpbmUgRFBSSU5USyhhcmdzLi4uKQlwcmludGsoYXJncykKLSNlbHNlCi0jZGVmaW5lIERQUklOVEsoYXJncy4uLikKLSNlbmRpZgotCi0jZGVmaW5lIEhEQVRBKHB0cikgKChzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqKSgocHRyKS0+aG9zdGRhdGEpKQotCiBzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSB7CiAJc3RydWN0IFdEMzNDOTNfaG9zdGRhdGEgd2g7CiAJc3RydWN0IGhwY19kYXRhIHsKIAkJZG1hX2FkZHJfdCAgICAgIGRtYTsKLQkJdm9pZCAgICAgICAgICAgICogY3B1OworCQl2b2lkCQkqY3B1OwogCX0gaGQ7CiB9OwogCisjZGVmaW5lIGhvc3RfdG9faG9zdGRhdGEoaG9zdCkgKChzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqKSgoaG9zdCktPmhvc3RkYXRhKSkKKwogc3RydWN0IGhwY19jaHVuayB7CiAJc3RydWN0IGhwY19kbWFfZGVzYyBkZXNjOwogCXUzMiBfcGFkZGluZzsJLyogYWxpZ24gdG8gcXVhZHdvcmQgYm91bmRhcnkgKi8KIH07CiAKLXN0cnVjdCBTY3NpX0hvc3QgKnNnaXdkOTNfaG9zdDsKLXN0cnVjdCBTY3NpX0hvc3QgKnNnaXdkOTNfaG9zdDE7Ci0KLS8qIFd1ZmYgd3VmZiwgd3VmZiwgd2QzM2M5My5jLCB3dWZmIHd1ZmYsIG9iamVjdCBvcmllbnRlZCwgYm93IHdvdy4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV93ZDMzYzkzX2NvdW50KGNvbnN0IHdkMzNjOTNfcmVncyByZWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotCSpyZWdzLlNBU1IgPSBXRF9UUkFOU0ZFUl9DT1VOVF9NU0I7Ci0JbWIoKTsKLQkqcmVncy5TQ01EID0gKCh2YWx1ZSA+PiAxNikgJiAweGZmKTsKLQkqcmVncy5TQ01EID0gKCh2YWx1ZSA+PiAgOCkgJiAweGZmKTsKLQkqcmVncy5TQ01EID0gKCh2YWx1ZSA+PiAgMCkgJiAweGZmKTsKLQltYigpOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVhZF93ZDMzYzkzX2NvdW50KGNvbnN0IHdkMzNjOTNfcmVncyByZWdzKQotewotCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLQkqcmVncy5TQVNSID0gV0RfVFJBTlNGRVJfQ09VTlRfTVNCOwotCW1iKCk7Ci0JdmFsdWUgPSAgKCgqcmVncy5TQ01EICYgMHhmZikgPDwgMTYpOwotCXZhbHVlIHw9ICgoKnJlZ3MuU0NNRCAmIDB4ZmYpIDw8ICA4KTsKLQl2YWx1ZSB8PSAoKCpyZWdzLlNDTUQgJiAweGZmKSA8PCAgMCk7Ci0JbWIoKTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBzZ2l3ZDkzX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBTY3NpX0hvc3QgKiBob3N0ID0gKHN0cnVjdCBTY3NpX0hvc3QgKikgZGV2X2lkOworCXN0cnVjdCBTY3NpX0hvc3QgKiBob3N0ID0gZGV2X2lkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKQEAgLTEzMSwxMiArOTMsMTIgQEAKIAogc3RhdGljIGludCBkbWFfc2V0dXAoc3RydWN0IHNjc2lfY21uZCAqY21kLCBpbnQgZGF0YWlucCkKIHsKLQlzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqaGRhdGEgPSBIREFUQShjbWQtPmRldmljZS0+aG9zdCk7CisJc3RydWN0IGlwMjJfaG9zdGRhdGEgKmhkYXRhID0gaG9zdF90b19ob3N0ZGF0YShjbWQtPmRldmljZS0+aG9zdCk7CiAJc3RydWN0IGhwYzNfc2NzaXJlZ3MgKmhyZWdzID0KIAkJKHN0cnVjdCBocGMzX3Njc2lyZWdzICopIGNtZC0+ZGV2aWNlLT5ob3N0LT5iYXNlOwogCXN0cnVjdCBocGNfY2h1bmsgKmhjcCA9IChzdHJ1Y3QgaHBjX2NodW5rICopIGhkYXRhLT5oZC5jcHU7CiAKLQlEUFJJTlRLKCJkbWFfc2V0dXA6IGRhdGFpbnA8JWQ+IGhjcDwlcD4gIiwgZGF0YWlucCwgaGNwKTsKKwlwcl9kZWJ1ZygiZG1hX3NldHVwOiBkYXRhaW5wPCVkPiBoY3A8JXA+ICIsIGRhdGFpbnAsIGhjcCk7CiAKIAloZGF0YS0+d2guZG1hX2RpciA9IGRhdGFpbnA7CiAKQEAgLTE1MSw3ICsxMTMsNyBAQAogCiAJZmlsbF9ocGNfZW50cmllcyhoY3AsIGNtZCwgZGF0YWlucCk7CiAKLQlEUFJJTlRLKCIgSFBDR09cbiIpOworCXByX2RlYnVnKCIgSFBDR09cbiIpOwogCiAJLyogU3RhcnQgdXAgdGhlIEhQQy4gKi8KIAlocmVncy0+bmRwdHIgPSBoZGF0YS0+aGQuZG1hOwpAQCAtMTY2LDcgKzEyOCw3IEBACiBzdGF0aWMgdm9pZCBkbWFfc3RvcChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCiAJCSAgICAgaW50IHN0YXR1cykKIHsKLQlzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqaGRhdGEgPSBIREFUQShpbnN0YW5jZSk7CisJc3RydWN0IGlwMjJfaG9zdGRhdGEgKmhkYXRhID0gaG9zdF90b19ob3N0ZGF0YShpbnN0YW5jZSk7CiAJc3RydWN0IGhwYzNfc2NzaXJlZ3MgKmhyZWdzOwogCiAJaWYgKCFTQ3BudCkKQEAgLTE3NCw3ICsxMzYsNyBAQAogCiAJaHJlZ3MgPSAoc3RydWN0IGhwYzNfc2NzaXJlZ3MgKikgU0NwbnQtPmRldmljZS0+aG9zdC0+YmFzZTsKIAotCURQUklOVEsoImRtYV9zdG9wOiBzdGF0dXM8JWQ+ICIsIHN0YXR1cyk7CisJcHJfZGVidWcoImRtYV9zdG9wOiBzdGF0dXM8JWQ+ICIsIHN0YXR1cyk7CiAKIAkvKiBGaXJzdCBzdG9wIHRoZSBIUEMgYW5kIGZsdXNoIGl0J3MgRklGTy4gKi8KIAlpZiAoaGRhdGEtPndoLmRtYV9kaXIpIHsKQEAgLTE4Niw3ICsxNDgsNyBAQAogCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgU0NwbnQtPlNDcC5kbWFfaGFuZGxlLCBTQ3BudC0+U0NwLnRoaXNfcmVzaWR1YWwsCiAJICAgICAgICAgICAgICAgICBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pOwogCi0JRFBSSU5USygiXG4iKTsKKwlwcl9kZWJ1ZygiXG4iKTsKIH0KIAogdm9pZCBzZ2l3ZDkzX3Jlc2V0KHVuc2lnbmVkIGxvbmcgYmFzZSkKQEAgLTIxNiw5NiArMTc4LDYgQEAKIAloY3AtPmRlc2MucG5leHQgPSBoZC0+ZG1hOwogfQogCi1zdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqIF9faW5pdCBzZ2l3ZDkzX3NldHVwX3Njc2koCi0Jc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqU0dJYmxvd3MsIGludCB1bml0LCBpbnQgaXJxLAotCXN0cnVjdCBocGMzX3Njc2lyZWdzICpocmVncywgdW5zaWduZWQgY2hhciAqd2RyZWdzKQotewotCXN0cnVjdCBpcDIyX2hvc3RkYXRhICpoZGF0YTsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwotCXdkMzNjOTNfcmVncyByZWdzOwotCi0JaG9zdCA9IHNjc2lfcmVnaXN0ZXIoU0dJYmxvd3MsIHNpemVvZihzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSkpOwotCWlmICghaG9zdCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlob3N0LT5iYXNlID0gKHVuc2lnbmVkIGxvbmcpIGhyZWdzOwotCWhvc3QtPmlycSA9IGlycTsKLQotCWhkYXRhID0gSERBVEEoaG9zdCk7Ci0JaGRhdGEtPmhkLmNwdSA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBQQUdFX1NJWkUsICZoZGF0YS0+aGQuZG1hLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoZGF0YS0+aGQuY3B1KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInNnaXdkOTM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKLQkJICAgICAgICJob3N0ICVkIGJ1ZmZlci5cbiIsIHVuaXQpOwotCQlnb3RvIG91dF91bnJlZ2lzdGVyOwotCX0KLQlpbml0X2hwY19jaGFpbigmaGRhdGEtPmhkKTsKLQotCXJlZ3MuU0FTUiA9IHdkcmVncyArIDM7Ci0JcmVncy5TQ01EID0gd2RyZWdzICsgNzsKLQotCXdkMzNjOTNfaW5pdChob3N0LCByZWdzLCBkbWFfc2V0dXAsIGRtYV9zdG9wLCBXRDMzQzkzX0ZTX01IWigyMCkpOwotCi0JaWYgKGhkYXRhLT53aC5ub19zeW5jID09IDB4ZmYpCi0JCWhkYXRhLT53aC5ub19zeW5jID0gMDsKLQotCWlmIChyZXF1ZXN0X2lycShpcnEsIHNnaXdkOTNfaW50ciwgMCwgIlNHSSBXRDkzIiwgKHZvaWQgKikgaG9zdCkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2dpd2Q5MzogQ291bGQgbm90IHJlZ2lzdGVyIGlycSAlZCAiCi0JCSAgICAgICAiZm9yIGhvc3QgJWQuXG4iLCBpcnEsIHVuaXQpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQlyZXR1cm4gaG9zdDsKLQotb3V0X2ZyZWU6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgUEFHRV9TSVpFLCBoZGF0YS0+aGQuY3B1LCBoZGF0YS0+aGQuZG1hKTsKLQl3ZDMzYzkzX3JlbGVhc2UoKTsKLQotb3V0X3VucmVnaXN0ZXI6Ci0Jc2NzaV91bnJlZ2lzdGVyKGhvc3QpOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNnaXdkOTNfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKlNHSWJsb3dzKQotewotCWludCBmb3VuZCA9IDA7Ci0KLQlTR0libG93cy0+cHJvY19uYW1lID0gIlNHSVdEOTMiOwotCXNnaXdkOTNfaG9zdCA9IHNnaXdkOTNfc2V0dXBfc2NzaShTR0libG93cywgMCwgU0dJX1dEOTNfMF9JUlEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZocGMzYzAtPnNjc2lfY2hhbjAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaHBjM2MwLT5zY3NpMF9leHQpOwotCWlmIChzZ2l3ZDkzX2hvc3QpCi0JCWZvdW5kKys7Ci0KLQkvKiBTZXQgdXAgc2Vjb25kIGNvbnRyb2xsZXIgb24gdGhlIEluZGlnbzIgKi8KLQlpZiAoaXAyMl9pc19mdWxsaG91c2UoKSkgewotCQlzZ2l3ZDkzX2hvc3QxID0gc2dpd2Q5M19zZXR1cF9zY3NpKFNHSWJsb3dzLCAxLCBTR0lfV0Q5M18xX0lSUSwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAmaHBjM2MwLT5zY3NpX2NoYW4xLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopaHBjM2MwLT5zY3NpMV9leHQpOwotCQlpZiAoc2dpd2Q5M19ob3N0MSkKLQkJCWZvdW5kKys7Ci0JfQotCi0JcmV0dXJuIGZvdW5kOwotfQotCi1zdGF0aWMgaW50IHNnaXdkOTNfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKLXsKLQlzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqaGRhdGEgPSBIREFUQShpbnN0YW5jZSk7Ci0JaW50IGlycSA9IDA7Ci0KLQlpZiAoc2dpd2Q5M19ob3N0ICYmIHNnaXdkOTNfaG9zdCA9PSBpbnN0YW5jZSkKLQkJaXJxID0gU0dJX1dEOTNfMF9JUlE7Ci0JZWxzZSBpZiAoc2dpd2Q5M19ob3N0MSAmJiBzZ2l3ZDkzX2hvc3QxID09IGluc3RhbmNlKQotCQlpcnEgPSBTR0lfV0Q5M18xX0lSUTsKLQotCWZyZWVfaXJxKGlycSwgc2dpd2Q5M19pbnRyKTsKLQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBQQUdFX1NJWkUsIGhkYXRhLT5oZC5jcHUsIGhkYXRhLT5oZC5kbWEpOwotCXdkMzNjOTNfcmVsZWFzZSgpOwotCi0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbnQgc2dpd2Q5M19idXNfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCS8qIEZJWE1FIHBlcmZvcm0gYnVzLXNwZWNpZmljIHJlc2V0ICovCkBAIC0zMjUsMTEgKzE5NywxMCBAQAogICogYXJndW1lbnRzIG5vdCB3aXRoIHBvaW50ZXJzLiAgU28gdGhpcyBpcyBnb2luZyB0byBibG93IHVwIGJlYXV0eWZ1bGx5CiAgKiBvbiA2NC1iaXQgc3lzdGVtcyB3aXRoIG1lbW9yeSBvdXRzaWRlIHRoZSBjb21wYXQgYWRkcmVzcyBzcGFjZXMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHNnaXdkOTNfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCiAJLnByb2NfbmFtZQkJPSAiU0dJV0Q5MyIsCiAJLm5hbWUJCQk9ICJTR0kgV0Q5MyIsCi0JLmRldGVjdAkJCT0gc2dpd2Q5M19kZXRlY3QsCi0JLnJlbGVhc2UJCT0gc2dpd2Q5M19yZWxlYXNlLAogCS5xdWV1ZWNvbW1hbmQJCT0gd2QzM2M5M19xdWV1ZWNvbW1hbmQsCiAJLmVoX2Fib3J0X2hhbmRsZXIJPSB3ZDMzYzkzX2Fib3J0LAogCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IHNnaXdkOTNfYnVzX3Jlc2V0LApAQCAtMzQwLDQgKzIxMSwxMDkgQEAKIAkuY21kX3Blcl9sdW4JCT0gOCwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAogfTsKLSNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgorCitzdGF0aWMgaW50IF9faW5pdCBzZ2l3ZDkzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNnaXdkOTNfcGxhdGZvcm1fZGF0YSAqcGQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl1bnNpZ25lZCBjaGFyICp3ZHJlZ3MgPSBwZC0+d2RyZWdzOworCXN0cnVjdCBocGMzX3Njc2lyZWdzICpocmVncyA9IHBkLT5ocmVnczsKKwlzdHJ1Y3QgaXAyMl9ob3N0ZGF0YSAqaGRhdGE7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwl3ZDMzYzkzX3JlZ3MgcmVnczsKKwl1bnNpZ25lZCBpbnQgdW5pdCA9IHBkLT51bml0OworCXVuc2lnbmVkIGludCBpcnEgPSBwZC0+aXJxOworCWludCBlcnI7CisKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZzZ2l3ZDkzX3RlbXBsYXRlLCBzaXplb2Yoc3RydWN0IGlwMjJfaG9zdGRhdGEpKTsKKwlpZiAoIWhvc3QpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJaG9zdC0+YmFzZSA9ICh1bnNpZ25lZCBsb25nKSBocmVnczsKKwlob3N0LT5pcnEgPSBpcnE7CisKKwloZGF0YSA9IGhvc3RfdG9faG9zdGRhdGEoaG9zdCk7CisJaGRhdGEtPmhkLmNwdSA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBQQUdFX1NJWkUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGRhdGEtPmhkLmRtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZGF0YS0+aGQuY3B1KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNnaXdkOTM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yICIKKwkJICAgICAgICJob3N0ICVkIGJ1ZmZlci5cbiIsIHVuaXQpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF9wdXQ7CisJfQorCisJaW5pdF9ocGNfY2hhaW4oJmhkYXRhLT5oZCk7CisKKwlyZWdzLlNBU1IgPSB3ZHJlZ3MgKyAzOworCXJlZ3MuU0NNRCA9IHdkcmVncyArIDc7CisKKwl3ZDMzYzkzX2luaXQoaG9zdCwgcmVncywgZG1hX3NldHVwLCBkbWFfc3RvcCwgV0QzM0M5M19GU19NSFooMjApKTsKKworCWlmIChoZGF0YS0+d2gubm9fc3luYyA9PSAweGZmKQorCQloZGF0YS0+d2gubm9fc3luYyA9IDA7CisKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIHNnaXdkOTNfaW50ciwgMCwgIlNHSSBXRDkzIiwgaG9zdCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzZ2l3ZDkzOiBDb3VsZCBub3QgcmVnaXN0ZXIgaXJxICVkICIKKwkJICAgICAgICJmb3IgaG9zdCAlZC5cbiIsIGlycSwgdW5pdCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaG9zdCk7CisKKwllcnIgPSBzY3NpX2FkZF9ob3N0KGhvc3QsIE5VTEwpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2lycTsKKworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCisJcmV0dXJuIDA7CisKK291dF9pcnE6CisJZnJlZV9pcnEoaXJxLCBob3N0KTsKK291dF9mcmVlOgorCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIFBBR0VfU0laRSwgaGRhdGEtPmhkLmNwdSwgaGRhdGEtPmhkLmRtYSk7CitvdXRfcHV0OgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CitvdXQ6CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2dpd2Q5M19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGlwMjJfaG9zdGRhdGEgKmhkYXRhID0gKHN0cnVjdCBpcDIyX2hvc3RkYXRhICopIGhvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBzZ2l3ZDkzX3BsYXRmb3JtX2RhdGEgKnBkID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCWZyZWVfaXJxKHBkLT5pcnEsIGhvc3QpOworCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIFBBR0VfU0laRSwgaGRhdGEtPmhkLmNwdSwgaGRhdGEtPmhkLmRtYSk7CisJc2NzaV9ob3N0X3B1dChob3N0KTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2dpd2Q5M19kcml2ZXIgPSB7CisJLnByb2JlICA9IHNnaXdkOTNfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNnaXdkOTNfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSAgID0gInNnaXdkOTMiCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgc2dpd2Q5M19tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNnaXdkOTNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNnaXdkOTNfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNnaXdkOTNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc2dpd2Q5M19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChzZ2l3ZDkzX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTR0kgV0QzM0M5MyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlJhbGYgQmFlY2hsZSA8cmFsZkBsaW51eC1taXBzLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmluZGV4IDdjOWQzN2YuLjVlM2Y3NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtMTA3LDYgKzEwNywxMyBAQAogCSAgVGhpcyBlbmFibGVzIHVzaW5nIHRoZSBGcmVlc2NhbGUgaU1YIFNQSSBjb250cm9sbGVyIGluIG1hc3RlcgogCSAgbW9kZS4KIAorY29uZmlnIFNQSV9NUEM1Mnh4X1BTQworCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDNTJ4eCBQU0MgU1BJIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIFBQQ19NUEM1Mnh4ICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB1c2luZyB0aGUgRnJlZXNjYWxlIE1QQzUyeHggUHJvZ3JhbW1hYmxlIFNlcmlhbAorCSAgQ29udHJvbGxlciBpbiBtYXN0ZXIgU1BJIG1vZGUuCisKIGNvbmZpZyBTUElfTVBDODN4eAogCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBDODN4eCBTUEkgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgUFBDXzgzeHggJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9NYWtlZmlsZSBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCmluZGV4IDYyNGI2MzYuLjU3ODhkODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3BpL01ha2VmaWxlCkBAIC0xOSw2ICsxOSw3IEBACiBvYmotJChDT05GSUdfU1BJX0lNWCkJCQkrPSBzcGlfaW14Lm8KIG9iai0kKENPTkZJR19TUElfUFhBMlhYKQkJKz0gcHhhMnh4X3NwaS5vCiBvYmotJChDT05GSUdfU1BJX09NQVBfVVdJUkUpCQkrPSBvbWFwX3V3aXJlLm8KK29iai0kKENPTkZJR19TUElfTVBDNTJ4eF9QU0MpCQkrPSBtcGM1Mnh4X3BzY19zcGkubwogb2JqLSQoQ09ORklHX1NQSV9NUEM4M3h4KQkJKz0gc3BpX21wYzgzeHgubwogb2JqLSQoQ09ORklHX1NQSV9TM0MyNFhYX0dQSU8pCQkrPSBzcGlfczNjMjR4eF9ncGlvLm8KIG9iai0kKENPTkZJR19TUElfUzNDMjRYWCkJCSs9IHNwaV9zM2MyNHh4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jIGIvZHJpdmVycy9zcGkvbXBjNTJ4eF9wc2Nfc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyMzU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL21wYzUyeHhfcHNjX3NwaS5jCkBAIC0wLDAgKzEsNjU0IEBACisvKgorICogTVBDNTJ4eCBTUEMgaW4gU1BJIG1vZGUgZHJpdmVyLgorICoKKyAqIE1haW50YWluZXI6IERyYWdvcyBDYXJwCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRPUFRJQ0EgUGhvdG9uaWNzIEFHLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQorI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZnNsX2RldmljZXMuaD4KKworI2luY2x1ZGUgPGFzbS9tcGM1Mnh4Lmg+CisjaW5jbHVkZSA8YXNtL21wYzUyeHhfcHNjLmg+CisKKyNkZWZpbmUgTUNMSyAyMDAwMDAwMCAvKiBQU0MgcG9ydCBNQ2xrIGluIGh6ICovCisKK3N0cnVjdCBtcGM1Mnh4X3BzY19zcGkgeworCS8qIGZzbF9zcGlfcGxhdGZvcm0gZGF0YSAqLworCXZvaWQgKCphY3RpdmF0ZV9jcykodTgsIHU4KTsKKwl2b2lkICgqZGVhY3RpdmF0ZV9jcykodTgsIHU4KTsKKwl1MzIgc3lzY2xrOworCisJLyogZHJpdmVyIGludGVybmFsIGRhdGEgKi8KKwlzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjOworCXVuc2lnbmVkIGludCBpcnE7CisJdTggYml0c19wZXJfd29yZDsKKwl1OCBidXN5OworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisJc3BpbmxvY2tfdCBsb2NrOworCisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKK307CisKKy8qIGNvbnRyb2xsZXIgc3RhdGUgKi8KK3N0cnVjdCBtcGM1Mnh4X3BzY19zcGlfY3MgeworCWludCBiaXRzX3Blcl93b3JkOworCWludCBzcGVlZF9oejsKK307CisKKy8qIHNldCBjbG9jayBmcmVxLCBjbG9jayByYW1wLCBiaXRzIHBlciB3b3JrCisgKiBpZiB0IGlzIE5VTEwgdGhlbiByZXNldCB0aGUgdmFsdWVzIHRvIHRoZSBkZWZhdWx0IHZhbHVlcworICovCitzdGF0aWMgaW50IG1wYzUyeHhfcHNjX3NwaV90cmFuc2Zlcl9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCXN0cnVjdCBtcGM1Mnh4X3BzY19zcGlfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCisJY3MtPnNwZWVkX2h6ID0gKHQgJiYgdC0+c3BlZWRfaHopCisJCQk/IHQtPnNwZWVkX2h6IDogc3BpLT5tYXhfc3BlZWRfaHo7CisJY3MtPmJpdHNfcGVyX3dvcmQgPSAodCAmJiB0LT5iaXRzX3Blcl93b3JkKQorCQkJPyB0LT5iaXRzX3Blcl93b3JkIDogc3BpLT5iaXRzX3Blcl93b3JkOworCWNzLT5iaXRzX3Blcl93b3JkID0gKChjcy0+Yml0c19wZXJfd29yZCArIDcpIC8gOCkgKiA4OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtcGM1Mnh4X3BzY19zcGlfYWN0aXZhdGVfY3Moc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgbXBjNTJ4eF9wc2Nfc3BpX2NzICpjcyA9IHNwaS0+Y29udHJvbGxlcl9zdGF0ZTsKKwlzdHJ1Y3QgbXBjNTJ4eF9wc2Nfc3BpICptcHMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjID0gbXBzLT5wc2M7CisJdTMyIHNpY3I7CisJdTE2IGNjcjsKKworCXNpY3IgPSBpbl9iZTMyKCZwc2MtPnNpY3IpOworCisJLyogU2V0IGNsb2NrIHBoYXNlIGFuZCBwb2xhcml0eSAqLworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJc2ljciB8PSAweDAwMDAxMDAwOworCWVsc2UKKwkJc2ljciAmPSB+MHgwMDAwMTAwMDsKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0NQT0wpCisJCXNpY3IgfD0gMHgwMDAwMjAwMDsKKwllbHNlCisJCXNpY3IgJj0gfjB4MDAwMDIwMDA7CisKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkKKwkJc2ljciB8PSAweDEwMDAwMDAwOworCWVsc2UKKwkJc2ljciAmPSB+MHgxMDAwMDAwMDsKKwlvdXRfYmUzMigmcHNjLT5zaWNyLCBzaWNyKTsKKworCS8qIFNldCBjbG9jayBmcmVxdWVuY3kgYW5kIGJpdHMgcGVyIHdvcmQKKwkgKiBCZWNhdXNlIHBzYy0+Y2NyIGlzIGRlZmluZWQgYXMgMTZiaXQgcmVnaXN0ZXIgaW5zdGVhZCBvZiAzMmJpdAorCSAqIGp1c3Qgc2V0IHRoZSBsb3dlciBieXRlIG9mIEJpdENsa0RpdgorCSAqLworCWNjciA9IGluX2JlMTYoJnBzYy0+Y2NyKTsKKwljY3IgJj0gMHhGRjAwOworCWlmIChjcy0+c3BlZWRfaHopCisJCWNjciB8PSAoTUNMSyAvIGNzLT5zcGVlZF9oeiAtIDEpICYgMHhGRjsKKwllbHNlIC8qIGJ5IGRlZmF1bHQgU1BJIENsayAxTUh6ICovCisJCWNjciB8PSAoTUNMSyAvIDEwMDAwMDAgLSAxKSAmIDB4RkY7CisJb3V0X2JlMTYoJnBzYy0+Y2NyLCBjY3IpOworCW1wcy0+Yml0c19wZXJfd29yZCA9IGNzLT5iaXRzX3Blcl93b3JkOworCisJaWYgKG1wcy0+YWN0aXZhdGVfY3MpCisJCW1wcy0+YWN0aXZhdGVfY3Moc3BpLT5jaGlwX3NlbGVjdCwKKwkJCQkoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpID8gMSA6IDApOworfQorCitzdGF0aWMgdm9pZCBtcGM1Mnh4X3BzY19zcGlfZGVhY3RpdmF0ZV9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBtcGM1Mnh4X3BzY19zcGkgKm1wcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJaWYgKG1wcy0+ZGVhY3RpdmF0ZV9jcykKKwkJbXBzLT5kZWFjdGl2YXRlX2NzKHNwaS0+Y2hpcF9zZWxlY3QsCisJCQkJKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSA/IDEgOiAwKTsKK30KKworI2RlZmluZSBNUEM1Mnh4X1BTQ19CVUZTSVpFIChNUEM1Mnh4X1BTQ19SRk5VTV9NQVNLICsgMSkKKy8qIHdha2UgdXAgd2hlbiA4MCUgZmlmbyBmdWxsICovCisjZGVmaW5lIE1QQzUyeHhfUFNDX1JGQUxBUk0gKE1QQzUyeHhfUFNDX0JVRlNJWkUgKiAyMCAvIDEwMCkKKworc3RhdGljIGludCBtcGM1Mnh4X3BzY19zcGlfdHJhbnNmZXJfcnh0eChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwlzdHJ1Y3QgbXBjNTJ4eF9wc2Nfc3BpICptcHMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjID0gbXBzLT5wc2M7CisJdW5zaWduZWQgcmIgPSAwOwkvKiBudW1iZXIgb2YgYnl0ZXMgcmVjZWlldmVkICovCisJdW5zaWduZWQgc2IgPSAwOwkvKiBudW1iZXIgb2YgYnl0ZXMgc2VudCAqLworCXVuc2lnbmVkIGNoYXIgKnJ4X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopdC0+cnhfYnVmOworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZiA9ICh1bnNpZ25lZCBjaGFyICopdC0+dHhfYnVmOworCXVuc2lnbmVkIHJmYWxhcm07CisJdW5zaWduZWQgc2VuZF9hdF9vbmNlID0gTVBDNTJ4eF9QU0NfQlVGU0laRTsKKwl1bnNpZ25lZCByZWN2X2F0X29uY2U7CisJdW5zaWduZWQgYnB3ID0gbXBzLT5iaXRzX3Blcl93b3JkIC8gODsKKworCWlmICghdC0+dHhfYnVmICYmICF0LT5yeF9idWYgJiYgdC0+bGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGVuYWJsZSB0cmFuc21pdGVyL3JlY2VpdmVyICovCisJb3V0XzgoJnBzYy0+Y29tbWFuZCwgTVBDNTJ4eF9QU0NfVFhfRU5BQkxFIHwgTVBDNTJ4eF9QU0NfUlhfRU5BQkxFKTsKKwl3aGlsZSAocmIgPCB0LT5sZW4pIHsKKwkJaWYgKHQtPmxlbiAtIHJiID4gTVBDNTJ4eF9QU0NfQlVGU0laRSkgeworCQkJcmZhbGFybSA9IE1QQzUyeHhfUFNDX1JGQUxBUk07CisJCX0gZWxzZSB7CisJCQlzZW5kX2F0X29uY2UgPSB0LT5sZW4gLSBzYjsKKwkJCXJmYWxhcm0gPSBNUEM1Mnh4X1BTQ19CVUZTSVpFIC0gKHQtPmxlbiAtIHJiKTsKKwkJfQorCisJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2VuZCAlZCBieXRlcy4uLlxuIiwgc2VuZF9hdF9vbmNlKTsKKwkJaWYgKHR4X2J1ZikgeworCQkJZm9yICg7IHNlbmRfYXRfb25jZTsgc2IrKywgc2VuZF9hdF9vbmNlLS0pIHsKKwkJCQkvKiBzZXQgRU9GIGZsYWcgKi8KKwkJCQlpZiAobXBzLT5iaXRzX3Blcl93b3JkCisJCQkJCQkmJiAoc2IgKyAxKSAlIGJwdyA9PSAwKQorCQkJCQlvdXRfOCgmcHNjLT5pcmNyMiwgMHgwMSk7CisJCQkJb3V0XzgoJnBzYy0+bXBjNTJ4eF9wc2NfYnVmZmVyXzgsIHR4X2J1ZltzYl0pOworCQkJfQorCQl9IGVsc2UgeworCQkJZm9yICg7IHNlbmRfYXRfb25jZTsgc2IrKywgc2VuZF9hdF9vbmNlLS0pIHsKKwkJCQkvKiBzZXQgRU9GIGZsYWcgKi8KKwkJCQlpZiAobXBzLT5iaXRzX3Blcl93b3JkCisJCQkJCQkmJiAoKHNiICsgMSkgJSBicHcpID09IDApCisJCQkJCW91dF84KCZwc2MtPmlyY3IyLCAweDAxKTsKKwkJCQlvdXRfOCgmcHNjLT5tcGM1Mnh4X3BzY19idWZmZXJfOCwgMCk7CisJCQl9CisJCX0KKworCisJCS8qIGVuYWJsZSBpbnRlcnVwdHMgYW5kIHdhaXQgZm9yIHdha2UgdXAKKwkJICogaWYganVzdCBvbmUgYnl0ZSBpcyBleHBlY3RlZCB0aGUgUnggRklGTyBnZW5lcmVyYXRlcyBubworCQkgKiBGRlVMTCBpbnRlcnJ1cHQsIHNvIGFjdGl2YXRlIHRoZSBSeFJEWSBpbnRlcnJ1cHQKKwkJICovCisJCW91dF84KCZwc2MtPmNvbW1hbmQsIE1QQzUyeHhfUFNDX1NFTF9NT0RFX1JFR18xKTsKKwkJaWYgKHQtPmxlbiAtIHJiID09IDEpIHsKKwkJCW91dF84KCZwc2MtPm1vZGUsIDApOworCQl9IGVsc2UgeworCQkJb3V0XzgoJnBzYy0+bW9kZSwgTVBDNTJ4eF9QU0NfTU9ERV9GRlVMTCk7CisJCQlvdXRfYmUxNigmcHNjLT5yZmFsYXJtLCByZmFsYXJtKTsKKwkJfQorCQlvdXRfYmUxNigmcHNjLT5tcGM1Mnh4X3BzY19pbXIsIE1QQzUyeHhfUFNDX0lNUl9SWFJEWSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJm1wcy0+ZG9uZSk7CisJCXJlY3ZfYXRfb25jZSA9IGluX2JlMTYoJnBzYy0+cmZudW0pOworCQlkZXZfZGJnKCZzcGktPmRldiwgIiVkIGJ5dGVzIHJlY2VpdmVkXG4iLCByZWN2X2F0X29uY2UpOworCisJCXNlbmRfYXRfb25jZSA9IHJlY3ZfYXRfb25jZTsKKwkJaWYgKHJ4X2J1ZikgeworCQkJZm9yICg7IHJlY3ZfYXRfb25jZTsgcmIrKywgcmVjdl9hdF9vbmNlLS0pCisJCQkJcnhfYnVmW3JiXSA9IGluXzgoJnBzYy0+bXBjNTJ4eF9wc2NfYnVmZmVyXzgpOworCQl9IGVsc2UgeworCQkJZm9yICg7IHJlY3ZfYXRfb25jZTsgcmIrKywgcmVjdl9hdF9vbmNlLS0pCisJCQkJaW5fOCgmcHNjLT5tcGM1Mnh4X3BzY19idWZmZXJfOCk7CisJCX0KKwl9CisJLyogZGlzYWJsZSB0cmFuc21pdGVyL3JlY2VpdmVyICovCisJb3V0XzgoJnBzYy0+Y29tbWFuZCwgTVBDNTJ4eF9QU0NfVFhfRElTQUJMRSB8IE1QQzUyeHhfUFNDX1JYX0RJU0FCTEUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1wYzUyeHhfcHNjX3NwaV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbXBjNTJ4eF9wc2Nfc3BpICptcHMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1wYzUyeHhfcHNjX3NwaSwgd29yayk7CisKKwlzcGluX2xvY2tfaXJxKCZtcHMtPmxvY2spOworCW1wcy0+YnVzeSA9IDE7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZtcHMtPnF1ZXVlKSkgeworCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm07CisJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CisJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnQgPSBOVUxMOworCQl1bnNpZ25lZCBjc19jaGFuZ2U7CisJCWludCBzdGF0dXM7CisKKwkJbSA9IGNvbnRhaW5lcl9vZihtcHMtPnF1ZXVlLm5leHQsIHN0cnVjdCBzcGlfbWVzc2FnZSwgcXVldWUpOworCQlsaXN0X2RlbF9pbml0KCZtLT5xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycSgmbXBzLT5sb2NrKTsKKworCQlzcGkgPSBtLT5zcGk7CisJCWNzX2NoYW5nZSA9IDE7CisJCXN0YXR1cyA9IDA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkgKHQsICZtLT50cmFuc2ZlcnMsIHRyYW5zZmVyX2xpc3QpIHsKKwkJCWlmICh0LT5iaXRzX3Blcl93b3JkIHx8IHQtPnNwZWVkX2h6KSB7CisJCQkJc3RhdHVzID0gbXBjNTJ4eF9wc2Nfc3BpX3RyYW5zZmVyX3NldHVwKHNwaSwgdCk7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoY3NfY2hhbmdlKQorCQkJCW1wYzUyeHhfcHNjX3NwaV9hY3RpdmF0ZV9jcyhzcGkpOworCQkJY3NfY2hhbmdlID0gdC0+Y3NfY2hhbmdlOworCisJCQlzdGF0dXMgPSBtcGM1Mnh4X3BzY19zcGlfdHJhbnNmZXJfcnh0eChzcGksIHQpOworCQkJaWYgKHN0YXR1cykKKwkJCQlicmVhazsKKwkJCW0tPmFjdHVhbF9sZW5ndGggKz0gdC0+bGVuOworCisJCQlpZiAodC0+ZGVsYXlfdXNlY3MpCisJCQkJdWRlbGF5KHQtPmRlbGF5X3VzZWNzKTsKKworCQkJaWYgKGNzX2NoYW5nZSkKKwkJCQltcGM1Mnh4X3BzY19zcGlfZGVhY3RpdmF0ZV9jcyhzcGkpOworCQl9CisKKwkJbS0+c3RhdHVzID0gc3RhdHVzOworCQltLT5jb21wbGV0ZShtLT5jb250ZXh0KTsKKworCQlpZiAoc3RhdHVzIHx8ICFjc19jaGFuZ2UpCisJCQltcGM1Mnh4X3BzY19zcGlfZGVhY3RpdmF0ZV9jcyhzcGkpOworCisJCW1wYzUyeHhfcHNjX3NwaV90cmFuc2Zlcl9zZXR1cChzcGksIE5VTEwpOworCisJCXNwaW5fbG9ja19pcnEoJm1wcy0+bG9jayk7CisJfQorCW1wcy0+YnVzeSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZtcHMtPmxvY2spOworfQorCitzdGF0aWMgaW50IG1wYzUyeHhfcHNjX3NwaV9zZXR1cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBtcGM1Mnh4X3BzY19zcGkgKm1wcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXN0cnVjdCBtcGM1Mnh4X3BzY19zcGlfY3MgKmNzID0gc3BpLT5jb250cm9sbGVyX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc3BpLT5iaXRzX3Blcl93b3JkJTgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFjcykgeworCQljcyA9IGt6YWxsb2Moc2l6ZW9mICpjcywgR0ZQX0tFUk5FTCk7CisJCWlmICghY3MpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc3BpLT5jb250cm9sbGVyX3N0YXRlID0gY3M7CisJfQorCisJY3MtPmJpdHNfcGVyX3dvcmQgPSBzcGktPmJpdHNfcGVyX3dvcmQ7CisJY3MtPnNwZWVkX2h6ID0gc3BpLT5tYXhfc3BlZWRfaHo7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXBzLT5sb2NrLCBmbGFncyk7CisJaWYgKCFtcHMtPmJ1c3kpCisJCW1wYzUyeHhfcHNjX3NwaV9kZWFjdGl2YXRlX2NzKHNwaSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXBzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGM1Mnh4X3BzY19zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJc3RydWN0IHNwaV9tZXNzYWdlICptKQoreworCXN0cnVjdCBtcGM1Mnh4X3BzY19zcGkgKm1wcyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwltLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXBzLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbS0+cXVldWUsICZtcHMtPnF1ZXVlKTsKKwlxdWV1ZV93b3JrKG1wcy0+d29ya3F1ZXVlLCAmbXBzLT53b3JrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcHMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtcGM1Mnh4X3BzY19zcGlfY2xlYW51cChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWtmcmVlKHNwaS0+Y29udHJvbGxlcl9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgbXBjNTJ4eF9wc2Nfc3BpX3BvcnRfY29uZmlnKGludCBwc2NfaWQsIHN0cnVjdCBtcGM1Mnh4X3BzY19zcGkgKm1wcykKK3sKKwlzdHJ1Y3QgbXBjNTJ4eF9jZG0gX19pb21lbSAqY2RtOworCXN0cnVjdCBtcGM1Mnh4X2dwaW8gX19pb21lbSAqZ3BpbzsKKwlzdHJ1Y3QgbXBjNTJ4eF9wc2MgX19pb21lbSAqcHNjID0gbXBzLT5wc2M7CisJdTMyIHVsOworCXUzMiBtY2xrZW5fZGl2OworCWludCByZXQgPSAwOworCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX01FUkdFKQorCWNkbSA9IG1wYzUyeHhfZmluZF9hbmRfbWFwKCJtcGM1Mnh4LWNkbSIpOworCWdwaW8gPSBtcGM1Mnh4X2ZpbmRfYW5kX21hcCgibXBjNTJ4eC1ncGlvIik7CisjZWxzZQorCWNkbSA9IGlvcmVtYXAoTVBDNTJ4eF9QQShNUEM1Mnh4X0NETV9PRkZTRVQpLCBNUEM1Mnh4X0NETV9TSVpFKTsKKwlncGlvID0gaW9yZW1hcChNUEM1Mnh4X1BBKE1QQzUyeHhfR1BJT19PRkZTRVQpLCBNUEM1Mnh4X0dQSU9fU0laRSk7CisjZW5kaWYKKwlpZiAoIWNkbSB8fCAhZ3BpbykgeworCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIG1hcHBpbmcgQ0RNL0dQSU9cbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIHVubWFwX3JlZ3M7CisJfQorCisJLyogZGVmYXVsdCBzeXNjbGsgaXMgNTEyTUh6ICovCisJbWNsa2VuX2RpdiA9IDB4ODAwMCB8CisJCSgoKG1wcy0+c3lzY2xrID8gbXBzLT5zeXNjbGsgOiA1MTIwMDAwMDApIC8gTUNMSykgJiAweDFGRik7CisKKwlzd2l0Y2ggKHBzY19pZCkgeworCWNhc2UgMToKKwkJdWwgPSBpbl9iZTMyKCZncGlvLT5wb3J0X2NvbmZpZyk7CisJCXVsICY9IDB4RkZGRkZGRjg7CisJCXVsIHw9IDB4MDAwMDAwMDY7CisJCW91dF9iZTMyKCZncGlvLT5wb3J0X2NvbmZpZywgdWwpOworCQlvdXRfYmUxNigmY2RtLT5tY2xrZW5fZGl2X3BzYzEsIG1jbGtlbl9kaXYpOworCQl1bCA9IGluX2JlMzIoJmNkbS0+Y2xrX2VuYWJsZXMpOworCQl1bCB8PSAweDAwMDAwMDIwOworCQlvdXRfYmUzMigmY2RtLT5jbGtfZW5hYmxlcywgdWwpOworCQlicmVhazsKKwljYXNlIDI6CisJCXVsID0gaW5fYmUzMigmZ3Bpby0+cG9ydF9jb25maWcpOworCQl1bCAmPSAweEZGRkZGRjhGOworCQl1bCB8PSAweDAwMDAwMDYwOworCQlvdXRfYmUzMigmZ3Bpby0+cG9ydF9jb25maWcsIHVsKTsKKwkJb3V0X2JlMTYoJmNkbS0+bWNsa2VuX2Rpdl9wc2MyLCBtY2xrZW5fZGl2KTsKKwkJdWwgPSBpbl9iZTMyKCZjZG0tPmNsa19lbmFibGVzKTsKKwkJdWwgfD0gMHgwMDAwMDA0MDsKKwkJb3V0X2JlMzIoJmNkbS0+Y2xrX2VuYWJsZXMsIHVsKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl1bCA9IGluX2JlMzIoJmdwaW8tPnBvcnRfY29uZmlnKTsKKwkJdWwgJj0gMHhGRkZGRjBGRjsKKwkJdWwgfD0gMHgwMDAwMDYwMDsKKwkJb3V0X2JlMzIoJmdwaW8tPnBvcnRfY29uZmlnLCB1bCk7CisJCW91dF9iZTE2KCZjZG0tPm1jbGtlbl9kaXZfcHNjMywgbWNsa2VuX2Rpdik7CisJCXVsID0gaW5fYmUzMigmY2RtLT5jbGtfZW5hYmxlcyk7CisJCXVsIHw9IDB4MDAwMDAwODA7CisJCW91dF9iZTMyKCZjZG0tPmNsa19lbmFibGVzLCB1bCk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJdWwgPSBpbl9iZTMyKCZncGlvLT5wb3J0X2NvbmZpZyk7CisJCXVsICY9IDB4RkY4RkZGRkY7CisJCXVsIHw9IDB4MDA3MDAwMDA7CisJCW91dF9iZTMyKCZncGlvLT5wb3J0X2NvbmZpZywgdWwpOworCQlvdXRfYmUxNigmY2RtLT5tY2xrZW5fZGl2X3BzYzYsIG1jbGtlbl9kaXYpOworCQl1bCA9IGluX2JlMzIoJmNkbS0+Y2xrX2VuYWJsZXMpOworCQl1bCB8PSAweDAwMDAwMDEwOworCQlvdXRfYmUzMigmY2RtLT5jbGtfZW5hYmxlcywgdWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubWFwX3JlZ3M7CisJfQorCisJLyogUmVzZXQgdGhlIFBTQyBpbnRvIGEga25vd24gc3RhdGUgKi8KKwlvdXRfOCgmcHNjLT5jb21tYW5kLCBNUEM1Mnh4X1BTQ19SU1RfUlgpOworCW91dF84KCZwc2MtPmNvbW1hbmQsIE1QQzUyeHhfUFNDX1JTVF9UWCk7CisJb3V0XzgoJnBzYy0+Y29tbWFuZCwgTVBDNTJ4eF9QU0NfVFhfRElTQUJMRSB8IE1QQzUyeHhfUFNDX1JYX0RJU0FCTEUpOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzLCBpbnRlcnJ1cHRzIGFyZSBiYXNlZCBvbiBhbGFybSBsZXZlbCAqLworCW91dF9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX2ltciwgMCk7CisJb3V0XzgoJnBzYy0+Y29tbWFuZCwgTVBDNTJ4eF9QU0NfU0VMX01PREVfUkVHXzEpOworCW91dF84KCZwc2MtPnJmY250bCwgMCk7CisJb3V0XzgoJnBzYy0+bW9kZSwgTVBDNTJ4eF9QU0NfTU9ERV9GRlVMTCk7CisKKwkvKiBDb25maWd1cmUgOGJpdCBjb2RlYyBtb2RlIGFzIGEgU1BJIG1hc3RlciBhbmQgdXNlIEVPRiBmbGFncyAqLworCS8qIFNJQ1JfU0lNX0NPREVDOHxTSUNSX0dFTkNMS3xTSUNSX1NQSXxTSUNSX01TVFJ8U0lDUl9VU0VFT0YgKi8KKwlvdXRfYmUzMigmcHNjLT5zaWNyLCAweDAxODBDODAwKTsKKwlvdXRfYmUxNigmcHNjLT5jY3IsIDB4MDcwRik7IC8qIGJ5IGRlZmF1bHQgU1BJIENsayAxTUh6ICovCisKKwkvKiBTZXQgMm1zIERUTCBkZWxheSAqLworCW91dF84KCZwc2MtPmN0dXIsIDB4MDApOworCW91dF84KCZwc2MtPmN0bHIsIDB4ODQpOworCisJbXBzLT5iaXRzX3Blcl93b3JkID0gODsKKwordW5tYXBfcmVnczoKKwlpZiAoY2RtKQorCQlpb3VubWFwKGNkbSk7CisJaWYgKGdwaW8pCisJCWlvdW5tYXAoZ3Bpbyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXBjNTJ4eF9wc2Nfc3BpX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG1wYzUyeHhfcHNjX3NwaSAqbXBzID0gKHN0cnVjdCBtcGM1Mnh4X3BzY19zcGkgKilkZXZfaWQ7CisJc3RydWN0IG1wYzUyeHhfcHNjIF9faW9tZW0gKnBzYyA9IG1wcy0+cHNjOworCisJLyogZGlzYWJsZSBpbnRlcnJ1cHQgYW5kIHdha2UgdXAgdGhlIHdvcmsgcXVldWUgKi8KKwlpZiAoaW5fYmUxNigmcHNjLT5tcGM1Mnh4X3BzY19pc3IpICYgTVBDNTJ4eF9QU0NfSU1SX1JYUkRZKSB7CisJCW91dF9iZTE2KCZwc2MtPm1wYzUyeHhfcHNjX2ltciwgMCk7CisJCWNvbXBsZXRlKCZtcHMtPmRvbmUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCXJldHVybiBJUlFfTk9ORTsKK30KKworLyogYnVzX251bSBpcyB1c2VkIG9ubHkgZm9yIHRoZSBjYXNlIGRldi0+cGxhdGZvcm1fZGF0YSA9PSBOVUxMICovCitzdGF0aWMgaW50IF9faW5pdCBtcGM1Mnh4X3BzY19zcGlfZG9fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVnYWRkciwKKwkJCQl1MzIgc2l6ZSwgdW5zaWduZWQgaW50IGlycSwgczE2IGJ1c19udW0pCit7CisJc3RydWN0IGZzbF9zcGlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IG1wYzUyeHhfcHNjX3NwaSAqbXBzOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJaW50IHJldDsKKworCWlmIChwZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2YgKm1wcyk7CisJaWYgKG1hc3RlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG1hc3Rlcik7CisJbXBzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJbXBzLT5pcnEgPSBpcnE7CisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJZGV2X3dhcm4oZGV2LCAicHJvYmUgY2FsbGVkIHdpdGhvdXQgcGxhdGZvcm0gZGF0YSwgbm8gIgorCQkJCSIoZGUpYWN0aXZhdGVfY3MgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWRcbiIpOworCQltcHMtPmFjdGl2YXRlX2NzID0gTlVMTDsKKwkJbXBzLT5kZWFjdGl2YXRlX2NzID0gTlVMTDsKKwkJbXBzLT5zeXNjbGsgPSAwOworCQltYXN0ZXItPmJ1c19udW0gPSBidXNfbnVtOworCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMjU1OworCX0gZWxzZSB7CisJCW1wcy0+YWN0aXZhdGVfY3MgPSBwZGF0YS0+YWN0aXZhdGVfY3M7CisJCW1wcy0+ZGVhY3RpdmF0ZV9jcyA9IHBkYXRhLT5kZWFjdGl2YXRlX2NzOworCQltcHMtPnN5c2NsayA9IHBkYXRhLT5zeXNjbGs7CisJCW1hc3Rlci0+YnVzX251bSA9IHBkYXRhLT5idXNfbnVtOworCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gcGRhdGEtPm1heF9jaGlwc2VsZWN0OworCX0KKwltYXN0ZXItPnNldHVwID0gbXBjNTJ4eF9wc2Nfc3BpX3NldHVwOworCW1hc3Rlci0+dHJhbnNmZXIgPSBtcGM1Mnh4X3BzY19zcGlfdHJhbnNmZXI7CisJbWFzdGVyLT5jbGVhbnVwID0gbXBjNTJ4eF9wc2Nfc3BpX2NsZWFudXA7CisKKwltcHMtPnBzYyA9IGlvcmVtYXAocmVnYWRkciwgc2l6ZSk7CisJaWYgKCFtcHMtPnBzYykgeworCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBpb3JlbWFwIEkvTyBwb3J0IHJhbmdlXG4iKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBmcmVlX21hc3RlcjsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShtcHMtPmlycSwgbXBjNTJ4eF9wc2Nfc3BpX2lzciwgMCwgIm1wYzUyeHgtcHNjLXNwaSIsCisJCQkJbXBzKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfbWFzdGVyOworCisJcmV0ID0gbXBjNTJ4eF9wc2Nfc3BpX3BvcnRfY29uZmlnKG1hc3Rlci0+YnVzX251bSwgbXBzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBmcmVlX2lycTsKKworCXNwaW5fbG9ja19pbml0KCZtcHMtPmxvY2spOworCWluaXRfY29tcGxldGlvbigmbXBzLT5kb25lKTsKKwlJTklUX1dPUksoJm1wcy0+d29yaywgbXBjNTJ4eF9wc2Nfc3BpX3dvcmspOworCUlOSVRfTElTVF9IRUFEKCZtcHMtPnF1ZXVlKTsKKworCW1wcy0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoCisJCW1hc3Rlci0+Y2Rldi5kZXYtPmJ1c19pZCk7CisJaWYgKG1wcy0+d29ya3F1ZXVlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGZyZWVfaXJxOworCX0KKworCXJldCA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB1bnJlZ19tYXN0ZXI7CisKKwlyZXR1cm4gcmV0OworCit1bnJlZ19tYXN0ZXI6CisJZGVzdHJveV93b3JrcXVldWUobXBzLT53b3JrcXVldWUpOworZnJlZV9pcnE6CisJZnJlZV9pcnEobXBzLT5pcnEsIG1wcyk7CitmcmVlX21hc3RlcjoKKwlpZiAobXBzLT5wc2MpCisJCWlvdW5tYXAobXBzLT5wc2MpOworCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBtcGM1Mnh4X3BzY19zcGlfZG9fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG1wYzUyeHhfcHNjX3NwaSAqbXBzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJZmx1c2hfd29ya3F1ZXVlKG1wcy0+d29ya3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtcHMtPndvcmtxdWV1ZSk7CisJc3BpX3VucmVnaXN0ZXJfbWFzdGVyKG1hc3Rlcik7CisJZnJlZV9pcnEobXBzLT5pcnEsIG1wcyk7CisJaWYgKG1wcy0+cHNjKQorCQlpb3VubWFwKG1wcy0+cHNjKTsKKworCXJldHVybiAwOworfQorCisjaWYgIWRlZmluZWQoQ09ORklHX1BQQ19NRVJHRSkKK3N0YXRpYyBpbnQgX19pbml0IG1wYzUyeHhfcHNjX3NwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3dpdGNoKGRldi0+aWQpIHsKKwljYXNlIDE6CisJY2FzZSAyOgorCWNhc2UgMzoKKwljYXNlIDY6CisJCXJldHVybiBtcGM1Mnh4X3BzY19zcGlfZG9fcHJvYmUoJmRldi0+ZGV2LAorCQkJTVBDNTJ4eF9QQShNUEM1Mnh4X1BTQ3hfT0ZGU0VUKGRldi0+aWQpKSwKKwkJCU1QQzUyeHhfUFNDX1NJWkUsIHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKSwgZGV2LT5pZCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IF9fZXhpdCBtcGM1Mnh4X3BzY19zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbXBjNTJ4eF9wc2Nfc3BpX2RvX3JlbW92ZSgmZGV2LT5kZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtcGM1Mnh4X3BzY19zcGlfcGxhdGZvcm1fZHJpdmVyID0geworCS5yZW1vdmUgPSBfX2V4aXRfcChtcGM1Mnh4X3BzY19zcGlfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtcGM1Mnh4LXBzYy1zcGkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXBjNTJ4eF9wc2Nfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZtcGM1Mnh4X3BzY19zcGlfcGxhdGZvcm1fZHJpdmVyLAorCQkJbXBjNTJ4eF9wc2Nfc3BpX3Byb2JlKTsKK30KK21vZHVsZV9pbml0KG1wYzUyeHhfcHNjX3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1wYzUyeHhfcHNjX3NwaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1wYzUyeHhfcHNjX3NwaV9wbGF0Zm9ybV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobXBjNTJ4eF9wc2Nfc3BpX2V4aXQpOworCisjZWxzZQkvKiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpICovCisKK3N0YXRpYyBpbnQgX19pbml0IG1wYzUyeHhfcHNjX3NwaV9vZl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpvcCwKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwljb25zdCB1MzIgKnJlZ2FkZHJfcDsKKwl1NjQgcmVnYWRkcjY0LCBzaXplNjQ7CisJczE2IGlkID0gLTE7CisKKwlyZWdhZGRyX3AgPSBvZl9nZXRfYWRkcmVzcyhvcC0+bm9kZSwgMCwgJnNpemU2NCwgTlVMTCk7CisJaWYgKCFyZWdhZGRyX3ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIFBTQyBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJlZ2FkZHI2NCA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKG9wLT5ub2RlLCByZWdhZGRyX3ApOworCisJaWYgKG9wLT5kZXYucGxhdGZvcm1fZGF0YSA9PSBOVUxMKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJCWludCBpID0gMDsKKworCQlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJzcGkiKSB7CisJCQlpZiAob2ZfZmluZF9kZXZpY2VfYnlfbm9kZShucCkgPT0gb3ApIHsKKwkJCQlpZCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpKys7CisJCX0KKwl9CisKKwlyZXR1cm4gbXBjNTJ4eF9wc2Nfc3BpX2RvX3Byb2JlKCZvcC0+ZGV2LCAodTMyKXJlZ2FkZHI2NCwgKHUzMilzaXplNjQsCisJCQkJCWlycV9vZl9wYXJzZV9hbmRfbWFwKG9wLT5ub2RlLCAwKSwgaWQpOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBtcGM1Mnh4X3BzY19zcGlfb2ZfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKm9wKQoreworCXJldHVybiBtcGM1Mnh4X3BzY19zcGlfZG9fcmVtb3ZlKCZvcC0+ZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjNTJ4eF9wc2Nfc3BpX29mX21hdGNoW10gPSB7CisJeyAudHlwZSA9ICJzcGkiLCAuY29tcGF0aWJsZSA9ICJtcGM1Mnh4LXBzYy1zcGkiLCB9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXBjNTJ4eF9wc2Nfc3BpX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgbXBjNTJ4eF9wc2Nfc3BpX29mX2RyaXZlciA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubmFtZSA9ICJtcGM1Mnh4LXBzYy1zcGkiLAorCS5tYXRjaF90YWJsZSA9IG1wYzUyeHhfcHNjX3NwaV9vZl9tYXRjaCwKKwkucHJvYmUgPSBtcGM1Mnh4X3BzY19zcGlfb2ZfcHJvYmUsCisJLnJlbW92ZSA9IF9fZXhpdF9wKG1wYzUyeHhfcHNjX3NwaV9vZl9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1wYzUyeHgtcHNjLXNwaSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtcGM1Mnh4X3BzY19zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBvZl9yZWdpc3Rlcl9wbGF0Zm9ybV9kcml2ZXIoJm1wYzUyeHhfcHNjX3NwaV9vZl9kcml2ZXIpOworfQorbW9kdWxlX2luaXQobXBjNTJ4eF9wc2Nfc3BpX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXBjNTJ4eF9wc2Nfc3BpX2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX3BsYXRmb3JtX2RyaXZlcigmbXBjNTJ4eF9wc2Nfc3BpX29mX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtcGM1Mnh4X3BzY19zcGlfZXhpdCk7CisKKyNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR19QUENfTUVSR0UpICovCisKK01PRFVMRV9BVVRIT1IoIkRyYWdvcyBDYXJwIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1QQzUyeHggUFNDIFNQSSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwppbmRleCBmNTQ0Mzg4Li5lZWJjYjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9LY29uZmlnCkBAIC03NDgsNiArNzQ4LDIyIEBACiAJICB3b3JraW5nIHdpdGggUzFEMTM4MDYpLiBQcm9kdWN0IHNwZWNzIGF0CiAJICA8aHR0cDovL3d3dy5lcmQuZXBzb24uY29tL3ZkYy9odG1sL2xlZ2FjeV8xM3h4eC5odG0+CiAKK2NvbmZpZyBGQl9BVE1FTAorCXRyaXN0YXRlICJBVDkxL0FUMzIgTENEIENvbnRyb2xsZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZCICYmIChBUkNIX0FUOTFTQU05MjYxIHx8IEFSQ0hfQVQ5MVNBTTkyNjMgfHwgQVZSMzIpCisJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAorCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKKwlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQVQ5MS9BVDMyIExDRCBDb250cm9sbGVyLgorCitjb25maWcgRkJfSU5UU1JBTQorCWJvb2wgIkZyYW1lIEJ1ZmZlciBpbiBpbnRlcm5hbCBTUkFNIgorCWRlcGVuZHMgb24gRkJfQVRNRUwgJiYgQVJDSF9BVDkxU0FNOTI2MQorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSB3YW50IHRvIG1hcCBGcmFtZSBCdWZmZXIgaW4gaW50ZXJuYWwgU1JBTS4gU2F5IE4gaWYgeW91IHdhbnQKKwkgIHRvIGxldCBmcmFtZSBidWZmZXIgaW4gZXh0ZXJuYWwgU0RSQU0uCisKIGNvbmZpZyBGQl9OVklESUEKIAl0cmlzdGF0ZSAiblZpZGlhIEZyYW1lYnVmZmVyIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBQQ0kKQEAgLTc4MCw2ICs3OTYsMTUgQEAKIAkgIGluZGVwZW5kZW50bHkgdmFsaWRhdGUgdmlkZW8gbW9kZSBwYXJhbWV0ZXJzLCB5b3Ugc2hvdWxkIHNheSBZCiAJICBoZXJlLgogCitjb25maWcgRkJfTlZJRElBX0RFQlVHCisJYm9vbCAiTG90cyBvZiBkZWJ1ZyBvdXRwdXQiCisJZGVwZW5kcyBvbiBGQl9OVklESUEKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRoZSBuVmlkaWEgZHJpdmVyIHRvIG91dHB1dCBhbGwgc29ydHMKKwkgIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBwcm92aWRlIHRvIHRoZSBtYWludGFpbmVyIHdoZW4KKwkgIHNvbWV0aGluZyBnb2VzIHdyb25nLgorCiBjb25maWcgRkJfTlZJRElBX0JBQ0tMSUdIVAogCWJvb2wgIlN1cHBvcnQgZm9yIGJhY2tsaWdodCBjb250cm9sIgogCWRlcGVuZHMgb24gRkJfTlZJRElBCkBAIC04MTksNyArODQ0LDcgQEAKIAkgIGhlcmUuCiAKIGNvbmZpZyBGQl9SSVZBX0RFQlVHCi0JYm9vbCAiTG90cyBvZiBkZWJ1ZyBvdXRwdXQgZnJvbSBSaXZhKG5WaWRpYSkgZHJpdmVyIgorCWJvb2wgIkxvdHMgb2YgZGVidWcgb3V0cHV0IgogCWRlcGVuZHMgb24gRkJfUklWQQogCWRlZmF1bHQgbgogCWhlbHAKQEAgLTE0MzEsOCArMTQ1NiwxMSBAQAogCSAgYW5kIElDUyA1MzQyIFJBTURBQy4KIAogY29uZmlnIEZCX1BNMwotCXRyaXN0YXRlICJQZXJtZWRpYTMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEZCICYmIFBDSSAmJiBCUk9LRU4KKwl0cmlzdGF0ZSAiUGVybWVkaWEzIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBGQiAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEZCX0NGQl9GSUxMUkVDVAorCXNlbGVjdCBGQl9DRkJfQ09QWUFSRUEKKwlzZWxlY3QgRkJfQ0ZCX0lNQUdFQkxJVAogCWhlbHAKIAkgIFRoaXMgaXMgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgZHJpdmVyIGZvciB0aGUgM0RMYWJzIFBlcm1lZGlhMwogCSAgY2hpcHNldCwgdXNlZCBpbiBGb3JtYWMgUHJvRm9ybWFuY2UgSUlJLCAzRExhYnMgT3h5Z2VuIFZYMSAmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9NYWtlZmlsZQppbmRleCAwYjcwNTY3Li5iZDhiMDUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vTWFrZWZpbGUKQEAgLTg3LDYgKzg3LDcgQEAKIG9iai0kKENPTkZJR19GQl9TQTExMDApICAgICAgICAgICArPSBzYTExMDBmYi5vCiBvYmotJChDT05GSUdfRkJfSElUKSAgICAgICAgICAgICAgKz0gaGl0ZmIubwogb2JqLSQoQ09ORklHX0ZCX0VQU09OMTM1NSkJICArPSBlcHNvbjEzNTVmYi5vCitvYmotJChDT05GSUdfRkJfQVRNRUwpCQkgICs9IGF0bWVsX2xjZGZiLm8KIG9iai0kKENPTkZJR19GQl9QVlIyKSAgICAgICAgICAgICArPSBwdnIyZmIubwogb2JqLSQoQ09ORklHX0ZCX1ZPT0RPTzEpICAgICAgICAgICs9IHNzdGZiLm8KIG9iai0kKENPTkZJR19GQl9BUk1DTENEKQkgICs9IGFtYmEtY2xjZC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0bWVsX2xjZGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0bWVsX2xjZGZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkNWJkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vYXRtZWxfbGNkZmIuYwpAQCAtMCwwICsxLDc1MiBAQAorLyoKKyAqICBEcml2ZXIgZm9yIEFUOTEvQVQzMiBMQ0QgQ29udHJvbGxlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZ3Bpby5oPgorCisjaW5jbHVkZSA8dmlkZW8vYXRtZWxfbGNkYy5oPgorCisjZGVmaW5lIGxjZGNfcmVhZGwoc2luZm8sIHJlZykJCV9fcmF3X3JlYWRsKChzaW5mbyktPm1taW8rKHJlZykpCisjZGVmaW5lIGxjZGNfd3JpdGVsKHNpbmZvLCByZWcsIHZhbCkJX19yYXdfd3JpdGVsKCh2YWwpLCAoc2luZm8pLT5tbWlvKyhyZWcpKQorCisvKiBjb25maWd1cmFibGUgcGFyYW1ldGVycyAqLworI2RlZmluZSBBVE1FTF9MQ0RDX0NWQUxfREVGQVVMVAkJMHhjOAorI2RlZmluZSBBVE1FTF9MQ0RDX0RNQV9CVVJTVF9MRU4JOAorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOTI2MykKKyNkZWZpbmUgQVRNRUxfTENEQ19GSUZPX1NJWkUJCTIwNDgKKyNlbHNlCisjZGVmaW5lIEFUTUVMX0xDRENfRklGT19TSVpFCQk1MTIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxKQorI2RlZmluZQlBVE1FTF9MQ0RGQl9GQklORk9fREVGQVVMVAlGQklORk9fREVGQVVMVAorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRtZWxfbGNkZmJfdXBkYXRlX2RtYTJkKHN0cnVjdCBhdG1lbF9sY2RmYl9pbmZvICpzaW5mbywKKwkJCQkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCit7CisKK30KKyNlbGlmIGRlZmluZWQoQ09ORklHX0FWUjMyKQorI2RlZmluZQlBVE1FTF9MQ0RGQl9GQklORk9fREVGQVVMVAkoRkJJTkZPX0RFRkFVTFQgXAorCQkJCQl8IEZCSU5GT19QQVJUSUFMX1BBTl9PSyBcCisJCQkJCXwgRkJJTkZPX0hXQUNDRUxfWFBBTiBcCisJCQkJCXwgRkJJTkZPX0hXQUNDRUxfWVBBTikKKworc3RhdGljIHZvaWQgYXRtZWxfbGNkZmJfdXBkYXRlX2RtYTJkKHN0cnVjdCBhdG1lbF9sY2RmYl9pbmZvICpzaW5mbywKKwkJCQkgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQoreworCXUzMiBkbWEyZGNmZzsKKwl1MzIgcGl4ZWxvZmY7CisKKwlwaXhlbG9mZiA9ICh2YXItPnhvZmZzZXQgKiB2YXItPmJpdHNfcGVyX3BpeGVsKSAmIDB4MWY7CisKKwlkbWEyZGNmZyA9ICgodmFyLT54cmVzX3ZpcnR1YWwgLSB2YXItPnhyZXMpICogdmFyLT5iaXRzX3Blcl9waXhlbCkgLyA4OworCWRtYTJkY2ZnIHw9IHBpeGVsb2ZmIDw8IEFUTUVMX0xDRENfUElYRUxPRkZfT0ZGU0VUOworCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQTJEQ0ZHLCBkbWEyZGNmZyk7CisKKwkvKiBVcGRhdGUgY29uZmlndXJhdGlvbiAqLworCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQUNPTiwKKwkJICAgIGxjZGNfcmVhZGwoc2luZm8sIEFUTUVMX0xDRENfRE1BQ09OKQorCQkgICAgfCBBVE1FTF9MQ0RDX0RNQVVQRFQpOworfQorI2VuZGlmCisKKworc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBhdG1lbF9sY2RmYl9maXggX19pbml0ZGF0YSA9IHsKKwkudHlwZQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCisJLnZpc3VhbAkJPSBGQl9WSVNVQUxfVFJVRUNPTE9SLAorCS54cGFuc3RlcAk9IDAsCisJLnlwYW5zdGVwCT0gMCwKKwkueXdyYXBzdGVwCT0gMCwKKwkuYWNjZWwJCT0gRkJfQUNDRUxfTk9ORSwKK307CisKKworc3RhdGljIHZvaWQgYXRtZWxfbGNkZmJfdXBkYXRlX2RtYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3sKKwlzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqc2luZm8gPSBpbmZvLT5wYXI7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXggPSAmaW5mby0+Zml4OworCXVuc2lnbmVkIGxvbmcgZG1hX2FkZHI7CisKKwlkbWFfYWRkciA9IChmaXgtPnNtZW1fc3RhcnQgKyB2YXItPnlvZmZzZXQgKiBmaXgtPmxpbmVfbGVuZ3RoCisJCSAgICArIHZhci0+eG9mZnNldCAqIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4KTsKKworCWRtYV9hZGRyICY9IH4zVUw7CisKKwkvKiBTZXQgZnJhbWVidWZmZXIgRE1BIGJhc2UgYWRkcmVzcyBhbmQgcGl4ZWwgb2Zmc2V0ICovCisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfRE1BQkFERFIxLCBkbWFfYWRkcik7CisKKwlhdG1lbF9sY2RmYl91cGRhdGVfZG1hMmQoc2luZm8sIHZhcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG1lbF9sY2RmYl9mcmVlX3ZpZGVvX21lbW9yeShzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqc2luZm8pCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBzaW5mby0+aW5mbzsKKworCWRtYV9mcmVlX3dyaXRlY29tYmluZShpbmZvLT5kZXZpY2UsIGluZm8tPmZpeC5zbWVtX2xlbiwKKwkJCQlpbmZvLT5zY3JlZW5fYmFzZSwgaW5mby0+Zml4LnNtZW1fc3RhcnQpOworfQorCisvKioKKyAqCWF0bWVsX2xjZGZiX2FsbG9jX3ZpZGVvX21lbW9yeSAtIEFsbG9jYXRlIGZyYW1lYnVmZmVyIG1lbW9yeQorICoJQHNpbmZvOiB0aGUgZnJhbWUgYnVmZmVyIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IKKyAqLworc3RhdGljIGludCBhdG1lbF9sY2RmYl9hbGxvY192aWRlb19tZW1vcnkoc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gKnNpbmZvKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gc2luZm8tPmluZm87CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOworCisJaW5mby0+Zml4LnNtZW1fbGVuID0gKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT55cmVzX3ZpcnR1YWwKKwkJCSAgICAqICgodmFyLT5iaXRzX3Blcl9waXhlbCArIDcpIC8gOCkpOworCisJaW5mby0+c2NyZWVuX2Jhc2UgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKGluZm8tPmRldmljZSwgaW5mby0+Zml4LnNtZW1fbGVuLAorCQkJCQkoZG1hX2FkZHJfdCAqKSZpbmZvLT5maXguc21lbV9zdGFydCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWluZm8tPnNjcmVlbl9iYXNlKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqICAgICAgYXRtZWxfbGNkZmJfY2hlY2tfdmFyIC0gVmFsaWRhdGVzIGEgdmFyIHBhc3NlZCBpbi4KKyAqICAgICAgQHZhcjogZnJhbWUgYnVmZmVyIHZhcmlhYmxlIHNjcmVlbiBzdHJ1Y3R1cmUKKyAqICAgICAgQGluZm86IGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIGZyYW1lIGJ1ZmZlcgorICoKKyAqCUNoZWNrcyB0byBzZWUgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIHRoZSBzdGF0ZSByZXF1ZXN0ZWQgYnkKKyAqCXZhciBwYXNzZWQgaW4uIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWx0ZXIgdGhlIGhhcmR3YXJlCisgKglzdGF0ZSEhISAgVGhpcyBtZWFucyB0aGUgZGF0YSBzdG9yZWQgaW4gc3RydWN0IGZiX2luZm8gYW5kCisgKglzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyBkbyBub3QgY2hhbmdlLiBUaGlzIGluY2x1ZGVzIHRoZSB2YXIKKyAqCWluc2lkZSBvZiBzdHJ1Y3QgZmJfaW5mby4gIERvIE5PVCBjaGFuZ2UgdGhlc2UuIFRoaXMgZnVuY3Rpb24KKyAqCWNhbiBiZSBjYWxsZWQgb24gaXRzIG93biBpZiB3ZSBpbnRlbnQgdG8gb25seSB0ZXN0IGEgbW9kZSBhbmQKKyAqCW5vdCBhY3R1YWxseSBzZXQgaXQuIFRoZSBzdHVmZiBpbiBtb2RlZGIuYyBpcyBhIGV4YW1wbGUgb2YKKyAqCXRoaXMuIElmIHRoZSB2YXIgcGFzc2VkIGluIGlzIHNsaWdodGx5IG9mZiBieSB3aGF0IHRoZQorICoJaGFyZHdhcmUgY2FuIHN1cHBvcnQgdGhlbiB3ZSBhbHRlciB0aGUgdmFyIFBBU1NFRCBpbiB0byB3aGF0CisgKgl3ZSBjYW4gZG8uIElmIHRoZSBoYXJkd2FyZSBkb2Vzbid0IHN1cHBvcnQgbW9kZSBjaGFuZ2UgYQorICoJLUVJTlZBTCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSB1cHBlciBsYXllcnMuIFlvdSBkb24ndCBuZWVkCisgKgl0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiB0aGVuLiBJZiB5b3UgaGFyZHdhcmUgZG9lc24ndAorICoJc3VwcG9ydCBjaGFuZ2luZyB0aGUgcmVzb2x1dGlvbiB0aGVuIHRoaXMgZnVuY3Rpb24gaXMgbm90CisgKgluZWVkZWQuIEluIHRoaXMgY2FzZSB0aGUgZHJpdmVyIHdvdWxkIGp1c3QgcHJvdmlkZSBhIHZhciB0aGF0CisgKglyZXByZXNlbnRzIHRoZSBzdGF0aWMgc3RhdGUgdGhlIHNjcmVlbiBpcyBpbi4KKyAqCisgKglSZXR1cm5zIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLCBvciB6ZXJvIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgYXRtZWxfbGNkZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpbmZvLT5kZXZpY2U7CisJc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gKnNpbmZvID0gaW5mby0+cGFyOworCXVuc2lnbmVkIGxvbmcgY2xrX3ZhbHVlX2toejsKKworCWNsa192YWx1ZV9raHogPSBjbGtfZ2V0X3JhdGUoc2luZm8tPmxjZGNfY2xrKSAvIDEwMDA7CisKKwlkZXZfZGJnKGRldiwgIiVzOlxuIiwgX19mdW5jX18pOworCWRldl9kYmcoZGV2LCAiICByZXNvbHV0aW9uOiAldXgldVxuIiwgdmFyLT54cmVzLCB2YXItPnlyZXMpOworCWRldl9kYmcoZGV2LCAiICBwaXhjbGs6ICAgICAlbHUgS0h6XG4iLCBQSUNPUzJLSFoodmFyLT5waXhjbG9jaykpOworCWRldl9kYmcoZGV2LCAiICBicHA6ICAgICAgICAldVxuIiwgdmFyLT5iaXRzX3Blcl9waXhlbCk7CisJZGV2X2RiZyhkZXYsICIgIGNsazogICAgICAgICVsdSBLSHpcbiIsIGNsa192YWx1ZV9raHopOworCisJaWYgKChQSUNPUzJLSFoodmFyLT5waXhjbG9jaykgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCkgPiBjbGtfdmFsdWVfa2h6KSB7CisJCWRldl9lcnIoZGV2LCAiJWx1IEtIeiBwaXhlbCBjbG9jayBpcyB0b28gZmFzdFxuIiwgUElDT1MyS0haKHZhci0+cGl4Y2xvY2spKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRm9yY2Ugc2FtZSBhbGlnbm1lbnQgZm9yIGVhY2ggbGluZSAqLworCXZhci0+eHJlcyA9ICh2YXItPnhyZXMgKyAzKSAmIH4zVUw7CisJdmFyLT54cmVzX3ZpcnR1YWwgPSAodmFyLT54cmVzX3ZpcnR1YWwgKyAzKSAmIH4zVUw7CisKKwl2YXItPnJlZC5tc2JfcmlnaHQgPSB2YXItPmdyZWVuLm1zYl9yaWdodCA9IHZhci0+Ymx1ZS5tc2JfcmlnaHQgPSAwOworCXZhci0+dHJhbnNwLm1zYl9yaWdodCA9IDA7CisJdmFyLT50cmFuc3Aub2Zmc2V0ID0gdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKKwl2YXItPnhvZmZzZXQgPSB2YXItPnlvZmZzZXQgPSAwOworCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSAyOgorCWNhc2UgNDoKKwljYXNlIDg6CisJCXZhci0+cmVkLm9mZnNldCA9IHZhci0+Z3JlZW4ub2Zmc2V0ID0gdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+cmVkLmxlbmd0aCA9IHZhci0+Z3JlZW4ubGVuZ3RoID0gdmFyLT5ibHVlLmxlbmd0aAorCQkJPSB2YXItPmJpdHNfcGVyX3BpeGVsOworCQlicmVhazsKKwljYXNlIDE1OgorCWNhc2UgMTY6CisJCXZhci0+cmVkLm9mZnNldCA9IDA7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDEwOworCQl2YXItPnJlZC5sZW5ndGggPSB2YXItPmdyZWVuLmxlbmd0aCA9IHZhci0+Ymx1ZS5sZW5ndGggPSA1OworCQlicmVhazsKKwljYXNlIDI0OgorCWNhc2UgMzI6CisJCXZhci0+cmVkLm9mZnNldCA9IDA7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDE2OworCQl2YXItPnJlZC5sZW5ndGggPSB2YXItPmdyZWVuLmxlbmd0aCA9IHZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgImNvbG9yIGRlcHRoICVkIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJCXZhci0+Yml0c19wZXJfcGl4ZWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgICAgIGF0bWVsX2xjZGZiX3NldF9wYXIgLSBBbHRlcnMgdGhlIGhhcmR3YXJlIHN0YXRlLgorICogICAgICBAaW5mbzogZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgZnJhbWUgYnVmZmVyCisgKgorICoJVXNpbmcgdGhlIGZiX3Zhcl9zY3JlZW5pbmZvIGluIGZiX2luZm8gd2Ugc2V0IHRoZSByZXNvbHV0aW9uCisgKglvZiB0aGUgdGhpcyBwYXJ0aWN1bGFyIGZyYW1lYnVmZmVyLiBUaGlzIGZ1bmN0aW9uIGFsdGVycyB0aGUKKyAqCXBhciBBTkQgdGhlIGZiX2ZpeF9zY3JlZW5pbmZvIHN0b3JlZCBpbiBmYl9pbmZvLiBJdCBkb2Vzbid0CisgKglub3QgYWx0ZXIgdmFyIGluIGZiX2luZm8gc2luY2Ugd2UgYXJlIHVzaW5nIHRoYXQgZGF0YS4gVGhpcworICoJbWVhbnMgd2UgZGVwZW5kIG9uIHRoZSBkYXRhIGluIHZhciBpbnNpZGUgZmJfaW5mbyB0byBiZQorICoJc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4gIGF0bWVsX2xjZGZiX2NoZWNrX3ZhciBpcyBhbHdheXMgY2FsbGVkCisgKgliZWZvcmUgYXRtZWxfbGNkZmJfc2V0X3BhciB0byBlbnN1cmUgdGhpcy4gIEFnYWluIGlmIHlvdSBjYW4ndAorICoJY2hhbmdlIHRoZSByZXNvbHV0aW9uIHlvdSBkb24ndCBuZWVkIHRoaXMgZnVuY3Rpb24uCisgKgorICovCitzdGF0aWMgaW50IGF0bWVsX2xjZGZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gKnNpbmZvID0gaW5mby0+cGFyOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJdW5zaWduZWQgbG9uZyBjbGtfdmFsdWVfa2h6OworCisJZGV2X2RiZyhpbmZvLT5kZXZpY2UsICIlczpcbiIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKGluZm8tPmRldmljZSwgIiAgKiByZXNvbHV0aW9uOiAldXgldSAoJXV4JXUgdmlydHVhbClcbiIsCisJCSBpbmZvLT52YXIueHJlcywgaW5mby0+dmFyLnlyZXMsCisJCSBpbmZvLT52YXIueHJlc192aXJ0dWFsLCBpbmZvLT52YXIueXJlc192aXJ0dWFsKTsKKworCS8qIFR1cm4gb2ZmIHRoZSBMQ0QgY29udHJvbGxlciBhbmQgdGhlIERNQSBjb250cm9sbGVyICovCisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfUFdSQ09OLCBzaW5mby0+Z3VhcmRfdGltZSA8PCBBVE1FTF9MQ0RDX0dVQVJEVF9PRkZTRVQpOworCisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfRE1BQ09OLCAwKTsKKworCWlmIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPD0gOCkKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUjsKKwllbHNlCisJCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCisJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gaW5mby0+dmFyLnhyZXNfdmlydHVhbCAqIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgLyA4KTsKKworCS8qIFJlLWluaXRpYWxpemUgdGhlIERNQSBlbmdpbmUuLi4gKi8KKwlkZXZfZGJnKGluZm8tPmRldmljZSwgIiAgKiB1cGRhdGUgRE1BIGVuZ2luZVxuIik7CisJYXRtZWxfbGNkZmJfdXBkYXRlX2RtYShpbmZvLCAmaW5mby0+dmFyKTsKKworCS8qIC4uLnNldCBmcmFtZSBzaXplIGFuZCBidXJzdCBsZW5ndGggPSA4IHdvcmRzICg/KSAqLworCXZhbHVlID0gKGluZm8tPnZhci55cmVzICogaW5mby0+dmFyLnhyZXMgKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIC8gMzI7CisJdmFsdWUgfD0gKChBVE1FTF9MQ0RDX0RNQV9CVVJTVF9MRU4gLSAxKSA8PCBBVE1FTF9MQ0RDX0JMRU5HVEhfT0ZGU0VUKTsKKwlsY2RjX3dyaXRlbChzaW5mbywgQVRNRUxfTENEQ19ETUFGUk1DRkcsIHZhbHVlKTsKKworCS8qIE5vdywgdGhlIExDREMgY29yZS4uLiAqLworCisJLyogU2V0IHBpeGVsIGNsb2NrICovCisJY2xrX3ZhbHVlX2toeiA9IGNsa19nZXRfcmF0ZShzaW5mby0+bGNkY19jbGspIC8gMTAwMDsKKworCXZhbHVlID0gY2xrX3ZhbHVlX2toeiAvIFBJQ09TMktIWihpbmZvLT52YXIucGl4Y2xvY2spOworCisJaWYgKGNsa192YWx1ZV9raHogJSBQSUNPUzJLSFooaW5mby0+dmFyLnBpeGNsb2NrKSkKKwkJdmFsdWUrKzsKKworCXZhbHVlID0gKHZhbHVlIC8gMikgLSAxOworCisJaWYgKHZhbHVlIDw9IDApIHsKKwkJZGV2X25vdGljZShpbmZvLT5kZXZpY2UsICJCeXBhc3NpbmcgcGl4ZWwgY2xvY2sgZGl2aWRlclxuIik7CisJCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0xDRENPTjEsIEFUTUVMX0xDRENfQllQQVNTKTsKKwl9IGVsc2UKKwkJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfTENEQ09OMSwgdmFsdWUgPDwgQVRNRUxfTENEQ19DTEtWQUxfT0ZGU0VUKTsKKworCS8qIEluaXRpYWxpemUgY29udHJvbCByZWdpc3RlciAyICovCisJdmFsdWUgPSBzaW5mby0+ZGVmYXVsdF9sY2Rjb24yOworCisJaWYgKCEoaW5mby0+dmFyLnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkpCisJCXZhbHVlIHw9IEFUTUVMX0xDRENfSU5WTElORV9JTlZFUlRFRDsKKwlpZiAoIShpbmZvLT52YXIuc3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkpCisJCXZhbHVlIHw9IEFUTUVMX0xDRENfSU5WRlJBTUVfSU5WRVJURUQ7CisKKwlzd2l0Y2ggKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCkgeworCQljYXNlIDE6CXZhbHVlIHw9IEFUTUVMX0xDRENfUElYRUxTSVpFXzE7IGJyZWFrOworCQljYXNlIDI6IHZhbHVlIHw9IEFUTUVMX0xDRENfUElYRUxTSVpFXzI7IGJyZWFrOworCQljYXNlIDQ6IHZhbHVlIHw9IEFUTUVMX0xDRENfUElYRUxTSVpFXzQ7IGJyZWFrOworCQljYXNlIDg6IHZhbHVlIHw9IEFUTUVMX0xDRENfUElYRUxTSVpFXzg7IGJyZWFrOworCQljYXNlIDE1OiAvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSAxNjogdmFsdWUgfD0gQVRNRUxfTENEQ19QSVhFTFNJWkVfMTY7IGJyZWFrOworCQljYXNlIDI0OiB2YWx1ZSB8PSBBVE1FTF9MQ0RDX1BJWEVMU0laRV8yNDsgYnJlYWs7CisJCWNhc2UgMzI6IHZhbHVlIHw9IEFUTUVMX0xDRENfUElYRUxTSVpFXzMyOyBicmVhazsKKwkJZGVmYXVsdDogQlVHKCk7IGJyZWFrOworCX0KKwlkZXZfZGJnKGluZm8tPmRldmljZSwgIiAgKiBMQ0RDT04yID0gJTA4bHhcbiIsIHZhbHVlKTsKKwlsY2RjX3dyaXRlbChzaW5mbywgQVRNRUxfTENEQ19MQ0RDT04yLCB2YWx1ZSk7CisKKwkvKiBWZXJ0aWNhbCB0aW1pbmcgKi8KKwl2YWx1ZSA9IChpbmZvLT52YXIudnN5bmNfbGVuIC0gMSkgPDwgQVRNRUxfTENEQ19WUFdfT0ZGU0VUOworCXZhbHVlIHw9IGluZm8tPnZhci51cHBlcl9tYXJnaW4gPDwgQVRNRUxfTENEQ19WQlBfT0ZGU0VUOworCXZhbHVlIHw9IGluZm8tPnZhci5sb3dlcl9tYXJnaW47CisJZGV2X2RiZyhpbmZvLT5kZXZpY2UsICIgICogTENEVElNMSA9ICUwOGx4XG4iLCB2YWx1ZSk7CisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfVElNMSwgdmFsdWUpOworCisJLyogSG9yaXpvbnRhbCB0aW1pbmcgKi8KKwl2YWx1ZSA9IChpbmZvLT52YXIucmlnaHRfbWFyZ2luIC0gMSkgPDwgQVRNRUxfTENEQ19IRlBfT0ZGU0VUOworCXZhbHVlIHw9IChpbmZvLT52YXIuaHN5bmNfbGVuIC0gMSkgPDwgQVRNRUxfTENEQ19IUFdfT0ZGU0VUOworCXZhbHVlIHw9IChpbmZvLT52YXIubGVmdF9tYXJnaW4gLSAxKTsKKwlkZXZfZGJnKGluZm8tPmRldmljZSwgIiAgKiBMQ0RUSU0yID0gJTA4bHhcbiIsIHZhbHVlKTsKKwlsY2RjX3dyaXRlbChzaW5mbywgQVRNRUxfTENEQ19USU0yLCB2YWx1ZSk7CisKKwkvKiBEaXNwbGF5IHNpemUgKi8KKwl2YWx1ZSA9IChpbmZvLT52YXIueHJlcyAtIDEpIDw8IEFUTUVMX0xDRENfSE9aVkFMX09GRlNFVDsKKwl2YWx1ZSB8PSBpbmZvLT52YXIueXJlcyAtIDE7CisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfTENERlJNQ0ZHLCB2YWx1ZSk7CisKKwkvKiBGSUZPIFRocmVzaG9sZDogVXNlIGZvcm11bGEgZnJvbSBkYXRhIHNoZWV0ICovCisJdmFsdWUgPSBBVE1FTF9MQ0RDX0ZJRk9fU0laRSAtICgyICogQVRNRUxfTENEQ19ETUFfQlVSU1RfTEVOICsgMyk7CisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfRklGTywgdmFsdWUpOworCisJLyogVG9nZ2xlIExDRF9NT0RFIGV2ZXJ5IGZyYW1lICovCisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfTVZBTCwgMCk7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfSURSLCB+MFVMKTsKKworCS8qIFNldCBjb250cmFzdCAqLworCXZhbHVlID0gQVRNRUxfTENEQ19QU19ESVY4IHwgQVRNRUxfTENEQ19QT0xfUE9TSVRJVkUgfCBBVE1FTF9MQ0RDX0VOQV9QV01FTkFCTEU7CisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfQ09OVFJBU1RfQ1RSLCB2YWx1ZSk7CisJbGNkY193cml0ZWwoc2luZm8sIEFUTUVMX0xDRENfQ09OVFJBU1RfVkFMLCBBVE1FTF9MQ0RDX0NWQUxfREVGQVVMVCk7CisJLyogLi4ud2FpdCBmb3IgRE1BIGVuZ2luZSB0byBiZWNvbWUgaWRsZS4uLiAqLworCXdoaWxlIChsY2RjX3JlYWRsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQUNPTikgJiBBVE1FTF9MQ0RDX0RNQUJVU1kpCisJCW1zbGVlcCgxMCk7CisKKwlkZXZfZGJnKGluZm8tPmRldmljZSwgIiAgKiByZS1lbmFibGUgRE1BIGVuZ2luZVxuIik7CisJLyogLi4uYW5kIGVuYWJsZSBpdCB3aXRoIHVwZGF0ZWQgY29uZmlndXJhdGlvbiAqLworCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0RNQUNPTiwgc2luZm8tPmRlZmF1bHRfZG1hY29uKTsKKworCWRldl9kYmcoaW5mby0+ZGV2aWNlLCAiICAqIHJlLWVuYWJsZSBMQ0RDIGNvcmVcbiIpOworCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX1BXUkNPTiwKKwkJKHNpbmZvLT5ndWFyZF90aW1lIDw8IEFUTUVMX0xDRENfR1VBUkRUX09GRlNFVCkgfCBBVE1FTF9MQ0RDX1BXUik7CisKKwlkZXZfZGJnKGluZm8tPmRldmljZSwgIiAgKiBET05FXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjaGFuX3RvX2ZpZWxkKHVuc2lnbmVkIGludCBjaGFuLCBjb25zdCBzdHJ1Y3QgZmJfYml0ZmllbGQgKmJmKQoreworCWNoYW4gJj0gMHhmZmZmOworCWNoYW4gPj49IDE2IC0gYmYtPmxlbmd0aDsKKwlyZXR1cm4gY2hhbiA8PCBiZi0+b2Zmc2V0OworfQorCisvKioKKyAqICAJYXRtZWxfbGNkZmJfc2V0Y29scmVnIC0gT3B0aW9uYWwgZnVuY3Rpb24uIFNldHMgYSBjb2xvciByZWdpc3Rlci4KKyAqICAgICAgQHJlZ25vOiBXaGljaCByZWdpc3RlciBpbiB0aGUgQ0xVVCB3ZSBhcmUgcHJvZ3JhbW1pbmcKKyAqICAgICAgQHJlZDogVGhlIHJlZCB2YWx1ZSB3aGljaCBjYW4gYmUgdXAgdG8gMTYgYml0cyB3aWRlCisgKglAZ3JlZW46IFRoZSBncmVlbiB2YWx1ZSB3aGljaCBjYW4gYmUgdXAgdG8gMTYgYml0cyB3aWRlCisgKglAYmx1ZTogIFRoZSBibHVlIHZhbHVlIHdoaWNoIGNhbiBiZSB1cCB0byAxNiBiaXRzIHdpZGUuCisgKglAdHJhbnNwOiBJZiBzdXBwb3J0ZWQgdGhlIGFscGhhIHZhbHVlIHdoaWNoIGNhbiBiZSB1cCB0byAxNiBiaXRzIHdpZGUuCisgKiAgICAgIEBpbmZvOiBmcmFtZSBidWZmZXIgaW5mbyBzdHJ1Y3R1cmUKKyAqCisgKiAgCVNldCBhIHNpbmdsZSBjb2xvciByZWdpc3Rlci4gVGhlIHZhbHVlcyBzdXBwbGllZCBoYXZlIGEgMTYgYml0CisgKiAgCW1hZ25pdHVkZSB3aGljaCBuZWVkcyB0byBiZSBzY2FsZWQgaW4gdGhpcyBmdW5jdGlvbiBmb3IgdGhlIGhhcmR3YXJlLgorICoJVGhpbmdzIHRvIHRha2UgaW50byBjb25zaWRlcmF0aW9uIGFyZSBob3cgbWFueSBjb2xvciByZWdpc3RlcnMsIGlmCisgKglhbnksIGFyZSBzdXBwb3J0ZWQgd2l0aCB0aGUgY3VycmVudCBjb2xvciB2aXN1YWwuIFdpdGggdHJ1ZWNvbG9yIG1vZGUKKyAqCW5vIGNvbG9yIHBhbGV0dGVzIGFyZSBzdXBwb3J0ZWQuIEhlcmUgYSBwc3VlZG8gcGFsZXR0ZSBpcyBjcmVhdGVkCisgKgl3aGljaCB3ZSBzdG9yZSB0aGUgdmFsdWUgaW4gcHNldWRvX3BhbGV0dGUgaW4gc3RydWN0IGZiX2luZm8uIEZvcgorICoJcHNldWRvY29sb3IgbW9kZSB3ZSBoYXZlIGEgbGltaXRlZCBjb2xvciBwYWxldHRlLiBUbyBkZWFsIHdpdGggdGhpcworICoJd2UgY2FuIHByb2dyYW0gd2hhdCBjb2xvciBpcyBkaXNwbGF5ZWQgZm9yIGEgcGFydGljdWxhciBwaXhlbCB2YWx1ZS4KKyAqCURpcmVjdENvbG9yIGlzIHNpbWlsYXIgaW4gdGhhdCB3ZSBjYW4gcHJvZ3JhbSBlYWNoIGNvbG9yIGZpZWxkLiBJZgorICoJd2UgaGF2ZSBhIHN0YXRpYyBjb2xvcm1hcCB3ZSBkb24ndCBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uLgorICoKKyAqCVJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gb24gc3VjY2Vzcy4gSW4gYW4KKyAqCWlkZWFsIHdvcmxkLCB0aGlzIHdvdWxkIGhhdmUgYmVlbiB0aGUgY2FzZSwgYnV0IGFzIGl0IHR1cm5zCisgKglvdXQsIHRoZSBvdGhlciBkcml2ZXJzIHJldHVybiAxIG9uIGZhaWx1cmUsIHNvIHRoYXQncyB3aGF0CisgKgl3ZSdyZSBnb2luZyB0byBkby4KKyAqLworc3RhdGljIGludCBhdG1lbF9sY2RmYl9zZXRjb2xyZWcodW5zaWduZWQgaW50IHJlZ25vLCB1bnNpZ25lZCBpbnQgcmVkLAorCQkJICAgICB1bnNpZ25lZCBpbnQgZ3JlZW4sIHVuc2lnbmVkIGludCBibHVlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqc2luZm8gPSBpbmZvLT5wYXI7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1MzIgKnBhbDsKKwlpbnQgcmV0ID0gMTsKKworCWlmIChpbmZvLT52YXIuZ3JheXNjYWxlKQorCQlyZWQgPSBncmVlbiA9IGJsdWUgPSAoMTk1OTUgKiByZWQgKyAzODQ3MCAqIGdyZWVuCisJCQkJICAgICAgKyA3NDcxICogYmx1ZSkgPj4gMTY7CisKKwlzd2l0Y2ggKGluZm8tPmZpeC52aXN1YWwpIHsKKwljYXNlIEZCX1ZJU1VBTF9UUlVFQ09MT1I6CisJCWlmIChyZWdubyA8IDE2KSB7CisJCQlwYWwgPSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZTsKKworCQkJdmFsICA9IGNoYW5fdG9fZmllbGQocmVkLCAmaW5mby0+dmFyLnJlZCk7CisJCQl2YWwgfD0gY2hhbl90b19maWVsZChncmVlbiwgJmluZm8tPnZhci5ncmVlbik7CisJCQl2YWwgfD0gY2hhbl90b19maWVsZChibHVlLCAmaW5mby0+dmFyLmJsdWUpOworCisJCQlwYWxbcmVnbm9dID0gdmFsOworCQkJcmV0ID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRkJfVklTVUFMX1BTRVVET0NPTE9SOgorCQlpZiAocmVnbm8gPCAyNTYpIHsKKwkJCXZhbCAgPSAoKHJlZCAgID4+IDExKSAmIDB4MDAxZik7CisJCQl2YWwgfD0gKChncmVlbiA+PiAgNikgJiAweDAzZTApOworCQkJdmFsIHw9ICgoYmx1ZSAgPj4gIDEpICYgMHg3YzAwKTsKKworCQkJLyoKKwkJCSAqIFRPRE86IGludGVuc2l0eSBiaXQuIE1heWJlIHNvbWV0aGluZyBsaWtlCisJCQkgKiAgIH4ocmVkWzEwXSBeIGdyZWVuWzEwXSBeIGJsdWVbMTBdKSAmIDEKKwkJCSAqLworCisJCQlsY2RjX3dyaXRlbChzaW5mbywgQVRNRUxfTENEQ19MVVQocmVnbm8pLCB2YWwpOworCQkJcmV0ID0gMDsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0bWVsX2xjZGZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJICAgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWRldl9kYmcoaW5mby0+ZGV2aWNlLCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWF0bWVsX2xjZGZiX3VwZGF0ZV9kbWEoaW5mbywgdmFyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZiX29wcyBhdG1lbF9sY2RmYl9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5mYl9jaGVja192YXIJPSBhdG1lbF9sY2RmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBhdG1lbF9sY2RmYl9zZXRfcGFyLAorCS5mYl9zZXRjb2xyZWcJPSBhdG1lbF9sY2RmYl9zZXRjb2xyZWcsCisJLmZiX3Bhbl9kaXNwbGF5CT0gYXRtZWxfbGNkZmJfcGFuX2Rpc3BsYXksCisJLmZiX2ZpbGxyZWN0CT0gY2ZiX2ZpbGxyZWN0LAorCS5mYl9jb3B5YXJlYQk9IGNmYl9jb3B5YXJlYSwKKwkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhdG1lbF9sY2RmYl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2lkOworCXN0cnVjdCBhdG1lbF9sY2RmYl9pbmZvICpzaW5mbyA9IGluZm8tPnBhcjsKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gbGNkY19yZWFkbChzaW5mbywgQVRNRUxfTENEQ19JU1IpOworCWxjZGNfd3JpdGVsKHNpbmZvLCBBVE1FTF9MQ0RDX0lEUiwgc3RhdHVzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGF0bWVsX2xjZGZiX2luaXRfZmJpbmZvKHN0cnVjdCBhdG1lbF9sY2RmYl9pbmZvICpzaW5mbykKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHNpbmZvLT5pbmZvOworCWludCByZXQgPSAwOworCisJbWVtc2V0X2lvKGluZm8tPnNjcmVlbl9iYXNlLCAwLCBpbmZvLT5maXguc21lbV9sZW4pOworCWluZm8tPnZhci5hY3RpdmF0ZSB8PSBGQl9BQ1RJVkFURV9GT1JDRSB8IEZCX0FDVElWQVRFX05PVzsKKworCWRldl9pbmZvKGluZm8tPmRldmljZSwKKwkgICAgICAgIiVsdUtpQiBmcmFtZSBidWZmZXIgYXQgJTA4bHggKG1hcHBlZCBhdCAlcClcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nKWluZm8tPmZpeC5zbWVtX2xlbiAvIDEwMjQsCisJICAgICAgICh1bnNpZ25lZCBsb25nKWluZm8tPmZpeC5zbWVtX3N0YXJ0LAorCSAgICAgICBpbmZvLT5zY3JlZW5fYmFzZSk7CisKKwkvKiBBbGxvY2F0ZSBjb2xvcm1hcCAqLworCXJldCA9IGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoaW5mby0+ZGV2aWNlLCAiQWxsb2MgY29sb3IgbWFwIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhdG1lbF9sY2RmYl9zdGFydF9jbG9jayhzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqc2luZm8pCit7CisJaWYgKHNpbmZvLT5idXNfY2xrKQorCQljbGtfZW5hYmxlKHNpbmZvLT5idXNfY2xrKTsKKwljbGtfZW5hYmxlKHNpbmZvLT5sY2RjX2Nsayk7Cit9CisKK3N0YXRpYyB2b2lkIGF0bWVsX2xjZGZiX3N0b3BfY2xvY2soc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gKnNpbmZvKQoreworCWlmIChzaW5mby0+YnVzX2NsaykKKwkJY2xrX2Rpc2FibGUoc2luZm8tPmJ1c19jbGspOworCWNsa19kaXNhYmxlKHNpbmZvLT5sY2RjX2Nsayk7Cit9CisKKworc3RhdGljIGludCBfX2luaXQgYXRtZWxfbGNkZmJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBhdG1lbF9sY2RmYl9pbmZvICpzaW5mbzsKKwlzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqcGRhdGFfc2luZm87CisJc3RydWN0IHJlc291cmNlICpyZWdzID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1hcCA9IE5VTEw7CisJaW50IHJldDsKKworCWRldl9kYmcoZGV2LCAiJXMgQkVHSU5cbiIsIF9fZnVuY19fKTsKKworCXJldCA9IC1FTk9NRU07CisJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyksIGRldik7CisJaWYgKCFpbmZvKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXNpbmZvID0gaW5mby0+cGFyOworCisJaWYgKGRldi0+cGxhdGZvcm1fZGF0YSkgeworCQlwZGF0YV9zaW5mbyA9IChzdHJ1Y3QgYXRtZWxfbGNkZmJfaW5mbyAqKWRldi0+cGxhdGZvcm1fZGF0YTsKKwkJc2luZm8tPmRlZmF1bHRfYnBwID0gcGRhdGFfc2luZm8tPmRlZmF1bHRfYnBwOworCQlzaW5mby0+ZGVmYXVsdF9kbWFjb24gPSBwZGF0YV9zaW5mby0+ZGVmYXVsdF9kbWFjb247CisJCXNpbmZvLT5kZWZhdWx0X2xjZGNvbjIgPSBwZGF0YV9zaW5mby0+ZGVmYXVsdF9sY2Rjb24yOworCQlzaW5mby0+ZGVmYXVsdF9tb25zcGVjcyA9IHBkYXRhX3NpbmZvLT5kZWZhdWx0X21vbnNwZWNzOworCQlzaW5mby0+YXRtZWxfbGNkZmJfcG93ZXJfY29udHJvbCA9IHBkYXRhX3NpbmZvLT5hdG1lbF9sY2RmYl9wb3dlcl9jb250cm9sOworCQlzaW5mby0+Z3VhcmRfdGltZSA9IHBkYXRhX3NpbmZvLT5ndWFyZF90aW1lOworCX0gZWxzZSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGdldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiIpOworCQlnb3RvIGZyZWVfaW5mbzsKKwl9CisJc2luZm8tPmluZm8gPSBpbmZvOworCXNpbmZvLT5wZGV2ID0gcGRldjsKKworCXN0cmNweShpbmZvLT5maXguaWQsIHNpbmZvLT5wZGV2LT5uYW1lKTsKKwlpbmZvLT5mbGFncyA9IEFUTUVMX0xDREZCX0ZCSU5GT19ERUZBVUxUOworCWluZm8tPnBzZXVkb19wYWxldHRlID0gc2luZm8tPnBzZXVkb19wYWxldHRlOworCWluZm8tPmZib3BzID0gJmF0bWVsX2xjZGZiX29wczsKKworCW1lbWNweSgmaW5mby0+bW9uc3BlY3MsIHNpbmZvLT5kZWZhdWx0X21vbnNwZWNzLCBzaXplb2YoaW5mby0+bW9uc3BlY3MpKTsKKwlpbmZvLT5maXggPSBhdG1lbF9sY2RmYl9maXg7CisKKwkvKiBFbmFibGUgTENEQyBDbG9ja3MgKi8KKwlpZiAoY3B1X2lzX2F0OTFzYW05MjYxKCkgfHwgY3B1X2lzX2F0MzJhcDcwMDAoKSkgeworCQlzaW5mby0+YnVzX2NsayA9IGNsa19nZXQoZGV2LCAiaGNrMSIpOworCQlpZiAoSVNfRVJSKHNpbmZvLT5idXNfY2xrKSkgeworCQkJcmV0ID0gUFRSX0VSUihzaW5mby0+YnVzX2Nsayk7CisJCQlnb3RvIGZyZWVfaW5mbzsKKwkJfQorCX0KKwlzaW5mby0+bGNkY19jbGsgPSBjbGtfZ2V0KGRldiwgImxjZGNfY2xrIik7CisJaWYgKElTX0VSUihzaW5mby0+bGNkY19jbGspKSB7CisJCXJldCA9IFBUUl9FUlIoc2luZm8tPmxjZGNfY2xrKTsKKwkJZ290byBwdXRfYnVzX2NsazsKKwl9CisJYXRtZWxfbGNkZmJfc3RhcnRfY2xvY2soc2luZm8pOworCisJcmV0ID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIE5VTEwsIGluZm8tPm1vbnNwZWNzLm1vZGVkYiwKKwkJCWluZm8tPm1vbnNwZWNzLm1vZGVkYl9sZW4sIGluZm8tPm1vbnNwZWNzLm1vZGVkYiwKKwkJCXNpbmZvLT5kZWZhdWx0X2JwcCk7CisJaWYgKCFyZXQpIHsKKwkJZGV2X2VycihkZXYsICJubyBzdWl0YWJsZSB2aWRlbyBtb2RlIGZvdW5kXG4iKTsKKwkJZ290byBzdG9wX2NsazsKKwl9CisKKworCXJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVncykgeworCQlkZXZfZXJyKGRldiwgInJlc291cmNlcyB1bnVzYWJsZVxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBzdG9wX2NsazsKKwl9CisKKwlzaW5mby0+aXJxX2Jhc2UgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChzaW5mby0+aXJxX2Jhc2UgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGdldCBpcnFcbiIpOworCQlyZXQgPSBzaW5mby0+aXJxX2Jhc2U7CisJCWdvdG8gc3RvcF9jbGs7CisJfQorCisJLyogSW5pdGlhbGl6ZSB2aWRlbyBtZW1vcnkgKi8KKwltYXAgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCWlmIChtYXApIHsKKwkJLyogdXNlIGEgcHJlLWFsbG9jYXRlZCBtZW1vcnkgYnVmZmVyICovCisJCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gbWFwLT5zdGFydDsKKwkJaW5mby0+Zml4LnNtZW1fbGVuID0gbWFwLT5lbmQgLSBtYXAtPnN0YXJ0ICsgMTsKKwkJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsCisJCQkJCWluZm8tPmZpeC5zbWVtX2xlbiwgcGRldi0+bmFtZSkpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gc3RvcF9jbGs7CisJCX0KKworCQlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXAoaW5mby0+Zml4LnNtZW1fc3RhcnQsIGluZm8tPmZpeC5zbWVtX2xlbik7CisJCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpCisJCQlnb3RvIHJlbGVhc2VfaW50bWVtOworCX0gZWxzZSB7CisJCS8qIGFsb2NhdGUgbWVtb3J5IGJ1ZmZlciAqLworCQlyZXQgPSBhdG1lbF9sY2RmYl9hbGxvY192aWRlb19tZW1vcnkoc2luZm8pOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJjYW5ub3QgYWxsb2NhdGUgZnJhbWVidWZmZXI6ICVkXG4iLCByZXQpOworCQkJZ290byBzdG9wX2NsazsKKwkJfQorCX0KKworCS8qIExDREMgcmVnaXN0ZXJzICovCisJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSByZWdzLT5zdGFydDsKKwlpbmZvLT5maXgubW1pb19sZW4gPSByZWdzLT5lbmQgLSByZWdzLT5zdGFydCArIDE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihpbmZvLT5maXgubW1pb19zdGFydCwKKwkJCQlpbmZvLT5maXgubW1pb19sZW4sIHBkZXYtPm5hbWUpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBmcmVlX2ZiOworCX0KKworCXNpbmZvLT5tbWlvID0gaW9yZW1hcChpbmZvLT5maXgubW1pb19zdGFydCwgaW5mby0+Zml4Lm1taW9fbGVuKTsKKwlpZiAoIXNpbmZvLT5tbWlvKSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IG1hcCBMQ0RDIHJlZ2lzdGVyc1xuIik7CisJCWdvdG8gcmVsZWFzZV9tZW07CisJfQorCisJLyogaW50ZXJydXB0ICovCisJcmV0ID0gcmVxdWVzdF9pcnEoc2luZm8tPmlycV9iYXNlLCBhdG1lbF9sY2RmYl9pbnRlcnJ1cHQsIDAsIHBkZXYtPm5hbWUsIGluZm8pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJyZXF1ZXN0X2lycSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIHVubWFwX21taW87CisJfQorCisJcmV0ID0gYXRtZWxfbGNkZmJfaW5pdF9mYmluZm8oc2luZm8pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiaW5pdCBmYmluZm8gZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZ290byB1bnJlZ2lzdGVyX2lycXM7CisJfQorCisJLyoKKwkgKiBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvdXIgY29sb3VyIGJpdGZpZWxkCisJICogZGVzY3JpcHRvcnMgYXJlIGNvcnJlY3RseSBpbml0aWFsaXNlZC4KKwkgKi8KKwlhdG1lbF9sY2RmYl9jaGVja192YXIoJmluZm8tPnZhciwgaW5mbyk7CisKKwlyZXQgPSBmYl9zZXRfdmFyKGluZm8sICZpbmZvLT52YXIpOworCWlmIChyZXQpIHsKKwkJZGV2X3dhcm4oZGV2LCAidW5hYmxlIHRvIHNldCBkaXNwbGF5IHBhcmFtZXRlcnNcbiIpOworCQlnb3RvIGZyZWVfY21hcDsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBpbmZvKTsKKworCS8qCisJICogVGVsbCB0aGUgd29ybGQgdGhhdCB3ZSdyZSByZWFkeSB0byBnbworCSAqLworCXJldCA9IHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGZyYW1lYnVmZmVyIGRldmljZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZnJlZV9jbWFwOworCX0KKworCS8qIFBvd2VyIHVwIHRoZSBMQ0RDIHNjcmVlbiAqLworCWlmIChzaW5mby0+YXRtZWxfbGNkZmJfcG93ZXJfY29udHJvbCkKKwkJc2luZm8tPmF0bWVsX2xjZGZiX3Bvd2VyX2NvbnRyb2woMSk7CisKKwlkZXZfaW5mbyhkZXYsICJmYiVkOiBBdG1lbCBMQ0RDIGF0IDB4JTA4bHggKG1hcHBlZCBhdCAlcCksIGlycSAlbHVcbiIsCisJCSAgICAgICBpbmZvLT5ub2RlLCBpbmZvLT5maXgubW1pb19zdGFydCwgc2luZm8tPm1taW8sIHNpbmZvLT5pcnFfYmFzZSk7CisKKwlyZXR1cm4gMDsKKworCitmcmVlX2NtYXA6CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKK3VucmVnaXN0ZXJfaXJxczoKKwlmcmVlX2lycShzaW5mby0+aXJxX2Jhc2UsIGluZm8pOwordW5tYXBfbW1pbzoKKwlpb3VubWFwKHNpbmZvLT5tbWlvKTsKK3JlbGVhc2VfbWVtOgorIAlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4Lm1taW9fc3RhcnQsIGluZm8tPmZpeC5tbWlvX2xlbik7CitmcmVlX2ZiOgorCWlmIChtYXApCisJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworCWVsc2UKKwkJYXRtZWxfbGNkZmJfZnJlZV92aWRlb19tZW1vcnkoc2luZm8pOworCityZWxlYXNlX2ludG1lbToKKwlpZiAobWFwKQorCQlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4LnNtZW1fc3RhcnQsIGluZm8tPmZpeC5zbWVtX2xlbik7CitzdG9wX2NsazoKKwlhdG1lbF9sY2RmYl9zdG9wX2Nsb2NrKHNpbmZvKTsKKwljbGtfcHV0KHNpbmZvLT5sY2RjX2Nsayk7CitwdXRfYnVzX2NsazoKKwlpZiAoc2luZm8tPmJ1c19jbGspCisJCWNsa19wdXQoc2luZm8tPmJ1c19jbGspOworZnJlZV9pbmZvOgorCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CitvdXQ6CisJZGV2X2RiZyhkZXYsICIlcyBGQUlMRURcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZXhpdCBhdG1lbF9sY2RmYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGF0bWVsX2xjZGZiX2luZm8gKnNpbmZvID0gaW5mby0+cGFyOworCisJaWYgKCFzaW5mbykKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2luZm8tPmF0bWVsX2xjZGZiX3Bvd2VyX2NvbnRyb2wpCisJCXNpbmZvLT5hdG1lbF9sY2RmYl9wb3dlcl9jb250cm9sKDApOworCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CisJYXRtZWxfbGNkZmJfc3RvcF9jbG9jayhzaW5mbyk7CisJY2xrX3B1dChzaW5mby0+bGNkY19jbGspOworCWlmIChzaW5mby0+YnVzX2NsaykKKwkJY2xrX3B1dChzaW5mby0+YnVzX2Nsayk7CisJZmJfZGVhbGxvY19jbWFwKCZpbmZvLT5jbWFwKTsKKwlmcmVlX2lycShzaW5mby0+aXJxX2Jhc2UsIGluZm8pOworCWlvdW5tYXAoc2luZm8tPm1taW8pOworIAlyZWxlYXNlX21lbV9yZWdpb24oaW5mby0+Zml4Lm1taW9fc3RhcnQsIGluZm8tPmZpeC5tbWlvX2xlbik7CisJaWYgKHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSkpIHsKKwkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihpbmZvLT5maXguc21lbV9zdGFydCwgaW5mby0+Zml4LnNtZW1fbGVuKTsKKwl9IGVsc2UgeworCQlhdG1lbF9sY2RmYl9mcmVlX3ZpZGVvX21lbW9yeShzaW5mbyk7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdG1lbF9sY2RmYl9kcml2ZXIgPSB7CisJLnJlbW92ZQkJPSBfX2V4aXRfcChhdG1lbF9sY2RmYl9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhdG1lbF9sY2RmYiIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhdG1lbF9sY2RmYl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmYXRtZWxfbGNkZmJfZHJpdmVyLCBhdG1lbF9sY2RmYl9wcm9iZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdG1lbF9sY2RmYl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0bWVsX2xjZGZiX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF0bWVsX2xjZGZiX2luaXQpOworbW9kdWxlX2V4aXQoYXRtZWxfbGNkZmJfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVQ5MS9BVDMyIExDRCBDb250cm9sbGVyIGZyYW1lYnVmZmVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTmljb2xhcyBGZXJyZSA8bmljb2xhcy5mZXJyZUByZm8uYXRtZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZwppbmRleCBhYTM5MzVkLi42M2I4NWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvS2NvbmZpZwpAQCAtMTksMTMgKzE5LDYgQEAKIAogCSAgU2F5IFkuCiAKLSMJaWYgWyAiJENPTkZJR19QQ0kiID0gInkiIC1hICIkQ09ORklHX1ZHQV9DT05TT0xFIiA9ICJ5IiBdOyB0aGVuCi0jCSAgIGJvb2wgJyAgIEFsbG93IFZHQSBvbiBhbnkgYnVzPycgQ09ORklHX1ZHQV9IT1NFCi0jCSAgIGlmIFsgIiRDT05GSUdfVkdBX0hPU0UiID0gInkiIF07IHRoZW4KLSMJICAgICAgZGVmaW5lX2Jvb2wgQ09ORklHX0RVTU1ZX0NPTlNPTEUgeQotIwkgICBmaQotIwlmaQotCiBjb25maWcgVkdBQ09OX1NPRlRfU0NST0xMQkFDSwogICAgICAgIGJvb2wgIkVuYWJsZSBTY3JvbGxiYWNrIEJ1ZmZlciBpbiBTeXN0ZW0gUkFNIgogICAgICAgIGRlcGVuZHMgb24gVkdBX0NPTlNPTEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9ody5jCmluZGV4IGM2Mjc5NTUuLmFmZjExYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2h3LmMKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfaHcuYwpAQCAtMTQ5LDcgKzE0OSw5IEBACiAJCXBsbCA9IE5WX1JEMzIocGFyLT5QTUMsIDB4NDAyNCk7CiAJCU0gPSBwbGwgJiAweEZGOwogCQlOID0gKHBsbCA+PiA4KSAmIDB4RkY7Ci0JCWlmICgoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMjkwKSB8fCAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMzkwKSB8fCAoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMkUwKSkgeworCQlpZiAoKChwYXItPkNoaXBzZXQgJiAweGZmZjApID09IDB4MDI5MCkgfHwKKwkJCSgocGFyLT5DaGlwc2V0ICYgMHhmZmYwKSA9PSAweDAzOTApIHx8CisJCQkoKHBhci0+Q2hpcHNldCAmIDB4ZmZmMCkgPT0gMHgwMkUwKSkgewogCQkJTUIgPSAxOwogCQkJTkIgPSAxOwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYwppbmRleCBmODVlZGYwLi40MWY2MzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYwpAQCAtMzcsNyArMzcsNiBAQAogI2luY2x1ZGUgIm52X3Byb3RvLmgiCiAjaW5jbHVkZSAibnZfZG1hLmgiCiAKLSN1bmRlZiBDT05GSUdfRkJfTlZJRElBX0RFQlVHCiAjaWZkZWYgQ09ORklHX0ZCX05WSURJQV9ERUJVRwogI2RlZmluZSBOVlRSQUNFICAgICAgICAgIHByaW50awogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcG0yZmIuYyBiL2RyaXZlcnMvdmlkZW8vcG0yZmIuYwppbmRleCAxYWM1MjY0Li5hYjVlNjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3BtMmZiLmMKKysrIGIvZHJpdmVycy92aWRlby9wbTJmYi5jCkBAIC0yMDQsMTcgKzIwNCw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgd2FpdF9wbTIoc3RydWN0IHBtMmZiX3BhciogcGFyKSB7Ci0KLQlXQUlUX0ZJRk8ocGFyLCAxKTsKLQlwbTJfV1IocGFyLCBQTTJSX1NZTkMsIDApOwotCW1iKCk7Ci0JZG8gewotCQl3aGlsZSAocG0yX1JEKHBhciwgUE0yUl9PVVRfRklGT19XT1JEUykgPT0gMCk7Ci0JCXJtYigpOwotCX0gd2hpbGUgKHBtMl9SRChwYXIsIFBNMlJfT1VUX0ZJRk8pICE9IFBNMlRBRyhQTTJSX1NZTkMpKTsKLX0KLQogLyoKICAqIHBhcnRpYWwgcHJvZHVjdHMgZm9yIHRoZSBzdXBwb3J0ZWQgaG9yaXpvbnRhbCByZXNvbHV0aW9ucy4KICAqLwpAQCAtMTA1MCwxMyArMTAzOSwzMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBtMmZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHBtMmZiX3BhciAqcGFyID0gaW5mby0+cGFyOworCisJV0FJVF9GSUZPKHBhciwgMSk7CisJcG0yX1dSKHBhciwgUE0yUl9TWU5DLCAwKTsKKwltYigpOworCWRvIHsKKwkJd2hpbGUgKHBtMl9SRChwYXIsIFBNMlJfT1VUX0ZJRk9fV09SRFMpID09IDApCisJCQl1ZGVsYXkoMTApOworCQlybWIoKTsKKwl9IHdoaWxlIChwbTJfUkQocGFyLCBQTTJSX09VVF9GSUZPKSAhPSBQTTJUQUcoUE0yUl9TWU5DKSk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIGJsb2NrIG9wZXJhdGlvbi4gY29weT0wOiByZWN0YW5nbGUgZmlsbCwgY29weT0xOiByZWN0YW5nbGUgY29weS4KICAqLwotc3RhdGljIHZvaWQgcG0yZmJfYmxvY2tfb3Aoc3RydWN0IHBtMmZiX3BhciogcGFyLCBpbnQgY29weSwKK3N0YXRpYyB2b2lkIHBtMmZiX2Jsb2NrX29wKHN0cnVjdCBmYl9pbmZvKiBpbmZvLCBpbnQgY29weSwKIAkJCQlzMzIgeHNyYywgczMyIHlzcmMsCiAJCQkJczMyIHgsIHMzMiB5LCBzMzIgdywgczMyIGgsCiAJCQkJdTMyIGNvbG9yKSB7CisJc3RydWN0IHBtMmZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJaWYgKCF3IHx8ICFoKQogCQlyZXR1cm47CkBAIC0xMDc2LDEzICsxMDgyLDExIEBACiAJCQkJKHg8eHNyYyA/IFBNMkZfSU5DUkVBU0VfWCA6IDApIHwKIAkJCQkoeTx5c3JjID8gUE0yRl9JTkNSRUFTRV9ZIDogMCkgfAogCQkJCShjb3B5ID8gMCA6IFBNMkZfUkVOREVSX0ZBU1RGSUxMKSk7Ci0Jd2FpdF9wbTIocGFyKTsKIH0KIAogc3RhdGljIHZvaWQgcG0yZmJfZmlsbHJlY3QgKHN0cnVjdCBmYl9pbmZvICppbmZvLAogCQkJCWNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVnaW9uKQogewotCXN0cnVjdCBwbTJmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZmJfZmlsbHJlY3QgbW9kZGVkOwogCWludCB2eHJlcywgdnlyZXM7CiAJdTMyIGNvbG9yID0gKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1RSVUVDT0xPUikgPwpAQCAtMTExNiw3ICsxMTIwLDcgQEAKIAkJY29sb3IgfD0gY29sb3IgPDwgMTY7CiAKIAlpZihpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgIT0gMjQpCi0JCXBtMmZiX2Jsb2NrX29wKHBhciwgMCwgMCwgMCwKKwkJcG0yZmJfYmxvY2tfb3AoaW5mbywgMCwgMCwgMCwKIAkJCQltb2RkZWQuZHgsIG1vZGRlZC5keSwKIAkJCQltb2RkZWQud2lkdGgsIG1vZGRlZC5oZWlnaHQsIGNvbG9yKTsKIAllbHNlCkBAIC0xMTI2LDcgKzExMzAsNiBAQAogc3RhdGljIHZvaWQgcG0yZmJfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sCiAJCQkJY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKQogewotCXN0cnVjdCBwbTJmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAlzdHJ1Y3QgZmJfY29weWFyZWEgbW9kZGVkOwogCXUzMiB2eHJlcywgdnlyZXM7CiAKQEAgLTExNTYsNyArMTE1OSw3IEBACiAJaWYobW9kZGVkLmR5ICsgbW9kZGVkLmhlaWdodCA+IHZ5cmVzKQogCQltb2RkZWQuaGVpZ2h0ID0gdnlyZXMgLSBtb2RkZWQuZHk7CiAKLQlwbTJmYl9ibG9ja19vcChwYXIsIDEsIG1vZGRlZC5zeCwgbW9kZGVkLnN5LAorCXBtMmZiX2Jsb2NrX29wKGluZm8sIDEsIG1vZGRlZC5zeCwgbW9kZGVkLnN5LAogCQkJbW9kZGVkLmR4LCBtb2RkZWQuZHksCiAJCQltb2RkZWQud2lkdGgsIG1vZGRlZC5oZWlnaHQsIDApOwogfQpAQCAtMTE3Nyw2ICsxMTgwLDcgQEAKIAkuZmJfZmlsbHJlY3QJPSBwbTJmYl9maWxscmVjdCwKIAkuZmJfY29weWFyZWEJPSBwbTJmYl9jb3B5YXJlYSwKIAkuZmJfaW1hZ2VibGl0CT0gY2ZiX2ltYWdlYmxpdCwKKwkuZmJfc3luYwk9IHBtMmZiX3N5bmMsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9wbTNmYi5jIGIvZHJpdmVycy92aWRlby9wbTNmYi5jCmluZGV4IGJkNzg3ZTguLmM3N2ExYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vcG0zZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMKQEAgLTEsNTUgKzEsMjUgQEAKIC8qCiAgKiAgbGludXgvZHJpdmVycy92aWRlby9wbTNmYi5jIC0tIDNETGFicyBQZXJtZWRpYTMgZnJhbWUgYnVmZmVyIGRldmljZQotICogIAotICogIENvcHlyaWdodCAoQykgMjAwMSBSb21haW4gRG9sYmVhdSA8ZG9sYmVhdUBpcmlzYS5mcj4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxIFJvbWFpbiBEb2xiZWF1IDxyb21haW5AZG9sYmVhdS5vcmc+LgorICoKKyAqICBQb3J0ZWQgdG8gMi42IGtlcm5lbCBvbiAxIE1heSAyMDA3IGJ5IEtyenlzenRvZiBIZWx0IDxrcnp5c3p0b2YuaDFAd3AucGw+CisgKgliYXNlZCBvbiBwbTJmYi5jCisgKgogICogIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBieToKLSAqICAgICAgICAgICBTdmVuIEx1dGhlciwgPGx1dGhlckBkcHQtaW5mby51LXN0cmFzYmcuZnI+Ci0gKiAgICAgICAgICAgQWxhbiBIb3VyaWhhbmUsIDxhbGFuaEBmYWlybGl0ZS5kZW1vbi5jby51az4KLSAqICAgICAgICAgICBSdXNzZWxsIEtpbmcsIDxybWtAYXJtLmxpbnV4Lm9yZy51az4KKyAqCSAgIFN2ZW4gTHV0aGVyLCA8bHV0aGVyQGRwdC1pbmZvLnUtc3RyYXNiZy5mcj4KKyAqCSAgIEFsYW4gSG91cmloYW5lLCA8YWxhbmhAZmFpcmxpdGUuZGVtb24uY28udWs+CisgKgkgICBSdXNzZWxsIEtpbmcsIDxybWtAYXJtLmxpbnV4Lm9yZy51az4KICAqICBCYXNlZCBvbiBsaW51eC9kcml2ZXJzL3ZpZGVvL3NrZWxldG9uZmIuYzoKICAqCUNvcHlyaWdodCAoQykgMTk5NyBHZWVydCBVeXR0ZXJob2V2ZW4KICAqICBCYXNlZCBvbiBsaW51eC9kcml2ZXIvdmlkZW8vcG0yZmIuYzoKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTE5OTkgSWxhcmlvIE5hcmRpbm9jY2hpIChuYXJkaW5vY0BDUy5VbmlCTy5JVCkKLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk5IEpha3ViIEplbGluZWsgKGpha3ViQHJlZGhhdC5jb20pCisgKglDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSBJbGFyaW8gTmFyZGlub2NjaGkgKG5hcmRpbm9jQENTLlVuaUJPLklUKQorICoJQ29weXJpZ2h0IChDKSAxOTk5IEpha3ViIEplbGluZWsgKGpha3ViQHJlZGhhdC5jb20pCiAgKgogICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiAgTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKICAqICBtb3JlIGRldGFpbHMuCiAgKgotICogICRIZWFkZXI6IC9jdnNyb290L2xpbnV4L2RyaXZlcnMvdmlkZW8vcG0zZmIuYyx2IDEuMSAyMDAyLzAyLzI1IDE5OjExOjA2IG1hcmNlbG8gRXhwICQKLSAqCi0gKiAgQ0hBTkdFTE9HOgotICogIE1vbiBGZWIgMTEgMTA6MzU6NDggTUVUIDIwMDIsIHYgMS40LjExQjogQ29zbWV0aWMgdXBkYXRlLgotICogIFdlZCBKYW4gMjMgMTQ6MTY6NTkgTUVUIDIwMDIsIHYgMS40LjExOiBQcmVsaW1pbmFyeSAyLjUueCBzdXBwb3J0LCBwYXRjaCBmb3IgMi41LjIuCi0gKiAgV2VkIE5vdiAyOCAxMTowODoyOSBNRVQgMjAwMSwgdiAxLjQuMTA6IHBvdGVudGlhbCBidWcgZml4IGZvciBTRFJBTS1iYXNlZCBib2FyZCwgcGF0Y2ggZm9yIDIuNC4xNi4KLSAqICBUaHUgU2VwIDIwIDEwOjI0OjQyIE1FVCBEU1QgMjAwMSwgdiAxLjQuOTogc3luYyBidWcgZml4LCBwcmVsaW1pbmFyeSBmbGF0cGFuZWwgc3VwcG9ydCwgYmV0dGVyIHRpbWluZ3MuCi0gKiAgVHVlIEF1ZyAyOCAxMDoxMzowMSBNRVQgRFNUIDIwMDEsIHYgMS40Ljg6IG1lbW9yeSB0aW1pbmdzIGNoZWNrLCBtaW5vciBidWcgZml4ZXMuCi0gKiAgV2VkIEp1bCAxOCAxOTowNjoxNCBDRVNUIDIwMDEsIHYgMS40Ljc6IE1vZGUgZml4ICg4MDB4NjAwLTEwMCwgMTAyNHg3NjgtMTAwIGNoYW5nZWQpLCB1c2luZyBIVyBwYW5uaW5nICsgYWNjZWwgYnVnIGZpeC4KLSAqICBNb24gSnVuIDI1IDEwOjMzOjU2IE1FVCBEU1QgMjAwMSwgdiAxLjQuNjogRGVwdGggMTIgZml4LCBjaGlwIHJlc2V0IGlvY3RsLCBtb3ZlZCBtZW1vcnkgZXJhc2UgaW9jdGwgdG8gREVCVUcuCi0gKiAgV2VkIEp1biAyMCAxMToxMzowOCBNRVQgRFNUIDIwMDEsIHYgMS40LjU6IEZpeGVkIG1pc3NpbmcgYmxpbmtpbmcgY3Vyc29yIGluIDhicHAsIGNvZGUgY2xlYW5pbmcsIG1lbW9yeSBlcmFzZSBJT0NUTC4KLSAqICBNb24gSnVuIDE4IDE2OjAwOjI3IENFU1QgMjAwMSwgdiAxLjQuNDogRGVwdGggMTIgKFJHQkEgNDQ0NCkgc3VwcG9ydCwgY29kZSBjbGVhbmluZy4KLSAqICBGcmkgSnVuIDE1IDEzOjUzOjAxIENFU1QgMjAwMSwgdiAxLjQuMzogUmVtb3ZlZCB3YXJuaW5ncywgZGVwdGggMTUgc3VwcG9ydCwgYWRkICdkZXB0aCcgb3B0aW9uLgotICogIFRodSBKdW4gMTQgMTA6MTM6NTIgTUVUIERTVCAyMDAxLCB2IDEuNC4yOiBGaXhlZCBkZXB0aCBzd2l0Y2hpbmcgYnVnLCBwcmVsaW1pbmFyeSAxNWJwcCAoUkdCNTU1MSkgc3VwcG9ydC4KLSAqICBUaHUgQXByIDEyIDExOjE2OjQ1IE1FVCBEU1QgMjAwMSwgdiAxLjQuMUI6IERvYyB1cGRhdGVzLgotICogIEZyaSBBcHIgIDYgMTE6MTI6NTMgTUVUIERTVCAyMDAxLCB2IDEuNC4xOiBDb25maWd1cmUuaGVscCwgbWlub3IgY2xlYW51cAotICogIFRodSBNYXIgMjkgMTA6NTY6NTAgTUVUIERTVCAyMDAxLCB2IDEuNC4wOiBNb2R1bGUgJiBtb2R1bGUgb3B0aW9ucyBzdXBwb3J0IChub3RlOiBsaW51eCBwYXRjaCBjaGFuZ2VkLCAyLjIuMTkgYWRkZWQpLgotICogIFRodSBNYXIgMTUgMTU6MzA6MzEgTUVUIDIwMDEsIHYgMS4zLjI6IEZpeGVkIG1pcnJvcmluZyBidWcgb24gbGl0dGxlLWVuZGlhbi4KLSAqICBXZWQgTWFyIDE0IDIxOjI1OjU0IENFVCAyMDAxLCB2IDEuMy4xOiBGaXhlZCBidWcgaW4gQmxvY2tNb3ZlIChfYm1vdikuCi0gKiAgVHVlIE1hciAxMyAxMDo1MzoxOSBNRVQgMjAwMSwgdiAxLjMuMDogQ2hhcmFjdGVyIGRyYXdpbmcgaGFyZHdhcmUgc3VwcG9ydCAoaW4gYWxsIHdpZHRoIGJldHdlZW4gMSBhbmQgMTYpLCBmaXhlcy4KLSAqICBUaHUgTWFyICA4IDEwOjIwOjE2IE1FVCAyMDAxLCB2IDEuMi4yOiBCZXR0ZXIgSjIwMDAgc3VwcG9ydCwgImZvbnQ6IiBvcHRpb24uCi0gKiAgVHVlIE1hciAgNiAyMToyNTowNCBDRVQgMjAwMSwgdiAxLjIuMTogQmV0dGVyIGFjY2VsZXJhdGlvbiBzdXBwb3J0LgotICogIE1vbiBNYXIgIDUgMjE6NTQ6MTcgQ0VUIDIwMDEsIHYgMS4yLjA6IFBhcnRpYWwgYWNjZWxlcmF0aW9uIHN1cHBvcnQgKGNsZWFyICYgYm1vdmUpCi0gKiAgTW9uIE1hciAgNSAxMjo1MjoxNSBDRVQgMjAwMSwgdiAxLjEuMzogQmlnIHBhbl9kaXNwbGF5IGZpeC4KLSAqICBTdW4gTWFyICA0IDIyOjIxOjUwIENFVCAyMDAxLCB2IDEuMS4yOiAobnVtZXJvdXMpIGJ1ZyBmaXhlcy4KLSAqICBGcmkgTWFyICAyIDE1OjU0OjA3IENFVCAyMDAxLCB2IDEuMS4xOiBNaWdodCBoYXZlIEFwcGlhbiBKMjAwMCBzdXBwb3J0LCByZXNvdXJjZSBtYW5nZW1lbnQgaW4gMi40Ci0gKiAgV2VkIEZlYiAyOCAxODoyMTozNSBDRVQgMjAwMSwgdiAxLjEuMDogTWlnaHQgaGF2ZSBtdWx0aXBsZSBib2FyZHMgc3VwcG9ydCAoYWRkZWQsIGJ1dCBub3QgeWVzdCB0ZXN0ZWQpCi0gKiAgVHVlIEZlYiAyNyAxNzozMToxMiBDRVQgMjAwMSwgdiAxLjAuNjogZml4ZXMgYm9vdC10aW1lIG1vZGUgc2VsZWN0LCBhZGQgbW9yZSBkZWZhdWx0IG1vZGUKLSAqICBUdWUgRmViIDI3IDE0OjAxOjM2IENFVCAyMDAxLCB2IDEuMC41OiBmaXhlcyAoMS4wLjQgd2FzIGJyb2tlbiBmb3IgMi4yKSwgY2xlYW5pbmcgdXAKLSAqICBNb24gRmViIDI2IDIzOjE3OjM2IENFVCAyMDAxLCB2IDEuMC40OiBwcmVsaW1pbmFyeSAyLjQueCBzdXBwb3J0LCBkcm9wcGVkICh1c2VsZXNzIG9uIHBtMykgcGFydGlhbCBwcm9kdWN0LCBtb3JlIE9GIGZpeAotICogIE1vbiBGZWIgMjYgMjA6NTk6MDUgQ0VUIDIwMDEsIHYgMS4wLjM6IE5vIG1vcmUgc2hhZG93IHJlZ2lzdGVyIChhbmQgd2FzdGVkIG1lbW9yeSksIGVuZGlhbmVzcyBmaXgsIHVzZSBPRi1wcmVzZXQgcmVzb2x1dGlvbiBieSBkZWZhdWx0Ci0gKiAgV2VkIEZlYiAyMSAyMjowOTozMCBDRVQgMjAwMSwgdiAxLjAuMjogQ29kZSBjbGVhbmluZyBmb3IgZnV0dXJlIG11bHRpYm9hcmQgc3VwcG9ydCwgYmV0dGVyIE9GIHN1cHBvcnQsIGJ1Z3MgZml4Ci0gKiAgV2VkIEZlYiAyMSAxOTo1ODo1NiBDRVQgMjAwMSwgdiAxLjAuMTogT3BlbkZpcm13YXJlIHN1cHBvcnQsIGZpeGVkIG1lbW9yeSBkZXRlY3Rpb24sIGJldHRlciBkZWJ1ZyBzdXBwb3J0LCBjb2RlIGNsZWFuaW5nCi0gKiAgV2VkIEZlYiAyMSAxNDo0NzowNiBDRVQgMjAwMSwgdiAxLjAuMDogRmlyc3Qgd29ya2luZyB2ZXJzaW9uCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNTgsODU2ICsyOCwxNTUgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCi0jaW5jbHVkZSA8dmlkZW8vZmJjb24uaD4KLSNpbmNsdWRlIDx2aWRlby9mYmNvbi1tZmIuaD4KLSNpbmNsdWRlIDx2aWRlby9mYmNvbi1jZmIyLmg+Ci0jaW5jbHVkZSA8dmlkZW8vZmJjb24tY2ZiNC5oPgotI2luY2x1ZGUgPHZpZGVvL2ZiY29uLWNmYjguaD4KLSNpbmNsdWRlIDx2aWRlby9mYmNvbi1jZmIxNi5oPgotI2luY2x1ZGUgPHZpZGVvL2ZiY29uLWNmYjI0Lmg+Ci0jaW5jbHVkZSA8dmlkZW8vZmJjb24tY2ZiMzIuaD4KICNpbmNsdWRlIDx2aWRlby9wbTNmYi5oPgogCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQotI2lmZGVmIENPTkZJR19GQl9PRgotI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaWYgIWRlZmluZWQoQ09ORklHX1BDSSkKKyNlcnJvciAiT25seSBnZW5lcmljIFBDSSBjYXJkcyBzdXBwb3J0ZWQuIgogI2VuZGlmCiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qICoqKioqIFRoZSB2YXJpb3VzICJnbG9iYWwiIGRhdGEgKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKyN1bmRlZiBQTTNGQl9NQVNURVJfREVCVUcKKyNpZmRlZiBQTTNGQl9NQVNURVJfREVCVUcKKyNkZWZpbmUgRFBSSU5USyhhLGIuLi4pCXByaW50ayhLRVJOX0RFQlVHICJwbTNmYjogJXM6ICIgYSwgX19GVU5DVElPTl9fICwgIyMgYikKKyNlbHNlCisjZGVmaW5lIERQUklOVEsoYSxiLi4uKQorI2VuZGlmCiAKLS8qIHRob3NlIHdpbGwgbmVlZCBhIHJld29yayBmb3IgbXVsdGlwbGUgYm9hcmQgc3VwcG9ydCAqLwotLyogRHJpdmVyIG5hbWUgKi8KLXN0YXRpYyBjb25zdCBjaGFyIHBlcm1lZGlhM19uYW1lWzE2XSA9ICJQZXJtZWRpYTMiOworLyoKKyAqIERyaXZlciBkYXRhCisgKi8KK3N0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2RldmluaXRkYXRhOwogCi0vKiB0aGUgZmJfcGFyIHN0cnVjdCwgbWFuZGF0b3J5ICovCi1zdHJ1Y3QgcG0zZmJfcGFyIHsKLQl1MzIgcGl4Y2xvY2s7CQkvKiBwaXhjbG9jayBpbiBLSHogKi8KKy8qCisgKiAgSWYgeW91ciBkcml2ZXIgc3VwcG9ydHMgbXVsdGlwbGUgYm9hcmRzLCB5b3Ugc2hvdWxkIG1ha2UgdGhlCisgKiAgYmVsb3cgZGF0YSB0eXBlcyBhcnJheXMsIG9yIGFsbG9jYXRlIHRoZW0gZHluYW1pY2FsbHkgKHVzaW5nIGttYWxsb2MoKSkuCisgKi8KIAotCXUzMiB3aWR0aDsJCS8qIHdpZHRoIG9mIHZpcnR1YWwgc2NyZWVuICovCi0JdTMyIGhlaWdodDsJCS8qIGhlaWdodCBvZiB2aXJ0dWFsIHNjcmVlbiAqLwotCi0JdTMyIGhzc3RhcnQ7CQkvKiBob3Jpei4gc3luYyBzdGFydCAqLwotCXUzMiBoc2VuZDsJCS8qIGhvcml6LiBzeW5jIGVuZCAqLwotCXUzMiBoYmVuZDsJCS8qIGhvcml6LiBibGFuayBlbmQgKGFsc28gZ2F0ZSBlbmQpICovCi0JdTMyIGh0b3RhbDsJCS8qIHRvdGFsIHdpZHRoICh3LyBzeW5jICYgYmxhbmspICovCi0KLQl1MzIgdnNzdGFydDsJCS8qIHZlcnQuIHN5bmMgc3RhcnQgKi8KLQl1MzIgdnNlbmQ7CQkvKiB2ZXJ0LiBzeW5jIGVuZCAqLwotCXUzMiB2YmVuZDsJCS8qIHZlcnQuIGJsYW5rIGVuZCAqLwotCXUzMiB2dG90YWw7CQkvKiB0b3RhbCBoZWlnaHQgKHcvIHN5bmMgJiBibGFuaykgKi8KLQotCXUzMiBzdHJpZGU7CQkvKiBzY3JlZW4gc3RyaWRlICovCi0JdTMyIGJhc2U7CQkvKiBzY3JlZW4gYmFzZSAoeG9mZnNldCt5b2Zmc2V0KSBpbiAxMjggYml0cyB1bml0ICovCi0JLyogTk9URSA6IHVubGlrZSBvdGhlciBwbTMgc3R1ZmYgYWJvdmUsIHN0b3JlZCAqYWZ0ZXIqIHNoaWZ0YnBwLiBkb24ndCBhc2sgKi8KLQl1MzIgZGVwdGg7CQkvKiBzY3JlZW4gZGVwdGggKDgsIDEyLCAxNSwgMTYgb3IgMzIpICovCi0JdTMyIHZpZGVvOwkJLyogdmlkZW8gY29udHJvbCAoaHN5bmMsdnN5bmMpICovCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgaGFyZHdhcmUgc3RhdGUgb2YgdGhlIGdyYXBoaWNzIGNhcmQuIE5vcm1hbGx5CisgKiB5b3UgcGxhY2UgdGhpcyBpbiBhIGhlYWRlciBmaWxlIGluIGxpbnV4L2luY2x1ZGUvdmlkZW8uIFRoaXMgZmlsZSB1c3VhbGx5CisgKiBhbHNvIGluY2x1ZGVzIHJlZ2lzdGVyIGluZm9ybWF0aW9uLiBUaGF0IGFsbG93cyBvdGhlciBkcml2ZXIgc3Vic3lzdGVtcworICogYW5kIHVzZXJsYW5kIGFwcGxpY2F0aW9ucyB0aGUgYWJpbGl0eSB0byB1c2UgdGhlIHNhbWUgaGVhZGVyIGZpbGUgdG8KKyAqIGF2b2lkIGR1cGxpY2F0ZSB3b3JrIGFuZCBlYXN5IHBvcnRpbmcgb2Ygc29mdHdhcmUuCisgKi8KK3N0cnVjdCBwbTNfcGFyIHsKKwl1bnNpZ25lZCBjaGFyCV9faW9tZW0gKnZfcmVnczsvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgcF9yZWdzICovCisJdTMyCQl2aWRlbzsJCS8qIHZpZGVvIGZsYWdzIGJlZm9yZSBibGFua2luZyAqLworCXUzMgkJYmFzZTsJCS8qIHNjcmVlbiBiYXNlICh4b2Zmc2V0K3lvZmZzZXQpIGluIDEyOCBiaXRzIHVuaXQgKi8KKwl1MzIgCQlwYWxldHRlWzE2XTsKIH07CiAKLS8qIG1lbW9yeSB0aW1pbmdzICovCi1zdHJ1Y3QgcG0zZmJfdGltaW5ncworLyoKKyAqIEhlcmUgd2UgZGVmaW5lIHRoZSBkZWZhdWx0IHN0cnVjdHMgZmJfZml4X3NjcmVlbmluZm8gYW5kIGZiX3Zhcl9zY3JlZW5pbmZvCisgKiBpZiB3ZSBkb24ndCB1c2UgbW9kZWRiLiBJZiB3ZSBkbyB1c2UgbW9kZWRiIHNlZSBwbTNmYl9pbml0IGhvdyB0byB1c2UgaXQKKyAqIHRvIGdldCBhIGZiX3Zhcl9zY3JlZW5pbmZvLiBPdGhlcndpc2UgZGVmaW5lIGEgZGVmYXVsdCB2YXIgYXMgd2VsbC4KKyAqLworc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBwbTNmYl9maXggX19kZXZpbml0ZGF0YSA9IHsKKwkuaWQgPQkJIlBlcm1lZGlhMyIsCisJLnR5cGUgPQkJRkJfVFlQRV9QQUNLRURfUElYRUxTLAorCS52aXN1YWwgPQlGQl9WSVNVQUxfUFNFVURPQ09MT1IsCisJLnhwYW5zdGVwID0JMSwKKwkueXBhbnN0ZXAgPQkxLAorCS55d3JhcHN0ZXAgPQkwLAorCS5hY2NlbCA9CUZCX0FDQ0VMX05PTkUsCit9OworCisvKgorICogVXRpbGl0eSBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIHUzMiBQTTNfUkVBRF9SRUcoc3RydWN0IHBtM19wYXIgKnBhciwgczMyIG9mZikKIHsKLQl1bnNpZ25lZCBsb25nIGNhcHM7Ci0JdW5zaWduZWQgbG9uZyB0aW1pbmdzOwotCXVuc2lnbmVkIGxvbmcgY29udHJvbDsKLQl1bnNpZ25lZCBsb25nIHJlZnJlc2g7Ci0JdW5zaWduZWQgbG9uZyBwb3dlcmRvd247Ci19OwotdHlwZWRlZiBlbnVtIHBtM2ZiX3RpbWluZ19yZXN1bHQgeyBwbTNmYl90aW1pbmdfb2ssIHBtM2ZiX3RpbWluZ19wcm9ibGVtLCBwbTNmYl90aW1pbmdfcmV0cnkgfSBwbTNmYl90aW1pbmdfcmVzdWx0OwotI2RlZmluZSBQTTNGQl9VTktOT1dOX1RJTUlOR19WQUxVRSAoKHVuc2lnbmVkIGxvbmcpLTEpCi0jZGVmaW5lIFBNM0ZCX1VOS05PV05fVElNSU5HUyB7IFBNM0ZCX1VOS05PV05fVElNSU5HX1ZBTFVFLCBQTTNGQl9VTktOT1dOX1RJTUlOR19WQUxVRSwgUE0zRkJfVU5LTk9XTl9USU1JTkdfVkFMVUUsIFBNM0ZCX1VOS05PV05fVElNSU5HX1ZBTFVFLCBQTTNGQl9VTktOT1dOX1RJTUlOR19WQUxVRSB9Ci0KLS8qIHRoZSBmYl9pbmZvIHN0cnVjdCwgbWFuZGF0b3J5ICovCi1zdHJ1Y3QgcG0zZmJfaW5mbyB7Ci0Jc3RydWN0IGZiX2luZm9fZ2VuIGdlbjsKLQl1bnNpZ25lZCBsb25nIGJvYXJkX251bTsgLyogaW50ZXJuYWwgYm9hcmQgbnVtYmVyICovCi0JdW5zaWduZWQgbG9uZyB1c2VfY3VycmVudDsKLQlzdHJ1Y3QgcG0zZmJfcGFyICpjdXJyZW50X3BhcjsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2OyAgICAvKiBQQ0kgZGV2aWNlICovCi0JdW5zaWduZWQgbG9uZyBib2FyZF90eXBlOyAvKiBpbmRleCBpbiB0aGUgY2FyZGJhc2UgKi8KLQl1bnNpZ25lZCBjaGFyICpmYl9iYXNlOwkvKiBmcmFtZWJ1ZmZlciBtZW1vcnkgYmFzZSAqLwotCXUzMiBmYl9zaXplOwkJLyogZnJhbWVidWZmZXIgbWVtb3J5IHNpemUgKi8KLQl1bnNpZ25lZCBjaGFyICpwX2ZiOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGZyYW1lIGJ1ZmZlciAqLwotCXVuc2lnbmVkIGNoYXIgKnZfZmI7CS8qIHZpcnR1YWwgYWRkcmVzcyBvZiBmcmFtZSBidWZmZXIgKi8KLQl1bnNpZ25lZCBjaGFyICpwSU9CYXNlOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHJlZ2lzdGVycyByZWdpb24sIG11c3QgYmUgcmdfYmFzZSBvciByZ19iYXNlK1BNMl9SRUdTX1NJWkUgZGVwZW5kaW5nIG9uIHRoZSBob3N0IGVuZGlhbm5lc3MgKi8KLQl1bnNpZ25lZCBjaGFyICp2SU9CYXNlOwkvKiBhZGRyZXNzIG9mIHJlZ2lzdGVycyBhZnRlciBpb3JlbWFwKCkgKi8KLQlzdHJ1Y3QgewotCQl1OCB0cmFuc3A7Ci0JCXU4IHJlZDsKLQkJdTggZ3JlZW47Ci0JCXU4IGJsdWU7Ci0JfSBwYWxldHRlWzI1Nl07Ci0JdW5pb24gewotI2lmZGVmIEZCQ09OX0hBU19DRkIxNgotCQl1MTYgY21hcDEyWzE2XTsgLyogUkdCQSA0NDQ0ICovCi0JCXUxNiBjbWFwMTVbMTZdOyAvKiBSR0JBIDU1NTEgKi8KLQkJdTE2IGNtYXAxNlsxNl07IC8qIFJHQkEgNTY1MCAqLwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi0JCXUzMiBjbWFwMzJbMTZdOwotI2VuZGlmCi0JfSBjbWFwOwotCXN0cnVjdCBwbTNmYl90aW1pbmdzIG1lbXQ7Ci19OwotCi0vKiByZWd1bGFyIHJlc29sdXRpb24gZGF0YWJhc2UqLwotc3RhdGljIHN0cnVjdCB7Ci0JY2hhciBuYW1lWzE2XTsKLQlzdHJ1Y3QgcG0zZmJfcGFyIHVzZXJfbW9kZTsKLX0gbW9kZV9iYXNlW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCSJkZWZhdWx0LTgwMHg2MDAiLCB7Ci0JNDk1MDAsIDgwMCwgNjAwLCAxNiwgOTYsIDI1NiwgMTA1NiwgMSwgNCwgMjUsIDYyNSwKLQkJCSAgICA4MDAsIDAsIDgsCi0JCQkgICAgUE0zVmlkZW9Db250cm9sX0VOQUJMRSB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdICi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwgUE0zVmlkZW9Db250cm9sX1BJWEVMU0laRV84QklUfX0sIHsKLQkJIjEwMjR4NzY4LTc0IiwgewotCTc4NzUyLCAxMDI0LCA3NjgsIDMyLCAxMjgsIDMwNCwgMTMyOCwgMSwgNCwgMzgsCi0JCQkgICAgODA2LCAxMDI0LCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LCB7Ci0JCSIxMDI0eDc2OC03NC0zMiIsIHsKLQkJCTc4NzUyLCAxMDI0LCA3NjgsIDMyLCAxMjgsIDMwNCwgMTMyOCwgMSwgNCwgMzgsCi0JCQk4MDYsIDEwMjQsIDAsIDMyLAotCQkJUE0zVmlkZW9Db250cm9sX0VOQUJMRSB8Ci0JCQlQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0hJR0gKLQkJCXwKLQkJCVBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSAotCQkJfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzMyQklUfX0sCi0vKiBHZW5lcmF0ZWQgbW9kZSA6ICIxNjAweDEwMjQiLCBmb3IgdGhlIFNHSSAxNjAwU1cgZmxhdCBwYW5lbCovCi0JewotCQkiU0dJMTYwMFNXIiwgewotCQkJMTA4MDAwLCAxNjAwLCAxMDI0LCAxNiwgNTYsIDEwNCwgMTcwNCwgMywgNiwgMzIsCi0JCQkxMDU2LCAxNjAwLCAwLCA4LAotCQkJUE0zVmlkZW9Db250cm9sX0VOQUJMRXwKLQkJCVBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XfFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XfAotCQkJUE0zVmlkZW9Db250cm9sX1BJWEVMU0laRV8zMkJJVH19LCAKLS8qICMjIyMjIGF1dG8tZ2VuZXJhdGVkIG1vZGUsIGJ5IGZidGltaW5nczJwbTMgKi8KLS8qIEdlbmVyYXRlZCBtb2RlIDogIjY0MHg0ODAtNjAiICovCi0JewotCQkiNjQweDQ4MC02MCIsIHsKLQkyNTE3NCwgNjQwLCA0ODAsIDE2LCAxMTIsIDE2MCwgODAwLCAxMCwgMTIsIDQ1LAotCQkJICAgIDUyNSwgNjQwLCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLS8qIEdlbmVyYXRlZCBtb2RlIDogIjY0MHg0ODAtNzIiICovCi0JewotCQkiNjQweDQ4MC03MiIsIHsKLQkzMTE5OSwgNjQwLCA0ODAsIDI0LCA2NCwgMTkyLCA4MzIsIDksIDEyLCA0MCwgNTIwLAotCQkJICAgIDY0MCwgMCwgOCwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfRU5BQkxFIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0xPVwotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0xPVwotCQkJICAgIHwgUE0zVmlkZW9Db250cm9sX1BJWEVMU0laRV84QklUfX0sCi0vKiBHZW5lcmF0ZWQgbW9kZSA6ICI2NDB4NDgwLTc1IiAqLwotCXsKLQkJIjY0MHg0ODAtNzUiLCB7Ci0JMzE0OTksIDY0MCwgNDgwLCAxNiwgODAsIDIwMCwgODQwLCAxLCA0LCAyMCwgNTAwLAotCQkJICAgIDY0MCwgMCwgOCwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfRU5BQkxFIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0xPVwotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0xPVwotCQkJICAgIHwgUE0zVmlkZW9Db250cm9sX1BJWEVMU0laRV84QklUfX0sCi0vKiBHZW5lcmF0ZWQgbW9kZSA6ICI2NDB4NDgwLTkwIiAqLwotCXsKLQkJIjY0MHg0ODAtOTAiLCB7Ci0JMzk5MDksIDY0MCwgNDgwLCAzMiwgNzIsIDE5MiwgODMyLCAyNSwgMzksIDUzLCA1MzMsCi0JCQkgICAgNjQwLCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLS8qIEdlbmVyYXRlZCBtb2RlIDogIjY0MHg0ODAtMTAwIiAqLwotCXsKLQkJIjY0MHg0ODAtMTAwIiwgewotCTQ0ODk5LCA2NDAsIDQ4MCwgMzIsIDE2MCwgMjA4LCA4NDgsIDIyLCAzNCwgNTEsCi0JCQkgICAgNTMxLCA2NDAsIDAsIDgsCi0JCQkgICAgUE0zVmlkZW9Db250cm9sX0VOQUJMRSB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9MT1cKLQkJCSAgICB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9MT1cKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiODAweDYwMC00OC1sYWNlIiAqLwotLyogSU5URVJMQUNFRCBOT1QgU1VQUE9SVEVECi0gIHsiODAweDYwMC00OC1sYWNlIiwgezM1OTk5LCA4MDAsIDYwMCwgODAsIDIwOCwgMjY0LCAxMDY0LCAxMSwgMjMsIDEwMiwgNzAyLCA4MDAsIDAsIDgsIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEV8UE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdIfFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSHxQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwgCi0gICBJTlRFUkxBQ0VEIE5PVCBTVVBQT1JURUQgKi8KLS8qIEdlbmVyYXRlZCBtb2RlIDogIjgwMHg2MDAtNTYiICovCi0JewotCQkiODAweDYwMC01NiIsIHsKLQkzNTk5OSwgODAwLCA2MDAsIDI0LCA5NiwgMjI0LCAxMDI0LCAxLCAzLCAyNSwgNjI1LAotCQkJICAgIDgwMCwgMCwgOCwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfRU5BQkxFIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9ISUdICi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLS8qIEdlbmVyYXRlZCBtb2RlIDogIjgwMHg2MDAtNjAiICovCi0JewotCQkiODAweDYwMC02MCIsIHsKLQk0MDAwMCwgODAwLCA2MDAsIDQwLCAxNjgsIDI1NiwgMTA1NiwgMSwgNSwgMjgsIDYyOCwKLQkJCSAgICA4MDAsIDAsIDgsCi0JCQkgICAgUE0zVmlkZW9Db250cm9sX0VOQUJMRSB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdICi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwgUE0zVmlkZW9Db250cm9sX1BJWEVMU0laRV84QklUfX0sCi0vKiBHZW5lcmF0ZWQgbW9kZSA6ICI4MDB4NjAwLTcwIiAqLwotCXsKLQkJIjgwMHg2MDAtNzAiLCB7Ci0JNDQ4OTksIDgwMCwgNjAwLCAyNCwgMTY4LCAyMDgsIDEwMDgsIDksIDIxLCAzNiwKLQkJCSAgICA2MzYsIDgwMCwgMCwgOCwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfRU5BQkxFIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9MT1cKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiODAweDYwMC03MiIgKi8KLQl7Ci0JCSI4MDB4NjAwLTcyIiwgewotCTUwMDAwLCA4MDAsIDYwMCwgNTYsIDE3NiwgMjQwLCAxMDQwLCAzNywgNDMsIDY2LAotCQkJICAgIDY2NiwgODAwLCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiODAweDYwMC03NSIgKi8KLQl7Ci0JCSI4MDB4NjAwLTc1IiwgewotCTQ5NDk3LCA4MDAsIDYwMCwgMTYsIDk2LCAyNTYsIDEwNTYsIDEsIDQsIDI1LCA2MjUsCi0JCQkgICAgODAwLCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiODAweDYwMC05MCIgKi8KLQl7Ci0JCSI4MDB4NjAwLTkwIiwgewotCTU2NjM3LCA4MDAsIDYwMCwgOCwgNzIsIDE5MiwgOTkyLCA4LCAxOSwgMzUsIDYzNSwKLQkJCSAgICA4MDAsIDAsIDgsCi0JCQkgICAgUE0zVmlkZW9Db250cm9sX0VOQUJMRSB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdICi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwgUE0zVmlkZW9Db250cm9sX1BJWEVMU0laRV84QklUfX0sCi0vKiBHZW5lcmF0ZWQgbW9kZSA6ICI4MDB4NjAwLTEwMCIsIGZyb20gL2V0Yy9mYi5tb2RlcyAqLwotLyogRElTQUJMRUQsIGhzc3RhcnQgPT0gMAotCXsKLQkJIjgwMHg2MDAtMTAwIiwgewotCTY3NDk5LCA4MDAsIDYwMCwgMCwgNjQsIDI4MCwgMTA4MCwgNywgMTEsIDI1LCA2MjUsCi0JCQkgICAgODAwLCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotKi8KLS8qIEdlbmVyYXRlZCBtb2RlIDogIjgwMHg2MDAtMTAwIiwgZnJvbSA/Pz8gKi8KLQl7Ci0JCSI4MDB4NjAwLTEwMCIsIHsKLQkJCTY5NjUwLCA4MDAsIDYwMCwgNjQsIDEyOCwgMjg4LCAxMDg4LCA0LCAxMCwgNDAsIDY0MCwgODAwLCAwLCA4LAotCQkJUE0zVmlkZW9Db250cm9sX0VOQUJMRXxQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0xPV3wKLQkJCVBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XfFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiMTAyNHg3NjgtNDMtbGFjZSIgKi8KLS8qIElOVEVSTEFDRUQgTk9UIFNVUFBPUlRFRAotICB7IjEwMjR4NzY4LTQzLWxhY2UiLCB7NDQ4OTksIDEwMjQsIDc2OCwgOCwgMTg0LCAyNDAsIDEyNjQsIDEsIDksIDQ5LCA4MTcsIDEwMjQsIDAsIDgsIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEV8UE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdIfFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSHxQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwgCi0gICBJTlRFUkxBQ0VEIE5PVCBTVVBQT1JURUQgKi8KLS8qIEdlbmVyYXRlZCBtb2RlIDogIjEwMjR4NzY4LTYwIiAqLwotCXsKLQkJIjEwMjR4NzY4LTYwIiwgewotCTY0OTk4LCAxMDI0LCA3NjgsIDI0LCAxNjAsIDMyMCwgMTM0NCwgMywgOSwgMzgsCi0JCQkgICAgODA2LCAxMDI0LCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLS8qIEdlbmVyYXRlZCBtb2RlIDogIjEwMjR4NzY4LTcwIiAqLwotCXsKLQkJIjEwMjR4NzY4LTcwIiwgewotCTc0OTk2LCAxMDI0LCA3NjgsIDI0LCAxNjAsIDMwNCwgMTMyOCwgMywgOSwgMzgsCi0JCQkgICAgODA2LCAxMDI0LCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLS8qIEdlbmVyYXRlZCBtb2RlIDogIjEwMjR4NzY4LTcyIiAqLwotCXsKLQkJIjEwMjR4NzY4LTcyIiwgewotCTc0OTk2LCAxMDIyNCwgNzY4LCAyNCwgMTYwLCAyNjQsIDEwNDg4LCAzLCA5LCAzOCwKLQkJCSAgICA4MDYsIDEwMjI0LCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLS8qIEdlbmVyYXRlZCBtb2RlIDogIjEwMjR4NzY4LTc1IiAqLwotCXsKLQkJIjEwMjR4NzY4LTc1IiwgewotCTc4NzQ2LCAxMDI0LCA3NjgsIDE2LCAxMTIsIDI4OCwgMTMxMiwgMSwgNCwgMzIsCi0JCQkgICAgODAwLCAxMDI0LCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiMTAyNHg3NjgtOTAiICovCi0JewotCQkiMTAyNHg3NjgtOTAiLCB7Ci0JMTAwMDAwLCAxMDI0LCA3NjgsIDAsIDk2LCAyODgsIDEzMTIsIDIxLCAzNiwgNzcsCi0JCQkgICAgODQ1LCAxMDI0LCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLS8qIEdlbmVyYXRlZCBtb2RlIDogIjEwMjR4NzY4LTEwMCIsIGZyb20gL2V0Yy9mYi5tb2RlcyAqLwotLyogRElTQUJMRUQsIHZzc3RhcnQgPT0gMAotCXsKLQkJIjEwMjR4NzY4LTEwMCIsIHsKLQkxMDk5OTgsIDEwMjQsIDc2OCwgMCwgODgsIDM2OCwgMTM5MiwgMCwgOCwgMjQsIDc5MiwKLQkJCSAgICAxMDI0LCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLSovCi0vKiBHZW5lcmF0ZWQgbW9kZSA6ICIxMDI0eDc2OC0xMDAiLCBmcm9tID8/PyAqLwotCXsKLQkJIjEwMjR4NzY4LTEwMCIsIHsKLQkJCTExNTUwMCwgMTAyNCwgNzY4LCAzMiwgMjI0LCA0MTYsIDE0NDAsIDMsIDEzLCAzNCwgODAyLCAxMDI0LCAwLCA4LAotCQkJUE0zVmlkZW9Db250cm9sX0VOQUJMRXxQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0xPV3wKLQkJCVBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XfFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiMTE1Mng4NjQtNDMtbGFjZSIgKi8KLS8qIElOVEVSTEFDRUQgTk9UIFNVUFBPUlRFRAotICB7IjExNTJ4ODY0LTQzLWxhY2UiLCB7NjQ5OTgsIDExNTIsIDg2NCwgNzIsIDIwMCwgMjY0LCAxNDE2LCA3OCwgODcsIDE5MSwgMTA1NSwgMTE1MiwgMCwgOCwgUE0zVmlkZW9Db250cm9sX0VOQUJMRXxQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0hJR0h8UE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9ISUdIfFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LCAKLSAgIElOVEVSTEFDRUQgTk9UIFNVUFBPUlRFRCAqLwotLyogR2VuZXJhdGVkIG1vZGUgOiAiMTE1Mng4NjQtNDctbGFjZSIgKi8KLS8qIElOVEVSTEFDRUQgTk9UIFNVUFBPUlRFRAotICB7IjExNTJ4ODY0LTQ3LWxhY2UiLCB7NjQ5OTgsIDExNTIsIDg2NCwgODgsIDIxNiwgMjk2LCAxNDQ4LCAzMCwgMzksIDgzLCA5NDcsIDExNTIsIDAsIDgsIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEV8UE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdIfFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSHxQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwgCi0gICBJTlRFUkxBQ0VEIE5PVCBTVVBQT1JURUQgKi8KLS8qIEdlbmVyYXRlZCBtb2RlIDogIjExNTJ4ODY0LTYwIiAqLwotCXsKLQkJIjExNTJ4ODY0LTYwIiwgewotCTgwMDAwLCAxMTUyLCA4NjQsIDY0LCAxNzYsIDMwNCwgMTQ1NiwgNiwgMTEsIDUyLAotCQkJICAgIDkxNiwgMTE1MiwgMCwgOCwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfRU5BQkxFIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9ISUdICi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLS8qIEdlbmVyYXRlZCBtb2RlIDogIjExNTJ4ODY0LTcwIiAqLwotCXsKLQkJIjExNTJ4ODY0LTcwIiwgewotCTEwMDAwMCwgMTE1MiwgODY0LCA0MCwgMTkyLCAzNjAsIDE1MTIsIDEzLCAyNCwgODEsCi0JCQkgICAgOTQ1LCAxMTUyLCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiMTE1Mng4NjQtNzUiICovCi0JewotCQkiMTE1Mng4NjQtNzUiLCB7Ci0JMTA5OTk4LCAxMTUyLCA4NjQsIDI0LCAxNjgsIDMxMiwgMTQ2NCwgNDUsIDUzLCAxMzgsCi0JCQkgICAgMTAwMiwgMTE1MiwgMCwgOCwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfRU5BQkxFIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9ISUdICi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLS8qIEdlbmVyYXRlZCBtb2RlIDogIjExNTJ4ODY0LTgwIiAqLwotCXsKLQkJIjExNTJ4ODY0LTgwIiwgewotCTEwOTk5OCwgMTE1MiwgODY0LCAxNiwgMTI4LCAyODgsIDE0NDAsIDMwLCAzNywgOTQsCi0JCQkgICAgOTU4LCAxMTUyLCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiMTI4MHgxMDI0LTQzLWxhY2UiICovCi0vKiBJTlRFUkxBQ0VEIE5PVCBTVVBQT1JURUQKLSAgeyIxMjgweDEwMjQtNDMtbGFjZSIsIHs4MDAwMCwgMTAyNCwgMTAyNCwgODAsIDE2MCwgMzIwLCAxMzQ0LCA1MCwgNjAsIDEyNSwgMTE0OSwgMTAyNCwgMCwgOCwgUE0zVmlkZW9Db250cm9sX0VOQUJMRXxQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0hJR0h8UE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9ISUdIfFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LCAKLSAgIElOVEVSTEFDRUQgTk9UIFNVUFBPUlRFRCAqLwotLyogR2VuZXJhdGVkIG1vZGUgOiAiMTI4MHgxMDI0LTQ3LWxhY2UiICovCi0vKiBJTlRFUkxBQ0VEIE5PVCBTVVBQT1JURUQKLSAgeyIxMjgweDEwMjQtNDctbGFjZSIsIHs4MDAwMCwgMTI4MCwgMTAyNCwgODAsIDE2MCwgMzIwLCAxNjAwLCAxLCAxMSwgMjksIDEwNTMsIDEyODAsIDAsIDgsIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEV8UE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdIfFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSHxQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwgCi0gICBJTlRFUkxBQ0VEIE5PVCBTVVBQT1JURUQgKi8KLS8qIEdlbmVyYXRlZCBtb2RlIDogIjEyODB4MTAyNC02MCIgKi8KLQl7Ci0JCSIxMjgweDEwMjQtNjAiLCB7Ci0JMTA3OTkxLCAxMjgwLCAxMDI0LCA0OCwgMTYwLCA0MDgsIDE2ODgsIDEsIDQsIDQyLAotCQkJICAgIDEwNjYsIDEyODAsIDAsIDgsCi0JCQkgICAgUE0zVmlkZW9Db250cm9sX0VOQUJMRSB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdICi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwgUE0zVmlkZW9Db250cm9sX1BJWEVMU0laRV84QklUfX0sCi0vKiBHZW5lcmF0ZWQgbW9kZSA6ICIxMjgweDEwMjQtNzAiICovCi0JewotCQkiMTI4MHgxMDI0LTcwIiwgewotCTEyNTk5MiwgMTI4MCwgMTAyNCwgODAsIDE5MiwgNDA4LCAxNjg4LCAxLCA2LCA0MiwKLQkJCSAgICAxMDY2LCAxMjgwLCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiMTI4MHgxMDI0LTc0IiAqLwotCXsKLQkJIjEyODB4MTAyNC03NCIsIHsKLQkxMzQ5ODksIDEyODAsIDEwMjQsIDMyLCAxNzYsIDQzMiwgMTcxMiwgMCwgMzAsIDQwLAotCQkJICAgIDEwNjQsIDEyODAsIDAsIDgsCi0JCQkgICAgUE0zVmlkZW9Db250cm9sX0VOQUJMRSB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdICi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwgUE0zVmlkZW9Db250cm9sX1BJWEVMU0laRV84QklUfX0sCi0vKiBHZW5lcmF0ZWQgbW9kZSA6ICIxMjgweDEwMjQtNzUiICovCi0JewotCQkiMTI4MHgxMDI0LTc1IiwgewotCTEzNDk4OSwgMTI4MCwgMTAyNCwgMTYsIDE2MCwgNDA4LCAxNjg4LCAxLCA0LCA0MiwKLQkJCSAgICAxMDY2LCAxMjgwLCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSAotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiMTYwMHgxMjAwLTYwIiAqLwotCXsKLQkJIjE2MDB4MTIwMC02MCIsIHsKLQkxNTU5ODEsIDE2MDAsIDEyMDAsIDMyLCAxOTIsIDQ0OCwgMjA0OCwgMTAsIDE4LCA3MCwKLQkJCSAgICAxMjcwLCAxNjAwLCAwLCA4LAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9FTkFCTEUgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfAotCQkJICAgIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfTE9XCi0JCQkgICAgfCBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzhCSVR9fSwKLS8qIEdlbmVyYXRlZCBtb2RlIDogIjE2MDB4MTIwMC02NiIgKi8KLQl7Ci0JCSIxNjAweDEyMDAtNjYiLCB7Ci0JMTcxOTk4LCAxNjAwLCAxMjAwLCA0MCwgMTc2LCA0ODAsIDIwODAsIDMsIDYsIDUzLAotCQkJICAgIDEyNTMsIDE2MDAsIDAsIDgsCi0JCQkgICAgUE0zVmlkZW9Db250cm9sX0VOQUJMRSB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9MT1cKLQkJCSAgICB8Ci0JCQkgICAgUE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9MT1cKLQkJCSAgICB8IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVH19LAotLyogR2VuZXJhdGVkIG1vZGUgOiAiMTYwMHgxMjAwLTc2IiAqLwotCXsKLQkJIjE2MDB4MTIwMC03NiIsIHsKLQkxOTc5ODAsIDE2MDAsIDEyMDAsIDQwLCAxNzYsIDQ4MCwgMjA4MCwgMywgOCwgNTAsCi0JCQkgICAgMTI1MCwgMTYwMCwgMCwgOCwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfRU5BQkxFIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0xPVwotCQkJICAgIHwKLQkJCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0xPVwotCQkJICAgIHwgUE0zVmlkZW9Db250cm9sX1BJWEVMU0laRV84QklUfX0sCi0vKiAjIyMjIyBlbmQgb2YgYXV0by1nZW5lcmF0ZWQgbW9kZSAqLwotCXsKLQkiXDAiLH0KLX07Ci0KLS8qIG1vcmUgbWFuZGF0b3J5IHN0dWZmIChzZWUgc2tlbGV0b25mYi5jICsgZnJhbWVidWZmZXIgZHJpdmVyIEhPV1RPICovCi1zdGF0aWMgc3RydWN0IHBtM2ZiX2luZm8gZmJfaW5mb1tQTTNfTUFYX0JPQVJEXTsKLXN0YXRpYyBzdHJ1Y3QgcG0zZmJfcGFyIGN1cnJlbnRfcGFyW1BNM19NQVhfQk9BUkRdOwotc3RhdGljIGludCBjdXJyZW50X3Bhcl92YWxpZFtQTTNfTUFYX0JPQVJEXTsKLS8qIHRvIGFsbG93IGV4cGxpY2l0IGZpbHRlcmluZyBvZiBib2FyZCAqLwotc2hvcnQgYnVzW1BNM19NQVhfQk9BUkRdOwotc2hvcnQgc2xvdFtQTTNfTUFYX0JPQVJEXTsKLXNob3J0IGZ1bmNbUE0zX01BWF9CT0FSRF07Ci1zaG9ydCBkaXNhYmxlW1BNM19NQVhfQk9BUkRdOwotc2hvcnQgbm9hY2NlbFtQTTNfTUFYX0JPQVJEXTsKLWNoYXIgZm9udG5bUE0zX01BWF9CT0FSRF1bUE0zX0ZPTlROQU1FX1NJWkVdOwotc2hvcnQgZGVwdGhbUE0zX01BWF9CT0FSRF07Ci1zaG9ydCBmbGF0cGFuZWxbUE0zX01BWF9CT0FSRF07Ci1zdGF0aWMgc3RydWN0IGRpc3BsYXkgZGlzcFtQTTNfTUFYX0JPQVJEXTsKLXN0YXRpYyBjaGFyIGdfb3B0aW9uc1tQTTNfT1BUSU9OU19TSVpFXSBfX2luaXRkYXRhID0gInBtM2ZiLGR1bW15IjsKLXNob3J0IHByaW50dGltaW5ncyA9IDA7Ci1zaG9ydCBmb3JjZXNpemVbUE0zX01BWF9CT0FSRF07Ci0KLS8qICoqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKiogcHJvdG90eXBlICoqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKiogKi8KLS8qIGNhcmQtc3BlY2lmaWMgKi8KLXN0YXRpYyB2b2lkIHBtM2ZiX2oyMDAwX3NldHVwKHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8pOwotLyogcGVybWVkaWEzLXNwZWNpZmljICovCi1zdGF0aWMgcG0zZmJfdGltaW5nX3Jlc3VsdCBwbTNmYl9wcmVzZXJ2ZV9tZW1vcnlfdGltaW5ncyhzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvKTsKLXN0YXRpYyBwbTNmYl90aW1pbmdfcmVzdWx0IHBtM2ZiX3RyeV9tZW1vcnlfdGltaW5ncyhzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvKTsKLXN0YXRpYyB2b2lkIHBtM2ZiX3dyaXRlX21lbW9yeV90aW1pbmdzKHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8pOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcG0zZmJfcmVhZF9kYWNfcmVnKHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8sCi0JCQkJCXVuc2lnbmVkIGxvbmcgcik7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwbTNmYl9DYWxjdWxhdGVDbG9jayhzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvLCB1bnNpZ25lZCBsb25nIHJlcWNsb2NrLAkvKiBJbiBrSHogdW5pdHMgKi8KLQkJCQkJICB1bnNpZ25lZCBsb25nIHJlZmNsb2NrLAkvKiBJbiBrSHogdW5pdHMgKi8KLQkJCQkJICB1bnNpZ25lZCBjaGFyICpwcmVzY2FsZSwJLyogQ2xrUHJlU2NhbGUgKi8KLQkJCQkJICB1bnNpZ25lZCBjaGFyICpmZWVkYmFjaywJLyogQ2xrRmVlZEJhY2tTY2FsZSAqLwotCQkJCQkgIHVuc2lnbmVkIGNoYXIgKnBvc3RzY2FsZQotCQkJCQkgIC8qIENsa1Bvc3RTY2FsZSAqLyApOwotc3RhdGljIHZvaWQgcG0zZmJfY2xlYXJfbWVtb3J5KHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8sIHUzMiBjYyk7Ci1zdGF0aWMgdm9pZCBwbTNmYl9jbGVhcl9jb2xvcm1hcChzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvLCB1bnNpZ25lZCBjaGFyIHIsIHVuc2lnbmVkIGNoYXIgZywgdW5zaWduZWQgY2hhciBiKTsKLXN0YXRpYyB2b2lkIHBtM2ZiX2NvbW1vbl9pbml0KHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8pOwotc3RhdGljIGludCBwbTNmYl9TaGlmdGJwcChzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvLAotCQkJICB1bnNpZ25lZCBsb25nIGRlcHRoLCBpbnQgdik7Ci1zdGF0aWMgaW50IHBtM2ZiX1Vuc2hpZnRicHAoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbywKLQkJCSAgICB1bnNpZ25lZCBsb25nIGRlcHRoLCBpbnQgdik7Ci1zdGF0aWMgdm9pZCBwbTNmYl9tYXBJTyhzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvKTsKLXN0YXRpYyB2b2lkIHBtM2ZiX3VubWFwSU8oc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyk7Ci0jaWYgZGVmaW5lZChQTTNGQl9NQVNURVJfREVCVUcpICYmIChQTTNGQl9NQVNURVJfREVCVUcgPj0gMikKLXN0YXRpYyB2b2lkIHBtM2ZiX3Nob3dfY3VyX21vZGUoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIHBtM2ZiX3Nob3dfY3VyX3RpbWluZyhzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvKTsKLXN0YXRpYyB2b2lkIHBtM2ZiX3dyaXRlX21vZGUoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyk7Ci1zdGF0aWMgdm9pZCBwbTNmYl9yZWFkX21vZGUoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbywKLQkJCSAgICBzdHJ1Y3QgcG0zZmJfcGFyICpjdXJwYXIpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcG0zZmJfc2l6ZV9tZW1vcnkoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyk7Ci0vKiBhY2NlbGVyYXRlZCBwZXJtZWRpYTMtc3BlY2lmaWMgKi8KLSNpZmRlZiBQTTNGQl9VU0VfQUNDRUwKLXN0YXRpYyB2b2lkIHBtM2ZiX3dhaXRfcG0zKHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8pOwotc3RhdGljIHZvaWQgcG0zZmJfaW5pdF9lbmdpbmUoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyk7Ci0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi1zdGF0aWMgdm9pZCBwbTNmYl9jZmIzMl9jbGVhcihzdHJ1Y3QgdmNfZGF0YSAqY29ucCwKLQkJCSAgICAgIHN0cnVjdCBkaXNwbGF5ICpwLAotCQkJICAgICAgaW50IHN5LCBpbnQgc3gsIGludCBoZWlnaHQsIGludCB3aWR0aCk7Ci1zdGF0aWMgdm9pZCBwbTNmYl9jZmIzMl9jbGVhcl9tYXJnaW5zKHN0cnVjdCB2Y19kYXRhICpjb25wLAotCQkJCSAgICAgIHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgYm90dG9tX29ubHkpOwotI2VuZGlmIC8qIEZCQ09OX0hBU19DRkIzMiAqLwotI2lmZGVmIEZCQ09OX0hBU19DRkIxNgotc3RhdGljIHZvaWQgcG0zZmJfY2ZiMTZfY2xlYXIoc3RydWN0IHZjX2RhdGEgKmNvbnAsCi0JCQkgICAgICBzdHJ1Y3QgZGlzcGxheSAqcCwKLQkJCSAgICAgIGludCBzeSwgaW50IHN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOwotc3RhdGljIHZvaWQgcG0zZmJfY2ZiMTZfY2xlYXJfbWFyZ2lucyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwKLQkJCQkgICAgICBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IGJvdHRvbV9vbmx5KTsKLSNlbmRpZiAvKiBGQkNPTl9IQVNfQ0ZCMTYgKi8KLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAotc3RhdGljIHZvaWQgcG0zZmJfY2ZiOF9jbGVhcihzdHJ1Y3QgdmNfZGF0YSAqY29ucCwKLQkJCSAgICAgc3RydWN0IGRpc3BsYXkgKnAsCi0JCQkgICAgIGludCBzeSwgaW50IHN4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOwotc3RhdGljIHZvaWQgcG0zZmJfY2ZiOF9jbGVhcl9tYXJnaW5zKHN0cnVjdCB2Y19kYXRhICpjb25wLAotCQkJCSAgICAgc3RydWN0IGRpc3BsYXkgKnAsIGludCBib3R0b21fb25seSk7Ci0jZW5kaWYgLyogRkJDT05fSEFTX0NGQjggKi8KLSNpZiBkZWZpbmVkKEZCQ09OX0hBU19DRkI4KSB8fCBkZWZpbmVkKEZCQ09OX0hBU19DRkIxNikgfHwgZGVmaW5lZChGQkNPTl9IQVNfQ0ZCMzIpCi1zdGF0aWMgdm9pZCBwbTNmYl9jZmJYX2Jtb3ZlKHN0cnVjdCBkaXNwbGF5ICpwLAotCQkJICAgICBpbnQgc3ksIGludCBzeCwKLQkJCSAgICAgaW50IGR5LCBpbnQgZHgsIGludCBoZWlnaHQsIGludCB3aWR0aCk7Ci1zdGF0aWMgdm9pZCBwbTNmYl9jZmJYX3B1dGMoc3RydWN0IHZjX2RhdGEgKmNvbnAsIHN0cnVjdCBkaXNwbGF5ICpwLAotCQkJICAgIGludCBjLCBpbnQgeXksIGludCB4eCk7Ci1zdGF0aWMgdm9pZCBwbTNmYl9jZmJYX3B1dGNzKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKLQkJCSAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnMsIGludCBjb3VudCwgaW50IHl5LAotCQkJICAgICBpbnQgeHgpOwotc3RhdGljIHZvaWQgcG0zZmJfY2ZiWF9yZXZjKHN0cnVjdCBkaXNwbGF5ICpwLCBpbnQgeHgsIGludCB5eSk7Ci0jZW5kaWYgLyogRkJDT05fSEFTX0NGQjggfHwgRkJDT05fSEFTX0NGQjE2IHx8IEZCQ09OX0hBU19DRkIzMiAqLwotI2VuZGlmIC8qIFBNM0ZCX1VTRV9BQ0NFTCAqLwotLyogcHJlLWluaXQgKi8KLXN0YXRpYyB2b2lkIHBtM2ZiX21vZGVfc2V0dXAoY2hhciAqbW9kZSwgdW5zaWduZWQgbG9uZyBib2FyZF9udW0pOwotc3RhdGljIHZvaWQgcG0zZmJfcGNpaWRfc2V0dXAoY2hhciAqcGNpaWQsIHVuc2lnbmVkIGxvbmcgYm9hcmRfbnVtKTsKLXN0YXRpYyBjaGFyICpwbTNmYl9ib2FyZG51bV9zZXR1cChjaGFyICpvcHRpb25zLCB1bnNpZ25lZCBsb25nICpibik7Ci1zdGF0aWMgdm9pZCBwbTNmYl9yZWFsX3NldHVwKGNoYXIgKm9wdGlvbnMpOwotLyogZmJkZXYgKi8KLXN0YXRpYyBpbnQgcG0zZmJfZW5jb2RlX2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwKLQkJCSAgICBjb25zdCB2b2lkICpwYXIsIHN0cnVjdCBmYl9pbmZvX2dlbiAqaW5mbyk7Ci1zdGF0aWMgaW50IHBtM2ZiX2RlY29kZV92YXIoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICAgdm9pZCAqcGFyLCBzdHJ1Y3QgZmJfaW5mb19nZW4gKmluZm8pOwotc3RhdGljIHZvaWQgcG0zZmJfZW5jb2RlX2RlcHRoKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBsb25nIGQpOwotc3RhdGljIGludCBwbTNmYl9lbmNvZGVfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgIGNvbnN0IHZvaWQgKnBhciwgc3RydWN0IGZiX2luZm9fZ2VuICppbmZvKTsKLXN0YXRpYyB2b2lkIHBtM2ZiX2dldF9wYXIodm9pZCAqcGFyLCBzdHJ1Y3QgZmJfaW5mb19nZW4gKmluZm8pOwotc3RhdGljIHZvaWQgcG0zZmJfc2V0X3Bhcihjb25zdCB2b2lkICpwYXIsIHN0cnVjdCBmYl9pbmZvX2dlbiAqaW5mbyk7Ci1zdGF0aWMgdm9pZCBwbTNmYl9zZXRfY29sb3Ioc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbywKLQkJCSAgICB1bnNpZ25lZCBjaGFyIHJlZ25vLCB1bnNpZ25lZCBjaGFyIHIsCi0JCQkgICAgdW5zaWduZWQgY2hhciBnLCB1bnNpZ25lZCBjaGFyIGIpOwotc3RhdGljIGludCBwbTNmYl9nZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkICpyZWQsIHVuc2lnbmVkICpncmVlbiwKLQkJCSAgIHVuc2lnbmVkICpibHVlLCB1bnNpZ25lZCAqdHJhbnNwLAotCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwotc3RhdGljIGludCBwbTNmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCi0JCQkgICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCi0JCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7Ci1zdGF0aWMgaW50IHBtM2ZiX2JsYW5rKGludCBibGFua19tb2RlLCBzdHJ1Y3QgZmJfaW5mb19nZW4gKmluZm8pOwotc3RhdGljIHZvaWQgcG0zZmJfc2V0X2Rpc3AoY29uc3Qgdm9pZCAqcGFyLCBzdHJ1Y3QgZGlzcGxheSAqZGlzcCwKLQkJCSAgIHN0cnVjdCBmYl9pbmZvX2dlbiAqaW5mbyk7Ci1zdGF0aWMgdm9pZCBwbTNmYl9kZXRlY3Qodm9pZCk7Ci1zdGF0aWMgaW50IHBtM2ZiX3Bhbl9kaXNwbGF5KGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJICAgICBzdHJ1Y3QgZmJfaW5mb19nZW4gKmluZm8pOwotc3RhdGljIGludCBwbTNmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKTsKLQotCi0vKiB0aGUgc3RydWN0IHRoYXQgaG9sZCB0aGVtIHRvZ2V0aGVyICovCi1zdHJ1Y3QgZmJnZW5faHdzd2l0Y2ggcG0zZmJfc3dpdGNoID0gewotCXBtM2ZiX2RldGVjdCwgcG0zZmJfZW5jb2RlX2ZpeCwgcG0zZmJfZGVjb2RlX3ZhciwgcG0zZmJfZW5jb2RlX3ZhciwKLQlwbTNmYl9nZXRfcGFyLCBwbTNmYl9zZXRfcGFyLCBwbTNmYl9nZXRjb2xyZWcsIAotCXBtM2ZiX3Bhbl9kaXNwbGF5LCBwbTNmYl9ibGFuaywgcG0zZmJfc2V0X2Rpc3AKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfb3BzIHBtM2ZiX29wcyA9IHsKLQkub3duZXIgPQlUSElTX01PRFVMRSwKLQkuZmJfZ2V0X2ZpeCA9CWZiZ2VuX2dldF9maXgsCi0JLmZiX2dldF92YXIgPQlmYmdlbl9nZXRfdmFyLAotCS5mYl9zZXRfdmFyID0JZmJnZW5fc2V0X3ZhciwKLQkuZmJfZ2V0X2NtYXAgPQlmYmdlbl9nZXRfY21hcCwKLQkuZmJfc2V0X2NtYXAgPQlmYmdlbl9zZXRfY21hcCwKLQkuZmJfc2V0Y29scmVnID0JcG0zZmJfc2V0Y29scmVnLAotCS5mYl9wYW5fZGlzcGxheSA9ZmJnZW5fcGFuX2Rpc3BsYXksCi0JLmZiX2JsYW5rID0JZmJnZW5fYmxhbmssCi0JLmZiX2lvY3RsID0JcG0zZmJfaW9jdGwsCi19OwotCi0jaWZkZWYgUE0zRkJfVVNFX0FDQ0VMCi0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi1zdGF0aWMgc3RydWN0IGRpc3BsYXlfc3dpdGNoIHBtM2ZiX2NmYjMyID0gewotCWZiY29uX2NmYjMyX3NldHVwLCBwbTNmYl9jZmJYX2Jtb3ZlLCBwbTNmYl9jZmIzMl9jbGVhciwKLQlwbTNmYl9jZmJYX3B1dGMsIHBtM2ZiX2NmYlhfcHV0Y3MsIHBtM2ZiX2NmYlhfcmV2YywKLQlOVUxMIC8qIGN1cnNvcigpICovICwgTlVMTCAvKiBzZXRfZm9udCgpICovICwKLQlwbTNmYl9jZmIzMl9jbGVhcl9tYXJnaW5zLAotCUZPTlRXSURUSFJBTkdFKDEsIDE2KQkvKiB0cnVlIG9ubHkgaWYgYWNjZWxlcmF0ZWQuLi4gKi8KLX07Ci0jZW5kaWYgLyogRkJDT05fSEFTX0NGQjMyICovCi0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci1zdGF0aWMgc3RydWN0IGRpc3BsYXlfc3dpdGNoIHBtM2ZiX2NmYjE2ID0gewotCWZiY29uX2NmYjE2X3NldHVwLCBwbTNmYl9jZmJYX2Jtb3ZlLCBwbTNmYl9jZmIxNl9jbGVhciwKLQlwbTNmYl9jZmJYX3B1dGMsIHBtM2ZiX2NmYlhfcHV0Y3MsIHBtM2ZiX2NmYlhfcmV2YywKLQlOVUxMIC8qIGN1cnNvcigpICovICwgTlVMTCAvKiBzZXRfZm9udCgpICovICwKLQlwbTNmYl9jZmIxNl9jbGVhcl9tYXJnaW5zLAotCUZPTlRXSURUSFJBTkdFKDEsIDE2KQkvKiB0cnVlIG9ubHkgaWYgYWNjZWxlcmF0ZWQuLi4gKi8KLX07Ci0jZW5kaWYgLyogRkJDT05fSEFTX0NGQjE2ICovCi0jaWZkZWYgRkJDT05fSEFTX0NGQjgKLXN0YXRpYyBzdHJ1Y3QgZGlzcGxheV9zd2l0Y2ggcG0zZmJfY2ZiOCA9IHsKLQlmYmNvbl9jZmI4X3NldHVwLCBwbTNmYl9jZmJYX2Jtb3ZlLCBwbTNmYl9jZmI4X2NsZWFyLAotCXBtM2ZiX2NmYlhfcHV0YywgcG0zZmJfY2ZiWF9wdXRjcywgcG0zZmJfY2ZiWF9yZXZjLAotCU5VTEwgLyogY3Vyc29yKCkgKi8gLCBOVUxMIC8qIHNldF9mb250KCkgKi8gLAotCXBtM2ZiX2NmYjhfY2xlYXJfbWFyZ2lucywKLQlGT05UV0lEVEhSQU5HRSgxLCAxNikJLyogdHJ1ZSBvbmx5IGlmIGFjY2VsZXJhdGVkLi4uICovCi19OwotI2VuZGlmIC8qIEZCQ09OX0hBU19DRkI4ICovCi0jZW5kaWYgLyogUE0zRkJfVVNFX0FDQ0VMICovCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKiogY2FyZC1zcGVjaWZpYyBkYXRhICoqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0cnVjdCBwbTNmYl9jYXJkX3RpbWluZ3MgewotCXVuc2lnbmVkIGxvbmcgbWVtc2l6ZTsgLyogMCBmb3IgbGFzdCB2YWx1ZSAoaS5lLiBkZWZhdWx0KSAqLwotCXN0cnVjdCBwbTNmYl90aW1pbmdzIG1lbXQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IHBtM2ZiX2NhcmRfdGltaW5ncyB0X0Zvcm1hY1Byb0Zvcm1hbmNlM1tdID0gewotCXsgMTYsIHsgMHgwMmUzMTFiOCwgMHgwNjEwMDIwNSwgMHgwODAwMDAwMiwgMHgwMDAwMDA3OSwgMHgwMDAwMDAwMH0gfSwKLQl7IDAsIHsgMHgwMmUzMTFiOCwgMHgwNjEwMDIwNSwgMHgwODAwMDAwMiwgMHgwMDAwMDA3OSwgMHgwMDAwMDAwMH0gfSAvKiBmcm9tIDE2IE1CIFBGMyAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBwbTNmYl9jYXJkX3RpbWluZ3MgdF9BcHBpYW5KZXJvbmltbzIwMDBbXSA9IHsKLQl7IDMyLCB7IDB4MDJlMzExQjgsIDB4MDc0MjQ5MDUsIDB4MGMwMDAwMDMsIDB4MDAwMDAwNjEsIDB4MDAwMDAwMDB9IH0sCi0JeyAwLCB7IDB4MDJlMzExQjgsIDB4MDc0MjQ5MDUsIDB4MGMwMDAwMDMsIDB4MDAwMDAwNjEsIDB4MDAwMDAwMDB9IH0gLyogZnJvbSAzMk1CIEoyMDAwICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBtM2ZiX2NhcmRfdGltaW5ncyB0XzNETGFic094eWdlblZYMVtdID0gewotCXsgMzIsIHsgMHgzMGUzMTFiOCwgMHgwODUwMTIwNCwgMHgwODAwMDAwMiwgMHgwMDAwMDA2YiwgMHgwMDAwMDAwMH0gfSwKLQl7IDAsIHsgMHgzMGUzMTFiOCwgMHgwODUwMTIwNCwgMHgwODAwMDAwMiwgMHgwMDAwMDA2YiwgMHgwMDAwMDAwMH0gfSAvKiBmcm9tIDMyTUIgVlgxICovCi19OwotCi1zdGF0aWMgc3RydWN0IHsKLQkJY2hhciBjYXJkbmFtZVszMl07IC8qIHJlY29nbml6ZWQgY2FyZCBuYW1lICovCi0JCXUxNiBzdWJ2ZW5kb3I7IC8qIHN1YnZlbmRvciBvZiB0aGUgY2FyZCAqLwotCQl1MTYgc3ViZGV2aWNlOyAvKiBzdWJkZXZpY2Ugb2YgdGhlIGNhcmQgKi8KLQkJdTggIGZ1bmM7IC8qIGZ1bmN0aW9uIG9mIHRoZSBjYXJkIHRvIHdoaWNoIHRoZSBleHRyYSBpbml0IGFwcGx5ICovCi0JCXZvaWQgKCpzcGVjaWZpY19zZXR1cCkoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyk7IC8qIGNhcmQvZnVuYyBzcGVjaWZpYyBzZXR1cCwgZG9uZSBiZWZvcmUgX2FueV8gRkIgYWNjZXNzICovCi0Jc3RydWN0IHBtM2ZiX2NhcmRfdGltaW5ncyAqY19tZW10OyAvKiBkZWZhdWxzIHRpbWluZ3MgZm9yIHRoZSBib2FyZHMgKi8KLX0gY2FyZGJhc2VbXSA9IHsKLQl7ICJVbmtub3duIFBlcm1lZGlhMyBib2FyZCIsIDB4RkZGRiwgMHhGRkZGLCAweEZGLCBOVUxMLCBOVUxMIH0sCi0JeyAiQXBwaWFuIEplcm9uaW1vIDIwMDAgaGVhZCAxIiwgMHgxMDk3LCAweDNkMzIsIDEsIE5VTEwsCi0JICB0X0FwcGlhbkplcm9uaW1vMjAwMAotCX0sCi0JeyAiQXBwaWFuIEplcm9uaW1vIDIwMDAgaGVhZCAyIiwgMHgxMDk3LCAweDNkMzIsIDIsIHBtM2ZiX2oyMDAwX3NldHVwLAotCSAgdF9BcHBpYW5KZXJvbmltbzIwMDAKLQl9LAotCXsgIkZvcm1hYyBQcm9Gb3JtYW5jZSAzIiwgUENJX1ZFTkRPUl9JRF8zRExBQlMsIDB4MDAwYSwgMCwgTlVMTCwgLyogRm9ybWFjIHVzZSAzRExhYnMgSUQgPyE/ICovCi0JICB0X0Zvcm1hY1Byb0Zvcm1hbmNlMwotCX0sCi0JeyAiM0RMYWJzIFBlcm1lZGlhMyBDcmVhdGUhIiwgUENJX1ZFTkRPUl9JRF8zRExBQlMsIDB4MDEyNywgMCwgTlVMTCwgTlVMTCB9LAotCXsgIjNETGFicyBPeHlnZW4gVlgxIFBDSSIsIFBDSV9WRU5ET1JfSURfM0RMQUJTLCAweDAxMjEsIDAsIE5VTEwsCi0JICB0XzNETGFic094eWdlblZYMQotCX0sCi0JeyAiM0RMYWJzIE94eWdlbiBWWDEgQUdQIiwgUENJX1ZFTkRPUl9JRF8zRExBQlMsIDB4MDEyNSwgMCwgTlVMTCwgTlVMTCB9LAotCXsgIjNETGFicyBPeHlnZW4gVlgxLTE2IEFHUCIsIFBDSV9WRU5ET1JfSURfM0RMQUJTLCAweDAxNDAsIDAsIE5VTEwsIE5VTEwgfSwKLQl7ICIzRExhYnMgT3h5Z2VuIFZYMS0xNjAwU1cgUENJIiwgUENJX1ZFTkRPUl9JRF8zRExBQlMsIDB4MDgwMCwgMCwgTlVMTCwgTlVMTCB9LAotCXsgIlwwIiwgMHgwLCAweDAsIDAsIE5VTEwsIE5VTEwgfQotfTsKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKiogY2FyZC1zcGVjaWZpYyBmdW5jdGlvbiAqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQgcG0zZmJfajIwMDBfc2V0dXAoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbykKLXsgICAgICAgLyogdGhlIGFwcGlhbiBqMjAwMCByZXF1aXJlIG1vcmUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHNlY29uZCBoZWFkICovCi0JLyogbF9mYl9pbmZvIG11c3QgcG9pbnQgdG8gdGhlIF9zZWNvbmRfIGhlYWQgb2YgdGhlIEoyMDAwICovCi0JCi0JRFRSQUNFOwotCi0JbF9mYl9pbmZvLT5tZW10ID0gdF9BcHBpYW5KZXJvbmltbzIwMDBbMF0ubWVtdDsgLyogMzIgTUIsIGZpcnN0IGFuZCBvbmx5IGoyMDAwID8gKi8KLQkKLQlwbTNmYl93cml0ZV9tZW1vcnlfdGltaW5ncyhsX2ZiX2luZm8pOworCXJldHVybiBmYl9yZWFkbChwYXItPnZfcmVncyArIG9mZik7CiB9CiAKLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKiogcGVybWVkaWEzLXNwZWNpZmljIGZ1bmN0aW9uICoqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyBwbTNmYl90aW1pbmdfcmVzdWx0IHBtM2ZiX3ByZXNlcnZlX21lbW9yeV90aW1pbmdzKHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8pCitzdGF0aWMgaW5saW5lIHZvaWQgUE0zX1dSSVRFX1JFRyhzdHJ1Y3QgcG0zX3BhciAqcGFyLCBzMzIgb2ZmLCB1MzIgdikKIHsKLQlsX2ZiX2luZm8tPm1lbXQuY2FwcyA9IFBNM19SRUFEX1JFRyhQTTNMb2NhbE1lbUNhcHMpOwotCWxfZmJfaW5mby0+bWVtdC50aW1pbmdzID0gUE0zX1JFQURfUkVHKFBNM0xvY2FsTWVtVGltaW5ncyk7Ci0JbF9mYl9pbmZvLT5tZW10LmNvbnRyb2wgPSBQTTNfUkVBRF9SRUcoUE0zTG9jYWxNZW1Db250cm9sKTsKLQlsX2ZiX2luZm8tPm1lbXQucmVmcmVzaCA9IFBNM19SRUFEX1JFRyhQTTNMb2NhbE1lbVJlZnJlc2gpOwotCWxfZmJfaW5mby0+bWVtdC5wb3dlcmRvd24gPSBQTTNfUkVBRF9SRUcoUE0zTG9jYWxNZW1Qb3dlckRvd24pOworCWZiX3dyaXRlbCh2LCBwYXItPnZfcmVncyArIG9mZik7Cit9CiAKLQlpZiAoKGxfZmJfaW5mby0+bWVtdC5jYXBzID09IFBNM0ZCX1VOS05PV05fVElNSU5HX1ZBTFVFKSB8fAotCSAgICAobF9mYl9pbmZvLT5tZW10LnRpbWluZ3MgPT0gUE0zRkJfVU5LTk9XTl9USU1JTkdfVkFMVUUpIHx8Ci0JICAgIChsX2ZiX2luZm8tPm1lbXQuY29udHJvbCA9PSBQTTNGQl9VTktOT1dOX1RJTUlOR19WQUxVRSkgfHwKLQkgICAgKGxfZmJfaW5mby0+bWVtdC5yZWZyZXNoID09IFBNM0ZCX1VOS05PV05fVElNSU5HX1ZBTFVFKSB8fAotCSAgICAobF9mYl9pbmZvLT5tZW10LnBvd2VyZG93biA9PSBQTTNGQl9VTktOT1dOX1RJTUlOR19WQUxVRSkpCi0JewotCQlwcmludGsoS0VSTl9FUlIgInBtM2ZiOiBpbnZhbGlkIG1lbW9yeSB0aW1pbmdzIGluIHBlcm1lZGlhMyBib2FyZCAjJWxkXG4iLCBsX2ZiX2luZm8tPmJvYXJkX251bSk7Ci0JCXJldHVybihwbTNmYl90cnlfbWVtb3J5X3RpbWluZ3MobF9mYl9pbmZvKSk7CitzdGF0aWMgaW5saW5lIHZvaWQgUE0zX1dBSVQoc3RydWN0IHBtM19wYXIgKnBhciwgdTMyIG4pCit7CisJd2hpbGUgKFBNM19SRUFEX1JFRyhwYXIsIFBNM0luRklGT1NwYWNlKSA8IG4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgUE0zX1NMT1dfV1JJVEVfUkVHKHN0cnVjdCBwbTNfcGFyICpwYXIsIHMzMiBvZmYsIHUzMiB2KQoreworCWlmIChwYXItPnZfcmVncykgeworCQltYigpOworCQlQTTNfV0FJVChwYXIsIDEpOworCQl3bWIoKTsKKwkJUE0zX1dSSVRFX1JFRyhwYXIsIG9mZiwgdik7CiAJfQotCXJldHVybihwbTNmYl90aW1pbmdfb2spOwogfQogCi1zdGF0aWMgcG0zZmJfdGltaW5nX3Jlc3VsdCBwbTNmYl90cnlfbWVtb3J5X3RpbWluZ3Moc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbykKK3N0YXRpYyBpbmxpbmUgdm9pZCBQTTNfU0VUX0lOREVYKHN0cnVjdCBwbTNfcGFyICpwYXIsIHVuc2lnbmVkIGluZGV4KQogewotCWlmIChjYXJkYmFzZVtsX2ZiX2luZm8tPmJvYXJkX3R5cGVdLmNfbWVtdCkKLQl7Ci0JCWludCBpID0gMCwgZG9uZSA9IDA7Ci0JCXdoaWxlICghZG9uZSkKLQkJewotCQkJaWYgKChjYXJkYmFzZVtsX2ZiX2luZm8tPmJvYXJkX3R5cGVdLmNfbWVtdFtpXS5tZW1zaXplID09IGxfZmJfaW5mby0+ZmJfc2l6ZSkKLQkJCSAgICB8fCAhKGNhcmRiYXNlW2xfZmJfaW5mby0+Ym9hcmRfdHlwZV0uY19tZW10W2ldLm1lbXNpemUpKQotCQkJeyAvKiB3aWxsIHVzZSB0aGUgMC1zaXplZCB0aW1pbmdzIGJ5IGRlZmF1bHQgKi8KLQkJCQlkb25lID0gMTsKLQkJCQlsX2ZiX2luZm8tPm1lbXQgPSBjYXJkYmFzZVtsX2ZiX2luZm8tPmJvYXJkX3R5cGVdLmNfbWVtdFtpXS5tZW10OwotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgICJwbTNmYjogdHJ5aW5nIHRvIHVzZSBwcmVkZWZpbmVkIG1lbW9yeSB0aW1pbmdzIGZvciBwZXJtZWRpYTMgYm9hcmQgIyVsZCAoJXMsICVsZCBNQilcbiIsCi0JCQkJICAgICAgIGxfZmJfaW5mby0+Ym9hcmRfbnVtLAotCQkJCSAgICAgICBjYXJkYmFzZVtsX2ZiX2luZm8tPmJvYXJkX3R5cGVdLmNhcmRuYW1lLAotCQkJCSAgICAgICBjYXJkYmFzZVtsX2ZiX2luZm8tPmJvYXJkX3R5cGVdLmNfbWVtdFtpXS5tZW1zaXplKTsKLQkJCQlwbTNmYl93cml0ZV9tZW1vcnlfdGltaW5ncyhsX2ZiX2luZm8pOwotCQkJCXJldHVybihwbTNmYl90aW1pbmdfcmV0cnkpOwotCQkJfQotCQkJaSsrOwotCQl9Ci0JfSBlbHNlCi0JCXJldHVybihwbTNmYl90aW1pbmdfcHJvYmxlbSk7Ci0JcmV0dXJuKHBtM2ZiX3RpbWluZ19vayk7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zUkRfSW5kZXhIaWdoLCAoaW5kZXggPj4gOCkgJiAweGZmKTsKKwlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNSRF9JbmRleExvdywgaW5kZXggJiAweGZmKTsKIH0KIAotc3RhdGljIHZvaWQgcG0zZmJfd3JpdGVfbWVtb3J5X3RpbWluZ3Moc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbykKK3N0YXRpYyBpbmxpbmUgdm9pZCBQTTNfV1JJVEVfREFDX1JFRyhzdHJ1Y3QgcG0zX3BhciAqcGFyLCB1bnNpZ25lZCByLCB1OCB2KQogewotCXVuc2lnbmVkIGNoYXIgbSwgbiwgcDsKLQl1bnNpZ25lZCBsb25nIGNsb2NrdXNlZDsKLQkKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zTG9jYWxNZW1DYXBzLCBsX2ZiX2luZm8tPm1lbXQuY2Fwcyk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0xvY2FsTWVtVGltaW5ncywgbF9mYl9pbmZvLT5tZW10LnRpbWluZ3MpOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNMb2NhbE1lbUNvbnRyb2wsIGxfZmJfaW5mby0+bWVtdC5jb250cm9sKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zTG9jYWxNZW1SZWZyZXNoLCBsX2ZiX2luZm8tPm1lbXQucmVmcmVzaCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0xvY2FsTWVtUG93ZXJEb3duLCBsX2ZiX2luZm8tPm1lbXQucG93ZXJkb3duKTsKLQotCWNsb2NrdXNlZCA9Ci0JICAgIHBtM2ZiX0NhbGN1bGF0ZUNsb2NrKGxfZmJfaW5mbywgMiAqIDEwNTAwMCwgUE0zX1JFRl9DTE9DSywgJm0sCi0JCQkJICZuLCAmcCk7Ci0KLQlQTTNfV1JJVEVfREFDX1JFRyhQTTNSRF9LQ2xrUHJlU2NhbGUsIG0pOwotCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX0tDbGtGZWVkYmFja1NjYWxlLCBuKTsKLQlQTTNfV1JJVEVfREFDX1JFRyhQTTNSRF9LQ2xrUG9zdFNjYWxlLCBwKTsKLQlQTTNfV1JJVEVfREFDX1JFRyhQTTNSRF9LQ2xrQ29udHJvbCwKLQkJCSAgUE0zUkRfS0Nsa0NvbnRyb2xfU1RBVEVfUlVOIHwKLQkJCSAgUE0zUkRfS0Nsa0NvbnRyb2xfU09VUkNFX1BMTCB8Ci0JCQkgIFBNM1JEX0tDbGtDb250cm9sX0VOQUJMRSk7Ci0JUE0zX1dSSVRFX0RBQ19SRUcoUE0zUkRfTUNsa0NvbnRyb2wsCi0JCQkgIFBNM1JEX01DbGtDb250cm9sX1NUQVRFX1JVTiB8Ci0JCQkgIFBNM1JEX01DbGtDb250cm9sX1NPVVJDRV9LQ0xLIHwKLQkJCSAgUE0zUkRfTUNsa0NvbnRyb2xfRU5BQkxFKTsKLQlQTTNfV1JJVEVfREFDX1JFRyhQTTNSRF9TQ2xrQ29udHJvbCwKLQkJCSAgUE0zUkRfU0Nsa0NvbnRyb2xfU1RBVEVfUlVOIHwKLQkJCSAgUE0zUkRfU0Nsa0NvbnRyb2xfU09VUkNFX1BDTEsgfAotCQkJICBQTTNSRF9TQ2xrQ29udHJvbF9FTkFCTEUpOworCVBNM19TRVRfSU5ERVgocGFyLCByKTsKKwl3bWIoKTsKKwlQTTNfV1JJVEVfUkVHKHBhciwgUE0zUkRfSW5kZXhlZERhdGEsIHYpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwbTNmYl9yZWFkX2RhY19yZWcoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbywKLQkJCQkJdW5zaWduZWQgbG9uZyByKQorc3RhdGljIGlubGluZSB2b2lkIHBtM2ZiX3NldF9jb2xvcihzdHJ1Y3QgcG0zX3BhciAqcGFyLCB1bnNpZ25lZCBjaGFyIHJlZ25vLAorCQkJdW5zaWduZWQgY2hhciByLCB1bnNpZ25lZCBjaGFyIGcsIHVuc2lnbmVkIGNoYXIgYikKIHsKLQlEQVNTRVJUKChsX2ZiX2luZm8tPnZJT0Jhc2UgIT0gKHVuc2lnbmVkIGNoYXIgKikgKC0xKSksCi0JCSJsX2ZiX2luZm8tPnZJT0Jhc2UgbWFwcGVkIGluIHJlYWQgZGFjIHJlZ1xuIik7Ci0JUE0zX1NFVF9JTkRFWChyKTsKLQltYigpOwotCXJldHVybiAoUE0zX1JFQURfUkVHKFBNM1JEX0luZGV4ZWREYXRhKSk7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zUkRfUGFsZXR0ZVdyaXRlQWRkcmVzcywgcmVnbm8pOworCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM1JEX1BhbGV0dGVEYXRhLCByKTsKKwlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNSRF9QYWxldHRlRGF0YSwgZyk7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zUkRfUGFsZXR0ZURhdGEsIGIpOworfQorCitzdGF0aWMgdm9pZCBwbTNmYl9jbGVhcl9jb2xvcm1hcChzdHJ1Y3QgcG0zX3BhciAqcGFyLAorCQkJdW5zaWduZWQgY2hhciByLCB1bnNpZ25lZCBjaGFyIGcsIHVuc2lnbmVkIGNoYXIgYikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTYgOyBpKyspIC8qIGZpbGwgY29sb3IgbWFwIHdpdGggd2hpdGUgKi8KKwkJcG0zZmJfc2V0X2NvbG9yKHBhciwgaSwgciwgZywgYik7CisKIH0KIAogLyogQ2FsY3VsYXRpbmcgdmFyaW91cyBjbG9jayBwYXJhbWV0ZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBtM2ZiX0NhbGN1bGF0ZUNsb2NrKHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8sIHVuc2lnbmVkIGxvbmcgcmVxY2xvY2ssCS8qIEluIGtIeiB1bml0cyAqLwotCQkJCQkgIHVuc2lnbmVkIGxvbmcgcmVmY2xvY2ssCS8qIEluIGtIeiB1bml0cyAqLwotCQkJCQkgIHVuc2lnbmVkIGNoYXIgKnByZXNjYWxlLAkvKiBDbGtQcmVTY2FsZSAqLwotCQkJCQkgIHVuc2lnbmVkIGNoYXIgKmZlZWRiYWNrLAkvKiBDbGtGZWVkQmFja1NjYWxlICovCi0JCQkJCSAgdW5zaWduZWQgY2hhciAqcG9zdHNjYWxlCi0JCQkJCSAgLyogQ2xrUG9zdFNjYWxlICovICkKK3N0YXRpYyB2b2lkIHBtM2ZiX2NhbGN1bGF0ZV9jbG9jayh1bnNpZ25lZCBsb25nIHJlcWNsb2NrLAorCQkJCXVuc2lnbmVkIGNoYXIgKnByZXNjYWxlLAorCQkJCXVuc2lnbmVkIGNoYXIgKmZlZWRiYWNrLAorCQkJCXVuc2lnbmVkIGNoYXIgKnBvc3RzY2FsZSkKIHsKIAlpbnQgZiwgcHJlLCBwb3N0OwogCXVuc2lnbmVkIGxvbmcgZnJlcTsKIAlsb25nIGZyZXFlcnIgPSAxMDAwOwotCXVuc2lnbmVkIGxvbmcgYWN0dWFsY2xvY2sgPSAwOwotCi0JRFRSQUNFOworCWxvbmcgY3VycmVycjsKIAogCWZvciAoZiA9IDE7IGYgPCAyNTY7IGYrKykgewogCQlmb3IgKHByZSA9IDE7IHByZSA8IDI1NjsgcHJlKyspIHsKIAkJCWZvciAocG9zdCA9IDA7IHBvc3QgPCA1OyBwb3N0KyspIHsKLQkJCQlmcmVxID0KLQkJCQkgICAgKCgyICogcmVmY2xvY2sgKiBmKSAvCi0JCQkJICAgICAocHJlICogKDEgPDwgcG9zdCkpKTsKLQkJCQlpZiAoKHJlcWNsb2NrID4gZnJlcSAtIGZyZXFlcnIpCi0JCQkJICAgICYmIChyZXFjbG9jayA8IGZyZXEgKyBmcmVxZXJyKSkgewotCQkJCQlmcmVxZXJyID0KLQkJCQkJICAgIChyZXFjbG9jayA+Ci0JCQkJCSAgICAgZnJlcSkgPyByZXFjbG9jayAtCi0JCQkJCSAgICBmcmVxIDogZnJlcSAtIHJlcWNsb2NrOworCQkJCWZyZXEgPSAoKDIqUE0zX1JFRl9DTE9DSyAqIGYpID4+IHBvc3QpIC8gcHJlOworCQkJCWN1cnJlcnIgPSAocmVxY2xvY2sgPiBmcmVxKQorCQkJCQk/IHJlcWNsb2NrIC0gZnJlcQorCQkJCQk6IGZyZXEgLSByZXFjbG9jazsKKwkJCQlpZiAoY3VycmVyciA8IGZyZXFlcnIpIHsKKwkJCQkJZnJlcWVyciA9IGN1cnJlcnI7CiAJCQkJCSpmZWVkYmFjayA9IGY7CiAJCQkJCSpwcmVzY2FsZSA9IHByZTsKIAkJCQkJKnBvc3RzY2FsZSA9IHBvc3Q7Ci0JCQkJCWFjdHVhbGNsb2NrID0gZnJlcTsKIAkJCQl9CiAJCQl9CiAJCX0KIAl9Ci0KLQlyZXR1cm4gKGFjdHVhbGNsb2NrKTsKIH0KIAotc3RhdGljIGludCBwbTNmYl9TaGlmdGJwcChzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvLAotCQkJICB1bnNpZ25lZCBsb25nIGRlcHRoLCBpbnQgdikKK3N0YXRpYyBpbmxpbmUgaW50IHBtM2ZiX3NoaWZ0X2JwcCh1bnNpZ25lZCBsb25nIGRlcHRoLCBpbnQgdikKIHsKLQlEVFJBQ0U7Ci0JCiAJc3dpdGNoIChkZXB0aCkgewogCWNhc2UgODoKIAkJcmV0dXJuICh2ID4+IDQpOwpAQCAtOTE4LDE4MSArMTg3LDU5IEBACiAJY2FzZSAzMjoKIAkJcmV0dXJuICh2ID4+IDIpOwogCX0KLQlEUFJJTlRLKDEsICJVbnN1cHBvcnRlZCBkZXB0aCAlbGRcbiIsIGRlcHRoKTsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50IHBtM2ZiX1Vuc2hpZnRicHAoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbywKLQkJCSAgICB1bnNpZ25lZCBsb25nIGRlcHRoLCBpbnQgdikKLXsKLQlEVFJBQ0U7Ci0KLQlzd2l0Y2ggKGRlcHRoKSB7Ci0JY2FzZSA4OgotCQlyZXR1cm4gKHYgPDwgNCk7Ci0JY2FzZSAxMjoJCi0JY2FzZSAxNToKLQljYXNlIDE2OgotCQlyZXR1cm4gKHYgPDwgMyk7Ci0JY2FzZSAzMjoKLQkJcmV0dXJuICh2IDw8IDIpOwotCX0KLQlEUFJJTlRLKDEsICJVbnN1cHBvcnRlZCBkZXB0aCAlbGRcbiIsIGRlcHRoKTsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZCBwbTNmYl9tYXBJTyhzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvKQotewotCURUUkFDRTsKLQotCWxfZmJfaW5mby0+dklPQmFzZSA9Ci0JICAgIGlvcmVtYXAoKHVuc2lnbmVkIGxvbmcpIGxfZmJfaW5mby0+cElPQmFzZSwgUE0zX1JFR1NfU0laRSk7Ci0JbF9mYl9pbmZvLT52X2ZiID0KLQkgICAgaW9yZW1hcCgodW5zaWduZWQgbG9uZykgbF9mYl9pbmZvLT5wX2ZiLCBsX2ZiX2luZm8tPmZiX3NpemUpOwotCURQUklOVEsoMiwgIklPIG1hcHBpbmcgOiBJT0Jhc2UgJWx4IC8gJWx4LCBmYiAlbHggLyAlbHhcbiIsCi0JCSh1bnNpZ25lZCBsb25nKSBsX2ZiX2luZm8tPnBJT0Jhc2UsCi0JCSh1bnNpZ25lZCBsb25nKSBsX2ZiX2luZm8tPnZJT0Jhc2UsCi0JCSh1bnNpZ25lZCBsb25nKSBsX2ZiX2luZm8tPnBfZmIsCi0JCSh1bnNpZ25lZCBsb25nKSBsX2ZiX2luZm8tPnZfZmIpOwotfQotCi1zdGF0aWMgdm9pZCBwbTNmYl91bm1hcElPKHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8pCi17Ci0JRFRSQUNFOwotCi0JaW91bm1hcChsX2ZiX2luZm8tPnZJT0Jhc2UpOwotCWlvdW5tYXAobF9mYl9pbmZvLT52X2ZiKTsKLQlsX2ZiX2luZm8tPnZJT0Jhc2UgPSAodW5zaWduZWQgY2hhciAqKSAtMTsKLQlsX2ZiX2luZm8tPnZfZmIgPSAodW5zaWduZWQgY2hhciAqKSAtMTsKLX0KLQotI2lmIGRlZmluZWQoUE0zRkJfTUFTVEVSX0RFQlVHKSAmJiAoUE0zRkJfTUFTVEVSX0RFQlVHID49IDIpCi1zdGF0aWMgdm9pZCBwbTNmYl9zaG93X2N1cl9tb2RlKHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8pCi17Ci0JRFBSSU5USygyLCAiUE0zQXBlcnR1cmUwOiAweCUwOHhcbiIsIFBNM19SRUFEX1JFRyhQTTNBcGVydHVyZTApKTsKLQlEUFJJTlRLKDIsICJQTTNBcGVydHVyZTE6IDB4JTA4eFxuIiwgUE0zX1JFQURfUkVHKFBNM0FwZXJ0dXJlMSkpOwotCURQUklOVEsoMiwgIlBNM0J5QXBlcnR1cmUxTW9kZTogMHglMDh4XG4iLAotCQlQTTNfUkVBRF9SRUcoUE0zQnlBcGVydHVyZTFNb2RlKSk7Ci0JRFBSSU5USygyLCAiUE0zQnlBcGVydHVyZTJNb2RlOiAweCUwOHhcbiIsCi0JCVBNM19SRUFEX1JFRyhQTTNCeUFwZXJ0dXJlMk1vZGUpKTsKLQlEUFJJTlRLKDIsICJQTTNDaGlwQ29uZmlnOiAweCUwOHhcbiIsIFBNM19SRUFEX1JFRyhQTTNDaGlwQ29uZmlnKSk7Ci0JRFBSSU5USygyLCAiUE0zRklGT0RpczogMHglMDh4XG4iLCBQTTNfUkVBRF9SRUcoUE0zRklGT0RpcykpOwotCURQUklOVEsoMiwgIlBNM0hUb3RhbDogMHglMDh4XG4iLCBQTTNfUkVBRF9SRUcoUE0zSFRvdGFsKSk7Ci0JRFBSSU5USygyLCAiUE0zSGJFbmQ6IDB4JTA4eFxuIiwgUE0zX1JFQURfUkVHKFBNM0hiRW5kKSk7Ci0JRFBSSU5USygyLCAiUE0zSGdFbmQ6IDB4JTA4eFxuIiwgUE0zX1JFQURfUkVHKFBNM0hnRW5kKSk7Ci0JRFBSSU5USygyLCAiUE0zSHNFbmQ6IDB4JTA4eFxuIiwgUE0zX1JFQURfUkVHKFBNM0hzRW5kKSk7Ci0JRFBSSU5USygyLCAiUE0zSHNTdGFydDogMHglMDh4XG4iLCBQTTNfUkVBRF9SRUcoUE0zSHNTdGFydCkpOwotCURQUklOVEsoMiwgIlBNM01lbUJ5cGFzc1dyaXRlTWFzazogMHglMDh4XG4iLAotCQlQTTNfUkVBRF9SRUcoUE0zTWVtQnlwYXNzV3JpdGVNYXNrKSk7Ci0JRFBSSU5USygyLCAiUE0zUkRfSW5kZXhDb250cm9sOiAweCUwOHhcbiIsCi0JCVBNM19SRUFEX1JFRyhQTTNSRF9JbmRleENvbnRyb2wpKTsKLQlEUFJJTlRLKDIsICJQTTNTY3JlZW5CYXNlOiAweCUwOHhcbiIsIFBNM19SRUFEX1JFRyhQTTNTY3JlZW5CYXNlKSk7Ci0JRFBSSU5USygyLCAiUE0zU2NyZWVuU3RyaWRlOiAweCUwOHhcbiIsCi0JCVBNM19SRUFEX1JFRyhQTTNTY3JlZW5TdHJpZGUpKTsKLQlEUFJJTlRLKDIsICJQTTNWQ2xrQ3RsOiAweCUwOHhcbiIsIFBNM19SRUFEX1JFRyhQTTNWQ2xrQ3RsKSk7Ci0JRFBSSU5USygyLCAiUE0zVlRvdGFsOiAweCUwOHhcbiIsIFBNM19SRUFEX1JFRyhQTTNWVG90YWwpKTsKLQlEUFJJTlRLKDIsICJQTTNWYkVuZDogMHglMDh4XG4iLCBQTTNfUkVBRF9SRUcoUE0zVmJFbmQpKTsKLQlEUFJJTlRLKDIsICJQTTNWaWRlb0NvbnRyb2w6IDB4JTA4eFxuIiwKLQkJUE0zX1JFQURfUkVHKFBNM1ZpZGVvQ29udHJvbCkpOwotCURQUklOVEsoMiwgIlBNM1ZzRW5kOiAweCUwOHhcbiIsIFBNM19SRUFEX1JFRyhQTTNWc0VuZCkpOwotCURQUklOVEsoMiwgIlBNM1ZzU3RhcnQ6IDB4JTA4eFxuIiwgUE0zX1JFQURfUkVHKFBNM1ZzU3RhcnQpKTsKLQotCURQUklOVEsoMiwgIlBNM1JEX0NvbG9yRm9ybWF0OiAlbGRcbiIsCi0JCVBNM19SRUFEX0RBQ19SRUcoUE0zUkRfQ29sb3JGb3JtYXQpKTsKLQlEUFJJTlRLKDIsICJQTTNSRF9EQUNDb250cm9sOiAlbGRcbiIsCi0JCVBNM19SRUFEX0RBQ19SRUcoUE0zUkRfREFDQ29udHJvbCkpOwotCURQUklOVEsoMiwgIlBNM1JEX0RDbGswRmVlZGJhY2tTY2FsZTogJWxkXG4iLAotCQlQTTNfUkVBRF9EQUNfUkVHKFBNM1JEX0RDbGswRmVlZGJhY2tTY2FsZSkpOwotCURQUklOVEsoMiwgIlBNM1JEX0RDbGswUG9zdFNjYWxlOiAlbGRcbiIsCi0JCVBNM19SRUFEX0RBQ19SRUcoUE0zUkRfRENsazBQb3N0U2NhbGUpKTsKLQlEUFJJTlRLKDIsICJQTTNSRF9EQ2xrMFByZVNjYWxlOiAlbGRcbiIsCi0JCVBNM19SRUFEX0RBQ19SRUcoUE0zUkRfRENsazBQcmVTY2FsZSkpOwotCURQUklOVEsoMiwgIltub3Qgc2V0XSBQTTNSRF9JbmRleENvbnRyb2w6ICVsZFxuIiwKLQkJUE0zX1JFQURfREFDX1JFRyhQTTNSRF9JbmRleENvbnRyb2wpKTsKLQlEUFJJTlRLKDIsICJQTTNSRF9NaXNjQ29udHJvbDogJWxkXG4iLAotCQlQTTNfUkVBRF9EQUNfUkVHKFBNM1JEX01pc2NDb250cm9sKSk7Ci0JRFBSSU5USygyLCAiUE0zUkRfUGl4ZWxTaXplOiAlbGRcbiIsCi0JCVBNM19SRUFEX0RBQ19SRUcoUE0zUkRfUGl4ZWxTaXplKSk7Ci0JRFBSSU5USygyLCAiUE0zUkRfU3luY0NvbnRyb2w6ICVsZFxuIiwKLQkJUE0zX1JFQURfREFDX1JFRyhQTTNSRF9TeW5jQ29udHJvbCkpOwotfQotCi0jZW5kaWYgLyogZGVmaW5lZChQTTNGQl9NQVNURVJfREVCVUcpICYmIChQTTNGQl9NQVNURVJfREVCVUcgPj0gMikgKi8KLXN0YXRpYyB2b2lkIHBtM2ZiX3Nob3dfY3VyX3RpbWluZyhzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvKQotewotCXUxNiBzdWJ2ZW5kb3IsIHN1YmRldmljZTsKLQotCWlmICgoIXBjaV9yZWFkX2NvbmZpZ193b3JkCi0JICAgICAobF9mYl9pbmZvLT5kZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmc3VidmVuZG9yKSkKLQkgICAgJiYKLQkgICAgKCFwY2lfcmVhZF9jb25maWdfd29yZAotCSAgICAgKGxfZmJfaW5mby0+ZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmc3ViZGV2aWNlKSkpIHsKLQkJLyogd2VsbCwgbm90aGluZy4uLiAqLwotCX0gZWxzZSB7Ci0JCXN1YnZlbmRvciA9IHN1YmRldmljZSA9ICh1MTYpLTE7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAicG0zZmI6IG1lbW9yeSB0aW1pbmdzIGZvciBib2FyZCAjJWxkIChzdWJ2ZW5kb3I6IDB4JWh4LCBzdWJkZXZpY2U6IDB4JWh4KVxuIiwgbF9mYl9pbmZvLT5ib2FyZF9udW0sIHN1YnZlbmRvciwgc3ViZGV2aWNlKTsKLQlwcmludGsoS0VSTl9JTkZPICIgUE0zTG9jYWxNZW1DYXBzOiAweCUwOHhcbiIsCi0JICAgICAgIFBNM19SRUFEX1JFRyhQTTNMb2NhbE1lbUNhcHMpKTsKLQlwcmludGsoS0VSTl9JTkZPICIgUE0zTG9jYWxNZW1UaW1pbmdzOiAweCUwOHhcbiIsCi0JICAgICAgIFBNM19SRUFEX1JFRyhQTTNMb2NhbE1lbVRpbWluZ3MpKTsKLQlwcmludGsoS0VSTl9JTkZPICIgUE0zTG9jYWxNZW1Db250cm9sOiAweCUwOHhcbiIsCi0JICAgICAgIFBNM19SRUFEX1JFRyhQTTNMb2NhbE1lbUNvbnRyb2wpKTsKLQlwcmludGsoS0VSTl9JTkZPICIgUE0zTG9jYWxNZW1SZWZyZXNoOiAweCUwOHhcbiIsCi0JICAgICAgIFBNM19SRUFEX1JFRyhQTTNMb2NhbE1lbVJlZnJlc2gpKTsKLQlwcmludGsoS0VSTl9JTkZPICIgUE0zTG9jYWxNZW1Qb3dlckRvd246IDB4JTA4eFxuIiwKLQkgICAgICAgUE0zX1JFQURfUkVHKFBNM0xvY2FsTWVtUG93ZXJEb3duKSk7CisJRFBSSU5USygiVW5zdXBwb3J0ZWQgZGVwdGggJWxkXG4iLCBkZXB0aCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIHdyaXRlIHRoZSBtb2RlIHRvIHJlZ2lzdGVycyAqLwotc3RhdGljIHZvaWQgcG0zZmJfd3JpdGVfbW9kZShzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvKQorc3RhdGljIHZvaWQgcG0zZmJfd3JpdGVfbW9kZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKKwlzdHJ1Y3QgcG0zX3BhciAqcGFyID0gaW5mby0+cGFyOwogCWNoYXIgdGVtcHN5bmMgPSAweDAwLCB0ZW1wbWlzYyA9IDB4MDA7Ci0JRFRSQUNFOworCWNvbnN0IHUzMiBoc3N0YXJ0ID0gaW5mby0+dmFyLnJpZ2h0X21hcmdpbjsKKwljb25zdCB1MzIgaHNlbmQgPSBoc3N0YXJ0ICsgaW5mby0+dmFyLmhzeW5jX2xlbjsKKwljb25zdCB1MzIgaGJlbmQgPSBoc2VuZCArIGluZm8tPnZhci5sZWZ0X21hcmdpbjsKKwljb25zdCB1MzIgeHJlcyA9IChpbmZvLT52YXIueHJlcyArIDMxKSAmIH4zMTsKKwljb25zdCB1MzIgaHRvdGFsID0geHJlcyArIGhiZW5kOworCWNvbnN0IHUzMiB2c3N0YXJ0ID0gaW5mby0+dmFyLmxvd2VyX21hcmdpbjsKKwljb25zdCB1MzIgdnNlbmQgPSB2c3N0YXJ0ICsgaW5mby0+dmFyLnZzeW5jX2xlbjsKKwljb25zdCB1MzIgdmJlbmQgPSB2c2VuZCArIGluZm8tPnZhci51cHBlcl9tYXJnaW47CisJY29uc3QgdTMyIHZ0b3RhbCA9IGluZm8tPnZhci55cmVzICsgdmJlbmQ7CisJY29uc3QgdTMyIHdpZHRoID0gKGluZm8tPnZhci54cmVzX3ZpcnR1YWwgKyA3KSAmIH43OwogCi0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM01lbUJ5cGFzc1dyaXRlTWFzaywgMHhmZmZmZmZmZik7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0FwZXJ0dXJlMCwgMHgwMDAwMDAwMCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0FwZXJ0dXJlMSwgMHgwMDAwMDAwMCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0ZJRk9EaXMsIDB4MDAwMDAwMDcpOworCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM01lbUJ5cGFzc1dyaXRlTWFzaywgMHhmZmZmZmZmZik7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zQXBlcnR1cmUwLCAweDAwMDAwMDAwKTsKKwlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNBcGVydHVyZTEsIDB4MDAwMDAwMDApOworCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM0ZJRk9EaXMsIDB4MDAwMDAwMDcpOwogCi0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0hUb3RhbCwKLQkJCSAgIHBtM2ZiX1NoaWZ0YnBwKGxfZmJfaW5mbywKLQkJCQkJICBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCwKLQkJCQkJICBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5odG90YWwgLQotCQkJCQkgIDEpKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zSHNFbmQsCi0JCQkgICBwbTNmYl9TaGlmdGJwcChsX2ZiX2luZm8sCi0JCQkJCSAgbF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGgsCi0JCQkJCSAgbF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+aHNlbmQpKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zSHNTdGFydCwKLQkJCSAgIHBtM2ZiX1NoaWZ0YnBwKGxfZmJfaW5mbywKLQkJCQkJICBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCwKLQkJCQkJICBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT4KKwlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNIVG90YWwsCisJCQkgICBwbTNmYl9zaGlmdF9icHAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLAorCQkJCQkgIGh0b3RhbCAtIDEpKTsKKwlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNIc0VuZCwKKwkJCSAgIHBtM2ZiX3NoaWZ0X2JwcChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsCisJCQkJCSAgaHNlbmQpKTsKKwlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNIc1N0YXJ0LAorCQkJICAgcG0zZmJfc2hpZnRfYnBwKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwKIAkJCQkJICBoc3N0YXJ0KSk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0hiRW5kLAotCQkJICAgcG0zZmJfU2hpZnRicHAobF9mYl9pbmZvLAotCQkJCQkgIGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoLAotCQkJCQkgIGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmhiZW5kKSk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0hnRW5kLAotCQkJICAgcG0zZmJfU2hpZnRicHAobF9mYl9pbmZvLAotCQkJCQkgIGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoLAotCQkJCQkgIGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmhiZW5kKSk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1NjcmVlblN0cmlkZSwKLQkJCSAgIHBtM2ZiX1NoaWZ0YnBwKGxfZmJfaW5mbywKLQkJCQkJICBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCwKLQkJCQkJICBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5zdHJpZGUpKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zVlRvdGFsLCBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT52dG90YWwgLSAxKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zVnNFbmQsIGxfZmJfaW5mby0+Y3VycmVudF9wYXItPnZzZW5kIC0gMSk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1ZzU3RhcnQsCi0JCQkgICBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT52c3N0YXJ0IC0gMSk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1ZiRW5kLCBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT52YmVuZCk7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zSGJFbmQsCisJCQkgICBwbTNmYl9zaGlmdF9icHAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLAorCQkJCQkgIGhiZW5kKSk7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zSGdFbmQsCisJCQkgICBwbTNmYl9zaGlmdF9icHAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLAorCQkJCQkgIGhiZW5kKSk7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zU2NyZWVuU3RyaWRlLAorCQkJICAgcG0zZmJfc2hpZnRfYnBwKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwKKwkJCQkJICB3aWR0aCkpOworCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM1ZUb3RhbCwgdnRvdGFsIC0gMSk7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zVnNFbmQsIHZzZW5kIC0gMSk7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zVnNTdGFydCwgdnNzdGFydCAtIDEpOworCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM1ZiRW5kLCB2YmVuZCk7CiAKLQlzd2l0Y2ggKGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoKSB7CisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDg6Ci0JCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNCeUFwZXJ0dXJlMU1vZGUsCisJCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM0J5QXBlcnR1cmUxTW9kZSwKIAkJCQkgICBQTTNCeUFwZXJ0dXJlTW9kZV9QSVhFTFNJWkVfOEJJVCk7Ci0JCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNCeUFwZXJ0dXJlMk1vZGUsCisJCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM0J5QXBlcnR1cmUyTW9kZSwKIAkJCQkgICBQTTNCeUFwZXJ0dXJlTW9kZV9QSVhFTFNJWkVfOEJJVCk7CiAJCWJyZWFrOwogCkBAIC0xMTAwLDE1ICsyNDcsMTUgQEAKIAljYXNlIDE1OgogCWNhc2UgMTY6CiAjaWZuZGVmIF9fQklHX0VORElBTgotCQlQTTNfU0xPV19XUklURV9SRUcoUE0zQnlBcGVydHVyZTFNb2RlLAorCQlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNCeUFwZXJ0dXJlMU1vZGUsCiAJCQkJICAgUE0zQnlBcGVydHVyZU1vZGVfUElYRUxTSVpFXzE2QklUKTsKLQkJUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0J5QXBlcnR1cmUyTW9kZSwKKwkJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zQnlBcGVydHVyZTJNb2RlLAogCQkJCSAgIFBNM0J5QXBlcnR1cmVNb2RlX1BJWEVMU0laRV8xNkJJVCk7CiAjZWxzZQotCQlQTTNfU0xPV19XUklURV9SRUcoUE0zQnlBcGVydHVyZTFNb2RlLAorCQlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNCeUFwZXJ0dXJlMU1vZGUsCiAJCQkJICAgUE0zQnlBcGVydHVyZU1vZGVfUElYRUxTSVpFXzE2QklUIHwKIAkJCQkgICBQTTNCeUFwZXJ0dXJlTW9kZV9CWVRFU1dBUF9CQURDKTsKLQkJUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0J5QXBlcnR1cmUyTW9kZSwKKwkJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zQnlBcGVydHVyZTJNb2RlLAogCQkJCSAgIFBNM0J5QXBlcnR1cmVNb2RlX1BJWEVMU0laRV8xNkJJVCB8CiAJCQkJICAgUE0zQnlBcGVydHVyZU1vZGVfQllURVNXQVBfQkFEQyk7CiAjZW5kaWYgLyogISBfX0JJR19FTkRJQU4gKi8KQEAgLTExMTYsMjMgKzI2MywyMyBAQAogCiAJY2FzZSAzMjoKICNpZm5kZWYgX19CSUdfRU5ESUFOCi0JCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNCeUFwZXJ0dXJlMU1vZGUsCisJCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM0J5QXBlcnR1cmUxTW9kZSwKIAkJCQkgICBQTTNCeUFwZXJ0dXJlTW9kZV9QSVhFTFNJWkVfMzJCSVQpOwotCQlQTTNfU0xPV19XUklURV9SRUcoUE0zQnlBcGVydHVyZTJNb2RlLAorCQlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNCeUFwZXJ0dXJlMk1vZGUsCiAJCQkJICAgUE0zQnlBcGVydHVyZU1vZGVfUElYRUxTSVpFXzMyQklUKTsKICNlbHNlCi0JCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNCeUFwZXJ0dXJlMU1vZGUsCisJCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM0J5QXBlcnR1cmUxTW9kZSwKIAkJCQkgICBQTTNCeUFwZXJ0dXJlTW9kZV9QSVhFTFNJWkVfMzJCSVQgfAogCQkJCSAgIFBNM0J5QXBlcnR1cmVNb2RlX0JZVEVTV0FQX0RDQkEpOwotCQlQTTNfU0xPV19XUklURV9SRUcoUE0zQnlBcGVydHVyZTJNb2RlLAorCQlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNCeUFwZXJ0dXJlMk1vZGUsCiAJCQkJICAgUE0zQnlBcGVydHVyZU1vZGVfUElYRUxTSVpFXzMyQklUIHwKIAkJCQkgICBQTTNCeUFwZXJ0dXJlTW9kZV9CWVRFU1dBUF9EQ0JBKTsKICNlbmRpZiAvKiAhIF9fQklHX0VORElBTiAqLwogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCURQUklOVEsoMSwgIlVuc3VwcG9ydGVkIGRlcHRoICVkXG4iLAotCQkJbF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGgpOworCQlEUFJJTlRLKCJVbnN1cHBvcnRlZCBkZXB0aCAlZFxuIiwKKwkJCWluZm8tPnZhci5iaXRzX3Blcl9waXhlbCk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTE0Myw5NSArMjkwLDg2IEBACiAJICogc3luYyBvcHRpb25zIGluIFBNM1JEX1N5bmNDb250cm9sLiAgLS1ybWsKIAkgKi8KIAl7Ci0JCXVuc2lnbmVkIGludCB2aWRlbyA9IGxfZmJfaW5mby0+Y3VycmVudF9wYXItPnZpZGVvOworCQl1bnNpZ25lZCBpbnQgdmlkZW8gPSBwYXItPnZpZGVvOwogCiAJCXZpZGVvICY9IH4oUE0zVmlkZW9Db250cm9sX0hTWU5DX01BU0sgfAogCQkJICAgUE0zVmlkZW9Db250cm9sX1ZTWU5DX01BU0spOwogCQl2aWRlbyB8PSBQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0hJR0ggfAogCQkJIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSDsKLQkJUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1ZpZGVvQ29udHJvbCwgdmlkZW8pOworCQlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNWaWRlb0NvbnRyb2wsIHZpZGVvKTsKIAl9Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1ZDbGtDdGwsCi0JCQkgICAoUE0zX1JFQURfUkVHKFBNM1ZDbGtDdGwpICYgMHhGRkZGRkZGQykpOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNTY3JlZW5CYXNlLCBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5iYXNlKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zQ2hpcENvbmZpZywKLQkJCSAgIChQTTNfUkVBRF9SRUcoUE0zQ2hpcENvbmZpZykgJiAweEZGRkZGRkZEKSk7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zVkNsa0N0bCwKKwkJCSAgIChQTTNfUkVBRF9SRUcocGFyLCBQTTNWQ2xrQ3RsKSAmIDB4RkZGRkZGRkMpKTsKKwlQTTNfU0xPV19XUklURV9SRUcocGFyLCBQTTNTY3JlZW5CYXNlLCBwYXItPmJhc2UpOworCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM0NoaXBDb25maWcsCisJCQkgICAoUE0zX1JFQURfUkVHKHBhciwgUE0zQ2hpcENvbmZpZykgJiAweEZGRkZGRkZEKSk7CiAKIAl7Ci0JCXVuc2lnbmVkIGNoYXIgbTsJLyogQ2xrUHJlU2NhbGUgKi8KLQkJdW5zaWduZWQgY2hhciBuOwkvKiBDbGtGZWVkQmFja1NjYWxlICovCi0JCXVuc2lnbmVkIGNoYXIgcDsJLyogQ2xrUG9zdFNjYWxlICovCi0JCSh2b2lkKXBtM2ZiX0NhbGN1bGF0ZUNsb2NrKGxfZmJfaW5mbywgbF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+cGl4Y2xvY2ssIFBNM19SRUZfQ0xPQ0ssICZtLCAmbiwgJnApOworCQl1bnNpZ25lZCBjaGFyIHVuaW5pdGlhbGl6ZWRfdmFyKG0pOwkvKiBDbGtQcmVTY2FsZSAqLworCQl1bnNpZ25lZCBjaGFyIHVuaW5pdGlhbGl6ZWRfdmFyKG4pOwkvKiBDbGtGZWVkQmFja1NjYWxlICovCisJCXVuc2lnbmVkIGNoYXIgdW5pbml0aWFsaXplZF92YXIocCk7CS8qIENsa1Bvc3RTY2FsZSAqLworCQl1bnNpZ25lZCBsb25nIHBpeGNsb2NrID0gUElDT1MyS0haKGluZm8tPnZhci5waXhjbG9jayk7CiAKLQkJRFBSSU5USygyLAotCQkJIlBpeGNsb2NrOiAlZCwgUHJlOiAlZCwgRmVlZGJhY2s6ICVkLCBQb3N0OiAlZFxuIiwKLQkJCWxfZmJfaW5mby0+Y3VycmVudF9wYXItPnBpeGNsb2NrLCAoaW50KSBtLCAoaW50KSBuLAotCQkJKGludCkgcCk7CisJCSh2b2lkKXBtM2ZiX2NhbGN1bGF0ZV9jbG9jayhwaXhjbG9jaywgJm0sICZuLCAmcCk7CiAKLQkJUE0zX1dSSVRFX0RBQ19SRUcoUE0zUkRfRENsazBQcmVTY2FsZSwgbSk7Ci0JCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX0RDbGswRmVlZGJhY2tTY2FsZSwgbik7Ci0JCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX0RDbGswUG9zdFNjYWxlLCBwKTsKKwkJRFBSSU5USygiUGl4Y2xvY2s6ICVsZCwgUHJlOiAlZCwgRmVlZGJhY2s6ICVkLCBQb3N0OiAlZFxuIiwKKwkJCXBpeGNsb2NrLCAoaW50KSBtLCAoaW50KSBuLCAoaW50KSBwKTsKKworCQlQTTNfV1JJVEVfREFDX1JFRyhwYXIsIFBNM1JEX0RDbGswUHJlU2NhbGUsIG0pOworCQlQTTNfV1JJVEVfREFDX1JFRyhwYXIsIFBNM1JEX0RDbGswRmVlZGJhY2tTY2FsZSwgbik7CisJCVBNM19XUklURV9EQUNfUkVHKHBhciwgUE0zUkRfRENsazBQb3N0U2NhbGUsIHApOwogCX0KIAkvKgotCSAgIFBNM19XUklURV9EQUNfUkVHKFBNM1JEX0luZGV4Q29udHJvbCwgMHgwMCk7CisJICAgUE0zX1dSSVRFX0RBQ19SRUcocGFyLCBQTTNSRF9JbmRleENvbnRyb2wsIDB4MDApOwogCSAqLwogCS8qCi0JICAgUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1JEX0luZGV4Q29udHJvbCwgMHgwMCk7CisJICAgUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zUkRfSW5kZXhDb250cm9sLCAweDAwKTsKIAkgKi8KLQlpZiAoKGxfZmJfaW5mby0+Y3VycmVudF9wYXItPnZpZGVvICYgUE0zVmlkZW9Db250cm9sX0hTWU5DX01BU0spID09CisJaWYgKChwYXItPnZpZGVvICYgUE0zVmlkZW9Db250cm9sX0hTWU5DX01BU0spID09CiAJICAgIFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSCkKIAkJdGVtcHN5bmMgfD0gUE0zUkRfU3luY0NvbnRyb2xfSFNZTkNfQUNUSVZFX0hJR0g7Ci0JaWYgKChsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT52aWRlbyAmIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19NQVNLKSA9PQorCWlmICgocGFyLT52aWRlbyAmIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19NQVNLKSA9PQogCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gpCiAJCXRlbXBzeW5jIHw9IFBNM1JEX1N5bmNDb250cm9sX1ZTWU5DX0FDVElWRV9ISUdIOwotCQotCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX1N5bmNDb250cm9sLCB0ZW1wc3luYyk7Ci0JRFBSSU5USygyLCAiUE0zUkRfU3luY0NvbnRyb2w6ICVkXG4iLCB0ZW1wc3luYyk7Ci0JCi0JaWYgKGZsYXRwYW5lbFtsX2ZiX2luZm8tPmJvYXJkX251bV0pCi0JewotCQlQTTNfV1JJVEVfREFDX1JFRyhQTTNSRF9EQUNDb250cm9sLCBQTTNSRF9EQUNDb250cm9sX0JMQU5LX1BFREVTVEFMX0VOQUJMRSk7Ci0JCVBNM19XQUlUKDIpOwotCQlQTTNfV1JJVEVfUkVHKFBNM1ZTQ29uZmlndXJhdGlvbiwgMHgwNik7Ci0JCVBNM19XUklURV9SRUcoMHg1YTAwLCAxIDw8IDE0KTsgLyogYmxhY2sgbWFnaWMuLi4gKi8KLQkJdGVtcG1pc2MgPSBQTTNSRF9NaXNjQ29udHJvbF9WU0JfT1VUUFVUX0VOQUJMRTsKLQl9Ci0JZWxzZQotCQlQTTNfV1JJVEVfREFDX1JFRyhQTTNSRF9EQUNDb250cm9sLCAweDAwKTsKIAotCXN3aXRjaCAobF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGgpIHsKKwlQTTNfV1JJVEVfREFDX1JFRyhwYXIsIFBNM1JEX1N5bmNDb250cm9sLCB0ZW1wc3luYyk7CisJRFBSSU5USygiUE0zUkRfU3luY0NvbnRyb2w6ICVkXG4iLCB0ZW1wc3luYyk7CisKKwlQTTNfV1JJVEVfREFDX1JFRyhwYXIsIFBNM1JEX0RBQ0NvbnRyb2wsIDB4MDApOworCisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKIAljYXNlIDg6Ci0JCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX1BpeGVsU2l6ZSwKKwkJUE0zX1dSSVRFX0RBQ19SRUcocGFyLCBQTTNSRF9QaXhlbFNpemUsCiAJCQkJICBQTTNSRF9QaXhlbFNpemVfOF9CSVRfUElYRUxTKTsKLQkJUE0zX1dSSVRFX0RBQ19SRUcoUE0zUkRfQ29sb3JGb3JtYXQsCisJCVBNM19XUklURV9EQUNfUkVHKHBhciwgUE0zUkRfQ29sb3JGb3JtYXQsCiAJCQkJICBQTTNSRF9Db2xvckZvcm1hdF9DSThfQ09MT1IgfAogCQkJCSAgUE0zUkRfQ29sb3JGb3JtYXRfQ09MT1JfT1JERVJfQkxVRV9MT1cpOwogCQl0ZW1wbWlzYyB8PSBQTTNSRF9NaXNjQ29udHJvbF9ISUdIQ09MT1JfUkVTX0VOQUJMRTsKIAkJYnJlYWs7CiAJY2FzZSAxMjoKLQkJUE0zX1dSSVRFX0RBQ19SRUcoUE0zUkRfUGl4ZWxTaXplLAorCQlQTTNfV1JJVEVfREFDX1JFRyhwYXIsIFBNM1JEX1BpeGVsU2l6ZSwKIAkJCQkgIFBNM1JEX1BpeGVsU2l6ZV8xNl9CSVRfUElYRUxTKTsKLQkJUE0zX1dSSVRFX0RBQ19SRUcoUE0zUkRfQ29sb3JGb3JtYXQsCisJCVBNM19XUklURV9EQUNfUkVHKHBhciwgUE0zUkRfQ29sb3JGb3JtYXQsCiAJCQkJICBQTTNSRF9Db2xvckZvcm1hdF80NDQ0X0NPTE9SIHwKIAkJCQkgIFBNM1JEX0NvbG9yRm9ybWF0X0NPTE9SX09SREVSX0JMVUVfTE9XIHwKIAkJCQkgIFBNM1JEX0NvbG9yRm9ybWF0X0xJTkVBUl9DT0xPUl9FWFRfRU5BQkxFKTsKIAkJdGVtcG1pc2MgfD0gUE0zUkRfTWlzY0NvbnRyb2xfRElSRUNUQ09MT1JfRU5BQkxFIHwKIAkJCVBNM1JEX01pc2NDb250cm9sX0hJR0hDT0xPUl9SRVNfRU5BQkxFOwotCQlicmVhazsJCQorCQlicmVhazsKIAljYXNlIDE1OgotCQlQTTNfV1JJVEVfREFDX1JFRyhQTTNSRF9QaXhlbFNpemUsCisJCVBNM19XUklURV9EQUNfUkVHKHBhciwgUE0zUkRfUGl4ZWxTaXplLAogCQkJCSAgUE0zUkRfUGl4ZWxTaXplXzE2X0JJVF9QSVhFTFMpOwotCQlQTTNfV1JJVEVfREFDX1JFRyhQTTNSRF9Db2xvckZvcm1hdCwKKwkJUE0zX1dSSVRFX0RBQ19SRUcocGFyLCBQTTNSRF9Db2xvckZvcm1hdCwKIAkJCQkgIFBNM1JEX0NvbG9yRm9ybWF0XzU1NTFfRlJPTlRfQ09MT1IgfAogCQkJCSAgUE0zUkRfQ29sb3JGb3JtYXRfQ09MT1JfT1JERVJfQkxVRV9MT1cgfAogCQkJCSAgUE0zUkRfQ29sb3JGb3JtYXRfTElORUFSX0NPTE9SX0VYVF9FTkFCTEUpOwogCQl0ZW1wbWlzYyB8PSBQTTNSRF9NaXNjQ29udHJvbF9ESVJFQ1RDT0xPUl9FTkFCTEUgfAogCQkJUE0zUkRfTWlzY0NvbnRyb2xfSElHSENPTE9SX1JFU19FTkFCTEU7Ci0JCWJyZWFrOwkJCisJCWJyZWFrOwogCWNhc2UgMTY6Ci0JCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX1BpeGVsU2l6ZSwKKwkJUE0zX1dSSVRFX0RBQ19SRUcocGFyLCBQTTNSRF9QaXhlbFNpemUsCiAJCQkJICBQTTNSRF9QaXhlbFNpemVfMTZfQklUX1BJWEVMUyk7Ci0JCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX0NvbG9yRm9ybWF0LAorCQlQTTNfV1JJVEVfREFDX1JFRyhwYXIsIFBNM1JEX0NvbG9yRm9ybWF0LAogCQkJCSAgUE0zUkRfQ29sb3JGb3JtYXRfNTY1X0ZST05UX0NPTE9SIHwKIAkJCQkgIFBNM1JEX0NvbG9yRm9ybWF0X0NPTE9SX09SREVSX0JMVUVfTE9XIHwKIAkJCQkgIFBNM1JEX0NvbG9yRm9ybWF0X0xJTkVBUl9DT0xPUl9FWFRfRU5BQkxFKTsKQEAgLTEyMzksMTkzNiArMzc3LDI4MCBAQAogCQkJUE0zUkRfTWlzY0NvbnRyb2xfSElHSENPTE9SX1JFU19FTkFCTEU7CiAJCWJyZWFrOwogCWNhc2UgMzI6Ci0JCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX1BpeGVsU2l6ZSwKKwkJUE0zX1dSSVRFX0RBQ19SRUcocGFyLCBQTTNSRF9QaXhlbFNpemUsCiAJCQkJICBQTTNSRF9QaXhlbFNpemVfMzJfQklUX1BJWEVMUyk7Ci0JCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX0NvbG9yRm9ybWF0LAorCQlQTTNfV1JJVEVfREFDX1JFRyhwYXIsIFBNM1JEX0NvbG9yRm9ybWF0LAogCQkJCSAgUE0zUkRfQ29sb3JGb3JtYXRfODg4OF9DT0xPUiB8CiAJCQkJICBQTTNSRF9Db2xvckZvcm1hdF9DT0xPUl9PUkRFUl9CTFVFX0xPVyk7CiAJCXRlbXBtaXNjIHw9IFBNM1JEX01pc2NDb250cm9sX0RJUkVDVENPTE9SX0VOQUJMRSB8CiAJCQlQTTNSRF9NaXNjQ29udHJvbF9ISUdIQ09MT1JfUkVTX0VOQUJMRTsKIAkJYnJlYWs7CiAJfQotCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX01pc2NDb250cm9sLCB0ZW1wbWlzYyk7Ci0JCi0JUE0zX1NIT1dfQ1VSX01PREU7CisJUE0zX1dSSVRFX0RBQ19SRUcocGFyLCBQTTNSRF9NaXNjQ29udHJvbCwgdGVtcG1pc2MpOwogfQogCi1zdGF0aWMgdm9pZCBwbTNmYl9yZWFkX21vZGUoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbywKLQkJCSAgICBzdHJ1Y3QgcG0zZmJfcGFyICpjdXJwYXIpCisvKgorICogaGFyZHdhcmUgaW5kZXBlbmRlbnQgZnVuY3Rpb25zCisgKi8KK2ludCBwbTNmYl9pbml0KHZvaWQpOworaW50IHBtM2ZiX3NldHVwKGNoYXIqKTsKKworc3RhdGljIGludCBwbTNmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXVuc2lnbmVkIGxvbmcgcGl4c2l6ZTEsIHBpeHNpemUyLCBjbG9ja3VzZWQ7Ci0JdW5zaWduZWQgbG9uZyBwcmUsIGZlZWRiYWNrLCBwb3N0OworCXUzMiBscGl0Y2g7CiAKLQlEVFJBQ0U7Ci0KLQljbG9ja3VzZWQgPSBQTTNfUkVBRF9SRUcoUE0zVkNsa0N0bCk7Ci0KLQlzd2l0Y2ggKGNsb2NrdXNlZCkgewotCWNhc2UgMzoKLQkJcHJlID0gUE0zX1JFQURfREFDX1JFRyhQTTNSRF9EQ2xrM1ByZVNjYWxlKTsKLQkJZmVlZGJhY2sgPSBQTTNfUkVBRF9EQUNfUkVHKFBNM1JEX0RDbGszRmVlZGJhY2tTY2FsZSk7Ci0JCXBvc3QgPSBQTTNfUkVBRF9EQUNfUkVHKFBNM1JEX0RDbGszUG9zdFNjYWxlKTsKLQotCQlEUFJJTlRLKDIsCi0JCQkiRENsazMgcGFyYW1ldGVyOiBQcmU6ICVsZCwgRmVlZGJhY2s6ICVsZCwgUG9zdDogJWxkIDsgZ2l2aW5nIHBpeGNsb2NrOiAlbGRcbiIsCi0JCQlwcmUsIGZlZWRiYWNrLCBwb3N0LCBQTTNfU0NBTEVfVE9fQ0xPQ0socHJlLAotCQkJCQkJCQlmZWVkYmFjaywKLQkJCQkJCQkJcG9zdCkpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXByZSA9IFBNM19SRUFEX0RBQ19SRUcoUE0zUkRfRENsazJQcmVTY2FsZSk7Ci0JCWZlZWRiYWNrID0gUE0zX1JFQURfREFDX1JFRyhQTTNSRF9EQ2xrMkZlZWRiYWNrU2NhbGUpOwotCQlwb3N0ID0gUE0zX1JFQURfREFDX1JFRyhQTTNSRF9EQ2xrMlBvc3RTY2FsZSk7Ci0KLQkJRFBSSU5USygyLAotCQkJIkRDbGsyIHBhcmFtZXRlcjogUHJlOiAlbGQsIEZlZWRiYWNrOiAlbGQsIFBvc3Q6ICVsZCA7IGdpdmluZyBwaXhjbG9jazogJWxkXG4iLAotCQkJcHJlLCBmZWVkYmFjaywgcG9zdCwgUE0zX1NDQUxFX1RPX0NMT0NLKHByZSwKLQkJCQkJCQkJZmVlZGJhY2ssCi0JCQkJCQkJCXBvc3QpKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlwcmUgPSBQTTNfUkVBRF9EQUNfUkVHKFBNM1JEX0RDbGsxUHJlU2NhbGUpOwotCQlmZWVkYmFjayA9IFBNM19SRUFEX0RBQ19SRUcoUE0zUkRfRENsazFGZWVkYmFja1NjYWxlKTsKLQkJcG9zdCA9IFBNM19SRUFEX0RBQ19SRUcoUE0zUkRfRENsazFQb3N0U2NhbGUpOwotCi0JCURQUklOVEsoMiwKLQkJCSJEQ2xrMSBwYXJhbWV0ZXI6IFByZTogJWxkLCBGZWVkYmFjazogJWxkLCBQb3N0OiAlbGQgOyBnaXZpbmcgcGl4Y2xvY2s6ICVsZFxuIiwKLQkJCXByZSwgZmVlZGJhY2ssIHBvc3QsIFBNM19TQ0FMRV9UT19DTE9DSyhwcmUsCi0JCQkJCQkJCWZlZWRiYWNrLAotCQkJCQkJCQlwb3N0KSk7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQkJcHJlID0gUE0zX1JFQURfREFDX1JFRyhQTTNSRF9EQ2xrMFByZVNjYWxlKTsKLQkJZmVlZGJhY2sgPSBQTTNfUkVBRF9EQUNfUkVHKFBNM1JEX0RDbGswRmVlZGJhY2tTY2FsZSk7Ci0JCXBvc3QgPSBQTTNfUkVBRF9EQUNfUkVHKFBNM1JEX0RDbGswUG9zdFNjYWxlKTsKLQotCQlEUFJJTlRLKDIsCi0JCQkiRENsazAgcGFyYW1ldGVyOiBQcmU6ICVsZCwgRmVlZGJhY2s6ICVsZCwgUG9zdDogJWxkIDsgZ2l2aW5nIHBpeGNsb2NrOiAlbGRcbiIsCi0JCQlwcmUsIGZlZWRiYWNrLCBwb3N0LCBQTTNfU0NBTEVfVE9fQ0xPQ0socHJlLAotCQkJCQkJCQlmZWVkYmFjaywKLQkJCQkJCQkJcG9zdCkpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmUgPSBmZWVkYmFjayA9IHBvc3QgPSAwOwotCQlEUFJJTlRLKDEsICJVbmtub3drIEQgY2xvY2sgdXNlZCA6ICVsZFxuIiwgY2xvY2t1c2VkKTsKLQkJYnJlYWs7Ci0JfQotCi0JY3VycGFyLT5waXhjbG9jayA9IFBNM19TQ0FMRV9UT19DTE9DSyhwcmUsIGZlZWRiYWNrLCBwb3N0KTsKLQotCXBpeHNpemUxID0KLQkgICAgUE0zQnlBcGVydHVyZU1vZGVfUElYRUxTSVpFX01BU0sgJgotCSAgICAoUE0zX1JFQURfUkVHKFBNM0J5QXBlcnR1cmUxTW9kZSkpOwotCXBpeHNpemUyID0KLQkgICAgUE0zQnlBcGVydHVyZU1vZGVfUElYRUxTSVpFX01BU0sgJgotCSAgICAoUE0zX1JFQURfUkVHKFBNM0J5QXBlcnR1cmUyTW9kZSkpOwotCi0JREFTU0VSVCgocGl4c2l6ZTEgPT0gcGl4c2l6ZTIpLAotCQkicGl4c2l6ZSB0aGUgc2FtZSBpbiBib3RoIGFwZXJ0dXJlXG4iKTsKLQotCWlmIChwaXhzaXplMSAmIFBNM0J5QXBlcnR1cmVNb2RlX1BJWEVMU0laRV8zMkJJVCkKLQkJY3VycGFyLT5kZXB0aCA9IDMyOwotCWVsc2UgaWYgKHBpeHNpemUxICYgUE0zQnlBcGVydHVyZU1vZGVfUElYRUxTSVpFXzE2QklUKQotCXsKLQkJY3VycGFyLT5kZXB0aCA9IDE2OwotCX0KLQllbHNlCi0JCWN1cnBhci0+ZGVwdGggPSA4OwotCi0JLyogbm90IHN1cmUgaWYgSSBuZWVkIHRvIGFkZCBvbmUgb24gdGhlIG5leHQgOyBpdCBnaXZlIGJldHRlciByZXN1bHQgd2l0aCAqLwotCWN1cnBhci0+aHRvdGFsID0KLQkgICAgcG0zZmJfVW5zaGlmdGJwcChsX2ZiX2luZm8sIGN1cnBhci0+ZGVwdGgsCi0JCQkgICAgIDEgKyBQTTNfUkVBRF9SRUcoUE0zSFRvdGFsKSk7Ci0JY3VycGFyLT5oc2VuZCA9Ci0JICAgIHBtM2ZiX1Vuc2hpZnRicHAobF9mYl9pbmZvLCBjdXJwYXItPmRlcHRoLAotCQkJICAgICBQTTNfUkVBRF9SRUcoUE0zSHNFbmQpKTsKLQljdXJwYXItPmhzc3RhcnQgPQotCSAgICBwbTNmYl9VbnNoaWZ0YnBwKGxfZmJfaW5mbywgY3VycGFyLT5kZXB0aCwKLQkJCSAgICAgUE0zX1JFQURfUkVHKFBNM0hzU3RhcnQpKTsKLQljdXJwYXItPmhiZW5kID0KLQkgICAgcG0zZmJfVW5zaGlmdGJwcChsX2ZiX2luZm8sIGN1cnBhci0+ZGVwdGgsCi0JCQkgICAgIFBNM19SRUFEX1JFRyhQTTNIYkVuZCkpOwotCi0JY3VycGFyLT5zdHJpZGUgPQotCSAgICBwbTNmYl9VbnNoaWZ0YnBwKGxfZmJfaW5mbywgY3VycGFyLT5kZXB0aCwKLQkJCSAgICAgUE0zX1JFQURfUkVHKFBNM1NjcmVlblN0cmlkZSkpOwotCi0JY3VycGFyLT52dG90YWwgPSAxICsgUE0zX1JFQURfUkVHKFBNM1ZUb3RhbCk7Ci0JY3VycGFyLT52c2VuZCA9IDEgKyBQTTNfUkVBRF9SRUcoUE0zVnNFbmQpOwotCWN1cnBhci0+dnNzdGFydCA9IDEgKyBQTTNfUkVBRF9SRUcoUE0zVnNTdGFydCk7Ci0JY3VycGFyLT52YmVuZCA9IFBNM19SRUFEX1JFRyhQTTNWYkVuZCk7Ci0KLQljdXJwYXItPnZpZGVvID0gUE0zX1JFQURfUkVHKFBNM1ZpZGVvQ29udHJvbCk7Ci0KLQljdXJwYXItPmJhc2UgPSBQTTNfUkVBRF9SRUcoUE0zU2NyZWVuQmFzZSk7Ci0JY3VycGFyLT53aWR0aCA9IGN1cnBhci0+aHRvdGFsIC0gY3VycGFyLT5oYmVuZDsgLyogbWFrZSB2aXJ0dWFsID09IGRpc3BsYXllZCByZXNvbHV0aW9uICovCi0JY3VycGFyLT5oZWlnaHQgPSBjdXJwYXItPnZ0b3RhbCAtIGN1cnBhci0+dmJlbmQ7Ci0KLQlEUFJJTlRLKDIsICJGb3VuZCA6ICVkICogJWQsICVkIEtoeiwgc3RyaWRlIGlzICUwOHhcbiIsCi0JCWN1cnBhci0+d2lkdGgsIGN1cnBhci0+aGVpZ2h0LCBjdXJwYXItPnBpeGNsb2NrLAotCQljdXJwYXItPnN0cmlkZSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBtM2ZiX3NpemVfbWVtb3J5KHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8pCi17Ci0JdW5zaWduZWQgbG9uZyBtZW1zaXplID0gMCwgdGVtcEJ5cGFzcywgaSwgdGVtcDEsIHRlbXAyOwotCXUxNiBzdWJ2ZW5kb3IsIHN1YmRldmljZTsKLQlwbTNmYl90aW1pbmdfcmVzdWx0IHB0cjsKLQotCURUUkFDRTsKLQotCWxfZmJfaW5mby0+ZmJfc2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQ7CS8qIHBtMyBhcGVydHVyZSBhbHdheXMgNjQgTUIgKi8KLQlwbTNmYl9tYXBJTyhsX2ZiX2luZm8pOwkvKiB0ZW1wb3JhcnkgbWFwIElPICovCi0KLQlEQVNTRVJUKChsX2ZiX2luZm8tPnZJT0Jhc2UgIT0gTlVMTCksCi0JCSJJTyBzdWNjZXNzZnVsbHkgbWFwcGVkIGJlZm9yZSBtZW0gZGV0ZWN0XG4iKTsKLQlEQVNTRVJUKChsX2ZiX2luZm8tPnZfZmIgIT0gTlVMTCksCi0JCSJGQiBzdWNjZXNzZnVsbHkgbWFwcGVkIGJlZm9yZSBtZW0gZGV0ZWN0XG4iKTsKLQotCS8qIGNhcmQtc3BlY2lmaWMgc3R1ZmYsICpiZWZvcmUqIGFjY2Vzc2luZyAqYW55KiBGQiBtZW1vcnkgKi8KLQlpZiAoKCFwY2lfcmVhZF9jb25maWdfd29yZAotCSAgICAgKGxfZmJfaW5mby0+ZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnZlbmRvcikpCi0JICAgICYmCi0JICAgICghcGNpX3JlYWRfY29uZmlnX3dvcmQKLQkgICAgIChsX2ZiX2luZm8tPmRldiwgUENJX1NVQlNZU1RFTV9JRCwgJnN1YmRldmljZSkpKSB7Ci0JCWkgPSAwOyBsX2ZiX2luZm8tPmJvYXJkX3R5cGUgPSAwOwotCQl3aGlsZSAoKGNhcmRiYXNlW2ldLmNhcmRuYW1lWzBdKSAmJiAhKGxfZmJfaW5mby0+Ym9hcmRfdHlwZSkpIHsKLQkJCWlmICgoY2FyZGJhc2VbaV0uc3VidmVuZG9yID09IHN1YnZlbmRvcikgJiYKLQkJCSAgICAoY2FyZGJhc2VbaV0uc3ViZGV2aWNlID09IHN1YmRldmljZSkgJiYKLQkJCSAgICAoY2FyZGJhc2VbaV0uZnVuYyA9PSBQQ0lfRlVOQyhsX2ZiX2luZm8tPmRldi0+ZGV2Zm4pKSkgewotCQkJCURQUklOVEsoMiwgIkNhcmQgIyVsZCBpcyBhbiAlc1xuIiwKLQkJCQkJbF9mYl9pbmZvLT5ib2FyZF9udW0sCi0JCQkJCWNhcmRiYXNlW2ldLmNhcmRuYW1lKTsKLQkJCQlpZiAoY2FyZGJhc2VbaV0uc3BlY2lmaWNfc2V0dXApCi0JCQkJCWNhcmRiYXNlW2ldLnNwZWNpZmljX3NldHVwKGxfZmJfaW5mbyk7Ci0JCQkJbF9mYl9pbmZvLT5ib2FyZF90eXBlID0gaTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlpZiAoIWxfZmJfaW5mby0+Ym9hcmRfdHlwZSkgewotCQkJRFBSSU5USygxLCAiQ2FyZCAjJWxkIGlzIGFuIHVua25vd24gMHglMDR4IC8gMHglMDR4XG4iLAotCQkJCWxfZmJfaW5mby0+Ym9hcmRfbnVtLCBzdWJ2ZW5kb3IsIHN1YmRldmljZSk7Ci0JCX0KLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgInBtM2ZiOiBFcnJvcjogcGNpX3JlYWRfY29uZmlnX3dvcmQgZmFpbGVkLCBib2FyZCAjJWxkXG4iLAotCQkgICAgICAgbF9mYl9pbmZvLT5ib2FyZF9udW0pOwotCX0KLQotCWlmIChwcmludHRpbWluZ3MpCi0JCXBtM2ZiX3Nob3dfY3VyX3RpbWluZyhsX2ZiX2luZm8pOwotCQotCS8qIGNhcmQtc3BlY2lmaWMgc2V0dXAgaXMgZG9uZSwgd2UgcHJlc2VydmUgdGhlIGZpbmFsCi0gICAgICAgICAgIG1lbW9yeSB0aW1pbmcgZm9yIGZ1dHVyZSByZWZlcmVuY2UgKi8KLQlpZiAoKHB0ciA9IHBtM2ZiX3ByZXNlcnZlX21lbW9yeV90aW1pbmdzKGxfZmJfaW5mbykpID09IHBtM2ZiX3RpbWluZ19wcm9ibGVtKSB7IC8qIG1lbW9yeSB0aW1pbmdzIHdlcmUgd3JvbmcgISBvb3BzLi4uLiAqLwotCQlyZXR1cm4oMCk7Ci0JfQotCQotCXRlbXBCeXBhc3MgPSBQTTNfUkVBRF9SRUcoUE0zTWVtQnlwYXNzV3JpdGVNYXNrKTsKLQotCURQUklOVEsoMiwgIlBNM01lbUJ5cGFzc1dyaXRlTWFzayB3YXM6IDB4JTA4bHhcbiIsIHRlbXBCeXBhc3MpOwotCi0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM01lbUJ5cGFzc1dyaXRlTWFzaywgMHhGRkZGRkZGRik7Ci0KLQkvKiBwbTMgc3BsaXQgdXAgbWVtb3J5LCByZXBsaWNhdGVzLCBhbmQgZG8gYSBsb3Qgb2YgbmFzdHkgc3R1ZmYgSU1ITyA7LSkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQlmYl93cml0ZWwoaSAqIDB4MDAzNDU2NzgsCi0JCQkgIChsX2ZiX2luZm8tPnZfZmIgKyAoaSAqIDEwNDg1NzYpKSk7Ci0JCW1iKCk7Ci0JCXRlbXAxID0gZmJfcmVhZGwoKGxfZmJfaW5mby0+dl9mYiArIChpICogMTA0ODU3NikpKTsKLQotCQkvKiBMZXQncyBjaGVjayBmb3Igd3JhcG92ZXIsIHdyaXRlIHdpbGwgZmFpbCBhdCAxNk1CIGJvdW5kYXJ5ICovCi0JCWlmICh0ZW1wMSA9PSAoaSAqIDB4MDAzNDU2NzgpKQotCQkJbWVtc2l6ZSA9IGk7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KLQotCURQUklOVEsoMiwgIkZpcnN0IGRldGVjdCBwYXNzIGFscmVhZHkgZ290ICVsZCBNQlxuIiwgbWVtc2l6ZSArIDEpOwotCi0JaWYgKG1lbXNpemUgPT0gaSkgewotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQkJLyogQ2xlYXIgZmlyc3QgMzJNQiA7IDAgaXMgMCwgbm8gbmVlZCB0byBieXRlc3dhcCAqLwotCQkJd3JpdGVsKDB4MDAwMDAwMCwKLQkJCSAgICAgICAobF9mYl9pbmZvLT52X2ZiICsgKGkgKiAxMDQ4NTc2KSkpOwotCQkJbWIoKTsKLQkJfQotCi0JCWZvciAoaSA9IDMyOyBpIDwgNjQ7IGkrKykgewotCQkJZmJfd3JpdGVsKGkgKiAweDAwMzQ1Njc4LAotCQkJCSAgKGxfZmJfaW5mby0+dl9mYiArIChpICogMTA0ODU3NikpKTsKLQkJCW1iKCk7Ci0JCQl0ZW1wMSA9Ci0JCQkgICAgZmJfcmVhZGwoKGxfZmJfaW5mby0+dl9mYiArIChpICogMTA0ODU3NikpKTsKLQkJCXRlbXAyID0KLQkJCSAgICBmYl9yZWFkbCgobF9mYl9pbmZvLT52X2ZiICsKLQkJCQkgICAgICAoKGkgLSAzMikgKiAxMDQ4NTc2KSkpOwotCQkJaWYgKCh0ZW1wMSA9PSAoaSAqIDB4MDAzNDU2NzgpKSAmJiAodGVtcDIgPT0gMCkpCS8qIGRpZmZlcmVudCB2YWx1ZSwgZGlmZmVyZW50IFJBTS4uLiAqLwotCQkJCW1lbXNpemUgPSBpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JRFBSSU5USygyLCAiU2Vjb25kIGRldGVjdCBwYXNzIGdvdCAlbGQgTUJcbiIsIG1lbXNpemUgKyAxKTsKLQotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNNZW1CeXBhc3NXcml0ZU1hc2ssIHRlbXBCeXBhc3MpOwotCi0JcG0zZmJfdW5tYXBJTyhsX2ZiX2luZm8pOwotCW1lbXNpemUgPSAxMDQ4NTc2ICogKG1lbXNpemUgKyAxKTsKLQotCURQUklOVEsoMiwgIlJldHVybmluZyAweCUwOGx4IGJ5dGVzXG4iLCBtZW1zaXplKTsKLQotCWlmIChmb3JjZXNpemVbbF9mYl9pbmZvLT5ib2FyZF9udW1dICYmICgoZm9yY2VzaXplW2xfZmJfaW5mby0+Ym9hcmRfbnVtXSAqIDEwNDg1NzYpICE9IG1lbXNpemUpKQotCXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicG0zZmI6IG1pc21hdGNoIGJldHdlZW4gcHJvYmVkICglbGQgTUIpIGFuZCBzcGVjaWZpZWQgKCVoZCBNQikgbWVtb3J5IHNpemUsIHVzaW5nIFNQRUNJRklFRCAhXG4iLCBtZW1zaXplLCBmb3JjZXNpemVbbF9mYl9pbmZvLT5ib2FyZF9udW1dKTsKLQkJbWVtc2l6ZSA9IDEwNDg1NzYgKiBmb3JjZXNpemVbbF9mYl9pbmZvLT5ib2FyZF9udW1dOwotCX0KLQkKLQlsX2ZiX2luZm8tPmZiX3NpemUgPSBtZW1zaXplOwotCQotCWlmIChwdHIgPT0gcG0zZmJfdGltaW5nX3JldHJ5KQotCXsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicG0zZmI6IHJldHJ5aW5nIG1lbW9yeSB0aW1pbmdzIGNoZWNrIik7Ci0JCWlmIChwbTNmYl90cnlfbWVtb3J5X3RpbWluZ3MobF9mYl9pbmZvKSA9PSBwbTNmYl90aW1pbmdfcHJvYmxlbSkKLQkJCXJldHVybigwKTsKLQl9Ci0JCi0JcmV0dXJuIChtZW1zaXplKTsKLX0KLQotc3RhdGljIHZvaWQgcG0zZmJfY2xlYXJfbWVtb3J5KHN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8sIHUzMiBjYykKLXsKLQlpbnQgaTsKLQotCURUUkFDRTsKLQotCWZvciAoaSA9IDA7IGkgPCAobF9mYl9pbmZvLT5mYl9zaXplIC8gc2l6ZW9mKHUzMikpIDsgaSsrKSAvKiBjbGVhciBlbnRpcmUgRkIgbWVtb3J5IHRvIGJsYWNrICovCi0JewotCQlmYl93cml0ZWwoY2MsIChsX2ZiX2luZm8tPnZfZmIgKyAoaSAqIHNpemVvZih1MzIpKSkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcG0zZmJfY2xlYXJfY29sb3JtYXAoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbywgdW5zaWduZWQgY2hhciByLCB1bnNpZ25lZCBjaGFyIGcsIHVuc2lnbmVkIGNoYXIgYikKLXsKLQlpbnQgaTsKLQotCURUUkFDRTsKLQotCWZvciAoaSA9IDA7IGkgPCAyNTYgOyBpKyspIC8qIGZpbGwgY29sb3IgbWFwIHdpdGggd2hpdGUgKi8KLQkJcG0zZmJfc2V0X2NvbG9yKGxfZmJfaW5mbywgaSwgciwgZywgYik7Ci0KLX0KLQotLyogY29tbW9uIGluaXRpYWxpc2F0aW9uICovCi1zdGF0aWMgdm9pZCBwbTNmYl9jb21tb25faW5pdChzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvKQotewotCURUUkFDRTsKLQotCURQUklOVEsoMiwgIkluaXRpYWxpemluZyBib2FyZCAjJWxkIEAgJWx4XG4iLCBsX2ZiX2luZm8tPmJvYXJkX251bSwKLQkJKHVuc2lnbmVkIGxvbmcpIGxfZmJfaW5mbyk7Ci0KLQlzdHJjcHkobF9mYl9pbmZvLT5nZW4uaW5mby5tb2RlbmFtZSwgcGVybWVkaWEzX25hbWUpOwotCWRpc3BbbF9mYl9pbmZvLT5ib2FyZF9udW1dLnNjcm9sbG1vZGUgPSAwOwkvKiBTQ1JPTExfWU5PTU9WRTsgKi8vKiAwIG1lYW5zICJsZXQgZmJjb24gY2hvb3NlIiAqLwotCWxfZmJfaW5mby0+Z2VuLnBhcnNpemUgPSBzaXplb2Yoc3RydWN0IHBtM2ZiX3Bhcik7Ci0JbF9mYl9pbmZvLT5nZW4uaW5mby5jaGFuZ2V2YXIgPSBOVUxMOwotCWxfZmJfaW5mby0+Z2VuLmluZm8uZmJvcHMgPSAmcG0zZmJfb3BzOwotCWxfZmJfaW5mby0+Z2VuLmluZm8uZGlzcCA9ICYoZGlzcFtsX2ZiX2luZm8tPmJvYXJkX251bV0pOwotCWlmIChmb250bltsX2ZiX2luZm8tPmJvYXJkX251bV1bMF0pCi0JCXN0cmNweShsX2ZiX2luZm8tPmdlbi5pbmZvLmZvbnRuYW1lLAotCQkgICAgICAgZm9udG5bbF9mYl9pbmZvLT5ib2FyZF9udW1dKTsKLQlsX2ZiX2luZm8tPmdlbi5pbmZvLnN3aXRjaF9jb24gPSAmZmJnZW5fc3dpdGNoOwotCWxfZmJfaW5mby0+Z2VuLmluZm8udXBkYXRldmFyID0gJmZiZ2VuX3VwZGF0ZV92YXI7CS8qICovCi0JbF9mYl9pbmZvLT5nZW4uaW5mby5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7Ci0KLQlwbTNmYl9tYXBJTyhsX2ZiX2luZm8pOwotCi0JcG0zZmJfY2xlYXJfbWVtb3J5KGxfZmJfaW5mbywgMCk7Ci0JcG0zZmJfY2xlYXJfY29sb3JtYXAobF9mYl9pbmZvLCAwLCAwLCAwKTsKLQotCSh2b2lkKSBmYmdlbl9nZXRfdmFyKCYoZGlzcFtsX2ZiX2luZm8tPmJvYXJkX251bV0pLnZhciwgLTEsCi0JCQkgICAgICZsX2ZiX2luZm8tPmdlbi5pbmZvKTsKLQotCWlmIChkZXB0aFtsX2ZiX2luZm8tPmJvYXJkX251bV0pIC8qIG92ZXJyaWRlIG1vZGUtZGVmaW5lZCBkZXB0aCAqLwotCXsKLQkJcG0zZmJfZW5jb2RlX2RlcHRoKCYoZGlzcFtsX2ZiX2luZm8tPmJvYXJkX251bV0pLnZhciwgZGVwdGhbbF9mYl9pbmZvLT5ib2FyZF9udW1dKTsKLQkJKGRpc3BbbF9mYl9pbmZvLT5ib2FyZF9udW1dKS52YXIuYml0c19wZXJfcGl4ZWwgPSBkZXB0aDJicHAoZGVwdGhbbF9mYl9pbmZvLT5ib2FyZF9udW1dKTsKLQl9Ci0KLQkodm9pZCkgZmJnZW5fZG9fc2V0X3ZhcigmKGRpc3BbbF9mYl9pbmZvLT5ib2FyZF9udW1dKS52YXIsIDEsCi0JCQkJJmxfZmJfaW5mby0+Z2VuKTsKLQotCWZiZ2VuX3NldF9kaXNwKC0xLCAmbF9mYl9pbmZvLT5nZW4pOwotCi0JZG9faW5zdGFsbF9jbWFwKDAsICZsX2ZiX2luZm8tPmdlbi5pbmZvKTsKLQotCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmbF9mYl9pbmZvLT5nZW4uaW5mbykgPCAwKSB7Ci0JCURQUklOVEsoMSwgIkNvdWxkbid0IHJlZ2lzdGVyIGZyYW1lYnVmZmVyXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCVBNM19XUklURV9EQUNfUkVHKFBNM1JEX0N1cnNvck1vZGUsCi0JCQkgIFBNM1JEX0N1cnNvck1vZGVfQ1VSU09SX0RJU0FCTEUpOwotCQotCVBNM19TSE9XX0NVUl9NT0RFOwotCQotCXBtM2ZiX3dyaXRlX21vZGUobF9mYl9pbmZvKTsKLQkKLQlwcmludGsoImZiJWQ6ICVzLCB1c2luZyAldUsgb2YgdmlkZW8gbWVtb3J5ICglcylcbiIsCi0JICAgICAgIGxfZmJfaW5mby0+Z2VuLmluZm8ubm9kZSwKLQkgICAgICAgcGVybWVkaWEzX25hbWUsICh1MzIpIChsX2ZiX2luZm8tPmZiX3NpemUgPj4gMTApLAotCSAgICAgICBjYXJkYmFzZVtsX2ZiX2luZm8tPmJvYXJkX3R5cGVdLmNhcmRuYW1lKTsKLX0KLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKiogYWNjZWxlcmF0ZWQgcGVybWVkaWEzLXNwZWNpZmljIGZ1bmN0aW9ucyAqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotI2lmZGVmIFBNM0ZCX1VTRV9BQ0NFTAotc3RhdGljIHZvaWQgcG0zZmJfd2FpdF9wbTMoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbykKLXsKLQlEVFJBQ0U7Ci0KLQlQTTNfU0xPV19XUklURV9SRUcoUE0zRmlsdGVyTW9kZSwgUE0zRmlsdGVyTW9kZVN5bmMpOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNTeW5jLCAwKTsKLQltYigpOwotCWRvIHsKLQkJd2hpbGUgKChQTTNfUkVBRF9SRUcoUE0zT3V0RklGT1dvcmRzKSkgPT0gMCk7Ci0JCXJtYigpOwotCX0gd2hpbGUgKChQTTNfUkVBRF9SRUcoUE0zT3V0cHV0RmlmbykpICE9IFBNM1N5bmNfVGFnKTsKLX0KLQotc3RhdGljIHZvaWQgcG0zZmJfaW5pdF9lbmdpbmUoc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbykKLXsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zRmlsdGVyTW9kZSwgUE0zRmlsdGVyTW9kZVN5bmMpOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNTdGF0aXN0aWNNb2RlLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNEZWx0YU1vZGUsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1Jhc3Rlcml6ZXJNb2RlLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNTY2lzc29yTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zTGluZVN0aXBwbGVNb2RlLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNBcmVhU3RpcHBsZU1vZGUsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0dJRE1vZGUsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0RlcHRoTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zU3RlbmNpbE1vZGUsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1N0ZW5jaWxEYXRhLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNDb2xvckREQU1vZGUsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1RleHR1cmVDb29yZE1vZGUsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1RleHR1cmVJbmRleE1vZGUwLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNUZXh0dXJlSW5kZXhNb2RlMSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zVGV4dHVyZVJlYWRNb2RlLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNMVVRNb2RlLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNUZXh0dXJlRmlsdGVyTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zVGV4dHVyZUNvbXBvc2l0ZU1vZGUsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1RleHR1cmVBcHBsaWNhdGlvbk1vZGUsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1RleHR1cmVDb21wb3NpdGVDb2xvck1vZGUxLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNUZXh0dXJlQ29tcG9zaXRlQWxwaGFNb2RlMSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zVGV4dHVyZUNvbXBvc2l0ZUNvbG9yTW9kZTAsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1RleHR1cmVDb21wb3NpdGVBbHBoYU1vZGUwLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNGb2dNb2RlLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNDaHJvbWFUZXN0TW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zQWxwaGFUZXN0TW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zQW50aWFsaWFzTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zWVVWTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zQWxwaGFCbGVuZENvbG9yTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zQWxwaGFCbGVuZEFscGhhTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zRGl0aGVyTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zTG9naWNhbE9wTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zUm91dGVyTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zV2luZG93LCAweDApOwotCi0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0NvbmZpZzJELCAweDApOwotCi0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1NwYW5Db2xvck1hc2ssIDB4ZmZmZmZmZmYpOwotCi0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1hCaWFzLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNZQmlhcywgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zRGVsdGFDb250cm9sLCAweDApOwotCi0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0JpdE1hc2tQYXR0ZXJuLCAweGZmZmZmZmZmKTsKLQotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNGQkRlc3RSZWFkRW5hYmxlcywKLQkJCSAgIFBNM0ZCRGVzdFJlYWRFbmFibGVzX0UoMHhmZikgfAotCQkJICAgUE0zRkJEZXN0UmVhZEVuYWJsZXNfUigweGZmKSB8Ci0JCQkgICBQTTNGQkRlc3RSZWFkRW5hYmxlc19SZWZlcmVuY2VBbHBoYSgweGZmKSk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0ZCRGVzdFJlYWRCdWZmZXJBZGRyMCwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zRkJEZXN0UmVhZEJ1ZmZlck9mZnNldDAsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0ZCRGVzdFJlYWRCdWZmZXJXaWR0aDAsCi0JCQkgICBQTTNGQkRlc3RSZWFkQnVmZmVyV2lkdGhfV2lkdGgobF9mYl9pbmZvLT4KLQkJCQkJCQkgIGN1cnJlbnRfcGFyLT4KLQkJCQkJCQkgIHdpZHRoKSk7Ci0KLQlQTTNfU0xPV19XUklURV9SRUcoUE0zRkJEZXN0UmVhZE1vZGUsCi0JCQkgICBQTTNGQkRlc3RSZWFkTW9kZV9SZWFkRW5hYmxlIHwKLQkJCSAgIFBNM0ZCRGVzdFJlYWRNb2RlX0VuYWJsZTApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNGQlNvdXJjZVJlYWRCdWZmZXJBZGRyLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNGQlNvdXJjZVJlYWRCdWZmZXJPZmZzZXQsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0ZCU291cmNlUmVhZEJ1ZmZlcldpZHRoLAotCQkJICAgUE0zRkJTb3VyY2VSZWFkQnVmZmVyV2lkdGhfV2lkdGgobF9mYl9pbmZvLT4KLQkJCQkJCQkgICAgY3VycmVudF9wYXItPgotCQkJCQkJCSAgICB3aWR0aCkpOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNGQlNvdXJjZVJlYWRNb2RlLAotCQkJICAgUE0zRkJTb3VyY2VSZWFkTW9kZV9CbG9ja2luZyB8Ci0JCQkgICBQTTNGQlNvdXJjZVJlYWRNb2RlX1JlYWRFbmFibGUpOwotCi0JewotCQl1bnNpZ25lZCBsb25nIHJtID0gMTsKLQkJc3dpdGNoIChsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCkgewotCQljYXNlIDg6Ci0JCQlQTTNfU0xPV19XUklURV9SRUcoUE0zUGl4ZWxTaXplLAotCQkJCQkgICBQTTNQaXhlbFNpemVfR0xPQkFMXzhCSVQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCWNhc2UgMTU6Ci0JCWNhc2UgMTY6Ci0JCQlQTTNfU0xPV19XUklURV9SRUcoUE0zUGl4ZWxTaXplLAotCQkJCQkgICBQTTNQaXhlbFNpemVfR0xPQkFMXzE2QklUKTsKLQkJCWJyZWFrOwotCQljYXNlIDMyOgotCQkJUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1BpeGVsU2l6ZSwKLQkJCQkJICAgUE0zUGl4ZWxTaXplX0dMT0JBTF8zMkJJVCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURQUklOVEsoMSwgIlVuc3VwcG9ydGVkIGRlcHRoICVkXG4iLAotCQkJCWxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoKTsKLQkJCWJyZWFrOwotCQl9Ci0JCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNSYXN0ZXJpemVyTW9kZSwgcm0pOwotCX0KLQotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNGQlNvZnR3YXJlV3JpdGVNYXNrLCAweGZmZmZmZmZmKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zRkJIYXJkd2FyZVdyaXRlTWFzaywgMHhmZmZmZmZmZik7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0ZCV3JpdGVNb2RlLAotCQkJICAgUE0zRkJXcml0ZU1vZGVfV3JpdGVFbmFibGUgfAotCQkJICAgUE0zRkJXcml0ZU1vZGVfT3BhcXVlU3BhbiB8Ci0JCQkgICBQTTNGQldyaXRlTW9kZV9FbmFibGUwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zRkJXcml0ZUJ1ZmZlckFkZHIwLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNGQldyaXRlQnVmZmVyT2Zmc2V0MCwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zRkJXcml0ZUJ1ZmZlcldpZHRoMCwKLQkJCSAgIFBNM0ZCV3JpdGVCdWZmZXJXaWR0aF9XaWR0aChsX2ZiX2luZm8tPgotCQkJCQkJICAgICAgIGN1cnJlbnRfcGFyLT4KLQkJCQkJCSAgICAgICB3aWR0aCkpOwotCi0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1NpemVPZkZyYW1lYnVmZmVyLCAweDApOwotCXsKLQkJdW5zaWduZWQgbG9uZyBzb2ZiID0gKDhVTCAqIGxfZmJfaW5mby0+ZmJfc2l6ZSkgLwotCQkJKChkZXB0aDJicHAobF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGgpKQotCQkJICogbF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+d2lkdGgpOwkvKiBzaXplIGluIGxpbmVzIG9mIEZCICovCi0JCWlmIChzb2ZiID4gNDA5NSkKLQkJCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNTaXplT2ZGcmFtZWJ1ZmZlciwgNDA5NSk7Ci0JCWVsc2UKLQkJCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNTaXplT2ZGcmFtZWJ1ZmZlciwgc29mYik7Ci0JCQotCQlzd2l0Y2ggKGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoKSB7Ci0JCWNhc2UgODoKLQkJCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNEaXRoZXJNb2RlLAotCQkJCQkgICAoMSA8PCAxMCkgfCAoMiA8PCAzKSk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMjoKLQkJY2FzZSAxNToKLQkJY2FzZSAxNjoKLQkJCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNEaXRoZXJNb2RlLAotCQkJCQkgICAoMSA8PCAxMCkgfCAoMSA8PCAzKSk7Ci0JCQlicmVhazsKLQkJY2FzZSAzMjoKLQkJCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNEaXRoZXJNb2RlLAotCQkJCQkgICAoMSA8PCAxMCkgfCAoMCA8PCAzKSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURQUklOVEsoMSwgIlVuc3VwcG9ydGVkIGRlcHRoICVkXG4iLAotCQkJCWxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM2RYRG9tLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNkWFN1YiwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zZFksICgxIDw8IDE2KSk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1N0YXJ0WERvbSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zU3RhcnRYU3ViLCAweDApOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNTdGFydFksIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0NvdW50LCAweDApOwotCQotLyogRGlzYWJsZSBMb2NhbEJ1ZmZlci4gYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSAqLwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNMQkRlc3RSZWFkTW9kZSwgMHgwKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zTEJEZXN0UmVhZEVuYWJsZXMsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0xCU291cmNlUmVhZE1vZGUsIDB4MCk7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0xCV3JpdGVNb2RlLCAweDApOwotCQotCXBtM2ZiX3dhaXRfcG0zKGxfZmJfaW5mbyk7Ci19Ci0KLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKLXN0YXRpYyB2b2lkIHBtM2ZiX2NmYjMyX2NsZWFyKHN0cnVjdCB2Y19kYXRhICpjb25wLAotCQkJICAgICAgc3RydWN0IGRpc3BsYXkgKnAsCi0JCQkgICAgICBpbnQgc3ksIGludCBzeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQotewotCXN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8gPSAoc3RydWN0IHBtM2ZiX2luZm8gKikgcC0+ZmJfaW5mbzsKLQl1MzIgYzsKLQotCURUUkFDRTsKLQotCXN4ID0gc3ggKiBmb250d2lkdGgocCk7Ci0Jd2lkdGggPSB3aWR0aCAqIGZvbnR3aWR0aChwKTsKLQlzeSA9IHN5ICogZm9udGhlaWdodChwKTsKLQloZWlnaHQgPSBoZWlnaHQgKiBmb250aGVpZ2h0KHApOwotCWMgPSAoKHUzMiAqKSBwLT5kaXNwc3dfZGF0YSlbYXR0cl9iZ2NvbF9lYyhwLCBjb25wKV07Ci0KLQkvKiBibG9jayBmaWxscyBpbiAzMmJwcCBhcmUgaGFyZCwgYnV0IGluIGxvdyByZXMgKHdpZHRoIDw9IDE2MDAgOi0pCi0JICAgd2UgY2FuIHVzZSAxNmJwcCBvcGVyYXRpb25zLCBidXQgbm90IGlmIE5vV3JpdGVNYXNrIGlzIG9uIChTRFJBTSkgICovCi0JaWYgKChsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT53aWR0aCA+IDE2MDApIHx8Ci0JICAgIChsX2ZiX2luZm8tPm1lbXQuY2FwcyAmIFBNM0xvY2FsTWVtQ2Fwc19Ob1dyaXRlTWFzaykpIHsKLQkJUE0zX1dBSVQoNCk7Ci0KLQkJUE0zX1dSSVRFX1JFRyhQTTNDb25maWcyRCwKLQkJCQkJICBQTTNDb25maWcyRF9Vc2VDb25zdGFudFNvdXJjZSB8Ci0JCQkJCSAgUE0zQ29uZmlnMkRfRm9yZWdyb3VuZFJPUEVuYWJsZSB8Ci0JCQkJCSAgKFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1AoMHgzKSkgfAkvKiBPeDMgaXMgR1hjb3B5ICovCi0JCQkJCSAgUE0zQ29uZmlnMkRfRkJXcml0ZUVuYWJsZSk7Ci0KLQkJUE0zX1dSSVRFX1JFRyhQTTNGb3JlZ3JvdW5kQ29sb3IsIGMpOwotCi0JCVBNM19XUklURV9SRUcoUE0zUmVjdGFuZ2xlUG9zaXRpb24sCi0JCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWE9mZnNldChzeCkpIHwKLQkJCSAgICAgIChQTTNSZWN0YW5nbGVQb3NpdGlvbl9ZT2Zmc2V0KHN5KSkpOwotCi0JCVBNM19XUklURV9SRUcoUE0zUmVuZGVyMkQsCi0JCQkgICAgICBQTTNSZW5kZXIyRF9YUG9zaXRpdmUgfAotCQkJICAgICAgUE0zUmVuZGVyMkRfWVBvc2l0aXZlIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX09wZXJhdGlvbl9Ob3JtYWwgfAotCQkJICAgICAgUE0zUmVuZGVyMkRfU3Bhbk9wZXJhdGlvbiB8Ci0JCQkgICAgICAoUE0zUmVuZGVyMkRfV2lkdGgod2lkdGgpKSB8Ci0JCQkgICAgICAoUE0zUmVuZGVyMkRfSGVpZ2h0KGhlaWdodCkpKTsKLQl9IGVsc2UgewotCQlQTTNfV0FJVCg4KTsKLQotCQlQTTNfV1JJVEVfUkVHKFBNM0ZCQmxvY2tDb2xvciwgYyk7Ci0KLQkJUE0zX1dSSVRFX1JFRyhQTTNQaXhlbFNpemUsIFBNM1BpeGVsU2l6ZV9HTE9CQUxfMTZCSVQpOwotCi0JCVBNM19XUklURV9SRUcoUE0zRkJXcml0ZUJ1ZmZlcldpZHRoMCwKLQkJCSAgICAgIFBNM0ZCV3JpdGVCdWZmZXJXaWR0aF9XaWR0aChsX2ZiX2luZm8tPgotCQkJCQkJCSAgY3VycmVudF9wYXItPgotCQkJCQkJCSAgd2lkdGggPDwgMSkpOwotCi0JCVBNM19XUklURV9SRUcoUE0zQ29uZmlnMkQsCi0JCQkJCSAgUE0zQ29uZmlnMkRfVXNlQ29uc3RhbnRTb3VyY2UgfAotCQkJCQkgIFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1BFbmFibGUgfAotCQkJCQkgIChQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QKDB4MykpIHwJLyogT3gzIGlzIEdYY29weSAqLwotCQkJCQkgIFBNM0NvbmZpZzJEX0ZCV3JpdGVFbmFibGUpOwotCi0JCVBNM19XUklURV9SRUcoUE0zUmVjdGFuZ2xlUG9zaXRpb24sCi0JCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWE9mZnNldChzeCA8PCAxKSkgfAotCQkJICAgICAgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1lPZmZzZXQoc3kpKSk7Ci0KLQkJUE0zX1dSSVRFX1JFRyhQTTNSZW5kZXIyRCwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX1hQb3NpdGl2ZSB8Ci0JCQkgICAgICBQTTNSZW5kZXIyRF9ZUG9zaXRpdmUgfAotCQkJICAgICAgUE0zUmVuZGVyMkRfT3BlcmF0aW9uX05vcm1hbCB8Ci0JCQkgICAgICAoUE0zUmVuZGVyMkRfV2lkdGgod2lkdGggPDwgMSkpIHwKLQkJCSAgICAgIChQTTNSZW5kZXIyRF9IZWlnaHQoaGVpZ2h0KSkpOwotCi0JCVBNM19XUklURV9SRUcoUE0zRkJXcml0ZUJ1ZmZlcldpZHRoMCwKLQkJCSAgICAgIFBNM0ZCV3JpdGVCdWZmZXJXaWR0aF9XaWR0aChsX2ZiX2luZm8tPgotCQkJCQkJCSAgY3VycmVudF9wYXItPgotCQkJCQkJCSAgd2lkdGgpKTsKLQotCQlQTTNfV1JJVEVfUkVHKFBNM1BpeGVsU2l6ZSwgUE0zUGl4ZWxTaXplX0dMT0JBTF8zMkJJVCk7Ci0JfQotCi0JcG0zZmJfd2FpdF9wbTMobF9mYl9pbmZvKTsKLX0KLQotc3RhdGljIHZvaWQgcG0zZmJfY2ZiMzJfY2xlYXJfbWFyZ2lucyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwKLQkJCQkgICAgICBzdHJ1Y3QgZGlzcGxheSAqcCwgaW50IGJvdHRvbV9vbmx5KQotewotCXN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8gPSAoc3RydWN0IHBtM2ZiX2luZm8gKikgcC0+ZmJfaW5mbzsKLQlpbnQgc3gsIHN5OwotCXUzMiBjOwotCi0JRFRSQUNFOwotCi0Jc3ggPSBjb25wLT52Y19jb2xzICogZm9udHdpZHRoKHApOwkvKiByaWdodCBtYXJnaW4gKi8KLQlzeSA9IGNvbnAtPnZjX3Jvd3MgKiBmb250aGVpZ2h0KHApOwkvKiBib3R0b20gbWFyZ2luICovCi0JYyA9ICgodTMyICopIHAtPmRpc3Bzd19kYXRhKVthdHRyX2JnY29sX2VjKHAsIGNvbnApXTsKLQotCWlmICghYm90dG9tX29ubHkpIHsJLyogcmlnaHQgbWFyZ2luIHRvcC0+Ym90dG9tICovCi0JCVBNM19XQUlUKDQpOwotCi0JCVBNM19XUklURV9SRUcoUE0zQ29uZmlnMkQsCi0JCQkJCSAgUE0zQ29uZmlnMkRfVXNlQ29uc3RhbnRTb3VyY2UgfAotCQkJCQkgIFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1BFbmFibGUgfAotCQkJCQkgIChQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QKDB4MykpIHwJLyogT3gzIGlzIEdYY29weSAqLwotCQkJCQkgIFBNM0NvbmZpZzJEX0ZCV3JpdGVFbmFibGUpOwotCi0JCVBNM19XUklURV9SRUcoUE0zRm9yZWdyb3VuZENvbG9yLCBjKTsKLQotCQlQTTNfV1JJVEVfUkVHKFBNM1JlY3RhbmdsZVBvc2l0aW9uLAotCQkJICAgICAgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1hPZmZzZXQKLQkJCSAgICAgICAocC0+dmFyLnhvZmZzZXQgKwotCQkJCXN4KSkgfCAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWU9mZnNldChwLT4KLQkJCQkJCQkJICAgICB2YXIuCi0JCQkJCQkJCSAgICAgeW9mZnNldCkpKTsKLQotCQlQTTNfV1JJVEVfUkVHKFBNM1JlbmRlcjJELAotCQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX1lQb3NpdGl2ZSB8Ci0JCQkgICAgICBQTTNSZW5kZXIyRF9PcGVyYXRpb25fTm9ybWFsIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX1NwYW5PcGVyYXRpb24gfAotCQkJICAgICAgKFBNM1JlbmRlcjJEX1dpZHRoKHAtPnZhci54cmVzIC0gc3gpKSB8Ci0JCQkgICAgICAoUE0zUmVuZGVyMkRfSGVpZ2h0KHAtPnZhci55cmVzKSkpOwotCX0KLQotCS8qIGJvdHRvbSBtYXJnaW4gbGVmdCAtPiByaWdodCAqLwotCVBNM19XQUlUKDQpOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNDb25maWcyRCwKLQkJCQkgIFBNM0NvbmZpZzJEX1VzZUNvbnN0YW50U291cmNlIHwKLQkJCQkgIFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1BFbmFibGUgfAotCQkJCSAgKFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1AoMHgzKSkgfAkvKiBPeDMgaXMgR1hjb3B5ICovCi0JCQkJICBQTTNDb25maWcyRF9GQldyaXRlRW5hYmxlKTsKLQotCVBNM19XUklURV9SRUcoUE0zRm9yZWdyb3VuZENvbG9yLCBjKTsKLQotCVBNM19XUklURV9SRUcoUE0zUmVjdGFuZ2xlUG9zaXRpb24sCi0JCSAgICAgIChQTTNSZWN0YW5nbGVQb3NpdGlvbl9YT2Zmc2V0KHAtPnZhci54b2Zmc2V0KSkgfAotCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWU9mZnNldChwLT52YXIueW9mZnNldCArIHN5KSkpOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNSZW5kZXIyRCwKLQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfWVBvc2l0aXZlIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfT3BlcmF0aW9uX05vcm1hbCB8Ci0JCSAgICAgIFBNM1JlbmRlcjJEX1NwYW5PcGVyYXRpb24gfAotCQkgICAgICAoUE0zUmVuZGVyMkRfV2lkdGgocC0+dmFyLnhyZXMpKSB8Ci0JCSAgICAgIChQTTNSZW5kZXIyRF9IZWlnaHQocC0+dmFyLnlyZXMgLSBzeSkpKTsKLQotCXBtM2ZiX3dhaXRfcG0zKGxfZmJfaW5mbyk7Ci19Ci0jZW5kaWYgLyogRkJDT05fSEFTX0NGQjMyICovCi0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci1zdGF0aWMgdm9pZCBwbTNmYl9jZmIxNl9jbGVhcihzdHJ1Y3QgdmNfZGF0YSAqY29ucCwKLQkJCSAgICAgIHN0cnVjdCBkaXNwbGF5ICpwLAotCQkJICAgICAgaW50IHN5LCBpbnQgc3gsIGludCBoZWlnaHQsIGludCB3aWR0aCkKLXsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvID0gKHN0cnVjdCBwbTNmYl9pbmZvICopIHAtPmZiX2luZm87Ci0JdTMyIGM7Ci0KLQlEVFJBQ0U7Ci0KLQlzeCA9IHN4ICogZm9udHdpZHRoKHApOwotCXdpZHRoID0gd2lkdGggKiBmb250d2lkdGgocCk7Ci0Jc3kgPSBzeSAqIGZvbnRoZWlnaHQocCk7Ci0JaGVpZ2h0ID0gaGVpZ2h0ICogZm9udGhlaWdodChwKTsKLQljID0gKCh1MTYgKikgcC0+ZGlzcHN3X2RhdGEpW2F0dHJfYmdjb2xfZWMocCwgY29ucCldOwotCWMgPSBjIHwgKGMgPDwgMTYpOwotCi0JUE0zX1dBSVQoNCk7Ci0KLQlpZiAobF9mYl9pbmZvLT5tZW10LmNhcHMgJiBQTTNMb2NhbE1lbUNhcHNfTm9Xcml0ZU1hc2spCi0JCVBNM19XUklURV9SRUcoUE0zRm9yZWdyb3VuZENvbG9yLCBjKTsKLQllbHNlCi0JCVBNM19XUklURV9SRUcoUE0zRkJCbG9ja0NvbG9yLCBjKTsKLQotCVBNM19XUklURV9SRUcoUE0zQ29uZmlnMkQsCi0JCQkJICBQTTNDb25maWcyRF9Vc2VDb25zdGFudFNvdXJjZSB8Ci0JCQkJICBQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QRW5hYmxlIHwKLQkJCQkgIChQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QKDB4MykpIHwJLyogT3gzIGlzIEdYY29weSAqLwotCQkJCSAgUE0zQ29uZmlnMkRfRkJXcml0ZUVuYWJsZSk7Ci0KLQlQTTNfV1JJVEVfUkVHKFBNM1JlY3RhbmdsZVBvc2l0aW9uLAotCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWE9mZnNldChzeCkpIHwKLQkJICAgICAgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1lPZmZzZXQoc3kpKSk7Ci0JCi0JaWYgKGxfZmJfaW5mby0+bWVtdC5jYXBzICYgUE0zTG9jYWxNZW1DYXBzX05vV3JpdGVNYXNrKQotCQlQTTNfV1JJVEVfUkVHKFBNM1JlbmRlcjJELAotCQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX1lQb3NpdGl2ZSB8Ci0JCQkgICAgICBQTTNSZW5kZXIyRF9PcGVyYXRpb25fTm9ybWFsIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX1NwYW5PcGVyYXRpb24gfAotCQkJICAgICAgKFBNM1JlbmRlcjJEX1dpZHRoKHdpZHRoKSkgfAotCQkJICAgICAgKFBNM1JlbmRlcjJEX0hlaWdodChoZWlnaHQpKSk7Ci0JZWxzZQotCQlQTTNfV1JJVEVfUkVHKFBNM1JlbmRlcjJELAotCQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX1lQb3NpdGl2ZSB8Ci0JCQkgICAgICBQTTNSZW5kZXIyRF9PcGVyYXRpb25fTm9ybWFsIHwKLQkJCSAgICAgIChQTTNSZW5kZXIyRF9XaWR0aCh3aWR0aCkpIHwKLQkJCSAgICAgIChQTTNSZW5kZXIyRF9IZWlnaHQoaGVpZ2h0KSkpOwotCQotCXBtM2ZiX3dhaXRfcG0zKGxfZmJfaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBtM2ZiX2NmYjE2X2NsZWFyX21hcmdpbnMoc3RydWN0IHZjX2RhdGEgKmNvbnAsCi0JCQkJICAgICAgc3RydWN0IGRpc3BsYXkgKnAsIGludCBib3R0b21fb25seSkKLXsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvID0gKHN0cnVjdCBwbTNmYl9pbmZvICopIHAtPmZiX2luZm87Ci0JaW50IHN4LCBzeTsKLQl1MzIgYzsKLQotCURUUkFDRTsKLQotCXN4ID0gY29ucC0+dmNfY29scyAqIGZvbnR3aWR0aChwKTsJLyogcmlnaHQgbWFyZ2luICovCi0Jc3kgPSBjb25wLT52Y19yb3dzICogZm9udGhlaWdodChwKTsJLyogYm90dG9tIG1hcmdpbiAqLwotCWMgPSAoKHUxNiAqKSBwLT5kaXNwc3dfZGF0YSlbYXR0cl9iZ2NvbF9lYyhwLCBjb25wKV07Ci0JYyA9IGMgfCAoYyA8PCAxNik7Ci0KLQlpZiAoIWJvdHRvbV9vbmx5KSB7CS8qIHJpZ2h0IG1hcmdpbiB0b3AtPmJvdHRvbSAqLwotCQlQTTNfV0FJVCg0KTsKLQotCQlQTTNfV1JJVEVfUkVHKFBNM0NvbmZpZzJELAotCQkJCQkgIFBNM0NvbmZpZzJEX1VzZUNvbnN0YW50U291cmNlIHwKLQkJCQkJICBQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QRW5hYmxlIHwKLQkJCQkJICAoUE0zQ29uZmlnMkRfRm9yZWdyb3VuZFJPUCgweDMpKSB8CS8qIE94MyBpcyBHWGNvcHkgKi8KLQkJCQkJICBQTTNDb25maWcyRF9GQldyaXRlRW5hYmxlKTsKLQkJCi0JCWlmIChsX2ZiX2luZm8tPm1lbXQuY2FwcyAmIFBNM0xvY2FsTWVtQ2Fwc19Ob1dyaXRlTWFzaykKLQkJCVBNM19XUklURV9SRUcoUE0zRm9yZWdyb3VuZENvbG9yLCBjKTsKLQkJZWxzZQotCQkJUE0zX1dSSVRFX1JFRyhQTTNGQkJsb2NrQ29sb3IsIGMpOwotCQkKLQkJUE0zX1dSSVRFX1JFRyhQTTNSZWN0YW5nbGVQb3NpdGlvbiwKLQkJCSAgICAgIChQTTNSZWN0YW5nbGVQb3NpdGlvbl9YT2Zmc2V0Ci0JCQkgICAgICAgKHAtPnZhci54b2Zmc2V0ICsKLQkJCQlzeCkpIHwgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1lPZmZzZXQocC0+Ci0JCQkJCQkJCSAgICAgdmFyLgotCQkJCQkJCQkgICAgIHlvZmZzZXQpKSk7Ci0JCWlmIChsX2ZiX2luZm8tPm1lbXQuY2FwcyAmIFBNM0xvY2FsTWVtQ2Fwc19Ob1dyaXRlTWFzaykKLQkJCVBNM19XUklURV9SRUcoUE0zUmVuZGVyMkQsCi0JCQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJCQkgICAgICBQTTNSZW5kZXIyRF9ZUG9zaXRpdmUgfAotCQkJCSAgICAgIFBNM1JlbmRlcjJEX09wZXJhdGlvbl9Ob3JtYWwgfAotCQkJCSAgICAgIFBNM1JlbmRlcjJEX1NwYW5PcGVyYXRpb24gfAotCQkJCSAgICAgIChQTTNSZW5kZXIyRF9XaWR0aChwLT52YXIueHJlcyAtIHN4KSkgfAotCQkJCSAgICAgIChQTTNSZW5kZXIyRF9IZWlnaHQocC0+dmFyLnlyZXMpKSk7Ci0JCWVsc2UKLQkJCVBNM19XUklURV9SRUcoUE0zUmVuZGVyMkQsCi0JCQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJCQkgICAgICBQTTNSZW5kZXIyRF9ZUG9zaXRpdmUgfAotCQkJCSAgICAgIFBNM1JlbmRlcjJEX09wZXJhdGlvbl9Ob3JtYWwgfAotCQkJCSAgICAgIChQTTNSZW5kZXIyRF9XaWR0aChwLT52YXIueHJlcyAtIHN4KSkgfAotCQkJCSAgICAgIChQTTNSZW5kZXIyRF9IZWlnaHQocC0+dmFyLnlyZXMpKSk7Ci0JfQotCQotCS8qIGJvdHRvbSBtYXJnaW4gbGVmdCAtPiByaWdodCAqLwotCVBNM19XQUlUKDQpOwotCQotCVBNM19XUklURV9SRUcoUE0zQ29uZmlnMkQsCi0JCSAgICAgIFBNM0NvbmZpZzJEX1VzZUNvbnN0YW50U291cmNlIHwKLQkJICAgICAgUE0zQ29uZmlnMkRfRm9yZWdyb3VuZFJPUEVuYWJsZSB8Ci0JCSAgICAgIChQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QKDB4MykpIHwJLyogT3gzIGlzIEdYY29weSAqLwotCQkgICAgICBQTTNDb25maWcyRF9GQldyaXRlRW5hYmxlKTsKLQkKLQlpZiAobF9mYl9pbmZvLT5tZW10LmNhcHMgJiBQTTNMb2NhbE1lbUNhcHNfTm9Xcml0ZU1hc2spCi0JCVBNM19XUklURV9SRUcoUE0zRm9yZWdyb3VuZENvbG9yLCBjKTsKLQllbHNlCi0JCVBNM19XUklURV9SRUcoUE0zRkJCbG9ja0NvbG9yLCBjKTsKLQkKLQkKLQlQTTNfV1JJVEVfUkVHKFBNM1JlY3RhbmdsZVBvc2l0aW9uLAotCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWE9mZnNldChwLT52YXIueG9mZnNldCkpIHwKLQkJICAgICAgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1lPZmZzZXQocC0+dmFyLnlvZmZzZXQgKyBzeSkpKTsKLQkKLQlpZiAobF9mYl9pbmZvLT5tZW10LmNhcHMgJiBQTTNMb2NhbE1lbUNhcHNfTm9Xcml0ZU1hc2spCi0JCVBNM19XUklURV9SRUcoUE0zUmVuZGVyMkQsCi0JCQkgICAgICBQTTNSZW5kZXIyRF9YUG9zaXRpdmUgfAotCQkJICAgICAgUE0zUmVuZGVyMkRfWVBvc2l0aXZlIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX09wZXJhdGlvbl9Ob3JtYWwgfAotCQkJICAgICAgUE0zUmVuZGVyMkRfU3Bhbk9wZXJhdGlvbiB8Ci0JCQkgICAgICAoUE0zUmVuZGVyMkRfV2lkdGgocC0+dmFyLnhyZXMpKSB8Ci0JCQkgICAgICAoUE0zUmVuZGVyMkRfSGVpZ2h0KHAtPnZhci55cmVzIC0gc3kpKSk7Ci0JZWxzZQotCQlQTTNfV1JJVEVfUkVHKFBNM1JlbmRlcjJELAotCQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX1lQb3NpdGl2ZSB8Ci0JCQkgICAgICBQTTNSZW5kZXIyRF9PcGVyYXRpb25fTm9ybWFsIHwKLQkJCSAgICAgIChQTTNSZW5kZXIyRF9XaWR0aChwLT52YXIueHJlcykpIHwKLQkJCSAgICAgIChQTTNSZW5kZXIyRF9IZWlnaHQocC0+dmFyLnlyZXMgLSBzeSkpKTsKLQotCXBtM2ZiX3dhaXRfcG0zKGxfZmJfaW5mbyk7Ci19Ci0jZW5kaWYgLyogRkJDT05fSEFTX0NGQjE2ICovCi0jaWZkZWYgRkJDT05fSEFTX0NGQjgKLXN0YXRpYyB2b2lkIHBtM2ZiX2NmYjhfY2xlYXIoc3RydWN0IHZjX2RhdGEgKmNvbnAsCi0JCQkgICAgIHN0cnVjdCBkaXNwbGF5ICpwLAotCQkJICAgICBpbnQgc3ksIGludCBzeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQotewotCXN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8gPSAoc3RydWN0IHBtM2ZiX2luZm8gKikgcC0+ZmJfaW5mbzsKLQl1MzIgYzsKLQotCURUUkFDRTsKLQotCXN4ID0gc3ggKiBmb250d2lkdGgocCk7Ci0Jd2lkdGggPSB3aWR0aCAqIGZvbnR3aWR0aChwKTsKLQlzeSA9IHN5ICogZm9udGhlaWdodChwKTsKLQloZWlnaHQgPSBoZWlnaHQgKiBmb250aGVpZ2h0KHApOwotCi0JYyA9IGF0dHJfYmdjb2xfZWMocCwgY29ucCk7Ci0JYyB8PSBjIDw8IDg7Ci0JYyB8PSBjIDw8IDE2OwotCi0JUE0zX1dBSVQoNCk7Ci0KLQlQTTNfV1JJVEVfUkVHKFBNM0NvbmZpZzJELAotCQkJCSAgUE0zQ29uZmlnMkRfVXNlQ29uc3RhbnRTb3VyY2UgfAotCQkJCSAgUE0zQ29uZmlnMkRfRm9yZWdyb3VuZFJPUEVuYWJsZSB8Ci0JCQkJICAoUE0zQ29uZmlnMkRfRm9yZWdyb3VuZFJPUCgweDMpKSB8CS8qIE94MyBpcyBHWGNvcHkgKi8KLQkJCQkgIFBNM0NvbmZpZzJEX0ZCV3JpdGVFbmFibGUpOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNGb3JlZ3JvdW5kQ29sb3IsIGMpOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNSZWN0YW5nbGVQb3NpdGlvbiwKLQkJICAgICAgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1hPZmZzZXQoc3gpKSB8Ci0JCSAgICAgIChQTTNSZWN0YW5nbGVQb3NpdGlvbl9ZT2Zmc2V0KHN5KSkpOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNSZW5kZXIyRCwKLQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfWVBvc2l0aXZlIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfT3BlcmF0aW9uX05vcm1hbCB8Ci0JCSAgICAgIFBNM1JlbmRlcjJEX1NwYW5PcGVyYXRpb24gfAotCQkgICAgICAoUE0zUmVuZGVyMkRfV2lkdGgod2lkdGgpKSB8Ci0JCSAgICAgIChQTTNSZW5kZXIyRF9IZWlnaHQoaGVpZ2h0KSkpOwotCi0JcG0zZmJfd2FpdF9wbTMobF9mYl9pbmZvKTsKLX0KLQotc3RhdGljIHZvaWQgcG0zZmJfY2ZiOF9jbGVhcl9tYXJnaW5zKHN0cnVjdCB2Y19kYXRhICpjb25wLAotCQkJCSAgICAgc3RydWN0IGRpc3BsYXkgKnAsIGludCBib3R0b21fb25seSkKLXsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvID0gKHN0cnVjdCBwbTNmYl9pbmZvICopIHAtPmZiX2luZm87Ci0JaW50IHN4LCBzeTsKLQl1MzIgYzsKLQotCURUUkFDRTsKLQotCXN4ID0gY29ucC0+dmNfY29scyAqIGZvbnR3aWR0aChwKTsJLyogcmlnaHQgbWFyZ2luICovCi0Jc3kgPSBjb25wLT52Y19yb3dzICogZm9udGhlaWdodChwKTsJLyogYm90dG9tIG1hcmdpbiAqLwotCWMgPSBhdHRyX2JnY29sX2VjKHAsIGNvbnApOwotCWMgfD0gYyA8PCA4OwotCWMgfD0gYyA8PCAxNjsKLQotCWlmICghYm90dG9tX29ubHkpIHsJLyogcmlnaHQgbWFyZ2luIHRvcC0+Ym90dG9tICovCi0JCVBNM19XQUlUKDQpOwotCi0JCVBNM19XUklURV9SRUcoUE0zQ29uZmlnMkQsCi0JCQkJCSAgUE0zQ29uZmlnMkRfVXNlQ29uc3RhbnRTb3VyY2UgfAotCQkJCQkgIFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1BFbmFibGUgfAotCQkJCQkgIChQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QKDB4MykpIHwJLyogT3gzIGlzIEdYY29weSAqLwotCQkJCQkgIFBNM0NvbmZpZzJEX0ZCV3JpdGVFbmFibGUpOwotCi0JCVBNM19XUklURV9SRUcoUE0zRm9yZWdyb3VuZENvbG9yLCBjKTsKLQotCQlQTTNfV1JJVEVfUkVHKFBNM1JlY3RhbmdsZVBvc2l0aW9uLAotCQkJICAgICAgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1hPZmZzZXQKLQkJCSAgICAgICAocC0+dmFyLnhvZmZzZXQgKwotCQkJCXN4KSkgfCAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWU9mZnNldChwLT4KLQkJCQkJCQkJICAgICB2YXIuCi0JCQkJCQkJCSAgICAgeW9mZnNldCkpKTsKLQotCQlQTTNfV1JJVEVfUkVHKFBNM1JlbmRlcjJELAotCQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX1lQb3NpdGl2ZSB8Ci0JCQkgICAgICBQTTNSZW5kZXIyRF9PcGVyYXRpb25fTm9ybWFsIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX1NwYW5PcGVyYXRpb24gfAotCQkJICAgICAgKFBNM1JlbmRlcjJEX1dpZHRoKHAtPnZhci54cmVzIC0gc3gpKSB8Ci0JCQkgICAgICAoUE0zUmVuZGVyMkRfSGVpZ2h0KHAtPnZhci55cmVzKSkpOwotCX0KLQotCS8qIGJvdHRvbSBtYXJnaW4gbGVmdCAtPiByaWdodCAqLwotCVBNM19XQUlUKDQpOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNDb25maWcyRCwKLQkJCQkgIFBNM0NvbmZpZzJEX1VzZUNvbnN0YW50U291cmNlIHwKLQkJCQkgIFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1BFbmFibGUgfAotCQkJCSAgKFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1AoMHgzKSkgfAkvKiBPeDMgaXMgR1hjb3B5ICovCi0JCQkJICBQTTNDb25maWcyRF9GQldyaXRlRW5hYmxlKTsKLQotCVBNM19XUklURV9SRUcoUE0zRm9yZWdyb3VuZENvbG9yLCBjKTsKLQotCVBNM19XUklURV9SRUcoUE0zUmVjdGFuZ2xlUG9zaXRpb24sCi0JCSAgICAgIChQTTNSZWN0YW5nbGVQb3NpdGlvbl9YT2Zmc2V0KHAtPnZhci54b2Zmc2V0KSkgfAotCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWU9mZnNldChwLT52YXIueW9mZnNldCArIHN5KSkpOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNSZW5kZXIyRCwKLQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfWVBvc2l0aXZlIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfT3BlcmF0aW9uX05vcm1hbCB8Ci0JCSAgICAgIFBNM1JlbmRlcjJEX1NwYW5PcGVyYXRpb24gfAotCQkgICAgICAoUE0zUmVuZGVyMkRfV2lkdGgocC0+dmFyLnhyZXMpKSB8Ci0JCSAgICAgIChQTTNSZW5kZXIyRF9IZWlnaHQocC0+dmFyLnlyZXMgLSBzeSkpKTsKLQotCXBtM2ZiX3dhaXRfcG0zKGxfZmJfaW5mbyk7Ci19Ci0jZW5kaWYgLyogRkJDT05fSEFTX0NGQjggKi8KLSNpZiBkZWZpbmVkKEZCQ09OX0hBU19DRkI4KSB8fCBkZWZpbmVkKEZCQ09OX0hBU19DRkIxNikgfHwgZGVmaW5lZChGQkNPTl9IQVNfQ0ZCMzIpCi1zdGF0aWMgdm9pZCBwbTNmYl9jZmJYX2Jtb3ZlKHN0cnVjdCBkaXNwbGF5ICpwLAotCQkJICAgICBpbnQgc3ksIGludCBzeCwKLQkJCSAgICAgaW50IGR5LCBpbnQgZHgsIGludCBoZWlnaHQsIGludCB3aWR0aCkKLXsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvID0gKHN0cnVjdCBwbTNmYl9pbmZvICopIHAtPmZiX2luZm87Ci0JaW50IHhfYWxpZ24sIG9feCwgb195OwotCi0JRFRSQUNFOwotCi0Jc3ggPSBzeCAqIGZvbnR3aWR0aChwKTsKLQlkeCA9IGR4ICogZm9udHdpZHRoKHApOwotCXdpZHRoID0gd2lkdGggKiBmb250d2lkdGgocCk7Ci0Jc3kgPSBzeSAqIGZvbnRoZWlnaHQocCk7Ci0JZHkgPSBkeSAqIGZvbnRoZWlnaHQocCk7Ci0JaGVpZ2h0ID0gaGVpZ2h0ICogZm9udGhlaWdodChwKTsKLQotCW9feCA9IHN4IC0gZHg7CQkvKihzeCA+IGR4ICkgPyAoc3ggLSBkeCkgOiAoZHggLSBzeCk7ICovCi0Jb195ID0gc3kgLSBkeTsJCS8qKHN5ID4gZHkgKSA/IChzeSAtIGR5KSA6IChkeSAtIHN5KTsgKi8KLQotCXhfYWxpZ24gPSAoc3ggJiAweDFmKTsKLQotCVBNM19XQUlUKDYpOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNDb25maWcyRCwKLQkJCQkgIFBNM0NvbmZpZzJEX1VzZXJTY2lzc29yRW5hYmxlIHwKLQkJCQkgIFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1BFbmFibGUgfAotCQkJCSAgUE0zQ29uZmlnMkRfQmxvY2tpbmcgfAotCQkJCSAgKFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1AoMHgzKSkgfAkvKiBPeDMgaXMgR1hjb3B5ICovCi0JCQkJICBQTTNDb25maWcyRF9GQldyaXRlRW5hYmxlKTsKLQotCVBNM19XUklURV9SRUcoUE0zU2Npc3Nvck1pblhZLAotCQkgICAgICAoKGR5ICYgMHgwZmZmKSA8PCAxNikgfCAoZHggJiAweDBmZmYpKTsKLQlQTTNfV1JJVEVfUkVHKFBNM1NjaXNzb3JNYXhYWSwKLQkJCQkgICgoKGR5ICsgaGVpZ2h0KSAmIDB4MGZmZikgPDwgMTYpIHwKLQkJCQkgICgoZHggKyB3aWR0aCkgJiAweDBmZmYpKTsKLQotCVBNM19XUklURV9SRUcoUE0zRkJTb3VyY2VSZWFkQnVmZmVyT2Zmc2V0LAotCQkgICAgICBQTTNGQlNvdXJjZVJlYWRCdWZmZXJPZmZzZXRfWE9mZnNldChvX3gpIHwKLQkJICAgICAgUE0zRkJTb3VyY2VSZWFkQnVmZmVyT2Zmc2V0X1lPZmZzZXQob195KSk7Ci0KLQlQTTNfV1JJVEVfUkVHKFBNM1JlY3RhbmdsZVBvc2l0aW9uLAotCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWE9mZnNldChkeCAtIHhfYWxpZ24pKSB8Ci0JCSAgICAgIChQTTNSZWN0YW5nbGVQb3NpdGlvbl9ZT2Zmc2V0KGR5KSkpOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNSZW5kZXIyRCwKLQkJICAgICAgKChzeCA+IGR4KSA/IFBNM1JlbmRlcjJEX1hQb3NpdGl2ZSA6IDApIHwKLQkJICAgICAgKChzeSA+IGR5KSA/IFBNM1JlbmRlcjJEX1lQb3NpdGl2ZSA6IDApIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfT3BlcmF0aW9uX05vcm1hbCB8Ci0JCSAgICAgIFBNM1JlbmRlcjJEX1NwYW5PcGVyYXRpb24gfAotCQkgICAgICBQTTNSZW5kZXIyRF9GQlNvdXJjZVJlYWRFbmFibGUgfAotCQkgICAgICAoUE0zUmVuZGVyMkRfV2lkdGgod2lkdGggKyB4X2FsaWduKSkgfAotCQkgICAgICAoUE0zUmVuZGVyMkRfSGVpZ2h0KGhlaWdodCkpKTsKLQotCXBtM2ZiX3dhaXRfcG0zKGxfZmJfaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBtM2ZiX2NmYlhfcHV0YyhzdHJ1Y3QgdmNfZGF0YSAqY29ucCwgc3RydWN0IGRpc3BsYXkgKnAsCi0JCQkgICAgaW50IGMsIGludCB5eSwgaW50IHh4KQotewotCXN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8gPSAoc3RydWN0IHBtM2ZiX2luZm8gKikgcC0+ZmJfaW5mbzsKLQl1OCAqY2RhdCwgYXN4ID0gMCwgYXN5ID0gMCwgb194ID0gMCwgb195ID0gMDsKLQl1MzIgZmd4LCBiZ3gsIGxkYXQ7Ci0JaW50IHN4LCBzeSwgaTsKLQotCURUUkFDRTsKLQotCWlmIChsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCA9PSA4KQotCQlmZ3ggPSBhdHRyX2ZnY29sKHAsIGMpOwotCWVsc2UgaWYgKGRlcHRoMmJwcChsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCkgPT0gMTYpCi0JCWZneCA9ICgodTE2ICopIHAtPmRpc3Bzd19kYXRhKVthdHRyX2ZnY29sKHAsIGMpXTsKLQllbHNlCi0JCWZneCA9ICgodTMyICopIHAtPmRpc3Bzd19kYXRhKVthdHRyX2ZnY29sKHAsIGMpXTsKLQotCVBNM19DT0xPUihmZ3gpOwotCi0JaWYgKGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoID09IDgpCi0JCWJneCA9IGF0dHJfYmdjb2wocCwgYyk7Ci0JZWxzZSBpZiAoZGVwdGgyYnBwKGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoKSA9PSAxNikKLQkJYmd4ID0gKCh1MTYgKikgcC0+ZGlzcHN3X2RhdGEpW2F0dHJfYmdjb2wocCwgYyldOwotCWVsc2UKLQkJYmd4ID0gKCh1MzIgKikgcC0+ZGlzcHN3X2RhdGEpW2F0dHJfYmdjb2wocCwgYyldOwotCi0JUE0zX0NPTE9SKGJneCk7Ci0KLQlQTTNfV0FJVCg0KTsKLQotCVBNM19XUklURV9SRUcoUE0zQ29uZmlnMkQsCi0JCQkJICBQTTNDb25maWcyRF9Vc2VDb25zdGFudFNvdXJjZSB8Ci0JCQkJICBQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QRW5hYmxlIHwKLQkJCQkgIChQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QKDB4MykpIHwJLyogT3gzIGlzIEdYY29weSAqLwotCQkJCSAgUE0zQ29uZmlnMkRfRkJXcml0ZUVuYWJsZSB8IFBNM0NvbmZpZzJEX09wYXF1ZVNwYW4pOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNGb3JlZ3JvdW5kQ29sb3IsIGZneCk7Ci0JUE0zX1dSSVRFX1JFRyhQTTNGaWxsQmFja2dyb3VuZENvbG9yLCBiZ3gpOwotCi0JLyogV0FSTklORyA6IGFkZHJlc3Mgc2VsZWN0IFggbmVlZCB0byBzcGVjaWZ5IDggYml0cyBmb3IgZm9udHdpZHRoIDw9IDggKi8KLQkvKiBhbmQgMTYgYml0cyBmb3IgZm9udHdpZHRoIDw9IDE2ICovCi0JLyogc2FtZSBpbiBfcHV0Y3MsIHNhbWUgZm9yIFkgYW5kIGZvbnRoZWlnaHQgKi8KLQlpZiAoZm9udHdpZHRoKHApIDw9IDgpCi0JCWFzeCA9IDI7Ci0JZWxzZSBpZiAoZm9udHdpZHRoKHApIDw9IDE2KQotCQlhc3ggPSAzOwkvKiBsb29rIE9LICovCi0JaWYgKGZvbnRoZWlnaHQocCkgPD0gOCkKLQkJYXN5ID0gMjsKLQllbHNlIGlmIChmb250aGVpZ2h0KHApIDw9IDE2KQotCQlhc3kgPSAzOwkvKiBsb29rIE9LICovCi0JZWxzZSBpZiAoZm9udGhlaWdodChwKSA8PSAzMikKLQkJYXN5ID0gNDsJLyogbG9vayBPSyAqLwotCi0Jc3ggPSB4eCAqIGZvbnR3aWR0aChwKTsKLQlzeSA9IHl5ICogZm9udGhlaWdodChwKTsKLQotCWlmIChmb250d2lkdGgocCkgPD0gOCkKLQkJb194ID0gKDggLSAoc3ggJiAweDcpKSAmIDB4NzsKLQllbHNlIGlmIChmb250d2lkdGgocCkgPD0gMTYpCi0JCW9feCA9ICgxNiAtIChzeCAmIDB4RikpICYgMHhGOwotCWlmIChmb250aGVpZ2h0KHApIDw9IDgpCi0JCW9feSA9ICg4IC0gKHN5ICYgMHg3KSkgJiAweDc7Ci0JZWxzZSBpZiAoZm9udGhlaWdodChwKSA8PSAxNikKLQkJb195ID0gKDE2IC0gKHN5ICYgMHhGKSkgJiAweEY7Ci0JZWxzZSBpZiAoZm9udGhlaWdodChwKSA8PSAzMikKLQkJb195ID0gKDMyIC0gKHN5ICYgMHgxRikpICYgMHgxRjsKLQotCVBNM19XUklURV9SRUcoUE0zQXJlYVN0aXBwbGVNb2RlLCAob194IDw8IDcpIHwgKG9feSA8PCAxMikgfAkvKiB4X29mZnNldCwgeV9vZmZzZXQgaW4gcGF0dGVybiAqLwotCQkgICAgICAoMSA8PCAxOCkgfAkvKiBCRSAqLwotCQkgICAgICAxIHwgKGFzeCA8PCAxKSB8IChhc3kgPDwgNCkgfAkvKiBhZGRyZXNzIHNlbGVjdCB4L3kgKi8KLQkJICAgICAgKDEgPDwgMjApKTsJLyogT3BhcXVlU3BhbiAqLwotCi0JaWYgKGZvbnR3aWR0aChwKSA8PSA4KSB7Ci0JCWNkYXQgPSBwLT5mb250ZGF0YSArIChjICYgcC0+Y2hhcm1hc2spICogZm9udGhlaWdodChwKTsKLQl9IGVsc2UgewotCQljZGF0ID0KLQkJICAgIHAtPmZvbnRkYXRhICsKLQkJICAgICgoYyAmIHAtPmNoYXJtYXNrKSAqIChmb250aGVpZ2h0KHApIDw8IDEpKTsKLQl9Ci0KLQlQTTNfV0FJVCgyICsgZm9udGhlaWdodChwKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZm9udGhlaWdodChwKTsgaSsrKSB7CS8qIGFzc3VtZSBmb250aGVpZ2h0IDw9IDMyICovCi0JCWlmIChmb250d2lkdGgocCkgPD0gOCkgewotCQkJbGRhdCA9ICpjZGF0Kys7Ci0JCX0gZWxzZSB7CS8qIGFzc3VtZSBmb250d2lkdGggPD0gMTYgQVRNICovCi0KLQkJCWxkYXQgPSAoKCpjZGF0KyspIDw8IDgpOwotCQkJbGRhdCB8PSAqY2RhdCsrOwotCQl9Ci0JCVBNM19XUklURV9SRUcoQXJlYVN0aXBwbGVQYXR0ZXJuX2luZGV4ZWQoaSksIGxkYXQpOwotCX0KLQotCVBNM19XUklURV9SRUcoUE0zUmVjdGFuZ2xlUG9zaXRpb24sCi0JCSAgICAgIChQTTNSZWN0YW5nbGVQb3NpdGlvbl9YT2Zmc2V0KHN4KSkgfAotCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWU9mZnNldChzeSkpKTsKLQotCVBNM19XUklURV9SRUcoUE0zUmVuZGVyMkQsCi0JCSAgICAgIFBNM1JlbmRlcjJEX0FyZWFTdGlwcGxlRW5hYmxlIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfWFBvc2l0aXZlIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfWVBvc2l0aXZlIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfT3BlcmF0aW9uX05vcm1hbCB8Ci0JCSAgICAgIFBNM1JlbmRlcjJEX1NwYW5PcGVyYXRpb24gfAotCQkgICAgICAoUE0zUmVuZGVyMkRfV2lkdGgoZm9udHdpZHRoKHApKSkgfAotCQkgICAgICAoUE0zUmVuZGVyMkRfSGVpZ2h0KGZvbnRoZWlnaHQocCkpKSk7Ci0KLQlwbTNmYl93YWl0X3BtMyhsX2ZiX2luZm8pOwotfQotCi1zdGF0aWMgdm9pZCBwbTNmYl9jZmJYX3B1dGNzKHN0cnVjdCB2Y19kYXRhICpjb25wLCBzdHJ1Y3QgZGlzcGxheSAqcCwKLQkJCSAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKnMsIGludCBjb3VudCwgaW50IHl5LAotCQkJICAgICBpbnQgeHgpCi17Ci0Jc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyA9IChzdHJ1Y3QgcG0zZmJfaW5mbyAqKSBwLT5mYl9pbmZvOwotCXU4ICpjZGF0LCBhc3ggPSAwLCBhc3kgPSAwLCBvX3ggPSAwLCBvX3kgPSAwOwotCXUzMiBmZ3gsIGJneCwgbGRhdDsKLQlpbnQgc3gsIHN5LCBpLCBqOwotCXUxNiBzYzsKLQotCURUUkFDRTsKLQotCXNjID0gc2NyX3JlYWR3KHMpOwotCWlmIChsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCA9PSA4KQotCQlmZ3ggPSBhdHRyX2ZnY29sKHAsIHNjKTsKLQllbHNlIGlmIChkZXB0aDJicHAobF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGgpID09IDE2KQotCQlmZ3ggPSAoKHUxNiAqKSBwLT5kaXNwc3dfZGF0YSlbYXR0cl9mZ2NvbChwLCBzYyldOwotCWVsc2UKLQkJZmd4ID0gKCh1MzIgKikgcC0+ZGlzcHN3X2RhdGEpW2F0dHJfZmdjb2wocCwgc2MpXTsKLQkKLQlQTTNfQ09MT1IoZmd4KTsKLQkKLQlpZiAobF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGggPT0gOCkKLQkJYmd4ID0gYXR0cl9iZ2NvbChwLCBzYyk7Ci0JZWxzZSBpZiAoZGVwdGgyYnBwKGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoKSA9PSAxNikKLQkJYmd4ID0gKCh1MTYgKikgcC0+ZGlzcHN3X2RhdGEpW2F0dHJfYmdjb2wocCwgc2MpXTsKLQllbHNlCi0JCWJneCA9ICgodTMyICopIHAtPmRpc3Bzd19kYXRhKVthdHRyX2JnY29sKHAsIHNjKV07Ci0JCi0JUE0zX0NPTE9SKGJneCk7Ci0KLQlQTTNfV0FJVCg0KTsKLQotCVBNM19XUklURV9SRUcoUE0zQ29uZmlnMkQsCi0JCQkJICBQTTNDb25maWcyRF9Vc2VDb25zdGFudFNvdXJjZSB8Ci0JCQkJICBQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QRW5hYmxlIHwKLQkJCQkgIChQTTNDb25maWcyRF9Gb3JlZ3JvdW5kUk9QKDB4MykpIHwJLyogT3gzIGlzIEdYY29weSAqLwotCQkJCSAgUE0zQ29uZmlnMkRfRkJXcml0ZUVuYWJsZSB8Ci0JCQkJICBQTTNDb25maWcyRF9PcGFxdWVTcGFuKTsKLQotCVBNM19XUklURV9SRUcoUE0zRm9yZWdyb3VuZENvbG9yLCBmZ3gpOwotCVBNM19XUklURV9SRUcoUE0zRmlsbEJhY2tncm91bmRDb2xvciwgYmd4KTsKLQotCS8qIFdBUk5JTkcgOiBhZGRyZXNzIHNlbGVjdCBYIG5lZWQgdG8gc3BlY2lmeSA4IGJpdHMgZm9yIGZvbnR3aWR0aCA8PSA4ICovCi0JLyogYW5kIDE2IGJpdHMgZm9yIGZvbnR3aWR0aCA8PSAxNiAqLwotCS8qIHNhbWUgaW4gX3B1dGMsIHNhbWUgZm9yIFkgYW5kIGZvbnRoZWlnaHQgKi8KLQlpZiAoZm9udHdpZHRoKHApIDw9IDgpCi0JCWFzeCA9IDI7Ci0JZWxzZSBpZiAoZm9udHdpZHRoKHApIDw9IDE2KQotCQlhc3ggPSAzOwkvKiBsb29rIE9LICovCi0JaWYgKGZvbnRoZWlnaHQocCkgPD0gOCkKLQkJYXN5ID0gMjsKLQllbHNlIGlmIChmb250aGVpZ2h0KHApIDw9IDE2KQotCQlhc3kgPSAzOwkvKiBsb29rIE9LICovCi0JZWxzZSBpZiAoZm9udGhlaWdodChwKSA8PSAzMikKLQkJYXN5ID0gNDsJLyogbG9vayBPSyAqLwotCi0Jc3kgPSB5eSAqIGZvbnRoZWlnaHQocCk7Ci0KLQlpZiAoZm9udGhlaWdodChwKSA8PSA4KQotCQlvX3kgPSAoOCAtIChzeSAmIDB4NykpICYgMHg3OwotCWVsc2UgaWYgKGZvbnRoZWlnaHQocCkgPD0gMTYpCi0JCW9feSA9ICgxNiAtIChzeSAmIDB4RikpICYgMHhGOwotCWVsc2UgaWYgKGZvbnRoZWlnaHQocCkgPD0gMzIpCi0JCW9feSA9ICgzMiAtIChzeSAmIDB4MUYpKSAmIDB4MUY7Ci0KLQlmb3IgKGogPSAwOyBqIDwgY291bnQ7IGorKykgewotCQlzYyA9IHNjcl9yZWFkdyhzICsgaik7Ci0JCWlmIChmb250d2lkdGgocCkgPD0gOCkKLQkJCWNkYXQgPSBwLT5mb250ZGF0YSArCi0JCQkJKHNjICYgcC0+Y2hhcm1hc2spICogZm9udGhlaWdodChwKTsKLQkJZWxzZQotCQkJY2RhdCA9IHAtPmZvbnRkYXRhICsKLQkJCQkoKHNjICYgcC0+Y2hhcm1hc2spICogZm9udGhlaWdodChwKSA8PCAxKTsKLQkJCi0JCXN4ID0gKHh4ICsgaikgKiBmb250d2lkdGgocCk7Ci0KLQkJaWYgKGZvbnR3aWR0aChwKSA8PSA4KQotCQkJb194ID0gKDggLSAoc3ggJiAweDcpKSAmIDB4NzsKLQkJZWxzZSBpZiAoZm9udHdpZHRoKHApIDw9IDE2KQotCQkJb194ID0gKDE2IC0gKHN4ICYgMHhGKSkgJiAweEY7Ci0KLQkJUE0zX1dBSVQoMyArIGZvbnRoZWlnaHQocCkpOwotCi0JCVBNM19XUklURV9SRUcoUE0zQXJlYVN0aXBwbGVNb2RlLCAob194IDw8IDcpIHwgKG9feSA8PCAxMikgfCAvKiB4X29mZnNldCwgeV9vZmZzZXQgaW4gcGF0dGVybiAqLwotCQkJICAgICAgKDEgPDwgMTgpIHwgLyogQkUgKi8KLQkJCSAgICAgIDEgfCAoYXN4IDw8IDEpIHwgKGFzeSA8PCA0KSB8IC8qIGFkZHJlc3Mgc2VsZWN0IHgveSAqLwotCQkJICAgICAgKDEgPDwgMjApKTsgLyogT3BhcXVlU3BhbiAqLwotCi0JCWZvciAoaSA9IDA7IGkgPCBmb250aGVpZ2h0KHApOyBpKyspIHsgLyogYXNzdW1lIGZvbnRoZWlnaHQgPD0gMzIgKi8KLQkJCWlmIChmb250d2lkdGgocCkgPD0gOCkgewotCQkJCWxkYXQgPSAqY2RhdCsrOwotCQkJfSBlbHNlIHsgLyogYXNzdW1lIGZvbnR3aWR0aCA8PSAxNiBBVE0gKi8KLQkJCQlsZGF0ID0gKCgqY2RhdCsrKSA8PCA4KTsKLQkJCQlsZGF0IHw9ICpjZGF0Kys7Ci0JCQl9Ci0JCQlQTTNfV1JJVEVfUkVHKEFyZWFTdGlwcGxlUGF0dGVybl9pbmRleGVkKGkpLCBsZGF0KTsKLQkJfQotCi0JCVBNM19XUklURV9SRUcoUE0zUmVjdGFuZ2xlUG9zaXRpb24sCi0JCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWE9mZnNldChzeCkpIHwKLQkJCSAgICAgIChQTTNSZWN0YW5nbGVQb3NpdGlvbl9ZT2Zmc2V0KHN5KSkpOwotCi0JCVBNM19XUklURV9SRUcoUE0zUmVuZGVyMkQsCi0JCQkgICAgICBQTTNSZW5kZXIyRF9BcmVhU3RpcHBsZUVuYWJsZSB8Ci0JCQkgICAgICBQTTNSZW5kZXIyRF9YUG9zaXRpdmUgfAotCQkJICAgICAgUE0zUmVuZGVyMkRfWVBvc2l0aXZlIHwKLQkJCSAgICAgIFBNM1JlbmRlcjJEX09wZXJhdGlvbl9Ob3JtYWwgfAotCQkJICAgICAgUE0zUmVuZGVyMkRfU3Bhbk9wZXJhdGlvbiB8Ci0JCQkgICAgICAoUE0zUmVuZGVyMkRfV2lkdGgoZm9udHdpZHRoKHApKSkgfAotCQkJICAgICAgKFBNM1JlbmRlcjJEX0hlaWdodChmb250aGVpZ2h0KHApKSkpOwotCX0KLQlwbTNmYl93YWl0X3BtMyhsX2ZiX2luZm8pOwotfQotCi1zdGF0aWMgdm9pZCBwbTNmYl9jZmJYX3JldmMoc3RydWN0IGRpc3BsYXkgKnAsIGludCB4eCwgaW50IHl5KQotewotCXN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8gPSAoc3RydWN0IHBtM2ZiX2luZm8gKikgcC0+ZmJfaW5mbzsKLQotCXh4ID0geHggKiBmb250d2lkdGgocCk7Ci0JeXkgPSB5eSAqIGZvbnRoZWlnaHQocCk7Ci0KLQlpZiAobF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGggPT0gOCkKLQl7Ci0JCWlmIChsX2ZiX2luZm8tPm1lbXQuY2FwcyAmIFBNM0xvY2FsTWVtQ2Fwc19Ob1dyaXRlTWFzaykKLQkJCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNGQlNvZnR3YXJlV3JpdGVNYXNrLCAweDBGMEYwRjBGKTsKLQkJZWxzZQotCQkJUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0ZCSGFyZHdhcmVXcml0ZU1hc2ssIDB4MEYwRjBGMEYpOwotCX0KLQotCVBNM19XQUlUKDMpOwotCi0JUE0zX1dSSVRFX1JFRyhQTTNDb25maWcyRCwKLQkJCQkgIFBNM0NvbmZpZzJEX1VzZUNvbnN0YW50U291cmNlIHwKLQkJCQkgIFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1BFbmFibGUgfAotCQkJCSAgKFBNM0NvbmZpZzJEX0ZvcmVncm91bmRST1AoMHhhKSkgfAkvKiBPeGEgaXMgR1hpbnZlcnQgKi8KLQkJCQkgIFBNM0NvbmZpZzJEX0ZCRGVzdFJlYWRFbmFibGUgfAotCQkJCSAgUE0zQ29uZmlnMkRfRkJXcml0ZUVuYWJsZSk7Ci0KLQlQTTNfV1JJVEVfUkVHKFBNM1JlY3RhbmdsZVBvc2l0aW9uLAotCQkgICAgICAoUE0zUmVjdGFuZ2xlUG9zaXRpb25fWE9mZnNldCh4eCkpIHwKLQkJICAgICAgKFBNM1JlY3RhbmdsZVBvc2l0aW9uX1lPZmZzZXQoeXkpKSk7Ci0KLQlQTTNfV1JJVEVfUkVHKFBNM1JlbmRlcjJELAotCQkgICAgICBQTTNSZW5kZXIyRF9YUG9zaXRpdmUgfAotCQkgICAgICBQTTNSZW5kZXIyRF9ZUG9zaXRpdmUgfAotCQkgICAgICBQTTNSZW5kZXIyRF9PcGVyYXRpb25fTm9ybWFsIHwKLQkJICAgICAgUE0zUmVuZGVyMkRfU3Bhbk9wZXJhdGlvbiB8Ci0JCSAgICAgIChQTTNSZW5kZXIyRF9XaWR0aChmb250d2lkdGgocCkpKSB8Ci0JCSAgICAgIChQTTNSZW5kZXIyRF9IZWlnaHQoZm9udGhlaWdodChwKSkpKTsKLQotCXBtM2ZiX3dhaXRfcG0zKGxfZmJfaW5mbyk7Ci0KLQlpZiAobF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGggPT0gOCkKLQl7Ci0JCWlmIChsX2ZiX2luZm8tPm1lbXQuY2FwcyAmIFBNM0xvY2FsTWVtQ2Fwc19Ob1dyaXRlTWFzaykKLQkJCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNGQlNvZnR3YXJlV3JpdGVNYXNrLCAweEZGRkZGRkZGKTsKLQkJZWxzZQotCQkJUE0zX1NMT1dfV1JJVEVfUkVHKFBNM0ZCSGFyZHdhcmVXcml0ZU1hc2ssIDB4RkZGRkZGRkYpOwotCX0KLX0KLQotI2VuZGlmIC8qIEZCQ09OX0hBU19DRkI4IHx8IEZCQ09OX0hBU19DRkIxNiB8fCBGQkNPTl9IQVNfQ0ZCMzIgKi8KLSNlbmRpZiAvKiBQTTNGQl9VU0VfQUNDRUwgKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKiBwcmUtaW5pdCBib2FyZChzKSBzZXR1cCAqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotc3RhdGljIHZvaWQgcG0zZmJfbW9kZV9zZXR1cChjaGFyICptb2RlLCB1bnNpZ25lZCBsb25nIGJvYXJkX251bSkKLXsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvID0gJihmYl9pbmZvW2JvYXJkX251bV0pOwotCXN0cnVjdCBwbTNmYl9wYXIgKmxfZmJfcGFyID0gJihjdXJyZW50X3Bhcltib2FyZF9udW1dKTsKLQl1bnNpZ25lZCBsb25nIGkgPSAwOwotCi0JY3VycmVudF9wYXJfdmFsaWRbYm9hcmRfbnVtXSA9IDA7Ci0KLQlpZiAoIXN0cm5jbXAobW9kZSwgImN1cnJlbnQiLCA3KSkgewotCQlsX2ZiX2luZm8tPnVzZV9jdXJyZW50ID0gMTsJLyogZGVmYXVsdCB3LyBPcGVuRmlybXdhcmUgKi8KLQl9IGVsc2UgewotCQl3aGlsZSAoKG1vZGVfYmFzZVtpXS5uYW1lWzBdKQotCQkgICAgICAgJiYgKCFjdXJyZW50X3Bhcl92YWxpZFtib2FyZF9udW1dKSkgewotCQkJaWYgKCEKLQkJCSAgICAoc3RybmNtcAotCQkJICAgICAobW9kZSwgbW9kZV9iYXNlW2ldLm5hbWUsCi0JCQkgICAgICBzdHJsZW4obW9kZV9iYXNlW2ldLm5hbWUpKSkpIHsKLQkJCQltZW1jcHkobF9mYl9wYXIsICYobW9kZV9iYXNlW2ldLnVzZXJfbW9kZSksCi0JCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcG0zZmJfcGFyKSk7Ci0JCQkJY3VycmVudF9wYXJfdmFsaWRbYm9hcmRfbnVtXSA9IDE7Ci0JCQkJRFBSSU5USygyLCAiTW9kZSBzZXQgdG8gJXNcbiIsCi0JCQkJCW1vZGVfYmFzZVtpXS5uYW1lKTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlEQVNTRVJUKGN1cnJlbnRfcGFyX3ZhbGlkW2JvYXJkX251bV0sCi0JCQkiVmFsaWQgbW9kZSBvbiBjb21tYW5kIGxpbmVcbiIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcG0zZmJfcGNpaWRfc2V0dXAoY2hhciAqcGNpaWQsIHVuc2lnbmVkIGxvbmcgYm9hcmRfbnVtKQotewotCXNob3J0IGxfYnVzID0gLTEsIGxfc2xvdCA9IC0xLCBsX2Z1bmMgPSAtMTsKLQljaGFyICpuZXh0OwotCi0JaWYgKHBjaWlkKSB7Ci0JCWxfYnVzID0gc2ltcGxlX3N0cnRvdWwocGNpaWQsICZuZXh0LCAxMCk7Ci0JCWlmIChuZXh0ICYmIChuZXh0WzBdID09ICc6JykpIHsKLQkJCXBjaWlkID0gbmV4dCArIDE7Ci0JCQlsX3Nsb3QgPSBzaW1wbGVfc3RydG91bChwY2lpZCwgJm5leHQsIDEwKTsKLQkJCWlmIChuZXh0ICYmIChuZXh0WzBdID09ICc6JykpIHsKLQkJCQlwY2lpZCA9IG5leHQgKyAxOwotCQkJCWxfZnVuYyA9Ci0JCQkJICAgIHNpbXBsZV9zdHJ0b3VsKHBjaWlkLCAoY2hhciAqKikgTlVMTCwKLQkJCQkJCSAgIDEwKTsKLQkJCX0KLQkJfQotCX0gZWxzZQotCQlyZXR1cm47Ci0KLQlpZiAoKGxfYnVzID49IDApICYmIChsX3Nsb3QgPj0gMCkgJiYgKGxfZnVuYyA+PSAwKSkgewotCQlidXNbYm9hcmRfbnVtXSA9IGxfYnVzOwotCQlzbG90W2JvYXJkX251bV0gPSBsX3Nsb3Q7Ci0JCWZ1bmNbYm9hcmRfbnVtXSA9IGxfZnVuYzsKLQkJRFBSSU5USygyLCAiQm9hcmQgIyVsZCB3aWxsIGJlIFBjaUlkOiAlaGQ6JWhkOiVoZFxuIiwKLQkJCWJvYXJkX251bSwgbF9idXMsIGxfc2xvdCwgbF9mdW5jKTsKLQl9IGVsc2UgewotCQlEUFJJTlRLKDEsICJJbnZhbGlkIFBjaUlkOiAlaGQ6JWhkOiVoZCBmb3IgYm9hcmQgIyVsZFxuIiwKLQkJCWxfYnVzLCBsX3Nsb3QsIGxfZnVuYywgYm9hcmRfbnVtKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHBtM2ZiX2ZvbnRfc2V0dXAoY2hhciAqbGYsIHVuc2lnbmVkIGxvbmcgYm9hcmRfbnVtKQotewotCXVuc2lnbmVkIGxvbmcgbGZzID0gc3RybGVuKGxmKTsKLQotCWlmIChsZnMgPiAoUE0zX0ZPTlROQU1FX1NJWkUgLSAxKSkgewotCQlEUFJJTlRLKDEsICJGb250bmFtZSAlcyB0b28gbG9uZ1xuIiwgbGYpOwotCQlyZXR1cm47Ci0JfQotCXN0cmxjcHkoZm9udG5bYm9hcmRfbnVtXSwgbGYsIGxmcyArIDEpOwotfQotCi1zdGF0aWMgdm9pZCBwbTNmYl9ib290ZGVwdGhfc2V0dXAoY2hhciAqYmRzLCB1bnNpZ25lZCBsb25nIGJvYXJkX251bSkKLXsKLQl1bnNpZ25lZCBsb25nIGJkID0gc2ltcGxlX3N0cnRvdWwoYmRzLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0JaWYgKCEoZGVwdGhfc3VwcG9ydGVkKGJkKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicG0zZmI6IGlnbm9yaW5nIGludmFsaWQgZGVwdGggJXMgZm9yIGJvYXJkICMlbGRcbiIsCi0JCSAgICAgICBiZHMsIGJvYXJkX251bSk7Ci0JCXJldHVybjsKLQl9Ci0JZGVwdGhbYm9hcmRfbnVtXSA9IGJkOwotfQotCi1zdGF0aWMgdm9pZCBwbTNmYl9mb3JjZXNpemVfc2V0dXAoY2hhciAqYmRzLCB1bnNpZ25lZCBsb25nIGJvYXJkX251bSkKLXsKLQl1bnNpZ25lZCBsb25nIGJkID0gc2ltcGxlX3N0cnRvdWwoYmRzLCAoY2hhciAqKikgTlVMTCwgMTApOwotCi0JaWYgKGJkID4gNjQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAicG0zZmI6IGlnbm9yaW5nIGludmFsaWQgbWVtb3J5IHNpemUgJXMgZm9yIGJvYXJkICMlbGRcbiIsCi0JCSAgICAgICBiZHMsIGJvYXJkX251bSk7Ci0JCXJldHVybjsKLQl9Ci0JZm9yY2VzaXplW2JvYXJkX251bV0gPSBiZDsKLX0KLQotc3RhdGljIGNoYXIgKnBtM2ZiX2JvYXJkbnVtX3NldHVwKGNoYXIgKm9wdGlvbnMsIHVuc2lnbmVkIGxvbmcgKmJuKQotewotCWNoYXIgKm5leHQ7Ci0KLQlpZiAoIShpc2RpZ2l0KG9wdGlvbnNbMF0pKSkgewotCQkoKmJuKSA9IDA7Ci0JCXJldHVybiAob3B0aW9ucyk7Ci0JfQotCi0JKCpibikgPSBzaW1wbGVfc3RydG91bChvcHRpb25zLCAmbmV4dCwgMTApOwotCi0JaWYgKG5leHQgJiYgKG5leHRbMF0gPT0gJzonKSAmJiAoKCpibikgPj0gMCkKLQkgICAgJiYgKCgqYm4pIDw9IFBNM19NQVhfQk9BUkQpKSB7Ci0JCURQUklOVEsoMiwgIkJvYXJkX251bSBzZWVuIGFzICVsZFxuIiwgKCpibikpOwotCQlyZXR1cm4gKG5leHQgKyAxKTsKLQl9IGVsc2UgewotCQkoKmJuKSA9IDA7Ci0JCURQUklOVEsoMiwgIkJvYXJkX251bSBkZWZhdWx0IHRvICVsZFxuIiwgKCpibikpOwotCQlyZXR1cm4gKG9wdGlvbnMpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcG0zZmJfcmVhbF9zZXR1cChjaGFyICpvcHRpb25zKQotewotCWNoYXIgKm5leHQ7Ci0JdW5zaWduZWQgbG9uZyBpLCBibjsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvOwotCi0JRFRSQUNFOwotCi0JRFBSSU5USygyLCAiT3B0aW9ucyA6ICVzXG4iLCBvcHRpb25zKTsKLQotCWZvciAoaSA9IDA7IGkgPCBQTTNfTUFYX0JPQVJEOyBpKyspIHsKLQkJbF9mYl9pbmZvID0gJihmYl9pbmZvW2ldKTsKLQkJbWVtc2V0KGxfZmJfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBwbTNmYl9pbmZvKSk7Ci0JCWxfZmJfaW5mby0+Z2VuLmZiaHcgPSAmcG0zZmJfc3dpdGNoOwotCQlsX2ZiX2luZm8tPmJvYXJkX251bSA9IGk7Ci0JCWN1cnJlbnRfcGFyX3ZhbGlkW2ldID0gMDsKLQkJc2xvdFtpXSA9IC0xOwotCQlmdW5jW2ldID0gLTE7Ci0JCWJ1c1tpXSA9IC0xOwotCQlkaXNhYmxlW2ldID0gMDsKLQkJbm9hY2NlbFtpXSA9IDA7Ci0JCWZvbnRuW2ldWzBdID0gJ1wwJzsKLQkJZGVwdGhbaV0gPSAwOwotCQlsX2ZiX2luZm8tPmN1cnJlbnRfcGFyID0gJihjdXJyZW50X3BhcltpXSk7Ci0JfQotCi0JLyogZWF0IHVwIHByZWZpeCBwbTNmYiBhbmQgd2hhdGV2ZXIgaXMgdXNlZCBhcyBzZXBhcmF0b3IgaS5lLiA6LD0gKi8KLQlpZiAoIXN0cm5jbXAob3B0aW9ucywgInBtM2ZiIiwgNSkpIHsKLQkJb3B0aW9ucyArPSA1OwotCQl3aGlsZSAoKCgqb3B0aW9ucykgPT0gJywnKSB8fCAoKCpvcHRpb25zKSA9PSAnOicpCi0JCSAgICAgICB8fCAoKCpvcHRpb25zKSA9PSAnPScpKQotCQkJb3B0aW9ucysrOwotCX0KLQotCXdoaWxlIChvcHRpb25zKSB7Ci0JCWJuID0gMDsKLQkJaWYgKChuZXh0ID0gc3RyY2hyKG9wdGlvbnMsICcsJykpKSB7Ci0JCQkoKm5leHQpID0gJ1wwJzsKLQkJCW5leHQrKzsKLQkJfQotCi0JCWlmICghc3RybmNtcChvcHRpb25zLCAibW9kZToiLCA1KSkgewotCQkJb3B0aW9ucyA9IHBtM2ZiX2JvYXJkbnVtX3NldHVwKG9wdGlvbnMgKyA1LCAmYm4pOwotCQkJRFBSSU5USygyLCAiU2V0dGluZyBtb2RlIGZvciBib2FyZCAjJWxkXG4iLCBibik7Ci0JCQlwbTNmYl9tb2RlX3NldHVwKG9wdGlvbnMsIGJuKTsKLQkJfSBlbHNlIGlmICghc3RybmNtcChvcHRpb25zLCAib2ZmOiIsIDQpKSB7Ci0JCQlvcHRpb25zID0gcG0zZmJfYm9hcmRudW1fc2V0dXAob3B0aW9ucyArIDQsICZibik7Ci0JCQlEUFJJTlRLKDIsICJEaXNhYmxpbmcgYm9hcmQgIyVsZFxuIiwgYm4pOwotCQkJZGlzYWJsZVtibl0gPSAxOwotCQl9IGVsc2UgaWYgKCFzdHJuY21wKG9wdGlvbnMsICJvZmYiLCAzKSkgewkvKiBkaXNhYmxlIGV2ZXJ5dGhpbmcgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBQTTNfTUFYX0JPQVJEOyBpKyspCi0JCQkJZGlzYWJsZVtpXSA9IDE7Ci0JCX0gZWxzZSBpZiAoIXN0cm5jbXAob3B0aW9ucywgImRpc2FibGU6IiwgOCkpIHsKLQkJCW9wdGlvbnMgPSBwbTNmYl9ib2FyZG51bV9zZXR1cChvcHRpb25zICsgOCwgJmJuKTsKLQkJCURQUklOVEsoMiwgIkRpc2FibGluZyBib2FyZCAjJWxkXG4iLCBibik7Ci0JCQlkaXNhYmxlW2JuXSA9IDE7Ci0JCX0gZWxzZSBpZiAoIXN0cm5jbXAob3B0aW9ucywgInBjaWlkOiIsIDYpKSB7Ci0JCQlvcHRpb25zID0gcG0zZmJfYm9hcmRudW1fc2V0dXAob3B0aW9ucyArIDYsICZibik7Ci0JCQlEUFJJTlRLKDIsICJTZXR0aW5nIFBjaUlEIGZvciBib2FyZCAjJWxkXG4iLCBibik7Ci0JCQlwbTNmYl9wY2lpZF9zZXR1cChvcHRpb25zLCBibik7Ci0JCX0gZWxzZSBpZiAoIXN0cm5jbXAob3B0aW9ucywgIm5vYWNjZWw6IiwgOCkpIHsKLQkJCW9wdGlvbnMgPSBwbTNmYl9ib2FyZG51bV9zZXR1cChvcHRpb25zICsgOCwgJmJuKTsKLQkJCW5vYWNjZWxbYm5dID0gMTsKLQkJfSBlbHNlIGlmICghc3RybmNtcChvcHRpb25zLCAiZm9udDoiLCA1KSkgewotCQkJb3B0aW9ucyA9IHBtM2ZiX2JvYXJkbnVtX3NldHVwKG9wdGlvbnMgKyA1LCAmYm4pOwotCQkJcG0zZmJfZm9udF9zZXR1cChvcHRpb25zLCBibik7Ci0JCX0gZWxzZSBpZiAoIXN0cm5jbXAob3B0aW9ucywgImRlcHRoOiIsIDYpKSB7Ci0JCQlvcHRpb25zID0gcG0zZmJfYm9hcmRudW1fc2V0dXAob3B0aW9ucyArIDYsICZibik7Ci0JCQlwbTNmYl9ib290ZGVwdGhfc2V0dXAob3B0aW9ucywgYm4pOwotCQl9IGVsc2UgaWYgKCFzdHJuY21wKG9wdGlvbnMsICJwcmludHRpbWluZ3MiLCAxMikpIHsKLQkJCXByaW50dGltaW5ncyA9IDE7Ci0JCX0gZWxzZSBpZiAoIXN0cm5jbXAob3B0aW9ucywgImZsYXRwYW5lbDoiLCAxMCkpIHsKLQkJCW9wdGlvbnMgPSBwbTNmYl9ib2FyZG51bV9zZXR1cChvcHRpb25zICsgMTAsICZibik7Ci0JCQlmbGF0cGFuZWxbYm5dID0gMTsKLQkJfSBlbHNlIGlmICghc3RybmNtcChvcHRpb25zLCAiZm9yY2VzaXplOiIsIDEwKSkgewotCQkJb3B0aW9ucyA9IHBtM2ZiX2JvYXJkbnVtX3NldHVwKG9wdGlvbnMgKyAxMCwgJmJuKTsKLQkJCXBtM2ZiX2ZvcmNlc2l6ZV9zZXR1cChvcHRpb25zLCBibik7Ci0JCX0KLQkJb3B0aW9ucyA9IG5leHQ7Ci0JfQotfQotCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKiBmcmFtZWJ1ZmZlciBBUEkgc3RhbmRhcmQgZnVuY3Rpb25zICoqKioqICovCi0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLXN0YXRpYyBpbnQgcG0zZmJfZW5jb2RlX2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwKLQkJCSAgICBjb25zdCB2b2lkICpwYXIsIHN0cnVjdCBmYl9pbmZvX2dlbiAqaW5mbykKLXsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvID0gKHN0cnVjdCBwbTNmYl9pbmZvICopIGluZm87Ci0Jc3RydWN0IHBtM2ZiX3BhciAqcCA9IChzdHJ1Y3QgcG0zZmJfcGFyICopIHBhcjsKLQotCURUUkFDRTsKLQotCXN0cmNweShmaXgtPmlkLCBwZXJtZWRpYTNfbmFtZSk7Ci0JZml4LT5zbWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpbF9mYl9pbmZvLT5wX2ZiOwotCWZpeC0+c21lbV9sZW4gPSBsX2ZiX2luZm8tPmZiX3NpemU7Ci0JZml4LT5tbWlvX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpbF9mYl9pbmZvLT5wSU9CYXNlOwotCWZpeC0+bW1pb19sZW4gPSBQTTNfUkVHU19TSVpFOwotI2lmZGVmIFBNM0ZCX1VTRV9BQ0NFTAotCWlmICghKG5vYWNjZWxbbF9mYl9pbmZvLT5ib2FyZF9udW1dKSkKLQkJZml4LT5hY2NlbCA9IEZCX0FDQ0VMXzNETEFCU19QRVJNRURJQTM7Ci0JZWxzZQotI2VuZGlmIC8qIFBNM0ZCX1VTRV9BQ0NFTCAqLwotCQlmaXgtPmFjY2VsID0gRkJfQUNDRUxfTk9ORTsKLQlmaXgtPnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7Ci0JZml4LT52aXN1YWwgPQotCSAgICAocC0+ZGVwdGggPT0gOCkgPyBGQl9WSVNVQUxfUFNFVURPQ09MT1IgOiBGQl9WSVNVQUxfVFJVRUNPTE9SOwotCWlmIChjdXJyZW50X3Bhcl92YWxpZFtsX2ZiX2luZm8tPmJvYXJkX251bV0pCi0JCWZpeC0+bGluZV9sZW5ndGggPQotCQkJbF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+d2lkdGggKgotCQkJZGVwdGgyQnlQUChsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCk7Ci0JZWxzZQotCQlmaXgtPmxpbmVfbGVuZ3RoID0gMDsKLQlmaXgtPnhwYW5zdGVwID0gNjQgLyBkZXB0aDJicHAocC0+ZGVwdGgpOwotCWZpeC0+eXBhbnN0ZXAgPSAxOwotCWZpeC0+eXdyYXBzdGVwID0gMDsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50IHBtM2ZiX2RlY29kZV92YXIoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICAgdm9pZCAqcGFyLCBzdHJ1Y3QgZmJfaW5mb19nZW4gKmluZm8pCi17Ci0Jc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyA9IChzdHJ1Y3QgcG0zZmJfaW5mbyAqKSBpbmZvOwotCXN0cnVjdCBwbTNmYl9wYXIgKnAgPSAoc3RydWN0IHBtM2ZiX3BhciAqKSBwYXI7Ci0Jc3RydWN0IHBtM2ZiX3BhciB0ZW1wX3A7Ci0JdTMyIHhyZXM7Ci0KLQlEVFJBQ0U7Ci0KLQlEQVNTRVJUKCh2YXIgIT0gTlVMTCksICJmYl92YXJfc2NyZWVuaW5mbyogbm90IE5VTEwiKTsKLQlEQVNTRVJUKChwICE9IE5VTEwpLCAicG0zZmJfcGFyKiBub3QgTlVMTCIpOwotCURBU1NFUlQoKGxfZmJfaW5mbyAhPSBOVUxMKSwgInBtM2ZiX2luZm8qIG5vdCBOVUxMIik7Ci0KLQltZW1zZXQoJnRlbXBfcCwgMCwgc2l6ZW9mKHN0cnVjdCBwbTNmYl9wYXIpKTsKLQl0ZW1wX3Aud2lkdGggPSAodmFyLT54cmVzX3ZpcnR1YWwgKyA3KSAmIH43OwotCXRlbXBfcC5oZWlnaHQgPSB2YXItPnlyZXNfdmlydHVhbDsKLQotCWlmICghKGRlcHRoX3N1cHBvcnRlZCh2YXItPmJpdHNfcGVyX3BpeGVsKSkpIC8qIHJvdW5kIHVuc3VwcG9ydGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YgOCAqLwotCQl0ZW1wX3AuZGVwdGggPSBkZXB0aDJicHAodmFyLT5iaXRzX3Blcl9waXhlbCk7Ci0JZWxzZQotCQl0ZW1wX3AuZGVwdGggPSB2YXItPmJpdHNfcGVyX3BpeGVsOwotCi0JdGVtcF9wLmRlcHRoID0gKHRlbXBfcC5kZXB0aCA+IDMyKSA/IDMyIDogdGVtcF9wLmRlcHRoOyAvKiBtYXggMzIgKi8KLQl0ZW1wX3AuZGVwdGggPSAodGVtcF9wLmRlcHRoID09IDI0KSA/IDMyIDogdGVtcF9wLmRlcHRoOyAvKiAyNCB1bnN1cHBvcnRlZCwgcm91bmQtdXAgdG8gMzIgKi8KLQotCWlmICgodGVtcF9wLmRlcHRoID09IDE2KSAmJiAodmFyLT5yZWQubGVuZ3RoID09IDUpICYmICh2YXItPmdyZWVuLmxlbmd0aCA9PSA1KSAmJiAodmFyLT5ibHVlLmxlbmd0aCA9PSA1KSkKLQkJdGVtcF9wLmRlcHRoID0gMTU7IC8qIFJHQkEgNTU1MSBpcyBzdG9yZWQgYXMgZGVwdGggMTUgKi8KLQotCWlmICgodGVtcF9wLmRlcHRoID09IDE2KSAmJiAodmFyLT5yZWQubGVuZ3RoID09IDQpICYmICh2YXItPmdyZWVuLmxlbmd0aCA9PSA0KSAmJiAodmFyLT5ibHVlLmxlbmd0aCA9PSA0KSkKLQkJdGVtcF9wLmRlcHRoID0gMTI7IC8qIFJHQkEgNDQ0NCAgaXMgc3RvcmVkIGFzIGRlcHRoIDEyICovCi0KLQotCURQUklOVEsoMiwKLQkJInhyZXM6ICVkLCB5cmVzOiAlZCwgdnhyZXM6ICVkLCB2eXJlczogJWQgOyB4b2Zmc2V0OiVkLCB5b2Zmc2V0OiAlZFxuIiwKLQkJdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+eHJlc192aXJ0dWFsLCB2YXItPnlyZXNfdmlydHVhbCwKLQkJdmFyLT54b2Zmc2V0LCB2YXItPnlvZmZzZXQpOwotCi0JeHJlcyA9ICh2YXItPnhyZXMgKyAzMSkgJiB+MzE7Ci0JaWYgKHRlbXBfcC53aWR0aCA8IHhyZXMgKyB2YXItPnhvZmZzZXQpCi0JCXRlbXBfcC53aWR0aCA9IHhyZXMgKyB2YXItPnhvZmZzZXQ7Ci0JaWYgKHRlbXBfcC5oZWlnaHQgPCB2YXItPnlyZXMgKyB2YXItPnlvZmZzZXQpCi0JCXRlbXBfcC5oZWlnaHQgPSB2YXItPnlyZXMgKyB2YXItPnlvZmZzZXQ7Ci0KLQlpZiAodGVtcF9wLndpZHRoID4gMjA0OCkgewotCQlEUFJJTlRLKDEsICJ2aXJ0dWFsIHdpZHRoIG5vdCBzdXBwb3J0ZWQ6ICV1XG4iLAotCQkJdGVtcF9wLndpZHRoKTsKLQkJcmV0dXJuICgtRUlOVkFMKTsKLQl9Ci0JaWYgKHZhci0+eXJlcyA8IDIwMCkgewotCQlEUFJJTlRLKDEsICJoZWlnaHQgbm90IHN1cHBvcnRlZDogJXVcbiIsICh1MzIpIHZhci0+eXJlcyk7Ci0JCXJldHVybiAoLUVJTlZBTCk7Ci0JfQotCWlmICh0ZW1wX3AuaGVpZ2h0IDwgMjAwIHx8IHRlbXBfcC5oZWlnaHQgPiA0MDk1KSB7Ci0JCURQUklOVEsoMSwgInZpcnR1YWwgaGVpZ2h0IG5vdCBzdXBwb3J0ZWQ6ICV1XG4iLAotCQkJdGVtcF9wLmhlaWdodCk7Ci0JCXJldHVybiAoLUVJTlZBTCk7Ci0JfQotCWlmICghKGRlcHRoX3N1cHBvcnRlZCh0ZW1wX3AuZGVwdGgpKSkgewotCQlEUFJJTlRLKDEsICJkZXB0aCBub3Qgc3VwcG9ydGVkOiAldVxuIiwgdGVtcF9wLmRlcHRoKTsKLQkJcmV0dXJuICgtRUlOVkFMKTsKLQl9Ci0JaWYgKCh0ZW1wX3Aud2lkdGggKiB0ZW1wX3AuaGVpZ2h0ICogZGVwdGgyQnlQUCh0ZW1wX3AuZGVwdGgpKSA+Ci0JICAgIGxfZmJfaW5mby0+ZmJfc2l6ZSkgewotCQlEUFJJTlRLKDEsICJubyBtZW1vcnkgZm9yIHNjcmVlbiAoJXV4JXV4JXUpXG4iLAotCQkJdGVtcF9wLndpZHRoLCB0ZW1wX3AuaGVpZ2h0LCB0ZW1wX3AuZGVwdGgpOwotCQlyZXR1cm4gKC1FSU5WQUwpOwotCX0KLQotCWlmICgoIXZhci0+cGl4Y2xvY2spIHx8Ci0JICAgICghdmFyLT5yaWdodF9tYXJnaW4pIHx8Ci0JICAgICghdmFyLT5oc3luY19sZW4pIHx8Ci0JICAgICghdmFyLT5sZWZ0X21hcmdpbikgfHwKLQkgICAgKCF2YXItPmxvd2VyX21hcmdpbikgfHwKLQkgICAgKCF2YXItPnZzeW5jX2xlbikgfHwgKCF2YXItPnVwcGVyX21hcmdpbikKLQkgICAgKSB7Ci0JCXVuc2lnbmVkIGxvbmcgaSA9IDAsIGRvbmUgPSAwOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJwbTNmYjogcmVmdXNpbmcgdG8gdXNlIGEgbGlrZWx5IHdyb25nIHRpbWluZ1xuIik7Ci0KLQkJd2hpbGUgKChtb2RlX2Jhc2VbaV0udXNlcl9tb2RlLndpZHRoKSAmJiAhZG9uZSkgewotCQkJaWYgKChtb2RlX2Jhc2VbaV0udXNlcl9tb2RlLndpZHRoID09IHRlbXBfcC53aWR0aCkKLQkJCSAgICAmJiAobW9kZV9iYXNlW2ldLnVzZXJfbW9kZS5oZWlnaHQgPT0KLQkJCQl0ZW1wX3AuaGVpZ2h0KSkgewotCQkJCXByaW50ayhLRVJOX05PVElDRSAicG0zZmI6IHVzaW5nIGNsb3NlIG1hdGNoICVzXG4iLAotCQkJCSAgICAgICBtb2RlX2Jhc2VbaV0ubmFtZSk7Ci0JCQkJdGVtcF9wID0gbW9kZV9iYXNlW2ldLnVzZXJfbW9kZTsKLQkJCQlkb25lID0gMTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlpZiAoIWRvbmUpCi0JCQlyZXR1cm4gKC1FSU5WQUwpOwotCX0gZWxzZSB7Ci0JCXRlbXBfcC5waXhjbG9jayA9IFBJQ09TMktIWih2YXItPnBpeGNsb2NrKTsKLQkJaWYgKHRlbXBfcC5waXhjbG9jayA+IFBNM19NQVhfUElYQ0xPQ0spIHsKLQkJCURQUklOVEsoMSwgInBpeGNsb2NrIHRvbyBoaWdoICgldUtIeilcbiIsCi0JCQkJdGVtcF9wLnBpeGNsb2NrKTsKLQkJCXJldHVybiAoLUVJTlZBTCk7Ci0JCX0KLQotCQl0ZW1wX3AuaHNzdGFydCA9IHZhci0+cmlnaHRfbWFyZ2luOwotCQl0ZW1wX3AuaHNlbmQgPSB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuOwotCQl0ZW1wX3AuaGJlbmQgPQotCQkgICAgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbiArIHZhci0+bGVmdF9tYXJnaW47Ci0JCXRlbXBfcC5odG90YWwgPSB4cmVzICsgdGVtcF9wLmhiZW5kOwotCi0JCXRlbXBfcC52c3N0YXJ0ID0gdmFyLT5sb3dlcl9tYXJnaW47Ci0JCXRlbXBfcC52c2VuZCA9IHZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW47Ci0JCXRlbXBfcC52YmVuZCA9Ci0JCSAgICB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuICsgdmFyLT51cHBlcl9tYXJnaW47Ci0JCXRlbXBfcC52dG90YWwgPSB2YXItPnlyZXMgKyB0ZW1wX3AudmJlbmQ7Ci0KLQkJdGVtcF9wLnN0cmlkZSA9IHRlbXBfcC53aWR0aDsKLQotCQlEUFJJTlRLKDIsICJVc2luZyAlZCAqICVkLCAlZCBLaHosIHN0cmlkZSBpcyAlMDh4XG4iLAotCQkJdGVtcF9wLndpZHRoLCB0ZW1wX3AuaGVpZ2h0LCB0ZW1wX3AucGl4Y2xvY2ssCi0JCQl0ZW1wX3Auc3RyaWRlKTsKLQotCQl0ZW1wX3AuYmFzZSA9Ci0JCSAgICBwbTNmYl9TaGlmdGJwcChsX2ZiX2luZm8sIHRlbXBfcC5kZXB0aCwKLQkJCQkgICAodmFyLT55b2Zmc2V0ICogeHJlcykgKyB2YXItPnhvZmZzZXQpOwotCi0JCXRlbXBfcC52aWRlbyA9IDA7Ci0KLQkJaWYgKHZhci0+c3luYyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKQotCQkJdGVtcF9wLnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfSElHSDsKLQkJZWxzZQotCQkJdGVtcF9wLnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XOwotCi0JCWlmICh2YXItPnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpCi0JCQl0ZW1wX3AudmlkZW8gfD0gUE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9ISUdIOwotCQllbHNlCi0JCQl0ZW1wX3AudmlkZW8gfD0gUE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9MT1c7Ci0KLQkJaWYgKCh2YXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfSU5URVJMQUNFRCkgewotCQkJRFBSSU5USygxLCAiSW50ZXJsYWNlZCBtb2RlIG5vdCBzdXBwb3J0ZWRcblxuIik7Ci0JCQlyZXR1cm4gKC1FSU5WQUwpOwotCQl9Ci0KLQkJaWYgKCh2YXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfRE9VQkxFKQotCQkJdGVtcF9wLnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9MSU5FX0RPVUJMRV9PTjsKLQkJZWxzZQotCQkJdGVtcF9wLnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9MSU5FX0RPVUJMRV9PRkY7Ci0KLQkJaWYgKHZhci0+YWN0aXZhdGUgPT0gRkJfQUNUSVZBVEVfTk9XKQotCQkJdGVtcF9wLnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9FTkFCTEU7Ci0JCWVsc2UgewotCQkJdGVtcF9wLnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9ESVNBQkxFOwotCQkJRFBSSU5USygyLCAiUE0zVmlkZW8gZGlzYWJsZWRcbiIpOwotCQl9Ci0KLQkJc3dpdGNoICh0ZW1wX3AuZGVwdGgpIHsKLQkJY2FzZSA4OgotCQkJdGVtcF9wLnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfOEJJVDsKLQkJCWJyZWFrOwotCQljYXNlIDEyOgotCQljYXNlIDE1OgotCQljYXNlIDE2OgotCQkJdGVtcF9wLnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfMTZCSVQ7Ci0JCQlicmVhazsKLQkJY2FzZSAzMjoKLQkJCXRlbXBfcC52aWRlbyB8PSBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzMyQklUOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEUFJJTlRLKDEsICJVbnN1cHBvcnRlZCBkZXB0aFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQkoKnApID0gdGVtcF9wOwotCi0jaWZkZWYgUE0zRkJfVVNFX0FDQ0VMCi0JaWYgKHZhci0+YWNjZWxfZmxhZ3MgJiBGQl9BQ0NFTEZfVEVYVCkKLQkJbm9hY2NlbFtsX2ZiX2luZm8tPmJvYXJkX251bV0gPSAwOwotCWVsc2UKLQkJbm9hY2NlbFtsX2ZiX2luZm8tPmJvYXJkX251bV0gPSAxOwotI2VuZGlmIC8qIFBNM0ZCX1VTRV9BQ0NFTCAqLwotCi0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQgcG0zZmJfZW5jb2RlX2RlcHRoKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBsb25nIGQpCi17Ci0Jc3dpdGNoIChkKSB7CisJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKKwl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCXN3aXRjaCh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CiAJY2FzZSA4OgogCQl2YXItPnJlZC5sZW5ndGggPSB2YXItPmdyZWVuLmxlbmd0aCA9IHZhci0+Ymx1ZS5sZW5ndGggPSA4OwogCQl2YXItPnJlZC5vZmZzZXQgPSB2YXItPmdyZWVuLm9mZnNldCA9IHZhci0+Ymx1ZS5vZmZzZXQgPSAwOwotCQl2YXItPnRyYW5zcC5vZmZzZXQgPSB2YXItPnRyYW5zcC5sZW5ndGggPSAwOwogCQlicmVhazsKLQogCWNhc2UgMTI6Ci0JCXZhci0+cmVkLm9mZnNldCA9IDg7Ci0JCXZhci0+cmVkLmxlbmd0aCA9IDQ7CisJCXZhci0+cmVkLm9mZnNldCAgID0gODsKKwkJdmFyLT5yZWQubGVuZ3RoICAgPSA0OwogCQl2YXItPmdyZWVuLm9mZnNldCA9IDQ7CiAJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNDsKLQkJdmFyLT5ibHVlLm9mZnNldCA9IDA7Ci0JCXZhci0+Ymx1ZS5sZW5ndGggPSA0OworCQl2YXItPmJsdWUub2Zmc2V0ICA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggID0gNDsKIAkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMTI7CiAJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDQ7Ci0JCWJyZWFrOwotCiAJY2FzZSAxNToKLQkJdmFyLT5yZWQub2Zmc2V0ID0gMTA7Ci0JCXZhci0+cmVkLmxlbmd0aCA9IDU7CisJCXZhci0+cmVkLm9mZnNldCAgID0gMTA7CisJCXZhci0+cmVkLmxlbmd0aCAgID0gNTsKIAkJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OwogCQl2YXItPmdyZWVuLmxlbmd0aCA9IDU7Ci0JCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwotCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKKwkJdmFyLT5ibHVlLm9mZnNldCAgPSAwOworCQl2YXItPmJsdWUubGVuZ3RoICA9IDU7CiAJCXZhci0+dHJhbnNwLm9mZnNldCA9IDE1OwogCQl2YXItPnRyYW5zcC5sZW5ndGggPSAxOwogCQlicmVhazsKLQogCWNhc2UgMTY6Ci0JCXZhci0+cmVkLm9mZnNldCA9IDExOwotCQl2YXItPnJlZC5sZW5ndGggPSA1OworCQl2YXItPnJlZC5vZmZzZXQgICA9IDExOworCQl2YXItPnJlZC5sZW5ndGggICA9IDU7CiAJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsKIAkJdmFyLT5ncmVlbi5sZW5ndGggPSA2OwotCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKLQkJdmFyLT5ibHVlLmxlbmd0aCA9IDU7Ci0JCXZhci0+dHJhbnNwLm9mZnNldCA9IHZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CisJCXZhci0+Ymx1ZS5vZmZzZXQgID0gMDsKKwkJdmFyLT5ibHVlLmxlbmd0aCAgPSA1OwogCQlicmVhazsKLQogCWNhc2UgMzI6CiAJCXZhci0+dHJhbnNwLm9mZnNldCA9IDI0OwotCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKKwkJdmFyLT50cmFuc3AubGVuZ3RoID0gODsKKwkJdmFyLT5yZWQub2Zmc2V0CSAgPSAxNjsKIAkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OwotCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKLQkJdmFyLT5yZWQubGVuZ3RoID0gdmFyLT5ncmVlbi5sZW5ndGggPQotCQkJdmFyLT5ibHVlLmxlbmd0aCA9IHZhci0+dHJhbnNwLmxlbmd0aCA9IDg7CisJCXZhci0+Ymx1ZS5vZmZzZXQgID0gMDsKKwkJdmFyLT5yZWQubGVuZ3RoID0gdmFyLT5ncmVlbi5sZW5ndGggPSB2YXItPmJsdWUubGVuZ3RoID0gODsKIAkJYnJlYWs7Ci0KIAlkZWZhdWx0OgotCQlEUFJJTlRLKDEsICJVbnN1cHBvcnRlZCBkZXB0aCAlbGRcbiIsIGQpOwotCQlicmVhazsKKwkJRFBSSU5USygiZGVwdGggbm90IHN1cHBvcnRlZDogJXVcbiIsIHZhci0+Yml0c19wZXJfcGl4ZWwpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci19Ci0KLXN0YXRpYyBpbnQgcG0zZmJfZW5jb2RlX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKLQkJCSAgICBjb25zdCB2b2lkICpwYXIsIHN0cnVjdCBmYl9pbmZvX2dlbiAqaW5mbykKLXsKLQlzdHJ1Y3QgcG0zZmJfcGFyICpwID0gKHN0cnVjdCBwbTNmYl9wYXIgKikgcGFyOwotCXN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8gPSAoc3RydWN0IHBtM2ZiX2luZm8gKikgaW5mbzsKLQotCXUzMiBiYXNlOwotCi0JRFRSQUNFOwotCi0JREFTU0VSVCgodmFyICE9IE5VTEwpLCAiZmJfdmFyX3NjcmVlbmluZm8qIG5vdCBOVUxMIik7Ci0JREFTU0VSVCgocCAhPSBOVUxMKSwgInBtM2ZiX3Bhciogbm90IE5VTEwiKTsKLQlEQVNTRVJUKChpbmZvICE9IE5VTEwpLCAiZmJfaW5mb19nZW4qIG5vdCBOVUxMIik7Ci0KLQltZW1zZXQodmFyLCAwLCBzaXplb2Yoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKSk7Ci0KLSNpZmRlZiBQTTNGQl9VU0VfQUNDRUwKLQlpZiAoIShub2FjY2VsW2xfZmJfaW5mby0+Ym9hcmRfbnVtXSkpCi0JCXZhci0+YWNjZWxfZmxhZ3MgfD0gRkJfQUNDRUxGX1RFWFQ7Ci0jZW5kaWYgLyogUE0zRkJfVVNFX0FDQ0VMICovCi0KLQl2YXItPnhyZXNfdmlydHVhbCA9IHAtPndpZHRoOwotCXZhci0+eXJlc192aXJ0dWFsID0gcC0+aGVpZ2h0OwotCXZhci0+eHJlcyA9IHAtPmh0b3RhbCAtIHAtPmhiZW5kOwotCXZhci0+eXJlcyA9IHAtPnZ0b3RhbCAtIHAtPnZiZW5kOwotCi0JRFBSSU5USygyLCAieHJlcyA9ICVkLCB5cmVzIDogJWRcbiIsIHZhci0+eHJlcywgdmFyLT55cmVzKTsKLQotCXZhci0+cmlnaHRfbWFyZ2luID0gcC0+aHNzdGFydDsKLQl2YXItPmhzeW5jX2xlbiA9IHAtPmhzZW5kIC0gcC0+aHNzdGFydDsKLQl2YXItPmxlZnRfbWFyZ2luID0gcC0+aGJlbmQgLSBwLT5oc2VuZDsKLQl2YXItPmxvd2VyX21hcmdpbiA9IHAtPnZzc3RhcnQ7Ci0JdmFyLT52c3luY19sZW4gPSBwLT52c2VuZCAtIHAtPnZzc3RhcnQ7Ci0JdmFyLT51cHBlcl9tYXJnaW4gPSBwLT52YmVuZCAtIHAtPnZzZW5kOwotCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBkZXB0aDJicHAocC0+ZGVwdGgpOwotCQotCXBtM2ZiX2VuY29kZV9kZXB0aCh2YXIsIHAtPmRlcHRoKTsKLQotCWJhc2UgPSBwbTNmYl9VbnNoaWZ0YnBwKGxfZmJfaW5mbywgcC0+ZGVwdGgsIHAtPmJhc2UpOwotCi0JdmFyLT54b2Zmc2V0ID0gYmFzZSAlIHZhci0+eHJlczsKLQl2YXItPnlvZmZzZXQgPSBiYXNlIC8gdmFyLT54cmVzOwotCiAJdmFyLT5oZWlnaHQgPSB2YXItPndpZHRoID0gLTE7CiAKLQl2YXItPnBpeGNsb2NrID0gS0haMlBJQ09TKHAtPnBpeGNsb2NrKTsKLQotCWlmICgocC0+dmlkZW8gJiBQTTNWaWRlb0NvbnRyb2xfSFNZTkNfTUFTSykgPT0KLQkgICAgUE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdIKQotCQl2YXItPnN5bmMgfD0gRkJfU1lOQ19IT1JfSElHSF9BQ1Q7Ci0JaWYgKChwLT52aWRlbyAmIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19NQVNLKSA9PQotCSAgICBQTTNWaWRlb0NvbnRyb2xfVlNZTkNfQUNUSVZFX0hJR0gpCi0JCXZhci0+c3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7Ci0JaWYgKHAtPnZpZGVvICYgUE0zVmlkZW9Db250cm9sX0xJTkVfRE9VQkxFX09OKQotCQl2YXItPnZtb2RlID0gRkJfVk1PREVfRE9VQkxFOwotCi0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQgcG0zZmJfZ2V0X3Bhcih2b2lkICpwYXIsIHN0cnVjdCBmYl9pbmZvX2dlbiAqaW5mbykKLXsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvID0gKHN0cnVjdCBwbTNmYl9pbmZvICopIGluZm87Ci0KLQlEVFJBQ0U7Ci0KLQlpZiAoIWN1cnJlbnRfcGFyX3ZhbGlkW2xfZmJfaW5mby0+Ym9hcmRfbnVtXSkgewotCQlpZiAobF9mYl9pbmZvLT51c2VfY3VycmVudCkKLQkJCXBtM2ZiX3JlYWRfbW9kZShsX2ZiX2luZm8sIGxfZmJfaW5mby0+Y3VycmVudF9wYXIpOwotCQllbHNlCi0JCQltZW1jcHkobF9mYl9pbmZvLT5jdXJyZW50X3BhciwKLQkJCSAgICAgICAmKG1vZGVfYmFzZVswXS51c2VyX21vZGUpLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcG0zZmJfcGFyKSk7Ci0JCWN1cnJlbnRfcGFyX3ZhbGlkW2xfZmJfaW5mby0+Ym9hcmRfbnVtXSA9IDE7CisJaWYgKHZhci0+eHJlcyAhPSB2YXItPnhyZXNfdmlydHVhbCkgeworCQlEUFJJTlRLKCJ2aXJ0dWFsIHggcmVzb2x1dGlvbiAhPSBwaHlzaWNhbCB4IHJlc29sdXRpb24gbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQkqKChzdHJ1Y3QgcG0zZmJfcGFyICopIHBhcikgPSAqKGxfZmJfaW5mby0+Y3VycmVudF9wYXIpOwotfQogCi1zdGF0aWMgdm9pZCBwbTNmYl9zZXRfcGFyKGNvbnN0IHZvaWQgKnBhciwgc3RydWN0IGZiX2luZm9fZ2VuICppbmZvKQotewotCXN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8gPSAoc3RydWN0IHBtM2ZiX2luZm8gKikgaW5mbzsKLQotCURUUkFDRTsKLQotCSoobF9mYl9pbmZvLT5jdXJyZW50X3BhcikgPSAqKChzdHJ1Y3QgcG0zZmJfcGFyICopIHBhcik7Ci0JY3VycmVudF9wYXJfdmFsaWRbbF9mYl9pbmZvLT5ib2FyZF9udW1dID0gMTsKLQotCXBtM2ZiX3dyaXRlX21vZGUobF9mYl9pbmZvKTsKLQotI2lmZGVmIFBNM0ZCX1VTRV9BQ0NFTAotCXBtM2ZiX2luaXRfZW5naW5lKGxfZmJfaW5mbyk7Ci0jZW5kaWYgLyogUE0zRkJfVVNFX0FDQ0VMICovCi19Ci0KLXN0YXRpYyB2b2lkIHBtM2ZiX3NldF9jb2xvcihzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvLAotCQkJICAgIHVuc2lnbmVkIGNoYXIgcmVnbm8sIHVuc2lnbmVkIGNoYXIgciwKLQkJCSAgICB1bnNpZ25lZCBjaGFyIGcsIHVuc2lnbmVkIGNoYXIgYikKLXsKLQlEVFJBQ0U7Ci0KLQlQTTNfU0xPV19XUklURV9SRUcoUE0zUkRfUGFsZXR0ZVdyaXRlQWRkcmVzcywgcmVnbm8pOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNSRF9QYWxldHRlRGF0YSwgcik7Ci0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1JEX1BhbGV0dGVEYXRhLCBnKTsKLQlQTTNfU0xPV19XUklURV9SRUcoUE0zUkRfUGFsZXR0ZURhdGEsIGIpOwotfQotCi1zdGF0aWMgaW50IHBtM2ZiX2dldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgKnJlZCwgdW5zaWduZWQgKmdyZWVuLAotCQkJICAgdW5zaWduZWQgKmJsdWUsIHVuc2lnbmVkICp0cmFuc3AsCi0JCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKLXsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvID0gKHN0cnVjdCBwbTNmYl9pbmZvICopIGluZm87Ci0KLQlEVFJBQ0U7Ci0KLQlpZiAocmVnbm8gPCAyNTYpIHsKLQkJKnJlZCA9Ci0JCSAgICBsX2ZiX2luZm8tPnBhbGV0dGVbcmVnbm9dLnJlZCA8PCA4IHwgbF9mYl9pbmZvLT4KLQkJICAgIHBhbGV0dGVbcmVnbm9dLnJlZDsKLQkJKmdyZWVuID0KLQkJICAgIGxfZmJfaW5mby0+cGFsZXR0ZVtyZWdub10uZ3JlZW4gPDwgOCB8IGxfZmJfaW5mby0+Ci0JCSAgICBwYWxldHRlW3JlZ25vXS5ncmVlbjsKLQkJKmJsdWUgPQotCQkgICAgbF9mYl9pbmZvLT5wYWxldHRlW3JlZ25vXS5ibHVlIDw8IDggfCBsX2ZiX2luZm8tPgotCQkgICAgcGFsZXR0ZVtyZWdub10uYmx1ZTsKLQkJKnRyYW5zcCA9Ci0JCSAgICBsX2ZiX2luZm8tPnBhbGV0dGVbcmVnbm9dLnRyYW5zcCA8PCA4IHwgbF9mYl9pbmZvLT4KLQkJICAgIHBhbGV0dGVbcmVnbm9dLnRyYW5zcDsKKwlpZiAodmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpIHsKKwkJRFBSSU5USygidmlydHVhbCB5IHJlc29sdXRpb24gPCBwaHlzaWNhbCB5IHJlc29sdXRpb24gbm90IHBvc3NpYmxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJldHVybiAocmVnbm8gPiAyNTUpOworCisJaWYgKHZhci0+eG9mZnNldCkgeworCQlEUFJJTlRLKCJ4b2Zmc2V0IG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9JTlRFUkxBQ0VEKSB7CisJCURQUklOVEsoImludGVybGFjZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdmFyLT54cmVzID0gKHZhci0+eHJlcyArIDMxKSAmIH4zMTsgLyogY291bGQgc29tZXRpbWVzIGJlIDggKi8KKwlscGl0Y2ggPSB2YXItPnhyZXMgKiAoKHZhci0+Yml0c19wZXJfcGl4ZWwgKyA3KT4+Myk7CisKKwlpZiAodmFyLT54cmVzIDwgMjAwIHx8IHZhci0+eHJlcyA+IDIwNDgpIHsKKwkJRFBSSU5USygid2lkdGggbm90IHN1cHBvcnRlZDogJXVcbiIsIHZhci0+eHJlcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh2YXItPnlyZXMgPCAyMDAgfHwgdmFyLT55cmVzID4gNDA5NSkgeworCQlEUFJJTlRLKCJoZWlnaHQgbm90IHN1cHBvcnRlZDogJXVcbiIsIHZhci0+eXJlcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChscGl0Y2ggKiB2YXItPnlyZXNfdmlydHVhbCA+IGluZm8tPmZpeC5zbWVtX2xlbikgeworCQlEUFJJTlRLKCJubyBtZW1vcnkgZm9yIHNjcmVlbiAoJXV4JXV4JXUpXG4iLAorCQkJdmFyLT54cmVzLCB2YXItPnlyZXNfdmlydHVhbCwgdmFyLT5iaXRzX3Blcl9waXhlbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChQSUNPUzJLSFoodmFyLT5waXhjbG9jaykgPiBQTTNfTUFYX1BJWENMT0NLKSB7CisJCURQUklOVEsoInBpeGNsb2NrIHRvbyBoaWdoICglbGRLSHopXG4iLCBQSUNPUzJLSFoodmFyLT5waXhjbG9jaykpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2YXItPmFjY2VsX2ZsYWdzID0gMDsJLyogQ2FuJ3QgbW1hcCBpZiB0aGlzIGlzIG9uICovCisKKwlEUFJJTlRLKCJDaGVja2luZyBncmFwaGljcyBtb2RlIGF0ICVkeCVkIGRlcHRoICVkXG4iLAorCQl2YXItPnhyZXMsIHZhci0+eXJlcywgdmFyLT5iaXRzX3Blcl9waXhlbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0zZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgcG0zX3BhciAqcGFyID0gaW5mby0+cGFyOworCWNvbnN0IHUzMiB4cmVzID0gKGluZm8tPnZhci54cmVzICsgMzEpICYgfjMxOworCWNvbnN0IGludCBkZXB0aCA9IChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgKyA3KSAmIH43OworCisJcGFyLT5iYXNlID0gcG0zZmJfc2hpZnRfYnBwKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwKKwkJCQkJKGluZm8tPnZhci55b2Zmc2V0ICogeHJlcykKKwkJCQkJKyBpbmZvLT52YXIueG9mZnNldCk7CisJcGFyLT52aWRlbyA9IDA7CisKKwlpZiAoaW5mby0+dmFyLnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkKKwkJcGFyLT52aWRlbyB8PSBQTTNWaWRlb0NvbnRyb2xfSFNZTkNfQUNUSVZFX0hJR0g7CisJZWxzZQorCQlwYXItPnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19BQ1RJVkVfTE9XOworCisJaWYgKGluZm8tPnZhci5zeW5jICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKQorCQlwYXItPnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSDsKKwllbHNlCisJCXBhci0+dmlkZW8gfD0gUE0zVmlkZW9Db250cm9sX1ZTWU5DX0FDVElWRV9MT1c7CisKKwlpZiAoKGluZm8tPnZhci52bW9kZSAmIEZCX1ZNT0RFX01BU0spID09IEZCX1ZNT0RFX0RPVUJMRSkKKwkJcGFyLT52aWRlbyB8PSBQTTNWaWRlb0NvbnRyb2xfTElORV9ET1VCTEVfT047CisJZWxzZQorCQlwYXItPnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9MSU5FX0RPVUJMRV9PRkY7CisKKwlpZiAoaW5mby0+dmFyLmFjdGl2YXRlID09IEZCX0FDVElWQVRFX05PVykKKwkJcGFyLT52aWRlbyB8PSBQTTNWaWRlb0NvbnRyb2xfRU5BQkxFOworCWVsc2UgeworCQlwYXItPnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9ESVNBQkxFOworCQlEUFJJTlRLKCJQTTNWaWRlbyBkaXNhYmxlZFxuIik7CisJfQorCXN3aXRjaCAoZGVwdGgpIHsKKwljYXNlIDg6CisJCXBhci0+dmlkZW8gfD0gUE0zVmlkZW9Db250cm9sX1BJWEVMU0laRV84QklUOworCQlicmVhazsKKwljYXNlIDEyOgorCWNhc2UgMTU6CisJY2FzZSAxNjoKKwkJcGFyLT52aWRlbyB8PSBQTTNWaWRlb0NvbnRyb2xfUElYRUxTSVpFXzE2QklUOworCQlicmVhazsKKwljYXNlIDMyOgorCQlwYXItPnZpZGVvIHw9IFBNM1ZpZGVvQ29udHJvbF9QSVhFTFNJWkVfMzJCSVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURQUklOVEsoIlVuc3VwcG9ydGVkIGRlcHRoXG4iKTsKKwkJYnJlYWs7CisJfQorCisJaW5mby0+Zml4LnZpc3VhbCA9CisJCShkZXB0aCA9PSA4KSA/IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiA6IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKChpbmZvLT52YXIueHJlc192aXJ0dWFsICsgNykgICYgfjcpCisJCQkJCSogZGVwdGggLyA4OworCisvKglwbTNmYl9jbGVhcl9tZW1vcnkoaW5mbywgMCk7Ki8KKwlwbTNmYl9jbGVhcl9jb2xvcm1hcChwYXIsIDAsIDAsIDApOworCVBNM19XUklURV9EQUNfUkVHKHBhciwgUE0zUkRfQ3Vyc29yTW9kZSwKKwkJCSAgUE0zUkRfQ3Vyc29yTW9kZV9DVVJTT1JfRElTQUJMRSk7CisJcG0zZmJfd3JpdGVfbW9kZShpbmZvKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwbTNmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCiAJCQkgICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCiAJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvID0gKHN0cnVjdCBwbTNmYl9pbmZvICopIGluZm87CisJc3RydWN0IHBtM19wYXIgKnBhciA9IGluZm8tPnBhcjsKIAotCURUUkFDRTsKKwlpZiAocmVnbm8gPj0gMjU2KSAgLyogbm8uIG9mIGh3IHJlZ2lzdGVycyAqLworCSAgIHJldHVybiAtRUlOVkFMOwogCi0JaWYgKHJlZ25vIDwgMTYpIHsKLQkJc3dpdGNoIChsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCkgewotI2lmZGVmIEZCQ09OX0hBU19DRkI4CisJLyogZ3JheXNjYWxlIHdvcmtzIG9ubHkgcGFydGlhbGx5IHVuZGVyIGRpcmVjdGNvbG9yICovCisJaWYgKGluZm8tPnZhci5ncmF5c2NhbGUpIHsKKwkgICAvKiBncmF5c2NhbGUgPSAwLjMwKlIgKyAwLjU5KkcgKyAwLjExKkIgKi8KKwkgICByZWQgPSBncmVlbiA9IGJsdWUgPSAocmVkICogNzcgKyBncmVlbiAqIDE1MSArIGJsdWUgKiAyOCkgPj4gODsKKwl9CisKKwkvKiBEaXJlY3Rjb2xvcjoKKwkgKiAgIHZhci0+e2NvbG9yfS5vZmZzZXQgY29udGFpbnMgc3RhcnQgb2YgYml0ZmllbGQKKwkgKiAgIHZhci0+e2NvbG9yfS5sZW5ndGggY29udGFpbnMgbGVuZ3RoIG9mIGJpdGZpZWxkCisJICogICB7aGFyZHdhcmVzcGVjaWZpY30gY29udGFpbnMgd2lkdGggb2YgREFDCisJICogICBwc2V1ZG9fcGFsZXR0ZVtYXSBpcyBwcm9ncmFtbWVkIHRvIChYIDw8IHJlZC5vZmZzZXQpIHwKKwkgKgkJCQkgICAgICAoWCA8PCBncmVlbi5vZmZzZXQpIHwKKwkgKgkJCQkgICAgICAoWCA8PCBibHVlLm9mZnNldCkKKwkgKiAgIFJBTURBQ1tYXSBpcyBwcm9ncmFtbWVkIHRvIChyZWQsIGdyZWVuLCBibHVlKQorCSAqICAgY29sb3IgZGVwdGggPSBTVU0odmFyLT57Y29sb3J9Lmxlbmd0aCkKKwkgKgorCSAqIFBzZXVkb2NvbG9yOgorCSAqCXZhci0+e2NvbG9yfS5vZmZzZXQgaXMgMAorCSAqCXZhci0+e2NvbG9yfS5sZW5ndGggY29udGFpbnMgd2lkdGggb2YgREFDIG9yIHRoZSBudW1iZXIgb2YgdW5pcXVlCisJICoJCQljb2xvcnMgYXZhaWxhYmxlIChjb2xvciBkZXB0aCkKKwkgKglwc2V1ZG9fcGFsZXR0ZSBpcyBub3QgdXNlZAorCSAqCVJBTURBQ1tYXSBpcyBwcm9ncmFtbWVkIHRvIChyZWQsIGdyZWVuLCBibHVlKQorCSAqCWNvbG9yIGRlcHRoID0gdmFyLT57Y29sb3J9Lmxlbmd0aAorCSAqLworCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBwb2ludCB3aGVyZSB0aGUgY29sb3IgaXMgY29udmVydGVkIHRvIHNvbWV0aGluZyB0aGF0CisJICogaXMgYWNjZXB0YWJsZSBieSB0aGUgaGFyZHdhcmUuCisJICovCisjZGVmaW5lIENOVlRfVE9IVyh2YWwsd2lkdGgpICgoKCh2YWwpPDwod2lkdGgpKSsweDdGRkYtKHZhbCkpPj4xNikKKwlyZWQgPSBDTlZUX1RPSFcocmVkLCBpbmZvLT52YXIucmVkLmxlbmd0aCk7CisJZ3JlZW4gPSBDTlZUX1RPSFcoZ3JlZW4sIGluZm8tPnZhci5ncmVlbi5sZW5ndGgpOworCWJsdWUgPSBDTlZUX1RPSFcoYmx1ZSwgaW5mby0+dmFyLmJsdWUubGVuZ3RoKTsKKwl0cmFuc3AgPSBDTlZUX1RPSFcodHJhbnNwLCBpbmZvLT52YXIudHJhbnNwLmxlbmd0aCk7CisjdW5kZWYgQ05WVF9UT0hXCisKKwlpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfVFJVRUNPTE9SIHx8CisJaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfRElSRUNUQ09MT1IpIHsKKwkJdTMyIHY7CisKKwkJaWYgKHJlZ25vID49IDE2KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdiA9IChyZWQgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKKwkJCShncmVlbiA8PCBpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8CisJCQkoYmx1ZSA8PCBpbmZvLT52YXIuYmx1ZS5vZmZzZXQpIHwKKwkJCSh0cmFuc3AgPDwgaW5mby0+dmFyLnRyYW5zcC5vZmZzZXQpOworCisJCXN3aXRjaCAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJCWNhc2UgODoKIAkJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci0JCWNhc2UgMTI6Ci0JCQlsX2ZiX2luZm8tPmNtYXAuY21hcDEyW3JlZ25vXSA9Ci0JCQkJKCgodTMyKSByZWQgJiAweGYwMDApID4+IDQpIHwKLQkJCQkoKCh1MzIpIGdyZWVuICYgMHhmMDAwKSA+PiA4KSB8Ci0JCQkJKCgodTMyKSBibHVlICYgMHhmMDAwKSA+PiAxMik7Ci0JCQlicmVhazsKLQotCQljYXNlIDE1OgotCQkJbF9mYl9pbmZvLT5jbWFwLmNtYXAxNVtyZWdub10gPQotCQkJCSgoKHUzMikgcmVkICYgMHhmODAwKSA+PiAxKSB8Ci0JCQkJKCgodTMyKSBncmVlbiAmIDB4ZjgwMCkgPj4gNikgfAotCQkJCSgoKHUzMikgYmx1ZSAmIDB4ZjgwMCkgPj4gMTEpOwotCQkJYnJlYWs7Ci0KIAkJY2FzZSAxNjoKLQkJCWxfZmJfaW5mby0+Y21hcC5jbWFwMTZbcmVnbm9dID0KLQkJCSAgICAoKHUzMikgcmVkICYgMHhmODAwKSB8Ci0JCQkgICAgKCgodTMyKSBncmVlbiAmIDB4ZmMwMCkgPj4gNSkgfAotCQkJICAgICgoKHUzMikgYmx1ZSAmIDB4ZjgwMCkgPj4gMTEpOwotCQkJYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCMzIKKwkJY2FzZSAyNDoKIAkJY2FzZSAzMjoKLQkJCWxfZmJfaW5mby0+Y21hcC5jbWFwMzJbcmVnbm9dID0KLQkJCSAgICAoKCh1MzIpIHRyYW5zcCAmIDB4ZmYwMCkgPDwgMTYpIHwKLQkJCSAgICAoKCh1MzIpIHJlZCAmIDB4ZmYwMCkgPDwgOCkgfAotCQkJICAgICgoKHUzMikgZ3JlZW4gJiAweGZmMDApKSB8Ci0JCQkgICAgKCgodTMyKSBibHVlICYgMHhmZjAwKSA+PiA4KTsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQlEUFJJTlRLKDEsICJiYWQgZGVwdGggJXVcbiIsCi0JCQkJbF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGgpOworCQkJKCh1MzIqKShpbmZvLT5wc2V1ZG9fcGFsZXR0ZSkpW3JlZ25vXSA9IHY7CiAJCQlicmVhazsKIAkJfQorCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKHJlZ25vIDwgMjU2KSB7Ci0JCWxfZmJfaW5mby0+cGFsZXR0ZVtyZWdub10ucmVkID0gcmVkID4+IDg7Ci0JCWxfZmJfaW5mby0+cGFsZXR0ZVtyZWdub10uZ3JlZW4gPSBncmVlbiA+PiA4OwotCQlsX2ZiX2luZm8tPnBhbGV0dGVbcmVnbm9dLmJsdWUgPSBibHVlID4+IDg7Ci0JCWxfZmJfaW5mby0+cGFsZXR0ZVtyZWdub10udHJhbnNwID0gdHJhbnNwID4+IDg7Ci0JCWlmIChsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCA9PSA4KQotCQkJcG0zZmJfc2V0X2NvbG9yKGxfZmJfaW5mbywgcmVnbm8sIHJlZCA+PiA4LAotCQkJCQlncmVlbiA+PiA4LCBibHVlID4+IDgpOwotCX0KLQlyZXR1cm4gKHJlZ25vID4gMjU1KTsKKwllbHNlIGlmIChpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUikKKwkJcG0zZmJfc2V0X2NvbG9yKHBhciwgcmVnbm8sIHJlZCwgZ3JlZW4sIGJsdWUpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcG0zZmJfYmxhbmsoaW50IGJsYW5rX21vZGUsIHN0cnVjdCBmYl9pbmZvX2dlbiAqaW5mbykKK3N0YXRpYyBpbnQgcG0zZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkJIHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8gPSAoc3RydWN0IHBtM2ZiX2luZm8gKikgaW5mbzsKLQl1MzIgdmlkZW87CisJc3RydWN0IHBtM19wYXIgKnBhciA9IGluZm8tPnBhcjsKKwljb25zdCB1MzIgeHJlcyA9ICh2YXItPnhyZXMgKyAzMSkgJiB+MzE7CiAKLQlEVFJBQ0U7CisJcGFyLT5iYXNlID0gcG0zZmJfc2hpZnRfYnBwKHZhci0+Yml0c19wZXJfcGl4ZWwsCisJCQkJCSh2YXItPnlvZmZzZXQgKiB4cmVzKQorCQkJCQkrIHZhci0+eG9mZnNldCk7CisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zU2NyZWVuQmFzZSwgcGFyLT5iYXNlKTsKKwlyZXR1cm4gMDsKK30KIAotCWlmICghY3VycmVudF9wYXJfdmFsaWRbbF9mYl9pbmZvLT5ib2FyZF9udW1dKQotCQlyZXR1cm4gKDEpOwotCi0JdmlkZW8gPSBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT52aWRlbzsKK3N0YXRpYyBpbnQgcG0zZmJfYmxhbmsoaW50IGJsYW5rX21vZGUsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBwbTNfcGFyICpwYXIgPSBpbmZvLT5wYXI7CisJdTMyIHZpZGVvID0gcGFyLT52aWRlbzsKIAogCS8qCiAJICogT3h5Z2VuIFZYMSAtIGl0IGFwcGVhcnMgdGhhdCBzZXR0aW5nIFBNM1ZpZGVvQ29udHJvbCBhbmQKQEAgLTMxODEsNDU0ICs2NjMsMzQ1IEBACiAJdmlkZW8gfD0gUE0zVmlkZW9Db250cm9sX0hTWU5DX0FDVElWRV9ISUdIIHwKIAkJIFBNM1ZpZGVvQ29udHJvbF9WU1lOQ19BQ1RJVkVfSElHSDsKIAotCWlmIChibGFua19tb2RlID4gMCkgewotCQlzd2l0Y2ggKGJsYW5rX21vZGUgLSAxKSB7Ci0KLQkJY2FzZSBWRVNBX05PX0JMQU5LSU5HOgkvKiBGSVhNRSAqLwotCQkJdmlkZW8gPSB2aWRlbyAmIH4oUE0zVmlkZW9Db250cm9sX0VOQUJMRSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFZFU0FfSFNZTkNfU1VTUEVORDoKLQkJCXZpZGVvID0gdmlkZW8gJiB+KFBNM1ZpZGVvQ29udHJvbF9IU1lOQ19NQVNLIHwKLQkJCQkJICBQTTNWaWRlb0NvbnRyb2xfQkxBTktfQUNUSVZFX0xPVyk7Ci0JCQlicmVhazsKLQkJY2FzZSBWRVNBX1ZTWU5DX1NVU1BFTkQ6Ci0JCQl2aWRlbyA9IHZpZGVvICYgfihQTTNWaWRlb0NvbnRyb2xfVlNZTkNfTUFTSyB8Ci0JCQkJCSAgUE0zVmlkZW9Db250cm9sX0JMQU5LX0FDVElWRV9MT1cpOwotCQkJYnJlYWs7Ci0JCWNhc2UgVkVTQV9QT1dFUkRPV046Ci0JCQl2aWRlbyA9IHZpZGVvICYgfihQTTNWaWRlb0NvbnRyb2xfSFNZTkNfTUFTSyB8Ci0JCQkJCSAgUE0zVmlkZW9Db250cm9sX1ZTWU5DX01BU0sgfAotCQkJCQkgIFBNM1ZpZGVvQ29udHJvbF9CTEFOS19BQ1RJVkVfTE9XKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRFBSSU5USygxLCAiVW5zdXBwb3J0ZWQgYmxhbmtpbmcgJWRcbiIsCi0JCQkJYmxhbmtfbW9kZSk7Ci0JCQlyZXR1cm4gKDEpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlQTTNfU0xPV19XUklURV9SRUcoUE0zVmlkZW9Db250cm9sLCB2aWRlbyk7Ci0KLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZCBwbTNmYl9zZXRfZGlzcChjb25zdCB2b2lkICpwYXIsIHN0cnVjdCBkaXNwbGF5ICpkaXNwLAotCQkJICAgc3RydWN0IGZiX2luZm9fZ2VuICppbmZvKQotewotCXN0cnVjdCBwbTNmYl9pbmZvICpsX2ZiX2luZm8gPSAoc3RydWN0IHBtM2ZiX2luZm8gKikgaW5mbzsKLQlzdHJ1Y3QgcG0zZmJfcGFyICpwID0gKHN0cnVjdCBwbTNmYl9wYXIgKikgcGFyOwotCXUzMiBmbGFnczsKLQotCURUUkFDRTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpbmZvLT5pbmZvLnNjcmVlbl9iYXNlID0gbF9mYl9pbmZvLT52X2ZiOwotCXN3aXRjaCAocC0+ZGVwdGgpIHsKLSNpZmRlZiBGQkNPTl9IQVNfQ0ZCOAotCWNhc2UgODoKLSNpZmRlZiBQTTNGQl9VU0VfQUNDRUwKLQkJaWYgKCEobm9hY2NlbFtsX2ZiX2luZm8tPmJvYXJkX251bV0pKQotCQkJZGlzcC0+ZGlzcHN3ID0gJnBtM2ZiX2NmYjg7Ci0JCWVsc2UKLSNlbmRpZiAvKiBQTTNGQl9VU0VfQUNDRUwgKi8KLQkJCWRpc3AtPmRpc3BzdyA9ICZmYmNvbl9jZmI4OworCXN3aXRjaCAoYmxhbmtfbW9kZSkgeworCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKKwkJdmlkZW8gPSB2aWRlbyB8IFBNM1ZpZGVvQ29udHJvbF9FTkFCTEU7CiAJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjE2Ci0JY2FzZSAxMjoKLSNpZmRlZiBQTTNGQl9VU0VfQUNDRUwKLQkJaWYgKCEobm9hY2NlbFtsX2ZiX2luZm8tPmJvYXJkX251bV0pKQotCQkJZGlzcC0+ZGlzcHN3ID0gJnBtM2ZiX2NmYjE2OwotCQllbHNlCi0jZW5kaWYgLyogUE0zRkJfVVNFX0FDQ0VMICovCi0JCQlkaXNwLT5kaXNwc3cgPSAmZmJjb25fY2ZiMTY7Ci0JCWRpc3AtPmRpc3Bzd19kYXRhID0gbF9mYl9pbmZvLT5jbWFwLmNtYXAxMjsKKwljYXNlIEZCX0JMQU5LX05PUk1BTDoJLyogRklYTUUgKi8KKwkJdmlkZW8gPSB2aWRlbyAmIH4oUE0zVmlkZW9Db250cm9sX0VOQUJMRSk7CiAJCWJyZWFrOwotCWNhc2UgMTU6Ci0jaWZkZWYgUE0zRkJfVVNFX0FDQ0VMCi0JCWlmICghKG5vYWNjZWxbbF9mYl9pbmZvLT5ib2FyZF9udW1dKSkKLQkJCWRpc3AtPmRpc3BzdyA9ICZwbTNmYl9jZmIxNjsKLQkJZWxzZQotI2VuZGlmIC8qIFBNM0ZCX1VTRV9BQ0NFTCAqLwotCQkJZGlzcC0+ZGlzcHN3ID0gJmZiY29uX2NmYjE2OwotCQlkaXNwLT5kaXNwc3dfZGF0YSA9IGxfZmJfaW5mby0+Y21hcC5jbWFwMTU7CisJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgorCQl2aWRlbyA9IHZpZGVvICYgfihQTTNWaWRlb0NvbnRyb2xfSFNZTkNfTUFTSyB8CisJCQkJICBQTTNWaWRlb0NvbnRyb2xfQkxBTktfQUNUSVZFX0xPVyk7CiAJCWJyZWFrOwotCWNhc2UgMTY6Ci0jaWZkZWYgUE0zRkJfVVNFX0FDQ0VMCi0JCWlmICghKG5vYWNjZWxbbF9mYl9pbmZvLT5ib2FyZF9udW1dKSkKLQkJCWRpc3AtPmRpc3BzdyA9ICZwbTNmYl9jZmIxNjsKLQkJZWxzZQotI2VuZGlmIC8qIFBNM0ZCX1VTRV9BQ0NFTCAqLwotCQkJZGlzcC0+ZGlzcHN3ID0gJmZiY29uX2NmYjE2OwotCQlkaXNwLT5kaXNwc3dfZGF0YSA9IGxfZmJfaW5mby0+Y21hcC5jbWFwMTY7CisJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgorCQl2aWRlbyA9IHZpZGVvICYgfihQTTNWaWRlb0NvbnRyb2xfVlNZTkNfTUFTSyB8CisJCQkJICBQTTNWaWRlb0NvbnRyb2xfQkxBTktfQUNUSVZFX0xPVyk7CiAJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRkJDT05fSEFTX0NGQjMyCi0JY2FzZSAzMjoKLSNpZmRlZiBQTTNGQl9VU0VfQUNDRUwKLQkJaWYgKCEobm9hY2NlbFtsX2ZiX2luZm8tPmJvYXJkX251bV0pKQotCQkJZGlzcC0+ZGlzcHN3ID0gJnBtM2ZiX2NmYjMyOwotCQllbHNlCi0jZW5kaWYgLyogUE0zRkJfVVNFX0FDQ0VMICovCi0JCQlkaXNwLT5kaXNwc3cgPSAmZmJjb25fY2ZiMzI7Ci0JCWRpc3AtPmRpc3Bzd19kYXRhID0gbF9mYl9pbmZvLT5jbWFwLmNtYXAzMjsKKwljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoKKwkJdmlkZW8gPSB2aWRlbyAmIH4oUE0zVmlkZW9Db250cm9sX0hTWU5DX01BU0sgfAorCQkJCSAgUE0zVmlkZW9Db250cm9sX1ZTWU5DX01BU0sgfAorCQkJCSAgUE0zVmlkZW9Db250cm9sX0JMQU5LX0FDVElWRV9MT1cpOwogCQlicmVhazsKLSNlbmRpZiAvKiBGQkNPTl9IQVNfQ0ZCMzIgKi8KIAlkZWZhdWx0OgotCQlkaXNwLT5kaXNwc3cgPSAmZmJjb25fZHVtbXk7Ci0JCURQUklOVEsoMSwgIkludmFsaWQgZGVwdGgsIHVzaW5nIGZiY29uX2R1bW15XG4iKTsKLQkJYnJlYWs7Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyogKi8KLXN0YXRpYyB2b2lkIHBtM2ZiX2RldGVjdCh2b2lkKQotewotCXN0cnVjdCBwY2lfZGV2ICpkZXZfYXJyYXlbUE0zX01BWF9CT0FSRF07Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0Jc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyA9ICYoZmJfaW5mb1swXSk7Ci0JdW5zaWduZWQgbG9uZyBpLCBqLCBkb25lOwotCi0JRFRSQUNFOwotCi0JZm9yIChpID0gMDsgaSA8IFBNM19NQVhfQk9BUkQ7IGkrKykgewotCQlkZXZfYXJyYXlbaV0gPSBOVUxMOwotCQlmYl9pbmZvW2ldLmRldiA9IE5VTEw7CisJCURQUklOVEsoIlVuc3VwcG9ydGVkIGJsYW5raW5nICVkXG4iLCBibGFua19tb2RlKTsKKwkJcmV0dXJuIDE7CiAJfQogCi0JZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF8zRExBQlMsCi0JCQkgICAgUENJX0RFVklDRV9JRF8zRExBQlNfUEVSTUVESUEzLCBkZXYpOworCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsUE0zVmlkZW9Db250cm9sLCB2aWRlbyk7CiAKLQlmb3IgKGkgPSAwOyAoKGkgPCBQTTNfTUFYX0JPQVJEKSAmJiBkZXYpOyBpKyspIHsKLQkJZGV2X2FycmF5W2ldID0gZGV2OwotCQlkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEXzNETEFCUywKLQkJCQkgICAgUENJX0RFVklDRV9JRF8zRExBQlNfUEVSTUVESUEzLCBkZXYpOwotCX0KLQotCWlmIChkZXYpIHsJCS8qIG1vcmUgdGhhbiBQTTNfTUFYX0JPQVJEICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBtM2ZiOiBXYXJuaW5nOiBtb3JlIHRoYW4gJWQgYm9hcmRzIGZvdW5kXG4iLAotCQkgICAgICAgUE0zX01BWF9CT0FSRCk7Ci0JfQotCi0JaWYgKCFkZXZfYXJyYXlbMF0pIHsJLyogbm90IGEgc2luZ2xlIGJvYXJkLCBhYm9ydCAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogYWxsb2NhdGUgdXNlci1kZWZpbmVkIGJvYXJkcyAqLwotCWZvciAoaSA9IDA7IGkgPCBQTTNfTUFYX0JPQVJEOyBpKyspIHsKLQkJaWYgKChidXNbaV0gPj0gMCkgJiYgKHNsb3RbaV0gPj0gMCkgJiYgKGZ1bmNbaV0gPj0gMCkpIHsKLQkJCWZvciAoaiA9IDA7IGogPCBQTTNfTUFYX0JPQVJEOyBqKyspIHsKLQkJCQlpZiAoKGRldl9hcnJheVtqXSAhPSBOVUxMKSAmJgotCQkJCSAgICAoZGV2X2FycmF5W2pdLT5idXMtPm51bWJlciA9PSBidXNbaV0pCi0JCQkJICAgICYmIChQQ0lfU0xPVChkZXZfYXJyYXlbal0tPmRldmZuKSA9PQotCQkJCQlzbG90W2ldKQotCQkJCSAgICAmJiAoUENJX0ZVTkMoZGV2X2FycmF5W2pdLT5kZXZmbikgPT0KLQkJCQkJZnVuY1tpXSkpIHsKLQkJCQkJZmJfaW5mb1tpXS5kZXYgPSBkZXZfYXJyYXlbal07Ci0JCQkJCWRldl9hcnJheVtqXSA9IE5VTEw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qIGFsbG9jYXRlIHJlbWFpbmluZyBib2FyZHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgUE0zX01BWF9CT0FSRDsgaSsrKSB7Ci0JCWlmIChmYl9pbmZvW2ldLmRldiA9PSBOVUxMKSB7Ci0JCQlkb25lID0gMDsKLQkJCWZvciAoaiA9IDA7ICgoaiA8IFBNM19NQVhfQk9BUkQpICYmICghZG9uZSkpOyBqKyspIHsKLQkJCQlpZiAoZGV2X2FycmF5W2pdICE9IE5VTEwpIHsKLQkJCQkJZmJfaW5mb1tpXS5kZXYgPSBkZXZfYXJyYXlbal07Ci0JCQkJCWRldl9hcnJheVtqXSA9IE5VTEw7Ci0JCQkJCWRvbmUgPSAxOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qIGF0IHRoYXQgcG9pbnQsIGFsbCBQQ0kgUGVybWVkaWEzIGFyZSBkZXRlY3RlZCBhbmQgYWxsb2NhdGVkICovCi0JLyogbm93LCBpbml0aWFsaXplLi4uIG9yIG5vdCAqLwotCWZvciAoaSA9IDA7IGkgPCBQTTNfTUFYX0JPQVJEOyBpKyspIHsKLQkJbF9mYl9pbmZvID0gJihmYl9pbmZvW2ldKTsKLQkJaWYgKGxfZmJfaW5mby0+ZGV2ICYmICFkaXNhYmxlW2ldKSB7CS8qIFBDSSBkZXZpY2Ugd2FzIGZvdW5kIGFuZCBub3QgZGlzYWJsZWQgYnkgdXNlciAqLwotCQkJRFBSSU5USygyLAotCQkJCSJmb3VuZCBAJWx4IFZlbmRvciAlbHggRGV2aWNlICVseCA7IGJhc2UgQCA6ICVseCAtICVseCAtICVseCAtICVseCAtICVseCAtICVseCwgaXJxICVsZFxuIiwKLQkJCQkodW5zaWduZWQgbG9uZykgbF9mYl9pbmZvLT5kZXYsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIGxfZmJfaW5mby0+ZGV2LT52ZW5kb3IsCi0JCQkJKHVuc2lnbmVkIGxvbmcpIGxfZmJfaW5mby0+ZGV2LT5kZXZpY2UsCi0JCQkJKHVuc2lnbmVkIGxvbmcpCi0JCQkJcGNpX3Jlc291cmNlX3N0YXJ0KGxfZmJfaW5mby0+ZGV2LCAwKSwKLQkJCQkodW5zaWduZWQgbG9uZykKLQkJCQlwY2lfcmVzb3VyY2Vfc3RhcnQobF9mYl9pbmZvLT5kZXYsIDEpLAotCQkJCSh1bnNpZ25lZCBsb25nKQotCQkJCXBjaV9yZXNvdXJjZV9zdGFydChsX2ZiX2luZm8tPmRldiwgMiksCi0JCQkJKHVuc2lnbmVkIGxvbmcpCi0JCQkJcGNpX3Jlc291cmNlX3N0YXJ0KGxfZmJfaW5mby0+ZGV2LCAzKSwKLQkJCQkodW5zaWduZWQgbG9uZykKLQkJCQlwY2lfcmVzb3VyY2Vfc3RhcnQobF9mYl9pbmZvLT5kZXYsIDQpLAotCQkJCSh1bnNpZ25lZCBsb25nKQotCQkJCXBjaV9yZXNvdXJjZV9zdGFydChsX2ZiX2luZm8tPmRldiwgNSksCi0JCQkJKHVuc2lnbmVkIGxvbmcpIGxfZmJfaW5mby0+ZGV2LT5pcnEpOwotCi0JCQlsX2ZiX2luZm8tPnBJT0Jhc2UgPQotCQkJICAgICh1bnNpZ25lZCBjaGFyICopCi0JCQkgICAgcGNpX3Jlc291cmNlX3N0YXJ0KGxfZmJfaW5mby0+ZGV2LCAwKTsKLSNpZmRlZiBfX0JJR19FTkRJQU4KLQkJCWxfZmJfaW5mby0+cElPQmFzZSArPSBQTTNfUkVHU19TSVpFOwotI2VuZGlmCi0JCQlsX2ZiX2luZm8tPnZJT0Jhc2UgPSAodW5zaWduZWQgY2hhciAqKSAtMTsKLQkJCWxfZmJfaW5mby0+cF9mYiA9Ci0JCQkgICAgKHVuc2lnbmVkIGNoYXIgKikKLQkJCSAgICBwY2lfcmVzb3VyY2Vfc3RhcnQobF9mYl9pbmZvLT5kZXYsIDEpOwotCQkJbF9mYl9pbmZvLT52X2ZiID0gKHVuc2lnbmVkIGNoYXIgKikgLTE7Ci0KLQkJCQlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbgotCQkJICAgICgodW5zaWduZWQgbG9uZylsX2ZiX2luZm8tPnBfZmIsIDY0ICogMTAyNCAqIDEwMjQsIC8qIHJlcXVlc3QgZnVsbCBhcGVydHVyZSBzaXplICovCi0JCQkgICAgICJwbTNmYiIpKSB7Ci0JCQkJcHJpbnRrCi0JCQkJICAgIChLRVJOX0VSUiAicG0zZmI6IEVycm9yOiBjb3VsZG4ndCByZXF1ZXN0IGZyYW1lYnVmZmVyIG1lbW9yeSwgYm9hcmQgIyVsZFxuIiwKLQkJCQkgICAgIGxfZmJfaW5mby0+Ym9hcmRfbnVtKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uCi0JCQkgICAgKCh1bnNpZ25lZCBsb25nKWxfZmJfaW5mby0+cElPQmFzZSwgUE0zX1JFR1NfU0laRSwKLQkJCSAgICAgInBtM2ZiIEkvTyByZWdzIikpIHsKLQkJCQlwcmludGsKLQkJCQkgICAgKEtFUk5fRVJSICJwbTNmYjogRXJyb3I6IGNvdWxkbid0IHJlcXVlc3QgSU9iYXNlIG1lbW9yeSwgYm9hcmQgIyVsZFxuIiwKLQkJCQkgICAgIGxfZmJfaW5mby0+Ym9hcmRfbnVtKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmb3JjZXNpemVbbF9mYl9pbmZvLT5ib2FyZF9udW1dKQotCQkJCWxfZmJfaW5mby0+ZmJfc2l6ZSA9IGZvcmNlc2l6ZVtsX2ZiX2luZm8tPmJvYXJkX251bV07Ci0KLQkJCWxfZmJfaW5mby0+ZmJfc2l6ZSA9Ci0JCQkgICAgcG0zZmJfc2l6ZV9tZW1vcnkobF9mYl9pbmZvKTsKLQkJCQlpZiAobF9mYl9pbmZvLT5mYl9zaXplKSB7Ci0JCQkJKHZvaWQpIHBjaV9lbmFibGVfZGV2aWNlKGxfZmJfaW5mby0+ZGV2KTsKLQkJCQlwbTNmYl9jb21tb25faW5pdChsX2ZiX2luZm8pOwotCQkJfSBlbHNlCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJwbTNmYjogbWVtb3J5IHByb2JsZW0sIG5vdCBlbmFibGluZyBib2FyZCAjJWxkXG4iLCBsX2ZiX2luZm8tPmJvYXJkX251bSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgcG0zZmJfcGFuX2Rpc3BsYXkoY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCi0JCQkgICAgIHN0cnVjdCBmYl9pbmZvX2dlbiAqaW5mbykKLXsKLQlzdHJ1Y3QgcG0zZmJfaW5mbyAqbF9mYl9pbmZvID0gKHN0cnVjdCBwbTNmYl9pbmZvICopIGluZm87Ci0KLQlEVFJBQ0U7Ci0KLQlpZiAoIWN1cnJlbnRfcGFyX3ZhbGlkW2xfZmJfaW5mby0+Ym9hcmRfbnVtXSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5iYXNlID0JLyogaW4gMTI4IGJpdHMgY2h1bmsgLSBpLmUuIEFGVEVSIFNoaWZ0YnBwICovCi0JICAgIHBtM2ZiX1NoaWZ0YnBwKGxfZmJfaW5mbywKLQkJCSAgIGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoLAotCQkJICAgKHZhci0+eW9mZnNldCAqIGxfZmJfaW5mby0+Y3VycmVudF9wYXItPndpZHRoKSArCi0JCQkgICB2YXItPnhvZmZzZXQpOwotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNTY3JlZW5CYXNlLCBsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5iYXNlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwbTNmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQorCS8qCisJICogIEZyYW1lIGJ1ZmZlciBvcGVyYXRpb25zCisJICovCisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIHBtM2ZiX29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZiX2NoZWNrX3Zhcgk9IHBtM2ZiX2NoZWNrX3ZhciwKKwkuZmJfc2V0X3Bhcgk9IHBtM2ZiX3NldF9wYXIsCisJLmZiX3NldGNvbHJlZwk9IHBtM2ZiX3NldGNvbHJlZywKKwkuZmJfcGFuX2Rpc3BsYXkJPSBwbTNmYl9wYW5fZGlzcGxheSwKKwkuZmJfZmlsbHJlY3QJPSBjZmJfZmlsbHJlY3QsCQkvKiBOZWVkZWQgISEhICovCisJLmZiX2NvcHlhcmVhCT0gY2ZiX2NvcHlhcmVhLAkJLyogTmVlZGVkICEhISAqLworCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAkvKiBOZWVkZWQgISEhICovCisJLmZiX2JsYW5rCT0gcG0zZmJfYmxhbmssCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKgorCSAqICBJbml0aWFsaXphdGlvbgorCSAqLworCisvKiBtbWlvIHJlZ2lzdGVyIGFyZSBhbHJlYWR5IG1hcHBlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICovCisvKiB0aGUgcG0zZmJfZml4LnNtZW1fc3RhcnQgaXMgYWxzbyBzZXQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBtM2ZiX3NpemVfbWVtb3J5KHN0cnVjdCBwbTNfcGFyICpwYXIpCiB7Ci0Jc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbyA9IChzdHJ1Y3QgcG0zZmJfaW5mbyAqKSBpbmZvOwotCXUzMiBjbSwgaTsKLSNpZmRlZiBQTTNGQl9NQVNURVJfREVCVUcKLQljaGFyIGNjWzNdOwotI2VuZGlmIC8qIFBNM0ZCX01BU1RFUl9ERUJVRyAqLworCXVuc2lnbmVkIGxvbmcJbWVtc2l6ZSA9IDAsIHRlbXBCeXBhc3MsIGksIHRlbXAxLCB0ZW1wMjsKKwl1bnNpZ25lZCBjaGFyCV9faW9tZW0gKnNjcmVlbl9tZW07CiAKLQlzd2l0Y2goY21kKQorCXBtM2ZiX2ZpeC5zbWVtX2xlbiA9IDY0ICogMTAyNCAqIDEwMjQ7IC8qIHJlcXVlc3QgZnVsbCBhcGVydHVyZSBzaXplICovCisJLyogTGluZWFyIGZyYW1lIGJ1ZmZlciAtIHJlcXVlc3QgcmVnaW9uIGFuZCBtYXAgaXQuICovCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocG0zZmJfZml4LnNtZW1fc3RhcnQsIHBtM2ZiX2ZpeC5zbWVtX2xlbiwKKwkJCQkgInBtM2ZiIHNtZW0iKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwbTNmYjogQ2FuJ3QgcmVzZXJ2ZSBzbWVtLlxuIik7CisJCXJldHVybiAwOworCX0KKwlzY3JlZW5fbWVtID0KKwkJaW9yZW1hcF9ub2NhY2hlKHBtM2ZiX2ZpeC5zbWVtX3N0YXJ0LCBwbTNmYl9maXguc21lbV9sZW4pOworCWlmICghc2NyZWVuX21lbSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwbTNmYjogQ2FuJ3QgaW9yZW1hcCBzbWVtIGFyZWEuXG4iKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHBtM2ZiX2ZpeC5zbWVtX3N0YXJ0LCBwbTNmYl9maXguc21lbV9sZW4pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUT0RPOiBjYXJkLXNwZWNpZmljIHN0dWZmLCAqYmVmb3JlKiBhY2Nlc3NpbmcgKmFueSogRkIgbWVtb3J5ICovCisJLyogRm9yIEFwcGlhbiBKZXJvbmltbyAyMDAwIGJvYXJkIHNlY29uZCBoZWFkICovCisKKwl0ZW1wQnlwYXNzID0gUE0zX1JFQURfUkVHKHBhciwgUE0zTWVtQnlwYXNzV3JpdGVNYXNrKTsKKworCURQUklOVEsoIlBNM01lbUJ5cGFzc1dyaXRlTWFzayB3YXM6IDB4JTA4bHhcbiIsIHRlbXBCeXBhc3MpOworCisJUE0zX1NMT1dfV1JJVEVfUkVHKHBhciwgUE0zTWVtQnlwYXNzV3JpdGVNYXNrLCAweEZGRkZGRkZGKTsKKworCS8qIHBtMyBzcGxpdCB1cCBtZW1vcnksIHJlcGxpY2F0ZXMsIGFuZCBkbyBhIGxvdCBvZiBuYXN0eSBzdHVmZiBJTUhPIDstKSAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWZiX3dyaXRlbChpICogMHgwMDM0NTY3OCwKKwkJCSAgKHNjcmVlbl9tZW0gKyAoaSAqIDEwNDg1NzYpKSk7CisJCW1iKCk7CisJCXRlbXAxID0gZmJfcmVhZGwoKHNjcmVlbl9tZW0gKyAoaSAqIDEwNDg1NzYpKSk7CisKKwkJLyogTGV0J3MgY2hlY2sgZm9yIHdyYXBvdmVyLCB3cml0ZSB3aWxsIGZhaWwgYXQgMTZNQiBib3VuZGFyeSAqLworCQlpZiAodGVtcDEgPT0gKGkgKiAweDAwMzQ1Njc4KSkKKwkJCW1lbXNpemUgPSBpOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlEUFJJTlRLKCJGaXJzdCBkZXRlY3QgcGFzcyBhbHJlYWR5IGdvdCAlbGQgTUJcbiIsIG1lbXNpemUgKyAxKTsKKworCWlmIChtZW1zaXplICsgMSA9PSBpKSB7CisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQkvKiBDbGVhciBmaXJzdCAzMk1CIDsgMCBpcyAwLCBubyBuZWVkIHRvIGJ5dGVzd2FwICovCisJCQl3cml0ZWwoMHgwMDAwMDAwLAorCQkJICAgICAgIChzY3JlZW5fbWVtICsgKGkgKiAxMDQ4NTc2KSkpOworCQkJbWIoKTsKKwkJfQorCisJCWZvciAoaSA9IDMyOyBpIDwgNjQ7IGkrKykgeworCQkJZmJfd3JpdGVsKGkgKiAweDAwMzQ1Njc4LAorCQkJCSAgKHNjcmVlbl9tZW0gKyAoaSAqIDEwNDg1NzYpKSk7CisJCQltYigpOworCQkJdGVtcDEgPQorCQkJICAgIGZiX3JlYWRsKChzY3JlZW5fbWVtICsgKGkgKiAxMDQ4NTc2KSkpOworCQkJdGVtcDIgPQorCQkJICAgIGZiX3JlYWRsKChzY3JlZW5fbWVtICsgKChpIC0gMzIpICogMTA0ODU3NikpKTsKKwkJCS8qIGRpZmZlcmVudCB2YWx1ZSwgZGlmZmVyZW50IFJBTS4uLiAqLworCQkJaWYgKCh0ZW1wMSA9PSAoaSAqIDB4MDAzNDU2NzgpKSAmJiAodGVtcDIgPT0gMCkpCisJCQkJbWVtc2l6ZSA9IGk7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKwl9CisJRFBSSU5USygiU2Vjb25kIGRldGVjdCBwYXNzIGdvdCAlbGQgTUJcbiIsIG1lbXNpemUgKyAxKTsKKworCVBNM19TTE9XX1dSSVRFX1JFRyhwYXIsIFBNM01lbUJ5cGFzc1dyaXRlTWFzaywgdGVtcEJ5cGFzcyk7CisKKwlpb3VubWFwKHNjcmVlbl9tZW0pOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwbTNmYl9maXguc21lbV9zdGFydCwgcG0zZmJfZml4LnNtZW1fbGVuKTsKKwltZW1zaXplID0gMTA0ODU3NiAqIChtZW1zaXplICsgMSk7CisKKwlEUFJJTlRLKCJSZXR1cm5pbmcgMHglMDhseCBieXRlc1xuIiwgbWVtc2l6ZSk7CisKKwlyZXR1cm4gbWVtc2l6ZTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcG0zZmJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IHBtM19wYXIgKnBhcjsKKwlzdHJ1Y3QgZGV2aWNlKiBkZXZpY2UgPSAmZGV2LT5kZXY7IC8qIGZvciBwY2kgZHJpdmVycyAqLworCWludCBlcnIsIHJldHZhbCA9IC1FTlhJTzsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwbTNmYjogQ2FuJ3QgZW5hYmxlIFBDSSBkZXY6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwkvKgorCSAqIER5bmFtaWNhbGx5IGFsbG9jYXRlIGluZm8gYW5kIHBhcgorCSAqLworCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IHBtM19wYXIpLCBkZXZpY2UpOworCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwYXIgPSBpbmZvLT5wYXI7CisKKwkvKgorCSAqIEhlcmUgd2Ugc2V0IHRoZSBzY3JlZW5fYmFzZSB0byB0aGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcworCSAqIGZvciB0aGUgZnJhbWVidWZmZXIuCisJICovCisJcG0zZmJfZml4Lm1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCAwKTsKKwlwbTNmYl9maXgubW1pb19sZW4gPSBQTTNfUkVHU19TSVpFOworCisJLyogUmVnaXN0ZXJzIC0gcmVxdWVzdCByZWdpb24gYW5kIG1hcCBpdC4gKi8KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihwbTNmYl9maXgubW1pb19zdGFydCwgcG0zZmJfZml4Lm1taW9fbGVuLAorCQkJCSAicG0zZmIgcmVnYmFzZSIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBtM2ZiOiBDYW4ndCByZXNlcnZlIHJlZ2Jhc2UuXG4iKTsKKwkJZ290byBlcnJfZXhpdF9uZWl0aGVyOworCX0KKwlwYXItPnZfcmVncyA9CisJCWlvcmVtYXBfbm9jYWNoZShwbTNmYl9maXgubW1pb19zdGFydCwgcG0zZmJfZml4Lm1taW9fbGVuKTsKKwlpZiAoIXBhci0+dl9yZWdzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBtM2ZiOiBDYW4ndCByZW1hcCAlcyByZWdpc3RlciBhcmVhLlxuIiwKKwkJCXBtM2ZiX2ZpeC5pZCk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwbTNmYl9maXgubW1pb19zdGFydCwgcG0zZmJfZml4Lm1taW9fbGVuKTsKKwkJZ290byBlcnJfZXhpdF9uZWl0aGVyOworCX0KKworI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQorCXBtM2ZiX2ZpeC5tbWlvX3N0YXJ0ICs9IFBNM19SRUdTX1NJWkU7CisJRFBSSU5USygiQWRqdXN0aW5nIHJlZ2lzdGVyIGJhc2UgZm9yIGJpZy1lbmRpYW4uXG4iKTsKKyNlbmRpZgorCS8qIExpbmVhciBmcmFtZSBidWZmZXIgLSByZXF1ZXN0IHJlZ2lvbiBhbmQgbWFwIGl0LiAqLworCXBtM2ZiX2ZpeC5zbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMSk7CisJcG0zZmJfZml4LnNtZW1fbGVuID0gcG0zZmJfc2l6ZV9tZW1vcnkocGFyKTsKKwlpZiAoIXBtM2ZiX2ZpeC5zbWVtX2xlbikKIAl7Ci0jaWZkZWYgUE0zRkJfTUFTVEVSX0RFQlVHCi0JY2FzZSBQTTNGQklPX0NMRUFSTUVNT1JZOgotCQlpZiAoY29weV9mcm9tX3VzZXIoJmNtLCAodm9pZCAqKWFyZywgc2l6ZW9mKHUzMikpKQotCQkJcmV0dXJuKC1FRkFVTFQpOwotCQlwbTNmYl9jbGVhcl9tZW1vcnkobF9mYl9pbmZvLCBjbSk7Ci0JCXJldHVybigwKTsKLQkJYnJlYWs7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInBtM2ZiOiBDYW4ndCBmaW5kIG1lbW9yeSBvbiBib2FyZC5cbiIpOworCQlnb3RvIGVycl9leGl0X21taW87CisJfQorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBtM2ZiX2ZpeC5zbWVtX3N0YXJ0LCBwbTNmYl9maXguc21lbV9sZW4sCisJCQkJICJwbTNmYiBzbWVtIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicG0zZmI6IENhbid0IHJlc2VydmUgc21lbS5cbiIpOworCQlnb3RvIGVycl9leGl0X21taW87CisJfQorCWluZm8tPnNjcmVlbl9iYXNlID0KKwkJaW9yZW1hcF9ub2NhY2hlKHBtM2ZiX2ZpeC5zbWVtX3N0YXJ0LCBwbTNmYl9maXguc21lbV9sZW4pOworCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicG0zZmI6IENhbid0IGlvcmVtYXAgc21lbSBhcmVhLlxuIik7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwbTNmYl9maXguc21lbV9zdGFydCwgcG0zZmJfZml4LnNtZW1fbGVuKTsKKwkJZ290byBlcnJfZXhpdF9tbWlvOworCX0KKwlpbmZvLT5zY3JlZW5fc2l6ZSA9IHBtM2ZiX2ZpeC5zbWVtX2xlbjsKIAotCWNhc2UgUE0zRkJJT19DTEVBUkNNQVA6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihjYywgKHZvaWQqKWFyZywgMyAqIHNpemVvZihjaGFyKSkpCi0JCQlyZXR1cm4oLUVGQVVMVCk7Ci0JCXBtM2ZiX2NsZWFyX2NvbG9ybWFwKGxfZmJfaW5mbywgY2NbMF0sIGNjWzFdLCBjY1syXSk7Ci0JCXJldHVybigwKTsKLQkJYnJlYWs7Ci0jZW5kaWYgLyogUE0zRkJfTUFTVEVSX0RFQlVHICovCisJaW5mby0+ZmJvcHMgPSAmcG0zZmJfb3BzOwogCi0JY2FzZSBQTTNGQklPX1JFU0VUQ0hJUDoKLQkJY20gPSAxOwotCQlQTTNfU0xPV19XUklURV9SRUcoUE0zUmVzZXRTdGF0dXMsIDEpOwotCQlmb3IgKGkgPSAwIDsgKGkgPCAxMDAwMCkgJiYgY20gOyBpKyspCi0JCXsKLQkJCVBNM19ERUxBWSgxMCk7Ci0JCQljbSA9IFBNM19SRUFEX1JFRyhQTTNSZXNldFN0YXR1cyk7Ci0JCX0KLQkJaWYgKGNtKQotCQl7Ci0JCQlwcmludGsoS0VSTl9FUlIgInBtM2ZiOiBjaGlwIHJlc2V0IGZhaWxlZCB3aXRoIHN0YXR1cyAweCV4XG4iLCBjbSk7Ci0JCQlyZXR1cm4oLUVJTyk7Ci0JCX0KLQkJLyogZmlyc3QgdGhpbmcgZmlyc3QsIHJlbG9hZCBtZW1vcnkgdGltaW5ncyAqLwotCQlwbTNmYl93cml0ZV9tZW1vcnlfdGltaW5ncyhsX2ZiX2luZm8pOwotI2lmZGVmIFBNM0ZCX1VTRV9BQ0NFTAotCQlwbTNmYl9pbml0X2VuZ2luZShsX2ZiX2luZm8pOwotI2VuZGlmIC8qIFBNM0ZCX1VTRV9BQ0NFTCAqLwotCQlwbTNmYl93cml0ZV9tb2RlKGxfZmJfaW5mbyk7Ci0JCXJldHVybigwKTsKLQkJYnJlYWs7CisJcGFyLT52aWRlbyA9IFBNM19SRUFEX1JFRyhwYXIsIFBNM1ZpZGVvQ29udHJvbCk7CiAKLQlkZWZhdWx0OgotCQlEUFJJTlRLKDIsICJ1bmtub3duIGlvY3RsOiAlZCAoJXgpXG4iLCBjbWQsIGNtZCk7Ci0JCXJldHVybigtRUlOVkFMKTsKKwlpbmZvLT5maXggPSBwbTNmYl9maXg7CisJaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwYXItPnBhbGV0dGU7CisJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVDsvKiB8IEZCSU5GT19IV0FDQ0VMX1lQQU47Ki8KKworCS8qCisJICogVGhpcyBzaG91bGQgZ2l2ZSBhIHJlYXNvbmFibGUgZGVmYXVsdCB2aWRlbyBtb2RlLiBUaGUgZm9sbG93aW5nIGlzCisJICogZG9uZSB3aGVuIHdlIGNhbiBzZXQgYSB2aWRlbyBtb2RlLgorCSAqLworCWlmICghbW9kZV9vcHRpb24pCisJCW1vZGVfb3B0aW9uID0gIjY0MHg0ODBANjAiOworCisJcmV0dmFsID0gZmJfZmluZF9tb2RlKCZpbmZvLT52YXIsIGluZm8sIG1vZGVfb3B0aW9uLCBOVUxMLCAwLCBOVUxMLCA4KTsKKworCWlmICghcmV0dmFsIHx8IHJldHZhbCA9PSA0KSB7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2V4aXRfYm90aDsKKwl9CisKKwkvKiBUaGlzIGhhcyB0byBiZWVuIGRvbmUgISEhICovCisJaWYgKGZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCkgPCAwKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2V4aXRfYm90aDsKKwl9CisKKwkvKgorCSAqIEZvciBkcml2ZXJzIHRoYXQgY2FuLi4uCisJICovCisJcG0zZmJfY2hlY2tfdmFyKCZpbmZvLT52YXIsIGluZm8pOworCisJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycl9leGl0X2FsbDsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZVxuIiwgaW5mby0+bm9kZSwKKwkgICBpbmZvLT5maXguaWQpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIGluZm8pOyAvKiBvciBkZXZfc2V0X2RydmRhdGEoZGV2aWNlLCBpbmZvKSAqLworCXJldHVybiAwOworCisgZXJyX2V4aXRfYWxsOgorCWZiX2RlYWxsb2NfY21hcCgmaW5mby0+Y21hcCk7CisgZXJyX2V4aXRfYm90aDoKKwlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocG0zZmJfZml4LnNtZW1fc3RhcnQsIHBtM2ZiX2ZpeC5zbWVtX2xlbik7CisgZXJyX2V4aXRfbW1pbzoKKwlpb3VubWFwKHBhci0+dl9yZWdzKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocG0zZmJfZml4Lm1taW9fc3RhcnQsIHBtM2ZiX2ZpeC5tbWlvX2xlbik7CisgZXJyX2V4aXRfbmVpdGhlcjoKKwlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOworCXJldHVybiByZXR2YWw7Cit9CisKKwkvKgorCSAqICBDbGVhbnVwCisJICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcG0zZmJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChpbmZvKSB7CisJCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4ID0gJmluZm8tPmZpeDsKKwkJc3RydWN0IHBtM19wYXIgKnBhciA9IGluZm8tPnBhcjsKKworCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOworCQlmYl9kZWFsbG9jX2NtYXAoJmluZm8tPmNtYXApOworCisJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOworCQlyZWxlYXNlX21lbV9yZWdpb24oZml4LT5zbWVtX3N0YXJ0LCBmaXgtPnNtZW1fbGVuKTsKKwkJaW91bm1hcChwYXItPnZfcmVncyk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihmaXgtPm1taW9fc3RhcnQsIGZpeC0+bW1pb19sZW4pOworCisJCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwogCX0KIH0KIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKiBzdGFuZGFyZCBGQiBBUEkgaW5pdCBmdW5jdGlvbnMgKioqKiogKi8KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBtM2ZiX2lkX3RhYmxlW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEXzNETEFCUywgMHgwYSwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkgPDwgMTYsCisJICAweGZmMDAwMCwgMCB9LAorCXsgMCwgfQorfTsKIAotaW50IF9faW5pdCBwbTNmYl9zZXR1cChjaGFyICpvcHRpb25zKQotewotCWxvbmcgb3BzaSA9IHN0cmxlbihvcHRpb25zKTsKKy8qIEZvciBQQ0kgZHJpdmVycyAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBtM2ZiX2RyaXZlciA9IHsKKwkubmFtZSA9CQkicG0zZmIiLAorCS5pZF90YWJsZSA9CXBtM2ZiX2lkX3RhYmxlLAorCS5wcm9iZSA9CXBtM2ZiX3Byb2JlLAorCS5yZW1vdmUgPQlfX2RldmV4aXRfcChwbTNmYl9yZW1vdmUpLAorfTsKIAotCURUUkFDRTsKLQotCW1lbWNweShnX29wdGlvbnMsIG9wdGlvbnMsCi0JICAgICAgICgob3BzaSArIDEpID4KLQkJUE0zX09QVElPTlNfU0laRSkgPyBQTTNfT1BUSU9OU19TSVpFIDogKG9wc2kgKyAxKSk7Ci0JZ19vcHRpb25zW1BNM19PUFRJT05TX1NJWkUgLSAxXSA9IDA7Ci0KLQlyZXR1cm4gKDApOwotfQorTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBtM2ZiX2lkX3RhYmxlKTsKIAogaW50IF9faW5pdCBwbTNmYl9pbml0KHZvaWQpCiB7Ci0JRFRSQUNFOworCS8qCisJICogIEZvciBrZXJuZWwgYm9vdCBvcHRpb25zIChpbiAndmlkZW89cG0zZmI6PG9wdGlvbnM+JyBmb3JtYXQpCisJICovCisjaWZuZGVmIE1PRFVMRQorCWNoYXIgKm9wdGlvbiA9IE5VTEw7CiAKLQlEUFJJTlRLKDIsICJUaGlzIGlzIHBtM2ZiLmMsIENWUyB2ZXJzaW9uOiAkSGVhZGVyOiAvY3Zzcm9vdC9saW51eC9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmMsdiAxLjEgMjAwMi8wMi8yNSAxOToxMTowNiBtYXJjZWxvIEV4cCAkIik7CisJaWYgKGZiX2dldF9vcHRpb25zKCJwbTNmYiIsICZvcHRpb24pKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwbTNmYl9zZXR1cChvcHRpb24pOworI2VuZGlmCiAKLQlwbTNmYl9yZWFsX3NldHVwKGdfb3B0aW9ucyk7Ci0KLQlwbTNmYl9kZXRlY3QoKTsKLQotCWlmICghZmJfaW5mb1swXS5kZXYpIHsJLyogbm90IGV2ZW4gb25lIGJvYXJkID8/PyAqLwotCQlEUFJJTlRLKDEsICJObyBQQ0kgUGVybWVkaWEzIGJvYXJkIGRldGVjdGVkXG4iKTsKLQl9Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcG0zZmJfZHJpdmVyKTsKIH0KIAotLyogKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotLyogKioqKiBNb2R1bGUgc3VwcG9ydCAqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIHZvaWQgX19leGl0IHBtM2ZiX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBtM2ZiX2RyaXZlcik7Cit9CiAKLSNpZmRlZiBNT0RVTEUKLU1PRFVMRV9BVVRIT1IoIlJvbWFpbiBEb2xiZWF1Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlBlcm1lZGlhMyBmcmFtZWJ1ZmZlciBkZXZpY2UgZHJpdmVyIik7Ci1zdGF0aWMgY2hhciAqbW9kZVtQTTNfTUFYX0JPQVJEXTsKLW1vZHVsZV9wYXJhbV9hcnJheShtb2RlLCBjaGFycCwgTlVMTCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1vZGUsInZpZGVvIG1vZGUiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShkaXNhYmxlLCBzaG9ydCwgTlVMTCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRpc2FibGUsImRpc2FibGUgYm9hcmQiKTsKLXN0YXRpYyBzaG9ydCBvZmZbUE0zX01BWF9CT0FSRF07Ci1tb2R1bGVfcGFyYW1fYXJyYXkob2ZmLCBzaG9ydCwgTlVMTCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG9mZiwiZGlzYWJsZSBib2FyZCIpOwotc3RhdGljIGNoYXIgKnBjaWlkW1BNM19NQVhfQk9BUkRdOwotbW9kdWxlX3BhcmFtX2FycmF5KHBjaWlkLCBjaGFycCwgTlVMTCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBjaWlkLCJib2FyZCBQQ0kgSWQiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShub2FjY2VsLCBzaG9ydCwgTlVMTCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG5vYWNjZWwsImRpc2FibGUgYWNjZWwiKTsKLXN0YXRpYyBjaGFyICpmb250W1BNM19NQVhfQk9BUkRdOwotbW9kdWxlX3BhcmFtX2FycmF5KGZvbnQsIGNoYXJwLCBOVUxMLCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoZm9udCwiY2hvb3NlIGZvbnQiKTsKLW1vZHVsZV9wYXJhbShkZXB0aCwgc2hvcnQsIE5VTEwsIDApOwotTU9EVUxFX1BBUk1fREVTQyhkZXB0aCwiYm9vdC10aW1lIGRlcHRoIik7Ci1tb2R1bGVfcGFyYW0ocHJpbnR0aW1pbmdzLCBzaG9ydCwgTlVMTCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHByaW50dGltaW5ncywgInByaW50IHRoZSBtZW1vcnkgdGltaW5ncyBvZiB0aGUgY2FyZChzKSIpOwotbW9kdWxlX3BhcmFtKGZvcmNlc2l6ZSwgc2hvcnQsIE5VTEwsIDApOwotTU9EVUxFX1BBUk1fREVTQyhmb3JjZXNpemUsICJmb3JjZSBzcGVjaWZpZWQgbWVtb3J5IHNpemUiKTsKKyNpZm5kZWYgTU9EVUxFCisJLyoKKwkgKiAgU2V0dXAKKwkgKi8KKwogLyoKLU1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJQZXJtZWRpYTMgUENJIGJvYXJkcyIpCi1NT0RVTEVfR0VORVJJQ19UQUJMRShndHlwZSxuYW1lKQotTU9EVUxFX0RFVklDRV9UQUJMRSh0eXBlLG5hbWUpCi0qLwotCi12b2lkIHBtM2ZiX2J1aWxkX29wdGlvbnModm9pZCkKKyAqIE9ubHkgbmVjZXNzYXJ5IGlmIHlvdXIgZHJpdmVyIHRha2VzIHNwZWNpYWwgb3B0aW9ucywKKyAqIG90aGVyd2lzZSB3ZSBmYWxsIGJhY2sgb24gdGhlIGdlbmVyaWMgZmJfc2V0dXAoKS4KKyAqLworaW50IF9faW5pdCBwbTNmYl9zZXR1cChjaGFyICpvcHRpb25zKQogewotCWludCBpOwotCWNoYXIgdHNbMTI4XTsKLQotCXN0cmNweShnX29wdGlvbnMsICJwbTNmYiIpOwotCWZvciAoaSA9IDA7IGkgPCBQTTNfTUFYX0JPQVJEIDsgaSsrKQotCXsKLQkJaWYgKG1vZGVbaV0pCi0JCXsKLQkJCXNwcmludGYodHMsICIsbW9kZTolZDolcyIsIGksIG1vZGVbaV0pOwotCQkJc3RybmNhdChnX29wdGlvbnMsIHRzLCBQTTNfT1BUSU9OU19TSVpFIC0gc3RybGVuKGdfb3B0aW9ucykpOwotCQl9Ci0JCWlmIChkaXNhYmxlW2ldIHx8IG9mZltpXSkKLQkJewotCQkJc3ByaW50Zih0cywgIixkaXNhYmxlOiVkOiIsIGkpOwotCQkJc3RybmNhdChnX29wdGlvbnMsIHRzLCBQTTNfT1BUSU9OU19TSVpFIC0gc3RybGVuKGdfb3B0aW9ucykpOwotCQl9Ci0JCWlmIChwY2lpZFtpXSkKLQkJewotCQkJc3ByaW50Zih0cywgIixwY2lpZDolZDolcyIsIGksIHBjaWlkW2ldKTsKLQkJCXN0cm5jYXQoZ19vcHRpb25zLCB0cywgUE0zX09QVElPTlNfU0laRSAtIHN0cmxlbihnX29wdGlvbnMpKTsKLQkJfQotCQlpZiAobm9hY2NlbFtpXSkKLQkJewotCQkJc3ByaW50Zih0cywgIixub2FjY2VsOiVkOiIsIGkpOwotCQkJc3RybmNhdChnX29wdGlvbnMsIHRzLCBQTTNfT1BUSU9OU19TSVpFIC0gc3RybGVuKGdfb3B0aW9ucykpOwotCQl9Ci0JCWlmIChmb250W2ldKQotCQl7Ci0JCQlzcHJpbnRmKHRzLCAiLGZvbnQ6JWQ6JXMiLCBpLCBmb250W2ldKTsKLQkJCXN0cm5jYXQoZ19vcHRpb25zLCB0cywgUE0zX09QVElPTlNfU0laRSAtIHN0cmxlbihnX29wdGlvbnMpKTsKLQkJfQotCQlpZiAoZGVwdGhbaV0pCi0JCXsKLQkJCXNwcmludGYodHMsICIsZGVwdGg6JWQ6JWQiLCBpLCBkZXB0aFtpXSk7Ci0JCQlzdHJuY2F0KGdfb3B0aW9ucywgdHMsIFBNM19PUFRJT05TX1NJWkUgLSBzdHJsZW4oZ19vcHRpb25zKSk7Ci0JCX0KLQl9Ci0JZ19vcHRpb25zW1BNM19PUFRJT05TX1NJWkUgLSAxXSA9ICdcMCc7Ci0JRFBSSU5USygxLCAicG0zZmIgdXNlIG9wdGlvbnM6ICVzXG4iLCBnX29wdGlvbnMpOwotfQotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlEVFJBQ0U7Ci0KLQlwbTNmYl9idWlsZF9vcHRpb25zKCk7Ci0KLQlwbTNmYl9pbml0KCk7Ci0KKwkvKiBQYXJzZSB1c2VyIHNwZWZpY2llZCBvcHRpb25zIChgdmlkZW89cG0zZmI6JykgKi8KIAlyZXR1cm4gMDsKIH0KLQotdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQotewotCURUUkFDRTsKLQl7Ci0JCXVuc2lnbmVkIGxvbmcgaTsKLQkJc3RydWN0IHBtM2ZiX2luZm8gKmxfZmJfaW5mbzsKLQkJZm9yIChpID0gMDsgaSA8IFBNM19NQVhfQk9BUkQ7IGkrKykgewotCQkJbF9mYl9pbmZvID0gJihmYl9pbmZvW2ldKTsKLQkJCXBjaV9kZXZfcHV0KGxfZmJfaW5mby0+ZGV2KTsKLQkJCWlmIChsX2ZiX2luZm8tPmRldiAhPSBOVUxMICAmJiAhKGRpc2FibGVbbF9mYl9pbmZvLT5ib2FyZF9udW1dKSkgewotCQkJCWlmIChsX2ZiX2luZm8tPnZJT0Jhc2UgIT0gKHVuc2lnbmVkIGNoYXIgKikgLTEpIHsKLQkJCQkJcG0zZmJfdW5tYXBJTyhsX2ZiX2luZm8pOwotCQkJCQlyZWxlYXNlX21lbV9yZWdpb24obF9mYl9pbmZvLT5wX2ZiLAotCQkJCQkJICAgbF9mYl9pbmZvLT5mYl9zaXplKTsKLQkJCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGxfZmJfaW5mby0+cElPQmFzZSwKLQkJCQkJCSAgIFBNM19SRUdTX1NJWkUpOwotCQkJCX0KLQkJCQl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZsX2ZiX2luZm8tPmdlbi5pbmZvKTsKLQkJCX0KLQkJfQotCX0KLX0KICNlbmRpZiAvKiBNT0RVTEUgKi8KKworbW9kdWxlX2luaXQocG0zZmJfaW5pdCk7Cittb2R1bGVfZXhpdChwbTNmYl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9yaXZhL3JpdmFmYi1pMmMuYyBiL2RyaXZlcnMvdmlkZW8vcml2YS9yaXZhZmItaTJjLmMKaW5kZXggNzZlNmNlMy4uYTBlMjJhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9yaXZhL3JpdmFmYi1pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL3JpdmEvcml2YWZiLWkyYy5jCkBAIC03MCw4ICs3MCw2IEBACiAJaWYgKFZHQV9SRDA4KHBhci0+cml2YS5QQ0lPLCAweDNkNSkgJiAweDA0KQogCQl2YWwgPSAxOwogCi0JdmFsID0gVkdBX1JEMDgocGFyLT5yaXZhLlBDSU8sIDB4M2Q1KTsKLQogCXJldHVybiB2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKaW5kZXggOWVkZjQxMS4uNzIwYzI5ZCAxMDA2NDQKLS0tIGEvZnMvTWFrZWZpbGUKKysrIGIvZnMvTWFrZWZpbGUKQEAgLTIyLDYgKzIyLDEwIEBACiBvYmotJChDT05GSUdfSU5PVElGWSkJCSs9IGlub3RpZnkubwogb2JqLSQoQ09ORklHX0lOT1RJRllfVVNFUikJKz0gaW5vdGlmeV91c2VyLm8KIG9iai0kKENPTkZJR19FUE9MTCkJCSs9IGV2ZW50cG9sbC5vCitvYmotJChDT05GSUdfQU5PTl9JTk9ERVMpCSs9IGFub25faW5vZGVzLm8KK29iai0kKENPTkZJR19TSUdOQUxGRCkJCSs9IHNpZ25hbGZkLm8KK29iai0kKENPTkZJR19USU1FUkZEKQkJKz0gdGltZXJmZC5vCitvYmotJChDT05GSUdfRVZFTlRGRCkJCSs9IGV2ZW50ZmQubwogb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IGNvbXBhdC5vIGNvbXBhdF9pb2N0bC5vCiAKIG5mc2QtJChDT05GSUdfTkZTRCkJCTo9IG5mc2N0bC5vCmRpZmYgLS1naXQgYS9mcy9hZnMvYWZzLmggYi9mcy9hZnMvYWZzLmgKaW5kZXggNTJkMDc1Mi4uMjQ1MjU3OSAxMDA2NDQKLS0tIGEvZnMvYWZzL2Fmcy5oCisrKyBiL2ZzL2Fmcy9hZnMuaApAQCAtMTYsNiArMTYsOSBAQAogCiAjZGVmaW5lIEFGU19NQVhDRUxMTkFNRQk2NAkJLyogbWF4aW11bSBsZW5ndGggb2YgYSBjZWxsIG5hbWUgKi8KICNkZWZpbmUgQUZTX01BWFZPTE5BTUUJNjQJCS8qIG1heGltdW0gbGVuZ3RoIG9mIGEgdm9sdW1lIG5hbWUgKi8KKyNkZWZpbmUgQUZTTkFNRU1BWAkyNTYJCS8qIG1heGltdW0gbGVuZ3RoIG9mIGEgZmlsZW5hbWUgcGx1cyBOVUwgKi8KKyNkZWZpbmUgQUZTUEFUSE1BWAkxMDI0CQkvKiBtYXhpbXVtIGxlbmd0aCBvZiBhIHBhdGhuYW1lIHBsdXMgTlVMICovCisjZGVmaW5lIEFGU09QQVFVRU1BWAkxMDI0CQkvKiBtYXhpbXVtIGxlbmd0aCBvZiBhbiBvcGFxdWUgZmllbGQgKi8KIAogdHlwZWRlZiB1bnNpZ25lZAkJCWFmc192b2xpZF90OwogdHlwZWRlZiB1bnNpZ25lZAkJCWFmc192bm9kZWlkX3Q7CkBAIC0xNDMsNCArMTQ2LDI0IEBACiAJdGltZV90CQkJY3JlYXRpb247CS8qIHZvbHVtZSBjcmVhdGlvbiB0aW1lICovCiB9OwogCisvKgorICogQUZTIHZvbHVtZSBzdGF0dXMgcmVjb3JkCisgKi8KK3N0cnVjdCBhZnNfdm9sdW1lX3N0YXR1cyB7CisJdTMyCQkJdmlkOwkJLyogdm9sdW1lIElEICovCisJdTMyCQkJcGFyZW50X2lkOwkvKiBwYXJlbnQgdm9sdW1lIElEICovCisJdTgJCQlvbmxpbmU7CQkvKiB0cnVlIGlmIHZvbHVtZSBjdXJyZW50bHkgb25saW5lIGFuZCBhdmFpbGFibGUgKi8KKwl1OAkJCWluX3NlcnZpY2U7CS8qIHRydWUgaWYgdm9sdW1lIGN1cnJlbnRseSBpbiBzZXJ2aWNlICovCisJdTgJCQlibGVzc2VkOwkvKiBzYW1lIGFzIGluX3NlcnZpY2UgKi8KKwl1OAkJCW5lZWRzX3NhbHZhZ2U7CS8qIHRydWUgaWYgY29uc2lzdGVuY3kgY2hlY2tpbmcgcmVxdWlyZWQgKi8KKwl1MzIJCQl0eXBlOwkJLyogdm9sdW1lIHR5cGUgKGFmc192b2x0eXBlX3QpICovCisJdTMyCQkJbWluX3F1b3RhOwkvKiBtaW5pbXVtIHNwYWNlIHNldCBhc2lkZSAoYmxvY2tzKSAqLworCXUzMgkJCW1heF9xdW90YTsJLyogbWF4aW11bSBzcGFjZSB0aGlzIHZvbHVtZSBtYXkgb2NjdXB5IChibG9ja3MpICovCisJdTMyCQkJYmxvY2tzX2luX3VzZTsJLyogc3BhY2UgdGhpcyB2b2x1bWUgY3VycmVudGx5IG9jY3VwaWVzIChibG9ja3MpICovCisJdTMyCQkJcGFydF9ibG9ja3NfYXZhaWw7IC8qIHNwYWNlIGF2YWlsYWJsZSBpbiB2b2x1bWUncyBwYXJ0aXRpb24gKi8KKwl1MzIJCQlwYXJ0X21heF9ibG9ja3M7IC8qIHNpemUgb2Ygdm9sdW1lJ3MgcGFydGl0aW9uICovCit9OworCisjZGVmaW5lIEFGU19CTE9DS19TSVpFCTEwMjQKKwogI2VuZGlmIC8qIEFGU19IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvYWZzX2ZzLmggYi9mcy9hZnMvYWZzX2ZzLmgKaW5kZXggZDk2M2VmNC4uYTE4YzM3NCAxMDA2NDQKLS0tIGEvZnMvYWZzL2Fmc19mcy5oCisrKyBiL2ZzL2Fmcy9hZnNfZnMuaApAQCAtMjgsNyArMjgsOCBAQAogCUZTTUFLRURJUgkJPSAxNDEsCS8qIEFGUyBDcmVhdGUgYSBkaXJlY3RvcnkgKi8KIAlGU1JFTU9WRURJUgkJPSAxNDIsCS8qIEFGUyBSZW1vdmUgYSBkaXJlY3RvcnkgKi8KIAlGU0dJVkVVUENBTExCQUNLUwk9IDE0NywJLyogQUZTIERpc2NhcmQgY2FsbGJhY2sgcHJvbWlzZXMgKi8KLQlGU0dFVFZPTFVNRUlORk8JCT0gMTQ4LAkvKiBBRlMgR2V0IHJvb3Qgdm9sdW1lIGluZm9ybWF0aW9uICovCisJRlNHRVRWT0xVTUVJTkZPCQk9IDE0OCwJLyogQUZTIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHZvbHVtZSAqLworCUZTR0VUVk9MVU1FU1RBVFVTCT0gMTQ5LAkvKiBBRlMgR2V0IHZvbHVtZSBzdGF0dXMgaW5mb3JtYXRpb24gKi8KIAlGU0dFVFJPT1RWT0xVTUUJCT0gMTUxLAkvKiBBRlMgR2V0IHJvb3Qgdm9sdW1lIG5hbWUgKi8KIAlGU0xPT0tVUAkJPSAxNjEsCS8qIEFGUyBsb29rdXAgZmlsZSBpbiBkaXJlY3RvcnkgKi8KIAlGU0ZFVENIREFUQTY0CQk9IDY1NTM3LCAvKiBBRlMgRmV0Y2ggZmlsZSBkYXRhICovCmRpZmYgLS1naXQgYS9mcy9hZnMvZGlyLmMgYi9mcy9hZnMvZGlyLmMKaW5kZXggMmZiMzEyNy4uNzE5YWY0ZiAxMDA2NDQKLS0tIGEvZnMvYWZzL2Rpci5jCisrKyBiL2ZzL2Fmcy9kaXIuYwpAQCAtNDk3LDcgKzQ5Nyw3IEBACiAKIAlBU1NFUlRDTVAoZGVudHJ5LT5kX2lub2RlLCA9PSwgTlVMTCk7CiAKLQlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gMjU1KSB7CisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+PSBBRlNOQU1FTUFYKSB7CiAJCV9sZWF2ZSgiID0gLUVOQU1FVE9PTE9ORyIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKIAl9CkBAIC03MzYsNyArNzM2LDcgQEAKIAkgICAgICAgZHZub2RlLT5maWQudmlkLCBkdm5vZGUtPmZpZC52bm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgbW9kZSk7CiAKIAlyZXQgPSAtRU5BTUVUT09MT05HOwotCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiAyNTUpCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+PSBBRlNOQU1FTUFYKQogCQlnb3RvIGVycm9yOwogCiAJa2V5ID0gYWZzX3JlcXVlc3Rfa2V5KGR2bm9kZS0+dm9sdW1lLT5jZWxsKTsKQEAgLTgwMSw3ICs4MDEsNyBAQAogCSAgICAgICBkdm5vZGUtPmZpZC52aWQsIGR2bm9kZS0+ZmlkLnZub2RlLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCXJldCA9IC1FTkFNRVRPT0xPTkc7Ci0JaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NSkKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID49IEFGU05BTUVNQVgpCiAJCWdvdG8gZXJyb3I7CiAKIAlrZXkgPSBhZnNfcmVxdWVzdF9rZXkoZHZub2RlLT52b2x1bWUtPmNlbGwpOwpAQCAtODQ3LDcgKzg0Nyw3IEBACiAJICAgICAgIGR2bm9kZS0+ZmlkLnZpZCwgZHZub2RlLT5maWQudm5vZGUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCiAJcmV0ID0gLUVOQU1FVE9PTE9ORzsKLQlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gMjU1KQorCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPj0gQUZTTkFNRU1BWCkKIAkJZ290byBlcnJvcjsKIAogCWtleSA9IGFmc19yZXF1ZXN0X2tleShkdm5vZGUtPnZvbHVtZS0+Y2VsbCk7CkBAIC05MjEsNyArOTIxLDcgQEAKIAkgICAgICAgZHZub2RlLT5maWQudmlkLCBkdm5vZGUtPmZpZC52bm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgbW9kZSk7CiAKIAlyZXQgPSAtRU5BTUVUT09MT05HOwotCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiAyNTUpCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+PSBBRlNOQU1FTUFYKQogCQlnb3RvIGVycm9yOwogCiAJa2V5ID0gYWZzX3JlcXVlc3Rfa2V5KGR2bm9kZS0+dm9sdW1lLT5jZWxsKTsKQEAgLTk5MCw3ICs5OTAsNyBAQAogCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAogCXJldCA9IC1FTkFNRVRPT0xPTkc7Ci0JaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NSkKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID49IEFGU05BTUVNQVgpCiAJCWdvdG8gZXJyb3I7CiAKIAlrZXkgPSBhZnNfcmVxdWVzdF9rZXkoZHZub2RlLT52b2x1bWUtPmNlbGwpOwpAQCAtMTAzOCwxMSArMTAzOCwxMSBAQAogCSAgICAgICBjb250ZW50KTsKIAogCXJldCA9IC1FTkFNRVRPT0xPTkc7Ci0JaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IDI1NSkKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID49IEFGU05BTUVNQVgpCiAJCWdvdG8gZXJyb3I7CiAKIAlyZXQgPSAtRUlOVkFMOwotCWlmIChzdHJsZW4oY29udGVudCkgPiAxMDIzKQorCWlmIChzdHJsZW4oY29udGVudCkgPj0gQUZTUEFUSE1BWCkKIAkJZ290byBlcnJvcjsKIAogCWtleSA9IGFmc19yZXF1ZXN0X2tleShkdm5vZGUtPnZvbHVtZS0+Y2VsbCk7CkBAIC0xMTEyLDcgKzExMTIsNyBAQAogCSAgICAgICBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CiAKIAlyZXQgPSAtRU5BTUVUT09MT05HOwotCWlmIChuZXdfZGVudHJ5LT5kX25hbWUubGVuID4gMjU1KQorCWlmIChuZXdfZGVudHJ5LT5kX25hbWUubGVuID49IEFGU05BTUVNQVgpCiAJCWdvdG8gZXJyb3I7CiAKIAlrZXkgPSBhZnNfcmVxdWVzdF9rZXkob3JpZ19kdm5vZGUtPnZvbHVtZS0+Y2VsbCk7CmRpZmYgLS1naXQgYS9mcy9hZnMvZmlsZS5jIGIvZnMvYWZzL2ZpbGUuYwppbmRleCAzZTI1Nzk1Li45YzBlNzIxIDEwMDY0NAotLS0gYS9mcy9hZnMvZmlsZS5jCisrKyBiL2ZzL2Fmcy9maWxlLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogewogCWludCByZXQgPSAxOwogCi0Ja2VudGVyKCJ7JWx1fSwlbHUiLCBwYWdlLT5pbmRleCwgb2Zmc2V0KTsKKwlfZW50ZXIoInslbHV9LCVsdSIsIHBhZ2UtPmluZGV4LCBvZmZzZXQpOwogCiAJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIApkaWZmIC0tZ2l0IGEvZnMvYWZzL2ZzY2xpZW50LmMgYi9mcy9hZnMvZnNjbGllbnQuYwppbmRleCA1NmNjMGVmLi41ZGZmMTMwIDEwMDY0NAotLS0gYS9mcy9hZnMvZnNjbGllbnQuYworKysgYi9mcy9hZnMvZnNjbGllbnQuYwpAQCAtMjAyLDYgKzIwMiwyOSBAQAogfQogCiAvKgorICogZGVjb2RlIGFuIEFGU0ZldGNoVm9sdW1lU3RhdHVzIGJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIHhkcl9kZWNvZGVfQUZTRmV0Y2hWb2x1bWVTdGF0dXMoY29uc3QgX19iZTMyICoqX2JwLAorCQkJCQkgICAgc3RydWN0IGFmc192b2x1bWVfc3RhdHVzICp2cykKK3sKKwljb25zdCBfX2JlMzIgKmJwID0gKl9icDsKKworCXZzLT52aWQJCQk9IG50b2hsKCpicCsrKTsKKwl2cy0+cGFyZW50X2lkCQk9IG50b2hsKCpicCsrKTsKKwl2cy0+b25saW5lCQk9IG50b2hsKCpicCsrKTsKKwl2cy0+aW5fc2VydmljZQkJPSBudG9obCgqYnArKyk7CisJdnMtPmJsZXNzZWQJCT0gbnRvaGwoKmJwKyspOworCXZzLT5uZWVkc19zYWx2YWdlCT0gbnRvaGwoKmJwKyspOworCXZzLT50eXBlCQk9IG50b2hsKCpicCsrKTsKKwl2cy0+bWluX3F1b3RhCQk9IG50b2hsKCpicCsrKTsKKwl2cy0+bWF4X3F1b3RhCQk9IG50b2hsKCpicCsrKTsKKwl2cy0+YmxvY2tzX2luX3VzZQk9IG50b2hsKCpicCsrKTsKKwl2cy0+cGFydF9ibG9ja3NfYXZhaWwJPSBudG9obCgqYnArKyk7CisJdnMtPnBhcnRfbWF4X2Jsb2Nrcwk9IG50b2hsKCpicCsrKTsKKwkqX2JwID0gYnA7Cit9CisKKy8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuRmV0Y2hTdGF0dXMKICAqLwogc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19mZXRjaF9zdGF0dXMoc3RydWN0IGFmc19jYWxsICpjYWxsLApAQCAtMTQ1MCwzICsxNDczLDI3OCBAQAogCiAJcmV0dXJuIGFmc19tYWtlX2NhbGwoJnNlcnZlci0+YWRkciwgY2FsbCwgR0ZQX05PRlMsIHdhaXRfbW9kZSk7CiB9CisKKy8qCisgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuR2V0Vm9sdW1lU3RhdHVzCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZ2V0X3ZvbHVtZV9zdGF0dXMoc3RydWN0IGFmc19jYWxsICpjYWxsLAorCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQoreworCWNvbnN0IF9fYmUzMiAqYnA7CisJY2hhciAqcDsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisKKwlzd2l0Y2ggKGNhbGwtPnVubWFyc2hhbGwpIHsKKwljYXNlIDA6CisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCQkvKiBleHRyYWN0IHRoZSByZXR1cm5lZCBzdGF0dXMgcmVjb3JkICovCisJY2FzZSAxOgorCQlfZGVidWcoImV4dHJhY3Qgc3RhdHVzIik7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCisJCQkJICAgICAgIDEyICogNCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQl9CisKKwkJYnAgPSBjYWxsLT5idWZmZXI7CisJCXhkcl9kZWNvZGVfQUZTRmV0Y2hWb2x1bWVTdGF0dXMoJmJwLCBjYWxsLT5yZXBseTIpOworCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT51bm1hcnNoYWxsKys7CisKKwkJLyogZXh0cmFjdCB0aGUgdm9sdW1lIG5hbWUgbGVuZ3RoICovCisJY2FzZSAyOgorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQl9CisKKwkJY2FsbC0+Y291bnQgPSBudG9obChjYWxsLT50bXApOworCQlfZGVidWcoInZvbG5hbWUgbGVuZ3RoOiAldSIsIGNhbGwtPmNvdW50KTsKKwkJaWYgKGNhbGwtPmNvdW50ID49IEFGU05BTUVNQVgpCisJCQlyZXR1cm4gLUVCQURNU0c7CisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCQkvKiBleHRyYWN0IHRoZSB2b2x1bWUgbmFtZSAqLworCWNhc2UgMzoKKwkJX2RlYnVnKCJleHRyYWN0IHZvbG5hbWUiKTsKKwkJaWYgKGNhbGwtPmNvdW50ID4gMCkgeworCQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsIGNhbGwtPnJlcGx5MywKKwkJCQkJICAgICAgIGNhbGwtPmNvdW50KTsKKwkJCXN3aXRjaCAocmV0KSB7CisJCQljYXNlIDA6CQlicmVhazsKKwkJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQkJfQorCQl9CisKKwkJcCA9IGNhbGwtPnJlcGx5MzsKKwkJcFtjYWxsLT5jb3VudF0gPSAwOworCQlfZGVidWcoInZvbG5hbWUgJyVzJyIsIHApOworCisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCQkvKiBleHRyYWN0IHRoZSB2b2x1bWUgbmFtZSBwYWRkaW5nICovCisJCWlmICgoY2FsbC0+Y291bnQgJiAzKSA9PSAwKSB7CisJCQljYWxsLT51bm1hcnNoYWxsKys7CisJCQlnb3RvIG5vX3ZvbG5hbWVfcGFkZGluZzsKKwkJfQorCQljYWxsLT5jb3VudCA9IDQgLSAoY2FsbC0+Y291bnQgJiAzKTsKKworCWNhc2UgNDoKKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsIGNhbGwtPmJ1ZmZlciwKKwkJCQkgICAgICAgY2FsbC0+Y291bnQpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CQlicmVhazsKKwkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKKwkJZGVmYXVsdDoJcmV0dXJuIHJldDsKKwkJfQorCisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKwlub192b2xuYW1lX3BhZGRpbmc6CisKKwkJLyogZXh0cmFjdCB0aGUgb2ZmbGluZSBtZXNzYWdlIGxlbmd0aCAqLworCWNhc2UgNToKKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsICZjYWxsLT50bXAsIDQpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CQlicmVhazsKKwkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKKwkJZGVmYXVsdDoJcmV0dXJuIHJldDsKKwkJfQorCisJCWNhbGwtPmNvdW50ID0gbnRvaGwoY2FsbC0+dG1wKTsKKwkJX2RlYnVnKCJvZmZsaW5lIG1zZyBsZW5ndGg6ICV1IiwgY2FsbC0+Y291bnQpOworCQlpZiAoY2FsbC0+Y291bnQgPj0gQUZTTkFNRU1BWCkKKwkJCXJldHVybiAtRUJBRE1TRzsKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCisJCS8qIGV4dHJhY3QgdGhlIG9mZmxpbmUgbWVzc2FnZSAqLworCWNhc2UgNjoKKwkJX2RlYnVnKCJleHRyYWN0IG9mZmxpbmUiKTsKKwkJaWYgKGNhbGwtPmNvdW50ID4gMCkgeworCQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsIGNhbGwtPnJlcGx5MywKKwkJCQkJICAgICAgIGNhbGwtPmNvdW50KTsKKwkJCXN3aXRjaCAocmV0KSB7CisJCQljYXNlIDA6CQlicmVhazsKKwkJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQkJfQorCQl9CisKKwkJcCA9IGNhbGwtPnJlcGx5MzsKKwkJcFtjYWxsLT5jb3VudF0gPSAwOworCQlfZGVidWcoIm9mZmxpbmUgJyVzJyIsIHApOworCisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCQkvKiBleHRyYWN0IHRoZSBvZmZsaW5lIG1lc3NhZ2UgcGFkZGluZyAqLworCQlpZiAoKGNhbGwtPmNvdW50ICYgMykgPT0gMCkgeworCQkJY2FsbC0+dW5tYXJzaGFsbCsrOworCQkJZ290byBub19vZmZsaW5lX3BhZGRpbmc7CisJCX0KKwkJY2FsbC0+Y291bnQgPSA0IC0gKGNhbGwtPmNvdW50ICYgMyk7CisKKwljYXNlIDc6CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCisJCQkJICAgICAgIGNhbGwtPmNvdW50KTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgkJYnJlYWs7CisJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CXJldHVybiByZXQ7CisJCX0KKworCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT51bm1hcnNoYWxsKys7CisJbm9fb2ZmbGluZV9wYWRkaW5nOgorCisJCS8qIGV4dHJhY3QgdGhlIG1lc3NhZ2Ugb2YgdGhlIGRheSBsZW5ndGggKi8KKwljYXNlIDg6CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgkJYnJlYWs7CisJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CXJldHVybiByZXQ7CisJCX0KKworCQljYWxsLT5jb3VudCA9IG50b2hsKGNhbGwtPnRtcCk7CisJCV9kZWJ1ZygibW90ZCBsZW5ndGg6ICV1IiwgY2FsbC0+Y291bnQpOworCQlpZiAoY2FsbC0+Y291bnQgPj0gQUZTTkFNRU1BWCkKKwkJCXJldHVybiAtRUJBRE1TRzsKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCisJCS8qIGV4dHJhY3QgdGhlIG1lc3NhZ2Ugb2YgdGhlIGRheSAqLworCWNhc2UgOToKKwkJX2RlYnVnKCJleHRyYWN0IG1vdGQiKTsKKwkJaWYgKGNhbGwtPmNvdW50ID4gMCkgeworCQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsIGNhbGwtPnJlcGx5MywKKwkJCQkJICAgICAgIGNhbGwtPmNvdW50KTsKKwkJCXN3aXRjaCAocmV0KSB7CisJCQljYXNlIDA6CQlicmVhazsKKwkJCWNhc2UgLUVBR0FJTjoJcmV0dXJuIDA7CisJCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQkJfQorCQl9CisKKwkJcCA9IGNhbGwtPnJlcGx5MzsKKwkJcFtjYWxsLT5jb3VudF0gPSAwOworCQlfZGVidWcoIm1vdGQgJyVzJyIsIHApOworCisJCWNhbGwtPm9mZnNldCA9IDA7CisJCWNhbGwtPnVubWFyc2hhbGwrKzsKKworCQkvKiBleHRyYWN0IHRoZSBtZXNzYWdlIG9mIHRoZSBkYXkgcGFkZGluZyAqLworCQlpZiAoKGNhbGwtPmNvdW50ICYgMykgPT0gMCkgeworCQkJY2FsbC0+dW5tYXJzaGFsbCsrOworCQkJZ290byBub19tb3RkX3BhZGRpbmc7CisJCX0KKwkJY2FsbC0+Y291bnQgPSA0IC0gKGNhbGwtPmNvdW50ICYgMyk7CisKKwljYXNlIDEwOgorCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQl9CisKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCW5vX21vdGRfcGFkZGluZzoKKworCWNhc2UgMTE6CisJCV9kZWJ1ZygidHJhaWxlciAlZCIsIHNrYi0+bGVuKTsKKwkJaWYgKHNrYi0+bGVuICE9IDApCisJCQlyZXR1cm4gLUVCQURNU0c7CisJCWJyZWFrOworCX0KKworCWlmICghbGFzdCkKKwkJcmV0dXJuIDA7CisKKwlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBkZXN0cm95IGFuIEZTLkdldFZvbHVtZVN0YXR1cyBjYWxsCisgKi8KK3N0YXRpYyB2b2lkIGFmc19nZXRfdm9sdW1lX3N0YXR1c19jYWxsX2Rlc3RydWN0b3Ioc3RydWN0IGFmc19jYWxsICpjYWxsKQoreworCWtmcmVlKGNhbGwtPnJlcGx5Myk7CisJY2FsbC0+cmVwbHkzID0gTlVMTDsKKwlhZnNfZmxhdF9jYWxsX2Rlc3RydWN0b3IoY2FsbCk7Cit9CisKKy8qCisgKiBGUy5HZXRWb2x1bWVTdGF0dXMgb3BlcmF0aW9uIHR5cGUKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfY2FsbF90eXBlIGFmc19SWEZTR2V0Vm9sdW1lU3RhdHVzID0geworCS5uYW1lCQk9ICJGUy5HZXRWb2x1bWVTdGF0dXMiLAorCS5kZWxpdmVyCT0gYWZzX2RlbGl2ZXJfZnNfZ2V0X3ZvbHVtZV9zdGF0dXMsCisJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAorCS5kZXN0cnVjdG9yCT0gYWZzX2dldF92b2x1bWVfc3RhdHVzX2NhbGxfZGVzdHJ1Y3RvciwKK307CisKKy8qCisgKiBmZXRjaCB0aGUgc3RhdHVzIG9mIGEgdm9sdW1lCisgKi8KK2ludCBhZnNfZnNfZ2V0X3ZvbHVtZV9zdGF0dXMoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICAgc3RydWN0IGtleSAqa2V5LAorCQkJICAgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJCSAgICAgc3RydWN0IGFmc192b2x1bWVfc3RhdHVzICp2cywKKwkJCSAgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKndhaXRfbW9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CisJX19iZTMyICpicDsKKwl2b2lkICp0bXBidWY7CisKKwlfZW50ZXIoIiIpOworCisJdG1wYnVmID0ga21hbGxvYyhBRlNPUEFRVUVNQVgsIEdGUF9LRVJORUwpOworCWlmICghdG1wYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNhbGwgPSBhZnNfYWxsb2NfZmxhdF9jYWxsKCZhZnNfUlhGU0dldFZvbHVtZVN0YXR1cywgMiAqIDQsIDEyICogNCk7CisJaWYgKCFjYWxsKSB7CisJCWtmcmVlKHRtcGJ1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNhbGwtPmtleSA9IGtleTsKKwljYWxsLT5yZXBseSA9IHZub2RlOworCWNhbGwtPnJlcGx5MiA9IHZzOworCWNhbGwtPnJlcGx5MyA9IHRtcGJ1ZjsKKwljYWxsLT5zZXJ2aWNlX2lkID0gRlNfU0VSVklDRTsKKwljYWxsLT5wb3J0ID0gaHRvbnMoQUZTX0ZTX1BPUlQpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlicCA9IGNhbGwtPnJlcXVlc3Q7CisJYnBbMF0gPSBodG9ubChGU0dFVFZPTFVNRVNUQVRVUyk7CisJYnBbMV0gPSBodG9ubCh2bm9kZS0+ZmlkLnZpZCk7CisKKwlyZXR1cm4gYWZzX21ha2VfY2FsbCgmc2VydmVyLT5hZGRyLCBjYWxsLCBHRlBfTk9GUywgd2FpdF9tb2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbm9kZS5jIGIvZnMvYWZzL2lub2RlLmMKaW5kZXggNTE1YTVkMS4uNDdmNWZlZCAxMDA2NDQKLS0tIGEvZnMvYWZzL2lub2RlLmMKKysrIGIvZnMvYWZzL2lub2RlLmMKQEAgLTIwOSwxMSArMjA5LDE1IEBACiAgKi8KIHZvaWQgYWZzX3phcF9kYXRhKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQogewotCV9lbnRlcigiemFwIGRhdGEgeyV4OiV1fSIsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlKTsKKwlfZW50ZXIoInsleDoldX0iLCB2bm9kZS0+ZmlkLnZpZCwgdm5vZGUtPmZpZC52bm9kZSk7CiAKIAkvKiBudWtlIGFsbCB0aGUgbm9uLWRpcnR5IHBhZ2VzIHRoYXQgYXJlbid0IGxvY2tlZCwgbWFwcGVkIG9yIGJlaW5nCi0JICogd3JpdHRlbiBiYWNrICovCi0JaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoJnZub2RlLT52ZnNfaW5vZGUpOworCSAqIHdyaXR0ZW4gYmFjayBpbiBhIHJlZ3VsYXIgZmlsZSBhbmQgY29tcGxldGVseSBkaXNjYXJkIHRoZSBwYWdlcyBpbiBhCisJICogZGlyZWN0b3J5IG9yIHN5bWxpbmsgKi8KKwlpZiAoU19JU1JFRyh2bm9kZS0+dmZzX2lub2RlLmlfbW9kZSkpCisJCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKCZ2bm9kZS0+dmZzX2lub2RlKTsKKwllbHNlCisJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyKHZub2RlLT52ZnNfaW5vZGUuaV9tYXBwaW5nKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbnRlcm5hbC5oIGIvZnMvYWZzL2ludGVybmFsLmgKaW5kZXggYTMwZDRmYS4uNDk1M2JhNSAxMDA2NDQKLS0tIGEvZnMvYWZzL2ludGVybmFsLmgKKysrIGIvZnMvYWZzL2ludGVybmFsLmgKQEAgLTUwNiw2ICs1MDYsMTAgQEAKIGV4dGVybiBpbnQgYWZzX2ZzX3NldGF0dHIoc3RydWN0IGFmc19zZXJ2ZXIgKiwgc3RydWN0IGtleSAqLAogCQkJICBzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBpYXR0ciAqLAogCQkJICBjb25zdCBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSAqKTsKK2V4dGVybiBpbnQgYWZzX2ZzX2dldF92b2x1bWVfc3RhdHVzKHN0cnVjdCBhZnNfc2VydmVyICosIHN0cnVjdCBrZXkgKiwKKwkJCQkgICAgc3RydWN0IGFmc192bm9kZSAqLAorCQkJCSAgICBzdHJ1Y3QgYWZzX3ZvbHVtZV9zdGF0dXMgKiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgKik7CiAKIC8qCiAgKiBpbm9kZS5jCkBAIC02NzIsNiArNjc2LDggQEAKIGV4dGVybiBpbnQgYWZzX3Zub2RlX3N0b3JlX2RhdGEoc3RydWN0IGFmc193cml0ZWJhY2sgKiwgcGdvZmZfdCwgcGdvZmZfdCwKIAkJCQl1bnNpZ25lZCwgdW5zaWduZWQpOwogZXh0ZXJuIGludCBhZnNfdm5vZGVfc2V0YXR0cihzdHJ1Y3QgYWZzX3Zub2RlICosIHN0cnVjdCBrZXkgKiwgc3RydWN0IGlhdHRyICopOworZXh0ZXJuIGludCBhZnNfdm5vZGVfZ2V0X3ZvbHVtZV9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqLCBzdHJ1Y3Qga2V5ICosCisJCQkJICAgICAgIHN0cnVjdCBhZnNfdm9sdW1lX3N0YXR1cyAqKTsKIAogLyoKICAqIHZvbHVtZS5jCmRpZmYgLS1naXQgYS9mcy9hZnMvc3VwZXIuYyBiL2ZzL2Fmcy9zdXBlci5jCmluZGV4IGQyNGJlMzMuLjU3OWFmNjMgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9zdXBlci5jCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC0yMSwyMiArMjEsMjAgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAjZGVmaW5lIEFGU19GU19NQUdJQyAweDZCNDE0NjUzIC8qICdrQUZTJyAqLwogCiBzdGF0aWMgdm9pZCBhZnNfaV9pbml0X29uY2Uodm9pZCAqZm9vLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotCiBzdGF0aWMgaW50IGFmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCiAJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCiAJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKLQogc3RhdGljIHN0cnVjdCBpbm9kZSAqYWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwotCiBzdGF0aWMgdm9pZCBhZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwotCiBzdGF0aWMgdm9pZCBhZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK3N0YXRpYyBpbnQgYWZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpOwogCiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZnNfZnNfdHlwZSA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCkBAIC00Nyw3ICs0NSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYWZzX3N1cGVyX29wcyA9IHsKLQkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCisJLnN0YXRmcwkJPSBhZnNfc3RhdGZzLAogCS5hbGxvY19pbm9kZQk9IGFmc19hbGxvY19pbm9kZSwKIAkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAogCS53cml0ZV9pbm9kZQk9IGFmc193cml0ZV9pbm9kZSwKQEAgLTQ4OCw2ICs0ODYsNyBAQAogCXZub2RlLT5mbGFncwkJPSAxIDw8IEFGU19WTk9ERV9VTlNFVDsKIAl2bm9kZS0+Y2JfcHJvbWlzZWQJPSBmYWxzZTsKIAorCV9sZWF2ZSgiID0gJXAiLCAmdm5vZGUtPnZmc19pbm9kZSk7CiAJcmV0dXJuICZ2bm9kZS0+dmZzX2lub2RlOwogfQogCkBAIC00OTgsNyArNDk3LDcgQEAKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKIAotCV9lbnRlcigieyVsdX0iLCBpbm9kZS0+aV9pbm8pOworCV9lbnRlcigiJXB7JXg6JXV9IiwgaW5vZGUsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlKTsKIAogCV9kZWJ1ZygiREVTVFJPWSBJTk9ERSAlcCIsIGlub2RlKTsKIApAQCAtNTA3LDMgKzUwNiwzNiBAQAogCWttZW1fY2FjaGVfZnJlZShhZnNfaW5vZGVfY2FjaGVwLCB2bm9kZSk7CiAJYXRvbWljX2RlYygmYWZzX2NvdW50X2FjdGl2ZV9pbm9kZXMpOwogfQorCisvKgorICogcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IGFuIEFGUyB2b2x1bWUKKyAqLworc3RhdGljIGludCBhZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWZzX3ZvbHVtZV9zdGF0dXMgdnM7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBBRlNfRlNfSShkZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBrZXkgKmtleTsKKwlpbnQgcmV0OworCisJa2V5ID0gYWZzX3JlcXVlc3Rfa2V5KHZub2RlLT52b2x1bWUtPmNlbGwpOworCWlmIChJU19FUlIoa2V5KSkKKwkJcmV0dXJuIFBUUl9FUlIoa2V5KTsKKworCXJldCA9IGFmc192bm9kZV9nZXRfdm9sdW1lX3N0YXR1cyh2bm9kZSwga2V5LCAmdnMpOworCWtleV9wdXQoa2V5KTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlidWYtPmZfdHlwZQk9IGRlbnRyeS0+ZF9zYi0+c19tYWdpYzsKKwlidWYtPmZfYnNpemUJPSBBRlNfQkxPQ0tfU0laRTsKKwlidWYtPmZfbmFtZWxlbgk9IEFGU05BTUVNQVggLSAxOworCisJaWYgKHZzLm1heF9xdW90YSA9PSAwKQorCQlidWYtPmZfYmxvY2tzID0gdnMucGFydF9tYXhfYmxvY2tzOworCWVsc2UKKwkJYnVmLT5mX2Jsb2NrcyA9IHZzLm1heF9xdW90YTsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlID0gYnVmLT5mX2Jsb2NrcyAtIHZzLmJsb2Nrc19pbl91c2U7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9hZnMvdm5vZGUuYyBiL2ZzL2Fmcy92bm9kZS5jCmluZGV4IGVjODE0NjYuLmMzNmM5OGMgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy92bm9kZS5jCisrKyBiL2ZzL2Fmcy92bm9kZS5jCkBAIC0xNzUsMjQgKzE3NSwzMyBAQAogewogCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CiAKKwlfZW50ZXIoInslcH0iLCB2bm9kZS0+c2VydmVyKTsKKwogCXNldF9iaXQoQUZTX1ZOT0RFX0RFTEVURUQsICZ2bm9kZS0+ZmxhZ3MpOwogCiAJc2VydmVyID0gdm5vZGUtPnNlcnZlcjsKLQlpZiAodm5vZGUtPmNiX3Byb21pc2VkKSB7Ci0JCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwlpZiAoc2VydmVyKSB7CiAJCWlmICh2bm9kZS0+Y2JfcHJvbWlzZWQpIHsKLQkJCXJiX2VyYXNlKCZ2bm9kZS0+Y2JfcHJvbWlzZSwgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOwotCQkJdm5vZGUtPmNiX3Byb21pc2VkID0gZmFsc2U7CisJCQlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJCQlpZiAodm5vZGUtPmNiX3Byb21pc2VkKSB7CisJCQkJcmJfZXJhc2UoJnZub2RlLT5jYl9wcm9taXNlLAorCQkJCQkgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOworCQkJCXZub2RlLT5jYl9wcm9taXNlZCA9IGZhbHNlOworCQkJfQorCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CiAJCX0KLQkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisKKwkJc3Bpbl9sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCQlyYl9lcmFzZSgmdm5vZGUtPnNlcnZlcl9yYiwgJnNlcnZlci0+ZnNfdm5vZGVzKTsKKwkJc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7CisKKwkJdm5vZGUtPnNlcnZlciA9IE5VTEw7CisJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJfSBlbHNlIHsKKwkJQVNTRVJUKCF2bm9kZS0+Y2JfcHJvbWlzZWQpOwogCX0KIAotCXNwaW5fbG9jaygmdm5vZGUtPnNlcnZlci0+ZnNfbG9jayk7Ci0JcmJfZXJhc2UoJnZub2RlLT5zZXJ2ZXJfcmIsICZ2bm9kZS0+c2VydmVyLT5mc192bm9kZXMpOwotCXNwaW5fdW5sb2NrKCZ2bm9kZS0+c2VydmVyLT5mc19sb2NrKTsKLQotCXZub2RlLT5zZXJ2ZXIgPSBOVUxMOwotCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJX2xlYXZlKCIiKTsKIH0KIAogLyoKQEAgLTIyNSw3ICsyMzQsNyBAQAogICovCiBzdGF0aWMgdm9pZCBhZnNfdm5vZGVfc3RhdHVzX3VwZGF0ZV9mYWlsZWQoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsIGludCByZXQpCiB7Ci0JX2VudGVyKCIlcCwlZCIsIHZub2RlLCByZXQpOworCV9lbnRlcigieyV4OiV1fSwlZCIsIHZub2RlLT5maWQudmlkLCB2bm9kZS0+ZmlkLnZub2RlLCByZXQpOwogCiAJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CiAKQEAgLTg2MCwzICs4NjksNTUgQEAKIAlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOwogCXJldHVybiBQVFJfRVJSKHNlcnZlcik7CiB9CisKKy8qCisgKiBnZXQgdGhlIHN0YXR1cyBvZiBhIHZvbHVtZQorICovCitpbnQgYWZzX3Zub2RlX2dldF92b2x1bWVfc3RhdHVzKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLCBzdHJ1Y3Qga2V5ICprZXksCisJCQkJc3RydWN0IGFmc192b2x1bWVfc3RhdHVzICp2cykKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzeyV4OiV1LiV1fSwleCwiLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsCisJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICBrZXlfc2VyaWFsKGtleSkpOworCisJLyogdGhpcyBvcCB3aWxsIGZldGNoIHRoZSBzdGF0dXMgKi8KKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudCsrOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwlkbyB7CisJCS8qIHBpY2sgYSBzZXJ2ZXIgdG8gcXVlcnkgKi8KKwkJc2VydmVyID0gYWZzX3ZvbHVtZV9waWNrX2ZpbGVzZXJ2ZXIodm5vZGUpOworCQlpZiAoSVNfRVJSKHNlcnZlcikpCisJCQlnb3RvIG5vX3NlcnZlcjsKKworCQlfZGVidWcoIlVTSU5HIFNFUlZFUjogJTA4eFxuIiwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCXJldCA9IGFmc19mc19nZXRfdm9sdW1lX3N0YXR1cyhzZXJ2ZXIsIGtleSwgdm5vZGUsIHZzLCAmYWZzX3N5bmNfY2FsbCk7CisKKwl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUsIHNlcnZlciwgcmV0KSk7CisKKwkvKiBhZGp1c3QgdGhlIGZsYWdzICovCisJaWYgKHJldCA9PSAwKSB7CisJCWFmc192bm9kZV9maW5hbGlzZV9zdGF0dXNfdXBkYXRlKHZub2RlLCBzZXJ2ZXIpOworCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCX0gZWxzZSB7CisJCWFmc192bm9kZV9zdGF0dXNfdXBkYXRlX2ZhaWxlZCh2bm9kZSwgcmV0KTsKKwl9CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCitub19zZXJ2ZXI6CisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJdm5vZGUtPnVwZGF0ZV9jbnQtLTsKKwlBU1NFUlRDTVAodm5vZGUtPnVwZGF0ZV9jbnQsID49LCAwKTsKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCXJldHVybiBQVFJfRVJSKHNlcnZlcik7Cit9CmRpZmYgLS1naXQgYS9mcy9hZnMvd3JpdGUuYyBiL2ZzL2Fmcy93cml0ZS5jCmluZGV4IDY3YWU0ZGIuLjI4ZjM3NTEgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy93cml0ZS5jCisrKyBiL2ZzL2Fmcy93cml0ZS5jCkBAIC0zOTUsOCArMzk1LDkgQEAKIAkJaWYgKG4gPT0gMCkKIAkJCWdvdG8gbm9fbW9yZTsKIAkJaWYgKHBhZ2VzWzBdLT5pbmRleCAhPSBzdGFydCkgewotCQkJZm9yIChuLS07IG4gPj0gMDsgbi0tKQotCQkJCXB1dF9wYWdlKHBhZ2VzW25dKTsKKwkJCWRvIHsKKwkJCQlwdXRfcGFnZShwYWdlc1stLW5dKTsKKwkJCX0gd2hpbGUgKG4gPiAwKTsKIAkJCWdvdG8gbm9fbW9yZTsKIAkJfQogCmRpZmYgLS1naXQgYS9mcy9haW8uYyBiL2ZzL2Fpby5jCmluZGV4IGFjMWMxNTguLmRiZTY5OWUgMTAwNjQ0Ci0tLSBhL2ZzL2Fpby5jCisrKyBiL2ZzL2Fpby5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXZlbnRmZC5oPgogCiAjaW5jbHVkZSA8YXNtL2ttYXBfdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDE3LDYgKzQxOCw3IEBACiAJcmVxLT5wcml2YXRlID0gTlVMTDsKIAlyZXEtPmtpX2lvdmVjID0gTlVMTDsKIAlJTklUX0xJU1RfSEVBRCgmcmVxLT5raV9ydW5fbGlzdCk7CisJcmVxLT5raV9ldmVudGZkID0gRVJSX1BUUigtRUlOVkFMKTsKIAogCS8qIENoZWNrIGlmIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGhhcyBlbm91Z2ggZnJlZSBzcGFjZSB0bwogCSAqIGFjY2VwdCBhbiBldmVudCBmcm9tIHRoaXMgaW8uCkBAIC00NTgsNiArNDYwLDggQEAKIHsKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmN0eC0+Y3R4X2xvY2spOwogCisJaWYgKCFJU19FUlIocmVxLT5raV9ldmVudGZkKSkKKwkJZnB1dChyZXEtPmtpX2V2ZW50ZmQpOwogCWlmIChyZXEtPmtpX2R0b3IpCiAJCXJlcS0+a2lfZHRvcihyZXEpOwogCWlmIChyZXEtPmtpX2lvdmVjICE9ICZyZXEtPmtpX2lubGluZV92ZWMpCkBAIC05NDIsNiArOTQ2LDE0IEBACiAJCXJldHVybiAxOwogCX0KIAorCS8qCisJICogQ2hlY2sgaWYgdGhlIHVzZXIgYXNrZWQgdXMgdG8gZGVsaXZlciB0aGUgcmVzdWx0IHRocm91Z2ggYW4KKwkgKiBldmVudGZkLiBUaGUgZXZlbnRmZF9zaWduYWwoKSBmdW5jdGlvbiBpcyBzYWZlIHRvIGJlIGNhbGxlZAorCSAqIGZyb20gSVJRIGNvbnRleHQuCisJICovCisJaWYgKCFJU19FUlIoaW9jYi0+a2lfZXZlbnRmZCkpCisJCWV2ZW50ZmRfc2lnbmFsKGlvY2ItPmtpX2V2ZW50ZmQsIDEpOworCiAJaW5mbyA9ICZjdHgtPnJpbmdfaW5mbzsKIAogCS8qIGFkZCBhIGNvbXBsZXRpb24gZXZlbnQgdG8gdGhlIHJpbmcgYnVmZmVyLgpAQCAtMTUyNiw4ICsxNTM4LDcgQEAKIAlzc2l6ZV90IHJldDsKIAogCS8qIGVuZm9yY2UgZm9yd2FyZHMgY29tcGF0aWJpbGl0eSBvbiB1c2VycyAqLwotCWlmICh1bmxpa2VseShpb2NiLT5haW9fcmVzZXJ2ZWQxIHx8IGlvY2ItPmFpb19yZXNlcnZlZDIgfHwKLQkJICAgICBpb2NiLT5haW9fcmVzZXJ2ZWQzKSkgeworCWlmICh1bmxpa2VseShpb2NiLT5haW9fcmVzZXJ2ZWQxIHx8IGlvY2ItPmFpb19yZXNlcnZlZDIpKSB7CiAJCXByX2RlYnVnKCJFSU5WQUw6IGlvX3N1Ym1pdDogcmVzZXJ2ZSBmaWVsZCBzZXRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNTUxLDYgKzE1NjIsMTkgQEAKIAkJZnB1dChmaWxlKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQorCWlmIChpb2NiLT5haW9fZmxhZ3MgJiBJT0NCX0ZMQUdfUkVTRkQpIHsKKwkJLyoKKwkJICogSWYgdGhlIElPQ0JfRkxBR19SRVNGRCBmbGFnIG9mIGFpb19mbGFncyBpcyBzZXQsIGdldCBhbgorCQkgKiBpbnN0YW5jZSBvZiB0aGUgZmlsZSogbm93LiBUaGUgZmlsZSBkZXNjcmlwdG9yIG11c3QgYmUKKwkJICogYW4gZXZlbnRmZCgpIGZkLCBhbmQgd2lsbCBiZSBzaWduYWxlZCBmb3IgZWFjaCBjb21wbGV0ZWQKKwkJICogZXZlbnQgdXNpbmcgdGhlIGV2ZW50ZmRfc2lnbmFsKCkgZnVuY3Rpb24uCisJCSAqLworCQlyZXEtPmtpX2V2ZW50ZmQgPSBldmVudGZkX2ZnZXQoKGludCkgaW9jYi0+YWlvX3Jlc2ZkKTsKKwkJaWYgKHVubGlrZWx5KElTX0VSUihyZXEtPmtpX2V2ZW50ZmQpKSkgeworCQkJcmV0ID0gUFRSX0VSUihyZXEtPmtpX2V2ZW50ZmQpOworCQkJZ290byBvdXRfcHV0X3JlcTsKKwkJfQorCX0KIAogCXJlcS0+a2lfZmlscCA9IGZpbGU7CiAJcmV0ID0gcHV0X3VzZXIocmVxLT5raV9rZXksICZ1c2VyX2lvY2ItPmFpb19rZXkpOwpkaWZmIC0tZ2l0IGEvZnMvYW5vbl9pbm9kZXMuYyBiL2ZzL2Fub25faW5vZGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmZTNhMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fub25faW5vZGVzLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiAgZnMvYW5vbl9pbm9kZXMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKiAgVGhhbmtzIHRvIEFybmQgQmVyZ21hbm4gZm9yIGNvZGUgcmV2aWV3IGFuZCBzdWdnZXN0aW9ucy4KKyAqICBNb3JlIGNoYW5nZXMgZm9yIFRob21hcyBHbGVpeG5lciBzdWdnZXN0aW9ucy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbm9uX2lub2Rlcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqYW5vbl9pbm9kZV9tbnQgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFub25faW5vZGVfaW5vZGU7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhbm9uX2lub2RlX2ZvcHM7CisKK3N0YXRpYyBpbnQgYW5vbl9pbm9kZWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLAorCQkJICAgICAgIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXJldHVybiBnZXRfc2JfcHNldWRvKGZzX3R5cGUsICJhbm9uX2lub2RlOiIsIE5VTEwsIEFOT05fSU5PREVfRlNfTUFHSUMsCisJCQkgICAgIG1udCk7Cit9CisKK3N0YXRpYyBpbnQgYW5vbl9pbm9kZWZzX2RlbGV0ZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCS8qCisJICogV2UgZmFrZWQgdmZzIHRvIGJlbGlldmUgdGhlIGRlbnRyeSB3YXMgaGFzaGVkIHdoZW4gd2UgY3JlYXRlZCBpdC4KKwkgKiBOb3cgd2UgcmVzdG9yZSB0aGUgZmxhZyBzbyB0aGF0IGRwdXQoKSB3aWxsIHdvcmsgY29ycmVjdGx5LgorCSAqLworCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfVU5IQVNIRUQ7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhbm9uX2lub2RlX2ZzX3R5cGUgPSB7CisJLm5hbWUJCT0gImFub25faW5vZGVmcyIsCisJLmdldF9zYgkJPSBhbm9uX2lub2RlZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorfTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYW5vbl9pbm9kZWZzX2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX2RlbGV0ZQk9IGFub25faW5vZGVmc19kZWxldGVfZGVudHJ5LAorfTsKKworLyoqCisgKiBhbm9uX2lub2RlX2dldGZkIC0gY3JlYXRlcyBhIG5ldyBmaWxlIGluc3RhbmNlIGJ5IGhvb2tpbmcgaXQgdXAgdG8gYW5kCisgKiAgICAgICAgICAgICAgICAgICAgYW5vbnltb3VzIGlub2RlLCBhbmQgYSBkZW50cnkgdGhhdCBkZXNjcmliZSB0aGUgImNsYXNzIgorICogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmaWxlCisgKgorICogQHBmZDogICAgIFtvdXRdICAgcG9pbnRlciB0byB0aGUgZmlsZSBkZXNjcmlwdG9yCisgKiBAZHBpbm9kZTogW291dF0gICBwb2ludGVyIHRvIHRoZSBpbm9kZQorICogQHBmaWxlOiAgIFtvdXRdICAgcG9pbnRlciB0byB0aGUgZmlsZSBzdHJ1Y3QKKyAqIEBuYW1lOiAgICBbaW5dICAgIG5hbWUgb2YgdGhlICJjbGFzcyIgb2YgdGhlIG5ldyBmaWxlCisgKiBAZm9wcyAgICAgW2luXSAgICBmaWxlIG9wZXJhdGlvbnMgZm9yIHRoZSBuZXcgZmlsZQorICogQHByaXYgICAgIFtpbl0gICAgcHJpdmF0ZSBkYXRhIGZvciB0aGUgbmV3IGZpbGUgKHdpbGwgYmUgZmlsZSdzIHByaXZhdGVfZGF0YSkKKyAqCisgKiBDcmVhdGVzIGEgbmV3IGZpbGUgYnkgaG9va2luZyBpdCBvbiBhIHNpbmdsZSBpbm9kZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGZpbGVzCisgKiB0aGF0IGRvIG5vdCBuZWVkIHRvIGhhdmUgYSBmdWxsLWZsZWRnZWQgaW5vZGUgaW4gb3JkZXIgdG8gb3BlcmF0ZSBjb3JyZWN0bHkuCisgKiBBbGwgdGhlIGZpbGVzIGNyZWF0ZWQgd2l0aCBhbm9uX2lub2RlX2dldGZkKCkgd2lsbCBzaGFyZSBhIHNpbmdsZSBpbm9kZSwgYnkKKyAqIGhlbmNlIHNhdmluZyBtZW1vcnkgYW5kIGF2b2lkaW5nIGNvZGUgZHVwbGljYXRpb24gZm9yIHRoZSBmaWxlL2lub2RlL2RlbnRyeQorICogc2V0dXAuCisgKi8KK2ludCBhbm9uX2lub2RlX2dldGZkKGludCAqcGZkLCBzdHJ1Y3QgaW5vZGUgKipwaW5vZGUsIHN0cnVjdCBmaWxlICoqcGZpbGUsCisJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywKKwkJICAgICB2b2lkICpwcml2KQoreworCXN0cnVjdCBxc3RyIHRoaXM7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGVycm9yLCBmZDsKKworCWlmIChJU19FUlIoYW5vbl9pbm9kZV9pbm9kZSkpCisJCXJldHVybiAtRU5PREVWOworCWZpbGUgPSBnZXRfZW1wdHlfZmlscCgpOworCWlmICghZmlsZSkKKwkJcmV0dXJuIC1FTkZJTEU7CisKKwlpbm9kZSA9IGlncmFiKGFub25faW5vZGVfaW5vZGUpOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCWVycm9yID0gUFRSX0VSUihpbm9kZSk7CisJCWdvdG8gZXJyX3B1dF9maWxwOworCX0KKworCWVycm9yID0gZ2V0X3VudXNlZF9mZCgpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyX2lwdXQ7CisJZmQgPSBlcnJvcjsKKworCS8qCisJICogTGluayB0aGUgaW5vZGUgdG8gYSBkaXJlY3RvcnkgZW50cnkgYnkgY3JlYXRpbmcgYSB1bmlxdWUgbmFtZQorCSAqIHVzaW5nIHRoZSBpbm9kZSBzZXF1ZW5jZSBudW1iZXIuCisJICovCisJZXJyb3IgPSAtRU5PTUVNOworCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy5sZW4gPSBzdHJsZW4obmFtZSk7CisJdGhpcy5oYXNoID0gMDsKKwlkZW50cnkgPSBkX2FsbG9jKGFub25faW5vZGVfbW50LT5tbnRfc2ItPnNfcm9vdCwgJnRoaXMpOworCWlmICghZGVudHJ5KQorCQlnb3RvIGVycl9wdXRfdW51c2VkX2ZkOworCWRlbnRyeS0+ZF9vcCA9ICZhbm9uX2lub2RlZnNfZGVudHJ5X29wZXJhdGlvbnM7CisJLyogRG8gbm90IHB1Ymxpc2ggdGhpcyBkZW50cnkgaW5zaWRlIHRoZSBnbG9iYWwgZGVudHJ5IGhhc2ggdGFibGUgKi8KKwlkZW50cnktPmRfZmxhZ3MgJj0gfkRDQUNIRV9VTkhBU0hFRDsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCisJZmlsZS0+Zl9wYXRoLm1udCA9IG1udGdldChhbm9uX2lub2RlX21udCk7CisJZmlsZS0+Zl9wYXRoLmRlbnRyeSA9IGRlbnRyeTsKKwlmaWxlLT5mX21hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCisJZmlsZS0+Zl9wb3MgPSAwOworCWZpbGUtPmZfZmxhZ3MgPSBPX1JEV1I7CisJZmlsZS0+Zl9vcCA9IGZvcHM7CisJZmlsZS0+Zl9tb2RlID0gRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFOworCWZpbGUtPmZfdmVyc2lvbiA9IDA7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcHJpdjsKKworCWZkX2luc3RhbGwoZmQsIGZpbGUpOworCisJKnBmZCA9IGZkOworCSpwaW5vZGUgPSBpbm9kZTsKKwkqcGZpbGUgPSBmaWxlOworCXJldHVybiAwOworCitlcnJfcHV0X3VudXNlZF9mZDoKKwlwdXRfdW51c2VkX2ZkKGZkKTsKK2Vycl9pcHV0OgorCWlwdXQoaW5vZGUpOworZXJyX3B1dF9maWxwOgorCXB1dF9maWxwKGZpbGUpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEEgc2luZ2xlIGlub2RlIGV4aXN0IGZvciBhbGwgYW5vbl9pbm9kZSBmaWxlcy4gQ29udHJhcnkgdG8gcGlwZXMsCisgKiBhbm9uX2lub2RlIGlub2RlcyBoYXMgbm8gcGVyLWluc3RhbmNlIGRhdGEgYXNzb2NpYXRlZCwgc28gd2UgY2FuIGF2b2lkCisgKiB0aGUgYWxsb2NhdGlvbiBvZiBtdWx0aXBsZSBvZiB0aGVtLgorICovCitzdGF0aWMgc3RydWN0IGlub2RlICphbm9uX2lub2RlX21raW5vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKGFub25faW5vZGVfbW50LT5tbnRfc2IpOworCisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpbm9kZS0+aV9mb3AgPSAmYW5vbl9pbm9kZV9mb3BzOworCisJLyoKKwkgKiBNYXJrIHRoZSBpbm9kZSBkaXJ0eSBmcm9tIHRoZSB2ZXJ5IGJlZ2lubmluZywKKwkgKiB0aGF0IHdheSBpdCB3aWxsIG5ldmVyIGJlIG1vdmVkIHRvIHRoZSBkaXJ0eQorCSAqIGxpc3QgYmVjYXVzZSBtYXJrX2lub2RlX2RpcnR5KCkgd2lsbCB0aGluaworCSAqIHRoYXQgaXQgYWxyZWFkeSBfaXNfIG9uIHRoZSBkaXJ0eSBsaXN0LgorCSAqLworCWlub2RlLT5pX3N0YXRlID0gSV9ESVJUWTsKKwlpbm9kZS0+aV9tb2RlID0gU19JUlVTUiB8IFNfSVdVU1I7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCXJldHVybiBpbm9kZTsKK30KKworc3RhdGljIGludCBfX2luaXQgYW5vbl9pbm9kZV9pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZhbm9uX2lub2RlX2ZzX3R5cGUpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJfZXhpdDsKKwlhbm9uX2lub2RlX21udCA9IGtlcm5fbW91bnQoJmFub25faW5vZGVfZnNfdHlwZSk7CisJaWYgKElTX0VSUihhbm9uX2lub2RlX21udCkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKGFub25faW5vZGVfbW50KTsKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9maWxlc3lzdGVtOworCX0KKwlhbm9uX2lub2RlX2lub2RlID0gYW5vbl9pbm9kZV9ta2lub2RlKCk7CisJaWYgKElTX0VSUihhbm9uX2lub2RlX2lub2RlKSkgeworCQllcnJvciA9IFBUUl9FUlIoYW5vbl9pbm9kZV9pbm9kZSk7CisJCWdvdG8gZXJyX21udHB1dDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX21udHB1dDoKKwltbnRwdXQoYW5vbl9pbm9kZV9tbnQpOworZXJyX3VucmVnaXN0ZXJfZmlsZXN5c3RlbToKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFub25faW5vZGVfZnNfdHlwZSk7CitlcnJfZXhpdDoKKwlwYW5pYyhLRVJOX0VSUiAiYW5vbl9pbm9kZV9pbml0KCkgZmFpbGVkICglZClcbiIsIGVycm9yKTsKK30KKworZnNfaW5pdGNhbGwoYW5vbl9pbm9kZV9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL2F1dG9mc19pLmggYi9mcy9hdXRvZnMvYXV0b2ZzX2kuaAppbmRleCA0ZWY1NDQ0Li44YjRjY2EzIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvYXV0b2ZzX2kuaAorKysgYi9mcy9hdXRvZnMvYXV0b2ZzX2kuaApAQCAtMTAxLDcgKzEwMSw3IEBACiBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gewogCXUzMiBtYWdpYzsKIAlzdHJ1Y3QgZmlsZSAqcGlwZTsKLQlwaWRfdCBvel9wZ3JwOworCXN0cnVjdCBwaWQgKm96X3BncnA7CiAJaW50IGNhdGF0b25pYzsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwogCXVuc2lnbmVkIGxvbmcgZXhwX3RpbWVvdXQ7CkBAIC0xMjIsNyArMTIyLDcgQEAKICAgIGZpbGVzeXN0ZW0gd2l0aG91dCAibWFnaWMiLikgKi8KIAogc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzX296X21vZGUoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkpIHsKLQlyZXR1cm4gc2JpLT5jYXRhdG9uaWMgfHwgcHJvY2Vzc19ncm91cChjdXJyZW50KSA9PSBzYmktPm96X3BncnA7CisJcmV0dXJuIHNiaS0+Y2F0YXRvbmljIHx8IHRhc2tfcGdycChjdXJyZW50KSA9PSBzYmktPm96X3BncnA7CiB9CiAKIC8qIEhhc2ggb3BlcmF0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL2lub2RlLmMgYi9mcy9hdXRvZnMvaW5vZGUuYwppbmRleCBhYTBiNjFmLi5lNzIwNGQ3IDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvaW5vZGUuYworKysgYi9mcy9hdXRvZnMvaW5vZGUuYwpAQCAtMzQsMTIgKzM0LDE0IEBACiAJaWYgKCFzYmkpCiAJCWdvdG8gb3V0X2tpbGxfc2I7CiAKLQlpZiAoICFzYmktPmNhdGF0b25pYyApCisJaWYgKCFzYmktPmNhdGF0b25pYykKIAkJYXV0b2ZzX2NhdGF0b25pY19tb2RlKHNiaSk7IC8qIEZyZWUgd2FpdCBxdWV1ZXMsIGNsb3NlIHBpcGUgKi8KIAorCXB1dF9waWQoc2JpLT5vel9wZ3JwKTsKKwogCWF1dG9mc19oYXNoX251a2Uoc2JpKTsKLQlmb3IgKCBuID0gMCA7IG4gPCBBVVRPRlNfTUFYX1NZTUxJTktTIDsgbisrICkgewotCQlpZiAoIHRlc3RfYml0KG4sIHNiaS0+c3ltbGlua19iaXRtYXApICkKKwlmb3IgKG4gPSAwOyBuIDwgQVVUT0ZTX01BWF9TWU1MSU5LUzsgbisrKSB7CisJCWlmICh0ZXN0X2JpdChuLCBzYmktPnN5bWxpbmtfYml0bWFwKSkKIAkJCWtmcmVlKHNiaS0+c3ltbGlua1tuXS5kYXRhKTsKIAl9CiAKQEAgLTY5LDcgKzcxLDggQEAKIAl7T3B0X2VyciwgTlVMTH0KIH07CiAKLXN0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBpbnQgKnBpcGVmZCwgdWlkX3QgKnVpZCwgZ2lkX3QgKmdpZCwgcGlkX3QgKnBncnAsIGludCAqbWlucHJvdG8sIGludCAqbWF4cHJvdG8pCitzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgaW50ICpwaXBlZmQsIHVpZF90ICp1aWQsIGdpZF90ICpnaWQsCisJCXBpZF90ICpwZ3JwLCBpbnQgKm1pbnByb3RvLCBpbnQgKm1heHByb3RvKQogewogCWNoYXIgKnA7CiAJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwpAQCAtMTM4LDkgKzE0MSwxMCBAQAogCWludCBwaXBlZmQ7CiAJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmk7CiAJaW50IG1pbnByb3RvLCBtYXhwcm90bzsKKwlwaWRfdCBwZ2lkOwogCiAJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwotCWlmICggIXNiaSApCisJaWYgKCFzYmkpCiAJCWdvdG8gZmFpbF91bmxvY2s7CiAJRFBSSU5USygoImF1dG9mczogc3RhcnRpbmcgdXAsIHNiaSA9ICVwXG4iLHNiaSkpOwogCkBAIC0xNDksNyArMTUzLDYgQEAKIAlzYmktPnBpcGUgPSBOVUxMOwogCXNiaS0+Y2F0YXRvbmljID0gMTsKIAlzYmktPmV4cF90aW1lb3V0ID0gMDsKLQlzYmktPm96X3BncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOwogCWF1dG9mc19pbml0aWFsaXplX2hhc2goJnNiaS0+ZGlyaGFzaCk7CiAJc2JpLT5xdWV1ZXMgPSBOVUxMOwogCW1lbXNldChzYmktPnN5bWxpbmtfYml0bWFwLCAwLCBzaXplb2YobG9uZykqQVVUT0ZTX1NZTUxJTktfQklUTUFQX0xFTik7CkBAIC0xNjksMjYgKzE3MiwzNiBAQAogCQlnb3RvIGZhaWxfaXB1dDsKIAogCS8qIENhbiB0aGlzIGNhbGwgYmxvY2s/ICAtIFdURiBjYXJlcz8gcyBpcyBsb2NrZWQuICovCi0JaWYgKCBwYXJzZV9vcHRpb25zKGRhdGEsJnBpcGVmZCwmcm9vdF9pbm9kZS0+aV91aWQsJnJvb3RfaW5vZGUtPmlfZ2lkLCZzYmktPm96X3BncnAsJm1pbnByb3RvLCZtYXhwcm90bykgKSB7CisJaWYgKHBhcnNlX29wdGlvbnMoZGF0YSwgJnBpcGVmZCwgJnJvb3RfaW5vZGUtPmlfdWlkLAorCQkJCSZyb290X2lub2RlLT5pX2dpZCwgJnBnaWQsICZtaW5wcm90bywKKwkJCQkmbWF4cHJvdG8pKSB7CiAJCXByaW50aygiYXV0b2ZzOiBjYWxsZWQgd2l0aCBib2d1cyBvcHRpb25zXG4iKTsKIAkJZ290byBmYWlsX2RwdXQ7CiAJfQogCiAJLyogQ291bGRuJ3QgdGhpcyBiZSB0ZXN0ZWQgZWFybGllcj8gKi8KLQlpZiAoIG1pbnByb3RvID4gQVVUT0ZTX1BST1RPX1ZFUlNJT04gfHwgCi0JICAgICBtYXhwcm90byA8IEFVVE9GU19QUk9UT19WRVJTSU9OICkgeworCWlmIChtaW5wcm90byA+IEFVVE9GU19QUk9UT19WRVJTSU9OIHx8CisJICAgICBtYXhwcm90byA8IEFVVE9GU19QUk9UT19WRVJTSU9OKSB7CiAJCXByaW50aygiYXV0b2ZzOiBrZXJuZWwgZG9lcyBub3QgbWF0Y2ggZGFlbW9uIHZlcnNpb25cbiIpOwogCQlnb3RvIGZhaWxfZHB1dDsKIAl9CiAKLQlEUFJJTlRLKCgiYXV0b2ZzOiBwaXBlIGZkID0gJWQsIHBncnAgPSAldVxuIiwgcGlwZWZkLCBzYmktPm96X3BncnApKTsKLQlwaXBlID0gZmdldChwaXBlZmQpOwotCQotCWlmICggIXBpcGUgKSB7Ci0JCXByaW50aygiYXV0b2ZzOiBjb3VsZCBub3Qgb3BlbiBwaXBlIGZpbGUgZGVzY3JpcHRvclxuIik7CisJRFBSSU5USygoImF1dG9mczogcGlwZSBmZCA9ICVkLCBwZ3JwID0gJXVcbiIsIHBpcGVmZCwgcGdpZCkpOworCXNiaS0+b3pfcGdycCA9IGZpbmRfZ2V0X3BpZChwZ2lkKTsKKworCWlmICghc2JpLT5vel9wZ3JwKSB7CisJCXByaW50aygiYXV0b2ZzOiBjb3VsZCBub3QgZmluZCBwcm9jZXNzIGdyb3VwICVkXG4iLCBwZ2lkKTsKIAkJZ290byBmYWlsX2RwdXQ7CiAJfQotCWlmICggIXBpcGUtPmZfb3AgfHwgIXBpcGUtPmZfb3AtPndyaXRlICkKKworCXBpcGUgPSBmZ2V0KHBpcGVmZCk7CisJCisJaWYgKCFwaXBlKSB7CisJCXByaW50aygiYXV0b2ZzOiBjb3VsZCBub3Qgb3BlbiBwaXBlIGZpbGUgZGVzY3JpcHRvclxuIik7CisJCWdvdG8gZmFpbF9wdXRfcGlkOworCX0KKworCWlmICghcGlwZS0+Zl9vcCB8fCAhcGlwZS0+Zl9vcC0+d3JpdGUpCiAJCWdvdG8gZmFpbF9mcHV0OwogCXNiaS0+cGlwZSA9IHBpcGU7CiAJc2JpLT5jYXRhdG9uaWMgPSAwOwpAQCAtMjAyLDYgKzIxNSw4IEBACiBmYWlsX2ZwdXQ6CiAJcHJpbnRrKCJhdXRvZnM6IHBpcGUgZmlsZSBkZXNjcmlwdG9yIGRvZXMgbm90IGNvbnRhaW4gcHJvcGVyIG9wc1xuIik7CiAJZnB1dChwaXBlKTsKK2ZhaWxfcHV0X3BpZDoKKwlwdXRfcGlkKHNiaS0+b3pfcGdycCk7CiBmYWlsX2RwdXQ6CiAJZHB1dChyb290KTsKIAlnb3RvIGZhaWxfZnJlZTsKQEAgLTIzMCw3ICsyNDUsNyBAQAogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCi0JaWYgKCBpbm8gPT0gQVVUT0ZTX1JPT1RfSU5PICkgeworCWlmIChpbm8gPT0gQVVUT0ZTX1JPT1RfSU5PKSB7CiAJCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08gfCBTX0lXVVNSOwogCQlpbm9kZS0+aV9vcCA9ICZhdXRvZnNfcm9vdF9pbm9kZV9vcGVyYXRpb25zOwogCQlpbm9kZS0+aV9mb3AgPSAmYXV0b2ZzX3Jvb3Rfb3BlcmF0aW9uczsKQEAgLTI0MSwxMiArMjU2LDEyIEBACiAJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV91aWQ7CiAJaW5vZGUtPmlfZ2lkID0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9naWQ7CiAJCi0JaWYgKCBpbm8gPj0gQVVUT0ZTX0ZJUlNUX1NZTUxJTksgJiYgaW5vIDwgQVVUT0ZTX0ZJUlNUX0RJUl9JTk8gKSB7CisJaWYgKGlubyA+PSBBVVRPRlNfRklSU1RfU1lNTElOSyAmJiBpbm8gPCBBVVRPRlNfRklSU1RfRElSX0lOTykgewogCQkvKiBTeW1saW5rIGlub2RlIC0gc2hvdWxkIGJlIGluIHN5bWxpbmsgbGlzdCAqLwogCQlzdHJ1Y3QgYXV0b2ZzX3N5bWxpbmsgKnNsOwogCiAJCW4gPSBpbm8gLSBBVVRPRlNfRklSU1RfU1lNTElOSzsKLQkJaWYgKCBuID49IEFVVE9GU19NQVhfU1lNTElOS1MgfHwgIXRlc3RfYml0KG4sc2JpLT5zeW1saW5rX2JpdG1hcCkpIHsKKwkJaWYgKG4gPj0gQVVUT0ZTX01BWF9TWU1MSU5LUyB8fCAhdGVzdF9iaXQobixzYmktPnN5bWxpbmtfYml0bWFwKSkgewogCQkJcHJpbnRrKCJhdXRvZnM6IExvb2tpbmcgZm9yIGJhZCBzeW1saW5rIGlub2RlICV1XG4iLCAodW5zaWduZWQgaW50KSBpbm8pOwogCQkJcmV0dXJuOwogCQl9CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvcm9vdC5jIGIvZnMvYXV0b2ZzL3Jvb3QuYwppbmRleCBmMjU5NzIwLi5jMTQ4OTUzIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvcm9vdC5jCisrKyBiL2ZzL2F1dG9mcy9yb290LmMKQEAgLTY3LDggKzY3LDggQEAKIAkJZmlscC0+Zl9wb3MgPSArK25yOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAlkZWZhdWx0OgotCQl3aGlsZSAoIG9uciA9IG5yLCBlbnQgPSBhdXRvZnNfaGFzaF9lbnVtKGRpcmhhc2gsJm5yLGVudCkgKSB7Ci0JCQlpZiAoICFlbnQtPmRlbnRyeSB8fCBkX21vdW50cG9pbnQoZW50LT5kZW50cnkpICkgeworCQl3aGlsZSAob25yID0gbnIsIGVudCA9IGF1dG9mc19oYXNoX2VudW0oZGlyaGFzaCwmbnIsZW50KSkgeworCQkJaWYgKCFlbnQtPmRlbnRyeSB8fCBkX21vdW50cG9pbnQoZW50LT5kZW50cnkpKSB7CiAJCQkJaWYgKGZpbGxkaXIoZGlyZW50LGVudC0+bmFtZSxlbnQtPmxlbixvbnIsZW50LT5pbm8sRFRfVU5LTk9XTikgPCAwKQogCQkJCQlnb3RvIG91dDsKIAkJCQlmaWxwLT5mX3BvcyA9IG5yOwpAQCAtODgsMTAgKzg4LDEwIEBACiAJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQlpZiAoICEoZW50ID0gYXV0b2ZzX2hhc2hfbG9va3VwKCZzYmktPmRpcmhhc2gsICZkZW50cnktPmRfbmFtZSkpICkgeworCWlmICghKGVudCA9IGF1dG9mc19oYXNoX2xvb2t1cCgmc2JpLT5kaXJoYXNoLCAmZGVudHJ5LT5kX25hbWUpKSkgewogCQlkbyB7Ci0JCQlpZiAoIHN0YXR1cyAmJiBkZW50cnktPmRfaW5vZGUgKSB7Ci0JCQkJaWYgKCBzdGF0dXMgIT0gLUVOT0VOVCApCisJCQlpZiAoc3RhdHVzICYmIGRlbnRyeS0+ZF9pbm9kZSkgeworCQkJCWlmIChzdGF0dXMgIT0gLUVOT0VOVCkKIAkJCQkJcHJpbnRrKCJhdXRvZnMgd2FybmluZzogbG9va3VwIGZhaWx1cmUgb24gcG9zaXRpdmUgZGVudHJ5LCBzdGF0dXMgPSAlZCwgbmFtZSA9ICVzXG4iLCBzdGF0dXMsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCQkJCXJldHVybiAwOyAvKiBUcnkgdG8gZ2V0IHRoZSBrZXJuZWwgdG8gaW52YWxpZGF0ZSB0aGlzIGRlbnRyeSAqLwogCQkJfQpAQCAtMTA2LDcgKzEwNiw3IEBACiAJCQkJcmV0dXJuIDE7CiAJCQl9CiAJCQlzdGF0dXMgPSBhdXRvZnNfd2FpdChzYmksICZkZW50cnktPmRfbmFtZSk7Ci0JCX0gd2hpbGUgKCEoZW50ID0gYXV0b2ZzX2hhc2hfbG9va3VwKCZzYmktPmRpcmhhc2gsICZkZW50cnktPmRfbmFtZSkpICk7CisJCX0gd2hpbGUgKCEoZW50ID0gYXV0b2ZzX2hhc2hfbG9va3VwKCZzYmktPmRpcmhhc2gsICZkZW50cnktPmRfbmFtZSkpKTsKIAl9CiAKIAkvKiBBYnVzZSB0aGlzIGZpZWxkIGFzIGEgcG9pbnRlciB0byB0aGUgZGlyZWN0b3J5IGVudHJ5LCB1c2VkIHRvCkBAIC0xMjQsMTMgKzEyNCwxMyBAQAogCiAJLyogSWYgdGhpcyBpcyBhIGRpcmVjdG9yeSB0aGF0IGlzbid0IGEgbW91bnQgcG9pbnQsIGJpdGNoIGF0IHRoZQogCSAgIGRhZW1vbiBhbmQgZml4IGl0IGluIHVzZXIgc3BhY2UgKi8KLQlpZiAoIFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpICYmICFkX21vdW50cG9pbnQoZGVudHJ5KSApIHsKKwlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgJiYgIWRfbW91bnRwb2ludChkZW50cnkpKSB7CiAJCXJldHVybiAhYXV0b2ZzX3dhaXQoc2JpLCAmZGVudHJ5LT5kX25hbWUpOwogCX0KIAogCS8qIFdlIGRvbid0IHVwZGF0ZSB0aGUgdXNhZ2VzIGZvciB0aGUgYXV0b2ZzIGRhZW1vbiBpdHNlbGYsIHRoaXMKIAkgICBpcyBuZWNlc3NhcnkgZm9yIHJlY3Vyc2l2ZSBhdXRvZnMgbW91bnRzICovCi0JaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSApIHsKKwlpZiAoIWF1dG9mc19vel9tb2RlKHNiaSkpIHsKIAkJYXV0b2ZzX3VwZGF0ZV91c2FnZSgmc2JpLT5kaXJoYXNoLGVudCk7CiAJfQogCkBAIC0xNTcsNyArMTU3LDcgQEAKIAlzYmkgPSBhdXRvZnNfc2JpKGRpci0+aV9zYik7CiAKIAkvKiBQZW5kaW5nIGRlbnRyeSAqLwotCWlmICggZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX0FVVE9GU19QRU5ESU5HICkgeworCWlmIChkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfQVVUT0ZTX1BFTkRJTkcpIHsKIAkJaWYgKGF1dG9mc19vel9tb2RlKHNiaSkpCiAJCQlyZXMgPSAxOwogCQllbHNlCkBAIC0xNzMsNyArMTczLDcgQEAKIAl9CiAJCQogCS8qIENoZWNrIGZvciBhIG5vbi1tb3VudHBvaW50IGRpcmVjdG9yeSAqLwotCWlmICggU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgJiYgIWRfbW91bnRwb2ludChkZW50cnkpICkgeworCWlmIChTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJiAhZF9tb3VudHBvaW50KGRlbnRyeSkpIHsKIAkJaWYgKGF1dG9mc19vel9tb2RlKHNiaSkpCiAJCQlyZXMgPSAxOwogCQllbHNlCkBAIC0xODMsOSArMTgzLDkgQEAKIAl9CiAKIAkvKiBVcGRhdGUgdGhlIHVzYWdlIGxpc3QgKi8KLQlpZiAoICFhdXRvZnNfb3pfbW9kZShzYmkpICkgeworCWlmICghYXV0b2ZzX296X21vZGUoc2JpKSkgewogCQllbnQgPSAoc3RydWN0IGF1dG9mc19kaXJfZW50ICopIGRlbnRyeS0+ZF90aW1lOwotCQlpZiAoIGVudCApCisJCWlmIChlbnQpCiAJCQlhdXRvZnNfdXBkYXRlX3VzYWdlKCZzYmktPmRpcmhhc2gsZW50KTsKIAl9CiAJdW5sb2NrX2tlcm5lbCgpOwpAQCAtMjEzLDggKzIxMywxMCBAQAogCXNiaSA9IGF1dG9mc19zYmkoZGlyLT5pX3NiKTsKIAogCW96X21vZGUgPSBhdXRvZnNfb3pfbW9kZShzYmkpOwotCURQUklOVEsoKCJhdXRvZnNfbG9va3VwOiBwaWQgPSAldSwgcGdycCA9ICV1LCBjYXRhdG9uaWMgPSAlZCwgb3pfbW9kZSA9ICVkXG4iLAotCQkgY3VycmVudC0+cGlkLCBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpLCBzYmktPmNhdGF0b25pYywgb3pfbW9kZSkpOworCURQUklOVEsoKCJhdXRvZnNfbG9va3VwOiBwaWQgPSAldSwgcGdycCA9ICV1LCBjYXRhdG9uaWMgPSAlZCwgIgorCQkJCSJvel9tb2RlID0gJWRcbiIsIHBpZF9ucih0YXNrX3BpZChjdXJyZW50KSksCisJCQkJcHJvY2Vzc19ncm91cChjdXJyZW50KSwgc2JpLT5jYXRhdG9uaWMsCisJCQkJb3pfbW9kZSkpOwogCiAJLyoKIAkgKiBNYXJrIHRoZSBkZW50cnkgaW5jb21wbGV0ZSwgYnV0IGFkZCBpdC4gVGhpcyBpcyBuZWVkZWQgc28KQEAgLTI1OCw3ICsyNjAsNyBAQAogCSAqIGRvZXNuJ3QgZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBhbGwgc3lzdGVtIGNhbGxzLCBidXQgaXQgc2hvdWxkCiAJICogYmUgT0sgZm9yIHRoZSBvcGVyYXRpb25zIHdlIHBlcm1pdCBmcm9tIGFuIGF1dG9mcy4KIAkgKi8KLQlpZiAoIGRlbnRyeS0+ZF9pbm9kZSAmJiBkX3VuaGFzaGVkKGRlbnRyeSkgKQorCWlmIChkZW50cnktPmRfaW5vZGUgJiYgZF91bmhhc2hlZChkZW50cnkpKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAogCXJldHVybiBOVUxMOwpAQCAtMjc3LDE4ICsyNzksMTggQEAKIAlhdXRvZnNfc2F5KGRlbnRyeS0+ZF9uYW1lLm5hbWUsZGVudHJ5LT5kX25hbWUubGVuKTsKIAogCWxvY2tfa2VybmVsKCk7Ci0JaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSApIHsKKwlpZiAoIWF1dG9mc19vel9tb2RlKHNiaSkpIHsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKLQlpZiAoIGF1dG9mc19oYXNoX2xvb2t1cChkaCwgJmRlbnRyeS0+ZF9uYW1lKSApIHsKKwlpZiAoYXV0b2ZzX2hhc2hfbG9va3VwKGRoLCAmZGVudHJ5LT5kX25hbWUpKSB7CiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJfQogCiAJbiA9IGZpbmRfZmlyc3RfemVyb19iaXQoc2JpLT5zeW1saW5rX2JpdG1hcCxBVVRPRlNfTUFYX1NZTUxJTktTKTsKLQlpZiAoIG4gPj0gQVVUT0ZTX01BWF9TWU1MSU5LUyApIHsKKwlpZiAobiA+PSBBVVRPRlNfTUFYX1NZTUxJTktTKSB7CiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQpAQCAtMjk3LDE0ICsyOTksMTQgQEAKIAlzbCA9ICZzYmktPnN5bWxpbmtbbl07CiAJc2wtPmxlbiA9IHN0cmxlbihzeW1uYW1lKTsKIAlzbC0+ZGF0YSA9IGttYWxsb2Moc2xzaXplID0gc2wtPmxlbisxLCBHRlBfS0VSTkVMKTsKLQlpZiAoICFzbC0+ZGF0YSApIHsKKwlpZiAoIXNsLT5kYXRhKSB7CiAJCWNsZWFyX2JpdChuLHNiaS0+c3ltbGlua19iaXRtYXApOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KIAogCWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdXRvZnNfZGlyX2VudCksIEdGUF9LRVJORUwpOwotCWlmICggIWVudCApIHsKKwlpZiAoIWVudCkgewogCQlrZnJlZShzbC0+ZGF0YSk7CiAJCWNsZWFyX2JpdChuLHNiaS0+c3ltbGlua19iaXRtYXApOwogCQl1bmxvY2tfa2VybmVsKCk7CkBAIC0zMTIsNyArMzE0LDcgQEAKIAl9CiAKIAllbnQtPm5hbWUgPSBrbWFsbG9jKGRlbnRyeS0+ZF9uYW1lLmxlbisxLCBHRlBfS0VSTkVMKTsKLQlpZiAoICFlbnQtPm5hbWUgKSB7CisJaWYgKCFlbnQtPm5hbWUpIHsKIAkJa2ZyZWUoc2wtPmRhdGEpOwogCQlrZnJlZShlbnQpOwogCQljbGVhcl9iaXQobixzYmktPnN5bWxpbmtfYml0bWFwKTsKQEAgLTM1NCwyMyArMzU2LDIzIEBACiAKIAkvKiBUaGlzIGFsbG93cyByb290IHRvIHJlbW92ZSBzeW1saW5rcyAqLwogCWxvY2tfa2VybmVsKCk7Ci0JaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSApIHsKKwlpZiAoIWF1dG9mc19vel9tb2RlKHNiaSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKIAllbnQgPSBhdXRvZnNfaGFzaF9sb29rdXAoZGgsICZkZW50cnktPmRfbmFtZSk7Ci0JaWYgKCAhZW50ICkgeworCWlmICghZW50KSB7CiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJbiA9IGVudC0+aW5vIC0gQVVUT0ZTX0ZJUlNUX1NZTUxJTks7Ci0JaWYgKCBuID49IEFVVE9GU19NQVhfU1lNTElOS1MgKSB7CisJaWYgKG4gPj0gQVVUT0ZTX01BWF9TWU1MSU5LUykgewogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUlTRElSOwkvKiBJdCdzIGEgZGlyZWN0b3J5LCBkdW1teSAqLwogCX0KLQlpZiAoICF0ZXN0X2JpdChuLHNiaS0+c3ltbGlua19iaXRtYXApICkgeworCWlmICghdGVzdF9iaXQobixzYmktPnN5bWxpbmtfYml0bWFwKSkgewogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUlOVkFMOwkvKiBOb25leGlzdGVudCBzeW1saW5rPyAgU2hvdWxkbid0IGhhcHBlbiAqLwogCX0KQEAgLTM5MiwyMyArMzk0LDIzIEBACiAJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CiAKIAlsb2NrX2tlcm5lbCgpOwotCWlmICggIWF1dG9mc19vel9tb2RlKHNiaSkgKSB7CisJaWYgKCFhdXRvZnNfb3pfbW9kZShzYmkpKSB7CiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCiAJZW50ID0gYXV0b2ZzX2hhc2hfbG9va3VwKGRoLCAmZGVudHJ5LT5kX25hbWUpOwotCWlmICggIWVudCApIHsKKwlpZiAoIWVudCkgewogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWlmICggKHVuc2lnbmVkIGludCllbnQtPmlubyA8IEFVVE9GU19GSVJTVF9ESVJfSU5PICkgeworCWlmICgodW5zaWduZWQgaW50KWVudC0+aW5vIDwgQVVUT0ZTX0ZJUlNUX0RJUl9JTk8pIHsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVOT1RESVI7IC8qIE5vdCBhIGRpcmVjdG9yeSAqLwogCX0KIAotCWlmICggZW50LT5kZW50cnkgIT0gZGVudHJ5ICkgeworCWlmIChlbnQtPmRlbnRyeSAhPSBkZW50cnkpIHsKIAkJcHJpbnRrKCJhdXRvZnNfcm1kaXI6IG9kZW50cnkgIT0gZGVudHJ5IGZvciBlbnRyeSAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJfQogCkBAIC00MjksMTggKzQzMSwxOCBAQAogCWlub190IGlubzsKIAogCWxvY2tfa2VybmVsKCk7Ci0JaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSApIHsKKwlpZiAoIWF1dG9mc19vel9tb2RlKHNiaSkpIHsKIAkJdW5sb2NrX2tlcm5lbCgpOwogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKIAllbnQgPSBhdXRvZnNfaGFzaF9sb29rdXAoZGgsICZkZW50cnktPmRfbmFtZSk7Ci0JaWYgKCBlbnQgKSB7CisJaWYgKGVudCkgewogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRUVYSVNUOwogCX0KIAotCWlmICggc2JpLT5uZXh0X2Rpcl9pbm8gPCBBVVRPRlNfRklSU1RfRElSX0lOTyApIHsKKwlpZiAoc2JpLT5uZXh0X2Rpcl9pbm8gPCBBVVRPRlNfRklSU1RfRElSX0lOTykgewogCQlwcmludGsoImF1dG9mczogT3V0IG9mIGlub2RlIG51bWJlcnMgLS0gd2hhdCB0aGUgaGVjayBkaWQgeW91IGRvPz9cbiIpOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiAtRU5PU1BDOwpAQCAtNDQ4LDEzICs0NTAsMTMgQEAKIAlpbm8gPSBzYmktPm5leHRfZGlyX2lubysrOwogCiAJZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1dG9mc19kaXJfZW50KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCAhZW50ICkgeworCWlmICghZW50KSB7CiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCiAJZW50LT5uYW1lID0ga21hbGxvYyhkZW50cnktPmRfbmFtZS5sZW4rMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCAhZW50LT5uYW1lICkgeworCWlmICghZW50LT5uYW1lKSB7CiAJCWtmcmVlKGVudCk7CiAJCXVubG9ja19rZXJuZWwoKTsKIAkJcmV0dXJuIC1FTk9TUEM7CkBAIC00ODMsNyArNDg1LDcgQEAKIAkgICAgcHV0X3VzZXIoc2JpLT5leHBfdGltZW91dCAvIEhaLCBwKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoIG50aW1lb3V0ID4gVUxPTkdfTUFYL0haICkKKwlpZiAobnRpbWVvdXQgPiBVTE9OR19NQVgvSFopCiAJCXNiaS0+ZXhwX3RpbWVvdXQgPSAwOwogCWVsc2UKIAkJc2JpLT5leHBfdGltZW91dCA9IG50aW1lb3V0ICogSFo7CkBAIC01MTEsMTUgKzUxMywxNCBAQAogCXBrdC5oZHIucHJvdG9fdmVyc2lvbiA9IEFVVE9GU19QUk9UT19WRVJTSU9OOwogCXBrdC5oZHIudHlwZSA9IGF1dG9mc19wdHlwZV9leHBpcmU7CiAKLQlpZiAoICFzYmktPmV4cF90aW1lb3V0IHx8Ci0JICAgICAhKGVudCA9IGF1dG9mc19leHBpcmUoc2Isc2JpLG1udCkpICkKKwlpZiAoIXNiaS0+ZXhwX3RpbWVvdXQgfHwgIShlbnQgPSBhdXRvZnNfZXhwaXJlKHNiLHNiaSxtbnQpKSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKIAlwa3QubGVuID0gZW50LT5sZW47CiAJbWVtY3B5KHBrdC5uYW1lLCBlbnQtPm5hbWUsIHBrdC5sZW4pOwogCXBrdC5uYW1lW3BrdC5sZW5dID0gJ1wwJzsKIAotCWlmICggY29weV90b191c2VyKHBrdF9wLCAmcGt0LCBzaXplb2Yoc3RydWN0IGF1dG9mc19wYWNrZXRfZXhwaXJlKSkgKQorCWlmIChjb3B5X3RvX3VzZXIocGt0X3AsICZwa3QsIHNpemVvZihzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gMDsKQEAgLTUzNywxMSArNTM4LDExIEBACiAKIAlEUFJJTlRLKCgiYXV0b2ZzX2lvY3RsOiBjbWQgPSAweCUwOHgsIGFyZyA9IDB4JTA4bHgsIHNiaSA9ICVwLCBwZ3JwID0gJXVcbiIsY21kLGFyZyxzYmkscHJvY2Vzc19ncm91cChjdXJyZW50KSkpOwogCi0JaWYgKCBfSU9DX1RZUEUoY21kKSAhPSBfSU9DX1RZUEUoQVVUT0ZTX0lPQ19GSVJTVCkgfHwKLQkgICAgIF9JT0NfTlIoY21kKSAtIF9JT0NfTlIoQVVUT0ZTX0lPQ19GSVJTVCkgPj0gQVVUT0ZTX0lPQ19DT1VOVCApCisJaWYgKF9JT0NfVFlQRShjbWQpICE9IF9JT0NfVFlQRShBVVRPRlNfSU9DX0ZJUlNUKSB8fAorCSAgICAgX0lPQ19OUihjbWQpIC0gX0lPQ19OUihBVVRPRlNfSU9DX0ZJUlNUKSA+PSBBVVRPRlNfSU9DX0NPVU5UKQogCQlyZXR1cm4gLUVOT1RUWTsKIAkKLQlpZiAoICFhdXRvZnNfb3pfbW9kZShzYmkpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pICkKKwlpZiAoIWF1dG9mc19vel9tb2RlKHNiaSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAJCiAJc3dpdGNoKGNtZCkgewpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9pbm9kZS5jIGIvZnMvYXV0b2ZzNC9pbm9kZS5jCmluZGV4IDU3NjlhMmYuLjY5MjM2NGU4IDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2lub2RlLmMKKysrIGIvZnMvYXV0b2ZzNC9pbm9kZS5jCkBAIC0yMTgsOCArMjE4LDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBpbnQgKnBpcGVmZCwgdWlkX3QgKnVpZCwgZ2lkX3QgKmdpZCwKLQkJCSBwaWRfdCAqcGdycCwgdW5zaWduZWQgaW50ICp0eXBlLAotCQkJIGludCAqbWlucHJvdG8sIGludCAqbWF4cHJvdG8pCisJCXBpZF90ICpwZ3JwLCB1bnNpZ25lZCBpbnQgKnR5cGUsIGludCAqbWlucHJvdG8sIGludCAqbWF4cHJvdG8pCiB7CiAJY2hhciAqcDsKIAlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CkBAIC0zMTQsNyArMzEzLDcgQEAKIAlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubzsKIAogCXNiaSA9IGttYWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKLQlpZiAoICFzYmkgKQorCWlmICghc2JpKQogCQlnb3RvIGZhaWxfdW5sb2NrOwogCURQUklOVEsoInN0YXJ0aW5nIHVwLCBzYmkgPSAlcCIsc2JpKTsKIApAQCAtMzYzLDEwICszNjIsOSBAQAogCXJvb3QtPmRfZnNkYXRhID0gaW5vOwogCiAJLyogQ2FuIHRoaXMgY2FsbCBibG9jaz8gKi8KLQlpZiAocGFyc2Vfb3B0aW9ucyhkYXRhLCAmcGlwZWZkLAotCQkJICAmcm9vdF9pbm9kZS0+aV91aWQsICZyb290X2lub2RlLT5pX2dpZCwKLQkJCSAgJnNiaS0+b3pfcGdycCwgJnNiaS0+dHlwZSwKLQkJCSAgJnNiaS0+bWluX3Byb3RvLCAmc2JpLT5tYXhfcHJvdG8pKSB7CisJaWYgKHBhcnNlX29wdGlvbnMoZGF0YSwgJnBpcGVmZCwgJnJvb3RfaW5vZGUtPmlfdWlkLCAmcm9vdF9pbm9kZS0+aV9naWQsCisJCQkJJnNiaS0+b3pfcGdycCwgJnNiaS0+dHlwZSwgJnNiaS0+bWluX3Byb3RvLAorCQkJCSZzYmktPm1heF9wcm90bykpIHsKIAkJcHJpbnRrKCJhdXRvZnM6IGNhbGxlZCB3aXRoIGJvZ3VzIG9wdGlvbnNcbiIpOwogCQlnb3RvIGZhaWxfZHB1dDsKIAl9CkBAIC0zOTYsMTEgKzM5NCwxMSBAQAogCURQUklOVEsoInBpcGUgZmQgPSAlZCwgcGdycCA9ICV1IiwgcGlwZWZkLCBzYmktPm96X3BncnApOwogCXBpcGUgPSBmZ2V0KHBpcGVmZCk7CiAJCi0JaWYgKCAhcGlwZSApIHsKKwlpZiAoIXBpcGUpIHsKIAkJcHJpbnRrKCJhdXRvZnM6IGNvdWxkIG5vdCBvcGVuIHBpcGUgZmlsZSBkZXNjcmlwdG9yXG4iKTsKIAkJZ290byBmYWlsX2RwdXQ7CiAJfQotCWlmICggIXBpcGUtPmZfb3AgfHwgIXBpcGUtPmZfb3AtPndyaXRlICkKKwlpZiAoIXBpcGUtPmZfb3AgfHwgIXBpcGUtPmZfb3AtPndyaXRlKQogCQlnb3RvIGZhaWxfZnB1dDsKIAlzYmktPnBpcGUgPSBwaXBlOwogCXNiaS0+cGlwZWZkID0gcGlwZWZkOwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9yb290LmMgYi9mcy9hdXRvZnM0L3Jvb3QuYwppbmRleCAxNTE3MGY0Li4yZDRjOGEzIDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L3Jvb3QuYworKysgYi9mcy9hdXRvZnM0L3Jvb3QuYwpAQCAtNzU5LDcgKzc1OSw3IEBACiAJc3RydWN0IGF1dG9mc19pbmZvICpwX2lubzsKIAkKIAkvKiBUaGlzIGFsbG93cyByb290IHRvIHJlbW92ZSBzeW1saW5rcyAqLwotCWlmICggIWF1dG9mczRfb3pfbW9kZShzYmkpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pICkKKwlpZiAoIWF1dG9mczRfb3pfbW9kZShzYmkpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQogCQlyZXR1cm4gLUVBQ0NFUzsKIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpbm8tPmNvdW50KSkgewpAQCAtODMzLDcgKzgzMyw3IEBACiAJc3RydWN0IGF1dG9mc19pbmZvICpwX2lubzsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCi0JaWYgKCAhYXV0b2ZzNF9vel9tb2RlKHNiaSkgKQorCWlmICghYXV0b2ZzNF9vel9tb2RlKHNiaSkpCiAJCXJldHVybiAtRUFDQ0VTOwogCiAJRFBSSU5USygiZGVudHJ5ICVwLCBjcmVhdGluZyAlLipzIiwKQEAgLTg3MSwxMSArODcxLDExIEBACiAJaW50IHJ2OwogCXVuc2lnbmVkIGxvbmcgbnRpbWVvdXQ7CiAKLQlpZiAoIChydiA9IGdldF91c2VyKG50aW1lb3V0LCBwKSkgfHwKLQkgICAgIChydiA9IHB1dF91c2VyKHNiaS0+ZXhwX3RpbWVvdXQvSFosIHApKSApCisJaWYgKChydiA9IGdldF91c2VyKG50aW1lb3V0LCBwKSkgfHwKKwkgICAgIChydiA9IHB1dF91c2VyKHNiaS0+ZXhwX3RpbWVvdXQvSFosIHApKSkKIAkJcmV0dXJuIHJ2OwogCi0JaWYgKCBudGltZW91dCA+IFVMT05HX01BWC9IWiApCisJaWYgKG50aW1lb3V0ID4gVUxPTkdfTUFYL0haKQogCQlzYmktPmV4cF90aW1lb3V0ID0gMDsKIAllbHNlCiAJCXNiaS0+ZXhwX3RpbWVvdXQgPSBudGltZW91dCAqIEhaOwpAQCAtOTA2LDcgKzkwNiw3IEBACiAJRFBSSU5USygicmV0dXJuaW5nICVkIiwgc2JpLT5uZWVkc19yZWdob3N0KTsKIAogCXN0YXR1cyA9IHB1dF91c2VyKHNiaS0+bmVlZHNfcmVnaG9zdCwgcCk7Ci0JaWYgKCBzdGF0dXMgKQorCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7CiAKIAlzYmktPm5lZWRzX3JlZ2hvc3QgPSAwOwpAQCAtOTc1LDExICs5NzUsMTEgQEAKIAlEUFJJTlRLKCJjbWQgPSAweCUwOHgsIGFyZyA9IDB4JTA4bHgsIHNiaSA9ICVwLCBwZ3JwID0gJXUiLAogCQljbWQsYXJnLHNiaSxwcm9jZXNzX2dyb3VwKGN1cnJlbnQpKTsKIAotCWlmICggX0lPQ19UWVBFKGNtZCkgIT0gX0lPQ19UWVBFKEFVVE9GU19JT0NfRklSU1QpIHx8Ci0JICAgICBfSU9DX05SKGNtZCkgLSBfSU9DX05SKEFVVE9GU19JT0NfRklSU1QpID49IEFVVE9GU19JT0NfQ09VTlQgKQorCWlmIChfSU9DX1RZUEUoY21kKSAhPSBfSU9DX1RZUEUoQVVUT0ZTX0lPQ19GSVJTVCkgfHwKKwkgICAgIF9JT0NfTlIoY21kKSAtIF9JT0NfTlIoQVVUT0ZTX0lPQ19GSVJTVCkgPj0gQVVUT0ZTX0lPQ19DT1VOVCkKIAkJcmV0dXJuIC1FTk9UVFk7CiAJCi0JaWYgKCAhYXV0b2ZzNF9vel9tb2RlKHNiaSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgKQorCWlmICghYXV0b2ZzNF9vel9tb2RlKHNiaSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAJCiAJc3dpdGNoKGNtZCkgewpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0LmMgYi9mcy9jb21wYXQuYwppbmRleCA5Y2Y3NWRmLi43YjIxYjBhIDEwMDY0NAotLS0gYS9mcy9jb21wYXQuYworKysgYi9mcy9jb21wYXQuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RzYWNjdF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZXZlbnRwb2xsLmg+CkBAIC0yMTk5LDMgKzIyMDAsNTEgQEAKICNlbmRpZiAvKiBUSUZfUkVTVE9SRV9TSUdNQVNLICovCiAKICNlbmRpZiAvKiBDT05GSUdfRVBPTEwgKi8KKworI2lmZGVmIENPTkZJR19TSUdOQUxGRAorCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zaWduYWxmZChpbnQgdWZkLAorCQkJCSAgICBjb25zdCBjb21wYXRfc2lnc2V0X3QgX191c2VyICpzaWdtYXNrLAorCQkJCSAgICBjb21wYXRfc2l6ZV90IHNpZ3NldHNpemUpCit7CisJY29tcGF0X3NpZ3NldF90IHNzMzI7CisJc2lnc2V0X3QgdG1wOworCXNpZ3NldF90IF9fdXNlciAqa3NpZ21hc2s7CisKKwlpZiAoc2lnc2V0c2l6ZSAhPSBzaXplb2YoY29tcGF0X3NpZ3NldF90KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZzczMyLCBzaWdtYXNrLCBzaXplb2Yoc3MzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzaWdzZXRfZnJvbV9jb21wYXQoJnRtcCwgJnNzMzIpOworCWtzaWdtYXNrID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHNpZ3NldF90KSk7CisJaWYgKGNvcHlfdG9fdXNlcihrc2lnbWFzaywgJnRtcCwgc2l6ZW9mKHNpZ3NldF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19zaWduYWxmZCh1ZmQsIGtzaWdtYXNrLCBzaXplb2Yoc2lnc2V0X3QpKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19TSUdOQUxGRCAqLworCisjaWZkZWYgQ09ORklHX1RJTUVSRkQKKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfdGltZXJmZChpbnQgdWZkLCBpbnQgY2xvY2tpZCwgaW50IGZsYWdzLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKnV0bXIpCit7CisJbG9uZyByZXM7CisJc3RydWN0IGl0aW1lcnNwZWMgdDsKKwlzdHJ1Y3QgaXRpbWVyc3BlYyBfX3VzZXIgKnV0OworCisJcmVzID0gLUVGQVVMVDsKKwlpZiAoZ2V0X2NvbXBhdF9pdGltZXJzcGVjKCZ0LCB1dG1yKSkKKwkJZ290byBlcnJfZXhpdDsKKwl1dCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdXQpKTsKKwlpZiAoY29weV90b191c2VyKHV0LCAmdCwgc2l6ZW9mKHQpKSApCisJCWdvdG8gZXJyX2V4aXQ7CisKKwlyZXMgPSBzeXNfdGltZXJmZCh1ZmQsIGNsb2NraWQsIGZsYWdzLCB1dCk7CitlcnJfZXhpdDoKKwlyZXR1cm4gcmVzOworfQorCisjZW5kaWYgLyogQ09ORklHX1RJTUVSRkQgKi8KKwpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRmZC5jIGIvZnMvZXZlbnRmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MGUyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ldmVudGZkLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiAgZnMvZXZlbnRmZC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Fub25faW5vZGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXZlbnRmZC5oPgorCitzdHJ1Y3QgZXZlbnRmZF9jdHggeworCXNwaW5sb2NrX3QgbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cWg7CisJLyoKKwkgKiBFdmVyeSB0aW1lIHRoYXQgYSB3cml0ZSgyKSBpcyBwZXJmb3JtZWQgb24gYW4gZXZlbnRmZCwgdGhlCisJICogdmFsdWUgb2YgdGhlIF9fdTY0IGJlaW5nIHdyaXR0ZW4gaXMgYWRkZWQgdG8gImNvdW50IiBhbmQgYQorCSAqIHdha2V1cCBpcyBwZXJmb3JtZWQgb24gIndxaCIuIEEgcmVhZCgyKSB3aWxsIHJldHVybiB0aGUgImNvdW50IgorCSAqIHZhbHVlIHRvIHVzZXJzcGFjZSwgYW5kIHdpbGwgcmVzZXQgImNvdW50IiB0byB6ZXJvLiBUaGUga2VybmVsCisJICogc2l6ZSBldmVudGZkX3NpZ25hbCgpIGFsc28sIGFkZHMgdG8gdGhlICJjb3VudCIgY291bnRlciBhbmQKKwkgKiBpc3N1ZSBhIHdha2V1cC4KKwkgKi8KKwlfX3U2NCBjb3VudDsKK307CisKKy8qCisgKiBBZGRzICJuIiB0byB0aGUgZXZlbnRmZCBjb3VudGVyICJjb3VudCIuIFJldHVybnMgIm4iIGluIGNhc2Ugb2YKKyAqIHN1Y2Nlc3MsIG9yIGEgdmFsdWUgbG93ZXIgdGhlbiAibiIgaW4gY2FzZSBvZiBjb3V0bmVyIG92ZXJmbG93LgorICogVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYnkgdGhlIGtlcm5lbCBpbiBwYXRocworICogdGhhdCBkbyBub3QgYWxsb3cgc2xlZXBpbmcuIEluIHRoaXMgZnVuY3Rpb24gd2UgYWxsb3cgdGhlIGNvdW50ZXIKKyAqIHRvIHJlYWNoIHRoZSBVTExPTkdfTUFYIHZhbHVlLCBhbmQgd2Ugc2lnbmFsIHRoaXMgYXMgb3ZlcmZsb3cKKyAqIGNvbmRpdGlvbiBieSByZXR1cmluaW5nIGEgUE9MTEVSUiB0byBwb2xsKDIpLgorICovCitpbnQgZXZlbnRmZF9zaWduYWwoc3RydWN0IGZpbGUgKmZpbGUsIGludCBuKQoreworCXN0cnVjdCBldmVudGZkX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobiA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPmxvY2ssIGZsYWdzKTsKKwlpZiAoVUxMT05HX01BWCAtIGN0eC0+Y291bnQgPCBuKQorCQluID0gKGludCkgKFVMTE9OR19NQVggLSBjdHgtPmNvdW50KTsKKwljdHgtPmNvdW50ICs9IG47CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmN0eC0+d3FoKSkKKwkJd2FrZV91cF9sb2NrZWQoJmN0eC0+d3FoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGV2ZW50ZmRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlrZnJlZShmaWxlLT5wcml2YXRlX2RhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGV2ZW50ZmRfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgZXZlbnRmZF9jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgZXZlbnRzID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcG9sbF93YWl0KGZpbGUsICZjdHgtPndxaCwgd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5sb2NrLCBmbGFncyk7CisJaWYgKGN0eC0+Y291bnQgPiAwKQorCQlldmVudHMgfD0gUE9MTElOOworCWlmIChjdHgtPmNvdW50ID09IFVMTE9OR19NQVgpCisJCWV2ZW50cyB8PSBQT0xMRVJSOworCWlmIChVTExPTkdfTUFYIC0gMSA+IGN0eC0+Y291bnQpCisJCWV2ZW50cyB8PSBQT0xMT1VUOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGV2ZW50czsKK30KKworc3RhdGljIHNzaXplX3QgZXZlbnRmZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBldmVudGZkX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmVzOworCV9fdTY0IHVjbnQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlpZiAoY291bnQgPCBzaXplb2YodWNudCkpCisJCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9ja19pcnEoJmN0eC0+bG9jayk7CisJcmVzID0gLUVBR0FJTjsKKwl1Y250ID0gY3R4LT5jb3VudDsKKwlpZiAodWNudCA+IDApCisJCXJlcyA9IHNpemVvZih1Y250KTsKKwllbHNlIGlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgeworCQlfX2FkZF93YWl0X3F1ZXVlKCZjdHgtPndxaCwgJndhaXQpOworCQlmb3IgKHJlcyA9IDA7OykgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmIChjdHgtPmNvdW50ID4gMCkgeworCQkJCXVjbnQgPSBjdHgtPmNvdW50OworCQkJCXJlcyA9IHNpemVvZih1Y250KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJlcyA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlzcGluX2xvY2tfaXJxKCZjdHgtPmxvY2spOworCQl9CisJCV9fcmVtb3ZlX3dhaXRfcXVldWUoJmN0eC0+d3FoLCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisJaWYgKHJlcyA+IDApIHsKKwkJY3R4LT5jb3VudCA9IDA7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZjdHgtPndxaCkpCisJCQl3YWtlX3VwX2xvY2tlZCgmY3R4LT53cWgpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmN0eC0+bG9jayk7CisJaWYgKHJlcyA+IDAgJiYgcHV0X3VzZXIodWNudCwgKF9fdTY0IF9fdXNlciAqKSBidWYpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGV2ZW50ZmRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBldmVudGZkX2N0eCAqY3R4ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmVzOworCV9fdTY0IHVjbnQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlpZiAoY291bnQgPCBzaXplb2YodWNudCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcigmdWNudCwgYnVmLCBzaXplb2YodWNudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodWNudCA9PSBVTExPTkdfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzcGluX2xvY2tfaXJxKCZjdHgtPmxvY2spOworCXJlcyA9IC1FQUdBSU47CisJaWYgKFVMTE9OR19NQVggLSBjdHgtPmNvdW50ID4gdWNudCkKKwkJcmVzID0gc2l6ZW9mKHVjbnQpOworCWVsc2UgaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CisJCV9fYWRkX3dhaXRfcXVldWUoJmN0eC0+d3FoLCAmd2FpdCk7CisJCWZvciAocmVzID0gMDs7KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJaWYgKFVMTE9OR19NQVggLSBjdHgtPmNvdW50ID4gdWNudCkgeworCQkJCXJlcyA9IHNpemVvZih1Y250KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJlcyA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlzcGluX2xvY2tfaXJxKCZjdHgtPmxvY2spOworCQl9CisJCV9fcmVtb3ZlX3dhaXRfcXVldWUoJmN0eC0+d3FoLCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisJaWYgKHJlcyA+IDApIHsKKwkJY3R4LT5jb3VudCArPSB1Y250OworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmY3R4LT53cWgpKQorCQkJd2FrZV91cF9sb2NrZWQoJmN0eC0+d3FoKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXZlbnRmZF9mb3BzID0geworCS5yZWxlYXNlCT0gZXZlbnRmZF9yZWxlYXNlLAorCS5wb2xsCQk9IGV2ZW50ZmRfcG9sbCwKKwkucmVhZAkJPSBldmVudGZkX3JlYWQsCisJLndyaXRlCQk9IGV2ZW50ZmRfd3JpdGUsCit9OworCitzdHJ1Y3QgZmlsZSAqZXZlbnRmZF9mZ2V0KGludCBmZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCXJldHVybiBFUlJfUFRSKC1FQkFERik7CisJaWYgKGZpbGUtPmZfb3AgIT0gJmV2ZW50ZmRfZm9wcykgeworCQlmcHV0KGZpbGUpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gZmlsZTsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19ldmVudGZkKHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlpbnQgZXJyb3IsIGZkOworCXN0cnVjdCBldmVudGZkX2N0eCAqY3R4OworCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwljdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmY3R4LT53cWgpOworCXNwaW5fbG9ja19pbml0KCZjdHgtPmxvY2spOworCWN0eC0+Y291bnQgPSBjb3VudDsKKworCS8qCisJICogV2hlbiB3ZSBjYWxsIHRoaXMsIHRoZSBpbml0aWFsaXphdGlvbiBtdXN0IGJlIGNvbXBsZXRlLCBzaW5jZQorCSAqIGFub25faW5vZGVfZ2V0ZmQoKSB3aWxsIGluc3RhbGwgdGhlIGZkLgorCSAqLworCWVycm9yID0gYW5vbl9pbm9kZV9nZXRmZCgmZmQsICZpbm9kZSwgJmZpbGUsICJbZXZlbnRmZF0iLAorCQkJCSAmZXZlbnRmZF9mb3BzLCBjdHgpOworCWlmICghZXJyb3IpCisJCXJldHVybiBmZDsKKworCWtmcmVlKGN0eCk7CisJcmV0dXJuIGVycm9yOworfQorCmRpZmYgLS1naXQgYS9mcy9ldmVudHBvbGwuYyBiL2ZzL2V2ZW50cG9sbC5jCmluZGV4IGI1YzdjYTUuLjFhYWQzNGUgMTAwNjQ0Ci0tLSBhL2ZzL2V2ZW50cG9sbC5jCisrKyBiL2ZzL2V2ZW50cG9sbC5jCkBAIC0xMSw3ICsxMSw2IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTM0LDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvYW5vbl9pbm9kZXMuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogCi0KIC8qCiAgKiBMT0NLSU5HOgogICogVGhlcmUgYXJlIHRocmVlIGxldmVsIG9mIGxvY2tpbmcgcmVxdWlyZWQgYnkgZXBvbGwgOgpAQCAtNzQsOSArNzMsNiBAQAogICogYSBncmVhdGVyIHNjYWxhYmlsaXR5LgogICovCiAKLQotI2RlZmluZSBFVkVOVFBPTExGU19NQUdJQyAweDAzMTExOTY1IC8qIE15IGJpcnRoZGF5IHNob3VsZCB3b3JrIGZvciB0aGlzIDopICovCi0KICNkZWZpbmUgREVCVUdfRVBPTEwgMAogCiAjaWYgREVCVUdfRVBPTEwgPiAwCkBAIC0xMDYsNyArMTAyLDYgQEAKIAogI2RlZmluZSBFUF9NQVhfRVZFTlRTIChJTlRfTUFYIC8gc2l6ZW9mKHN0cnVjdCBlcG9sbF9ldmVudCkpCiAKLQogc3RydWN0IGVwb2xsX2ZpbGVmZCB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJaW50IGZkOwpAQCAtMjI0LDQzICsyMTksNiBAQAogCXN0cnVjdCBlcGl0ZW0gKmVwaTsKIH07CiAKLQotCi1zdGF0aWMgdm9pZCBlcF9wb2xsX3NhZmV3YWtlX2luaXQoc3RydWN0IHBvbGxfc2FmZXdha2UgKnBzdyk7Ci1zdGF0aWMgdm9pZCBlcF9wb2xsX3NhZmV3YWtlKHN0cnVjdCBwb2xsX3NhZmV3YWtlICpwc3csIHdhaXRfcXVldWVfaGVhZF90ICp3cSk7Ci1zdGF0aWMgaW50IGVwX2dldGZkKGludCAqZWZkLCBzdHJ1Y3QgaW5vZGUgKiplaW5vZGUsIHN0cnVjdCBmaWxlICoqZWZpbGUsCi0JCSAgICBzdHJ1Y3QgZXZlbnRwb2xsICplcCk7Ci1zdGF0aWMgaW50IGVwX2FsbG9jKHN0cnVjdCBldmVudHBvbGwgKipwZXApOwotc3RhdGljIHZvaWQgZXBfZnJlZShzdHJ1Y3QgZXZlbnRwb2xsICplcCk7Ci1zdGF0aWMgc3RydWN0IGVwaXRlbSAqZXBfZmluZChzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBmZCk7Ci1zdGF0aWMgdm9pZCBlcF91c2VfZXBpdGVtKHN0cnVjdCBlcGl0ZW0gKmVwaSk7Ci1zdGF0aWMgdm9pZCBlcF9yZWxlYXNlX2VwaXRlbShzdHJ1Y3QgZXBpdGVtICplcGkpOwotc3RhdGljIHZvaWQgZXBfcHRhYmxlX3F1ZXVlX3Byb2Moc3RydWN0IGZpbGUgKmZpbGUsIHdhaXRfcXVldWVfaGVhZF90ICp3aGVhZCwKLQkJCQkgcG9sbF90YWJsZSAqcHQpOwotc3RhdGljIHZvaWQgZXBfcmJ0cmVlX2luc2VydChzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpKTsKLXN0YXRpYyBpbnQgZXBfaW5zZXJ0KHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgKmV2ZW50LAotCQkgICAgIHN0cnVjdCBmaWxlICp0ZmlsZSwgaW50IGZkKTsKLXN0YXRpYyBpbnQgZXBfbW9kaWZ5KHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBpdGVtICplcGksCi0JCSAgICAgc3RydWN0IGVwb2xsX2V2ZW50ICpldmVudCk7Ci1zdGF0aWMgdm9pZCBlcF91bnJlZ2lzdGVyX3BvbGx3YWl0KHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBpdGVtICplcGkpOwotc3RhdGljIGludCBlcF91bmxpbmsoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSk7Ci1zdGF0aWMgaW50IGVwX3JlbW92ZShzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpKTsKLXN0YXRpYyBpbnQgZXBfcG9sbF9jYWxsYmFjayh3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGludCBzeW5jLCB2b2lkICprZXkpOwotc3RhdGljIGludCBlcF9ldmVudHBvbGxfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHVuc2lnbmVkIGludCBlcF9ldmVudHBvbGxfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCk7Ci1zdGF0aWMgaW50IGVwX3NlbmRfZXZlbnRzKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgbGlzdF9oZWFkICp0eGxpc3QsCi0JCQkgIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cywgaW50IG1heGV2ZW50cyk7Ci1zdGF0aWMgaW50IGVwX2V2ZW50c190cmFuc2ZlcihzdHJ1Y3QgZXZlbnRwb2xsICplcCwKLQkJCSAgICAgIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cywKLQkJCSAgICAgIGludCBtYXhldmVudHMpOwotc3RhdGljIGludCBlcF9wb2xsKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgX191c2VyICpldmVudHMsCi0JCSAgIGludCBtYXhldmVudHMsIGxvbmcgdGltZW91dCk7Ci1zdGF0aWMgaW50IGV2ZW50cG9sbGZzX2RlbGV0ZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmVwX2V2ZW50cG9sbF9pbm9kZSh2b2lkKTsKLXN0YXRpYyBpbnQgZXZlbnRwb2xsZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCQkJICAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKLQkJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKLQogLyoKICAqIFRoaXMgc2VtYXBob3JlIGlzIHVzZWQgdG8gc2VyaWFsaXplIGVwX2ZyZWUoKSBhbmQgZXZlbnRwb2xsX3JlbGVhc2VfZmlsZSgpLgogICovCkBAIC0yNzUsMzcgKzIzMyw2IEBACiAvKiBTbGFiIGNhY2hlIHVzZWQgdG8gYWxsb2NhdGUgInN0cnVjdCBlcHBvbGxfZW50cnkiICovCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnB3cV9jYWNoZSBfX3JlYWRfbW9zdGx5OwogCi0vKiBWaXJ0dWFsIGZzIHVzZWQgdG8gYWxsb2NhdGUgaW5vZGVzIGZvciBldmVudHBvbGwgZmlsZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmV2ZW50cG9sbF9tbnQgX19yZWFkX21vc3RseTsKLQotLyogRmlsZSBjYWxsYmFja3MgdGhhdCBpbXBsZW1lbnQgdGhlIGV2ZW50cG9sbCBmaWxlIGJlaGF2aW91ciAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXZlbnRwb2xsX2ZvcHMgPSB7Ci0JLnJlbGVhc2UJPSBlcF9ldmVudHBvbGxfY2xvc2UsCi0JLnBvbGwJCT0gZXBfZXZlbnRwb2xsX3BvbGwKLX07Ci0KLS8qCi0gKiBUaGlzIGlzIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0gZnJvbSB3aGVyZQotICogZXZlbnRwb2xsIGlub2RlcyBhcmUgYWxsb2NhdGVkLgotICovCi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXZlbnRwb2xsX2ZzX3R5cGUgPSB7Ci0JLm5hbWUJCT0gImV2ZW50cG9sbGZzIiwKLQkuZ2V0X3NiCQk9IGV2ZW50cG9sbGZzX2dldF9zYiwKLQkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKLX07Ci0KLS8qIFZlcnkgYmFzaWMgZGlyZWN0b3J5IGVudHJ5IG9wZXJhdGlvbnMgZm9yIHRoZSBldmVudHBvbGwgdmlydHVhbCBmaWxlIHN5c3RlbSAqLwotc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBldmVudHBvbGxmc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKLQkuZF9kZWxldGUJPSBldmVudHBvbGxmc19kZWxldGVfZGVudHJ5LAotfTsKLQotCi0KLS8qIEZhc3QgdGVzdCB0byBzZWUgaWYgdGhlIGZpbGUgaXMgYW4gZXZlbnBvbGwgZmlsZSAqLwotc3RhdGljIGlubGluZSBpbnQgaXNfZmlsZV9lcG9sbChzdHJ1Y3QgZmlsZSAqZikKLXsKLQlyZXR1cm4gZi0+Zl9vcCA9PSAmZXZlbnRwb2xsX2ZvcHM7Ci19CiAKIC8qIFNldHVwIHRoZSBzdHJ1Y3R1cmUgdGhhdCBpcyB1c2VkIGFzIGtleSBmb3IgdGhlIHJiLXRyZWUgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBlcF9zZXRfZmZkKHN0cnVjdCBlcG9sbF9maWxlZmQgKmZmZCwKQEAgLTM3NCw3ICszMDEsNiBAQAogCXNwaW5fbG9ja19pbml0KCZwc3ctPmxvY2spOwogfQogCi0KIC8qCiAgKiBQZXJmb3JtIGEgc2FmZSB3YWtlIHVwIG9mIHRoZSBwb2xsIHdhaXQgbGlzdC4gVGhlIHByb2JsZW0gaXMgdGhhdAogICogd2l0aCB0aGUgbmV3IGNhbGxiYWNrJ2Qgd2FrZSB1cCBzeXN0ZW0sIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlCkBAIC00MjksNDAwICszNTUsMTQ1IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHN3LT5sb2NrLCBmbGFncyk7CiB9CiAKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHVucmVnaXN0ZXIgcG9sbCBjYWxsYmFja3MgZnJvbSB0aGUgYXNzb2NpYXRlZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBTaW5jZSB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgaG9sZGluZyAiZXAtPmxvY2siIHRoZSBhdG9taWMgZXhjaGFuZ2UgdHJpY2sKKyAqIHdpbGwgcHJvdGVjdCB1cyBmcm9tIG11bHRpcGxlIHVucmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGVwX3VucmVnaXN0ZXJfcG9sbHdhaXQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSkKK3sKKwlpbnQgbndhaXQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbHN0aGVhZCA9ICZlcGktPnB3cWxpc3Q7CisJc3RydWN0IGVwcG9sbF9lbnRyeSAqcHdxOworCisJLyogVGhpcyBpcyBjYWxsZWQgd2l0aG91dCBsb2Nrcywgc28gd2UgbmVlZCB0aGUgYXRvbWljIGV4Y2hhbmdlICovCisJbndhaXQgPSB4Y2hnKCZlcGktPm53YWl0LCAwKTsKKworCWlmIChud2FpdCkgeworCQl3aGlsZSAoIWxpc3RfZW1wdHkobHN0aGVhZCkpIHsKKwkJCXB3cSA9IGxpc3RfZmlyc3RfZW50cnkobHN0aGVhZCwgc3RydWN0IGVwcG9sbF9lbnRyeSwgbGxpbmspOworCisJCQlsaXN0X2RlbF9pbml0KCZwd3EtPmxsaW5rKTsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKHB3cS0+d2hlYWQsICZwd3EtPndhaXQpOworCQkJa21lbV9jYWNoZV9mcmVlKHB3cV9jYWNoZSwgcHdxKTsKKwkJfQorCX0KK30KIAogLyoKLSAqIFRoaXMgaXMgY2FsbGVkIGZyb20gZXZlbnRwb2xsX3JlbGVhc2UoKSB0byB1bmxpbmsgZmlsZXMgZnJvbSB0aGUgZXZlbnRwb2xsCi0gKiBpbnRlcmZhY2UuIFdlIG5lZWQgdG8gaGF2ZSB0aGlzIGZhY2lsaXR5IHRvIGNsZWFudXAgY29ycmVjdGx5IGZpbGVzIHRoYXQgYXJlCi0gKiBjbG9zZWQgd2l0aG91dCBiZWluZyByZW1vdmVkIGZyb20gdGhlIGV2ZW50cG9sbCBpbnRlcmZhY2UuCisgKiBVbmxpbmsgdGhlICJzdHJ1Y3QgZXBpdGVtIiBmcm9tIGFsbCBwbGFjZXMgaXQgbWlnaHQgaGF2ZSBiZWVuIGhvb2tlZCB1cC4KKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB3cml0ZSBJUlEgbG9jayBvbiAiZXAtPmxvY2siLgogICovCi12b2lkIGV2ZW50cG9sbF9yZWxlYXNlX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGVwX3VubGluayhzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmxzdGhlYWQgPSAmZmlsZS0+Zl9lcF9saW5rczsKLQlzdHJ1Y3QgZXZlbnRwb2xsICplcDsKLQlzdHJ1Y3QgZXBpdGVtICplcGk7CisJaW50IGVycm9yOwogCiAJLyoKLQkgKiBXZSBkb24ndCB3YW50IHRvIGdldCAiZmlsZS0+Zl9lcF9sb2NrIiBiZWNhdXNlIGl0IGlzIG5vdAotCSAqIG5lY2Vzc2FyeS4gSXQgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIHdlJ3JlIGluIHRoZSAic3RydWN0IGZpbGUiCi0JICogY2xlYW51cCBwYXRoLCBhbmQgdGhpcyBtZWFucyB0aGF0IG5vb25lIGlzIHVzaW5nIHRoaXMgZmlsZSBhbnltb3JlLgotCSAqIFRoZSBvbmx5IGhpdCBtaWdodCBjb21lIGZyb20gZXBfZnJlZSgpIGJ1dCBieSBob2xkaW5nIHRoZSBzZW1hcGhvcmUKLQkgKiB3aWxsIGNvcnJlY3RseSBzZXJpYWxpemUgdGhlIG9wZXJhdGlvbi4gV2UgZG8gbmVlZCB0byBhY3F1aXJlCi0JICogImVwLT5zZW0iIGFmdGVyICJlcG11dGV4IiBiZWNhdXNlIGVwX3JlbW92ZSgpIHJlcXVpcmVzIGl0IHdoZW4gY2FsbGVkCi0JICogZnJvbSBhbnl3aGVyZSBidXQgZXBfZnJlZSgpLgorCSAqIEl0IGNhbiBoYXBwZW4gdGhhdCB0aGlzIG9uZSBpcyBjYWxsZWQgZm9yIGFuIGl0ZW0gYWxyZWFkeSB1bmxpbmtlZC4KKwkgKiBUaGUgY2hlY2sgcHJvdGVjdCB1cyBmcm9tIGRvaW5nIGEgZG91YmxlIHVubGluayAoIGNyYXNoICkuCiAJICovCi0JbXV0ZXhfbG9jaygmZXBtdXRleCk7CisJZXJyb3IgPSAtRU5PRU5UOworCWlmICghZXBfcmJfbGlua2VkKCZlcGktPnJibikpCisJCWdvdG8gZXJyb3JfcmV0dXJuOwogCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KGxzdGhlYWQpKSB7Ci0JCWVwaSA9IGxpc3RfZmlyc3RfZW50cnkobHN0aGVhZCwgc3RydWN0IGVwaXRlbSwgZmxsaW5rKTsKKwkvKgorCSAqIENsZWFyIHRoZSBldmVudCBtYXNrIGZvciB0aGUgdW5saW5rZWQgaXRlbS4gVGhpcyB3aWxsIGF2b2lkIGl0ZW0KKwkgKiBub3RpZmljYXRpb25zIHRvIGJlIHNlbnQgYWZ0ZXIgdGhlIHVubGluayBvcGVyYXRpb24gZnJvbSBpbnNpZGUKKwkgKiB0aGUga2VybmVsLT51c2Vyc3BhY2UgZXZlbnQgdHJhbnNmZXIgbG9vcC4KKwkgKi8KKwllcGktPmV2ZW50LmV2ZW50cyA9IDA7CiAKLQkJZXAgPSBlcGktPmVwOworCS8qCisJICogQXQgdGhpcyBwb2ludCBpcyBzYWZlIHRvIGRvIHRoZSBqb2IsIHVubGluayB0aGUgaXRlbSBmcm9tIG91ciByYi10cmVlLgorCSAqIFRoaXMgb3BlcmF0aW9uIHRvZ2hldGVyIHdpdGggdGhlIGFib3ZlIGNoZWNrIGNsb3NlcyB0aGUgZG9vciB0bworCSAqIGRvdWJsZSB1bmxpbmtzLgorCSAqLworCWVwX3JiX2VyYXNlKCZlcGktPnJibiwgJmVwLT5yYnIpOworCisJLyoKKwkgKiBJZiB0aGUgaXRlbSB3ZSBhcmUgZ29pbmcgdG8gcmVtb3ZlIGlzIGluc2lkZSB0aGUgcmVhZHkgZmlsZSBkZXNjcmlwdG9ycworCSAqIHdlIHdhbnQgdG8gcmVtb3ZlIGl0IGZyb20gdGhpcyBsaXN0IHRvIGF2b2lkIHN0YWxlIGV2ZW50cy4KKwkgKi8KKwlpZiAoZXBfaXNfbGlua2VkKCZlcGktPnJkbGxpbmspKQorCQlsaXN0X2RlbF9pbml0KCZlcGktPnJkbGxpbmspOworCisJZXJyb3IgPSAwOworZXJyb3JfcmV0dXJuOgorCisJRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IGVwX3VubGluayglcCwgJXApID0gJWRcbiIsCisJCSAgICAgY3VycmVudCwgZXAsIGVwaS0+ZmZkLmZpbGUsIGVycm9yKSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBJbmNyZW1lbnQgdGhlIHVzYWdlIGNvdW50IG9mIHRoZSAic3RydWN0IGVwaXRlbSIgbWFraW5nIGl0IHN1cmUKKyAqIHRoYXQgdGhlIHVzZXIgd2lsbCBoYXZlIGEgdmFsaWQgcG9pbnRlciB0byByZWZlcmVuY2UuCisgKi8KK3N0YXRpYyB2b2lkIGVwX3VzZV9lcGl0ZW0oc3RydWN0IGVwaXRlbSAqZXBpKQoreworCWF0b21pY19pbmMoJmVwaS0+dXNlY250KTsKK30KKworLyoKKyAqIERlY3JlbWVudCAoIHJlbGVhc2UgKSB0aGUgdXNhZ2UgY291bnQgYnkgc2lnbmFsaW5nIHRoYXQgdGhlIHVzZXIKKyAqIGhhcyBmaW5pc2hlZCB1c2luZyB0aGUgc3RydWN0dXJlLiBJdCBtaWdodCBsZWFkIHRvIGZyZWVpbmcgdGhlCisgKiBzdHJ1Y3R1cmUgaXRzZWxmIGlmIHRoZSBjb3VudCBnb2VzIHRvIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkIGVwX3JlbGVhc2VfZXBpdGVtKHN0cnVjdCBlcGl0ZW0gKmVwaSkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmZXBpLT51c2VjbnQpKQorCQlrbWVtX2NhY2hlX2ZyZWUoZXBpX2NhY2hlLCBlcGkpOworfQorCisvKgorICogUmVtb3ZlcyBhICJzdHJ1Y3QgZXBpdGVtIiBmcm9tIHRoZSBldmVudHBvbGwgUkIgdHJlZSBhbmQgZGVhbGxvY2F0ZXMKKyAqIGFsbCB0aGUgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKi8KK3N0YXRpYyBpbnQgZXBfcmVtb3ZlKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBpdGVtICplcGkpCit7CisJaW50IGVycm9yOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBlcGktPmZmZC5maWxlOworCisJLyoKKwkgKiBSZW1vdmVzIHBvbGwgd2FpdCBxdWV1ZSBob29rcy4gV2UgX2hhdmVfIHRvIGRvIHRoaXMgd2l0aG91dCBob2xkaW5nCisJICogdGhlICJlcC0+bG9jayIgb3RoZXJ3aXNlIGEgZGVhZGxvY2sgbWlnaHQgb2NjdXIuIFRoaXMgYmVjYXVzZSBvZiB0aGUKKwkgKiBzZXF1ZW5jZSBvZiB0aGUgbG9jayBhY3F1aXNpdGlvbi4gSGVyZSB3ZSBkbyAiZXAtPmxvY2siIHRoZW4gdGhlIHdhaXQKKwkgKiBxdWV1ZSBoZWFkIGxvY2sgd2hlbiB1bnJlZ2lzdGVyaW5nIHRoZSB3YWl0IHF1ZXVlLiBUaGUgd2FrZXVwIGNhbGxiYWNrCisJICogd2lsbCBydW4gYnkgaG9sZGluZyB0aGUgd2FpdCBxdWV1ZSBoZWFkIGxvY2sgYW5kIHdpbGwgY2FsbCBvdXIgY2FsbGJhY2sKKwkgKiB0aGF0IHdpbGwgdHJ5IHRvIGdldCAiZXAtPmxvY2siLgorCSAqLworCWVwX3VucmVnaXN0ZXJfcG9sbHdhaXQoZXAsIGVwaSk7CisKKwkvKiBSZW1vdmUgdGhlIGN1cnJlbnQgaXRlbSBmcm9tIHRoZSBsaXN0IG9mIGVwb2xsIGhvb2tzICovCisJc3Bpbl9sb2NrKCZmaWxlLT5mX2VwX2xvY2spOworCWlmIChlcF9pc19saW5rZWQoJmVwaS0+ZmxsaW5rKSkKIAkJbGlzdF9kZWxfaW5pdCgmZXBpLT5mbGxpbmspOwotCQlkb3duX3dyaXRlKCZlcC0+c2VtKTsKLQkJZXBfcmVtb3ZlKGVwLCBlcGkpOwotCQl1cF93cml0ZSgmZXAtPnNlbSk7Ci0JfQorCXNwaW5fdW5sb2NrKCZmaWxlLT5mX2VwX2xvY2spOwogCi0JbXV0ZXhfdW5sb2NrKCZlcG11dGV4KTsKLX0KKwkvKiBXZSBuZWVkIHRvIGFjcXVpcmUgdGhlIHdyaXRlIElSUSBsb2NrIGJlZm9yZSBjYWxsaW5nIGVwX3VubGluaygpICovCisJd3JpdGVfbG9ja19pcnFzYXZlKCZlcC0+bG9jaywgZmxhZ3MpOwogCisJLyogUmVhbGx5IHVubGluayB0aGUgaXRlbSBmcm9tIHRoZSBSQiB0cmVlICovCisJZXJyb3IgPSBlcF91bmxpbmsoZXAsIGVwaSk7CiAKLS8qCi0gKiBJdCBvcGVucyBhbiBldmVudHBvbGwgZmlsZSBkZXNjcmlwdG9yIGJ5IHN1Z2dlc3RpbmcgYSBzdG9yYWdlIG9mICJzaXplIgotICogZmlsZSBkZXNjcmlwdG9ycy4gVGhlIHNpemUgcGFyYW1ldGVyIGlzIGp1c3QgYW4gaGludCBhYm91dCBob3cgdG8gc2l6ZQotICogZGF0YSBzdHJ1Y3R1cmVzLiBJdCB3b24ndCBwcmV2ZW50IHRoZSB1c2VyIHRvIHN0b3JlIG1vcmUgdGhhbiAic2l6ZSIKLSAqIGZpbGUgZGVzY3JpcHRvcnMgaW5zaWRlIHRoZSBlcG9sbCBpbnRlcmZhY2UuIEl0IGlzIHRoZSBrZXJuZWwgcGFydCBvZgotICogdGhlIHVzZXJzcGFjZSBlcG9sbF9jcmVhdGUoMikuCi0gKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfZXBvbGxfY3JlYXRlKGludCBzaXplKQotewotCWludCBlcnJvciwgZmQgPSAtMTsKLQlzdHJ1Y3QgZXZlbnRwb2xsICplcDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBmaWxlICpmaWxlOworCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+bG9jaywgZmxhZ3MpOwogCi0JRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IHN5c19lcG9sbF9jcmVhdGUoJWQpXG4iLAotCQkgICAgIGN1cnJlbnQsIHNpemUpKTsKLQotCS8qCi0JICogU2FuaXR5IGNoZWNrIG9uIHRoZSBzaXplIHBhcmFtZXRlciwgYW5kIGNyZWF0ZSB0aGUgaW50ZXJuYWwgZGF0YQotCSAqIHN0cnVjdHVyZSAoICJzdHJ1Y3QgZXZlbnRwb2xsIiApLgotCSAqLwotCWVycm9yID0gLUVJTlZBTDsKLQlpZiAoc2l6ZSA8PSAwIHx8IChlcnJvciA9IGVwX2FsbG9jKCZlcCkpICE9IDApCi0JCWdvdG8gZWV4aXRfMTsKLQotCS8qCi0JICogQ3JlYXRlcyBhbGwgdGhlIGl0ZW1zIG5lZWRlZCB0byBzZXR1cCBhbiBldmVudHBvbGwgZmlsZS4gVGhhdCBpcywKLQkgKiBhIGZpbGUgc3RydWN0dXJlLCBhbmQgaW5vZGUgYW5kIGEgZnJlZSBmaWxlIGRlc2NyaXB0b3IuCi0JICovCi0JZXJyb3IgPSBlcF9nZXRmZCgmZmQsICZpbm9kZSwgJmZpbGUsIGVwKTsKIAlpZiAoZXJyb3IpCi0JCWdvdG8gZWV4aXRfMjsKKwkJZ290byBlcnJvcl9yZXR1cm47CiAKLQlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX2NyZWF0ZSglZCkgPSAlZFxuIiwKLQkJICAgICBjdXJyZW50LCBzaXplLCBmZCkpOworCS8qIEF0IHRoaXMgcG9pbnQgaXQgaXMgc2FmZSB0byBmcmVlIHRoZSBldmVudHBvbGwgaXRlbSAqLworCWVwX3JlbGVhc2VfZXBpdGVtKGVwaSk7CiAKLQlyZXR1cm4gZmQ7Ci0KLWVleGl0XzI6Ci0JZXBfZnJlZShlcCk7Ci0Ja2ZyZWUoZXApOwotZWV4aXRfMToKLQlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX2NyZWF0ZSglZCkgPSAlZFxuIiwKLQkJICAgICBjdXJyZW50LCBzaXplLCBlcnJvcikpOwotCXJldHVybiBlcnJvcjsKLX0KLQotCi0vKgotICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBjb250cm9sbGVyIGludGVyZmFjZSBmb3IKLSAqIHRoZSBldmVudHBvbGwgZmlsZSB0aGF0IGVuYWJsZXMgdGhlIGluc2VydGlvbi9yZW1vdmFsL2NoYW5nZSBvZgotICogZmlsZSBkZXNjcmlwdG9ycyBpbnNpZGUgdGhlIGludGVyZXN0IHNldC4gIEl0IHJlcHJlc2VudHMKLSAqIHRoZSBrZXJuZWwgcGFydCBvZiB0aGUgdXNlciBzcGFjZSBlcG9sbF9jdGwoMikuCi0gKi8KLWFzbWxpbmthZ2UgbG9uZwotc3lzX2Vwb2xsX2N0bChpbnQgZXBmZCwgaW50IG9wLCBpbnQgZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50KQotewotCWludCBlcnJvcjsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSwgKnRmaWxlOwotCXN0cnVjdCBldmVudHBvbGwgKmVwOwotCXN0cnVjdCBlcGl0ZW0gKmVwaTsKLQlzdHJ1Y3QgZXBvbGxfZXZlbnQgZXBkczsKLQotCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBzeXNfZXBvbGxfY3RsKCVkLCAlZCwgJWQsICVwKVxuIiwKLQkJICAgICBjdXJyZW50LCBlcGZkLCBvcCwgZmQsIGV2ZW50KSk7Ci0KLQllcnJvciA9IC1FRkFVTFQ7Ci0JaWYgKGVwX29wX2hhc19ldmVudChvcCkgJiYKLQkgICAgY29weV9mcm9tX3VzZXIoJmVwZHMsIGV2ZW50LCBzaXplb2Yoc3RydWN0IGVwb2xsX2V2ZW50KSkpCi0JCWdvdG8gZWV4aXRfMTsKLQotCS8qIEdldCB0aGUgInN0cnVjdCBmaWxlICoiIGZvciB0aGUgZXZlbnRwb2xsIGZpbGUgKi8KLQllcnJvciA9IC1FQkFERjsKLQlmaWxlID0gZmdldChlcGZkKTsKLQlpZiAoIWZpbGUpCi0JCWdvdG8gZWV4aXRfMTsKLQotCS8qIEdldCB0aGUgInN0cnVjdCBmaWxlICoiIGZvciB0aGUgdGFyZ2V0IGZpbGUgKi8KLQl0ZmlsZSA9IGZnZXQoZmQpOwotCWlmICghdGZpbGUpCi0JCWdvdG8gZWV4aXRfMjsKLQotCS8qIFRoZSB0YXJnZXQgZmlsZSBkZXNjcmlwdG9yIG11c3Qgc3VwcG9ydCBwb2xsICovCi0JZXJyb3IgPSAtRVBFUk07Ci0JaWYgKCF0ZmlsZS0+Zl9vcCB8fCAhdGZpbGUtPmZfb3AtPnBvbGwpCi0JCWdvdG8gZWV4aXRfMzsKLQotCS8qCi0JICogV2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBmaWxlIHN0cnVjdHVyZSB1bmRlcm5lYXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IKLQkgKiB0aGUgdXNlciBwYXNzZWQgdG8gdXMgX2lzXyBhbiBldmVudHBvbGwgZmlsZS4gQW5kIGFsc28gd2UgZG8gbm90IHBlcm1pdAotCSAqIGFkZGluZyBhbiBlcG9sbCBmaWxlIGRlc2NyaXB0b3IgaW5zaWRlIGl0c2VsZi4KLQkgKi8KLQllcnJvciA9IC1FSU5WQUw7Ci0JaWYgKGZpbGUgPT0gdGZpbGUgfHwgIWlzX2ZpbGVfZXBvbGwoZmlsZSkpCi0JCWdvdG8gZWV4aXRfMzsKLQotCS8qCi0JICogQXQgdGhpcyBwb2ludCBpdCBpcyBzYWZlIHRvIGFzc3VtZSB0aGF0IHRoZSAicHJpdmF0ZV9kYXRhIiBjb250YWlucwotCSAqIG91ciBvd24gZGF0YSBzdHJ1Y3R1cmUuCi0JICovCi0JZXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlkb3duX3dyaXRlKCZlcC0+c2VtKTsKLQotCS8qIFRyeSB0byBsb29rdXAgdGhlIGZpbGUgaW5zaWRlIG91ciBSQiB0cmVlICovCi0JZXBpID0gZXBfZmluZChlcCwgdGZpbGUsIGZkKTsKLQotCWVycm9yID0gLUVJTlZBTDsKLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBFUE9MTF9DVExfQUREOgotCQlpZiAoIWVwaSkgewotCQkJZXBkcy5ldmVudHMgfD0gUE9MTEVSUiB8IFBPTExIVVA7Ci0KLQkJCWVycm9yID0gZXBfaW5zZXJ0KGVwLCAmZXBkcywgdGZpbGUsIGZkKTsKLQkJfSBlbHNlCi0JCQllcnJvciA9IC1FRVhJU1Q7Ci0JCWJyZWFrOwotCWNhc2UgRVBPTExfQ1RMX0RFTDoKLQkJaWYgKGVwaSkKLQkJCWVycm9yID0gZXBfcmVtb3ZlKGVwLCBlcGkpOwotCQllbHNlCi0JCQllcnJvciA9IC1FTk9FTlQ7Ci0JCWJyZWFrOwotCWNhc2UgRVBPTExfQ1RMX01PRDoKLQkJaWYgKGVwaSkgewotCQkJZXBkcy5ldmVudHMgfD0gUE9MTEVSUiB8IFBPTExIVVA7Ci0JCQllcnJvciA9IGVwX21vZGlmeShlcCwgZXBpLCAmZXBkcyk7Ci0JCX0gZWxzZQotCQkJZXJyb3IgPSAtRU5PRU5UOwotCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIFRoZSBmdW5jdGlvbiBlcF9maW5kKCkgaW5jcmVtZW50cyB0aGUgdXNhZ2UgY291bnQgb2YgdGhlIHN0cnVjdHVyZQotCSAqIHNvLCBpZiB0aGlzIGlzIG5vdCBOVUxMLCB3ZSBuZWVkIHRvIHJlbGVhc2UgaXQuCi0JICovCi0JaWYgKGVwaSkKLQkJZXBfcmVsZWFzZV9lcGl0ZW0oZXBpKTsKLQotCXVwX3dyaXRlKCZlcC0+c2VtKTsKLQotZWV4aXRfMzoKLQlmcHV0KHRmaWxlKTsKLWVleGl0XzI6Ci0JZnB1dChmaWxlKTsKLWVleGl0XzE6Ci0JRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IHN5c19lcG9sbF9jdGwoJWQsICVkLCAlZCwgJXApID0gJWRcbiIsCi0JCSAgICAgY3VycmVudCwgZXBmZCwgb3AsIGZkLCBldmVudCwgZXJyb3IpKTsKKwllcnJvciA9IDA7CitlcnJvcl9yZXR1cm46CisJRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IGVwX3JlbW92ZSglcCwgJXApID0gJWRcbiIsCisJCSAgICAgY3VycmVudCwgZXAsIGZpbGUsIGVycm9yKSk7CiAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLQotLyoKLSAqIEltcGxlbWVudCB0aGUgZXZlbnQgd2FpdCBpbnRlcmZhY2UgZm9yIHRoZSBldmVudHBvbGwgZmlsZS4gSXQgaXMgdGhlIGtlcm5lbAotICogcGFydCBvZiB0aGUgdXNlciBzcGFjZSBlcG9sbF93YWl0KDIpLgotICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2Vwb2xsX3dhaXQoaW50IGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cywKLQkJCSAgICAgICBpbnQgbWF4ZXZlbnRzLCBpbnQgdGltZW91dCkKLXsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IGZpbGUgKmZpbGU7Ci0Jc3RydWN0IGV2ZW50cG9sbCAqZXA7Ci0KLQlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX3dhaXQoJWQsICVwLCAlZCwgJWQpXG4iLAotCQkgICAgIGN1cnJlbnQsIGVwZmQsIGV2ZW50cywgbWF4ZXZlbnRzLCB0aW1lb3V0KSk7Ci0KLQkvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZXZlbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyAqLwotCWlmIChtYXhldmVudHMgPD0gMCB8fCBtYXhldmVudHMgPiBFUF9NQVhfRVZFTlRTKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFZlcmlmeSB0aGF0IHRoZSBhcmVhIHBhc3NlZCBieSB0aGUgdXNlciBpcyB3cml0ZWFibGUgKi8KLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGV2ZW50cywgbWF4ZXZlbnRzICogc2l6ZW9mKHN0cnVjdCBlcG9sbF9ldmVudCkpKSB7Ci0JCWVycm9yID0gLUVGQVVMVDsKLQkJZ290byBlZXhpdF8xOwotCX0KLQotCS8qIEdldCB0aGUgInN0cnVjdCBmaWxlICoiIGZvciB0aGUgZXZlbnRwb2xsIGZpbGUgKi8KLQllcnJvciA9IC1FQkFERjsKLQlmaWxlID0gZmdldChlcGZkKTsKLQlpZiAoIWZpbGUpCi0JCWdvdG8gZWV4aXRfMTsKLQotCS8qCi0JICogV2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBmaWxlIHN0cnVjdHVyZSB1bmRlcm5lYXRoIHRoZSBmZAotCSAqIHRoZSB1c2VyIHBhc3NlZCB0byB1cyBfaXNfIGFuIGV2ZW50cG9sbCBmaWxlLgotCSAqLwotCWVycm9yID0gLUVJTlZBTDsKLQlpZiAoIWlzX2ZpbGVfZXBvbGwoZmlsZSkpCi0JCWdvdG8gZWV4aXRfMjsKLQotCS8qCi0JICogQXQgdGhpcyBwb2ludCBpdCBpcyBzYWZlIHRvIGFzc3VtZSB0aGF0IHRoZSAicHJpdmF0ZV9kYXRhIiBjb250YWlucwotCSAqIG91ciBvd24gZGF0YSBzdHJ1Y3R1cmUuCi0JICovCi0JZXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQkvKiBUaW1lIHRvIGZpc2ggZm9yIGV2ZW50cyAuLi4gKi8KLQllcnJvciA9IGVwX3BvbGwoZXAsIGV2ZW50cywgbWF4ZXZlbnRzLCB0aW1lb3V0KTsKLQotZWV4aXRfMjoKLQlmcHV0KGZpbGUpOwotZWV4aXRfMToKLQlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX3dhaXQoJWQsICVwLCAlZCwgJWQpID0gJWRcbiIsCi0JCSAgICAgY3VycmVudCwgZXBmZCwgZXZlbnRzLCBtYXhldmVudHMsIHRpbWVvdXQsIGVycm9yKSk7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLQotI2lmZGVmIFRJRl9SRVNUT1JFX1NJR01BU0sKLQotLyoKLSAqIEltcGxlbWVudCB0aGUgZXZlbnQgd2FpdCBpbnRlcmZhY2UgZm9yIHRoZSBldmVudHBvbGwgZmlsZS4gSXQgaXMgdGhlIGtlcm5lbAotICogcGFydCBvZiB0aGUgdXNlciBzcGFjZSBlcG9sbF9wd2FpdCgyKS4KLSAqLwotYXNtbGlua2FnZSBsb25nIHN5c19lcG9sbF9wd2FpdChpbnQgZXBmZCwgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnRzLAotCQlpbnQgbWF4ZXZlbnRzLCBpbnQgdGltZW91dCwgY29uc3Qgc2lnc2V0X3QgX191c2VyICpzaWdtYXNrLAotCQlzaXplX3Qgc2lnc2V0c2l6ZSkKLXsKLQlpbnQgZXJyb3I7Ci0Jc2lnc2V0X3Qga3NpZ21hc2ssIHNpZ3NhdmVkOwotCi0JLyoKLQkgKiBJZiB0aGUgY2FsbGVyIHdhbnRzIGEgY2VydGFpbiBzaWduYWwgbWFzayB0byBiZSBzZXQgZHVyaW5nIHRoZSB3YWl0LAotCSAqIHdlIGFwcGx5IGl0IGhlcmUuCi0JICovCi0JaWYgKHNpZ21hc2spIHsKLQkJaWYgKHNpZ3NldHNpemUgIT0gc2l6ZW9mKHNpZ3NldF90KSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmtzaWdtYXNrLCBzaWdtYXNrLCBzaXplb2Yoa3NpZ21hc2spKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlzaWdkZWxzZXRtYXNrKCZrc2lnbWFzaywgc2lnbWFzayhTSUdLSUxMKSB8IHNpZ21hc2soU0lHU1RPUCkpOwotCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmtzaWdtYXNrLCAmc2lnc2F2ZWQpOwotCX0KLQotCWVycm9yID0gc3lzX2Vwb2xsX3dhaXQoZXBmZCwgZXZlbnRzLCBtYXhldmVudHMsIHRpbWVvdXQpOwotCi0JLyoKLQkgKiBJZiB3ZSBjaGFuZ2VkIHRoZSBzaWduYWwgbWFzaywgd2UgbmVlZCB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBvbmUuCi0JICogSW4gY2FzZSB3ZSd2ZSBnb3QgYSBzaWduYWwgd2hpbGUgd2FpdGluZywgd2UgZG8gbm90IHJlc3RvcmUgdGhlCi0JICogc2lnbmFsIG1hc2sgeWV0LCBhbmQgd2UgYWxsb3cgZG9fc2lnbmFsKCkgdG8gZGVsaXZlciB0aGUgc2lnbmFsIG9uCi0JICogdGhlIHdheSBiYWNrIHRvIHVzZXJzcGFjZSwgYmVmb3JlIHRoZSBzaWduYWwgbWFzayBpcyByZXN0b3JlZC4KLQkgKi8KLQlpZiAoc2lnbWFzaykgewotCQlpZiAoZXJyb3IgPT0gLUVJTlRSKSB7Ci0JCQltZW1jcHkoJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2ssICZzaWdzYXZlZCwKLQkJCQlzaXplb2Yoc2lnc2F2ZWQpKTsKLQkJCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKLQkJfSBlbHNlCi0JCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNpZ3NhdmVkLCBOVUxMKTsKLQl9Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLSNlbmRpZiAvKiAjaWZkZWYgVElGX1JFU1RPUkVfU0lHTUFTSyAqLwotCi0KLS8qCi0gKiBDcmVhdGVzIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgdXNlZCBieSB0aGUgZXBvbGwgaW50ZXJmYWNlLgotICovCi1zdGF0aWMgaW50IGVwX2dldGZkKGludCAqZWZkLCBzdHJ1Y3QgaW5vZGUgKiplaW5vZGUsIHN0cnVjdCBmaWxlICoqZWZpbGUsCi0JCSAgICBzdHJ1Y3QgZXZlbnRwb2xsICplcCkKLXsKLQlzdHJ1Y3QgcXN0ciB0aGlzOwotCWNoYXIgbmFtZVszMl07Ci0Jc3RydWN0IGRlbnRyeSAqZGVudHJ5OwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IGZpbGUgKmZpbGU7Ci0JaW50IGVycm9yLCBmZDsKLQotCS8qIEdldCBhbiByZWFkeSB0byB1c2UgZmlsZSAqLwotCWVycm9yID0gLUVORklMRTsKLQlmaWxlID0gZ2V0X2VtcHR5X2ZpbHAoKTsKLQlpZiAoIWZpbGUpCi0JCWdvdG8gZWV4aXRfMTsKLQotCS8qIEFsbG9jYXRlcyBhbiBpbm9kZSBmcm9tIHRoZSBldmVudHBvbGwgZmlsZSBzeXN0ZW0gKi8KLQlpbm9kZSA9IGVwX2V2ZW50cG9sbF9pbm9kZSgpOwotCWlmIChJU19FUlIoaW5vZGUpKSB7Ci0JCWVycm9yID0gUFRSX0VSUihpbm9kZSk7Ci0JCWdvdG8gZWV4aXRfMjsKLQl9Ci0KLQkvKiBBbGxvY2F0ZXMgYSBmcmVlIGRlc2NyaXB0b3IgdG8gcGx1ZyB0aGUgZmlsZSBvbnRvICovCi0JZXJyb3IgPSBnZXRfdW51c2VkX2ZkKCk7Ci0JaWYgKGVycm9yIDwgMCkKLQkJZ290byBlZXhpdF8zOwotCWZkID0gZXJyb3I7Ci0KLQkvKgotCSAqIExpbmsgdGhlIGlub2RlIHRvIGEgZGlyZWN0b3J5IGVudHJ5IGJ5IGNyZWF0aW5nIGEgdW5pcXVlIG5hbWUKLQkgKiB1c2luZyB0aGUgaW5vZGUgbnVtYmVyLgotCSAqLwotCWVycm9yID0gLUVOT01FTTsKLQlzcHJpbnRmKG5hbWUsICJbJWx1XSIsIGlub2RlLT5pX2lubyk7Ci0JdGhpcy5uYW1lID0gbmFtZTsKLQl0aGlzLmxlbiA9IHN0cmxlbihuYW1lKTsKLQl0aGlzLmhhc2ggPSBpbm9kZS0+aV9pbm87Ci0JZGVudHJ5ID0gZF9hbGxvYyhldmVudHBvbGxfbW50LT5tbnRfc2ItPnNfcm9vdCwgJnRoaXMpOwotCWlmICghZGVudHJ5KQotCQlnb3RvIGVleGl0XzQ7Ci0JZGVudHJ5LT5kX29wID0gJmV2ZW50cG9sbGZzX2RlbnRyeV9vcGVyYXRpb25zOwotCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwotCWZpbGUtPmZfcGF0aC5tbnQgPSBtbnRnZXQoZXZlbnRwb2xsX21udCk7Ci0JZmlsZS0+Zl9wYXRoLmRlbnRyeSA9IGRlbnRyeTsKLQlmaWxlLT5mX21hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOwotCi0JZmlsZS0+Zl9wb3MgPSAwOwotCWZpbGUtPmZfZmxhZ3MgPSBPX1JET05MWTsKLQlmaWxlLT5mX29wID0gJmV2ZW50cG9sbF9mb3BzOwotCWZpbGUtPmZfbW9kZSA9IEZNT0RFX1JFQUQ7Ci0JZmlsZS0+Zl92ZXJzaW9uID0gMDsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBlcDsKLQotCS8qIEluc3RhbGwgdGhlIG5ldyBzZXR1cCBmaWxlIGludG8gdGhlIGFsbG9jYXRlZCBmZC4gKi8KLQlmZF9pbnN0YWxsKGZkLCBmaWxlKTsKLQotCSplZmQgPSBmZDsKLQkqZWlub2RlID0gaW5vZGU7Ci0JKmVmaWxlID0gZmlsZTsKLQlyZXR1cm4gMDsKLQotZWV4aXRfNDoKLQlwdXRfdW51c2VkX2ZkKGZkKTsKLWVleGl0XzM6Ci0JaXB1dChpbm9kZSk7Ci1lZXhpdF8yOgotCXB1dF9maWxwKGZpbGUpOwotZWV4aXRfMToKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLQotc3RhdGljIGludCBlcF9hbGxvYyhzdHJ1Y3QgZXZlbnRwb2xsICoqcGVwKQotewotCXN0cnVjdCBldmVudHBvbGwgKmVwID0ga3phbGxvYyhzaXplb2YoKmVwKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWVwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJ3bG9ja19pbml0KCZlcC0+bG9jayk7Ci0JaW5pdF9yd3NlbSgmZXAtPnNlbSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZXAtPndxKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZlcC0+cG9sbF93YWl0KTsKLQlJTklUX0xJU1RfSEVBRCgmZXAtPnJkbGxpc3QpOwotCWVwLT5yYnIgPSBSQl9ST09UOwotCi0JKnBlcCA9IGVwOwotCi0JRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IGVwX2FsbG9jKCkgZXA9JXBcbiIsCi0JCSAgICAgY3VycmVudCwgZXApKTsKLQlyZXR1cm4gMDsKLX0KLQotCiBzdGF0aWMgdm9pZCBlcF9mcmVlKHN0cnVjdCBldmVudHBvbGwgKmVwKQogewogCXN0cnVjdCByYl9ub2RlICpyYnA7CkBAIC04NjUsNiArNTM2LDEwNCBAQAogCW11dGV4X3VubG9jaygmZXBtdXRleCk7CiB9CiAKK3N0YXRpYyBpbnQgZXBfZXZlbnRwb2xsX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGV2ZW50cG9sbCAqZXAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZXApIHsKKwkJZXBfZnJlZShlcCk7CisJCWtmcmVlKGVwKTsKKwl9CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogY2xvc2UoKSBlcD0lcFxuIiwgY3VycmVudCwgZXApKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBlcF9ldmVudHBvbGxfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgcG9sbGZsYWdzID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBldmVudHBvbGwgKmVwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogSW5zZXJ0IGluc2lkZSBvdXIgcG9sbCB3YWl0IHF1ZXVlICovCisJcG9sbF93YWl0KGZpbGUsICZlcC0+cG9sbF93YWl0LCB3YWl0KTsKKworCS8qIENoZWNrIG91ciBjb25kaXRpb24gKi8KKwlyZWFkX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmVwLT5yZGxsaXN0KSkKKwkJcG9sbGZsYWdzID0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHBvbGxmbGFnczsKK30KKworLyogRmlsZSBjYWxsYmFja3MgdGhhdCBpbXBsZW1lbnQgdGhlIGV2ZW50cG9sbCBmaWxlIGJlaGF2aW91ciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXZlbnRwb2xsX2ZvcHMgPSB7CisJLnJlbGVhc2UJPSBlcF9ldmVudHBvbGxfcmVsZWFzZSwKKwkucG9sbAkJPSBlcF9ldmVudHBvbGxfcG9sbAorfTsKKworLyogRmFzdCB0ZXN0IHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBhbiBldmVucG9sbCBmaWxlICovCitzdGF0aWMgaW5saW5lIGludCBpc19maWxlX2Vwb2xsKHN0cnVjdCBmaWxlICpmKQoreworCXJldHVybiBmLT5mX29wID09ICZldmVudHBvbGxfZm9wczsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gZXZlbnRwb2xsX3JlbGVhc2UoKSB0byB1bmxpbmsgZmlsZXMgZnJvbSB0aGUgZXZlbnRwb2xsCisgKiBpbnRlcmZhY2UuIFdlIG5lZWQgdG8gaGF2ZSB0aGlzIGZhY2lsaXR5IHRvIGNsZWFudXAgY29ycmVjdGx5IGZpbGVzIHRoYXQgYXJlCisgKiBjbG9zZWQgd2l0aG91dCBiZWluZyByZW1vdmVkIGZyb20gdGhlIGV2ZW50cG9sbCBpbnRlcmZhY2UuCisgKi8KK3ZvaWQgZXZlbnRwb2xsX3JlbGVhc2VfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsc3RoZWFkID0gJmZpbGUtPmZfZXBfbGlua3M7CisJc3RydWN0IGV2ZW50cG9sbCAqZXA7CisJc3RydWN0IGVwaXRlbSAqZXBpOworCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRvIGdldCAiZmlsZS0+Zl9lcF9sb2NrIiBiZWNhdXNlIGl0IGlzIG5vdAorCSAqIG5lY2Vzc2FyeS4gSXQgaXMgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIHdlJ3JlIGluIHRoZSAic3RydWN0IGZpbGUiCisJICogY2xlYW51cCBwYXRoLCBhbmQgdGhpcyBtZWFucyB0aGF0IG5vb25lIGlzIHVzaW5nIHRoaXMgZmlsZSBhbnltb3JlLgorCSAqIFRoZSBvbmx5IGhpdCBtaWdodCBjb21lIGZyb20gZXBfZnJlZSgpIGJ1dCBieSBob2xkaW5nIHRoZSBzZW1hcGhvcmUKKwkgKiB3aWxsIGNvcnJlY3RseSBzZXJpYWxpemUgdGhlIG9wZXJhdGlvbi4gV2UgZG8gbmVlZCB0byBhY3F1aXJlCisJICogImVwLT5zZW0iIGFmdGVyICJlcG11dGV4IiBiZWNhdXNlIGVwX3JlbW92ZSgpIHJlcXVpcmVzIGl0IHdoZW4gY2FsbGVkCisJICogZnJvbSBhbnl3aGVyZSBidXQgZXBfZnJlZSgpLgorCSAqLworCW11dGV4X2xvY2soJmVwbXV0ZXgpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KGxzdGhlYWQpKSB7CisJCWVwaSA9IGxpc3RfZmlyc3RfZW50cnkobHN0aGVhZCwgc3RydWN0IGVwaXRlbSwgZmxsaW5rKTsKKworCQllcCA9IGVwaS0+ZXA7CisJCWxpc3RfZGVsX2luaXQoJmVwaS0+ZmxsaW5rKTsKKwkJZG93bl93cml0ZSgmZXAtPnNlbSk7CisJCWVwX3JlbW92ZShlcCwgZXBpKTsKKwkJdXBfd3JpdGUoJmVwLT5zZW0pOworCX0KKworCW11dGV4X3VubG9jaygmZXBtdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgZXBfYWxsb2Moc3RydWN0IGV2ZW50cG9sbCAqKnBlcCkKK3sKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcCA9IGt6YWxsb2Moc2l6ZW9mKCplcCksIEdGUF9LRVJORUwpOworCisJaWYgKCFlcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyd2xvY2tfaW5pdCgmZXAtPmxvY2spOworCWluaXRfcndzZW0oJmVwLT5zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVwLT53cSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZXAtPnBvbGxfd2FpdCk7CisJSU5JVF9MSVNUX0hFQUQoJmVwLT5yZGxsaXN0KTsKKwllcC0+cmJyID0gUkJfUk9PVDsKKworCSpwZXAgPSBlcDsKKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBlcF9hbGxvYygpIGVwPSVwXG4iLAorCQkgICAgIGN1cnJlbnQsIGVwKSk7CisJcmV0dXJuIDA7Cit9CiAKIC8qCiAgKiBTZWFyY2ggdGhlIGZpbGUgaW5zaWRlIHRoZSBldmVudHBvbGwgdHJlZS4gSXQgYWRkIHVzYWdlIGNvdW50IHRvCkBAIC05MDIsMzEgKzY3MSw1OSBAQAogCXJldHVybiBlcGlyOwogfQogCi0KIC8qCi0gKiBJbmNyZW1lbnQgdGhlIHVzYWdlIGNvdW50IG9mIHRoZSAic3RydWN0IGVwaXRlbSIgbWFraW5nIGl0IHN1cmUKLSAqIHRoYXQgdGhlIHVzZXIgd2lsbCBoYXZlIGEgdmFsaWQgcG9pbnRlciB0byByZWZlcmVuY2UuCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayB0aGF0IGlzIHBhc3NlZCB0byB0aGUgd2FpdCBxdWV1ZSB3YWtldXAKKyAqIG1hY2hhbmlzbS4gSXQgaXMgY2FsbGVkIGJ5IHRoZSBzdG9yZWQgZmlsZSBkZXNjcmlwdG9ycyB3aGVuIHRoZXkKKyAqIGhhdmUgZXZlbnRzIHRvIHJlcG9ydC4KICAqLwotc3RhdGljIHZvaWQgZXBfdXNlX2VwaXRlbShzdHJ1Y3QgZXBpdGVtICplcGkpCitzdGF0aWMgaW50IGVwX3BvbGxfY2FsbGJhY2sod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLCBpbnQgc3luYywgdm9pZCAqa2V5KQogeworCWludCBwd2FrZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZXBpdGVtICplcGkgPSBlcF9pdGVtX2Zyb21fd2FpdCh3YWl0KTsKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcCA9IGVwaS0+ZXA7CiAKLQlhdG9taWNfaW5jKCZlcGktPnVzZWNudCk7CisJRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IHBvbGxfY2FsbGJhY2soJXApIGVwaT0lcCBlcD0lcFxuIiwKKwkJICAgICBjdXJyZW50LCBlcGktPmZmZC5maWxlLCBlcGksIGVwKSk7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIElmIHRoZSBldmVudCBtYXNrIGRvZXMgbm90IGNvbnRhaW4gYW55IHBvbGwoMikgZXZlbnQsIHdlIGNvbnNpZGVyIHRoZQorCSAqIGRlc2NyaXB0b3IgdG8gYmUgZGlzYWJsZWQuIFRoaXMgY29uZGl0aW9uIGlzIGxpa2VseSB0aGUgZWZmZWN0IG9mIHRoZQorCSAqIEVQT0xMT05FU0hPVCBiaXQgdGhhdCBkaXNhYmxlcyB0aGUgZGVzY3JpcHRvciB3aGVuIGFuIGV2ZW50IGlzIHJlY2VpdmVkLAorCSAqIHVudGlsIHRoZSBuZXh0IEVQT0xMX0NUTF9NT0Qgd2lsbCBiZSBpc3N1ZWQuCisJICovCisJaWYgKCEoZXBpLT5ldmVudC5ldmVudHMgJiB+RVBfUFJJVkFURV9CSVRTKSkKKwkJZ290byBpc19kaXNhYmxlZDsKKworCS8qIElmIHRoaXMgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSByZWFkeSBsaXN0IHdlIGV4aXQgc29vbiAqLworCWlmIChlcF9pc19saW5rZWQoJmVwaS0+cmRsbGluaykpCisJCWdvdG8gaXNfbGlua2VkOworCisJbGlzdF9hZGRfdGFpbCgmZXBpLT5yZGxsaW5rLCAmZXAtPnJkbGxpc3QpOworCitpc19saW5rZWQ6CisJLyoKKwkgKiBXYWtlIHVwICggaWYgYWN0aXZlICkgYm90aCB0aGUgZXZlbnRwb2xsIHdhaXQgbGlzdCBhbmQgdGhlIC0+cG9sbCgpCisJICogd2FpdCBsaXN0LgorCSAqLworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+d3EpKQorCQlfX3dha2VfdXBfbG9ja2VkKCZlcC0+d3EsIFRBU0tfVU5JTlRFUlJVUFRJQkxFIHwKKwkJCQkgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPnBvbGxfd2FpdCkpCisJCXB3YWtlKys7CisKK2lzX2Rpc2FibGVkOgorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+bG9jaywgZmxhZ3MpOworCisJLyogV2UgaGF2ZSB0byBjYWxsIHRoaXMgb3V0c2lkZSB0aGUgbG9jayAqLworCWlmIChwd2FrZSkKKwkJZXBfcG9sbF9zYWZld2FrZSgmcHN3LCAmZXAtPnBvbGxfd2FpdCk7CisKKwlyZXR1cm4gMTsKIH0KIAotCi0vKgotICogRGVjcmVtZW50ICggcmVsZWFzZSApIHRoZSB1c2FnZSBjb3VudCBieSBzaWduYWxpbmcgdGhhdCB0aGUgdXNlcgotICogaGFzIGZpbmlzaGVkIHVzaW5nIHRoZSBzdHJ1Y3R1cmUuIEl0IG1pZ2h0IGxlYWQgdG8gZnJlZWluZyB0aGUKLSAqIHN0cnVjdHVyZSBpdHNlbGYgaWYgdGhlIGNvdW50IGdvZXMgdG8gemVyby4KLSAqLwotc3RhdGljIHZvaWQgZXBfcmVsZWFzZV9lcGl0ZW0oc3RydWN0IGVwaXRlbSAqZXBpKQotewotCi0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmVwaS0+dXNlY250KSkKLQkJa21lbV9jYWNoZV9mcmVlKGVwaV9jYWNoZSwgZXBpKTsKLX0KLQotCiAvKgogICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgdGhhdCBpcyB1c2VkIHRvIGFkZCBvdXIgd2FpdCBxdWV1ZSB0byB0aGUKICAqIHRhcmdldCBmaWxlIHdha2V1cCBsaXN0cy4KQEAgLTk1MCw3ICs3NDcsNiBAQAogCX0KIH0KIAotCiBzdGF0aWMgdm9pZCBlcF9yYnRyZWVfaW5zZXJ0KHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBpdGVtICplcGkpCiB7CiAJaW50IGtjbXA7CkBAIC05NzAsNyArNzY2LDYgQEAKIAlyYl9pbnNlcnRfY29sb3IoJmVwaS0+cmJuLCAmZXAtPnJicik7CiB9CiAKLQogc3RhdGljIGludCBlcF9pbnNlcnQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnQsCiAJCSAgICAgc3RydWN0IGZpbGUgKnRmaWxlLCBpbnQgZmQpCiB7CkBAIC05ODEsNyArNzc2LDcgQEAKIAogCWVycm9yID0gLUVOT01FTTsKIAlpZiAoIShlcGkgPSBrbWVtX2NhY2hlX2FsbG9jKGVwaV9jYWNoZSwgR0ZQX0tFUk5FTCkpKQotCQlnb3RvIGVleGl0XzE7CisJCWdvdG8gZXJyb3JfcmV0dXJuOwogCiAJLyogSXRlbSBpbml0aWFsaXphdGlvbiBmb2xsb3cgaGVyZSAuLi4gKi8KIAllcF9yYl9pbml0bm9kZSgmZXBpLT5yYm4pOwpAQCAtMTAxMSw3ICs4MDYsNyBAQAogCSAqIGhpZ2ggbWVtb3J5IHByZXNzdXJlLgogCSAqLwogCWlmIChlcGktPm53YWl0IDwgMCkKLQkJZ290byBlZXhpdF8yOworCQlnb3RvIGVycm9yX3VucmVnaXN0ZXI7CiAKIAkvKiBBZGQgdGhlIGN1cnJlbnQgaXRlbSB0byB0aGUgbGlzdCBvZiBhY3RpdmUgZXBvbGwgaG9vayBmb3IgdGhpcyBmaWxlICovCiAJc3Bpbl9sb2NrKCZ0ZmlsZS0+Zl9lcF9sb2NrKTsKQEAgLTEwNDYsNyArODQxLDcgQEAKIAogCXJldHVybiAwOwogCi1lZXhpdF8yOgorZXJyb3JfdW5yZWdpc3RlcjoKIAllcF91bnJlZ2lzdGVyX3BvbGx3YWl0KGVwLCBlcGkpOwogCiAJLyoKQEAgLTEwNTksMTEgKzg1NCwxMCBAQAogCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+bG9jaywgZmxhZ3MpOwogCiAJa21lbV9jYWNoZV9mcmVlKGVwaV9jYWNoZSwgZXBpKTsKLWVleGl0XzE6CitlcnJvcl9yZXR1cm46CiAJcmV0dXJuIGVycm9yOwogfQogCi0KIC8qCiAgKiBNb2RpZnkgdGhlIGludGVyZXN0IGV2ZW50IG1hc2sgYnkgZHJvcHBpbmcgYW4gZXZlbnQgaWYgdGhlIG5ldyBtYXNrCiAgKiBoYXMgYSBtYXRjaCBpbiB0aGUgY3VycmVudCBmaWxlIHN0YXR1cy4KQEAgLTExMjYsMjE2ICs5MjAsNiBAQAogCXJldHVybiAwOwogfQogCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHVucmVnaXN0ZXIgcG9sbCBjYWxsYmFja3MgZnJvbSB0aGUgYXNzb2NpYXRlZCBmaWxlIGRlc2NyaXB0b3IuCi0gKiBTaW5jZSB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgaG9sZGluZyAiZXAtPmxvY2siIHRoZSBhdG9taWMgZXhjaGFuZ2UgdHJpY2sKLSAqIHdpbGwgcHJvdGVjdCB1cyBmcm9tIG11bHRpcGxlIHVucmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIGVwX3VucmVnaXN0ZXJfcG9sbHdhaXQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSkKLXsKLQlpbnQgbndhaXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbHN0aGVhZCA9ICZlcGktPnB3cWxpc3Q7Ci0Jc3RydWN0IGVwcG9sbF9lbnRyeSAqcHdxOwotCi0JLyogVGhpcyBpcyBjYWxsZWQgd2l0aG91dCBsb2Nrcywgc28gd2UgbmVlZCB0aGUgYXRvbWljIGV4Y2hhbmdlICovCi0JbndhaXQgPSB4Y2hnKCZlcGktPm53YWl0LCAwKTsKLQotCWlmIChud2FpdCkgewotCQl3aGlsZSAoIWxpc3RfZW1wdHkobHN0aGVhZCkpIHsKLQkJCXB3cSA9IGxpc3RfZmlyc3RfZW50cnkobHN0aGVhZCwgc3RydWN0IGVwcG9sbF9lbnRyeSwgbGxpbmspOwotCi0JCQlsaXN0X2RlbF9pbml0KCZwd3EtPmxsaW5rKTsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKHB3cS0+d2hlYWQsICZwd3EtPndhaXQpOwotCQkJa21lbV9jYWNoZV9mcmVlKHB3cV9jYWNoZSwgcHdxKTsKLQkJfQotCX0KLX0KLQotCi0vKgotICogVW5saW5rIHRoZSAic3RydWN0IGVwaXRlbSIgZnJvbSBhbGwgcGxhY2VzIGl0IG1pZ2h0IGhhdmUgYmVlbiBob29rZWQgdXAuCi0gKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggd3JpdGUgSVJRIGxvY2sgb24gImVwLT5sb2NrIi4KLSAqLwotc3RhdGljIGludCBlcF91bmxpbmsoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSkKLXsKLQlpbnQgZXJyb3I7Ci0KLQkvKgotCSAqIEl0IGNhbiBoYXBwZW4gdGhhdCB0aGlzIG9uZSBpcyBjYWxsZWQgZm9yIGFuIGl0ZW0gYWxyZWFkeSB1bmxpbmtlZC4KLQkgKiBUaGUgY2hlY2sgcHJvdGVjdCB1cyBmcm9tIGRvaW5nIGEgZG91YmxlIHVubGluayAoIGNyYXNoICkuCi0JICovCi0JZXJyb3IgPSAtRU5PRU5UOwotCWlmICghZXBfcmJfbGlua2VkKCZlcGktPnJibikpCi0JCWdvdG8gZWV4aXRfMTsKLQotCS8qCi0JICogQ2xlYXIgdGhlIGV2ZW50IG1hc2sgZm9yIHRoZSB1bmxpbmtlZCBpdGVtLiBUaGlzIHdpbGwgYXZvaWQgaXRlbQotCSAqIG5vdGlmaWNhdGlvbnMgdG8gYmUgc2VudCBhZnRlciB0aGUgdW5saW5rIG9wZXJhdGlvbiBmcm9tIGluc2lkZQotCSAqIHRoZSBrZXJuZWwtPnVzZXJzcGFjZSBldmVudCB0cmFuc2ZlciBsb29wLgotCSAqLwotCWVwaS0+ZXZlbnQuZXZlbnRzID0gMDsKLQotCS8qCi0JICogQXQgdGhpcyBwb2ludCBpcyBzYWZlIHRvIGRvIHRoZSBqb2IsIHVubGluayB0aGUgaXRlbSBmcm9tIG91ciByYi10cmVlLgotCSAqIFRoaXMgb3BlcmF0aW9uIHRvZ2hldGVyIHdpdGggdGhlIGFib3ZlIGNoZWNrIGNsb3NlcyB0aGUgZG9vciB0bwotCSAqIGRvdWJsZSB1bmxpbmtzLgotCSAqLwotCWVwX3JiX2VyYXNlKCZlcGktPnJibiwgJmVwLT5yYnIpOwotCi0JLyoKLQkgKiBJZiB0aGUgaXRlbSB3ZSBhcmUgZ29pbmcgdG8gcmVtb3ZlIGlzIGluc2lkZSB0aGUgcmVhZHkgZmlsZSBkZXNjcmlwdG9ycwotCSAqIHdlIHdhbnQgdG8gcmVtb3ZlIGl0IGZyb20gdGhpcyBsaXN0IHRvIGF2b2lkIHN0YWxlIGV2ZW50cy4KLQkgKi8KLQlpZiAoZXBfaXNfbGlua2VkKCZlcGktPnJkbGxpbmspKQotCQlsaXN0X2RlbF9pbml0KCZlcGktPnJkbGxpbmspOwotCi0JZXJyb3IgPSAwOwotZWV4aXRfMToKLQotCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBlcF91bmxpbmsoJXAsICVwKSA9ICVkXG4iLAotCQkgICAgIGN1cnJlbnQsIGVwLCBlcGktPmZmZC5maWxlLCBlcnJvcikpOwotCi0JcmV0dXJuIGVycm9yOwotfQotCi0KLS8qCi0gKiBSZW1vdmVzIGEgInN0cnVjdCBlcGl0ZW0iIGZyb20gdGhlIGV2ZW50cG9sbCBSQiB0cmVlIGFuZCBkZWFsbG9jYXRlcwotICogYWxsIHRoZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KLSAqLwotc3RhdGljIGludCBlcF9yZW1vdmUoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSkKLXsKLQlpbnQgZXJyb3I7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGVwaS0+ZmZkLmZpbGU7Ci0KLQkvKgotCSAqIFJlbW92ZXMgcG9sbCB3YWl0IHF1ZXVlIGhvb2tzLiBXZSBfaGF2ZV8gdG8gZG8gdGhpcyB3aXRob3V0IGhvbGRpbmcKLQkgKiB0aGUgImVwLT5sb2NrIiBvdGhlcndpc2UgYSBkZWFkbG9jayBtaWdodCBvY2N1ci4gVGhpcyBiZWNhdXNlIG9mIHRoZQotCSAqIHNlcXVlbmNlIG9mIHRoZSBsb2NrIGFjcXVpc2l0aW9uLiBIZXJlIHdlIGRvICJlcC0+bG9jayIgdGhlbiB0aGUgd2FpdAotCSAqIHF1ZXVlIGhlYWQgbG9jayB3aGVuIHVucmVnaXN0ZXJpbmcgdGhlIHdhaXQgcXVldWUuIFRoZSB3YWtldXAgY2FsbGJhY2sKLQkgKiB3aWxsIHJ1biBieSBob2xkaW5nIHRoZSB3YWl0IHF1ZXVlIGhlYWQgbG9jayBhbmQgd2lsbCBjYWxsIG91ciBjYWxsYmFjawotCSAqIHRoYXQgd2lsbCB0cnkgdG8gZ2V0ICJlcC0+bG9jayIuCi0JICovCi0JZXBfdW5yZWdpc3Rlcl9wb2xsd2FpdChlcCwgZXBpKTsKLQotCS8qIFJlbW92ZSB0aGUgY3VycmVudCBpdGVtIGZyb20gdGhlIGxpc3Qgb2YgZXBvbGwgaG9va3MgKi8KLQlzcGluX2xvY2soJmZpbGUtPmZfZXBfbG9jayk7Ci0JaWYgKGVwX2lzX2xpbmtlZCgmZXBpLT5mbGxpbmspKQotCQlsaXN0X2RlbF9pbml0KCZlcGktPmZsbGluayk7Ci0Jc3Bpbl91bmxvY2soJmZpbGUtPmZfZXBfbG9jayk7Ci0KLQkvKiBXZSBuZWVkIHRvIGFjcXVpcmUgdGhlIHdyaXRlIElSUSBsb2NrIGJlZm9yZSBjYWxsaW5nIGVwX3VubGluaygpICovCi0Jd3JpdGVfbG9ja19pcnFzYXZlKCZlcC0+bG9jaywgZmxhZ3MpOwotCi0JLyogUmVhbGx5IHVubGluayB0aGUgaXRlbSBmcm9tIHRoZSBSQiB0cmVlICovCi0JZXJyb3IgPSBlcF91bmxpbmsoZXAsIGVwaSk7Ci0KLQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChlcnJvcikKLQkJZ290byBlZXhpdF8xOwotCi0JLyogQXQgdGhpcyBwb2ludCBpdCBpcyBzYWZlIHRvIGZyZWUgdGhlIGV2ZW50cG9sbCBpdGVtICovCi0JZXBfcmVsZWFzZV9lcGl0ZW0oZXBpKTsKLQotCWVycm9yID0gMDsKLWVleGl0XzE6Ci0JRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IGVwX3JlbW92ZSglcCwgJXApID0gJWRcbiIsCi0JCSAgICAgY3VycmVudCwgZXAsIGZpbGUsIGVycm9yKSk7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB3YWl0IHF1ZXVlIHdha2V1cAotICogbWFjaGFuaXNtLiBJdCBpcyBjYWxsZWQgYnkgdGhlIHN0b3JlZCBmaWxlIGRlc2NyaXB0b3JzIHdoZW4gdGhleQotICogaGF2ZSBldmVudHMgdG8gcmVwb3J0LgotICovCi1zdGF0aWMgaW50IGVwX3BvbGxfY2FsbGJhY2sod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLCBpbnQgc3luYywgdm9pZCAqa2V5KQotewotCWludCBwd2FrZSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZXBpdGVtICplcGkgPSBlcF9pdGVtX2Zyb21fd2FpdCh3YWl0KTsKLQlzdHJ1Y3QgZXZlbnRwb2xsICplcCA9IGVwaS0+ZXA7Ci0KLQlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogcG9sbF9jYWxsYmFjayglcCkgZXBpPSVwIGVwPSVwXG4iLAotCQkgICAgIGN1cnJlbnQsIGVwaS0+ZmZkLmZpbGUsIGVwaSwgZXApKTsKLQotCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogSWYgdGhlIGV2ZW50IG1hc2sgZG9lcyBub3QgY29udGFpbiBhbnkgcG9sbCgyKSBldmVudCwgd2UgY29uc2lkZXIgdGhlCi0JICogZGVzY3JpcHRvciB0byBiZSBkaXNhYmxlZC4gVGhpcyBjb25kaXRpb24gaXMgbGlrZWx5IHRoZSBlZmZlY3Qgb2YgdGhlCi0JICogRVBPTExPTkVTSE9UIGJpdCB0aGF0IGRpc2FibGVzIHRoZSBkZXNjcmlwdG9yIHdoZW4gYW4gZXZlbnQgaXMgcmVjZWl2ZWQsCi0JICogdW50aWwgdGhlIG5leHQgRVBPTExfQ1RMX01PRCB3aWxsIGJlIGlzc3VlZC4KLQkgKi8KLQlpZiAoIShlcGktPmV2ZW50LmV2ZW50cyAmIH5FUF9QUklWQVRFX0JJVFMpKQotCQlnb3RvIGlzX2Rpc2FibGVkOwotCi0JLyogSWYgdGhpcyBmaWxlIGlzIGFscmVhZHkgaW4gdGhlIHJlYWR5IGxpc3Qgd2UgZXhpdCBzb29uICovCi0JaWYgKGVwX2lzX2xpbmtlZCgmZXBpLT5yZGxsaW5rKSkKLQkJZ290byBpc19saW5rZWQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZlcGktPnJkbGxpbmssICZlcC0+cmRsbGlzdCk7Ci0KLWlzX2xpbmtlZDoKLQkvKgotCSAqIFdha2UgdXAgKCBpZiBhY3RpdmUgKSBib3RoIHRoZSBldmVudHBvbGwgd2FpdCBsaXN0IGFuZCB0aGUgLT5wb2xsKCkKLQkgKiB3YWl0IGxpc3QuCi0JICovCi0JaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmVwLT53cSkpCi0JCV9fd2FrZV91cF9sb2NrZWQoJmVwLT53cSwgVEFTS19VTklOVEVSUlVQVElCTEUgfAotCQkJCSBUQVNLX0lOVEVSUlVQVElCTEUpOwotCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+cG9sbF93YWl0KSkKLQkJcHdha2UrKzsKLQotaXNfZGlzYWJsZWQ6Ci0Jd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBXZSBoYXZlIHRvIGNhbGwgdGhpcyBvdXRzaWRlIHRoZSBsb2NrICovCi0JaWYgKHB3YWtlKQotCQllcF9wb2xsX3NhZmV3YWtlKCZwc3csICZlcC0+cG9sbF93YWl0KTsKLQotCXJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQgZXBfZXZlbnRwb2xsX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBldmVudHBvbGwgKmVwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKGVwKSB7Ci0JCWVwX2ZyZWUoZXApOwotCQlrZnJlZShlcCk7Ci0JfQotCi0JRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IGNsb3NlKCkgZXA9JXBcbiIsIGN1cnJlbnQsIGVwKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCBlcF9ldmVudHBvbGxfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKLXsKLQl1bnNpZ25lZCBpbnQgcG9sbGZsYWdzID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBldmVudHBvbGwgKmVwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JLyogSW5zZXJ0IGluc2lkZSBvdXIgcG9sbCB3YWl0IHF1ZXVlICovCi0JcG9sbF93YWl0KGZpbGUsICZlcC0+cG9sbF93YWl0LCB3YWl0KTsKLQotCS8qIENoZWNrIG91ciBjb25kaXRpb24gKi8KLQlyZWFkX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmVwLT5yZGxsaXN0KSkKLQkJcG9sbGZsYWdzID0gUE9MTElOIHwgUE9MTFJETk9STTsKLQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHBvbGxmbGFnczsKLX0KLQotCiAvKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBob2xkaW5nIHRoZSAiZXAtPmxvY2siIHNpbmNlIHRoZSBjYWxsIHRvCiAgKiBfX2NvcHlfdG9fdXNlcigpIG1pZ2h0IHNsZWVwLCBhbmQgYWxzbyBmX29wLT5wb2xsKCkgbWlnaHQgcmVlbmFibGUgdGhlIElSUQpAQCAtMTQ0Nyw3ICsxMDMxLDYgQEAKIAlyZXR1cm4gZXZlbnRjbnQgPT0gMCA/IGVycm9yOiBldmVudGNudDsKIH0KIAotCiAvKgogICogUGVyZm9ybSB0aGUgdHJhbnNmZXIgb2YgZXZlbnRzIHRvIHVzZXIgc3BhY2UuCiAgKi8KQEAgLTE0ODMsNyArMTA2Niw2IEBACiAJcmV0dXJuIGV2ZW50Y250OwogfQogCi0KIHN0YXRpYyBpbnQgZXBfcG9sbChzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnRzLAogCQkgICBpbnQgbWF4ZXZlbnRzLCBsb25nIHRpbWVvdXQpCiB7CkBAIC0xNTUzLDUyICsxMTM1LDI2MiBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBpbnQgZXZlbnRwb2xsZnNfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCisvKgorICogSXQgb3BlbnMgYW4gZXZlbnRwb2xsIGZpbGUgZGVzY3JpcHRvciBieSBzdWdnZXN0aW5nIGEgc3RvcmFnZSBvZiAic2l6ZSIKKyAqIGZpbGUgZGVzY3JpcHRvcnMuIFRoZSBzaXplIHBhcmFtZXRlciBpcyBqdXN0IGFuIGhpbnQgYWJvdXQgaG93IHRvIHNpemUKKyAqIGRhdGEgc3RydWN0dXJlcy4gSXQgd29uJ3QgcHJldmVudCB0aGUgdXNlciB0byBzdG9yZSBtb3JlIHRoYW4gInNpemUiCisgKiBmaWxlIGRlc2NyaXB0b3JzIGluc2lkZSB0aGUgZXBvbGwgaW50ZXJmYWNlLiBJdCBpcyB0aGUga2VybmVsIHBhcnQgb2YKKyAqIHRoZSB1c2Vyc3BhY2UgZXBvbGxfY3JlYXRlKDIpLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2Vwb2xsX2NyZWF0ZShpbnQgc2l6ZSkKIHsKKwlpbnQgZXJyb3IsIGZkID0gLTE7CisJc3RydWN0IGV2ZW50cG9sbCAqZXA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlub2RlICplcF9ldmVudHBvbGxfaW5vZGUodm9pZCkKLXsKLQlpbnQgZXJyb3IgPSAtRU5PTUVNOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoZXZlbnRwb2xsX21udC0+bW50X3NiKTsKLQotCWlmICghaW5vZGUpCi0JCWdvdG8gZWV4aXRfMTsKLQotCWlub2RlLT5pX2ZvcCA9ICZldmVudHBvbGxfZm9wczsKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX2NyZWF0ZSglZClcbiIsCisJCSAgICAgY3VycmVudCwgc2l6ZSkpOwogCiAJLyoKLQkgKiBNYXJrIHRoZSBpbm9kZSBkaXJ0eSBmcm9tIHRoZSB2ZXJ5IGJlZ2lubmluZywKLQkgKiB0aGF0IHdheSBpdCB3aWxsIG5ldmVyIGJlIG1vdmVkIHRvIHRoZSBkaXJ0eQotCSAqIGxpc3QgYmVjYXVzZSBtYXJrX2lub2RlX2RpcnR5KCkgd2lsbCB0aGluawotCSAqIHRoYXQgaXQgYWxyZWFkeSBfaXNfIG9uIHRoZSBkaXJ0eSBsaXN0LgorCSAqIFNhbml0eSBjaGVjayBvbiB0aGUgc2l6ZSBwYXJhbWV0ZXIsIGFuZCBjcmVhdGUgdGhlIGludGVybmFsIGRhdGEKKwkgKiBzdHJ1Y3R1cmUgKCAic3RydWN0IGV2ZW50cG9sbCIgKS4KIAkgKi8KLQlpbm9kZS0+aV9zdGF0ZSA9IElfRElSVFk7Ci0JaW5vZGUtPmlfbW9kZSA9IFNfSVJVU1IgfCBTX0lXVVNSOwotCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOwotCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOwotCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQlyZXR1cm4gaW5vZGU7CisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChzaXplIDw9IDAgfHwgKGVycm9yID0gZXBfYWxsb2MoJmVwKSkgIT0gMCkKKwkJZ290byBlcnJvcl9yZXR1cm47CiAKLWVleGl0XzE6Ci0JcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCS8qCisJICogQ3JlYXRlcyBhbGwgdGhlIGl0ZW1zIG5lZWRlZCB0byBzZXR1cCBhbiBldmVudHBvbGwgZmlsZS4gVGhhdCBpcywKKwkgKiBhIGZpbGUgc3RydWN0dXJlLCBhbmQgaW5vZGUgYW5kIGEgZnJlZSBmaWxlIGRlc2NyaXB0b3IuCisJICovCisJZXJyb3IgPSBhbm9uX2lub2RlX2dldGZkKCZmZCwgJmlub2RlLCAmZmlsZSwgIltldmVudHBvbGxdIiwKKwkJCQkgJmV2ZW50cG9sbF9mb3BzLCBlcCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yX2ZyZWU7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX2NyZWF0ZSglZCkgPSAlZFxuIiwKKwkJICAgICBjdXJyZW50LCBzaXplLCBmZCkpOworCisJcmV0dXJuIGZkOworCitlcnJvcl9mcmVlOgorCWVwX2ZyZWUoZXApOworCWtmcmVlKGVwKTsKK2Vycm9yX3JldHVybjoKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX2NyZWF0ZSglZCkgPSAlZFxuIiwKKwkJICAgICBjdXJyZW50LCBzaXplLCBlcnJvcikpOworCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludAotZXZlbnRwb2xsZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCi0JCSAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIGNvbnRyb2xsZXIgaW50ZXJmYWNlIGZvcgorICogdGhlIGV2ZW50cG9sbCBmaWxlIHRoYXQgZW5hYmxlcyB0aGUgaW5zZXJ0aW9uL3JlbW92YWwvY2hhbmdlIG9mCisgKiBmaWxlIGRlc2NyaXB0b3JzIGluc2lkZSB0aGUgaW50ZXJlc3Qgc2V0LiAgSXQgcmVwcmVzZW50cworICogdGhlIGtlcm5lbCBwYXJ0IG9mIHRoZSB1c2VyIHNwYWNlIGVwb2xsX2N0bCgyKS4KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19lcG9sbF9jdGwoaW50IGVwZmQsIGludCBvcCwgaW50IGZkLAorCQkJICAgICAgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9wc2V1ZG8oZnNfdHlwZSwgImV2ZW50cG9sbDoiLCBOVUxMLCBFVkVOVFBPTExGU19NQUdJQywKLQkJCSAgICAgbW50KTsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZpbGUgKmZpbGUsICp0ZmlsZTsKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcDsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7CisJc3RydWN0IGVwb2xsX2V2ZW50IGVwZHM7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX2N0bCglZCwgJWQsICVkLCAlcClcbiIsCisJCSAgICAgY3VycmVudCwgZXBmZCwgb3AsIGZkLCBldmVudCkpOworCisJZXJyb3IgPSAtRUZBVUxUOworCWlmIChlcF9vcF9oYXNfZXZlbnQob3ApICYmCisJICAgIGNvcHlfZnJvbV91c2VyKCZlcGRzLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBlcG9sbF9ldmVudCkpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCS8qIEdldCB0aGUgInN0cnVjdCBmaWxlICoiIGZvciB0aGUgZXZlbnRwb2xsIGZpbGUgKi8KKwllcnJvciA9IC1FQkFERjsKKwlmaWxlID0gZmdldChlcGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJLyogR2V0IHRoZSAic3RydWN0IGZpbGUgKiIgZm9yIHRoZSB0YXJnZXQgZmlsZSAqLworCXRmaWxlID0gZmdldChmZCk7CisJaWYgKCF0ZmlsZSkKKwkJZ290byBlcnJvcl9mcHV0OworCisJLyogVGhlIHRhcmdldCBmaWxlIGRlc2NyaXB0b3IgbXVzdCBzdXBwb3J0IHBvbGwgKi8KKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoIXRmaWxlLT5mX29wIHx8ICF0ZmlsZS0+Zl9vcC0+cG9sbCkKKwkJZ290byBlcnJvcl90Z3RfZnB1dDsKKworCS8qCisJICogV2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBmaWxlIHN0cnVjdHVyZSB1bmRlcm5lYXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IKKwkgKiB0aGUgdXNlciBwYXNzZWQgdG8gdXMgX2lzXyBhbiBldmVudHBvbGwgZmlsZS4gQW5kIGFsc28gd2UgZG8gbm90IHBlcm1pdAorCSAqIGFkZGluZyBhbiBlcG9sbCBmaWxlIGRlc2NyaXB0b3IgaW5zaWRlIGl0c2VsZi4KKwkgKi8KKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKGZpbGUgPT0gdGZpbGUgfHwgIWlzX2ZpbGVfZXBvbGwoZmlsZSkpCisJCWdvdG8gZXJyb3JfdGd0X2ZwdXQ7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgaXQgaXMgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGUgInByaXZhdGVfZGF0YSIgY29udGFpbnMKKwkgKiBvdXIgb3duIGRhdGEgc3RydWN0dXJlLgorCSAqLworCWVwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJZG93bl93cml0ZSgmZXAtPnNlbSk7CisKKwkvKiBUcnkgdG8gbG9va3VwIHRoZSBmaWxlIGluc2lkZSBvdXIgUkIgdHJlZSAqLworCWVwaSA9IGVwX2ZpbmQoZXAsIHRmaWxlLCBmZCk7CisKKwllcnJvciA9IC1FSU5WQUw7CisJc3dpdGNoIChvcCkgeworCWNhc2UgRVBPTExfQ1RMX0FERDoKKwkJaWYgKCFlcGkpIHsKKwkJCWVwZHMuZXZlbnRzIHw9IFBPTExFUlIgfCBQT0xMSFVQOworCisJCQllcnJvciA9IGVwX2luc2VydChlcCwgJmVwZHMsIHRmaWxlLCBmZCk7CisJCX0gZWxzZQorCQkJZXJyb3IgPSAtRUVYSVNUOworCQlicmVhazsKKwljYXNlIEVQT0xMX0NUTF9ERUw6CisJCWlmIChlcGkpCisJCQllcnJvciA9IGVwX3JlbW92ZShlcCwgZXBpKTsKKwkJZWxzZQorCQkJZXJyb3IgPSAtRU5PRU5UOworCQlicmVhazsKKwljYXNlIEVQT0xMX0NUTF9NT0Q6CisJCWlmIChlcGkpIHsKKwkJCWVwZHMuZXZlbnRzIHw9IFBPTExFUlIgfCBQT0xMSFVQOworCQkJZXJyb3IgPSBlcF9tb2RpZnkoZXAsIGVwaSwgJmVwZHMpOworCQl9IGVsc2UKKwkJCWVycm9yID0gLUVOT0VOVDsKKwkJYnJlYWs7CisJfQorCS8qCisJICogVGhlIGZ1bmN0aW9uIGVwX2ZpbmQoKSBpbmNyZW1lbnRzIHRoZSB1c2FnZSBjb3VudCBvZiB0aGUgc3RydWN0dXJlCisJICogc28sIGlmIHRoaXMgaXMgbm90IE5VTEwsIHdlIG5lZWQgdG8gcmVsZWFzZSBpdC4KKwkgKi8KKwlpZiAoZXBpKQorCQllcF9yZWxlYXNlX2VwaXRlbShlcGkpOworCXVwX3dyaXRlKCZlcC0+c2VtKTsKKworZXJyb3JfdGd0X2ZwdXQ6CisJZnB1dCh0ZmlsZSk7CitlcnJvcl9mcHV0OgorCWZwdXQoZmlsZSk7CitlcnJvcl9yZXR1cm46CisJRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IHN5c19lcG9sbF9jdGwoJWQsICVkLCAlZCwgJXApID0gJWRcbiIsCisJCSAgICAgY3VycmVudCwgZXBmZCwgb3AsIGZkLCBldmVudCwgZXJyb3IpKTsKKworCXJldHVybiBlcnJvcjsKIH0KIAorLyoKKyAqIEltcGxlbWVudCB0aGUgZXZlbnQgd2FpdCBpbnRlcmZhY2UgZm9yIHRoZSBldmVudHBvbGwgZmlsZS4gSXQgaXMgdGhlIGtlcm5lbAorICogcGFydCBvZiB0aGUgdXNlciBzcGFjZSBlcG9sbF93YWl0KDIpLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2Vwb2xsX3dhaXQoaW50IGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cywKKwkJCSAgICAgICBpbnQgbWF4ZXZlbnRzLCBpbnQgdGltZW91dCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IGV2ZW50cG9sbCAqZXA7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX3dhaXQoJWQsICVwLCAlZCwgJWQpXG4iLAorCQkgICAgIGN1cnJlbnQsIGVwZmQsIGV2ZW50cywgbWF4ZXZlbnRzLCB0aW1lb3V0KSk7CisKKwkvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZXZlbnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyAqLworCWlmIChtYXhldmVudHMgPD0gMCB8fCBtYXhldmVudHMgPiBFUF9NQVhfRVZFTlRTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSBhcmVhIHBhc3NlZCBieSB0aGUgdXNlciBpcyB3cml0ZWFibGUgKi8KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGV2ZW50cywgbWF4ZXZlbnRzICogc2l6ZW9mKHN0cnVjdCBlcG9sbF9ldmVudCkpKSB7CisJCWVycm9yID0gLUVGQVVMVDsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCisJLyogR2V0IHRoZSAic3RydWN0IGZpbGUgKiIgZm9yIHRoZSBldmVudHBvbGwgZmlsZSAqLworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGVwZmQpOworCWlmICghZmlsZSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGUgZmlsZSBzdHJ1Y3R1cmUgdW5kZXJuZWF0aCB0aGUgZmQKKwkgKiB0aGUgdXNlciBwYXNzZWQgdG8gdXMgX2lzXyBhbiBldmVudHBvbGwgZmlsZS4KKwkgKi8KKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFpc19maWxlX2Vwb2xsKGZpbGUpKQorCQlnb3RvIGVycm9yX2ZwdXQ7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgaXQgaXMgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGUgInByaXZhdGVfZGF0YSIgY29udGFpbnMKKwkgKiBvdXIgb3duIGRhdGEgc3RydWN0dXJlLgorCSAqLworCWVwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogVGltZSB0byBmaXNoIGZvciBldmVudHMgLi4uICovCisJZXJyb3IgPSBlcF9wb2xsKGVwLCBldmVudHMsIG1heGV2ZW50cywgdGltZW91dCk7CisKK2Vycm9yX2ZwdXQ6CisJZnB1dChmaWxlKTsKK2Vycm9yX3JldHVybjoKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX3dhaXQoJWQsICVwLCAlZCwgJWQpID0gJWRcbiIsCisJCSAgICAgY3VycmVudCwgZXBmZCwgZXZlbnRzLCBtYXhldmVudHMsIHRpbWVvdXQsIGVycm9yKSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNpZmRlZiBUSUZfUkVTVE9SRV9TSUdNQVNLCisKKy8qCisgKiBJbXBsZW1lbnQgdGhlIGV2ZW50IHdhaXQgaW50ZXJmYWNlIGZvciB0aGUgZXZlbnRwb2xsIGZpbGUuIEl0IGlzIHRoZSBrZXJuZWwKKyAqIHBhcnQgb2YgdGhlIHVzZXIgc3BhY2UgZXBvbGxfcHdhaXQoMikuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfZXBvbGxfcHdhaXQoaW50IGVwZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cywKKwkJaW50IG1heGV2ZW50cywgaW50IHRpbWVvdXQsIGNvbnN0IHNpZ3NldF90IF9fdXNlciAqc2lnbWFzaywKKwkJc2l6ZV90IHNpZ3NldHNpemUpCit7CisJaW50IGVycm9yOworCXNpZ3NldF90IGtzaWdtYXNrLCBzaWdzYXZlZDsKKworCS8qCisJICogSWYgdGhlIGNhbGxlciB3YW50cyBhIGNlcnRhaW4gc2lnbmFsIG1hc2sgdG8gYmUgc2V0IGR1cmluZyB0aGUgd2FpdCwKKwkgKiB3ZSBhcHBseSBpdCBoZXJlLgorCSAqLworCWlmIChzaWdtYXNrKSB7CisJCWlmIChzaWdzZXRzaXplICE9IHNpemVvZihzaWdzZXRfdCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZrc2lnbWFzaywgc2lnbWFzaywgc2l6ZW9mKGtzaWdtYXNrKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2lnZGVsc2V0bWFzaygma3NpZ21hc2ssIHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZrc2lnbWFzaywgJnNpZ3NhdmVkKTsKKwl9CisKKwllcnJvciA9IHN5c19lcG9sbF93YWl0KGVwZmQsIGV2ZW50cywgbWF4ZXZlbnRzLCB0aW1lb3V0KTsKKworCS8qCisJICogSWYgd2UgY2hhbmdlZCB0aGUgc2lnbmFsIG1hc2ssIHdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgb25lLgorCSAqIEluIGNhc2Ugd2UndmUgZ290IGEgc2lnbmFsIHdoaWxlIHdhaXRpbmcsIHdlIGRvIG5vdCByZXN0b3JlIHRoZQorCSAqIHNpZ25hbCBtYXNrIHlldCwgYW5kIHdlIGFsbG93IGRvX3NpZ25hbCgpIHRvIGRlbGl2ZXIgdGhlIHNpZ25hbCBvbgorCSAqIHRoZSB3YXkgYmFjayB0byB1c2Vyc3BhY2UsIGJlZm9yZSB0aGUgc2lnbmFsIG1hc2sgaXMgcmVzdG9yZWQuCisJICovCisJaWYgKHNpZ21hc2spIHsKKwkJaWYgKGVycm9yID09IC1FSU5UUikgeworCQkJbWVtY3B5KCZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCAmc2lnc2F2ZWQsCisJCQkJc2l6ZW9mKHNpZ3NhdmVkKSk7CisJCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCX0gZWxzZQorCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZzaWdzYXZlZCwgTlVMTCk7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCisjZW5kaWYgLyogI2lmZGVmIFRJRl9SRVNUT1JFX1NJR01BU0sgKi8KIAogc3RhdGljIGludCBfX2luaXQgZXZlbnRwb2xsX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyb3I7Ci0KIAltdXRleF9pbml0KCZlcG11dGV4KTsKIAogCS8qIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIHBlcmZvcm0gc2FmZSBwb2xsIHdhaXQgaGVhZCB3YWtlIHVwcyAqLwpAQCAtMTYxNCwzOSArMTQwNiw3IEBACiAJCQlzaXplb2Yoc3RydWN0IGVwcG9sbF9lbnRyeSksIDAsCiAJCQlFUElfU0xBQl9ERUJVR3xTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKIAotCS8qCi0JICogUmVnaXN0ZXIgdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0gdGhhdCB3aWxsIGJlIHRoZSBzb3VyY2Ugb2YgaW5vZGVzCi0JICogZm9yIHRoZSBldmVudHBvbGwgZmlsZXMKLQkgKi8KLQllcnJvciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV2ZW50cG9sbF9mc190eXBlKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gZXBhbmljOwotCi0JLyogTW91bnQgdGhlIGFib3ZlIGNvbW1lbnRlZCB2aXJ0dWFsIGZpbGUgc3lzdGVtICovCi0JZXZlbnRwb2xsX21udCA9IGtlcm5fbW91bnQoJmV2ZW50cG9sbF9mc190eXBlKTsKLQllcnJvciA9IFBUUl9FUlIoZXZlbnRwb2xsX21udCk7Ci0JaWYgKElTX0VSUihldmVudHBvbGxfbW50KSkKLQkJZ290byBlcGFuaWM7Ci0KLQlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLlxuIiwKLQkJCWN1cnJlbnQpKTsKIAlyZXR1cm4gMDsKLQotZXBhbmljOgotCXBhbmljKCJldmVudHBvbGxfaW5pdCgpIGZhaWxlZFxuIik7CiB9Citmc19pbml0Y2FsbChldmVudHBvbGxfaW5pdCk7CiAKLQotc3RhdGljIHZvaWQgX19leGl0IGV2ZW50cG9sbF9leGl0KHZvaWQpCi17Ci0JLyogVW5kbyBhbGwgb3BlcmF0aW9ucyBkb25lIGluc2lkZSBldmVudHBvbGxfaW5pdCgpICovCi0JdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZldmVudHBvbGxfZnNfdHlwZSk7Ci0JbW50cHV0KGV2ZW50cG9sbF9tbnQpOwotCWttZW1fY2FjaGVfZGVzdHJveShwd3FfY2FjaGUpOwotCWttZW1fY2FjaGVfZGVzdHJveShlcGlfY2FjaGUpOwotfQotCi1tb2R1bGVfaW5pdChldmVudHBvbGxfaW5pdCk7Ci1tb2R1bGVfZXhpdChldmVudHBvbGxfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCAxYmE4NWM3Li43MGZhMzY1IDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHNhY2N0X2tlcm4uaD4KICNpbmNsdWRlIDxsaW51eC9jbl9wcm9jLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWxmZC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KQEAgLTU4Miw2ICs1ODMsMTMgQEAKIAlpbnQgY291bnQ7CiAKIAkvKgorCSAqIFRlbGwgYWxsIHRoZSBzaWdoYW5kIGxpc3RlbmVycyB0aGF0IHRoaXMgc2lnaGFuZCBoYXMKKwkgKiBiZWVuIGRldGFjaGVkLiBUaGUgc2lnbmFsZmRfZGV0YWNoKCkgZnVuY3Rpb24gZ3JhYnMgdGhlCisJICogc2lnaGFuZCBsb2NrLCBpZiBzaWduYWwgbGlzdGVuZXJzIGFyZSBwcmVzZW50IG9uIHRoZSBzaWdoYW5kLgorCSAqLworCXNpZ25hbGZkX2RldGFjaCh0c2spOworCisJLyoKIAkgKiBJZiB3ZSBkb24ndCBzaGFyZSBzaWdoYW5kbGVycywgdGhlbiB3ZSBhcmVuJ3Qgc2hhcmluZyBhbnl0aGluZwogCSAqIGFuZCB3ZSBjYW4ganVzdCByZS11c2UgaXQgYWxsLgogCSAqLwpAQCAtNzAyLDcgKzcxMCw3IEBACiAJCSAqLwogCQlkZXRhY2hfcGlkKHRzaywgUElEVFlQRV9QSUQpOwogCQl0c2stPnBpZCA9IGxlYWRlci0+cGlkOwotCQlhdHRhY2hfcGlkKHRzaywgUElEVFlQRV9QSUQsICB0c2stPnBpZCk7CisJCWF0dGFjaF9waWQodHNrLCBQSURUWVBFX1BJRCwgIGZpbmRfcGlkKHRzay0+cGlkKSk7CiAJCXRyYW5zZmVyX3BpZChsZWFkZXIsIHRzaywgUElEVFlQRV9QR0lEKTsKIAkJdHJhbnNmZXJfcGlkKGxlYWRlciwgdHNrLCBQSURUWVBFX1NJRCk7CiAJCWxpc3RfcmVwbGFjZV9yY3UoJmxlYWRlci0+dGFza3MsICZ0c2stPnRhc2tzKTsKQEAgLTc1Nyw4ICs3NjUsNyBAQAogCQlzcGluX3VubG9jaygmb2xkc2lnaGFuZC0+c2lnbG9jayk7CiAJCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCi0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZvbGRzaWdoYW5kLT5jb3VudCkpCi0JCQlrbWVtX2NhY2hlX2ZyZWUoc2lnaGFuZF9jYWNoZXAsIG9sZHNpZ2hhbmQpOworCQlfX2NsZWFudXBfc2lnaGFuZChvbGRzaWdoYW5kKTsKIAl9CiAKIAlCVUdfT04oIXRocmVhZF9ncm91cF9sZWFkZXIodHNrKSk7CkBAIC0xNDg4LDYgKzE0OTUsOCBAQAogCWludCBmbGFnID0gMDsKIAlpbnQgaXNwaXBlID0gMDsKIAorCWF1ZGl0X2NvcmVfZHVtcHMoc2lnbnIpOworCiAJYmluZm10ID0gY3VycmVudC0+YmluZm10OwogCWlmICghYmluZm10IHx8ICFiaW5mbXQtPmNvcmVfZHVtcCkKIAkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvZnMvbXBhZ2UuYyBiL2ZzL21wYWdlLmMKaW5kZXggMGZiOTE0Zi4uYzE2OThmMiAxMDA2NDQKLS0tIGEvZnMvbXBhZ2UuYworKysgYi9mcy9tcGFnZS5jCkBAIC00NTQsMTEgKzQ1NCwxOCBAQAogICogd3JpdHRlbiwgc28gaXQgY2FuIGludGVsbGlnZW50bHkgYWxsb2NhdGUgYSBzdWl0YWJseS1zaXplZCBCSU8uICBGb3Igbm93LAogICoganVzdCBhbGxvY2F0ZSBmdWxsLXNpemUgKDE2LXBhZ2UpIEJJT3MuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmlvICoKLV9fbXBhZ2Vfd3JpdGVwYWdlKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IHBhZ2UgKnBhZ2UsIGdldF9ibG9ja190IGdldF9ibG9jaywKLQlzZWN0b3JfdCAqbGFzdF9ibG9ja19pbl9iaW8sIGludCAqcmV0LCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKLQl3cml0ZXBhZ2VfdCB3cml0ZXBhZ2VfZm4pCitzdHJ1Y3QgbXBhZ2VfZGF0YSB7CisJc3RydWN0IGJpbyAqYmlvOworCXNlY3Rvcl90IGxhc3RfYmxvY2tfaW5fYmlvOworCWdldF9ibG9ja190ICpnZXRfYmxvY2s7CisJdW5zaWduZWQgdXNlX3dyaXRlcGFnZTsKK307CisKK3N0YXRpYyBpbnQgX19tcGFnZV93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAorCQkJICAgICB2b2lkICpkYXRhKQogeworCXN0cnVjdCBtcGFnZV9kYXRhICptcGQgPSBkYXRhOworCXN0cnVjdCBiaW8gKmJpbyA9IG1wZC0+YmlvOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAljb25zdCB1bnNpZ25lZCBibGtiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKQEAgLTQ3Niw2ICs0ODMsNyBAQAogCWludCBsZW5ndGg7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkIG1hcF9iaDsKIAlsb2ZmX3QgaV9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCWludCByZXQgPSAwOwogCiAJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKIAkJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOwpAQCAtNTM4LDcgKzU0Niw3IEBACiAKIAkJbWFwX2JoLmJfc3RhdGUgPSAwOwogCQltYXBfYmguYl9zaXplID0gMSA8PCBibGtiaXRzOwotCQlpZiAoZ2V0X2Jsb2NrKGlub2RlLCBibG9ja19pbl9maWxlLCAmbWFwX2JoLCAxKSkKKwkJaWYgKG1wZC0+Z2V0X2Jsb2NrKGlub2RlLCBibG9ja19pbl9maWxlLCAmbWFwX2JoLCAxKSkKIAkJCWdvdG8gY29uZnVzZWQ7CiAJCWlmIChidWZmZXJfbmV3KCZtYXBfYmgpKQogCQkJdW5tYXBfdW5kZXJseWluZ19tZXRhZGF0YShtYXBfYmguYl9iZGV2LApAQCAtNTg0LDcgKzU5Miw3IEBACiAJLyoKIAkgKiBUaGlzIHBhZ2Ugd2lsbCBnbyB0byBCSU8uICBEbyB3ZSBuZWVkIHRvIHNlbmQgdGhpcyBCSU8gb2ZmIGZpcnN0PwogCSAqLwotCWlmIChiaW8gJiYgKmxhc3RfYmxvY2tfaW5fYmlvICE9IGJsb2Nrc1swXSAtIDEpCisJaWYgKGJpbyAmJiBtcGQtPmxhc3RfYmxvY2tfaW5fYmlvICE9IGJsb2Nrc1swXSAtIDEpCiAJCWJpbyA9IG1wYWdlX2Jpb19zdWJtaXQoV1JJVEUsIGJpbyk7CiAKIGFsbG9jX25ldzoKQEAgLTY0MSw3ICs2NDksNyBAQAogCQkJCQlib3VuZGFyeV9ibG9jaywgMSA8PCBibGtiaXRzKTsKIAkJfQogCX0gZWxzZSB7Ci0JCSpsYXN0X2Jsb2NrX2luX2JpbyA9IGJsb2Nrc1tibG9ja3NfcGVyX3BhZ2UgLSAxXTsKKwkJbXBkLT5sYXN0X2Jsb2NrX2luX2JpbyA9IGJsb2Nrc1tibG9ja3NfcGVyX3BhZ2UgLSAxXTsKIAl9CiAJZ290byBvdXQ7CiAKQEAgLTY0OSwxOCArNjU3LDE5IEBACiAJaWYgKGJpbykKIAkJYmlvID0gbXBhZ2VfYmlvX3N1Ym1pdChXUklURSwgYmlvKTsKIAotCWlmICh3cml0ZXBhZ2VfZm4pIHsKLQkJKnJldCA9ICgqd3JpdGVwYWdlX2ZuKShwYWdlLCB3YmMpOworCWlmIChtcGQtPnVzZV93cml0ZXBhZ2UpIHsKKwkJcmV0ID0gbWFwcGluZy0+YV9vcHMtPndyaXRlcGFnZShwYWdlLCB3YmMpOwogCX0gZWxzZSB7Ci0JCSpyZXQgPSAtRUFHQUlOOworCQlyZXQgPSAtRUFHQUlOOwogCQlnb3RvIG91dDsKIAl9CiAJLyoKIAkgKiBUaGUgY2FsbGVyIGhhcyBhIHJlZiBvbiB0aGUgaW5vZGUsIHNvICptYXBwaW5nIGlzIHN0YWJsZQogCSAqLwotCW1hcHBpbmdfc2V0X2Vycm9yKG1hcHBpbmcsICpyZXQpOworCW1hcHBpbmdfc2V0X2Vycm9yKG1hcHBpbmcsIHJldCk7CiBvdXQ6Ci0JcmV0dXJuIGJpbzsKKwltcGQtPmJpbyA9IGJpbzsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTY4MywxMjAgKzY5MiwyNyBAQAogICogdGhlIGNhbGwgd2FzIG1hZGUgZ2V0IG5ldyBJL08gc3RhcnRlZCBhZ2FpbnN0IHRoZW0uICBJZiB3YmMtPnN5bmNfbW9kZSBpcwogICogV0JfU1lOQ19BTEwgdGhlbiB3ZSB3ZXJlIGNhbGxlZCBmb3IgZGF0YSBpbnRlZ3JpdHkgYW5kIHdlIG11c3Qgd2FpdCBmb3IKICAqIGV4aXN0aW5nIElPIHRvIGNvbXBsZXRlLgotICoKLSAqIElmIHlvdSBmaXggdGhpcyB5b3Ugc2hvdWxkIGNoZWNrIGdlbmVyaWNfd3JpdGVwYWdlcygpIGFsc28hCiAgKi8KIGludAogbXBhZ2Vfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsIGdldF9ibG9ja190IGdldF9ibG9jaykKIHsKLQlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpID0gbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKLQlzdHJ1Y3QgYmlvICpiaW8gPSBOVUxMOwotCXNlY3Rvcl90IGxhc3RfYmxvY2tfaW5fYmlvID0gMDsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgZG9uZSA9IDA7Ci0JaW50ICgqd3JpdGVwYWdlKShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOwotCXN0cnVjdCBwYWdldmVjIHB2ZWM7Ci0JaW50IG5yX3BhZ2VzOwotCXBnb2ZmX3QgaW5kZXg7Ci0JcGdvZmZfdCBlbmQ7CQkvKiBJbmNsdXNpdmUgKi8KLQlpbnQgc2Nhbm5lZCA9IDA7Ci0JaW50IHJhbmdlX3dob2xlID0gMDsKKwlpbnQgcmV0OwogCi0JaWYgKHdiYy0+bm9uYmxvY2tpbmcgJiYgYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpKSB7Ci0JCXdiYy0+ZW5jb3VudGVyZWRfY29uZ2VzdGlvbiA9IDE7Ci0JCXJldHVybiAwOworCWlmICghZ2V0X2Jsb2NrKQorCQlyZXQgPSBnZW5lcmljX3dyaXRlcGFnZXMobWFwcGluZywgd2JjKTsKKwllbHNlIHsKKwkJc3RydWN0IG1wYWdlX2RhdGEgbXBkID0geworCQkJLmJpbyA9IE5VTEwsCisJCQkubGFzdF9ibG9ja19pbl9iaW8gPSAwLAorCQkJLmdldF9ibG9jayA9IGdldF9ibG9jaywKKwkJCS51c2Vfd3JpdGVwYWdlID0gMSwKKwkJfTsKKworCQlyZXQgPSB3cml0ZV9jYWNoZV9wYWdlcyhtYXBwaW5nLCB3YmMsIF9fbXBhZ2Vfd3JpdGVwYWdlLCAmbXBkKTsKKwkJaWYgKG1wZC5iaW8pCisJCQltcGFnZV9iaW9fc3VibWl0KFdSSVRFLCBtcGQuYmlvKTsKIAl9Ci0KLQl3cml0ZXBhZ2UgPSBOVUxMOwotCWlmIChnZXRfYmxvY2sgPT0gTlVMTCkKLQkJd3JpdGVwYWdlID0gbWFwcGluZy0+YV9vcHMtPndyaXRlcGFnZTsKLQotCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7Ci0JaWYgKHdiYy0+cmFuZ2VfY3ljbGljKSB7Ci0JCWluZGV4ID0gbWFwcGluZy0+d3JpdGViYWNrX2luZGV4OyAvKiBTdGFydCBmcm9tIHByZXYgb2Zmc2V0ICovCi0JCWVuZCA9IC0xOwotCX0gZWxzZSB7Ci0JCWluZGV4ID0gd2JjLT5yYW5nZV9zdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQllbmQgPSB3YmMtPnJhbmdlX2VuZCA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQlpZiAod2JjLT5yYW5nZV9zdGFydCA9PSAwICYmIHdiYy0+cmFuZ2VfZW5kID09IExMT05HX01BWCkKLQkJCXJhbmdlX3dob2xlID0gMTsKLQkJc2Nhbm5lZCA9IDE7Ci0JfQotcmV0cnk6Ci0Jd2hpbGUgKCFkb25lICYmIChpbmRleCA8PSBlbmQpICYmCi0JCQkobnJfcGFnZXMgPSBwYWdldmVjX2xvb2t1cF90YWcoJnB2ZWMsIG1hcHBpbmcsICZpbmRleCwKLQkJCVBBR0VDQUNIRV9UQUdfRElSVFksCi0JCQltaW4oZW5kIC0gaW5kZXgsIChwZ29mZl90KVBBR0VWRUNfU0laRS0xKSArIDEpKSkgewotCQl1bnNpZ25lZCBpOwotCi0JCXNjYW5uZWQgPSAxOwotCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewotCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOwotCi0JCQkvKgotCQkJICogQXQgdGhpcyBwb2ludCB3ZSBob2xkIG5laXRoZXIgbWFwcGluZy0+dHJlZV9sb2NrIG5vcgotCQkJICogbG9jayBvbiB0aGUgcGFnZSBpdHNlbGY6IHRoZSBwYWdlIG1heSBiZSB0cnVuY2F0ZWQgb3IKLQkJCSAqIGludmFsaWRhdGVkIChjaGFuZ2luZyBwYWdlLT5tYXBwaW5nIHRvIE5VTEwpLCBvciBldmVuCi0JCQkgKiBzd2l6emxlZCBiYWNrIGZyb20gc3dhcHBlcl9zcGFjZSB0byB0bXBmcyBmaWxlCi0JCQkgKiBtYXBwaW5nCi0JCQkgKi8KLQotCQkJbG9ja19wYWdlKHBhZ2UpOwotCi0JCQlpZiAodW5saWtlbHkocGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKSkgewotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoIXdiYy0+cmFuZ2VfY3ljbGljICYmIHBhZ2UtPmluZGV4ID4gZW5kKSB7Ci0JCQkJZG9uZSA9IDE7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh3YmMtPnN5bmNfbW9kZSAhPSBXQl9TWU5DX05PTkUpCi0JCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKLQotCQkJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkgfHwKLQkJCQkJIWNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKHBhZ2UpKSB7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh3cml0ZXBhZ2UpIHsKLQkJCQlyZXQgPSAoKndyaXRlcGFnZSkocGFnZSwgd2JjKTsKLQkJCQltYXBwaW5nX3NldF9lcnJvcihtYXBwaW5nLCByZXQpOwotCQkJfSBlbHNlIHsKLQkJCQliaW8gPSBfX21wYWdlX3dyaXRlcGFnZShiaW8sIHBhZ2UsIGdldF9ibG9jaywKLQkJCQkJCSZsYXN0X2Jsb2NrX2luX2JpbywgJnJldCwgd2JjLAotCQkJCQkJcGFnZS0+bWFwcGluZy0+YV9vcHMtPndyaXRlcGFnZSk7Ci0JCQl9Ci0JCQlpZiAodW5saWtlbHkocmV0ID09IEFPUF9XUklURVBBR0VfQUNUSVZBVEUpKQotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJaWYgKHJldCB8fCAoLS0od2JjLT5ucl90b193cml0ZSkgPD0gMCkpCi0JCQkJZG9uZSA9IDE7Ci0JCQlpZiAod2JjLT5ub25ibG9ja2luZyAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpIHsKLQkJCQl3YmMtPmVuY291bnRlcmVkX2Nvbmdlc3Rpb24gPSAxOwotCQkJCWRvbmUgPSAxOwotCQkJfQotCQl9Ci0JCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7Ci0JCWNvbmRfcmVzY2hlZCgpOwotCX0KLQlpZiAoIXNjYW5uZWQgJiYgIWRvbmUpIHsKLQkJLyoKLQkJICogV2UgaGl0IHRoZSBsYXN0IHBhZ2UgYW5kIHRoZXJlIGlzIG1vcmUgd29yayB0byBiZSBkb25lOiB3cmFwCi0JCSAqIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlCi0JCSAqLwotCQlzY2FubmVkID0gMTsKLQkJaW5kZXggPSAwOwotCQlnb3RvIHJldHJ5OwotCX0KLQlpZiAod2JjLT5yYW5nZV9jeWNsaWMgfHwgKHJhbmdlX3dob2xlICYmIHdiYy0+bnJfdG9fd3JpdGUgPiAwKSkKLQkJbWFwcGluZy0+d3JpdGViYWNrX2luZGV4ID0gaW5kZXg7Ci0JaWYgKGJpbykKLQkJbXBhZ2VfYmlvX3N1Ym1pdChXUklURSwgYmlvKTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChtcGFnZV93cml0ZXBhZ2VzKTsKQEAgLTgwNCwxNSArNzIwLDE1IEBACiBpbnQgbXBhZ2Vfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZXRfYmxvY2tfdCBnZXRfYmxvY2ssCiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGJpbyAqYmlvOwotCXNlY3Rvcl90IGxhc3RfYmxvY2tfaW5fYmlvID0gMDsKLQotCWJpbyA9IF9fbXBhZ2Vfd3JpdGVwYWdlKE5VTEwsIHBhZ2UsIGdldF9ibG9jaywKLQkJCSZsYXN0X2Jsb2NrX2luX2JpbywgJnJldCwgd2JjLCBOVUxMKTsKLQlpZiAoYmlvKQotCQltcGFnZV9iaW9fc3VibWl0KFdSSVRFLCBiaW8pOwotCisJc3RydWN0IG1wYWdlX2RhdGEgbXBkID0geworCQkuYmlvID0gTlVMTCwKKwkJLmxhc3RfYmxvY2tfaW5fYmlvID0gMCwKKwkJLmdldF9ibG9jayA9IGdldF9ibG9jaywKKwkJLnVzZV93cml0ZXBhZ2UgPSAwLAorCX07CisJaW50IHJldCA9IF9fbXBhZ2Vfd3JpdGVwYWdlKHBhZ2UsIHdiYywgJm1wZCk7CisJaWYgKG1wZC5iaW8pCisJCW1wYWdlX2Jpb19zdWJtaXQoV1JJVEUsIG1wZC5iaW8pOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKG1wYWdlX3dyaXRlcGFnZSk7CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCBiMzc4MGUzLi41ZTJkOThkIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTE3MTksNyArMTcxOSw3IEBACiAJICogSXQgYWxyZWFkeSBleGlzdHMuCiAJICovCiAJbXV0ZXhfdW5sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwotCWF1ZGl0X2lub2RlX3VwZGF0ZShwYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisJYXVkaXRfaW5vZGUocGF0aG5hbWUsIHBhdGguZGVudHJ5LT5kX2lub2RlKTsKIAogCWVycm9yID0gLUVFWElTVDsKIAlpZiAoZmxhZyAmIE9fRVhDTCkKZGlmZiAtLWdpdCBhL2ZzL250ZnMvYW9wcy5jIGIvZnMvbnRmcy9hb3BzLmMKaW5kZXggNjI5ZTdhYi4uNmU1YzI1MyAxMDA2NDQKLS0tIGEvZnMvbnRmcy9hb3BzLmMKKysrIGIvZnMvbnRmcy9hb3BzLmMKQEAgLTg2LDE5ICs4NiwxNSBAQAogCQl9CiAJCS8qIENoZWNrIGZvciB0aGUgY3VycmVudCBidWZmZXIgaGVhZCBvdmVyZmxvd2luZy4gKi8KIAkJaWYgKHVubGlrZWx5KGZpbGVfb2ZzICsgYmgtPmJfc2l6ZSA+IGluaXRfc2l6ZSkpIHsKLQkJCXU4ICprYWRkcjsKIAkJCWludCBvZnM7CiAKIAkJCW9mcyA9IDA7CiAJCQlpZiAoZmlsZV9vZnMgPCBpbml0X3NpemUpCiAJCQkJb2ZzID0gaW5pdF9zaXplIC0gZmlsZV9vZnM7CiAJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX0JJT19TUkNfSVJRKTsKLQkJCW1lbXNldChrYWRkciArIGJoX29mZnNldChiaCkgKyBvZnMsIDAsCi0JCQkJCWJoLT5iX3NpemUgLSBvZnMpOwotCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fQklPX1NSQ19JUlEpOworCQkJemVyb191c2VyX3BhZ2UocGFnZSwgYmhfb2Zmc2V0KGJoKSArIG9mcywKKwkJCQkJIGJoLT5iX3NpemUgLSBvZnMsIEtNX0JJT19TUkNfSVJRKTsKIAkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCQl9CiAJfSBlbHNlIHsKIAkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKQEAgLTI0NSw4ICsyNDEsNyBAQAogCXJsID0gTlVMTDsKIAluciA9IGkgPSAwOwogCWRvIHsKLQkJdTggKmthZGRyOwotCQlpbnQgZXJyOworCQlpbnQgZXJyID0gMDsKIAogCQlpZiAodW5saWtlbHkoYnVmZmVyX3VwdG9kYXRlKGJoKSkpCiAJCQljb250aW51ZTsKQEAgLTI1NCw3ICsyNDksNiBAQAogCQkJYXJyW25yKytdID0gYmg7CiAJCQljb250aW51ZTsKIAkJfQotCQllcnIgPSAwOwogCQliaC0+Yl9iZGV2ID0gdm9sLT5zYi0+c19iZGV2OwogCQkvKiBJcyB0aGUgYmxvY2sgd2l0aGluIHRoZSBhbGxvd2VkIGxpbWl0cz8gKi8KIAkJaWYgKGlibG9jayA8IGxibG9jaykgewpAQCAtMzQwLDEwICszMzQsNyBAQAogCQliaC0+Yl9ibG9ja25yID0gLTFVTDsKIAkJY2xlYXJfYnVmZmVyX21hcHBlZChiaCk7CiBoYW5kbGVfemJsb2NrOgotCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLQkJbWVtc2V0KGthZGRyICsgaSAqIGJsb2Nrc2l6ZSwgMCwgYmxvY2tzaXplKTsKLQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwotCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJemVyb191c2VyX3BhZ2UocGFnZSwgaSAqIGJsb2Nrc2l6ZSwgYmxvY2tzaXplLCBLTV9VU0VSMCk7CiAJCWlmIChsaWtlbHkoIWVycikpCiAJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAl9IHdoaWxlIChpKyssIGlibG9jaysrLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOwpAQCAtNDYwLDEwICs0NTEsNyBAQAogCSAqIG9rIHRvIGlnbm9yZSB0aGUgY29tcHJlc3NlZCBmbGFnIGhlcmUuCiAJICovCiAJaWYgKHVubGlrZWx5KHBhZ2UtPmluZGV4ID4gMCkpIHsKLQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JCW1lbXNldChrYWRkciwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKLQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7Ci0JCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJemVyb191c2VyX3BhZ2UocGFnZSwgMCwgUEFHRV9DQUNIRV9TSVpFLCBLTV9VU0VSMCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAJaWYgKCFOSW5vQXR0cihuaSkpCkBAIC03OTAsMTQgKzc3OCwxMCBAQAogCQkgKiB1cHRvZGF0ZSBzbyBpdCBjYW4gZ2V0IGRpc2NhcmRlZCBieSB0aGUgVk0uCiAJCSAqLwogCQlpZiAoZXJyID09IC1FTk9FTlQgfHwgbGNuID09IExDTl9FTk9FTlQpIHsKLQkJCXU4ICprYWRkcjsKLQogCQkJYmgtPmJfYmxvY2tuciA9IC0xOwogCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKLQkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCQkJbWVtc2V0KGthZGRyICsgYmhfb2Zmc2V0KGJoKSwgMCwgYmxvY2tzaXplKTsKLQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKLQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJemVyb191c2VyX3BhZ2UocGFnZSwgYmhfb2Zmc2V0KGJoKSwgYmxvY2tzaXplLAorCQkJCQlLTV9VU0VSMCk7CiAJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJCWVyciA9IDA7CiAJCQljb250aW51ZTsKQEAgLTE0MjIsMTAgKzE0MDYsOCBAQAogCQlpZiAocGFnZS0+aW5kZXggPj0gKGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkgewogCQkJLyogVGhlIHBhZ2Ugc3RyYWRkbGVzIGlfc2l6ZS4gKi8KIAkJCXVuc2lnbmVkIGludCBvZnMgPSBpX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOwotCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JCQltZW1zZXQoa2FkZHIgKyBvZnMsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIG9mcyk7Ci0JCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Ci0JCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCXplcm9fdXNlcl9wYWdlKHBhZ2UsIG9mcywgUEFHRV9DQUNIRV9TSVpFIC0gb2ZzLAorCQkJCQlLTV9VU0VSMCk7CiAJCX0KIAkJLyogSGFuZGxlIG1zdCBwcm90ZWN0ZWQgYXR0cmlidXRlcy4gKi8KIAkJaWYgKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpKQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9maWxlLmMgYi9mcy9udGZzL2ZpbGUuYwppbmRleCA2MjFkZTM2Li4zOWExNjY5IDEwMDY0NAotLS0gYS9mcy9udGZzL2ZpbGUuYworKysgYi9mcy9udGZzL2ZpbGUuYwpAQCAtNjA2LDExICs2MDYsOCBAQAogCQkJCQludGZzX3N1Ym1pdF9iaF9mb3JfcmVhZChiaCk7CiAJCQkJCSp3YWl0X2JoKysgPSBiaDsKIAkJCQl9IGVsc2UgewotCQkJCQl1OCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JCQkJCW1lbXNldChrYWRkciArIGJoX29mZnNldChiaCksIDAsCi0JCQkJCQkJYmxvY2tzaXplKTsKLQkJCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwotCQkJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCQkJemVyb191c2VyX3BhZ2UocGFnZSwgYmhfb2Zmc2V0KGJoKSwKKwkJCQkJCQlibG9ja3NpemUsIEtNX1VTRVIwKTsKIAkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCQkJfQogCQkJfQpAQCAtNjg1LDEyICs2ODIsOSBAQAogCQkJCQkJbnRmc19zdWJtaXRfYmhfZm9yX3JlYWQoYmgpOwogCQkJCQkJKndhaXRfYmgrKyA9IGJoOwogCQkJCQl9IGVsc2UgewotCQkJCQkJdTggKmthZGRyID0ga21hcF9hdG9taWMocGFnZSwKLQkJCQkJCQkJS01fVVNFUjApOwotCQkJCQkJbWVtc2V0KGthZGRyICsgYmhfb2Zmc2V0KGJoKSwKLQkJCQkJCQkJMCwgYmxvY2tzaXplKTsKLQkJCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKLQkJCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCQkJemVyb191c2VyX3BhZ2UocGFnZSwKKwkJCQkJCQliaF9vZmZzZXQoYmgpLAorCQkJCQkJCWJsb2Nrc2l6ZSwgS01fVVNFUjApOwogCQkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCQkJCX0KIAkJCQl9CkBAIC03MDgsMTEgKzcwMiw4IEBACiAJCQkgKi8KIAkJCWlmIChiaF9lbmQgPD0gcG9zIHx8IGJoX3BvcyA+PSBlbmQpIHsKIAkJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKLQkJCQkJdTggKmthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCQkJCQltZW1zZXQoa2FkZHIgKyBiaF9vZmZzZXQoYmgpLCAwLAotCQkJCQkJCWJsb2Nrc2l6ZSk7Ci0JCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKLQkJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJCXplcm9fdXNlcl9wYWdlKHBhZ2UsIGJoX29mZnNldChiaCksCisJCQkJCQkJYmxvY2tzaXplLCBLTV9VU0VSMCk7CiAJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQkJCX0KIAkJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CkBAIC03NTEsMTAgKzc0Miw4IEBACiAJCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQogCQkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJCX0gZWxzZSBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKLQkJCQl1OCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JCQkJbWVtc2V0KGthZGRyICsgYmhfb2Zmc2V0KGJoKSwgMCwgYmxvY2tzaXplKTsKLQkJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Ci0JCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJemVyb191c2VyX3BhZ2UocGFnZSwgYmhfb2Zmc2V0KGJoKSwgYmxvY2tzaXplLAorCQkJCQkJS01fVVNFUjApOwogCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQkJfQogCQkJY29udGludWU7CkBAIC04NzgsMTEgKzg2Nyw4IEBACiAJCQkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKIAkJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQkJCX0gZWxzZSBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKLQkJCQkJdTggKmthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCQkJCQltZW1zZXQoa2FkZHIgKyBiaF9vZmZzZXQoYmgpLCAwLAotCQkJCQkJCWJsb2Nrc2l6ZSk7Ci0JCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKLQkJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJCXplcm9fdXNlcl9wYWdlKHBhZ2UsIGJoX29mZnNldChiaCksCisJCQkJCQkJYmxvY2tzaXplLCBLTV9VU0VSMCk7CiAJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQkJCX0KIAkJCQljb250aW51ZTsKQEAgLTExMzcsMTYgKzExMjMsMTIgQEAKIAkJCSAqIHRvIHplcm8gdGhlIG92ZXJmbG93aW5nIHJlZ2lvbi4KIAkJCSAqLwogCQkJaWYgKHVubGlrZWx5KGJoX3BvcyArIGJsb2Nrc2l6ZSA+IGluaXRpYWxpemVkX3NpemUpKSB7Ci0JCQkJdTggKmthZGRyOwogCQkJCWludCBvZnMgPSAwOwogCiAJCQkJaWYgKGxpa2VseShiaF9wb3MgPCBpbml0aWFsaXplZF9zaXplKSkKIAkJCQkJb2ZzID0gaW5pdGlhbGl6ZWRfc2l6ZSAtIGJoX3BvczsKLQkJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLQkJCQltZW1zZXQoa2FkZHIgKyBiaF9vZmZzZXQoYmgpICsgb2ZzLCAwLAotCQkJCQkJYmxvY2tzaXplIC0gb2ZzKTsKLQkJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7Ci0JCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJemVyb191c2VyX3BhZ2UocGFnZSwgYmhfb2Zmc2V0KGJoKSArIG9mcywKKwkJCQkJCWJsb2Nrc2l6ZSAtIG9mcywgS01fVVNFUjApOwogCQkJfQogCQl9IGVsc2UgLyogaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoYmgpKSkgKi8KIAkJCWVyciA9IC1FSU87CkBAIC0xMjg2LDExICsxMjY4LDggQEAKIAkJCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKQogCQkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKIAkJCQllbHNlIHsKLQkJCQkJdTggKmthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOwotCQkJCQltZW1zZXQoa2FkZHIgKyBiaF9vZmZzZXQoYmgpLCAwLAotCQkJCQkJCWJsb2Nrc2l6ZSk7Ci0JCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKLQkJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJCXplcm9fdXNlcl9wYWdlKHBhZ2UsIGJoX29mZnNldChiaCksCisJCQkJCQkJYmxvY2tzaXplLCBLTV9VU0VSMCk7CiAJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwogCQkJCX0KIAkJCX0KQEAgLTEzNTAsOSArMTMyOSw3IEBACiAJCWxlbiA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJaWYgKGxlbiA+IGJ5dGVzKQogCQkJbGVuID0gYnl0ZXM7Ci0JCWthZGRyID0ga21hcF9hdG9taWMoKnBhZ2VzLCBLTV9VU0VSMCk7Ci0JCW1lbXNldChrYWRkciwgMCwgbGVuKTsKLQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQl6ZXJvX3VzZXJfcGFnZSgqcGFnZXMsIDAsIGxlbiwgS01fVVNFUjApOwogCX0KIAlnb3RvIG91dDsKIH0KQEAgLTE0NzMsOSArMTQ1MCw3IEBACiAJCWxlbiA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJaWYgKGxlbiA+IGJ5dGVzKQogCQkJbGVuID0gYnl0ZXM7Ci0JCWthZGRyID0ga21hcF9hdG9taWMoKnBhZ2VzLCBLTV9VU0VSMCk7Ci0JCW1lbXNldChrYWRkciwgMCwgbGVuKTsKLQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQl6ZXJvX3VzZXJfcGFnZSgqcGFnZXMsIDAsIGxlbiwgS01fVVNFUjApOwogCX0KIAlnb3RvIG91dDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvS2NvbmZpZyBiL2ZzL3BhcnRpdGlvbnMvS2NvbmZpZwppbmRleCAwMTIwNzA0Li43NjM4YTFjIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL0tjb25maWcKKysrIGIvZnMvcGFydGl0aW9ucy9LY29uZmlnCkBAIC0yMzksNyArMjM5LDcgQEAKIAogY29uZmlnIFNZU1Y2OF9QQVJUSVRJT04KIAlib29sICJTWVNWNjggcGFydGl0aW9uIHRhYmxlIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRAotCWRlZmF1bHQgeSBpZiBNNjhLCisJZGVmYXVsdCB5IGlmIFZNRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byByZWFkIHRoZSBoYXJkIGRpc2sKIAkgIHBhcnRpdGlvbiB0YWJsZSBmb3JtYXQgdXNlZCBieSBNb3Rvcm9sYSBEZWx0YSBtYWNoaW5lcyAodXNpbmcKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvZWZpLmMgYi9mcy9wYXJ0aXRpb25zL2VmaS5jCmluZGV4IDFiZWE2MTAuLmU3YjA3MDAgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvZWZpLmMKKysrIGIvZnMvcGFydGl0aW9ucy9lZmkuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1wbWJyX3BhcnRfdmFsaWQoc3RydWN0IHBhcnRpdGlvbiAqcGFydCwgdTY0IGxhc3RsYmEpCitwbWJyX3BhcnRfdmFsaWQoc3RydWN0IHBhcnRpdGlvbiAqcGFydCkKIHsKICAgICAgICAgaWYgKHBhcnQtPnN5c19pbmQgPT0gRUZJX1BNQlJfT1NUWVBFX0VGSV9HUFQgJiYKICAgICAgICAgICAgIGxlMzJfdG9fY3B1KHBhcnQtPnN0YXJ0X3NlY3QpID09IDFVTCkKQEAgLTE2Myw3ICsxNjMsNiBAQAogLyoqCiAgKiBpc19wbWJyX3ZhbGlkKCk6IHRlc3QgUHJvdGVjdGl2ZSBNQlIgZm9yIHZhbGlkaXR5CiAgKiBAbWJyOiBwb2ludGVyIHRvIGEgbGVnYWN5IG1iciBzdHJ1Y3R1cmUKLSAqIEBsYXN0bGJhOiBsYXN0X2xiYSBmb3IgdGhlIHdob2xlIGRldmljZQogICoKICAqIERlc2NyaXB0aW9uOiBSZXR1cm5zIDEgaWYgUE1CUiBpcyB2YWxpZCwgMCBvdGhlcndpc2UuCiAgKiBWYWxpZGl0eSBkZXBlbmRzIG9uIHR3byB0aGluZ3M6CkBAIC0xNzEsMTMgKzE3MCwxMyBAQAogICogIDIpIE9uZSBwYXJ0aXRpb24gb2YgdHlwZSAweEVFIGlzIGZvdW5kCiAgKi8KIHN0YXRpYyBpbnQKLWlzX3BtYnJfdmFsaWQobGVnYWN5X21iciAqbWJyLCB1NjQgbGFzdGxiYSkKK2lzX3BtYnJfdmFsaWQobGVnYWN5X21iciAqbWJyKQogewogCWludCBpOwogCWlmICghbWJyIHx8IGxlMTZfdG9fY3B1KG1ici0+c2lnbmF0dXJlKSAhPSBNU0RPU19NQlJfU0lHTkFUVVJFKQogICAgICAgICAgICAgICAgIHJldHVybiAwOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCWlmIChwbWJyX3BhcnRfdmFsaWQoJm1ici0+cGFydGl0aW9uX3JlY29yZFtpXSwgbGFzdGxiYSkpCisJCWlmIChwbWJyX3BhcnRfdmFsaWQoJm1ici0+cGFydGl0aW9uX3JlY29yZFtpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTUxNiw3ICs1MTUsNyBAQAogCWludCBnb29kX3BncHQgPSAwLCBnb29kX2FncHQgPSAwLCBnb29kX3BtYnIgPSAwOwogCWdwdF9oZWFkZXIgKnBncHQgPSBOVUxMLCAqYWdwdCA9IE5VTEw7CiAJZ3B0X2VudHJ5ICpwcHRlcyA9IE5VTEwsICphcHRlcyA9IE5VTEw7Ci0JbGVnYWN5X21iciAqbGVnYWN5bWJyID0gTlVMTDsKKwlsZWdhY3lfbWJyICpsZWdhY3ltYnI7CiAJdTY0IGxhc3RsYmE7CiAJaWYgKCFiZGV2IHx8ICFncHQgfHwgIXB0ZXMpCiAJCXJldHVybiAwOwpAQCAtNTI4LDkgKzUyNyw4IEBACiAgICAgICAgICAgICAgICAgaWYgKGxlZ2FjeW1icikgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9sYmEoYmRldiwgMCwgKHU4ICopIGxlZ2FjeW1iciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoKmxlZ2FjeW1icikpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ29vZF9wbWJyID0gaXNfcG1icl92YWxpZChsZWdhY3ltYnIsIGxhc3RsYmEpOworICAgICAgICAgICAgICAgICAgICAgICAgZ29vZF9wbWJyID0gaXNfcG1icl92YWxpZChsZWdhY3ltYnIpOwogICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUobGVnYWN5bWJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeW1icj1OVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIWdvb2RfcG1icikKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2ZzL3NpZ25hbGZkLmMgYi9mcy9zaWduYWxmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZmVhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zaWduYWxmZC5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogIGZzL3NpZ25hbGZkLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDAzICBMaW51cyBUb3J2YWxkcworICoKKyAqICBNb24gTWFyIDUsIDIwMDc6IERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqICAgICAgQ2hhbmdlZCAtPnJlYWQoKSB0byByZXR1cm4gYSBzaWdpbmZvIHN0cmN0dXJlIGluc3RlYWQgb2Ygc2lnbmFsIG51bWJlci4KKyAqICAgICAgRml4ZWQgbG9ja2luZyBpbiAtPnBvbGwoKS4KKyAqICAgICAgQWRkZWQgc2lnaGFuZC1kZXRhY2ggbm90aWZpY2F0aW9uLgorICogICAgICBBZGRlZCBmZCByZS11c2UgaW4gc3lzX3NpZ25hbGZkKCkgc3lzY2FsbC4KKyAqICAgICAgTm93IHVzaW5nIGFub255bW91cyBpbm9kZSBzb3VyY2UuCisgKiAgICAgIFRoYW5rcyB0byBPbGVnIE5lc3Rlcm92IGZvciB1c2VmdWwgY29kZSByZXZpZXcgYW5kIHN1Z2dlc3Rpb25zLgorICogICAgICBNb3JlIGNvbW1lbnRzIGFuZCBzdWdnZXN0aW9ucyBmcm9tIEFybmQgQmVyZ21hbm4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvYW5vbl9pbm9kZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWxmZC5oPgorCitzdHJ1Y3Qgc2lnbmFsZmRfY3R4IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxuazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cWg7CisJc2lnc2V0X3Qgc2lnbWFzazsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKK307CisKK3N0cnVjdCBzaWduYWxmZF9sb2NrY3R4IHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworfTsKKworLyoKKyAqIFRyaWVzIHRvIGFjcXVpcmUgdGhlIHNpZ2hhbmQgbG9jay4gV2UgZG8gbm90IGluY3JlbWVudCB0aGUgc2lnaGFuZAorICogdXNlIGNvdW50LCBhbmQgd2UgZG8gbm90IGV2ZW4gcGluIHRoZSB0YXNrIHN0cnVjdCwgc28gd2UgbmVlZCB0bworICogZG8gaXQgaW5zaWRlIGFuIFJDVSByZWFkIGxvY2ssIGFuZCB3ZSBtdXN0IGJlIHByZXBhcmVkIGZvciB0aGUKKyAqIGN0eC0+dHNrIGdvaW5nIHRvIE5VTEwgKGluIHNpZ25hbGZkX2RlbGl2ZXIoKSksIGFuZCBmb3IgdGhlIHNpZ2hhbmQKKyAqIGJlaW5nIGRldGFjaGVkLiBXZSByZXR1cm4gMCBpZiB0aGUgc2lnaGFuZCBoYXMgYmVlbiBkZXRhY2hlZCwgb3IKKyAqIDEgaWYgd2Ugd2VyZSBhYmxlIHRvIHBpbiB0aGUgc2lnaGFuZCBsb2NrLgorICovCitzdGF0aWMgaW50IHNpZ25hbGZkX2xvY2soc3RydWN0IHNpZ25hbGZkX2N0eCAqY3R4LCBzdHJ1Y3Qgc2lnbmFsZmRfbG9ja2N0eCAqbGspCit7CisJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWdoYW5kID0gTlVMTDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsay0+dHNrID0gcmN1X2RlcmVmZXJlbmNlKGN0eC0+dHNrKTsKKwlpZiAobGlrZWx5KGxrLT50c2sgIT0gTlVMTCkpCisJCXNpZ2hhbmQgPSBsb2NrX3Rhc2tfc2lnaGFuZChsay0+dHNrLCAmbGstPmZsYWdzKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmIChzaWdoYW5kICYmICFjdHgtPnRzaykgeworCQl1bmxvY2tfdGFza19zaWdoYW5kKGxrLT50c2ssICZsay0+ZmxhZ3MpOworCQlzaWdoYW5kID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gc2lnaGFuZCAhPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzaWduYWxmZF91bmxvY2soc3RydWN0IHNpZ25hbGZkX2xvY2tjdHggKmxrKQoreworCXVubG9ja190YXNrX3NpZ2hhbmQobGstPnRzaywgJmxrLT5mbGFncyk7Cit9CisKKy8qCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHNpZ2hhbmQgbG9jayBoZWxkLgorICovCit2b2lkIHNpZ25hbGZkX2RlbGl2ZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBzaWcpCit7CisJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWdoYW5kID0gdHNrLT5zaWdoYW5kOworCXN0cnVjdCBzaWduYWxmZF9jdHggKmN0eCwgKnRtcDsKKworCUJVR19PTighc2lnKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3R4LCB0bXAsICZzaWdoYW5kLT5zaWduYWxmZF9saXN0LCBsbmspIHsKKwkJLyoKKwkJICogV2UgdXNlIGEgbmVnYXRpdmUgc2lnbmFsIHZhbHVlIGFzIGEgd2F5IHRvIGJyb2FkY2FzdCB0aGF0IHRoZQorCQkgKiBzaWdoYW5kIGhhcyBiZWVuIG9ycGhhbmVkLCBzbyB0aGF0IHdlIGNhbiBub3RpZnkgYWxsIHRoZQorCQkgKiBsaXN0ZW5lcnMgYWJvdXQgdGhpcy4gUmVtZW1iZXIgdGhlIGN0eC0+c2lnbWFzayBpcyBpbnZlcnRlZCwKKwkJICogc28gaWYgdGhlIHVzZXIgaXMgaW50ZXJlc3RlZCBpbiBhIHNpZ25hbCwgdGhhdCBjb3JyZXNwb25kaW5nCisJCSAqIGJpdCB3aWxsIGJlIHplcm8uCisJCSAqLworCQlpZiAoc2lnIDwgMCkgeworCQkJaWYgKGN0eC0+dHNrID09IHRzaykgeworCQkJCWN0eC0+dHNrID0gTlVMTDsKKwkJCQlsaXN0X2RlbF9pbml0KCZjdHgtPmxuayk7CisJCQkJd2FrZV91cCgmY3R4LT53cWgpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCFzaWdpc21lbWJlcigmY3R4LT5zaWdtYXNrLCBzaWcpKQorCQkJCXdha2VfdXAoJmN0eC0+d3FoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2lnbmFsZmRfY2xlYW51cChzdHJ1Y3Qgc2lnbmFsZmRfY3R4ICpjdHgpCit7CisJc3RydWN0IHNpZ25hbGZkX2xvY2tjdHggbGs7CisKKwkvKgorCSAqIFRoaXMgaXMgdHJpY2t5LiBJZiB0aGUgc2lnaGFuZCBpcyBnb25lLCB3ZSBkbyBub3QgbmVlZCB0byByZW1vdmUKKwkgKiBjb250ZXh0IGZyb20gdGhlIGxpc3QsIHRoZSBsaXN0IGl0c2VsZiB3b24ndCBiZSB0aGVyZSBhbnltb3JlLgorCSAqLworCWlmIChzaWduYWxmZF9sb2NrKGN0eCwgJmxrKSkgeworCQlsaXN0X2RlbCgmY3R4LT5sbmspOworCQlzaWduYWxmZF91bmxvY2soJmxrKTsKKwl9CisJa2ZyZWUoY3R4KTsKK30KKworc3RhdGljIGludCBzaWduYWxmZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXNpZ25hbGZkX2NsZWFudXAoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzaWduYWxmZF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBzaWduYWxmZF9jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgZXZlbnRzID0gMDsKKwlzdHJ1Y3Qgc2lnbmFsZmRfbG9ja2N0eCBsazsKKworCXBvbGxfd2FpdChmaWxlLCAmY3R4LT53cWgsIHdhaXQpOworCisJLyoKKwkgKiBMZXQgdGhlIGNhbGxlciBnZXQgYSBQT0xMSU4gaW4gdGhpcyBjYXNlLCBhbGEgc29ja2V0IHJlY3YoKSB3aGVuCisJICogdGhlIHBlZXIgZGlzY29ubmVjdHMuCisJICovCisJaWYgKHNpZ25hbGZkX2xvY2soY3R4LCAmbGspKSB7CisJCWlmIChuZXh0X3NpZ25hbCgmbGsudHNrLT5wZW5kaW5nLCAmY3R4LT5zaWdtYXNrKSA+IDAgfHwKKwkJICAgIG5leHRfc2lnbmFsKCZsay50c2stPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcsCisJCQkJJmN0eC0+c2lnbWFzaykgPiAwKQorCQkJZXZlbnRzIHw9IFBPTExJTjsKKwkJc2lnbmFsZmRfdW5sb2NrKCZsayk7CisJfSBlbHNlCisJCWV2ZW50cyB8PSBQT0xMSU47CisKKwlyZXR1cm4gZXZlbnRzOworfQorCisvKgorICogQ29waWVkIGZyb20gY29weV9zaWdpbmZvX3RvX3VzZXIoKSBpbiBrZXJuZWwvc2lnbmFsLmMKKyAqLworc3RhdGljIGludCBzaWduYWxmZF9jb3B5aW5mbyhzdHJ1Y3Qgc2lnbmFsZmRfc2lnaW5mbyBfX3VzZXIgKnVpbmZvLAorCQkJICAgICBzaWdpbmZvX3QgY29uc3QgKmtpbmZvKQoreworCWxvbmcgZXJyOworCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3Qgc2lnbmFsZmRfc2lnaW5mbykgIT0gMTI4KTsKKworCS8qCisJICogVW51c2VkIG1lbWViZXJzIHNob3VsZCBiZSB6ZXJvIC4uLgorCSAqLworCWVyciA9IF9fY2xlYXJfdXNlcih1aW5mbywgc2l6ZW9mKCp1aW5mbykpOworCisJLyoKKwkgKiBJZiB5b3UgY2hhbmdlIHNpZ2luZm9fdCBzdHJ1Y3R1cmUsIHBsZWFzZSBiZSBzdXJlCisJICogdGhpcyBjb2RlIGlzIGZpeGVkIGFjY29yZGluZ2x5LgorCSAqLworCWVyciB8PSBfX3B1dF91c2VyKGtpbmZvLT5zaV9zaWdubywgJnVpbmZvLT5zaWdubyk7CisJZXJyIHw9IF9fcHV0X3VzZXIoa2luZm8tPnNpX2Vycm5vLCAmdWluZm8tPmVycik7CisJZXJyIHw9IF9fcHV0X3VzZXIoKHNob3J0KWtpbmZvLT5zaV9jb2RlLCAmdWluZm8tPmNvZGUpOworCXN3aXRjaCAoa2luZm8tPnNpX2NvZGUgJiBfX1NJX01BU0spIHsKKwljYXNlIF9fU0lfS0lMTDoKKwkJZXJyIHw9IF9fcHV0X3VzZXIoa2luZm8tPnNpX3BpZCwgJnVpbmZvLT5waWQpOworCQllcnIgfD0gX19wdXRfdXNlcihraW5mby0+c2lfdWlkLCAmdWluZm8tPnVpZCk7CisJCWJyZWFrOworCWNhc2UgX19TSV9USU1FUjoKKwkJIGVyciB8PSBfX3B1dF91c2VyKGtpbmZvLT5zaV90aWQsICZ1aW5mby0+dGlkKTsKKwkJIGVyciB8PSBfX3B1dF91c2VyKGtpbmZvLT5zaV9vdmVycnVuLCAmdWluZm8tPm92ZXJydW4pOworCQkgZXJyIHw9IF9fcHV0X3VzZXIoKGxvbmcpa2luZm8tPnNpX3B0ciwgJnVpbmZvLT5zdnB0cik7CisJCWJyZWFrOworCWNhc2UgX19TSV9QT0xMOgorCQllcnIgfD0gX19wdXRfdXNlcihraW5mby0+c2lfYmFuZCwgJnVpbmZvLT5iYW5kKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoa2luZm8tPnNpX2ZkLCAmdWluZm8tPmZkKTsKKwkJYnJlYWs7CisJY2FzZSBfX1NJX0ZBVUxUOgorCQllcnIgfD0gX19wdXRfdXNlcigobG9uZylraW5mby0+c2lfYWRkciwgJnVpbmZvLT5hZGRyKTsKKyNpZmRlZiBfX0FSQ0hfU0lfVFJBUE5PCisJCWVyciB8PSBfX3B1dF91c2VyKGtpbmZvLT5zaV90cmFwbm8sICZ1aW5mby0+dHJhcG5vKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIF9fU0lfQ0hMRDoKKwkJZXJyIHw9IF9fcHV0X3VzZXIoa2luZm8tPnNpX3BpZCwgJnVpbmZvLT5waWQpOworCQllcnIgfD0gX19wdXRfdXNlcihraW5mby0+c2lfdWlkLCAmdWluZm8tPnVpZCk7CisJCWVyciB8PSBfX3B1dF91c2VyKGtpbmZvLT5zaV9zdGF0dXMsICZ1aW5mby0+c3RhdHVzKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoa2luZm8tPnNpX3V0aW1lLCAmdWluZm8tPnV0aW1lKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoa2luZm8tPnNpX3N0aW1lLCAmdWluZm8tPnN0aW1lKTsKKwkJYnJlYWs7CisJY2FzZSBfX1NJX1JUOiAvKiBUaGlzIGlzIG5vdCBnZW5lcmF0ZWQgYnkgdGhlIGtlcm5lbCBhcyBvZiBub3cuICovCisJY2FzZSBfX1NJX01FU0dROiAvKiBCdXQgdGhpcyBpcyAqLworCQllcnIgfD0gX19wdXRfdXNlcihraW5mby0+c2lfcGlkLCAmdWluZm8tPnBpZCk7CisJCWVyciB8PSBfX3B1dF91c2VyKGtpbmZvLT5zaV91aWQsICZ1aW5mby0+dWlkKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoKGxvbmcpa2luZm8tPnNpX3B0ciwgJnVpbmZvLT5zdnB0cik7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIHRoaXMgaXMganVzdCBpbiBjYXNlIGZvciBub3cgLi4uICovCisJCWVyciB8PSBfX3B1dF91c2VyKGtpbmZvLT5zaV9waWQsICZ1aW5mby0+cGlkKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoa2luZm8tPnNpX3VpZCwgJnVpbmZvLT51aWQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyID8gLUVGQVVMVDogc2l6ZW9mKCp1aW5mbyk7Cit9CisKKy8qCisgKiBSZXR1cm5zIGVpdGhlciB0aGUgc2l6ZSBvZiBhICJzdHJ1Y3Qgc2lnbmFsZmRfc2lnaW5mbyIsIG9yIHplcm8gaWYgdGhlCisgKiBzaWdoYW5kIHdlIGFyZSBhdHRhY2hlZCB0bywgaGFzIGJlZW4gb3JwaGFuZWQuIFRoZSAiY291bnQiIHBhcmFtZXRlcgorICogbXVzdCBiZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiBhICJzdHJ1Y3Qgc2lnbmFsZmRfc2lnaW5mbyIuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNpZ25hbGZkX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzaWduYWxmZF9jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJlcyA9IDA7CisJaW50IGxvY2tlZCwgc2lnbm87CisJc2lnaW5mb190IGluZm87CisJc3RydWN0IHNpZ25hbGZkX2xvY2tjdHggbGs7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlpZiAoY291bnQgPCBzaXplb2Yoc3RydWN0IHNpZ25hbGZkX3NpZ2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsb2NrZWQgPSBzaWduYWxmZF9sb2NrKGN0eCwgJmxrKTsKKwlpZiAoIWxvY2tlZCkKKwkJcmV0dXJuIDA7CisJcmVzID0gLUVBR0FJTjsKKwlzaWdubyA9IGRlcXVldWVfc2lnbmFsKGxrLnRzaywgJmN0eC0+c2lnbWFzaywgJmluZm8pOworCWlmIChzaWdubyA9PSAwICYmICEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CisJCWFkZF93YWl0X3F1ZXVlKCZjdHgtPndxaCwgJndhaXQpOworCQlmb3IgKDs7KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc2lnbm8gPSBkZXF1ZXVlX3NpZ25hbChsay50c2ssICZjdHgtPnNpZ21hc2ssICZpbmZvKTsKKwkJCWlmIChzaWdubyAhPSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmVzID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc2lnbmFsZmRfdW5sb2NrKCZsayk7CisJCQlzY2hlZHVsZSgpOworCQkJbG9ja2VkID0gc2lnbmFsZmRfbG9jayhjdHgsICZsayk7CisJCQlpZiAodW5saWtlbHkoIWxvY2tlZCkpIHsKKwkJCQkvKgorCQkJCSAqIExldCB0aGUgY2FsbGVyIHJlYWQgemVybyBieXRlLCBhbGEgc29ja2V0CisJCQkJICogcmVjdigpIHdoZW4gdGhlIHBlZXIgZGlzY29ubmVjdC4gVGhpcyB0ZXN0CisJCQkJICogbXVzdCBiZSBkb25lIGJlZm9yZSBkb2luZyBhIGRlcXVldWVfc2lnbmFsKCksCisJCQkJICogYmVjYXVzZSBpZiB0aGUgc2lnaGFuZCBoYXMgYmVlbiBvcnBoYW5lZCwKKwkJCQkgKiB0aGUgZGVxdWV1ZV9zaWduYWwoKSBjYWxsIGlzIGdvaW5nIHRvIGNyYXNoLgorCQkJCSAqLworCQkJCXJlcyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmN0eC0+d3FoLCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisJaWYgKGxpa2VseShsb2NrZWQpKQorCQlzaWduYWxmZF91bmxvY2soJmxrKTsKKwlpZiAobGlrZWx5KHNpZ25vKSkKKwkJcmVzID0gc2lnbmFsZmRfY29weWluZm8oKHN0cnVjdCBzaWduYWxmZF9zaWdpbmZvIF9fdXNlciAqKSBidWYsCisJCQkJCSZpbmZvKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNpZ25hbGZkX2ZvcHMgPSB7CisJLnJlbGVhc2UJPSBzaWduYWxmZF9yZWxlYXNlLAorCS5wb2xsCQk9IHNpZ25hbGZkX3BvbGwsCisJLnJlYWQJCT0gc2lnbmFsZmRfcmVhZCwKK307CisKKy8qCisgKiBDcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggb3VyIHNpZ25hbAorICogc3RhdGUuIFdlIGNhbiBwYXNzIGl0IGFyb3VuZCB0byBvdGhlcnMgaWYgd2Ugd2FudCB0bywgYnV0CisgKiBpdCB3aWxsIGFsd2F5cyBiZSBfb3VyXyBzaWduYWwgc3RhdGUuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfc2lnbmFsZmQoaW50IHVmZCwgc2lnc2V0X3QgX191c2VyICp1c2VyX21hc2ssIHNpemVfdCBzaXplbWFzaykKK3sKKwlpbnQgZXJyb3I7CisJc2lnc2V0X3Qgc2lnbWFzazsKKwlzdHJ1Y3Qgc2lnbmFsZmRfY3R4ICpjdHg7CisJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWdoYW5kOworCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHNpZ25hbGZkX2xvY2tjdHggbGs7CisKKwlpZiAoc2l6ZW1hc2sgIT0gc2l6ZW9mKHNpZ3NldF90KSB8fAorCSAgICBjb3B5X2Zyb21fdXNlcigmc2lnbWFzaywgdXNlcl9tYXNrLCBzaXplb2Yoc2lnbWFzaykpKQorCQlyZXR1cm4gZXJyb3IgPSAtRUlOVkFMOworCXNpZ2RlbHNldG1hc2soJnNpZ21hc2ssIHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApKTsKKwlzaWdub3RzZXQoJnNpZ21hc2spOworCisJaWYgKHVmZCA9PSAtMSkgeworCQljdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY3R4KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmY3R4LT53cWgpOworCQljdHgtPnNpZ21hc2sgPSBzaWdtYXNrOworCQljdHgtPnRzayA9IGN1cnJlbnQ7CisKKwkJc2lnaGFuZCA9IGN1cnJlbnQtPnNpZ2hhbmQ7CisJCS8qCisJCSAqIEFkZCB0aGlzIGZkIHRvIHRoZSBsaXN0IG9mIHNpZ25hbCBsaXN0ZW5lcnMuCisJCSAqLworCQlzcGluX2xvY2tfaXJxKCZzaWdoYW5kLT5zaWdsb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmY3R4LT5sbmssICZzaWdoYW5kLT5zaWduYWxmZF9saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZzaWdoYW5kLT5zaWdsb2NrKTsKKworCQkvKgorCQkgKiBXaGVuIHdlIGNhbGwgdGhpcywgdGhlIGluaXRpYWxpemF0aW9uIG11c3QgYmUgY29tcGxldGUsIHNpbmNlCisJCSAqIGFub25faW5vZGVfZ2V0ZmQoKSB3aWxsIGluc3RhbGwgdGhlIGZkLgorCQkgKi8KKwkJZXJyb3IgPSBhbm9uX2lub2RlX2dldGZkKCZ1ZmQsICZpbm9kZSwgJmZpbGUsICJbc2lnbmFsZmRdIiwKKwkJCQkJICZzaWduYWxmZF9mb3BzLCBjdHgpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycl9mZGFsbG9jOworCX0gZWxzZSB7CisJCWZpbGUgPSBmZ2V0KHVmZCk7CisJCWlmICghZmlsZSkKKwkJCXJldHVybiAtRUJBREY7CisJCWN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJaWYgKGZpbGUtPmZfb3AgIT0gJnNpZ25hbGZkX2ZvcHMpIHsKKwkJCWZwdXQoZmlsZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKgorCQkgKiBXZSBuZWVkIHRvIGJlIHByZXBhcmVkIG9mIHRoZSBmYWN0IHRoYXQgdGhlIHNpZ2hhbmQgdGhpcyBmZAorCQkgKiBpcyBhdHRhY2hlZCB0bywgaGFzIGJlZW4gZGV0Y2hlZC4gSW4gdGhhdCBjYXNlIHNpZ25hbGZkX2xvY2soKQorCQkgKiB3aWxsIHJldHVybiAwLCBhbmQgd2UnbGwganVzdCBza2lwIHNldHRpbmcgdGhlIG5ldyBtYXNrLgorCQkgKi8KKwkJaWYgKHNpZ25hbGZkX2xvY2soY3R4LCAmbGspKSB7CisJCQljdHgtPnNpZ21hc2sgPSBzaWdtYXNrOworCQkJc2lnbmFsZmRfdW5sb2NrKCZsayk7CisJCX0KKwkJd2FrZV91cCgmY3R4LT53cWgpOworCQlmcHV0KGZpbGUpOworCX0KKworCXJldHVybiB1ZmQ7CisKK2Vycl9mZGFsbG9jOgorCXNpZ25hbGZkX2NsZWFudXAoY3R4KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL3RpbWVyZmQuYyBiL2ZzL3RpbWVyZmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI5ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdGltZXJmZC5jCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogIGZzL3RpbWVyZmQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIERhdmlkZSBMaWJlbnppIDxkYXZpZGVsQHhtYWlsc2VydmVyLm9yZz4KKyAqCisgKgorICogIFRoYW5rcyB0byBUaG9tYXMgR2xlaXhuZXIgZm9yIGNvZGUgcmV2aWV3cyBhbmQgdXNlZnVsIGNvbW1lbnRzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvYW5vbl9pbm9kZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lcmZkLmg+CisKK3N0cnVjdCB0aW1lcmZkX2N0eCB7CisJc3RydWN0IGhydGltZXIgdG1yOworCWt0aW1lX3QgdGludHY7CisJc3BpbmxvY2tfdCBsb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHdxaDsKKwlpbnQgZXhwaXJlZDsKK307CisKKy8qCisgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gdGhlIHRpbWVyIGV2ZW50IHRyaWdnZXJzLiBXZSBzZXQgdGhlICJleHBpcmVkIgorICogZmxhZywgYnV0IHdlIGRvIG5vdCByZS1hcm0gdGhlIHRpbWVyIChpbiBjYXNlIGl0J3MgbmVjZXNzYXJ5LAorICogdGludHYudHY2NCAhPSAwKSB1bnRpbCB0aGUgdGltZXIgaXMgcmVhZC4KKyAqLworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHRpbWVyZmRfdG1ycHJvYyhzdHJ1Y3QgaHJ0aW1lciAqaHRtcikKK3sKKwlzdHJ1Y3QgdGltZXJmZF9jdHggKmN0eCA9IGNvbnRhaW5lcl9vZihodG1yLCBzdHJ1Y3QgdGltZXJmZF9jdHgsIHRtcik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPmxvY2ssIGZsYWdzKTsKKwljdHgtPmV4cGlyZWQgPSAxOworCXdha2VfdXBfbG9ja2VkKCZjdHgtPndxaCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyZmRfc2V0dXAoc3RydWN0IHRpbWVyZmRfY3R4ICpjdHgsIGludCBjbG9ja2lkLCBpbnQgZmxhZ3MsCisJCQkgIGNvbnN0IHN0cnVjdCBpdGltZXJzcGVjICprdG1yKQoreworCWVudW0gaHJ0aW1lcl9tb2RlIGh0bW9kZTsKKwlrdGltZV90IHRleHA7CisKKwlodG1vZGUgPSAoZmxhZ3MgJiBURkRfVElNRVJfQUJTVElNRSkgPworCQlIUlRJTUVSX01PREVfQUJTOiBIUlRJTUVSX01PREVfUkVMOworCisJdGV4cCA9IHRpbWVzcGVjX3RvX2t0aW1lKGt0bXItPml0X3ZhbHVlKTsKKwljdHgtPmV4cGlyZWQgPSAwOworCWN0eC0+dGludHYgPSB0aW1lc3BlY190b19rdGltZShrdG1yLT5pdF9pbnRlcnZhbCk7CisJaHJ0aW1lcl9pbml0KCZjdHgtPnRtciwgY2xvY2tpZCwgaHRtb2RlKTsKKwljdHgtPnRtci5leHBpcmVzID0gdGV4cDsKKwljdHgtPnRtci5mdW5jdGlvbiA9IHRpbWVyZmRfdG1ycHJvYzsKKwlpZiAodGV4cC50djY0ICE9IDApCisJCWhydGltZXJfc3RhcnQoJmN0eC0+dG1yLCB0ZXhwLCBodG1vZGUpOworfQorCitzdGF0aWMgaW50IHRpbWVyZmRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdGltZXJmZF9jdHggKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWhydGltZXJfY2FuY2VsKCZjdHgtPnRtcik7CisJa2ZyZWUoY3R4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB0aW1lcmZkX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHRpbWVyZmRfY3R4ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGV2ZW50cyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXBvbGxfd2FpdChmaWxlLCAmY3R4LT53cWgsIHdhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+bG9jaywgZmxhZ3MpOworCWlmIChjdHgtPmV4cGlyZWQpCisJCWV2ZW50cyB8PSBQT0xMSU47CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZXZlbnRzOworfQorCitzdGF0aWMgc3NpemVfdCB0aW1lcmZkX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHRpbWVyZmRfY3R4ICpjdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXM7CisJdTMyIHRpY2tzID0gMDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWlmIChjb3VudCA8IHNpemVvZih0aWNrcykpCisJCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9ja19pcnEoJmN0eC0+bG9jayk7CisJcmVzID0gLUVBR0FJTjsKKwlpZiAoIWN0eC0+ZXhwaXJlZCAmJiAhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkgeworCQlfX2FkZF93YWl0X3F1ZXVlKCZjdHgtPndxaCwgJndhaXQpOworCQlmb3IgKHJlcyA9IDA7OykgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmIChjdHgtPmV4cGlyZWQpIHsKKwkJCQlyZXMgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmVzID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOworCQkJc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9ja19pcnEoJmN0eC0+bG9jayk7CisJCX0KKwkJX19yZW1vdmVfd2FpdF9xdWV1ZSgmY3R4LT53cWgsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKwlpZiAoY3R4LT5leHBpcmVkKSB7CisJCWN0eC0+ZXhwaXJlZCA9IDA7CisJCWlmIChjdHgtPnRpbnR2LnR2NjQgIT0gMCkgeworCQkJLyoKKwkJCSAqIElmIHRpbnR2LnR2NjQgIT0gMCwgdGhpcyBpcyBhIHBlcmlvZGljIHRpbWVyIHRoYXQKKwkJCSAqIG5lZWRzIHRvIGJlIHJlLWFybWVkLiBXZSBhdm9pZCBkb2luZyBpdCBpbiB0aGUgdGltZXIKKwkJCSAqIGNhbGxiYWNrIHRvIGF2b2lkIERvUyBhdHRhY2tzIHNwZWNpZnlpbmcgYSB2ZXJ5CisJCQkgKiBzaG9ydCB0aW1lciBwZXJpb2QuCisJCQkgKi8KKwkJCXRpY2tzID0gKHUzMikKKwkJCQlocnRpbWVyX2ZvcndhcmQoJmN0eC0+dG1yLAorCQkJCQkJaHJ0aW1lcl9jYl9nZXRfdGltZSgmY3R4LT50bXIpLAorCQkJCQkJY3R4LT50aW50dik7CisJCQlocnRpbWVyX3Jlc3RhcnQoJmN0eC0+dG1yKTsKKwkJfSBlbHNlCisJCQl0aWNrcyA9IDE7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwlpZiAodGlja3MpCisJCXJlcyA9IHB1dF91c2VyKHRpY2tzLCBidWYpID8gLUVGQVVMVDogc2l6ZW9mKHRpY2tzKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0aW1lcmZkX2ZvcHMgPSB7CisJLnJlbGVhc2UJPSB0aW1lcmZkX3JlbGVhc2UsCisJLnBvbGwJCT0gdGltZXJmZF9wb2xsLAorCS5yZWFkCQk9IHRpbWVyZmRfcmVhZCwKK307CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfdGltZXJmZChpbnQgdWZkLCBpbnQgY2xvY2tpZCwgaW50IGZsYWdzLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpdGltZXJzcGVjIF9fdXNlciAqdXRtcikKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IHRpbWVyZmRfY3R4ICpjdHg7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgaXRpbWVyc3BlYyBrdG1yOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZrdG1yLCB1dG1yLCBzaXplb2Yoa3RtcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjbG9ja2lkICE9IENMT0NLX01PTk9UT05JQyAmJgorCSAgICBjbG9ja2lkICE9IENMT0NLX1JFQUxUSU1FKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRpbWVzcGVjX3ZhbGlkKCZrdG1yLml0X3ZhbHVlKSB8fAorCSAgICAhdGltZXNwZWNfdmFsaWQoJmt0bXIuaXRfaW50ZXJ2YWwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1ZmQgPT0gLTEpIHsKKwkJY3R4ID0ga21hbGxvYyhzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOworCQlpZiAoIWN0eCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+d3FoKTsKKwkJc3Bpbl9sb2NrX2luaXQoJmN0eC0+bG9jayk7CisKKwkJdGltZXJmZF9zZXR1cChjdHgsIGNsb2NraWQsIGZsYWdzLCAma3Rtcik7CisKKwkJLyoKKwkJICogV2hlbiB3ZSBjYWxsIHRoaXMsIHRoZSBpbml0aWFsaXphdGlvbiBtdXN0IGJlIGNvbXBsZXRlLCBzaW5jZQorCQkgKiBhbm9uX2lub2RlX2dldGZkKCkgd2lsbCBpbnN0YWxsIHRoZSBmZC4KKwkJICovCisJCWVycm9yID0gYW5vbl9pbm9kZV9nZXRmZCgmdWZkLCAmaW5vZGUsICZmaWxlLCAiW3RpbWVyZmRdIiwKKwkJCQkJICZ0aW1lcmZkX2ZvcHMsIGN0eCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyX3RtcmNhbmNlbDsKKwl9IGVsc2UgeworCQlmaWxlID0gZmdldCh1ZmQpOworCQlpZiAoIWZpbGUpCisJCQlyZXR1cm4gLUVCQURGOworCQljdHggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCWlmIChmaWxlLT5mX29wICE9ICZ0aW1lcmZkX2ZvcHMpIHsKKwkJCWZwdXQoZmlsZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKgorCQkgKiBXZSBuZWVkIHRvIHN0b3AgdGhlIGV4aXN0aW5nIHRpbWVyIGJlZm9yZSByZXByb2dyYW1taW5nCisJCSAqIGl0IHRvIHRoZSBuZXcgdmFsdWVzLgorCQkgKi8KKwkJZm9yICg7OykgeworCQkJc3Bpbl9sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwkJCWlmIChocnRpbWVyX3RyeV90b19jYW5jZWwoJmN0eC0+dG1yKSA+PSAwKQorCQkJCWJyZWFrOworCQkJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOworCQkJY3B1X3JlbGF4KCk7CisJCX0KKwkJLyoKKwkJICogUmUtcHJvZ3JhbSB0aGUgdGltZXIgdG8gdGhlIG5ldyB2YWx1ZSAuLi4KKwkJICovCisJCXRpbWVyZmRfc2V0dXAoY3R4LCBjbG9ja2lkLCBmbGFncywgJmt0bXIpOworCisJCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwkJZnB1dChmaWxlKTsKKwl9CisKKwlyZXR1cm4gdWZkOworCitlcnJfdG1yY2FuY2VsOgorCWhydGltZXJfY2FuY2VsKCZjdHgtPnRtcik7CisJa2ZyZWUoY3R4KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL3hhdHRyLmMgYi9mcy94YXR0ci5jCmluZGV4IDlmNDU2OGIuLjQ1MjNhY2EgMTAwNjQ0Ci0tLSBhL2ZzL3hhdHRyLmMKKysrIGIvZnMveGF0dHIuYwpAQCAtMzUwLDYgKzM1MCw3IEBACiAJZiA9IGZnZXQoZmQpOwogCWlmICghZikKIAkJcmV0dXJuIGVycm9yOworCWF1ZGl0X2lub2RlKE5VTEwsIGYtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCWVycm9yID0gZ2V0eGF0dHIoZi0+Zl9wYXRoLmRlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUpOwogCWZwdXQoZik7CiAJcmV0dXJuIGVycm9yOwpAQCAtNDIyLDYgKzQyMyw3IEBACiAJZiA9IGZnZXQoZmQpOwogCWlmICghZikKIAkJcmV0dXJuIGVycm9yOworCWF1ZGl0X2lub2RlKE5VTEwsIGYtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwogCWVycm9yID0gbGlzdHhhdHRyKGYtPmZfcGF0aC5kZW50cnksIGxpc3QsIHNpemUpOwogCWZwdXQoZik7CiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvcG9sbC5oIGIvaW5jbHVkZS9hc20tYWxwaGEvcG9sbC5oCmluZGV4IDc2Zjg5MzUuLmM5ODUwOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL3BvbGwuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS9wb2xsLmgKQEAgLTEsMjUgKzEgQEAKLSNpZm5kZWYgX19BTFBIQV9QT0xMX0gKLSNkZWZpbmUgX19BTFBIQV9QT0xMX0gKLQotI2RlZmluZSBQT0xMSU4JCSgxIDw8IDApCi0jZGVmaW5lIFBPTExQUkkJCSgxIDw8IDEpCi0jZGVmaW5lIFBPTExPVVQJCSgxIDw8IDIpCi0jZGVmaW5lIFBPTExFUlIJCSgxIDw8IDMpCi0jZGVmaW5lIFBPTExIVVAJCSgxIDw8IDQpCi0jZGVmaW5lIFBPTExOVkFMCSgxIDw8IDUpCi0jZGVmaW5lIFBPTExSRE5PUk0JKDEgPDwgNikKLSNkZWZpbmUgUE9MTFJEQkFORAkoMSA8PCA3KQotI2RlZmluZSBQT0xMV1JOT1JNCSgxIDw8IDgpCi0jZGVmaW5lIFBPTExXUkJBTkQJKDEgPDwgOSkKLSNkZWZpbmUgUE9MTE1TRwkJKDEgPDwgMTApCi0jZGVmaW5lIFBPTExSRU1PVkUJKDEgPDwgMTIpCi0jZGVmaW5lIFBPTExSREhVUCAgICAgICAoMSA8PCAxMykKLQotCi1zdHJ1Y3QgcG9sbGZkIHsKLQlpbnQgZmQ7Ci0Jc2hvcnQgZXZlbnRzOwotCXNob3J0IHJldmVudHM7Ci19OwotCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vcG9sbC5oIGIvaW5jbHVkZS9hc20tYXJtL3BvbGwuaAppbmRleCA1MDMwYjJiLi5jOTg1MDlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9wb2xsLmgKQEAgLTEsMjcgKzEgQEAKLSNpZm5kZWYgX19BU01BUk1fUE9MTF9ICi0jZGVmaW5lIF9fQVNNQVJNX1BPTExfSAotCi0vKiBUaGVzZSBhcmUgc3BlY2lmaWVkIGJ5IGlCQ1MyICovCi0jZGVmaW5lIFBPTExJTgkJMHgwMDAxCi0jZGVmaW5lIFBPTExQUkkJCTB4MDAwMgotI2RlZmluZSBQT0xMT1VUCQkweDAwMDQKLSNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4Ci0jZGVmaW5lIFBPTExIVVAJCTB4MDAxMAotI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKLQotLyogVGhlIHJlc3Qgc2VlbSB0byBiZSBtb3JlLW9yLWxlc3Mgbm9uc3RhbmRhcmQuIENoZWNrIHRoZW0hICovCi0jZGVmaW5lIFBPTExSRE5PUk0JMHgwMDQwCi0jZGVmaW5lIFBPTExSREJBTkQJMHgwMDgwCi0jZGVmaW5lIFBPTExXUk5PUk0JMHgwMTAwCi0jZGVmaW5lIFBPTExXUkJBTkQJMHgwMjAwCi0jZGVmaW5lIFBPTExNU0cJCTB4MDQwMAotI2RlZmluZSBQT0xMUkVNT1ZFCTB4MTAwMAotI2RlZmluZSBQT0xMUkRIVVAgICAgICAgMHgyMDAwCi0KLXN0cnVjdCBwb2xsZmQgewotCWludCBmZDsKLQlzaG9ydCBldmVudHM7Ci0Jc2hvcnQgcmV2ZW50czsKLX07Ci0KLSNlbmRpZgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L3BvbGwuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3BvbGwuaAppbmRleCA5Y2NiN2Y0Li4xMTcwZTcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0yNi9wb2xsLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvcG9sbC5oCkBAIC0xLDI2ICsxLDggQEAKICNpZm5kZWYgX19BU01BUk1fUE9MTF9ICiAjZGVmaW5lIF9fQVNNQVJNX1BPTExfSAogCi0vKiBUaGVzZSBhcmUgc3BlY2lmaWVkIGJ5IGlCQ1MyICovCi0jZGVmaW5lIFBPTExJTgkJMHgwMDAxCi0jZGVmaW5lIFBPTExQUkkJCTB4MDAwMgotI2RlZmluZSBQT0xMT1VUCQkweDAwMDQKLSNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4Ci0jZGVmaW5lIFBPTExIVVAJCTB4MDAxMAotI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CiAKLS8qIFRoZSByZXN0IHNlZW0gdG8gYmUgbW9yZS1vci1sZXNzIG5vbnN0YW5kYXJkLiBDaGVjayB0aGVtISAqLwotI2RlZmluZSBQT0xMUkROT1JNCTB4MDA0MAotI2RlZmluZSBQT0xMUkRCQU5ECTB4MDA4MAotI2RlZmluZSBQT0xMV1JOT1JNCTB4MDEwMAotI2RlZmluZSBQT0xMV1JCQU5ECTB4MDIwMAotI2RlZmluZSBQT0xMTVNHCQkweDA0MDAKLSNkZWZpbmUgUE9MTFJESFVQICAgICAgIDB4MjAwMAotCi1zdHJ1Y3QgcG9sbGZkIHsKLQlpbnQgZmQ7Ci0Jc2hvcnQgZXZlbnRzOwotCXNob3J0IHJldmVudHM7Ci19OworI3VuZGVmIFBPTExSRU1PVkUKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9wb2xsLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9wb2xsLmgKaW5kZXggNzM2ZTI5Ny4uYzk4NTA5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3BvbGwuaApAQCAtMSwyNyArMSBAQAotI2lmbmRlZiBfX0FTTV9BVlIzMl9QT0xMX0gKLSNkZWZpbmUgX19BU01fQVZSMzJfUE9MTF9ICi0KLS8qIFRoZXNlIGFyZSBzcGVjaWZpZWQgYnkgaUJDUzIgKi8KLSNkZWZpbmUgUE9MTElOCQkweDAwMDEKLSNkZWZpbmUgUE9MTFBSSQkJMHgwMDAyCi0jZGVmaW5lIFBPTExPVVQJCTB4MDAwNAotI2RlZmluZSBQT0xMRVJSCQkweDAwMDgKLSNkZWZpbmUgUE9MTEhVUAkJMHgwMDEwCi0jZGVmaW5lIFBPTExOVkFMCTB4MDAyMAotCi0vKiBUaGUgcmVzdCBzZWVtIHRvIGJlIG1vcmUtb3ItbGVzcyBub25zdGFuZGFyZC4gQ2hlY2sgdGhlbSEgKi8KLSNkZWZpbmUgUE9MTFJETk9STQkweDAwNDAKLSNkZWZpbmUgUE9MTFJEQkFORAkweDAwODAKLSNkZWZpbmUgUE9MTFdSTk9STQkweDAxMDAKLSNkZWZpbmUgUE9MTFdSQkFORAkweDAyMDAKLSNkZWZpbmUgUE9MTE1TRwkJMHgwNDAwCi0jZGVmaW5lIFBPTExSRU1PVkUJMHgxMDAwCi0jZGVmaW5lIFBPTExSREhVUAkweDIwMDAKLQotc3RydWN0IHBvbGxmZCB7Ci0JaW50IGZkOwotCXNob3J0IGV2ZW50czsKLQlzaG9ydCByZXZlbnRzOwotfTsKLQotI2VuZGlmIC8qIF9fQVNNX0FWUjMyX1BPTExfSCAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWNyaXMvcG9sbC5oIGIvaW5jbHVkZS9hc20tY3Jpcy9wb2xsLmgKaW5kZXggMWIyNWQ0Yy4uYzk4NTA5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tY3Jpcy9wb2xsLmgKKysrIGIvaW5jbHVkZS9hc20tY3Jpcy9wb2xsLmgKQEAgLTEsMjYgKzEgQEAKLSNpZm5kZWYgX19BU01fQ1JJU19QT0xMX0gKLSNkZWZpbmUgX19BU01fQ1JJU19QT0xMX0gKLQotLyogdGFrZW4gZnJvbSBhc20tYWxwaGEgKi8KLQotI2RlZmluZSBQT0xMSU4JCTEKLSNkZWZpbmUgUE9MTFBSSQkJMgotI2RlZmluZSBQT0xMT1VUCQk0Ci0jZGVmaW5lIFBPTExFUlIJCTgKLSNkZWZpbmUgUE9MTEhVUAkJMTYKLSNkZWZpbmUgUE9MTE5WQUwJMzIKLSNkZWZpbmUgUE9MTFJETk9STQk2NAotI2RlZmluZSBQT0xMUkRCQU5ECTEyOAotI2RlZmluZSBQT0xMV1JOT1JNCTI1NgotI2RlZmluZSBQT0xMV1JCQU5ECTUxMgotI2RlZmluZSBQT0xMTVNHCQkxMDI0Ci0jZGVmaW5lIFBPTExSRU1PVkUJNDA5NgotI2RlZmluZSBQT0xMUkRIVVAgICAgICAgODE5MgotCi1zdHJ1Y3QgcG9sbGZkIHsKLQlpbnQgZmQ7Ci0Jc2hvcnQgZXZlbnRzOwotCXNob3J0IHJldmVudHM7Ci19OwotCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvcG9sbC5oIGIvaW5jbHVkZS9hc20tZnJ2L3BvbGwuaAppbmRleCBjOGZlODgwLi4wZDAxNDc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9wb2xsLmgKQEAgLTEsMjQgKzEsMTIgQEAKICNpZm5kZWYgX0FTTV9QT0xMX0gKICNkZWZpbmUgX0FTTV9QT0xMX0gKIAotI2RlZmluZSBQT0xMSU4JCSAgMQotI2RlZmluZSBQT0xMUFJJCQkgIDIKLSNkZWZpbmUgUE9MTE9VVAkJICA0Ci0jZGVmaW5lIFBPTExFUlIJCSAgOAotI2RlZmluZSBQT0xMSFVQCQkgMTYKLSNkZWZpbmUgUE9MTE5WQUwJIDMyCi0jZGVmaW5lIFBPTExSRE5PUk0JIDY0CiAjZGVmaW5lIFBPTExXUk5PUk0JUE9MTE9VVAotI2RlZmluZSBQT0xMUkRCQU5ECTEyOAogI2RlZmluZSBQT0xMV1JCQU5ECTI1NgotI2RlZmluZSBQT0xMTVNHCQkweDA0MDAKLSNkZWZpbmUgUE9MTFJESFVQICAgICAgIDB4MjAwMAogCi1zdHJ1Y3QgcG9sbGZkIHsKLQlpbnQgZmQ7Ci0Jc2hvcnQgZXZlbnRzOwotCXNob3J0IHJldmVudHM7Ci19OworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KKworI3VuZGVmIFBPTExSRU1PVkUKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvS2J1aWxkIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQKaW5kZXggZmExNGY4Yy4uNWJmZWVmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQKQEAgLTQsNiArNCw3IEBACiBoZWFkZXIteSArPSBpb2N0bC5oCiBoZWFkZXIteSArPSBpcGMuaAogaGVhZGVyLXkgKz0gbW1hbi5oCitoZWFkZXIteSArPSBwb2xsLmgKIGhlYWRlci15ICs9IHNpZ25hbC5oCiBoZWFkZXIteSArPSBzdGF0ZnMuaAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2F1ZGl0X3NpZ25hbC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdWRpdF9zaWduYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmVhYjdmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdWRpdF9zaWduYWwuaApAQCAtMCwwICsxLDMgQEAKK19fTlJfa2lsbCwKK19fTlJfdGdraWxsLAorX19OUl90a2lsbCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcG9sbC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wb2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiY2U4MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcG9sbC5oCkBAIC0wLDAgKzEsMzcgQEAKKyNpZm5kZWYgX19BU01fR0VORVJJQ19QT0xMX0gKKyNkZWZpbmUgX19BU01fR0VORVJJQ19QT0xMX0gKKworLyogVGhlc2UgYXJlIHNwZWNpZmllZCBieSBpQkNTMiAqLworI2RlZmluZSBQT0xMSU4JCTB4MDAwMQorI2RlZmluZSBQT0xMUFJJCQkweDAwMDIKKyNkZWZpbmUgUE9MTE9VVAkJMHgwMDA0CisjZGVmaW5lIFBPTExFUlIJCTB4MDAwOAorI2RlZmluZSBQT0xMSFVQCQkweDAwMTAKKyNkZWZpbmUgUE9MTE5WQUwJMHgwMDIwCisKKy8qIFRoZSByZXN0IHNlZW0gdG8gYmUgbW9yZS1vci1sZXNzIG5vbnN0YW5kYXJkLiBDaGVjayB0aGVtISAqLworI2RlZmluZSBQT0xMUkROT1JNCTB4MDA0MAorI2RlZmluZSBQT0xMUkRCQU5ECTB4MDA4MAorI2lmbmRlZiBQT0xMV1JOT1JNCisjZGVmaW5lIFBPTExXUk5PUk0JMHgwMTAwCisjZW5kaWYKKyNpZm5kZWYgUE9MTFdSQkFORAorI2RlZmluZSBQT0xMV1JCQU5ECTB4MDIwMAorI2VuZGlmCisjaWZuZGVmIFBPTExNU0cKKyNkZWZpbmUgUE9MTE1TRwkJMHgwNDAwCisjZW5kaWYKKyNpZm5kZWYgUE9MTFJFTU9WRQorI2RlZmluZSBQT0xMUkVNT1ZFCTB4MTAwMAorI2VuZGlmCisjaWZuZGVmIFBPTExSREhVUAorI2RlZmluZSBQT0xMUkRIVVAgICAgICAgMHgyMDAwCisjZW5kaWYKKworc3RydWN0IHBvbGxmZCB7CisJaW50IGZkOworCXNob3J0IGV2ZW50czsKKwlzaG9ydCByZXZlbnRzOworfTsKKworI2VuZGlmCS8qIF9fQVNNX0dFTkVSSUNfUE9MTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1oODMwMC9wb2xsLmggYi9pbmNsdWRlL2FzbS1oODMwMC9wb2xsLmgKaW5kZXggZmM1MjEwMy4uZjYxNTQwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLWg4MzAwL3BvbGwuaApAQCAtMSwyMyArMSwxMSBAQAogI2lmbmRlZiBfX0g4MzAwX1BPTExfSAogI2RlZmluZSBfX0g4MzAwX1BPTExfSAogCi0jZGVmaW5lIFBPTExJTgkJICAxCi0jZGVmaW5lIFBPTExQUkkJCSAgMgotI2RlZmluZSBQT0xMT1VUCQkgIDQKLSNkZWZpbmUgUE9MTEVSUgkJICA4Ci0jZGVmaW5lIFBPTExIVVAJCSAxNgotI2RlZmluZSBQT0xMTlZBTAkgMzIKLSNkZWZpbmUgUE9MTFJETk9STQkgNjQKICNkZWZpbmUgUE9MTFdSTk9STQlQT0xMT1VUCi0jZGVmaW5lIFBPTExSREJBTkQJMTI4CiAjZGVmaW5lIFBPTExXUkJBTkQJMjU2Ci0jZGVmaW5lIFBPTExNU0cJCTB4MDQwMAotI2RlZmluZSBQT0xMUkRIVVAgICAgICAgMHgyMDAwCiAKLXN0cnVjdCBwb2xsZmQgewotCWludCBmZDsKLQlzaG9ydCBldmVudHM7Ci0Jc2hvcnQgcmV2ZW50czsKLX07CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcG9sbC5oPgorCisjdW5kZWYgUE9MTFJFTU9WRQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20taDgzMDAvdW5pc3RkLmgKaW5kZXggN2RkZDQxNC4uOTlmM2MzNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvdW5pc3RkLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNkZWZpbmUgX19OUl90aW1lCQkgMTMKICNkZWZpbmUgX19OUl9ta25vZAkJIDE0CiAjZGVmaW5lIF9fTlJfY2htb2QJCSAxNQotI2RlZmluZSBfX05SX2Nob3duCQkgMTYKKyNkZWZpbmUgX19OUl9sY2hvd24JCSAxNgogI2RlZmluZSBfX05SX2JyZWFrCQkgMTcKICNkZWZpbmUgX19OUl9vbGRzdGF0CQkgMTgKICNkZWZpbmUgX19OUl9sc2VlawkJIDE5CkBAIC0xMTUsMTAgKzExNSwxMCBAQAogI2RlZmluZSBfX05SX2xzdGF0CQkxMDcKICNkZWZpbmUgX19OUl9mc3RhdAkJMTA4CiAjZGVmaW5lIF9fTlJfb2xkdW5hbWUJCTEwOQotI2RlZmluZSBfX05SX2lvcGwJCS8qIDExMCAqLyBub3Qgc3VwcG9ydGVkCisjZGVmaW5lIF9fTlJfaW9wbAkJMTEwCiAjZGVmaW5lIF9fTlJfdmhhbmd1cAkJMTExCi0jZGVmaW5lIF9fTlJfaWRsZQkJLyogMTEyICovIE9ic29sZXRlCi0jZGVmaW5lIF9fTlJfdm04NgkJLyogMTEzICovIG5vdCBzdXBwb3J0ZWQKKyNkZWZpbmUgX19OUl9pZGxlCQkxMTIKKyNkZWZpbmUgX19OUl92bTg2b2xkCQkxMTMKICNkZWZpbmUgX19OUl93YWl0NAkJMTE0CiAjZGVmaW5lIF9fTlJfc3dhcG9mZgkJMTE1CiAjZGVmaW5lIF9fTlJfc3lzaW5mbwkJMTE2CkBAIC0xMjgsNyArMTI4LDcgQEAKICNkZWZpbmUgX19OUl9jbG9uZQkJMTIwCiAjZGVmaW5lIF9fTlJfc2V0ZG9tYWlubmFtZQkxMjEKICNkZWZpbmUgX19OUl91bmFtZQkJMTIyCi0jZGVmaW5lIF9fTlJfY2FjaGVmbHVzaAkJMTIzCisjZGVmaW5lIF9fTlJfbW9kaWZ5X2xkdAkJMTIzCiAjZGVmaW5lIF9fTlJfYWRqdGltZXgJCTEyNAogI2RlZmluZSBfX05SX21wcm90ZWN0CQkxMjUKICNkZWZpbmUgX19OUl9zaWdwcm9jbWFzawkxMjYKQEAgLTE3MSw3ICsxNzEsNyBAQAogI2RlZmluZSBfX05SX21yZW1hcAkJMTYzCiAjZGVmaW5lIF9fTlJfc2V0cmVzdWlkCQkxNjQKICNkZWZpbmUgX19OUl9nZXRyZXN1aWQJCTE2NQotI2RlZmluZSBfX05SX2dldHBhZ2VzaXplCTE2NgorI2RlZmluZSBfX05SX3ZtODYJCTE2NgogI2RlZmluZSBfX05SX3F1ZXJ5X21vZHVsZQkxNjcKICNkZWZpbmUgX19OUl9wb2xsCQkxNjgKICNkZWZpbmUgX19OUl9uZnNzZXJ2Y3RsCQkxNjkKQEAgLTE4Nyw3ICsxODcsNyBAQAogI2RlZmluZSBfX05SX3J0X3NpZ3N1c3BlbmQJMTc5CiAjZGVmaW5lIF9fTlJfcHJlYWQ2NAkJMTgwCiAjZGVmaW5lIF9fTlJfcHdyaXRlNjQJCTE4MQotI2RlZmluZSBfX05SX2xjaG93bgkJMTgyCisjZGVmaW5lIF9fTlJfY2hvd24JCTE4MgogI2RlZmluZSBfX05SX2dldGN3ZAkJMTgzCiAjZGVmaW5lIF9fTlJfY2FwZ2V0CQkxODQKICNkZWZpbmUgX19OUl9jYXBzZXQJCTE4NQpAQCAtMjAzLDcgKzIwMyw3IEBACiAjZGVmaW5lIF9fTlJfc3RhdDY0CQkxOTUKICNkZWZpbmUgX19OUl9sc3RhdDY0CQkxOTYKICNkZWZpbmUgX19OUl9mc3RhdDY0CQkxOTcKLSNkZWZpbmUgX19OUl9jaG93bjMyCQkxOTgKKyNkZWZpbmUgX19OUl9sY2hvd24zMgkJMTk4CiAjZGVmaW5lIF9fTlJfZ2V0dWlkMzIJCTE5OQogI2RlZmluZSBfX05SX2dldGdpZDMyCQkyMDAKICNkZWZpbmUgX19OUl9nZXRldWlkMzIJCTIwMQpAQCAtMjE3LDE1ICsyMTcsMTggQEAKICNkZWZpbmUgX19OUl9nZXRyZXN1aWQzMgkyMDkKICNkZWZpbmUgX19OUl9zZXRyZXNnaWQzMgkyMTAKICNkZWZpbmUgX19OUl9nZXRyZXNnaWQzMgkyMTEKLSNkZWZpbmUgX19OUl9sY2hvd24zMgkJMjEyCisjZGVmaW5lIF9fTlJfY2hvd24zMgkJMjEyCiAjZGVmaW5lIF9fTlJfc2V0dWlkMzIJCTIxMwogI2RlZmluZSBfX05SX3NldGdpZDMyCQkyMTQKICNkZWZpbmUgX19OUl9zZXRmc3VpZDMyCQkyMTUKICNkZWZpbmUgX19OUl9zZXRmc2dpZDMyCQkyMTYKICNkZWZpbmUgX19OUl9waXZvdF9yb290CQkyMTcKKyNkZWZpbmUgX19OUl9taW5jb3JlCQkyMTgKKyNkZWZpbmUgX19OUl9tYWR2aXNlCQkyMTkKKyNkZWZpbmUgX19OUl9tYWR2aXNlMQkJMjE5CiAjZGVmaW5lIF9fTlJfZ2V0ZGVudHM2NAkJMjIwCiAjZGVmaW5lIF9fTlJfZmNudGw2NAkJMjIxCi0jZGVmaW5lIF9fTlJfc2VjdXJpdHkJCTIyMworLyogMjIzIGlzIHVudXNlZCAqLwogI2RlZmluZSBfX05SX2dldHRpZAkJMjI0CiAjZGVmaW5lIF9fTlJfcmVhZGFoZWFkCQkyMjUKICNkZWZpbmUgX19OUl9zZXR4YXR0cgkJMjI2CkBAIC0yNTIsMTMgKzI1NSwxMyBAQAogI2RlZmluZSBfX05SX2lvX2dldGV2ZW50cwkyNDcKICNkZWZpbmUgX19OUl9pb19zdWJtaXQJCTI0OAogI2RlZmluZSBfX05SX2lvX2NhbmNlbAkJMjQ5Ci0jZGVmaW5lIF9fTlJfYWxsb2NfaHVnZXBhZ2VzCTI1MAotI2RlZmluZSBfX05SX2ZyZWVfaHVnZXBhZ2VzCTI1MQorI2RlZmluZSBfX05SX2ZhZHZpc2U2NAkJMjUwCisvKiAyNTEgaXMgYXZhaWxhYmxlIGZvciByZXVzZSAod2FzIGJyaWVmbHkgc3lzX3NldF96b25lX3JlY2xhaW0pICovCiAjZGVmaW5lIF9fTlJfZXhpdF9ncm91cAkJMjUyCiAjZGVmaW5lIF9fTlJfbG9va3VwX2Rjb29raWUJMjUzCi0jZGVmaW5lIF9fTlJfc3lzX2Vwb2xsX2NyZWF0ZQkyNTQKLSNkZWZpbmUgX19OUl9zeXNfZXBvbGxfY3RsCTI1NQotI2RlZmluZSBfX05SX3N5c19lcG9sbF93YWl0CTI1NgorI2RlZmluZSBfX05SX2Vwb2xsX2NyZWF0ZQkyNTQKKyNkZWZpbmUgX19OUl9lcG9sbF9jdGwJCTI1NQorI2RlZmluZSBfX05SX2Vwb2xsX3dhaXQJCTI1NgogI2RlZmluZSBfX05SX3JlbWFwX2ZpbGVfcGFnZXMJMjU3CiAjZGVmaW5lIF9fTlJfc2V0X3RpZF9hZGRyZXNzCTI1OAogI2RlZmluZSBfX05SX3RpbWVyX2NyZWF0ZQkyNTkKQEAgLTI5MSwxMCArMjk0LDQxIEBACiAjZGVmaW5lIF9fTlJfYWRkX2tleQkJMjg2CiAjZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJMjg3CiAjZGVmaW5lIF9fTlJfa2V5Y3RsCQkyODgKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyODkKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyOTAKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQJMjkxCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gJMjkyCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaAkyOTMKKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCTI5NAorI2RlZmluZSBfX05SX29wZW5hdAkJMjk1CisjZGVmaW5lIF9fTlJfbWtkaXJhdAkJMjk2CisjZGVmaW5lIF9fTlJfbWtub2RhdAkJMjk3CisjZGVmaW5lIF9fTlJfZmNob3duYXQJCTI5OAorI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJMjk5CisjZGVmaW5lIF9fTlJfZnN0YXRhdDY0CQkzMDAKKyNkZWZpbmUgX19OUl91bmxpbmthdAkJMzAxCisjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCTMwMgorI2RlZmluZSBfX05SX2xpbmthdAkJMzAzCisjZGVmaW5lIF9fTlJfc3ltbGlua2F0CQkzMDQKKyNkZWZpbmUgX19OUl9yZWFkbGlua2F0CQkzMDUKKyNkZWZpbmUgX19OUl9mY2htb2RhdAkJMzA2CisjZGVmaW5lIF9fTlJfZmFjY2Vzc2F0CQkzMDcKKyNkZWZpbmUgX19OUl9wc2VsZWN0NgkJMzA4CisjZGVmaW5lIF9fTlJfcHBvbGwJCTMwOQorI2RlZmluZSBfX05SX3Vuc2hhcmUJCTMxMAorI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkzMTEKKyNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJMzEyCisjZGVmaW5lIF9fTlJfc3BsaWNlCQkzMTMKKyNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UJMzE0CisjZGVmaW5lIF9fTlJfdGVlCQkzMTUKKyNkZWZpbmUgX19OUl92bXNwbGljZQkJMzE2CisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMzE3CisjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkzMTgKKyNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkzMTkKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBOUl9zeXNjYWxscyAyODkKKyNkZWZpbmUgTlJfc3lzY2FsbHMgMzIwCiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYWx0ZXJuYXRpdmUuaCBiL2luY2x1ZGUvYXNtLWkzODYvYWx0ZXJuYXRpdmUuaAppbmRleCAwZjcwYjM3Li5lYjdkYTU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FsdGVybmF0aXZlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hbHRlcm5hdGl2ZS5oCkBAIC05OCw2ICs5OCwxMiBAQAogCQkgICAgICAiLnByZXZpb3VzIiA6IG91dHB1dCA6IFtmZWF0XSAiaSIgKGZlYXR1cmUpLCAjI2lucHV0KQogCiAvKgorICogdXNlIHRoaXMgbWFjcm8ocykgaWYgeW91IG5lZWQgbW9yZSB0aGFuIG9uZSBvdXRwdXQgcGFyYW1ldGVyCisgKiBpbiBhbHRlcm5hdGl2ZV9pbworICovCisjZGVmaW5lIEFTTV9PVVRQVVQyKGEsIGIpIGEsIGIKKworLyoKICAqIEFsdGVybmF0aXZlIGlubGluZSBhc3NlbWJseSBmb3IgU01QLgogICoKICAqIFRoZSBMT0NLX1BSRUZJWCBtYWNybyBkZWZpbmVkIGhlcmUgcmVwbGFjZXMgdGhlIExPQ0sgYW5kCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWkzODYvcGdhbGxvYy5oCmluZGV4IDQ3NDMwMTcuLmQwN2I3YWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcGdhbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcGdhbGxvYy5oCkBAIC02NSw2ICs2NSw0IEBACiAjZGVmaW5lIHB1ZF9wb3B1bGF0ZShtbSwgcG1kLCBwdGUpCUJVRygpCiAjZW5kaWYKIAotI2RlZmluZSBjaGVja19wZ3RfY2FjaGUoKQlkbyB7IH0gd2hpbGUgKDApCi0KICNlbmRpZiAvKiBfSTM4Nl9QR0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKaW5kZXggZWRjZTlkNS4uMjM5NDU4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKQEAgLTM1LDE3ICszNSwxNiBAQAogI2RlZmluZSBaRVJPX1BBR0UodmFkZHIpICh2aXJ0X3RvX3BhZ2UoZW1wdHlfemVyb19wYWdlKSkKIGV4dGVybiB1bnNpZ25lZCBsb25nIGVtcHR5X3plcm9fcGFnZVsxMDI0XTsKIGV4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpclsxMDI0XTsKLWV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqcGdkX2NhY2hlOwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpwbWRfY2FjaGU7CiBleHRlcm4gc3BpbmxvY2tfdCBwZ2RfbG9jazsKIGV4dGVybiBzdHJ1Y3QgcGFnZSAqcGdkX2xpc3Q7Cit2b2lkIGNoZWNrX3BndF9jYWNoZSh2b2lkKTsKIAogdm9pZCBwbWRfY3Rvcih2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpOwotdm9pZCBwZ2RfY3Rvcih2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpOwotdm9pZCBwZ2RfZHRvcih2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpOwogdm9pZCBwZ3RhYmxlX2NhY2hlX2luaXQodm9pZCk7CiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOwogCisKIC8qCiAgKiBUaGUgTGludXggeDg2IHBhZ2luZyBhcmNoaXRlY3R1cmUgaXMgJ2NvbXBpbGUtdGltZSBkdWFsLW1vZGUnLCBpdAogICogaW1wbGVtZW50cyBib3RoIHRoZSB0cmFkaXRpb25hbCAyLWxldmVsIHg4NiBwYWdlIHRhYmxlcyBhbmQgdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3BvbGwuaCBiL2luY2x1ZGUvYXNtLWkzODYvcG9sbC5oCmluZGV4IDJjZDQ5MjkuLmM5ODUwOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcG9sbC5oCkBAIC0xLDI3ICsxIEBACi0jaWZuZGVmIF9faTM4Nl9QT0xMX0gKLSNkZWZpbmUgX19pMzg2X1BPTExfSAotCi0vKiBUaGVzZSBhcmUgc3BlY2lmaWVkIGJ5IGlCQ1MyICovCi0jZGVmaW5lIFBPTExJTgkJMHgwMDAxCi0jZGVmaW5lIFBPTExQUkkJCTB4MDAwMgotI2RlZmluZSBQT0xMT1VUCQkweDAwMDQKLSNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4Ci0jZGVmaW5lIFBPTExIVVAJCTB4MDAxMAotI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKLQotLyogVGhlIHJlc3Qgc2VlbSB0byBiZSBtb3JlLW9yLWxlc3Mgbm9uc3RhbmRhcmQuIENoZWNrIHRoZW0hICovCi0jZGVmaW5lIFBPTExSRE5PUk0JMHgwMDQwCi0jZGVmaW5lIFBPTExSREJBTkQJMHgwMDgwCi0jZGVmaW5lIFBPTExXUk5PUk0JMHgwMTAwCi0jZGVmaW5lIFBPTExXUkJBTkQJMHgwMjAwCi0jZGVmaW5lIFBPTExNU0cJCTB4MDQwMAotI2RlZmluZSBQT0xMUkVNT1ZFCTB4MTAwMAotI2RlZmluZSBQT0xMUkRIVVAgICAgICAgMHgyMDAwCi0KLXN0cnVjdCBwb2xsZmQgewotCWludCBmZDsKLQlzaG9ydCBldmVudHM7Ci0Jc2hvcnQgcmV2ZW50czsKLX07Ci0KLSNlbmRpZgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdHNjLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RzYy5oCmluZGV4IDNmM2MxZmEuLjYyYzA5MWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdHNjLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90c2MuaApAQCAtMzUsMTQgKzM1LDE2IEBACiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXNfc3luYyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyByZXQ7Ci0JdW5zaWduZWQgZWF4OworCXVuc2lnbmVkIGVheCwgZWR4OwogCiAJLyoKICAgCSAqIFVzZSBSRFRTQ1AgaWYgcG9zc2libGU7IGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUgc3luY2hyb25vdXMKICAJICogYW5kIGRvZXNuJ3QgY2F1c2UgYSBWTUVYSVQgb24gSHlwZXJ2aXNvcnMKIAkgKi8KIAlhbHRlcm5hdGl2ZV9pbyhBU01fTk9QMywgIi5ieXRlIDB4MGYsMHgwMSwweGY5IiwgWDg2X0ZFQVRVUkVfUkRUU0NQLAotCQkJIAkgIj1BIiAocmV0KSwgIjAiICgwVUxMKSA6ICJlY3giLCAibWVtb3J5Iik7CisJCSAgICAgICBBU01fT1VUUFVUMigiPWEiIChlYXgpLCAiPWQiIChlZHgpKSwKKwkJICAgICAgICJhIiAoMFUpLCAiZCIgKDBVKSA6ICJlY3giLCAibWVtb3J5Iik7CisJcmV0ID0gKCgodW5zaWduZWQgbG9uZyBsb25nKWVkeCkgPDwgMzIpIHwgKCh1bnNpZ25lZCBsb25nIGxvbmcpZWF4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20taTM4Ni91bmlzdGQuaAppbmRleCBiZDIxZTc5Li5lODRhY2UxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmgKQEAgLTMyNiwxMCArMzI2LDEzIEBACiAjZGVmaW5lIF9fTlJfZ2V0Y3B1CQkzMTgKICNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkzMTkKICNkZWZpbmUgX19OUl91dGltZW5zYXQJCTMyMAorI2RlZmluZSBfX05SX3NpZ25hbGZkCQkzMjEKKyNkZWZpbmUgX19OUl90aW1lcmZkCQkzMjIKKyNkZWZpbmUgX19OUl9ldmVudGZkCQkzMjMKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBOUl9zeXNjYWxscyAzMjEKKyNkZWZpbmUgTlJfc3lzY2FsbHMgMzI0CiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvaXJxLmggYi9pbmNsdWRlL2FzbS1pYTY0L2lycS5oCmluZGV4IDc5NDc5ZTIuLjY3MjIxNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9pcnEuaApAQCAtMTEsNiArMTEsOSBAQAogICogMDIvMjkvMDAgICAgIEQuTW9zYmVyZ2VyCW1vdmVkIG1vc3QgdGhpbmdzIGludG8gaHdfaXJxLmgKICAqLwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisKICNkZWZpbmUgTlJfSVJRUwkJMjU2CiAjZGVmaW5lIE5SX0lSUV9WRUNUT1JTCU5SX0lSUVMKIApAQCAtMjksNSArMzIsOCBAQAogZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnFfbm9zeW5jICh1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHZvaWQgZW5hYmxlX2lycSAodW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIHNldF9pcnFfYWZmaW5pdHlfaW5mbyAodW5zaWduZWQgaW50IGlycSwgaW50IGRlc3QsIGludCByZWRpcik7Citib29sIGlzX2FmZmluaXR5X21hc2tfdmFsaWQoY3B1bWFza190IGNwdW1hc2spOworCisjZGVmaW5lIGlzX2FmZmluaXR5X21hc2tfdmFsaWQgaXNfYWZmaW5pdHlfbWFza192YWxpZAogCiAjZW5kaWYgLyogX0FTTV9JQTY0X0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2twcm9iZXMuaCBiL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCmluZGV4IDgyOGFlMDAuLjJhYmM5OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCkBAIC03MSwxMyArNzEsMTUgQEAKIAogI2RlZmluZQlNQVhfUEFSQU1fUlNFX1NJWkUJKDB4NjArMHg2MC8weDNmKQogLyogcGVyLWNwdSBrcHJvYmUgY29udHJvbCBibG9jayAqLworI2RlZmluZSBBUkNIX1BSRVZfS1BST0JFX1NaIDIKIHN0cnVjdCBrcHJvYmVfY3RsYmxrIHsKIAl1bnNpZ25lZCBsb25nIGtwcm9iZV9zdGF0dXM7CiAJc3RydWN0IHB0X3JlZ3MganByb2JlX3NhdmVkX3JlZ3M7CiAJdW5zaWduZWQgbG9uZyBqcHJvYmVzX3NhdmVkX3N0YWNrZWRfcmVnc1tNQVhfUEFSQU1fUlNFX1NJWkVdOwogCXVuc2lnbmVkIGxvbmcgKmJzcDsKIAl1bnNpZ25lZCBsb25nIGNmbTsKLQlzdHJ1Y3QgcHJldl9rcHJvYmUgcHJldl9rcHJvYmU7CisJYXRvbWljX3QgcHJldl9rcHJvYmVfaW5kZXg7CisJc3RydWN0IHByZXZfa3Byb2JlIHByZXZfa3Byb2JlW0FSQ0hfUFJFVl9LUFJPQkVfU1pdOwogfTsKIAogI2RlZmluZSBKUFJPQkVfRU5UUlkocGVudHJ5KQkoa3Byb2JlX29wY29kZV90ICopcGVudHJ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcGdhbGxvYy5oCmluZGV4IDU2MGMyODcuLjY3NTUyY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcGdhbGxvYy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcGdhbGxvYy5oCkBAIC0xOCw3MSArMTgsMTggQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2UtZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CisjaW5jbHVkZSA8bGludXgvcXVpY2tsaXN0Lmg+CiAKICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KIAotREVDTEFSRV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcgKiwgX19wZ3RhYmxlX3F1aWNrbGlzdCk7Ci0jZGVmaW5lIHBndGFibGVfcXVpY2tsaXN0IF9faWE2NF9wZXJfY3B1X3ZhcihfX3BndGFibGVfcXVpY2tsaXN0KQotREVDTEFSRV9QRVJfQ1BVKGxvbmcsIF9fcGd0YWJsZV9xdWlja2xpc3Rfc2l6ZSk7Ci0jZGVmaW5lIHBndGFibGVfcXVpY2tsaXN0X3NpemUgX19pYTY0X3Blcl9jcHVfdmFyKF9fcGd0YWJsZV9xdWlja2xpc3Rfc2l6ZSkKLQotc3RhdGljIGlubGluZSBsb25nIHBndGFibGVfcXVpY2tsaXN0X3RvdGFsX3NpemUodm9pZCkKLXsKLQlsb25nIHFsX3NpemUgPSAwOwotCWludCBjcHVpZDsKLQotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1aWQpIHsKLQkJcWxfc2l6ZSArPSBwZXJfY3B1KF9fcGd0YWJsZV9xdWlja2xpc3Rfc2l6ZSwgY3B1aWQpOwotCX0KLQlyZXR1cm4gcWxfc2l6ZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpwZ3RhYmxlX3F1aWNrbGlzdF9hbGxvYyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgKnJldCA9IE5VTEw7Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQotCXJldCA9IHBndGFibGVfcXVpY2tsaXN0OwotCWlmIChsaWtlbHkocmV0ICE9IE5VTEwpKSB7Ci0JCXBndGFibGVfcXVpY2tsaXN0ID0gKHVuc2lnbmVkIGxvbmcgKikoKnJldCk7Ci0JCXJldFswXSA9IDA7Ci0JCS0tcGd0YWJsZV9xdWlja2xpc3Rfc2l6ZTsKLQkJcHJlZW1wdF9lbmFibGUoKTsKLQl9IGVsc2UgewotCQlwcmVlbXB0X2VuYWJsZSgpOwotCQlyZXQgPSAodW5zaWduZWQgbG9uZyAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHBndGFibGVfcXVpY2tsaXN0X2ZyZWUodm9pZCAqcGd0YWJsZV9lbnRyeSkKLXsKLSNpZmRlZiBDT05GSUdfTlVNQQotCWludCBuaWQgPSBwYWdlX3RvX25pZCh2aXJ0X3RvX3BhZ2UocGd0YWJsZV9lbnRyeSkpOwotCi0JaWYgKHVubGlrZWx5KG5pZCAhPSBudW1hX25vZGVfaWQoKSkpIHsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBndGFibGVfZW50cnkpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQkqKHVuc2lnbmVkIGxvbmcgKilwZ3RhYmxlX2VudHJ5ID0gKHVuc2lnbmVkIGxvbmcpcGd0YWJsZV9xdWlja2xpc3Q7Ci0JcGd0YWJsZV9xdWlja2xpc3QgPSAodW5zaWduZWQgbG9uZyAqKXBndGFibGVfZW50cnk7Ci0JKytwZ3RhYmxlX3F1aWNrbGlzdF9zaXplOwotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlyZXR1cm4gcGd0YWJsZV9xdWlja2xpc3RfYWxsb2MoKTsKKwlyZXR1cm4gcXVpY2tsaXN0X2FsbG9jKDAsIEdGUF9LRVJORUwsIE5VTEwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGdkX2ZyZWUocGdkX3QgKiBwZ2QpCiB7Ci0JcGd0YWJsZV9xdWlja2xpc3RfZnJlZShwZ2QpOworCXF1aWNrbGlzdF9mcmVlKDAsIE5VTEwsIHBnZCk7CiB9CiAKICNpZmRlZiBDT05GSUdfUEdUQUJMRV80CkBAIC05NCwxMiArNDEsMTIgQEAKIAogc3RhdGljIGlubGluZSBwdWRfdCAqcHVkX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewotCXJldHVybiBwZ3RhYmxlX3F1aWNrbGlzdF9hbGxvYygpOworCXJldHVybiBxdWlja2xpc3RfYWxsb2MoMCwgR0ZQX0tFUk5FTCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdWRfZnJlZShwdWRfdCAqIHB1ZCkKIHsKLQlwZ3RhYmxlX3F1aWNrbGlzdF9mcmVlKHB1ZCk7CisJcXVpY2tsaXN0X2ZyZWUoMCwgTlVMTCwgcHVkKTsKIH0KICNkZWZpbmUgX19wdWRfZnJlZV90bGIodGxiLCBwdWQpCXB1ZF9mcmVlKHB1ZCkKICNlbmRpZiAvKiBDT05GSUdfUEdUQUJMRV80ICovCkBAIC0xMTIsMTIgKzU5LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgcG1kX3QgKnBtZF9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlyZXR1cm4gcGd0YWJsZV9xdWlja2xpc3RfYWxsb2MoKTsKKwlyZXR1cm4gcXVpY2tsaXN0X2FsbG9jKDAsIEdGUF9LRVJORUwsIE5VTEwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcG1kX2ZyZWUocG1kX3QgKiBwbWQpCiB7Ci0JcGd0YWJsZV9xdWlja2xpc3RfZnJlZShwbWQpOworCXF1aWNrbGlzdF9mcmVlKDAsIE5VTEwsIHBtZCk7CiB9CiAKICNkZWZpbmUgX19wbWRfZnJlZV90bGIodGxiLCBwbWQpCXBtZF9mcmVlKHBtZCkKQEAgLTEzNywyOCArODQsMzEgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCSB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0Jdm9pZCAqcGcgPSBwZ3RhYmxlX3F1aWNrbGlzdF9hbGxvYygpOworCXZvaWQgKnBnID0gcXVpY2tsaXN0X2FsbG9jKDAsIEdGUF9LRVJORUwsIE5VTEwpOwogCXJldHVybiBwZyA/IHZpcnRfdG9fcGFnZShwZykgOiBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHB0ZV90ICpwdGVfYWxsb2Nfb25lX2tlcm5lbChzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkJICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JcmV0dXJuIHBndGFibGVfcXVpY2tsaXN0X2FsbG9jKCk7CisJcmV0dXJuIHF1aWNrbGlzdF9hbGxvYygwLCBHRlBfS0VSTkVMLCBOVUxMKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHB0ZV9mcmVlKHN0cnVjdCBwYWdlICpwdGUpCiB7Ci0JcGd0YWJsZV9xdWlja2xpc3RfZnJlZShwYWdlX2FkZHJlc3MocHRlKSk7CisJcXVpY2tsaXN0X2ZyZWVfcGFnZSgwLCBOVUxMLCBwdGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHB0ZV90ICogcHRlKQogewotCXBndGFibGVfcXVpY2tsaXN0X2ZyZWUocHRlKTsKKwlxdWlja2xpc3RfZnJlZSgwLCBOVUxMLCBwdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfcGd0X2NhY2hlKHZvaWQpCit7CisJcXVpY2tsaXN0X3RyaW0oMCwgTlVMTCwgMjUsIDE2KTsKIH0KIAogI2RlZmluZSBfX3B0ZV9mcmVlX3RsYih0bGIsIHB0ZSkJcHRlX2ZyZWUocHRlKQogCi1leHRlcm4gdm9pZCBjaGVja19wZ3RfY2FjaGUodm9pZCk7Ci0KICNlbmRpZgkJCQkvKiBfQVNNX0lBNjRfUEdBTExPQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3BvbGwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcG9sbC5oCmluZGV4IGJjYWY5ZjEuLmM5ODUwOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcG9sbC5oCkBAIC0xLDMyICsxIEBACi0jaWZuZGVmIF9BU01fSUE2NF9QT0xMX0gKLSNkZWZpbmUgX0FTTV9JQTY0X1BPTExfSAotCi0vKgotICogcG9sbCgyKSBiaXQgZGVmaW5pdGlvbnMuICBCYXNlZCBvbiA8YXNtLWkzODYvcG9sbC5oPi4KLSAqCi0gKiBNb2RpZmllZCAxOTk4LCAxOTk5LCAyMDAyCi0gKglEYXZpZCBNb3NiZXJnZXItVGFuZyA8ZGF2aWRtQGhwbC5ocC5jb20+LCBIZXdsZXR0LVBhY2thcmQgQ28KLSAqLwotCi0jZGVmaW5lIFBPTExJTgkJMHgwMDAxCi0jZGVmaW5lIFBPTExQUkkJCTB4MDAwMgotI2RlZmluZSBQT0xMT1VUCQkweDAwMDQKLSNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4Ci0jZGVmaW5lIFBPTExIVVAJCTB4MDAxMAotI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKLQotI2RlZmluZSBQT0xMUkROT1JNCTB4MDA0MAotI2RlZmluZSBQT0xMUkRCQU5ECTB4MDA4MAotI2RlZmluZSBQT0xMV1JOT1JNCTB4MDEwMAotI2RlZmluZSBQT0xMV1JCQU5ECTB4MDIwMAotI2RlZmluZSBQT0xMTVNHCQkweDA0MDAKLSNkZWZpbmUgUE9MTFJFTU9WRQkweDEwMDAKLSNkZWZpbmUgUE9MTFJESFVQICAgICAgIDB4MjAwMAotCi1zdHJ1Y3QgcG9sbGZkIHsKLQlpbnQgZmQ7Ci0Jc2hvcnQgZXZlbnRzOwotCXNob3J0IHJldmVudHM7Ci19OwotCi0jZW5kaWYgLyogX0FTTV9JQTY0X1BPTExfSCAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1pYTY0L3VuaXN0ZC5oCmluZGV4IDg2MWM4ZWMuLmYwNDliYzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC91bmlzdGQuaApAQCAtMjk0LDExICsyOTQsMTMgQEAKICNkZWZpbmUgX19OUl92bXNwbGljZQkJCTEzMDIKIC8qIDEzMDMgcmVzZXJ2ZWQgZm9yIG1vdmVfcGFnZXMgKi8KICNkZWZpbmUgX19OUl9nZXRjcHUJCQkxMzA0CisjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJCTEzMDUKKyNkZWZpbmUgX19OUl91dGltZW5zYXQJCQkxMzA2CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKIAotI2RlZmluZSBOUl9zeXNjYWxscwkJCTI4MSAvKiBsZW5ndGggb2Ygc3lzY2FsbCB0YWJsZSAqLworI2RlZmluZSBOUl9zeXNjYWxscwkJCTI4MyAvKiBsZW5ndGggb2Ygc3lzY2FsbCB0YWJsZSAqLwogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdBQ1RJT04KICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR1NVU1BFTkQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS0ybGV2ZWwuaCBiL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS0ybGV2ZWwuaAppbmRleCA3NTA5MjU3Li5iY2EzNDc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tMzJyL3BndGFibGUtMmxldmVsLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9wZ3RhYmxlLTJsZXZlbC5oCkBAIC03MSw4ICs3MSw4IEBACiAjZGVmaW5lIHBmbl9wbWQocGZuLCBwcm90KQlfX3BtZCgoKHBmbikgPDwgUEFHRV9TSElGVCkgfCBwZ3Byb3RfdmFsKHByb3QpKQogCiAjZGVmaW5lIFBURV9GSUxFX01BWF9CSVRTCTI5Ci0jZGVmaW5lIHB0ZV90b19wZ29mZihwdGUpCSgoKHB0ZV92YWwocHRlKSA+PiAyKSAmIDB4ZWYpIHwgKCgocHRlX3ZhbChwdGUpID4+IDEwKSkgPDwgNykpCi0jZGVmaW5lIHBnb2ZmX3RvX3B0ZShvZmYpCSgocHRlX3QpIHsgKCgob2ZmKSAmIDB4ZWYpIDw8IDIpIHwgKCgob2ZmKSA+PiA3KSA8PCAxMCkgfCBfUEFHRV9GSUxFIH0pCisjZGVmaW5lIHB0ZV90b19wZ29mZihwdGUpCSgoKHB0ZV92YWwocHRlKSA+PiAyKSAmIDB4N2YpIHwgKCgocHRlX3ZhbChwdGUpID4+IDEwKSkgPDwgNykpCisjZGVmaW5lIHBnb2ZmX3RvX3B0ZShvZmYpCSgocHRlX3QpIHsgKCgob2ZmKSAmIDB4N2YpIDw8IDIpIHwgKCgob2ZmKSA+PiA3KSA8PCAxMCkgfCBfUEFHRV9GSUxFIH0pCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9NMzJSX1BHVEFCTEVfMkxFVkVMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tbTMyci9wZ3RhYmxlLmgKaW5kZXggOGIyYTJmMS4uNjYwNDMwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9wZ3RhYmxlLmgKQEAgLTM2Niw3ICszNjYsNyBAQAogI2RlZmluZSBwdGVfdW5tYXBfbmVzdGVkKHB0ZSkJZG8geyB9IHdoaWxlICgwKQogCiAvKiBFbmNvZGUgYW5kIGRlLWNvZGUgYSBzd2FwIGVudHJ5ICovCi0jZGVmaW5lIF9fc3dwX3R5cGUoeCkJCQkoKCh4KS52YWwgPj4gMikgJiAweDNmKQorI2RlZmluZSBfX3N3cF90eXBlKHgpCQkJKCgoeCkudmFsID4+IDIpICYgMHgxZikKICNkZWZpbmUgX19zd3Bfb2Zmc2V0KHgpCQkJKCh4KS52YWwgPj4gMTApCiAjZGVmaW5lIF9fc3dwX2VudHJ5KHR5cGUsIG9mZnNldCkJXAogCSgoc3dwX2VudHJ5X3QpIHsgKCh0eXBlKSA8PCAyKSB8ICgob2Zmc2V0KSA8PCAxMCkgfSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvcG9sbC5oIGIvaW5jbHVkZS9hc20tbTMyci9wb2xsLmgKaW5kZXggOWUwZTcwMC4uYzk4NTA5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9wb2xsLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9wb2xsLmgKQEAgLTEsMzIgKzEgQEAKLSNpZm5kZWYgX0FTTV9NMzJSX1BPTExfSAotI2RlZmluZSBfQVNNX00zMlJfUE9MTF9ICi0KLS8qCi0gKiBwb2xsKDIpIGJpdCBkZWZpbml0aW9ucy4gIEJhc2VkIG9uIDxhc20taTM4Ni9wb2xsLmg+LgotICoKLSAqIE1vZGlmaWVkIDIwMDQKLSAqICAgICAgSGlyb2thenUgVGFrYXRhIDx0YWthdGEgYXQgbGludXgtbTMyci5vcmc+Ci0gKi8KLQotI2RlZmluZSBQT0xMSU4JCTB4MDAwMQotI2RlZmluZSBQT0xMUFJJCQkweDAwMDIKLSNkZWZpbmUgUE9MTE9VVAkJMHgwMDA0Ci0jZGVmaW5lIFBPTExFUlIJCTB4MDAwOAotI2RlZmluZSBQT0xMSFVQCQkweDAwMTAKLSNkZWZpbmUgUE9MTE5WQUwJMHgwMDIwCi0KLSNkZWZpbmUgUE9MTFJETk9STQkweDAwNDAKLSNkZWZpbmUgUE9MTFJEQkFORAkweDAwODAKLSNkZWZpbmUgUE9MTFdSTk9STQkweDAxMDAKLSNkZWZpbmUgUE9MTFdSQkFORAkweDAyMDAKLSNkZWZpbmUgUE9MTE1TRwkJMHgwNDAwCi0jZGVmaW5lIFBPTExSRU1PVkUJMHgxMDAwCi0jZGVmaW5lIFBPTExSREhVUCAgICAgICAweDIwMDAKLQotc3RydWN0IHBvbGxmZCB7Ci0JaW50IGZkOwotCXNob3J0IGV2ZW50czsKLQlzaG9ydCByZXZlbnRzOwotfTsKLQotI2VuZGlmICAvKiBfQVNNX00zMlJfUE9MTF9IICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcG9sbC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLW0zMnIvc3lzdGVtLmgKaW5kZXggZjYyZjVjOS4uYjI5MWIyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTMyci9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3N5c3RlbS5oCkBAIC0yMSwxMiArMjEsMjIgQEAKICAqIGBuZXh0JyBhbmQgYHByZXYnIHNob3VsZCBiZSBzdHJ1Y3QgdGFza19zdHJ1Y3QsIGJ1dCBpdCBpc24ndCBhbHdheXMgZGVmaW5lZAogICovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19GUkFNRV9QT0lOVEVSKSB8fCBcCisJIWRlZmluZWQoQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUikKKyNkZWZpbmUgTTMyUl9QVVNIX0ZQICIJcHVzaCBmcFxuIgorI2RlZmluZSBNMzJSX1BPUF9GUCAgIglwb3AgIGZwXG4iCisjZWxzZQorI2RlZmluZSBNMzJSX1BVU0hfRlAgIiIKKyNkZWZpbmUgTTMyUl9QT1BfRlAgICIiCisjZW5kaWYKKwogI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkgIGRvIHsgXAogCV9fYXNtX18gX192b2xhdGlsZV9fICggXAogCQkiCXNldGgJbHIsICNoaWdoKDFmKQkJCQlcbiIgXAogCQkiCW9yMwlsciwgbHIsICNsb3coMWYpCQkJXG4iIFwKIAkJIglzdAlsciwgQCU0ICA7IHN0b3JlIG9sZCBMUgkJCVxuIiBcCiAJCSIJbGQJbHIsIEAlNSAgOyBsb2FkIG5ldyBMUgkJCVxuIiBcCisJCQlNMzJSX1BVU0hfRlAgXAogCQkiCXN0CXNwLCBAJTIgIDsgc3RvcmUgb2xkIFNQCQkJXG4iIFwKIAkJIglsZAlzcCwgQCUzICA7IGxvYWQgbmV3IFNQCQkJXG4iIFwKIAkJIglwdXNoCSUxICA7IHN0b3JlIGBwcmV2JyBvbiBuZXcgc3RhY2sJCVxuIiBcCkBAIC0zNCw2ICs0NCw3IEBACiAJCSIJLmZpbGxpbnNuCQkJCQlcbiIgXAogCQkiMToJCQkJCQkJXG4iIFwKIAkJIglwb3AJJTAgIDsgcmVzdG9yZSBgX19sYXN0JyBmcm9tIG5ldyBzdGFjawlcbiIgXAorCQkJTTMyUl9QT1BfRlAgXAogCQk6ICI9ciIgKGxhc3QpIFwKIAkJOiAiMCIgKHByZXYpLCBcCiAJCSAgInIiICgmKHByZXYtPnRocmVhZC5zcCkpLCAiciIgKCYobmV4dC0+dGhyZWFkLnNwKSksIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlody5oIGIvaW5jbHVkZS9hc20tbTY4ay9hdGFyaWh3LmgKaW5kZXggNjIxMTM2My4uZWNmMDA3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaWh3LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9hdGFyaWh3LmgKQEAgLTIsNyArMiw3IEBACiAqKiBsaW51eC9hdGFyaWh3LmggLS0gVGhpcyBoZWFkZXIgZGVmaW5lcyBzb21lIG1hY3JvcyBhbmQgcG9pbnRlcnMgZm9yCiAqKiAgICAgICAgICAgICAgICAgICAgdGhlIHZhcmlvdXMgQXRhcmkgY3VzdG9tIGhhcmR3YXJlIHJlZ2lzdGVycy4KICoqCi0qKiBDb3B5cmlnaHQgMTk5NCBieSBCasKUcm4gQnJhdWVsCisqKiBDb3B5cmlnaHQgMTk5NCBieSBCasO2cm4gQnJhdWVsCiAqKgogKiogNS8xLzk0IFJvbWFuIEhvZGVrOgogKiogICBBZGRlZCBkZWZpbml0aW9ucyBmb3IgVFQgc3BlY2lmaWMgY2hpcHMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaW50cy5oIGIvaW5jbHVkZS9hc20tbTY4ay9hdGFyaWludHMuaAppbmRleCBjZTZjNDQ1Li41NzQ4ZTk5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaW50cy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlpbnRzLmgKQEAgLTEsNyArMSw3IEBACiAvKgogKiogYXRhcmlpbnRzLmggLS0gQXRhcmkgTGludXggaW50ZXJydXB0IGhhbmRsaW5nIHN0cnVjdHMgYW5kIHByb3RvdHlwZXMKICoqCi0qKiBDb3B5cmlnaHQgMTk5NCBieSBCasKUcm4gQnJhdWVsCisqKiBDb3B5cmlnaHQgMTk5NCBieSBCasO2cm4gQnJhdWVsCiAqKgogKiogNS8yLzk0IFJvbWFuIEhvZGVrOgogKiogICBUVCBpbnRlcnJ1cHQgZGVmaW5pdGlvbnMgYWRkZWQuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3BvbGwuaCBiL2luY2x1ZGUvYXNtLW02OGsvcG9sbC5oCmluZGV4IDBmYjg4NDMuLmYwODBmY2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvcG9sbC5oCkBAIC0xLDI0ICsxLDkgQEAKICNpZm5kZWYgX19tNjhrX1BPTExfSAogI2RlZmluZSBfX202OGtfUE9MTF9ICiAKLSNkZWZpbmUgUE9MTElOCQkgIDEKLSNkZWZpbmUgUE9MTFBSSQkJICAyCi0jZGVmaW5lIFBPTExPVVQJCSAgNAotI2RlZmluZSBQT0xMRVJSCQkgIDgKLSNkZWZpbmUgUE9MTEhVUAkJIDE2Ci0jZGVmaW5lIFBPTExOVkFMCSAzMgotI2RlZmluZSBQT0xMUkROT1JNCSA2NAogI2RlZmluZSBQT0xMV1JOT1JNCVBPTExPVVQKLSNkZWZpbmUgUE9MTFJEQkFORAkxMjgKICNkZWZpbmUgUE9MTFdSQkFORAkyNTYKLSNkZWZpbmUgUE9MTE1TRwkJMHgwNDAwCi0jZGVmaW5lIFBPTExSRU1PVkUJMHgxMDAwCi0jZGVmaW5lIFBPTExSREhVUCAgICAgICAweDIwMDAKIAotc3RydWN0IHBvbGxmZCB7Ci0JaW50IGZkOwotCXNob3J0IGV2ZW50czsKLQlzaG9ydCByZXZlbnRzOwotfTsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9hdG9taWMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvYXRvbWljLmgKaW5kZXggNjJkYWE3NC4uMWI2MDYyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2F0b21pYy5oCkBAIC02ODksNyArNjg5LDcgQEAKIH0KIAogI2RlZmluZSBhdG9taWM2NF9jbXB4Y2hnKHYsIG8sIG4pIFwKLQkoKChfX3R5cGVvZl9fKCh2KS0+Y291bnRlcikpKWNtcHhjaGcoJigodiktPmNvdW50ZXIpLCAobyksIChuKSkpCisJKChfX3R5cGVvZl9fKCh2KS0+Y291bnRlcikpY21weGNoZygmKCh2KS0+Y291bnRlciksIChvKSwgKG4pKSkKICNkZWZpbmUgYXRvbWljNjRfeGNoZyh2LCBuZXcpICh4Y2hnKCYoKHYpLT5jb3VudGVyKSwgKG5ldykpKQogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvYm9vdGluZm8uaCBiL2luY2x1ZGUvYXNtLW1pcHMvYm9vdGluZm8uaAppbmRleCBkYmY4MzRmLi5iMGMzMjk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL2Jvb3RpbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9ib290aW5mby5oCkBAIC0xMTksOSArMTE5LDkgQEAKICAqLwogI2RlZmluZSBNQUNIX0dST1VQX01PTUVOQ08JMTIJLyogTW9tZW50dW0gQm9hcmRzCQkqLwogI2RlZmluZSAgTUFDSF9NT01FTkNPX09DRUxPVAkwCi0jZGVmaW5lICBNQUNIX01PTUVOQ09fT0NFTE9UX0cJMQorI2RlZmluZSAgTUFDSF9NT01FTkNPX09DRUxPVF9HCTEJLyogbm8gbW9yZSBzdXBwb3J0ZWQgKG1heSAyMDA3KSAqLwogI2RlZmluZSAgTUFDSF9NT01FTkNPX09DRUxPVF9DCTIKLSNkZWZpbmUgIE1BQ0hfTU9NRU5DT19KQUdVQVJfQVRYIDMKKyNkZWZpbmUgIE1BQ0hfTU9NRU5DT19KQUdVQVJfQVRYIDMJLyogbm8gbW9yZSBzdXBwb3J0ZWQgKG1heSAyMDA3KSAqLwogI2RlZmluZSAgTUFDSF9NT01FTkNPX09DRUxPVF8zCTQKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZnB1LmggYi9pbmNsdWRlL2FzbS1taXBzL2ZwdS5oCmluZGV4IGI0MTRhN2QuLjQ4MzY4NWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvZnB1LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9mcHUuaApAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogI2luY2x1ZGUgPGFzbS9jcHUuaD4KICNpbmNsdWRlIDxhc20vY3B1LWZlYXR1cmVzLmg+CisjaW5jbHVkZSA8YXNtL2hhemFyZHMuaD4KICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CkBAIC0zOCwzNCArMzksMTYgQEAKIGV4dGVybiB2b2lkIF9zYXZlX2ZwKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIF9yZXN0b3JlX2ZwKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TQjEpCi0jZGVmaW5lIF9fZW5hYmxlX2ZwdV9oYXphcmQoKQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JYXNtKCIuc2V0CXB1c2gJCVxuXHQiCQkJCVwKLQkgICAgIi5zZXQJbWlwczY0CQlcblx0IgkJCQlcCi0JICAgICIuc2V0CW5vcmVvcmRlcglcblx0IgkJCQlcCi0JICAgICJzc25vcAkJCVxuXHQiCQkJCVwKLQkgICAgImJuZXpsCSQwLCAuKzQJCVxuXHQiCQkJCVwKLQkgICAgInNzbm9wCQkJXG5cdCIJCQkJXAotCSAgICAiLnNldCBwb3AiKTsJCQkJCQlcCi19IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgX19lbmFibGVfZnB1X2hhemFyZCgpCQkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlhc20oIm5vcDtub3A7bm9wO25vcCIpOwkJLyogbWF4LiBoYXphcmQgKi8JCVwKLX0gd2hpbGUgKDApCi0jZW5kaWYKLQogI2RlZmluZSBfX2VuYWJsZV9mcHUoKQkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAogICAgICAgICBzZXRfYzBfc3RhdHVzKFNUMF9DVTEpOwkJCQkJCVwKLSAgICAgICAgX19lbmFibGVfZnB1X2hhemFyZCgpOwkJCQkJCVwKKyAgICAgICAgZW5hYmxlX2ZwdV9oYXphcmQoKTsJCQkJCQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIF9fZGlzYWJsZV9mcHUoKQkJCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAogCWNsZWFyX2MwX3N0YXR1cyhTVDBfQ1UxKTsJCQkJCVwKLQkvKiBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBjMCBoYXphcmQgaGVyZSAgKi8JCQlcCisgICAgICAgIGRpc2FibGVfZnB1X2hhemFyZCgpOwkJCQkJCVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgZW5hYmxlX2ZwdSgpCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaGF6YXJkcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9oYXphcmRzLmgKaW5kZXggZTUwYzc3ZS4uZDkxMTlmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9oYXphcmRzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9oYXphcmRzLmgKQEAgLTE3OCw0ICsxNzgsMzYgQEAKIAogI2VuZGlmCiAKKworLyogRlBVIGhhemFyZHMgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TQjEpCitBU01NQUNSTyhlbmFibGVfZnB1X2hhemFyZCwKKwkgLnNldAlwdXNoOworCSAuc2V0CW1pcHM2NDsKKwkgLnNldAlub3Jlb3JkZXI7CisJIF9zc25vcDsKKwkgYm5lemwJJDAsLis0OworCSBfc3Nub3A7CisJIC5zZXQJcG9wCispCitBU01NQUNSTyhkaXNhYmxlX2ZwdV9oYXphcmQsCispCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9NSVBTUjIpCitBU01NQUNSTyhlbmFibGVfZnB1X2hhemFyZCwKKwkgX2VoYgorKQorQVNNTUFDUk8oZGlzYWJsZV9mcHVfaGF6YXJkLAorCSBfZWhiCispCisjZWxzZQorQVNNTUFDUk8oZW5hYmxlX2ZwdV9oYXphcmQsCisJIG5vcDsgbm9wOyBub3A7IG5vcAorKQorQVNNTUFDUk8oZGlzYWJsZV9mcHVfaGF6YXJkLAorCSBfZWhiCispCisjZW5kaWYKKwogI2VuZGlmIC8qIF9BU01fSEFaQVJEU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2hpZ2htZW0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvaGlnaG1lbS5oCmluZGV4IGY4YzgxODIuLjRkNmJkNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaGlnaG1lbS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvaGlnaG1lbS5oCkBAIC00OCw0NiArNDgsNiBAQAogZXh0ZXJuIHZvaWQgKiBrbWFwX2hpZ2goc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHZvaWQga3VubWFwX2hpZ2goc3RydWN0IHBhZ2UgKnBhZ2UpOwogCi0vKgotICogQ09ORklHX0xJTUlURURfRE1BIGlzIGZvciBzeXN0ZW1zIHdpdGggRE1BIGxpbWl0YXRpb25zIHN1Y2ggYXMgTW9tZW50dW0ncwotICogSmFndWFyIEFUWC4gIFRoaXMgb3B0aW9uIGV4cGxvaXRzIHRoZSBoaWdobWVtIGNvZGUgaW4gdGhlIGtlcm5lbCBzbyBpcwotICogYWx3YXlzIGVuYWJsZWQgdG9nZXRoZXIgd2l0aCBDT05GSUdfSElHSE1FTSBidXQgYXQgdGhpcyB0aW1lIGRvZXNuJ3QKLSAqIGFjdHVhbGx5IGFkZCBoaWdobWVtIGZ1bmN0aW9uYWxpdHkuCi0gKi8KLQotI2lmZGVmIENPTkZJR19MSU1JVEVEX0RNQQotCi0vKgotICogVGhlc2UgYXJlIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgdGhlIG5vLWhpZ2htZW0gY2FzZSBmcm9tCi0gKiA8bGludXgvaGlnaG1lbS5oPgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKmttYXAoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JbWlnaHRfc2xlZXAoKTsKLQlyZXR1cm4gcGFnZV9hZGRyZXNzKHBhZ2UpOwotfQotCi0jZGVmaW5lIGt1bm1hcChwYWdlKSBkbyB7ICh2b2lkKSAocGFnZSk7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqa21hcF9hdG9taWMoc3RydWN0IHBhZ2UgKnBhZ2UsIGVudW0ga21fdHlwZSB0eXBlKQotewotCXBhZ2VmYXVsdF9kaXNhYmxlKCk7Ci0JcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGt1bm1hcF9hdG9taWModm9pZCAqa3ZhZGRyLCBlbnVtIGttX3R5cGUgdHlwZSkKLXsKLQlwYWdlZmF1bHRfZW5hYmxlKCk7Ci19Ci0KLSNkZWZpbmUga21hcF9hdG9taWNfcGZuKHBmbiwgaWR4KSBrbWFwX2F0b21pYyhwZm5fdG9fcGFnZShwZm4pLCAoaWR4KSkKLQotI2RlZmluZSBrbWFwX2F0b21pY190b19wYWdlKHB0cikgdmlydF90b19wYWdlKHB0cikKLQotI2RlZmluZSBmbHVzaF9jYWNoZV9rbWFwcygpCWRvIHsgfSB3aGlsZSAoMCkKLQotI2Vsc2UgLyogTElNSVRFRF9ETUEgKi8KLQogZXh0ZXJuIHZvaWQgKl9fa21hcChzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBleHRlcm4gdm9pZCBfX2t1bm1hcChzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBleHRlcm4gdm9pZCAqX19rbWFwX2F0b21pYyhzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBrbV90eXBlIHR5cGUpOwpAQCAtMTAzLDggKzYzLDYgQEAKIAogI2RlZmluZSBmbHVzaF9jYWNoZV9rbWFwcygpCWZsdXNoX2NhY2hlX2FsbCgpCiAKLSNlbmRpZiAvKiBMSU1JVEVEX0RNQSAqLwotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiAjZW5kaWYgLyogX0FTTV9ISUdITUVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvY29iYWx0LmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtY29iYWx0L2NvYmFsdC5oCmluZGV4IDI0YThkNTEuLjY4NGE1MDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1jb2JhbHQvY29iYWx0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWNvYmFsdC9jb2JhbHQuaApAQCAtNjksNiArNjksOCBAQAogI2RlZmluZSBDT0JBTFRfQlJEX0lEX1FVQkUyICAgIDB4NQogI2RlZmluZSBDT0JBTFRfQlJEX0lEX1JBUTIgICAgIDB4NgogCitleHRlcm4gaW50IGNvYmFsdF9ib2FyZF9pZDsKKwogI2RlZmluZSBQQ0lfQ0ZHX1NFVChkZXZmbix3aGVyZSkJCQkJCVwKIAlHVF9XUklURShHVF9QQ0kwX0NGR0FERFJfT0ZTLCAoMHg4MDAwMDAwMCB8IChQQ0lfU0xPVCAoZGV2Zm4pIDw8IDExKSB8CQlcCiAJCShQQ0lfRlVOQyAoZGV2Zm4pIDw8IDgpIHwgKHdoZXJlKSkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtamEvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtamEvY3B1LWZlYXR1cmUtb3ZlcnJpZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YjZkZWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWphL2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBSYWxmIEJhZWNobGUKLSAqLwotI2lmbmRlZiBfX0FTTV9NQUNIX0pBX0NQVV9GRUFUVVJFX09WRVJSSURFU19ICi0jZGVmaW5lIF9fQVNNX01BQ0hfSkFfQ1BVX0ZFQVRVUkVfT1ZFUlJJREVTX0gKLQotLyoKLSAqIE1vbWVudHVtIEphZ3VhciBBVFggYWx3YXlzIGhhcyB0aGUgUk05MDAwIHByb2Nlc3Nvci4KLSAqLwotI2RlZmluZSBjcHVfaGFzX3dhdGNoCQkxCi0jZGVmaW5lIGNwdV9oYXNfbWlwczE2CQkwCi0jZGVmaW5lIGNwdV9oYXNfZGl2ZWMJCTAKLSNkZWZpbmUgY3B1X2hhc192Y2UJCTAKLSNkZWZpbmUgY3B1X2hhc19jYWNoZV9jZGV4X3AJMAotI2RlZmluZSBjcHVfaGFzX2NhY2hlX2NkZXhfcwkwCi0jZGVmaW5lIGNwdV9oYXNfcHJlZmV0Y2gJMQotI2RlZmluZSBjcHVfaGFzX21jaGVjawkJMAotI2RlZmluZSBjcHVfaGFzX2VqdGFnCQkwCi0KLSNkZWZpbmUgY3B1X2hhc19sbHNjCQkxCi0jZGVmaW5lIGNwdV9oYXNfdnRhZ19pY2FjaGUJMAotI2RlZmluZSBjcHVfaGFzX2RjX2FsaWFzZXMJMAotI2RlZmluZSBjcHVfaGFzX2ljX2ZpbGxzX2ZfZGMJMAotI2RlZmluZSBjcHVfaGFzX2RzcAkJMAotI2RlZmluZSBjcHVfaWNhY2hlX3Nub29wc19yZW1vdGVfc3RvcmUJMAotCi0jZGVmaW5lIGNwdV9oYXNfbm9mcHVleAkJMAotI2RlZmluZSBjcHVfaGFzXzY0Yml0cwkJMQotCi0jZGVmaW5lIGNwdV9oYXNfaW5jbHVzaXZlX3BjYWNoZXMJMAotCi0jZGVmaW5lIGNwdV9kY2FjaGVfbGluZV9zaXplKCkJMzIKLSNkZWZpbmUgY3B1X2ljYWNoZV9saW5lX3NpemUoKQkzMgotI2RlZmluZSBjcHVfc2NhY2hlX2xpbmVfc2l6ZSgpCTMyCi0KLSNkZWZpbmUgY3B1X2hhc19taXBzMzJyMQkwCi0jZGVmaW5lIGNwdV9oYXNfbWlwczMycjIJMAotI2RlZmluZSBjcHVfaGFzX21pcHM2NHIxCTAKLSNkZWZpbmUgY3B1X2hhc19taXBzNjRyMgkwCi0KLSNlbmRpZiAvKiBfX0FTTV9NQUNIX0pBX0NQVV9GRUFUVVJFX09WRVJSSURFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtamEvc3BhY2VzLmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtamEvc3BhY2VzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjZhMGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWphL3NwYWNlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NCAtIDE5OTksIDIwMDAsIDAzLCAwNCBSYWxmIEJhZWNobGUKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMiAgTWFjaWVqIFcuIFJvenlja2kKLSAqIENvcHlyaWdodCAoQykgMTk5MCwgMTk5OSwgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuCi0gKi8KLSNpZm5kZWYgX19BU01fTUFDSF9KQV9TUEFDRVNfSAotI2RlZmluZSBfX0FTTV9NQUNIX0pBX1NQQUNFU19ICi0KLS8qCi0gKiBNZW1vcnkgYWJvdmUgdGhpcyBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgY29uc2lkZXJlZCBoaWdobWVtLgotICovCi0jZGVmaW5lIEhJR0hNRU1fU1RBUlQJCTB4MDgwMDAwMDBVTAotCi0jaW5jbHVkZV9uZXh0IDxzcGFjZXMuaD4KLQotI2VuZGlmIC8qIF9fQVNNX01BQ0hfSkFfU1BBQ0VTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwcy1ib2FyZHMvbWFsdGEuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWlwcy1ib2FyZHMvbWFsdGEuaAppbmRleCBiMGJhM2M1Li5lZWM5MTAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL21hbHRhLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9taXBzLWJvYXJkcy9tYWx0YS5oCkBAIC0yNSw2ICsyNSwxMCBAQAogI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9tc2MwMV9wY2kuaD4KICNpbmNsdWRlIDxhc20vZ3Q2NDEyMC5oPgogCisvKiBNaXBzIGludGVycnVwdCBjb250cm9sbGVyIGZvdW5kIGluIFNPQ2l0IHZhcmlhdGlvbnMgKi8KKyNkZWZpbmUgTUlQU19NU0MwMV9JQ19SRUdfQkFTRQkJMHgxYmM0MDAwMAorI2RlZmluZSBNSVBTX1NPQ0lUU0NfSUNfUkVHX0JBU0UJMHgxZmZhMDAwMAorCiAvKgogICogTWFsdGEgSS9PIHBvcnRzIGJhc2UgYWRkcmVzcyBmb3IgdGhlIEdhbGlsZW8gR1Q2NDEyMCBhbmQgQWxnb3JpdGhtaWNzCiAgKiBCb25pdG8gc3lzdGVtIGNvbnRyb2xsZXJzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tc2MwMV9pYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9tc2MwMV9pYy5oCmluZGV4IGFhN2FkOWEuLjc5ODliOWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbXNjMDFfaWMuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21zYzAxX2ljLmgKQEAgLTk0LDEwICs5NCw3IEBACiAvKgogICogTUlQUyBTeXN0ZW0gY29udHJvbGxlciBpbnRlcnJ1cHQgcmVnaXN0ZXIgYmFzZS4KICAqCi0gKiBGSVhNRSAtIGFyZSB0aGVzZSBtYWNyb3Mgc3BlY2lmaWMgdG8gTWFsdGEgYW5kIGNvIG9yIHRvIHRoZSBNU0M/ICBJZiB0aGUKLSAqIGxhdHRlciwgdGhleSBzaG91bGQgYmUgbW92ZWQgZWxzZXdoZXJlLgogICovCi0jZGVmaW5lIE1JUFNfTVNDMDFfSUNfUkVHX0JBU0UJMHgxYmM0MDAwMAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEFic29sdXRlIHJlZ2lzdGVyIGFkZHJlc3NlcwpAQCAtMTQ0LDcgKzE0MSw3IEBACiAjZGVmaW5lIE1TQzAxX0lSUV9MRVZFTAkJMAogI2RlZmluZSBNU0MwMV9JUlFfRURHRQkJMQogCi1leHRlcm4gdm9pZCBfX2luaXQgaW5pdF9tc2NfaXJxcyh1bnNpZ25lZCBpbnQgYmFzZSwgbXNjX2lycW1hcF90ICppbXAsIGludCBuaXJxKTsKK2V4dGVybiB2b2lkIF9faW5pdCBpbml0X21zY19pcnFzKHVuc2lnbmVkIGxvbmcgaWN1YmFzZSwgdW5zaWduZWQgaW50IGJhc2UsIG1zY19pcnFtYXBfdCAqaW1wLCBpbnQgbmlycSk7CiBleHRlcm4gdm9pZCBsbF9tc2NfaXJxKHZvaWQpOwogCiAjZW5kaWYgLyogX19BU01fTUlQU19CT0FSRFNfTVNDMDFfSUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wYWdlLmggYi9pbmNsdWRlL2FzbS1taXBzL3BhZ2UuaAppbmRleCBkM2ZiZDgzLi41YzMyMzlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3BhZ2UuaApAQCAtMTkwLDEwICsxOTAsNiBAQAogI2RlZmluZSBVTkNBQ19BRERSKGFkZHIpCSgoYWRkcikgLSBQQUdFX09GRlNFVCArIFVOQ0FDX0JBU0UpCiAjZGVmaW5lIENBQ19BRERSKGFkZHIpCQkoKGFkZHIpIC0gVU5DQUNfQkFTRSArIFBBR0VfT0ZGU0VUKQogCi0jaWZkZWYgQ09ORklHX0xJTUlURURfRE1BCi0jZGVmaW5lIFdBTlRfUEFHRV9WSVJUVUFMCi0jZW5kaWYKLQogI2luY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wb2xsLmggYi9pbmNsdWRlL2FzbS1taXBzL3BvbGwuaAppbmRleCA3MDg4MWY4Li40N2I5NTIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3BvbGwuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3BvbGwuaApAQCAtMSwyOCArMSw5IEBACiAjaWZuZGVmIF9fQVNNX1BPTExfSAogI2RlZmluZSBfX0FTTV9QT0xMX0gKIAotI2RlZmluZSBQT0xMSU4JCTB4MDAwMQotI2RlZmluZSBQT0xMUFJJCQkweDAwMDIKLSNkZWZpbmUgUE9MTE9VVAkJMHgwMDA0Ci0KLSNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4Ci0jZGVmaW5lIFBPTExIVVAJCTB4MDAxMAotI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKLQotI2RlZmluZSBQT0xMUkROT1JNCTB4MDA0MAotI2RlZmluZSBQT0xMUkRCQU5ECTB4MDA4MAogI2RlZmluZSBQT0xMV1JOT1JNCVBPTExPVVQKICNkZWZpbmUgUE9MTFdSQkFORAkweDAxMDAKIAotLyogVGhlc2Ugc2VlbSB0byBiZSBtb3JlIG9yIGxlc3Mgbm9uc3RhbmRhcmQgLi4uICAqLwotI2RlZmluZSBQT0xMTVNHCQkweDA0MDAKLSNkZWZpbmUgUE9MTFJFTU9WRQkweDEwMDAKLSNkZWZpbmUgUE9MTFJESFVQICAgICAgIDB4MjAwMAotCi1zdHJ1Y3QgcG9sbGZkIHsKLQlpbnQgZmQ7Ci0Jc2hvcnQgZXZlbnRzOwotCXNob3J0IHJldmVudHM7Ci19OworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KIAogI2VuZGlmIC8qIF9fQVNNX1BPTExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2VyaWFsLmgKaW5kZXggZDdhNjUxMy4uY2U1MTIxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NlcmlhbC5oCkBAIC04MSwyNSArODEsNiBAQAogI2RlZmluZSBTVERfU0VSSUFMX1BPUlRfREVGTlMKICNlbmRpZiAvKiBDT05GSUdfSEFWRV9TVERfUENfU0VSSUFMX1BPUlRTICovCiAKLSNpZmRlZiBDT05GSUdfTU9NRU5DT19KQUdVQVJfQVRYCi0vKiBPcmRpbmFyeSBOUzE2NTUyIGR1YXJ0IHdpdGggYSAyME1IeiBjcnlzdGFsLiAgKi8KLSNkZWZpbmUgSkFHVUFSX0FUWF9VQVJUX0NMSwkyMDAwMDAwMAotI2RlZmluZSBKQUdVQVJfQVRYX0JBU0VfQkFVRAkoSkFHVUFSX0FUWF9VQVJUX0NMSyAvIDE2KQotCi0jZGVmaW5lIEpBR1VBUl9BVFhfU0VSSUFMMV9JUlEJNgotI2RlZmluZSBKQUdVQVJfQVRYX1NFUklBTDFfQkFTRQkweGZkMDAwMDIzTAotCi0jZGVmaW5lIF9KQUdVQVJfQVRYX1NFUklBTF9JTklUKGludCwgYmFzZSkJCQkJXAotCXsgLmJhdWRfYmFzZSA9IEpBR1VBUl9BVFhfQkFTRV9CQVVELCBpcnE6IGludCwJCQlcCi0JICAuZmxhZ3MgPSAoQVNZTkNfQk9PVF9BVVRPQ09ORiB8IEFTWU5DX1NLSVBfVEVTVCksCQlcCi0JICAuaW9tZW1fYmFzZSA9ICh1OCAqKSBiYXNlLCBpb21lbV9yZWdfc2hpZnQ6IDIsCQkJXAotCSAgaW9fdHlwZTogU0VSSUFMX0lPX01FTSB9Ci0jZGVmaW5lIE1PTUVOQ09fSkFHVUFSX0FUWF9TRVJJQUxfUE9SVF9ERUZOUwkJCQlcCi0JX0pBR1VBUl9BVFhfU0VSSUFMX0lOSVQoSkFHVUFSX0FUWF9TRVJJQUwxX0lSUSwgSkFHVUFSX0FUWF9TRVJJQUwxX0JBU0UpCi0jZWxzZQotI2RlZmluZSBNT01FTkNPX0pBR1VBUl9BVFhfU0VSSUFMX1BPUlRfREVGTlMKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX01PTUVOQ09fT0NFTE9UXzMKICNkZWZpbmUgT0NFTE9UXzNfQkFTRV9CQVVECSggMjAwMDAwMDAgLyAxNiApCiAjZGVmaW5lIE9DRUxPVF8zX1NFUklBTF9JUlEJNgpAQCAtMTM0LDI3ICsxMTUsNiBAQAogI2RlZmluZSBNT01FTkNPX09DRUxPVF9TRVJJQUxfUE9SVF9ERUZOUwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTU9NRU5DT19PQ0VMT1RfRwotLyogT3JkaW5hcnkgTlMxNjU1MiBkdWFydCB3aXRoIGEgMjBNSHogY3J5c3RhbC4gICovCi0jZGVmaW5lIE9DRUxPVF9HX0JBU0VfQkFVRCAoIDIwMDAwMDAwIC8gMTYgKQotCi0jZGVmaW5lIE9DRUxPVF9HX1NFUklBTDFfSVJRCTQKLSNpZiAwCi0jZGVmaW5lIE9DRUxPVF9HX1NFUklBTDFfQkFTRQkweGUwMDAxMDIwCi0jZWxzZQotI2RlZmluZSBPQ0VMT1RfR19TRVJJQUwxX0JBU0UJMHhmZDAwMDAyMAotI2VuZGlmCi0KLSNkZWZpbmUgX09DRUxPVF9HX1NFUklBTF9JTklUKGludCwgYmFzZSkJCQkJXAotCXsgLmJhdWRfYmFzZSA9IE9DRUxPVF9HX0JBU0VfQkFVRCwgLmlycSA9IGludCwgLmZsYWdzID0gU1REX0NPTV9GTEFHUyxcCi0JICAuaW9tZW1fYmFzZSA9ICh1OCAqKSBiYXNlLCAuaW9tZW1fcmVnX3NoaWZ0ID0gMiwJCQlcCi0JICAuaW9fdHlwZSA9IFNFUklBTF9JT19NRU0gfQotI2RlZmluZSBNT01FTkNPX09DRUxPVF9HX1NFUklBTF9QT1JUX0RFRk5TCQkJCVwKLQlfT0NFTE9UX0dfU0VSSUFMX0lOSVQoT0NFTE9UX0dfU0VSSUFMMV9JUlEsIE9DRUxPVF9HX1NFUklBTDFfQkFTRSkKLSNlbHNlCi0jZGVmaW5lIE1PTUVOQ09fT0NFTE9UX0dfU0VSSUFMX1BPUlRfREVGTlMKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX01PTUVOQ09fT0NFTE9UX0MKIC8qIE9yZGluYXJ5IE5TMTY1NTIgZHVhcnQgd2l0aCBhIDIwTUh6IGNyeXN0YWwuICAqLwogI2RlZmluZSBPQ0VMT1RfQ19CQVNFX0JBVUQgKCAyMDAwMDAwMCAvIDE2ICkKQEAgLTIxMCw3ICsxNzAsNiBAQAogCUlQMzJfU0VSSUFMX1BPUlRfREVGTlMgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlKQVpaX1NFUklBTF9QT1JUX0RFRk5TCQkJCVwKIAlTVERfU0VSSUFMX1BPUlRfREVGTlMJCQkJXAotCU1PTUVOQ09fT0NFTE9UX0dfU0VSSUFMX1BPUlRfREVGTlMJCVwKIAlNT01FTkNPX09DRUxPVF9DX1NFUklBTF9QT1JUX0RFRk5TCQlcCiAJTU9NRU5DT19PQ0VMT1RfU0VSSUFMX1BPUlRfREVGTlMJCVwKIAlNT01FTkNPX09DRUxPVF8zX1NFUklBTF9QT1JUX0RFRk5TCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NnaS9zZWVxLmggYi9pbmNsdWRlL2FzbS1taXBzL3NnaS9zZWVxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwZmZkNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpL3NlZXEuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IGJ5IFJhbGYgQmFlY2hsZQorICovCisjaWZuZGVmIF9fQVNNX1NHSV9TRUVRX0gKKyNkZWZpbmUgX19BU01fU0dJX1NFRVFfSAorCisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKworI2luY2x1ZGUgPGFzbS9zZ2kvaHBjMy5oPgorCitzdHJ1Y3Qgc2dpc2VlcV9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3QgaHBjM19yZWdzICpocGM7CisJdW5zaWduZWQgaW50IGlycTsKKwl1bnNpZ25lZCBjaGFyIG1hY1tFVEhfQUxFTl07Cit9OworCisjZW5kaWYgLyogX19BU01fU0dJX1NFRVFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zZ2kvd2QuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpL3dkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2YzNhNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2dpL3dkLmgKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBieSBSYWxmIEJhZWNobGUKKyAqLworI2lmbmRlZiBfX0FTTV9TR0lfV0RfSAorI2RlZmluZSBfX0FTTV9TR0lfV0RfSAorCisjaW5jbHVkZSA8YXNtL3NnaS9ocGMzLmg+CisKK3N0cnVjdCBzZ2l3ZDkzX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGludCB1bml0OworCXVuc2lnbmVkIGludCBpcnE7CisJc3RydWN0IGhwYzNfc2NzaXJlZ3MgKmhyZWdzOworCXVuc2lnbmVkIGNoYXIgKndkcmVnczsKK307CisKKyNlbmRpZiAvKiBfX0FTTV9TR0lfV0RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLW1pcHMvc3lzdGVtLmgKaW5kZXggMzcxM2QyNS4uYmIwYjI4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zeXN0ZW0uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3N5c3RlbS5oCkBAIC00NjQsNyArNDY0LDEwIEBACiAKIGV4dGVybiB2b2lkIHNldF9oYW5kbGVyICh1bnNpZ25lZCBsb25nIG9mZnNldCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4pOwogZXh0ZXJuIHZvaWQgc2V0X3VuY2FjaGVkX2hhbmRsZXIgKHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGxlbik7Ci1leHRlcm4gdm9pZCAqc2V0X3ZpX2hhbmRsZXIgKGludCBuLCB2b2lkICphZGRyKTsKKwordHlwZWRlZiB2b2lkICgqdmlfaGFuZGxlcl90KSh2b2lkKTsKK2V4dGVybiB2b2lkICpzZXRfdmlfaGFuZGxlciAoaW50IG4sIHZpX2hhbmRsZXJfdCBhZGRyKTsKKwogZXh0ZXJuIHZvaWQgKnNldF9leGNlcHRfdmVjdG9yKGludCBuLCB2b2lkICphZGRyKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGViYXNlOwogZXh0ZXJuIHZvaWQgcGVyX2NwdV90cmFwX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvcG9sbC5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL3BvbGwuaAppbmRleCAyMGU0ZDAzLi5jOTg1MDlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wYXJpc2MvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9wb2xsLmgKQEAgLTEsMjcgKzEgQEAKLSNpZm5kZWYgX19QQVJJU0NfUE9MTF9ICi0jZGVmaW5lIF9fUEFSSVNDX1BPTExfSAotCi0vKiBUaGVzZSBhcmUgc3BlY2lmaWVkIGJ5IGlCQ1MyICovCi0jZGVmaW5lIFBPTExJTgkJMHgwMDAxCi0jZGVmaW5lIFBPTExQUkkJCTB4MDAwMgotI2RlZmluZSBQT0xMT1VUCQkweDAwMDQKLSNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4Ci0jZGVmaW5lIFBPTExIVVAJCTB4MDAxMAotI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKLQotLyogVGhlIHJlc3Qgc2VlbSB0byBiZSBtb3JlLW9yLWxlc3Mgbm9uc3RhbmRhcmQuIENoZWNrIHRoZW0hICovCi0jZGVmaW5lIFBPTExSRE5PUk0JMHgwMDQwCi0jZGVmaW5lIFBPTExSREJBTkQJMHgwMDgwCi0jZGVmaW5lIFBPTExXUk5PUk0JMHgwMTAwCi0jZGVmaW5lIFBPTExXUkJBTkQJMHgwMjAwCi0jZGVmaW5lIFBPTExNU0cJCTB4MDQwMAotI2RlZmluZSBQT0xMUkVNT1ZFCTB4MTAwMAotI2RlZmluZSBQT0xMUkRIVVAgICAgICAgMHgyMDAwCi0KLXN0cnVjdCBwb2xsZmQgewotCWludCBmZDsKLQlzaG9ydCBldmVudHM7Ci0Jc2hvcnQgcmV2ZW50czsKLX07Ci0KLSNlbmRpZgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaHdfaXJxLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2h3X2lycS5oCmluZGV4IDllNGRkOTguLmE3YjYwYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaHdfaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9od19pcnEuaApAQCAtNDgsOCArNDgsMTUgQEAKIAogI2RlZmluZSBpcnFzX2Rpc2FibGVkKCkJCShsb2NhbF9nZXRfZmxhZ3MoKSA9PSAwKQogCi0jZGVmaW5lIGhhcmRfaXJxX2VuYWJsZSgpCV9fbXRtc3JkKG1mbXNyKCkgfCBNU1JfRUUsIDEpCi0jZGVmaW5lIGhhcmRfaXJxX2Rpc2FibGUoKQlfX210bXNyZChtZm1zcigpICYgfk1TUl9FRSwgMSkKKyNkZWZpbmUgX19oYXJkX2lycV9lbmFibGUoKQlfX210bXNyZChtZm1zcigpIHwgTVNSX0VFLCAxKQorI2RlZmluZSBfX2hhcmRfaXJxX2Rpc2FibGUoKQlfX210bXNyZChtZm1zcigpICYgfk1TUl9FRSwgMSkKKworI2RlZmluZSAgaGFyZF9pcnFfZGlzYWJsZSgpCQkJXAorCWRvIHsJCQkJCVwKKwkJX19oYXJkX2lycV9kaXNhYmxlKCk7CQlcCisJCWdldF9wYWNhKCktPnNvZnRfZW5hYmxlZCA9IDA7CVwKKwkJZ2V0X3BhY2EoKS0+aGFyZF9lbmFibGVkID0gMDsJXAorCX0gd2hpbGUoMCkKIAogI2Vsc2UKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wb2xsLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BvbGwuaAppbmRleCA5YzdkMTI2Li5jOTg1MDlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BvbGwuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BvbGwuaApAQCAtMSwyNCArMSBAQAotI2lmbmRlZiBfQVNNX1BPV0VSUENfUE9MTF9ICi0jZGVmaW5lIF9BU01fUE9XRVJQQ19QT0xMX0gKLQotI2RlZmluZSBQT0xMSU4JCTB4MDAwMQotI2RlZmluZSBQT0xMUFJJCQkweDAwMDIKLSNkZWZpbmUgUE9MTE9VVAkJMHgwMDA0Ci0jZGVmaW5lIFBPTExFUlIJCTB4MDAwOAotI2RlZmluZSBQT0xMSFVQCQkweDAwMTAKLSNkZWZpbmUgUE9MTE5WQUwJMHgwMDIwCi0jZGVmaW5lIFBPTExSRE5PUk0JMHgwMDQwCi0jZGVmaW5lIFBPTExSREJBTkQJMHgwMDgwCi0jZGVmaW5lIFBPTExXUk5PUk0JMHgwMTAwCi0jZGVmaW5lIFBPTExXUkJBTkQJMHgwMjAwCi0jZGVmaW5lIFBPTExNU0cJCTB4MDQwMAotI2RlZmluZSBQT0xMUkVNT1ZFCTB4MTAwMAotI2RlZmluZSBQT0xMUkRIVVAgICAgICAgMHgyMDAwCi0KLXN0cnVjdCBwb2xsZmQgewotCWludCBmZDsKLQlzaG9ydCBldmVudHM7Ci0Jc2hvcnQgcmV2ZW50czsKLX07Ci0KLSNlbmRpZgkvKiBfQVNNX1BPV0VSUENfUE9MTF9IICovCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcG9sbC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC9wb2xsLmggYi9pbmNsdWRlL2FzbS1zMzkwL3BvbGwuaAppbmRleCA2ZjdmNjVhLi5jOTg1MDlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zMzkwL3BvbGwuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3BvbGwuaApAQCAtMSwzNSArMSBAQAotLyoKLSAqICBpbmNsdWRlL2FzbS1zMzkwL3BvbGwuaAotICoKLSAqICBTMzkwIHZlcnNpb24KLSAqCi0gKiAgRGVyaXZlZCBmcm9tICJpbmNsdWRlL2FzbS1pMzg2L3BvbGwuaCIKLSAqLwotCi0jaWZuZGVmIF9fUzM5MF9QT0xMX0gKLSNkZWZpbmUgX19TMzkwX1BPTExfSAotCi0vKiBUaGVzZSBhcmUgc3BlY2lmaWVkIGJ5IGlCQ1MyICovCi0jZGVmaW5lIFBPTExJTiAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgUE9MTFBSSSAgICAgICAgIDB4MDAwMgotI2RlZmluZSBQT0xMT1VUICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIFBPTExFUlIgICAgICAgICAweDAwMDgKLSNkZWZpbmUgUE9MTEhVUCAgICAgICAgIDB4MDAxMAotI2RlZmluZSBQT0xMTlZBTCAgICAgICAgMHgwMDIwCi0KLS8qIFRoZSByZXN0IHNlZW0gdG8gYmUgbW9yZS1vci1sZXNzIG5vbnN0YW5kYXJkLiBDaGVjayB0aGVtISAqLwotI2RlZmluZSBQT0xMUkROT1JNCTB4MDA0MAotI2RlZmluZSBQT0xMUkRCQU5ECTB4MDA4MAotI2RlZmluZSBQT0xMV1JOT1JNCTB4MDEwMAotI2RlZmluZSBQT0xMV1JCQU5ECTB4MDIwMAotI2RlZmluZSBQT0xMTVNHCQkweDA0MDAKLSNkZWZpbmUgUE9MTFJFTU9WRQkweDEwMDAKLSNkZWZpbmUgUE9MTFJESFVQICAgICAgIDB4MjAwMAotCi1zdHJ1Y3QgcG9sbGZkIHsKLQlpbnQgZmQ7Ci0Jc2hvcnQgZXZlbnRzOwotCXNob3J0IHJldmVudHM7Ci19OwotCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wb2xsLmggYi9pbmNsdWRlL2FzbS1zaC9wb2xsLmgKaW5kZXggZGJjYTliMy4uYzk4NTA5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BvbGwuaApAQCAtMSwyNyArMSBAQAotI2lmbmRlZiBfX0FTTV9TSF9QT0xMX0gKLSNkZWZpbmUgX19BU01fU0hfUE9MTF9ICi0KLS8qIFRoZXNlIGFyZSBzcGVjaWZpZWQgYnkgaUJDUzIgKi8KLSNkZWZpbmUgUE9MTElOCQkweDAwMDEKLSNkZWZpbmUgUE9MTFBSSQkJMHgwMDAyCi0jZGVmaW5lIFBPTExPVVQJCTB4MDAwNAotI2RlZmluZSBQT0xMRVJSCQkweDAwMDgKLSNkZWZpbmUgUE9MTEhVUAkJMHgwMDEwCi0jZGVmaW5lIFBPTExOVkFMCTB4MDAyMAotCi0vKiBUaGUgcmVzdCBzZWVtIHRvIGJlIG1vcmUtb3ItbGVzcyBub25zdGFuZGFyZC4gQ2hlY2sgdGhlbSEgKi8KLSNkZWZpbmUgUE9MTFJETk9STQkweDAwNDAKLSNkZWZpbmUgUE9MTFJEQkFORAkweDAwODAKLSNkZWZpbmUgUE9MTFdSTk9STQkweDAxMDAKLSNkZWZpbmUgUE9MTFdSQkFORAkweDAyMDAKLSNkZWZpbmUgUE9MTE1TRwkJMHgwNDAwCi0jZGVmaW5lIFBPTExSRU1PVkUJMHgxMDAwCi0jZGVmaW5lIFBPTExSREhVUCAgICAgICAweDIwMDAKLQotc3RydWN0IHBvbGxmZCB7Ci0JaW50IGZkOwotCXNob3J0IGV2ZW50czsKLQlzaG9ydCByZXZlbnRzOwotfTsKLQotI2VuZGlmIC8qIF9fQVNNX1NIX1BPTExfSCAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoNjQvcG9sbC5oIGIvaW5jbHVkZS9hc20tc2g2NC9wb2xsLmgKaW5kZXggM2E2Y2JhZC4uY2EyOTUwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC9wb2xsLmgKKysrIGIvaW5jbHVkZS9hc20tc2g2NC9wb2xsLmgKQEAgLTEsMzcgKzEsOCBAQAogI2lmbmRlZiBfX0FTTV9TSDY0X1BPTExfSAogI2RlZmluZSBfX0FTTV9TSDY0X1BPTExfSAogCi0vKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogaW5jbHVkZS9hc20tc2g2NC9wb2xsLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgIFBhb2xvIEFsYmVyZWxsaQotICoKLSAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KIAotLyogVGhlc2UgYXJlIHNwZWNpZmllZCBieSBpQkNTMiAqLwotI2RlZmluZSBQT0xMSU4JCTB4MDAwMQotI2RlZmluZSBQT0xMUFJJCQkweDAwMDIKLSNkZWZpbmUgUE9MTE9VVAkJMHgwMDA0Ci0jZGVmaW5lIFBPTExFUlIJCTB4MDAwOAotI2RlZmluZSBQT0xMSFVQCQkweDAwMTAKLSNkZWZpbmUgUE9MTE5WQUwJMHgwMDIwCi0KLS8qIFRoZSByZXN0IHNlZW0gdG8gYmUgbW9yZS1vci1sZXNzIG5vbnN0YW5kYXJkLiBDaGVjayB0aGVtISAqLwotI2RlZmluZSBQT0xMUkROT1JNCTB4MDA0MAotI2RlZmluZSBQT0xMUkRCQU5ECTB4MDA4MAotI2RlZmluZSBQT0xMV1JOT1JNCTB4MDEwMAotI2RlZmluZSBQT0xMV1JCQU5ECTB4MDIwMAotI2RlZmluZSBQT0xMTVNHCQkweDA0MDAKLSNkZWZpbmUgUE9MTFJESFVQICAgICAgIDB4MjAwMAotCi1zdHJ1Y3QgcG9sbGZkIHsKLQlpbnQgZmQ7Ci0Jc2hvcnQgZXZlbnRzOwotCXNob3J0IHJldmVudHM7Ci19OworI3VuZGVmIFBPTExSRU1PVkUKIAogI2VuZGlmIC8qIF9fQVNNX1NINjRfUE9MTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9wb2xsLmggYi9pbmNsdWRlL2FzbS1zcGFyYy9wb2xsLmgKaW5kZXggMjZmMTNmYi4uMDkxZDNhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjL3BvbGwuaApAQCAtMSwyNCArMSwxMiBAQAogI2lmbmRlZiBfX1NQQVJDX1BPTExfSAogI2RlZmluZSBfX1NQQVJDX1BPTExfSAogCi0jZGVmaW5lIFBPTExJTgkJICAxCi0jZGVmaW5lIFBPTExQUkkJCSAgMgotI2RlZmluZSBQT0xMT1VUCQkgIDQKLSNkZWZpbmUgUE9MTEVSUgkJICA4Ci0jZGVmaW5lIFBPTExIVVAJCSAxNgotI2RlZmluZSBQT0xMTlZBTAkgMzIKLSNkZWZpbmUgUE9MTFJETk9STQkgNjQKICNkZWZpbmUgUE9MTFdSTk9STQlQT0xMT1VUCi0jZGVmaW5lIFBPTExSREJBTkQJMTI4CiAjZGVmaW5lIFBPTExXUkJBTkQJMjU2CiAjZGVmaW5lIFBPTExNU0cJCTUxMgogI2RlZmluZSBQT0xMUkVNT1ZFCTEwMjQKICNkZWZpbmUgUE9MTFJESFVQICAgICAgIDIwNDgKIAotc3RydWN0IHBvbGxmZCB7Ci0JaW50IGZkOwotCXNob3J0IGV2ZW50czsKLQlzaG9ydCByZXZlbnRzOwotfTsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaAppbmRleCBkYTliZGM1Li42NDQ3MWJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy91bmlzdGQuaApAQCAtMzI3LDggKzMyNywxMSBAQAogI2RlZmluZSBfX05SX2dldGNwdQkJMzA4CiAjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMzA5CiAjZGVmaW5lIF9fTlJfdXRpbWVuc2F0CQkzMTAKKyNkZWZpbmUgX19OUl9zaWduYWxmZAkJMzExCisjZGVmaW5lIF9fTlJfdGltZXJmZAkJMzEyCisjZGVmaW5lIF9fTlJfZXZlbnRmZAkJMzEzCiAKLSNkZWZpbmUgTlJfU1lTQ0FMTFMJCTMxMQorI2RlZmluZSBOUl9TWVNDQUxMUwkJMzE0CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BvbGwuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcG9sbC5oCmluZGV4IGFiNmIwZDEuLmViZWViMzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcG9sbC5oCkBAIC0xLDI0ICsxLDEyIEBACiAjaWZuZGVmIF9fU1BBUkM2NF9QT0xMX0gKICNkZWZpbmUgX19TUEFSQzY0X1BPTExfSAogCi0jZGVmaW5lIFBPTExJTgkJICAxCi0jZGVmaW5lIFBPTExQUkkJCSAgMgotI2RlZmluZSBQT0xMT1VUCQkgIDQKLSNkZWZpbmUgUE9MTEVSUgkJICA4Ci0jZGVmaW5lIFBPTExIVVAJCSAxNgotI2RlZmluZSBQT0xMTlZBTAkgMzIKLSNkZWZpbmUgUE9MTFJETk9STQkgNjQKICNkZWZpbmUgUE9MTFdSTk9STQlQT0xMT1VUCi0jZGVmaW5lIFBPTExSREJBTkQJMTI4CiAjZGVmaW5lIFBPTExXUkJBTkQJMjU2CiAjZGVmaW5lIFBPTExNU0cJCTUxMgogI2RlZmluZSBQT0xMUkVNT1ZFCTEwMjQKICNkZWZpbmUgUE9MTFJESFVQICAgICAgIDIwNDgKIAotc3RydWN0IHBvbGxmZCB7Ci0JaW50IGZkOwotCXNob3J0IGV2ZW50czsKLQlzaG9ydCByZXZlbnRzOwotfTsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvdW5pc3RkLmgKaW5kZXggZmNkNjI3NTkuLjUzZTk2ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC91bmlzdGQuaApAQCAtMzI5LDggKzMyOSwxMSBAQAogI2RlZmluZSBfX05SX2dldGNwdQkJMzA4CiAjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMzA5CiAjZGVmaW5lIF9fTlJfdXRpbWVuc2F0CQkzMTAKKyNkZWZpbmUgX19OUl9zaWduYWxmZAkJMzExCisjZGVmaW5lIF9fTlJfdGltZXJmZAkJMzEyCisjZGVmaW5lIF9fTlJfZXZlbnRmZAkJMzEzCiAKLSNkZWZpbmUgTlJfU1lTQ0FMTFMJCTMxMQorI2RlZmluZSBOUl9TWVNDQUxMUwkJMzE0CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAvKiBzeXNjb25mIG9wdGlvbnMsIGZvciBTdW5PUyBjb21wYXRpYmlsaXR5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20tdW0vdGhyZWFkX2luZm8uaAppbmRleCAyNjFlMmY0Li4xOGExM2JhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3RocmVhZF9pbmZvLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAkJCQkJIAkgICAwLTB4QkZGRkZGRkYgZm9yIHVzZXIKIAkJCQkJCSAgIDAtMHhGRkZGRkZGRiBmb3Iga2VybmVsICovCiAJc3RydWN0IHJlc3RhcnRfYmxvY2sgICAgcmVzdGFydF9ibG9jazsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8JKnJlYWxfdGhyZWFkOyAgICAvKiBQb2ludHMgdG8gbm9uLUlSUSBzdGFjayAqLwogfTsKIAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCkBAIC0zNSw2ICszNiw3IEBACiAJLnJlc3RhcnRfYmxvY2sgPSAgewkJCVwKIAkJLmZuID0gIGRvX25vX3Jlc3RhcnRfc3lzY2FsbCwJXAogCX0sCQkJCQlcCisJLnJlYWxfdGhyZWFkID0gTlVMTCwJCQlcCiB9CiAKICNkZWZpbmUgaW5pdF90aHJlYWRfaW5mbwkoaW5pdF90aHJlYWRfdW5pb24udGhyZWFkX2luZm8pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL3BvbGwuaCBiL2luY2x1ZGUvYXNtLXY4NTAvcG9sbC5oCmluZGV4IGMxMDE3NmMuLjgwM2NhZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvcG9sbC5oCkBAIC0xLDI0ICsxLDkgQEAKICNpZm5kZWYgX19WODUwX1BPTExfSF9fCiAjZGVmaW5lIF9fVjg1MF9QT0xMX0hfXwogCi0jZGVmaW5lIFBPTExJTgkJMHgwMDAxCi0jZGVmaW5lIFBPTExQUkkJCTB4MDAwMgotI2RlZmluZSBQT0xMT1VUCQkweDAwMDQKLSNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4Ci0jZGVmaW5lIFBPTExIVVAJCTB4MDAxMAotI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKLSNkZWZpbmUgUE9MTFJETk9STQkweDAwNDAKICNkZWZpbmUgUE9MTFdSTk9STQlQT0xMT1VUCi0jZGVmaW5lIFBPTExSREJBTkQJMHgwMDgwCiAjZGVmaW5lIFBPTExXUkJBTkQJMHgwMTAwCi0jZGVmaW5lIFBPTExNU0cJCTB4MDQwMAotI2RlZmluZSBQT0xMUkVNT1ZFCTB4MTAwMAotI2RlZmluZSBQT0xMUkRIVVAgICAgICAgMHgyMDAwCiAKLXN0cnVjdCBwb2xsZmQgewotCWludCBmZDsKLQlzaG9ydCBldmVudHM7Ci0Jc2hvcnQgcmV2ZW50czsKLX07CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcG9sbC5oPgogCiAjZW5kaWYgLyogX19WODUwX1BPTExfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvYWx0ZXJuYXRpdmUuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hbHRlcm5hdGl2ZS5oCmluZGV4IGEwOWZlODUuLmEwOTQyNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hbHRlcm5hdGl2ZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hbHRlcm5hdGl2ZS5oCkBAIC0xMDMsNiArMTAzLDEyIEBACiAJCSAgICAgICIucHJldmlvdXMiIDogb3V0cHV0IDogW2ZlYXRdICJpIiAoZmVhdHVyZSksICMjaW5wdXQpCiAKIC8qCisgKiB1c2UgdGhpcyBtYWNybyhzKSBpZiB5b3UgbmVlZCBtb3JlIHRoYW4gb25lIG91dHB1dCBwYXJhbWV0ZXIKKyAqIGluIGFsdGVybmF0aXZlX2lvCisgKi8KKyNkZWZpbmUgQVNNX09VVFBVVDIoYSwgYikgYSwgYgorCisvKgogICogQWx0ZXJuYXRpdmUgaW5saW5lIGFzc2VtYmx5IGZvciBTTVAuCiAgKgogICogVGhlIExPQ0tfUFJFRklYIG1hY3JvIGRlZmluZWQgaGVyZSByZXBsYWNlcyB0aGUgTE9DSyBhbmQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGFnZS5oCmluZGV4IGRlZTYzMmYuLmUzMjdjODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BhZ2UuaApAQCAtODAsNiArODAsMTUgQEAKICNkZWZpbmUgX19QSFlTSUNBTF9TVEFSVAlDT05GSUdfUEhZU0lDQUxfU1RBUlQKICNkZWZpbmUgX19LRVJORUxfQUxJR04JCTB4MjAwMDAwCiAKKy8qCisgKiBNYWtlIHN1cmUga2VybmVsIGlzIGFsaWduZWQgdG8gMk1CIGFkZHJlc3MuIENhdGNoaW5nIGl0IGF0IGNvbXBpbGUKKyAqIHRpbWUgaXMgYmV0dGVyLiBDaGFuZ2UgeW91ciBjb25maWcgZmlsZSBhbmQgY29tcGlsZSB0aGUga2VybmVsCisgKiBmb3IgYSAyTUIgYWxpZ25lZCBhZGRyZXNzIChDT05GSUdfUEhZU0lDQUxfU1RBUlQpCisgKi8KKyNpZiAoQ09ORklHX1BIWVNJQ0FMX1NUQVJUICUgX19LRVJORUxfQUxJR04pICE9IDAKKyNlcnJvciAiQ09ORklHX1BIWVNJQ0FMX1NUQVJUIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyTUIiCisjZW5kaWYKKwogI2RlZmluZSBfX1NUQVJUX0tFUk5FTAkJKF9fU1RBUlRfS0VSTkVMX21hcCArIF9fUEhZU0lDQUxfU1RBUlQpCiAjZGVmaW5lIF9fU1RBUlRfS0VSTkVMX21hcAlfQUMoMHhmZmZmZmZmZjgwMDAwMDAwLCBVTCkKICNkZWZpbmUgX19QQUdFX09GRlNFVCAgICAgICAgICAgX0FDKDB4ZmZmZjgxMDAwMDAwMDAwMCwgVUwpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcG9sbC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3BvbGwuaAppbmRleCBjMDQ3NWE5Li5jOTg1MDlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcG9sbC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wb2xsLmgKQEAgLTEsMjcgKzEgQEAKLSNpZm5kZWYgX194ODZfNjRfUE9MTF9ICi0jZGVmaW5lIF9feDg2XzY0X1BPTExfSAotCi0vKiBUaGVzZSBhcmUgc3BlY2lmaWVkIGJ5IGlCQ1MyICovCi0jZGVmaW5lIFBPTExJTgkJMHgwMDAxCi0jZGVmaW5lIFBPTExQUkkJCTB4MDAwMgotI2RlZmluZSBQT0xMT1VUCQkweDAwMDQKLSNkZWZpbmUgUE9MTEVSUgkJMHgwMDA4Ci0jZGVmaW5lIFBPTExIVVAJCTB4MDAxMAotI2RlZmluZSBQT0xMTlZBTAkweDAwMjAKLQotLyogVGhlIHJlc3Qgc2VlbSB0byBiZSBtb3JlLW9yLWxlc3Mgbm9uc3RhbmRhcmQuIENoZWNrIHRoZW0hICovCi0jZGVmaW5lIFBPTExSRE5PUk0JMHgwMDQwCi0jZGVmaW5lIFBPTExSREJBTkQJMHgwMDgwCi0jZGVmaW5lIFBPTExXUk5PUk0JMHgwMTAwCi0jZGVmaW5lIFBPTExXUkJBTkQJMHgwMjAwCi0jZGVmaW5lIFBPTExNU0cJCTB4MDQwMAotI2RlZmluZSBQT0xMUkVNT1ZFCTB4MTAwMAotI2RlZmluZSBQT0xMUkRIVVAgICAgICAgMHgyMDAwCi0KLXN0cnVjdCBwb2xsZmQgewotCWludCBmZDsKLQlzaG9ydCBldmVudHM7Ci0Jc2hvcnQgcmV2ZW50czsKLX07Ci0KLSNlbmRpZgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BvbGwuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaAppbmRleCA1OTU3MDM5Li5hZTFlZDA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3VuaXN0ZC5oCkBAIC02MjEsNiArNjIxLDE1IEBACiBfX1NZU0NBTEwoX19OUl9tb3ZlX3BhZ2VzLCBzeXNfbW92ZV9wYWdlcykKICNkZWZpbmUgX19OUl91dGltZW5zYXQJCTI4MAogX19TWVNDQUxMKF9fTlJfdXRpbWVuc2F0LCBzeXNfdXRpbWVuc2F0KQorI2RlZmluZSBfX0lHTk9SRV9nZXRjcHUJCS8qIGltcGxlbWVudGVkIGFzIGEgdnN5c2NhbGwgKi8KKyNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkyODEKK19fU1lTQ0FMTChfX05SX2Vwb2xsX3B3YWl0LCBzeXNfZXBvbGxfcHdhaXQpCisjZGVmaW5lIF9fTlJfc2lnbmFsZmQJCTI4MgorX19TWVNDQUxMKF9fTlJfc2lnbmFsZmQsIHN5c19zaWduYWxmZCkKKyNkZWZpbmUgX19OUl90aW1lcmZkCQkyODIKK19fU1lTQ0FMTChfX05SX3RpbWVyZmQsIHN5c190aW1lcmZkKQorI2RlZmluZSBfX05SX2V2ZW50ZmQJCTI4MworX19TWVNDQUxMKF9fTlJfZXZlbnRmZCwgc3lzX2V2ZW50ZmQpCiAKICNpZm5kZWYgX19OT19TVFVCUwogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3BvbGwuaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9wb2xsLmgKaW5kZXggNmZkOTQ3Ny4uOWQyZDU5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3BvbGwuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvcG9sbC5oCkBAIC0xMSwyOCArMTEsMTAgQEAKICNpZm5kZWYgX1hURU5TQV9QT0xMX0gKICNkZWZpbmUgX1hURU5TQV9QT0xMX0gKIAotCi0jZGVmaW5lIFBPTExJTgkJMHgwMDAxCi0jZGVmaW5lIFBPTExQUkkJCTB4MDAwMgotI2RlZmluZSBQT0xMT1VUCQkweDAwMDQKLQotI2RlZmluZSBQT0xMRVJSCQkweDAwMDgKLSNkZWZpbmUgUE9MTEhVUAkJMHgwMDEwCi0jZGVmaW5lIFBPTExOVkFMCTB4MDAyMAotCi0jZGVmaW5lIFBPTExSRE5PUk0JMHgwMDQwCi0jZGVmaW5lIFBPTExSREJBTkQJMHgwMDgwCiAjZGVmaW5lIFBPTExXUk5PUk0JUE9MTE9VVAogI2RlZmluZSBQT0xMV1JCQU5ECTB4MDEwMAotCi0jZGVmaW5lIFBPTExNU0cJCTB4MDQwMAogI2RlZmluZSBQT0xMUkVNT1ZFCTB4MDgwMAotI2RlZmluZSBQT0xMUkRIVVAgICAgICAgMHgyMDAwCiAKLXN0cnVjdCBwb2xsZmQgewotCWludCBmZDsKLQlzaG9ydCBldmVudHM7Ci0Jc2hvcnQgcmV2ZW50czsKLX07CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcG9sbC5oPgogCiAjZW5kaWYgLyogX1hURU5TQV9QT0xMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKaW5kZXggOTRjYzA0YS4uYmNkMDFmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKQEAgLTE0MCw3ICsxNDAsNiBAQAogaGVhZGVyLXkgKz0gc29ja2lvcy5oCiBoZWFkZXIteSArPSBzb20uaAogaGVhZGVyLXkgKz0gc291bmQuaAotaGVhZGVyLXkgKz0gc3luY2xpbmsuaAogaGVhZGVyLXkgKz0gdGFza3N0YXRzLmgKIGhlYWRlci15ICs9IHRlbGVwaG9ueS5oCiBoZWFkZXIteSArPSB0ZXJtaW9zLmgKQEAgLTE5MSw2ICsxOTAsNyBAQAogdW5pZmRlZi15ICs9IGVycnF1ZXVlLmgKIHVuaWZkZWYteSArPSBldGh0b29sLmgKIHVuaWZkZWYteSArPSBldmVudHBvbGwuaAordW5pZmRlZi15ICs9IHNpZ25hbGZkLmgKIHVuaWZkZWYteSArPSBleHQyX2ZzLmgKIHVuaWZkZWYteSArPSBleHQzX2ZzLmgKIHVuaWZkZWYteSArPSBmYi5oCkBAIC0zMjAsNiArMzIwLDcgQEAKIHVuaWZkZWYteSArPSBzb3VuZGNhcmQuaAogdW5pZmRlZi15ICs9IHN0YXQuaAogdW5pZmRlZi15ICs9IHN0ZGRlZi5oCit1bmlmZGVmLXkgKz0gc3luY2xpbmsuaAogdW5pZmRlZi15ICs9IHN5c2N0bC5oCiB1bmlmZGVmLXkgKz0gdGNwLmgKIHVuaWZkZWYteSArPSB0aW1lLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWlvLmggYi9pbmNsdWRlL2xpbnV4L2Fpby5oCmluZGV4IDQzZGMyZWIuLmI5MDNmYzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9haW8uaApAQCAtMTE5LDYgKzExOSwxMiBAQAogCiAJc3RydWN0IGxpc3RfaGVhZAlraV9saXN0OwkvKiB0aGUgYWlvIGNvcmUgdXNlcyB0aGlzCiAJCQkJCQkgKiBmb3IgY2FuY2VsbGF0aW9uICovCisKKwkvKgorCSAqIElmIHRoZSBhaW9fcmVzZmQgZmllbGQgb2YgdGhlIHVzZXJzcGFjZSBpb2NiIGlzIG5vdCB6ZXJvLAorCSAqIHRoaXMgaXMgdGhlIHVuZGVybHlpbmcgZmlsZSogdG8gZGVsaXZlciBldmVudCB0by4KKwkgKi8KKwlzdHJ1Y3QgZmlsZQkJKmtpX2V2ZW50ZmQ7CiB9OwogCiAjZGVmaW5lIGlzX3N5bmNfa2lvY2IoaW9jYikJKChpb2NiKS0+a2lfa2V5ID09IEtJT0NCX1NZTkNfS0VZKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9haW9fYWJpLmggYi9pbmNsdWRlL2xpbnV4L2Fpb19hYmkuaAppbmRleCBlM2NhMGE0Li45ZTAxNzI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Fpb19hYmkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Fpb19hYmkuaApAQCAtNDUsNiArNDUsMTQgQEAKIAlJT0NCX0NNRF9QV1JJVEVWID0gOCwKIH07CiAKKy8qCisgKiBWYWxpZCBmbGFncyBmb3IgdGhlICJhaW9fZmxhZ3MiIG1lbWJlciBvZiB0aGUgInN0cnVjdCBpb2NiIi4KKyAqCisgKiBJT0NCX0ZMQUdfUkVTRkQgLSBTZXQgaWYgdGhlICJhaW9fcmVzZmQiIG1lbWJlciBvZiB0aGUgInN0cnVjdCBpb2NiIgorICogICAgICAgICAgICAgICAgICAgaXMgdmFsaWQuCisgKi8KKyNkZWZpbmUgSU9DQl9GTEFHX1JFU0ZECQkoMSA8PCAwKQorCiAvKiByZWFkKCkgZnJvbSAvZGV2L2FpbyByZXR1cm5zIHRoZXNlIHN0cnVjdHVyZXMuICovCiBzdHJ1Y3QgaW9fZXZlbnQgewogCV9fdTY0CQlkYXRhOwkJLyogdGhlIGRhdGEgZmllbGQgZnJvbSB0aGUgaW9jYiAqLwpAQCAtODQsNyArOTIsMTUgQEAKIAogCS8qIGV4dHJhIHBhcmFtZXRlcnMgKi8KIAlfX3U2NAlhaW9fcmVzZXJ2ZWQyOwkvKiBUT0RPOiB1c2UgdGhpcyBmb3IgYSAoc3RydWN0IHNpZ2V2ZW50ICopICovCi0JX191NjQJYWlvX3Jlc2VydmVkMzsKKworCS8qIGZsYWdzIGZvciB0aGUgInN0cnVjdCBpb2NiIiAqLworCV9fdTMyCWFpb19mbGFnczsKKworCS8qCisJICogaWYgdGhlIElPQ0JfRkxBR19SRVNGRCBmbGFnIG9mICJhaW9fZmxhZ3MiIGlzIHNldCwgdGhpcyBpcyBhbgorCSAqIGV2ZW50ZmQgdG8gc2lnbmFsIEFJTyByZWFkaW5lc3MgdG8KKwkgKi8KKwlfX3UzMglhaW9fcmVzZmQ7CiB9OyAvKiA2NCBieXRlcyAqLwogCiAjdW5kZWYgSUZCSUcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW5vbl9pbm9kZXMuaCBiL2luY2x1ZGUvbGludXgvYW5vbl9pbm9kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmUxYmEzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9hbm9uX2lub2Rlcy5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiAgaW5jbHVkZS9saW51eC9hbm9uX2lub2Rlcy5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9BTk9OX0lOT0RFU19ICisjZGVmaW5lIF9MSU5VWF9BTk9OX0lOT0RFU19ICisKK2ludCBhbm9uX2lub2RlX2dldGZkKGludCAqcGZkLCBzdHJ1Y3QgaW5vZGUgKipwaW5vZGUsIHN0cnVjdCBmaWxlICoqcGZpbGUsCisJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywKKwkJICAgICB2b2lkICpwcml2KTsKKworI2VuZGlmIC8qIF9MSU5VWF9BTk9OX0lOT0RFU19IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXVkaXQuaCBiL2luY2x1ZGUvbGludXgvYXVkaXQuaAppbmRleCA3NzNlMzBkLi5mY2NjNmU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F1ZGl0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hdWRpdC5oCkBAIC05MSw2ICs5MSw3IEBACiAjZGVmaW5lIEFVRElUX01RX0dFVFNFVEFUVFIJMTMxNQkvKiBQT1NJWCBNUSBnZXQvc2V0IGF0dHJpYnV0ZSByZWNvcmQgdHlwZSAqLwogI2RlZmluZSBBVURJVF9LRVJORUxfT1RIRVIJMTMxNgkvKiBGb3IgdXNlIGJ5IDNyZCBwYXJ0eSBtb2R1bGVzICovCiAjZGVmaW5lIEFVRElUX0ZEX1BBSVIJCTEzMTcgICAgLyogYXVkaXQgcmVjb3JkIGZvciBwaXBlL3NvY2tldHBhaXIgKi8KKyNkZWZpbmUgQVVESVRfT0JKX1BJRAkJMTMxOAkvKiBwdHJhY2UgdGFyZ2V0ICovCiAKICNkZWZpbmUgQVVESVRfQVZDCQkxNDAwCS8qIFNFIExpbnV4IGF2YyBkZW5pYWwgb3IgZ3JhbnQgKi8KICNkZWZpbmUgQVVESVRfU0VMSU5VWF9FUlIJMTQwMQkvKiBJbnRlcm5hbCBTRSBMaW51eCBFcnJvcnMgKi8KQEAgLTExMSw2ICsxMTIsNyBAQAogI2RlZmluZSBBVURJVF9GSVJTVF9LRVJOX0FOT01fTVNHICAgMTcwMAogI2RlZmluZSBBVURJVF9MQVNUX0tFUk5fQU5PTV9NU0cgICAgMTc5OQogI2RlZmluZSBBVURJVF9BTk9NX1BST01JU0NVT1VTICAgICAgMTcwMCAvKiBEZXZpY2UgY2hhbmdlZCBwcm9taXNjdW91cyBtb2RlICovCisjZGVmaW5lIEFVRElUX0FOT01fQUJFTkQgICAgICAgICAgICAxNzAxIC8qIFByb2Nlc3MgZW5kZWQgYWJub3JtYWxseSAqLwogCiAjZGVmaW5lIEFVRElUX0tFUk5FTAkJMjAwMAkvKiBBc3luY2hyb25vdXMgYXVkaXQgcmVjb3JkLiBOT1QgQSBSRVFVRVNULiAqLwogCkBAIC0xNDgsNiArMTUwLDggQEAKICNkZWZpbmUgQVVESVRfQ0xBU1NfUkVBRF8zMiA1CiAjZGVmaW5lIEFVRElUX0NMQVNTX1dSSVRFIDYKICNkZWZpbmUgQVVESVRfQ0xBU1NfV1JJVEVfMzIgNworI2RlZmluZSBBVURJVF9DTEFTU19TSUdOQUwgOAorI2RlZmluZSBBVURJVF9DTEFTU19TSUdOQUxfMzIgOQogCiAvKiBUaGlzIGJpdG1hc2sgaXMgdXNlZCB0byB2YWxpZGF0ZSB1c2VyIGlucHV0LiAgSXQgcmVwcmVzZW50cyBhbGwgYml0cyB0aGF0CiAgKiBhcmUgY3VycmVudGx5IHVzZWQgaW4gYW4gYXVkaXQgZmllbGQgY29uc3RhbnQgdW5kZXJzdG9vZCBieSB0aGUga2VybmVsLgpAQCAtMzM3LDYgKzM0MSw3IEBACiAjZGVmaW5lIEFVRElUU0NfUkVTVUxUKHgpICggKChsb25nKSh4KSk8MD9BVURJVFNDX0ZBSUxVUkU6QVVESVRTQ19TVUNDRVNTICkKIGV4dGVybiBpbnQgX19pbml0IGF1ZGl0X3JlZ2lzdGVyX2NsYXNzKGludCBjbGFzcywgdW5zaWduZWQgKmxpc3QpOwogZXh0ZXJuIGludCBhdWRpdF9jbGFzc2lmeV9zeXNjYWxsKGludCBhYmksIHVuc2lnbmVkIHN5c2NhbGwpOworZXh0ZXJuIGludCBhdWRpdF9jbGFzc2lmeV9hcmNoKGludCBhcmNoKTsKICNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCiAvKiBUaGVzZSBhcmUgZGVmaW5lZCBpbiBhdWRpdHNjLmMgKi8KIAkJCQkvKiBQdWJsaWMgQVBJICovCkBAIC0zNTEsNyArMzU2LDggQEAKIGV4dGVybiB2b2lkIF9fYXVkaXRfaW5vZGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gdm9pZCBfX2F1ZGl0X2lub2RlX2NoaWxkKGNvbnN0IGNoYXIgKmRuYW1lLCBjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCWNvbnN0IHN0cnVjdCBpbm9kZSAqcGFyZW50KTsKLWV4dGVybiB2b2lkIF9fYXVkaXRfaW5vZGVfdXBkYXRlKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQgX19hdWRpdF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0KTsKKwogc3RhdGljIGlubGluZSBpbnQgYXVkaXRfZHVtbXlfY29udGV4dCh2b2lkKQogewogCXZvaWQgKnAgPSBjdXJyZW50LT5hdWRpdF9jb250ZXh0OwpAQCAtMzcyLDkgKzM3OCwxMiBAQAogCWlmICh1bmxpa2VseSghYXVkaXRfZHVtbXlfY29udGV4dCgpKSkKIAkJX19hdWRpdF9pbm9kZV9jaGlsZChkbmFtZSwgaW5vZGUsIHBhcmVudCk7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYXVkaXRfaW5vZGVfdXBkYXRlKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKK3ZvaWQgYXVkaXRfY29yZV9kdW1wcyhsb25nIHNpZ25yKTsKKworc3RhdGljIGlubGluZSB2b2lkIGF1ZGl0X3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCit7CiAJaWYgKHVubGlrZWx5KCFhdWRpdF9kdW1teV9jb250ZXh0KCkpKQotCQlfX2F1ZGl0X2lub2RlX3VwZGF0ZShpbm9kZSk7CisJCV9fYXVkaXRfcHRyYWNlKHQpOwogfQogCiAJCQkJLyogUHJpdmF0ZSBBUEkgKGZvciBhdWRpdC5jIG9ubHkpICovCkBAIC00NDcsNiArNDU2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIGV4dGVybiBpbnQgYXVkaXRfbl9ydWxlczsKK2V4dGVybiBpbnQgYXVkaXRfc2lnbmFsczsKICNlbHNlCiAjZGVmaW5lIGF1ZGl0X2FsbG9jKHQpICh7IDA7IH0pCiAjZGVmaW5lIGF1ZGl0X2ZyZWUodCkgZG8geyA7IH0gd2hpbGUgKDApCkBAIC00NTcsMTAgKzQ2Nyw5IEBACiAjZGVmaW5lIGF1ZGl0X3B1dG5hbWUobikgZG8geyA7IH0gd2hpbGUgKDApCiAjZGVmaW5lIF9fYXVkaXRfaW5vZGUobixpKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgX19hdWRpdF9pbm9kZV9jaGlsZChkLGkscCkgZG8geyA7IH0gd2hpbGUgKDApCi0jZGVmaW5lIF9fYXVkaXRfaW5vZGVfdXBkYXRlKGkpIGRvIHsgOyB9IHdoaWxlICgwKQogI2RlZmluZSBhdWRpdF9pbm9kZShuLGkpIGRvIHsgOyB9IHdoaWxlICgwKQogI2RlZmluZSBhdWRpdF9pbm9kZV9jaGlsZChkLGkscCkgZG8geyA7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGF1ZGl0X2lub2RlX3VwZGF0ZShpKSBkbyB7IDsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYXVkaXRfY29yZV9kdW1wcyhpKSBkbyB7IDsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYXVkaXRzY19nZXRfc3RhbXAoYyx0LHMpIGRvIHsgQlVHKCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGF1ZGl0X2dldF9sb2dpbnVpZChjKSAoeyAtMTsgfSkKICNkZWZpbmUgYXVkaXRfbG9nX3Rhc2tfY29udGV4dChiKSBkbyB7IDsgfSB3aGlsZSAoMCkKQEAgLTQ3Nyw3ICs0ODYsOSBAQAogI2RlZmluZSBhdWRpdF9tcV90aW1lZHJlY2VpdmUoZCxsLHAsdCkgKHsgMDsgfSkKICNkZWZpbmUgYXVkaXRfbXFfbm90aWZ5KGQsbikgKHsgMDsgfSkKICNkZWZpbmUgYXVkaXRfbXFfZ2V0c2V0YXR0cihkLHMpICh7IDA7IH0pCisjZGVmaW5lIGF1ZGl0X3B0cmFjZSh0KSAoKHZvaWQpMCkKICNkZWZpbmUgYXVkaXRfbl9ydWxlcyAwCisjZGVmaW5lIGF1ZGl0X3NpZ25hbHMgMAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVVESVQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGF0LmggYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCmluZGV4IDcwYTE1N2EuLjYzNjUwMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaApAQCAtMjI1LDYgKzIyNSwxMSBAQAogCXJldHVybiBsaHMtPnR2X25zZWMgLSByaHMtPnR2X25zZWM7CiB9CiAKK2V4dGVybiBpbnQgZ2V0X2NvbXBhdF9pdGltZXJzcGVjKHN0cnVjdCBpdGltZXJzcGVjICpkc3QsCisJCQkJIGNvbnN0IHN0cnVjdCBjb21wYXRfaXRpbWVyc3BlYyBfX3VzZXIgKnNyYyk7CitleHRlcm4gaW50IHB1dF9jb21wYXRfaXRpbWVyc3BlYyhzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgX191c2VyICpkc3QsCisJCQkJIGNvbnN0IHN0cnVjdCBpdGltZXJzcGVjICpzcmMpOworCiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19hZGp0aW1leChzdHJ1Y3QgY29tcGF0X3RpbWV4IF9fdXNlciAqdXRwKTsKIAogZXh0ZXJuIGludCBjb21wYXRfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXZlbnRmZC5oIGIvaW5jbHVkZS9saW51eC9ldmVudGZkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2ZWNjNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZXZlbnRmZC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiAgaW5jbHVkZS9saW51eC9ldmVudGZkLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0VWRU5URkRfSAorI2RlZmluZSBfTElOVVhfRVZFTlRGRF9ICisKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmZGVmIENPTkZJR19FVkVOVEZECisKK3N0cnVjdCBmaWxlICpldmVudGZkX2ZnZXQoaW50IGZkKTsKK2ludCBldmVudGZkX3NpZ25hbChzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG4pOworCisjZWxzZSAvKiBDT05GSUdfRVZFTlRGRCAqLworCisjZGVmaW5lIGV2ZW50ZmRfZmdldChmZCkgRVJSX1BUUigtRU5PU1lTKQorI2RlZmluZSBldmVudGZkX3NpZ25hbChmLCBuKSAwCisKKyNlbmRpZiAvKiBDT05GSUdfRVZFTlRGRCAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0xJTlVYX0VWRU5URkRfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dlbmhkLmggYi9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKaW5kZXggZjU4OTU1OS4uNGMwM2VlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZW5oZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2VuaGQuaApAQCAtNDM0LDYgKzQzNCwxMCBAQAogCiAjZW5kaWYKIAotI2VuZGlmCisjZWxzZSAvKiBDT05GSUdfQkxPQ0sgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHByaW50a19hbGxfcGFydGl0aW9ucyh2b2lkKSB7IH0KKworI2VuZGlmIC8qIENPTkZJR19CTE9DSyAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkLmggYi9pbmNsdWRlL2xpbnV4L2hpZC5oCmluZGV4IDM3MDc2YjEuLjgyN2VlNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWQuaApAQCAtMjc1LDYgKzI3NSw3IEBACiAjZGVmaW5lIEhJRF9RVUlSS19MT0dJVEVDSF9ERVNDUklQVE9SCQkweDAwMTAwMDAwCiAjZGVmaW5lIEhJRF9RVUlSS19EVVBMSUNBVEVfVVNBR0VTCQkweDAwMjAwMDAwCiAjZGVmaW5lIEhJRF9RVUlSS19SRVNFVF9MRURTCQkJMHgwMDQwMDAwMAorI2RlZmluZSBISURfUVVJUktfU1dBUFBFRF9NSU5fTUFYCQkweDAwODAwMDAwCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgb2YgdGhlIHBhcnNlci4gVGhpcyBpbmZvcm1hdGlvbiBpcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtaWQuaCBiL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKaW5kZXggMGU4ZGE2OC4uYWE4M2Q0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pMmMtaWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oCkBAIC0xMTcsNiArMTE3LDcgQEAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0lTTDEyMDgJODgJLyogSW50ZXJzaWwgSVNMMTIwOCBSVEMJCSovCiAjZGVmaW5lIEkyQ19EUklWRVJJRF9XTTg3MzEJCTg5CS8qIFdvbGZzb24gV004NzMxIGF1ZGlvIGNvZGVjICovCiAjZGVmaW5lIEkyQ19EUklWRVJJRF9XTTg3NTAJCTkwCS8qIFdvbGZzb24gV004NzUwIGF1ZGlvIGNvZGVjICovCisjZGVmaW5lIEkyQ19EUklWRVJJRF9XTTg3NTMJCTkxCS8qIFdvbGZzb24gV004NzUzIGF1ZGlvIGNvZGVjICovCiAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0kyQ0RFVgk5MDAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0FSUCAgICAgICAgOTAyICAgIC8qIFNNQnVzIEFSUCBDbGllbnQgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaAppbmRleCA0NTE3MGIyLi4yNzZjY2FhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCisrKyBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKQEAgLTY1LDkgKzY1LDkgQEAKIAkucG9zaXhfdGltZXJzCSA9IExJU1RfSEVBRF9JTklUKHNpZy5wb3NpeF90aW1lcnMpLAkJXAogCS5jcHVfdGltZXJzCT0gSU5JVF9DUFVfVElNRVJTKHNpZy5jcHVfdGltZXJzKSwJCVwKIAkucmxpbQkJPSBJTklUX1JMSU1JVFMsCQkJCQlcCi0JLnBncnAJCT0gMSwJCQkJCQlcCisJLnBncnAJCT0gMCwJCQkJCQlcCiAJLnR0eV9vbGRfcGdycCAgID0gTlVMTCwJCQkJCQlcCi0JeyAuX19zZXNzaW9uICAgICAgPSAxfSwJCQkJCQlcCisJeyAuX19zZXNzaW9uICAgICAgPSAwfSwJCQkJCQlcCiB9CiAKIGV4dGVybiBzdHJ1Y3QgbnNwcm94eSBpbml0X25zcHJveHk7CkBAIC04NCwxMCArODQsMzMgQEAKIAkuY291bnQJCT0gQVRPTUlDX0lOSVQoMSksIAkJCQlcCiAJLmFjdGlvbgkJPSB7IHsgeyAuc2FfaGFuZGxlciA9IE5VTEwsIH0gfSwgfSwJCVwKIAkuc2lnbG9jawk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHNpZ2hhbmQuc2lnbG9jayksCVwKKwkuc2lnbmFsZmRfbGlzdAk9IExJU1RfSEVBRF9JTklUKHNpZ2hhbmQuc2lnbmFsZmRfbGlzdCksCVwKIH0KIAogZXh0ZXJuIHN0cnVjdCBncm91cF9pbmZvIGluaXRfZ3JvdXBzOwogCisjZGVmaW5lIElOSVRfU1RSVUNUX1BJRCB7CQkJCQkJXAorCS5jb3VudCAJCT0gQVRPTUlDX0lOSVQoMSksCQkJCVwKKwkubnIJCT0gMCwgCQkJCQkJXAorCS8qIERvbid0IHB1dCB0aGlzIHN0cnVjdCBwaWQgaW4gcGlkX2hhc2ggKi8JCQlcCisJLnBpZF9jaGFpbgk9IHsgLm5leHQgPSBOVUxMLCAucHByZXYgPSBOVUxMIH0sCQlcCisJLnRhc2tzCQk9IHsJCQkJCQlcCisJCXsgLmZpcnN0ID0gJmluaXRfdGFzay5waWRzW1BJRFRZUEVfUElEXS5ub2RlIH0sCQlcCisJCXsgLmZpcnN0ID0gJmluaXRfdGFzay5waWRzW1BJRFRZUEVfUEdJRF0ubm9kZSB9LAlcCisJCXsgLmZpcnN0ID0gJmluaXRfdGFzay5waWRzW1BJRFRZUEVfU0lEXS5ub2RlIH0sCQlcCisJfSwJCQkJCQkJCVwKKwkucmN1CQk9IFJDVV9IRUFEX0lOSVQsCQkJCVwKK30KKworI2RlZmluZSBJTklUX1BJRF9MSU5LKHR5cGUpIAkJCQkJXAorewkJCQkJCQkJXAorCS5ub2RlID0gewkJCQkJCVwKKwkJLm5leHQgPSBOVUxMLAkJCQkJXAorCQkucHByZXYgPSAmaW5pdF9zdHJ1Y3RfcGlkLnRhc2tzW3R5cGVdLmZpcnN0LAlcCisJfSwJCQkJCQkJXAorCS5waWQgPSAmaW5pdF9zdHJ1Y3RfcGlkLAkJCQlcCit9CisKIC8qCiAgKiAgSU5JVF9UQVNLIGlzIHVzZWQgdG8gc2V0IHVwIHRoZSBmaXJzdCB0YXNrIHRhYmxlLCB0b3VjaCBhdAogICogeW91ciBvd24gcmlzayEuIEJhc2U9MCwgbGltaXQ9MHgxZmZmZmYgKD0yTUIpCkBAIC0xMzksNiArMTYyLDExIEBACiAJLmNwdV90aW1lcnMJPSBJTklUX0NQVV9USU1FUlModHNrLmNwdV90aW1lcnMpLAkJXAogCS5mc19leGNsCT0gQVRPTUlDX0lOSVQoMCksCQkJCVwKIAkucGlfbG9jawk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHRzay5waV9sb2NrKSwJCVwKKwkucGlkcyA9IHsJCQkJCQkJXAorCQlbUElEVFlQRV9QSURdICA9IElOSVRfUElEX0xJTksoUElEVFlQRV9QSUQpLAkJXAorCQlbUElEVFlQRV9QR0lEXSA9IElOSVRfUElEX0xJTksoUElEVFlQRV9QR0lEKSwJCVwKKwkJW1BJRFRZUEVfU0lEXSAgPSBJTklUX1BJRF9MSU5LKFBJRFRZUEVfU0lEKSwJCVwKKwl9LAkJCQkJCQkJXAogCUlOSVRfVFJBQ0VfSVJRRkxBR1MJCQkJCQlcCiAJSU5JVF9MT0NLREVQCQkJCQkJCVwKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmggYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCmluZGV4IGY3YjAxYjkuLjUzMjNmNjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaApAQCAtMjQxLDYgKzI0MSwxNiBAQAogI2RlZmluZSBzYXZlX2FuZF9jbGkoeCkJc2F2ZV9hbmRfY2xpKCZ4KQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAorLyogU29tZSBhcmNoaXRlY3R1cmVzIG1pZ2h0IGltcGxlbWVudCBsYXp5IGVuYWJsaW5nL2Rpc2FibGluZyBvZgorICogaW50ZXJydXB0cy4gSW4gc29tZSBjYXNlcywgc3VjaCBhcyBzdG9wX21hY2hpbmUsIHdlIG1pZ2h0IHdhbnQKKyAqIHRvIGVuc3VyZSB0aGF0IGFmdGVyIGEgbG9jYWxfaXJxX2Rpc2FibGUoKSwgaW50ZXJydXB0cyBoYXZlCisgKiByZWFsbHkgYmVlbiBkaXNhYmxlZCBpbiBoYXJkd2FyZS4gU3VjaCBhcmNoaXRlY3R1cmVzIG5lZWQgdG8KKyAqIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGhvb2suCisgKi8KKyNpZm5kZWYgaGFyZF9pcnFfZGlzYWJsZQorI2RlZmluZSBoYXJkX2lycV9kaXNhYmxlKCkJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKwogLyogUExFQVNFLCBhdm9pZCB0byBhbGxvY2F0ZSBuZXcgc29mdGlycXMsIGlmIHlvdSBuZWVkIG5vdCBfcmVhbGx5XyBoaWdoCiAgICBmcmVxdWVuY3kgdGhyZWFkZWQgam9iIHNjaGVkdWxpbmcuIEZvciBhbG1vc3QgYWxsIHRoZSBwdXJwb3NlcwogICAgdGFza2xldHMgYXJlIG1vcmUgdGhhbiBlbm91Z2guIEYuZS4gYWxsIHNlcmlhbCBkZXZpY2UgQkhzIGV0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWwuaAppbmRleCA4NjQ1MTgxLi40NTM1M2Q3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTIxMyw2ICsyMTMsMTcgQEAKIAogZXh0ZXJuIHZvaWQgZHVtcF9zdGFjayh2b2lkKTsKIAorZW51bSB7CisJRFVNUF9QUkVGSVhfTk9ORSwKKwlEVU1QX1BSRUZJWF9BRERSRVNTLAorCURVTVBfUFJFRklYX09GRlNFVAorfTsKK2V4dGVybiB2b2lkIGhleF9kdW1wX3RvX2J1ZmZlcihjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGNoYXIgKmxpbmVidWYsCisJCQkJc2l6ZV90IGxpbmVidWZsZW4pOworZXh0ZXJuIHZvaWQgcHJpbnRfaGV4X2R1bXAoY29uc3QgY2hhciAqbGV2ZWwsIGludCBwcmVmaXhfdHlwZSwKKwkJCQl2b2lkICpidWYsIHNpemVfdCBsZW4pOworI2RlZmluZSBoZXhfYXNjKHgpCSIwMTIzNDU2Nzg5YWJjZGVmIlt4XQorCiAjaWZkZWYgREVCVUcKIC8qIElmIHlvdSBhcmUgd3JpdGluZyBhIGRyaXZlciwgcGxlYXNlIHVzZSBkZXZfZGJnIGluc3RlYWQgKi8KICNkZWZpbmUgcHJfZGVidWcoZm10LGFyZy4uLikgXApAQCAtMjk5LDggKzMxMCw4IEBACiAgKgogICovCiAjZGVmaW5lIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsJCQlcCi0gICAgICAgIGNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsJXAotICAgICAgICAodHlwZSAqKSggKGNoYXIgKilfX21wdHIgLSBvZmZzZXRvZih0eXBlLG1lbWJlcikgKTt9KQorCWNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsJXAorCSh0eXBlICopKCAoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCiAKIC8qCiAgKiBDaGVjayBhdCBjb21waWxlIHRpbWUgdGhhdCBzb21ldGhpbmcgaXMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCA3OTA2ZDc1Li4yN2Q5MzYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTE0MCw3ICsxNDAsNiBAQAogCiAJQVRBX0RGTEFHX1BJTwkJPSAoMSA8PCA4KSwgLyogZGV2aWNlIGxpbWl0ZWQgdG8gUElPIG1vZGUgKi8KIAlBVEFfREZMQUdfTkNRX09GRgk9ICgxIDw8IDkpLCAvKiBkZXZpY2UgbGltaXRlZCB0byBub24tTkNRIG1vZGUgKi8KLQlBVEFfREZMQUdfU1VTUEVOREVECT0gKDEgPDwgMTApLCAvKiBkZXZpY2Ugc3VzcGVuZGVkICovCiAJQVRBX0RGTEFHX0lOSVRfTUFTSwk9ICgxIDw8IDE2KSAtIDEsCiAKIAlBVEFfREZMQUdfREVUQUNICT0gKDEgPDwgMTYpLApAQCAtMTkxLDYgKzE5MCw3IEBACiAJQVRBX1BGTEFHX0xPQURJTkcJPSAoMSA8PCA0KSwgLyogYm9vdC9sb2FkaW5nIHByb2JlICovCiAJQVRBX1BGTEFHX1VOTE9BRElORwk9ICgxIDw8IDUpLCAvKiBtb2R1bGUgaXMgdW5sb2FkaW5nICovCiAJQVRBX1BGTEFHX1NDU0lfSE9UUExVRwk9ICgxIDw8IDYpLCAvKiBTQ1NJIGhvdHBsdWcgc2NoZWR1bGVkICovCisJQVRBX1BGTEFHX0lOSVRJQUxJWklORwk9ICgxIDw8IDcpLCAvKiBiZWluZyBpbml0aWFsaXplZCwgZG9uJ3QgdG91Y2ggKi8KIAogCUFUQV9QRkxBR19GTFVTSF9QT1JUX1RBU0sgPSAoMSA8PCAxNiksIC8qIGZsdXNoIHBvcnQgdGFzayAqLwogCUFUQV9QRkxBR19TVVNQRU5ERUQJPSAoMSA8PCAxNyksIC8qIHBvcnQgaXMgc3VzcGVuZGVkIChwb3dlcikgKi8KQEAgLTI1NCwxMCArMjU0LDYgQEAKIAlBVEFfRE1BX1BBRF9TWgkJPSA0LAogCUFUQV9ETUFfUEFEX0JVRl9TWgk9IEFUQV9ETUFfUEFEX1NaICogQVRBX01BWF9RVUVVRSwKIAotCS8qIG1hc2tzIGZvciBwb3J0IGZ1bmN0aW9ucyAqLwotCUFUQV9QT1JUX1BSSU1BUlkJPSAoMSA8PCAwKSwKLQlBVEFfUE9SVF9TRUNPTkRBUlkJPSAoMSA8PCAxKSwKLQogCS8qIGVyaW5nIHNpemUgKi8KIAlBVEFfRVJJTkdfU0laRQkJPSAzMiwKIApAQCAtMjY4LDEzICsyNjQsOSBAQAogCUFUQV9FSF9SRVZBTElEQVRFCT0gKDEgPDwgMCksCiAJQVRBX0VIX1NPRlRSRVNFVAk9ICgxIDw8IDEpLAogCUFUQV9FSF9IQVJEUkVTRVQJPSAoMSA8PCAyKSwKLQlBVEFfRUhfU1VTUEVORAkJPSAoMSA8PCAzKSwKLQlBVEFfRUhfUkVTVU1FCQk9ICgxIDw8IDQpLAotCUFUQV9FSF9QTV9GUkVFWkUJPSAoMSA8PCA1KSwKIAogCUFUQV9FSF9SRVNFVF9NQVNLCT0gQVRBX0VIX1NPRlRSRVNFVCB8IEFUQV9FSF9IQVJEUkVTRVQsCi0JQVRBX0VIX1BFUkRFVl9NQVNLCT0gQVRBX0VIX1JFVkFMSURBVEUgfCBBVEFfRUhfU1VTUEVORCB8Ci0JCQkJICBBVEFfRUhfUkVTVU1FIHwgQVRBX0VIX1BNX0ZSRUVaRSwKKwlBVEFfRUhfUEVSREVWX01BU0sJPSBBVEFfRUhfUkVWQUxJREFURSwKIAogCS8qIGF0YV9laF9pbmZvLT5mbGFncyAqLwogCUFUQV9FSElfSE9UUExVR0dFRAk9ICgxIDw8IDApLCAgLyogY291bGQgaGF2ZSBiZWVuIGhvdHBsdWdnZWQgKi8KQEAgLTQ2Niw3ICs0NTgsNyBAQAogCXN0cnVjdCBhdGFfZXJpbmcJZXJpbmc7CiAJaW50CQkJc3Bkbl9jbnQ7CiAJdW5zaWduZWQgaW50CQlob3JrYWdlOwkvKiBMaXN0IG9mIGJyb2tlbiBmZWF0dXJlcyAqLwotI2lmZGVmIENPTkZJR19TQVRBX0FDUEkKKyNpZmRlZiBDT05GSUdfQVRBX0FDUEkKIAkvKiBBQ1BJIG9iamVjdHMgaW5mbyAqLwogCWFjcGlfaGFuZGxlIG9ial9oYW5kbGU7CiAjZW5kaWYKQEAgLTY5Myw4ICs2ODUsOCBAQAogZXh0ZXJuIHZvaWQgYXRhX3BvcnRfZGlzYWJsZShzdHJ1Y3QgYXRhX3BvcnQgKik7CiBleHRlcm4gdm9pZCBhdGFfc3RkX3BvcnRzKHN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyKTsKICNpZmRlZiBDT05GSUdfUENJCi1leHRlcm4gaW50IGF0YV9wY2lfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqKnBvcnRfaW5mbywKLQkJCSAgICAgdW5zaWduZWQgaW50IG5fcG9ydHMpOworZXh0ZXJuIGludCBhdGFfcGNpX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKiBjb25zdCAqIHBwaSk7CiBleHRlcm4gdm9pZCBhdGFfcGNpX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKICNpZmRlZiBDT05GSUdfUE0KIGV4dGVybiB2b2lkIGF0YV9wY2lfZGV2aWNlX2RvX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKTsKQEAgLTczNiw4ICs3MjgsNiBAQAogZXh0ZXJuIGludCBhdGFfcG9ydF9vbmxpbmUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gaW50IGF0YV9wb3J0X29mZmxpbmUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAjaWZkZWYgQ09ORklHX1BNCi1leHRlcm4gaW50IGF0YV9zY3NpX2RldmljZV9yZXN1bWUoc3RydWN0IHNjc2lfZGV2aWNlICopOwotZXh0ZXJuIGludCBhdGFfc2NzaV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90IG1lc2cpOwogZXh0ZXJuIGludCBhdGFfaG9zdF9zdXNwZW5kKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCwgcG1fbWVzc2FnZV90IG1lc2cpOwogZXh0ZXJuIHZvaWQgYXRhX2hvc3RfcmVzdW1lKHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CiAjZW5kaWYKQEAgLTg2MSwxMSArODUxLDExIEBACiAJdW5zaWduZWQgbG9uZwkJdmFsOwogfTsKIAotZXh0ZXJuIGludCBhdGFfcGNpX2luaXRfbmF0aXZlX2hvc3Qoc3RydWN0IGF0YV9ob3N0ICpob3N0LAotCQkJCSAgICB1bnNpZ25lZCBpbnQgcG9ydF9tYXNrKTsKK2V4dGVybiBpbnQgYXRhX3BjaV9pbml0X25hdGl2ZV9ob3N0KHN0cnVjdCBhdGFfaG9zdCAqaG9zdCk7CitleHRlcm4gaW50IGF0YV9wY2lfaW5pdF9ibWRtYShzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QpOwogZXh0ZXJuIGludCBhdGFfcGNpX3ByZXBhcmVfbmF0aXZlX2hvc3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKiBjb25zdCAqIHBwaSwKLQkJCQlpbnQgbl9wb3J0cywgc3RydWN0IGF0YV9ob3N0ICoqcl9ob3N0KTsKKwkJCQlzdHJ1Y3QgYXRhX2hvc3QgKipyX2hvc3QpOwogZXh0ZXJuIGludCBwY2lfdGVzdF9jb25maWdfYml0cyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9iaXRzICpiaXRzKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGF0YV9wY2lfZGVmYXVsdF9maWx0ZXIoc3RydWN0IGF0YV9kZXZpY2UgKiwgdW5zaWduZWQgbG9uZyk7CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwpAQCAtMTAwOCwxMSArOTk4LDYgQEAKIAlyZXR1cm4gYXRhX2NsYXNzX2Fic2VudChkZXYtPmNsYXNzKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRhX2Rldl9yZWFkeShjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQotewotCXJldHVybiBhdGFfZGV2X2VuYWJsZWQoZGV2KSAmJiAhKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfU1VTUEVOREVEKTsKLX0KLQogLyoKICAqIHBvcnQgaGVscGVycwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpc3QuaCBiL2luY2x1ZGUvbGludXgvbGlzdC5oCmluZGV4IDkyMDI3MDMuLmYyOWZjOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGlzdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbGlzdC5oCkBAIC0yNjQsOCArMjY0LDggQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewotICAgICAgICBfX2xpc3RfZGVsKGxpc3QtPnByZXYsIGxpc3QtPm5leHQpOwotICAgICAgICBsaXN0X2FkZChsaXN0LCBoZWFkKTsKKwlfX2xpc3RfZGVsKGxpc3QtPnByZXYsIGxpc3QtPm5leHQpOworCWxpc3RfYWRkKGxpc3QsIGhlYWQpOwogfQogCiAvKioKQEAgLTI3Niw4ICsyNzYsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZV90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCiAJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewotICAgICAgICBfX2xpc3RfZGVsKGxpc3QtPnByZXYsIGxpc3QtPm5leHQpOwotICAgICAgICBsaXN0X2FkZF90YWlsKGxpc3QsIGhlYWQpOworCV9fbGlzdF9kZWwobGlzdC0+cHJldiwgbGlzdC0+bmV4dCk7CisJbGlzdF9hZGRfdGFpbChsaXN0LCBoZWFkKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21hZ2ljLmggYi9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKaW5kZXggYTljNjU2Ny4uOWQ3MTNjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tYWdpYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWFnaWMuaApAQCAtMTQsNiArMTQsNyBAQAogI2RlZmluZSBJU09GU19TVVBFUl9NQUdJQwkweDk2NjAKICNkZWZpbmUgSkZGUzJfU1VQRVJfTUFHSUMJMHg3MmI2CiAjZGVmaW5lIEtWTUZTX1NVUEVSX01BR0lDCTB4MTk3MDA0MjYKKyNkZWZpbmUgQU5PTl9JTk9ERV9GU19NQUdJQwkweDA5MDQxOTM0CiAKICNkZWZpbmUgTUlOSVhfU1VQRVJfTUFHSUMJMHgxMzdGCQkvKiBvcmlnaW5hbCBtaW5peCBmcyAqLwogI2RlZmluZSBNSU5JWF9TVVBFUl9NQUdJQzIJMHgxMzhGCQkvKiBtaW5peCBmcywgMzAgY2hhciBuYW1lcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKaW5kZXggNzkyZDQ4My4uZTZlMGY4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCkBAIC0xMjQsNyArMTI0LDcgQEAKICAqLwogI2RlZmluZSBNT0RVTEVfTElDRU5TRShfbGljZW5zZSkgTU9EVUxFX0lORk8obGljZW5zZSwgX2xpY2Vuc2UpCiAKLS8qIEF1dGhvciwgaWRlYWxseSBvZiBmb3JtIE5BTUUgPEVNQUlMPlssIE5BTUUgPEVNQUlMPl0qWyBhbmQgTkFNRSA8RU1BSUw+XSAqLworLyogQXV0aG9yLCBpZGVhbGx5IG9mIGZvcm0gTkFNRVssIE5BTUVdKlsgYW5kIE5BTUVdICovCiAjZGVmaW5lIE1PRFVMRV9BVVRIT1IoX2F1dGhvcikgTU9EVUxFX0lORk8oYXV0aG9yLCBfYXV0aG9yKQogICAKIC8qIFdoYXQgeW91ciBtb2R1bGUgZG9lcy4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXBhZ2UuaCBiL2luY2x1ZGUvbGludXgvbXBhZ2UuaAppbmRleCBjYzVmYjc1Li4wNjhhMGM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21wYWdlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tcGFnZS5oCkBAIC0xMiw3ICsxMiw2IEBACiAjaWZkZWYgQ09ORklHX0JMT0NLCiAKIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbDsKLXR5cGVkZWYgaW50ICh3cml0ZXBhZ2VfdCkoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKIAogaW50IG1wYWdlX3JlYWRwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsCiAJCQkJdW5zaWduZWQgbnJfcGFnZXMsIGdldF9ibG9ja190IGdldF9ibG9jayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCAzMDQ0NjIyLi5mNjcxY2QyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTQ2Nyw2ICs0NjcsOCBAQAogCS8qIGRldmljZSBpbmRleCBoYXNoIGNoYWluICovCiAJc3RydWN0IGhsaXN0X25vZGUJaW5kZXhfaGxpc3Q7CiAKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbGlua193YXRjaF9uZXh0OworCiAJLyogcmVnaXN0ZXIvdW5yZWdpc3RlciBzdGF0ZSBtYWNoaW5lICovCiAJZW51bSB7IE5FVFJFR19VTklOSVRJQUxJWkVEPTAsCiAJICAgICAgIE5FVFJFR19SRUdJU1RFUkVELAkvKiBjb21wbGV0ZWQgcmVnaXN0ZXJfbmV0ZGV2aWNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaAppbmRleCAwMjJlZGZhLi43ZTczM2E2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmgKQEAgLTU0LDYgKzU0LDE0IEBACiAJdW5zaWduZWQgY2hhciBkYXRhWzBdOwogfTsKIAorI2RlZmluZSBYVF9UQVJHRVRfSU5JVChfX25hbWUsIF9fc2l6ZSkJCQkJCSAgICAgICBcCit7CQkJCQkJCQkJICAgICAgIFwKKwkudGFyZ2V0LnUudXNlciA9IHsJCQkJCQkgICAgICAgXAorCQkudGFyZ2V0X3NpemUJPSBYVF9BTElHTihfX3NpemUpLAkJCSAgICAgICBcCisJCS5uYW1lCQk9IF9fbmFtZSwJCQkJICAgICAgIFwKKwl9LAkJCQkJCQkJICAgICAgIFwKK30KKwogc3RydWN0IHh0X3N0YW5kYXJkX3RhcmdldAogewogCXN0cnVjdCB4dF9lbnRyeV90YXJnZXQgdGFyZ2V0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKaW5kZXggMjRjODc4Ni4uNTg0Y2QxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oCkBAIC0yMzgsNiArMjM4LDQ3IEBACiAgKi8KICNpZmRlZiBfX0tFUk5FTF9fCiAKKy8qIFN0YW5kYXJkIGVudHJ5LiAqLworc3RydWN0IGFycHRfc3RhbmRhcmQKK3sKKwlzdHJ1Y3QgYXJwdF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgYXJwdF9zdGFuZGFyZF90YXJnZXQgdGFyZ2V0OworfTsKKworc3RydWN0IGFycHRfZXJyb3JfdGFyZ2V0Cit7CisJc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0IHRhcmdldDsKKwljaGFyIGVycm9ybmFtZVtBUlBUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOworfTsKKworc3RydWN0IGFycHRfZXJyb3IKK3sKKwlzdHJ1Y3QgYXJwdF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgYXJwdF9lcnJvcl90YXJnZXQgdGFyZ2V0OworfTsKKworI2RlZmluZSBBUlBUX0VOVFJZX0lOSVQoX19zaXplKQkJCQkJCSAgICAgICBcCit7CQkJCQkJCQkJICAgICAgIFwKKwkudGFyZ2V0X29mZnNldAk9IHNpemVvZihzdHJ1Y3QgYXJwdF9lbnRyeSksCQkJICAgICAgIFwKKwkubmV4dF9vZmZzZXQJPSAoX19zaXplKSwJCQkJCSAgICAgICBcCit9CisKKyNkZWZpbmUgQVJQVF9TVEFOREFSRF9JTklUKF9fdmVyZGljdCkJCQkJCSAgICAgICBcCit7CQkJCQkJCQkJICAgICAgIFwKKwkuZW50cnkJCT0gQVJQVF9FTlRSWV9JTklUKHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZCkpLCAgICAgICBcCisJLnRhcmdldAkJPSBYVF9UQVJHRVRfSU5JVChBUlBUX1NUQU5EQVJEX1RBUkdFVCwJCSAgICAgICBcCisJCQkJCSBzaXplb2Yoc3RydWN0IGFycHRfc3RhbmRhcmRfdGFyZ2V0KSksIFwKKwkudGFyZ2V0LnZlcmRpY3QJPSAtKF9fdmVyZGljdCkgLSAxLAkJCQkgICAgICAgXAorfQorCisjZGVmaW5lIEFSUFRfRVJST1JfSU5JVAkJCQkJCQkgICAgICAgXAorewkJCQkJCQkJCSAgICAgICBcCisJLmVudHJ5CQk9IEFSUFRfRU5UUllfSU5JVChzaXplb2Yoc3RydWN0IGFycHRfZXJyb3IpKSwJICAgICAgIFwKKwkudGFyZ2V0CQk9IFhUX1RBUkdFVF9JTklUKEFSUFRfRVJST1JfVEFSR0VULAkJICAgICAgIFwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgYXJwdF9lcnJvcl90YXJnZXQpKSwgICAgXAorCS50YXJnZXQuZXJyb3JuYW1lID0gIkVSUk9SIiwJCQkJCSAgICAgICBcCit9CisKICNkZWZpbmUgYXJwdF9yZWdpc3Rlcl90YXJnZXQodGd0KSAJXAogKHsJKHRndCktPmZhbWlseSA9IE5GX0FSUDsJCVwKICAJeHRfcmVnaXN0ZXJfdGFyZ2V0KHRndCk7IH0pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaAppbmRleCA5NTI3Mjk2Li4yZjQ2ZGQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKQEAgLTI5NSw2ICsyOTUsMjggQEAKIAlzdHJ1Y3QgaXB0X2Vycm9yX3RhcmdldCB0YXJnZXQ7CiB9OwogCisjZGVmaW5lIElQVF9FTlRSWV9JTklUKF9fc2l6ZSkJCQkJCQkgICAgICAgXAorewkJCQkJCQkJCSAgICAgICBcCisJLnRhcmdldF9vZmZzZXQJPSBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCQkJICAgICAgIFwKKwkubmV4dF9vZmZzZXQJPSAoX19zaXplKSwJCQkJCSAgICAgICBcCit9CisKKyNkZWZpbmUgSVBUX1NUQU5EQVJEX0lOSVQoX192ZXJkaWN0KQkJCQkJICAgICAgIFwKK3sJCQkJCQkJCQkgICAgICAgXAorCS5lbnRyeQkJPSBJUFRfRU5UUllfSU5JVChzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkpLAkgICAgICAgXAorCS50YXJnZXQJCT0gWFRfVEFSR0VUX0lOSVQoSVBUX1NUQU5EQVJEX1RBUkdFVCwJCSAgICAgICBcCisJCQkJCSBzaXplb2Yoc3RydWN0IHh0X3N0YW5kYXJkX3RhcmdldCkpLCAgIFwKKwkudGFyZ2V0LnZlcmRpY3QJPSAtKF9fdmVyZGljdCkgLSAxLAkJCQkgICAgICAgXAorfQorCisjZGVmaW5lIElQVF9FUlJPUl9JTklUCQkJCQkJCSAgICAgICBcCit7CQkJCQkJCQkJICAgICAgIFwKKwkuZW50cnkJCT0gSVBUX0VOVFJZX0lOSVQoc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3IpKSwJICAgICAgIFwKKwkudGFyZ2V0CQk9IFhUX1RBUkdFVF9JTklUKElQVF9FUlJPUl9UQVJHRVQsCQkgICAgICAgXAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3JfdGFyZ2V0KSksICAgICBcCisJLnRhcmdldC5lcnJvcm5hbWUgPSAiRVJST1IiLAkJCQkJICAgICAgIFwKK30KKwogZXh0ZXJuIHVuc2lnbmVkIGludCBpcHRfZG9fdGFibGUoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAogCQkJCSB1bnNpZ25lZCBpbnQgaG9vaywKIAkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaAppbmRleCA2MWFhMTA0Li40Njg2ZjgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaApAQCAtMTIzLDYgKzEyMywyOCBAQAogCXN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldCB0YXJnZXQ7CiB9OwogCisjZGVmaW5lIElQNlRfRU5UUllfSU5JVChfX3NpemUpCQkJCQkJICAgICAgIFwKK3sJCQkJCQkJCQkgICAgICAgXAorCS50YXJnZXRfb2Zmc2V0CT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwJCQkgICAgICAgXAorCS5uZXh0X29mZnNldAk9IChfX3NpemUpLAkJCQkJICAgICAgIFwKK30KKworI2RlZmluZSBJUDZUX1NUQU5EQVJEX0lOSVQoX192ZXJkaWN0KQkJCQkJICAgICAgIFwKK3sJCQkJCQkJCQkgICAgICAgXAorCS5lbnRyeQkJPSBJUDZUX0VOVFJZX0lOSVQoc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSksICAgICAgIFwKKwkudGFyZ2V0CQk9IFhUX1RBUkdFVF9JTklUKElQNlRfU1RBTkRBUkRfVEFSR0VULAkJICAgICAgIFwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQpKSwgXAorCS50YXJnZXQudmVyZGljdAk9IC0oX192ZXJkaWN0KSAtIDEsCQkJCSAgICAgICBcCit9CisKKyNkZWZpbmUgSVA2VF9FUlJPUl9JTklUCQkJCQkJCSAgICAgICBcCit7CQkJCQkJCQkJICAgICAgIFwKKwkuZW50cnkJCT0gSVA2VF9FTlRSWV9JTklUKHNpemVvZihzdHJ1Y3QgaXA2dF9lcnJvcikpLAkgICAgICAgXAorCS50YXJnZXQJCT0gWFRfVEFSR0VUX0lOSVQoSVA2VF9FUlJPUl9UQVJHRVQsCQkgICAgICAgXAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldCkpLCAgICBcCisJLnRhcmdldC5lcnJvcm5hbWUgPSAiRVJST1IiLAkJCQkJICAgICAgIFwKK30KKwogLyoKICAqIE5ldyBJUCBmaXJld2FsbCBvcHRpb25zIGZvciBbZ3NdZXRzb2Nrb3B0IGF0IHRoZSBSQVcgSVAgbGV2ZWwuCiAgKiBVbmxpa2UgQlNEIExpbnV4IGluaGVyaXRzIElQIG9wdGlvbnMgc28geW91IGRvbid0IGhhdmUgdG8gdXNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IGFlODQ5ZjAuLmNjZDg1ZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC0zNzAsNiArMzcwLDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfSVhQNjAwX1NBVEEJMHg0MzgwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDYwMF9TTUJVUwkweDQzODUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfSVhQNjAwX0lERQkweDQzOGMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfSVhQNzAwX1NBVEEJMHg0MzkwCiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WTFNJCQkweDEwMDQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WTFNJXzgyQzU5MgkweDAwMDUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkLmggYi9pbmNsdWRlL2xpbnV4L3BpZC5oCmluZGV4IDJhYzI3ZjkuLjFlMGU0ZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGlkLmgKKysrIGIvaW5jbHVkZS9saW51eC9waWQuaApAQCAtNTEsNiArNTEsOCBAQAogCXN0cnVjdCByY3VfaGVhZCByY3U7CiB9OwogCitleHRlcm4gc3RydWN0IHBpZCBpbml0X3N0cnVjdF9waWQ7CisKIHN0cnVjdCBwaWRfbGluawogewogCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CkBAIC03Niw4ICs3OCw3IEBACiAgKiB3cml0ZS1oZWxkLgogICovCiBleHRlcm4gaW50IEZBU1RDQUxMKGF0dGFjaF9waWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJCWVudW0gcGlkX3R5cGUgdHlwZSwgaW50IG5yKSk7Ci0KKwkJCQllbnVtIHBpZF90eXBlIHR5cGUsIHN0cnVjdCBwaWQgKnBpZCkpOwogZXh0ZXJuIHZvaWQgRkFTVENBTEwoZGV0YWNoX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGVudW0gcGlkX3R5cGUpKTsKIGV4dGVybiB2b2lkIEZBU1RDQUxMKHRyYW5zZmVyX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9sZCwKIAkJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3LCBlbnVtIHBpZF90eXBlKSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggMTdiNzJkOC4uYTgxODk3ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtODgsNiArODgsNyBAQAogCiBzdHJ1Y3QgZXhlY19kb21haW47CiBzdHJ1Y3QgZnV0ZXhfcGlfc3RhdGU7CitzdHJ1Y3QgYmlvOwogCiAvKgogICogTGlzdCBvZiBmbGFncyB3ZSB3YW50IHRvIHNoYXJlIGZvciBrZXJuZWwgdGhyZWFkcywKQEAgLTM5MSw2ICszOTIsNyBAQAogCWF0b21pY190CQljb3VudDsKIAlzdHJ1Y3Qga19zaWdhY3Rpb24JYWN0aW9uW19OU0lHXTsKIAlzcGlubG9ja190CQlzaWdsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgIHNpZ25hbGZkX2xpc3Q7CiB9OwogCiBzdHJ1Y3QgcGFjY3Rfc3RydWN0IHsKQEAgLTQ2OSw2ICs0NzEsNyBAQAogCWNwdXRpbWVfdCB1dGltZSwgc3RpbWUsIGN1dGltZSwgY3N0aW1lOwogCXVuc2lnbmVkIGxvbmcgbnZjc3csIG5pdmNzdywgY252Y3N3LCBjbml2Y3N3OwogCXVuc2lnbmVkIGxvbmcgbWluX2ZsdCwgbWFqX2ZsdCwgY21pbl9mbHQsIGNtYWpfZmx0OworCXVuc2lnbmVkIGxvbmcgaW5ibG9jaywgb3VibG9jaywgY2luYmxvY2ssIGNvdWJsb2NrOwogCiAJLyoKIAkgKiBDdW11bGF0aXZlIG5zIG9mIHNjaGVkdWxlZCBDUFUgdGltZSBmb3IgZGVhZCB0aHJlYWRzIGluIHRoZQpAQCAtMTAxNCw2ICsxMDE3LDkgQEAKIC8qIGpvdXJuYWxsaW5nIGZpbGVzeXN0ZW0gaW5mbyAqLwogCXZvaWQgKmpvdXJuYWxfaW5mbzsKIAorLyogc3RhY2tlZCBibG9jayBkZXZpY2UgaW5mbyAqLworCXN0cnVjdCBiaW8gKmJpb19saXN0LCAqKmJpb190YWlsOworCiAvKiBWTSBzdGF0ZSAqLwogCXN0cnVjdCByZWNsYWltX3N0YXRlICpyZWNsYWltX3N0YXRlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zaWduYWwuaAppbmRleCAzZmEwZmFiLi45YTVlYWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKQEAgLTIzMyw2ICsyMzMsNyBAQAogCXJldHVybiBzaWcgPD0gX05TSUcgPyAxIDogMDsKIH0KIAorZXh0ZXJuIGludCBuZXh0X3NpZ25hbChzdHJ1Y3Qgc2lncGVuZGluZyAqcGVuZGluZywgc2lnc2V0X3QgKm1hc2spOwogZXh0ZXJuIGludCBncm91cF9zZW5kX3NpZ19pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogZXh0ZXJuIGludCBfX2dyb3VwX3NlbmRfc2lnX2luZm8oaW50LCBzdHJ1Y3Qgc2lnaW5mbyAqLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gbG9uZyBkb19zaWdwZW5kaW5nKHZvaWQgX191c2VyICosIHVuc2lnbmVkIGxvbmcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaWduYWxmZC5oIGIvaW5jbHVkZS9saW51eC9zaWduYWxmZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMDQyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NpZ25hbGZkLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqICBpbmNsdWRlL2xpbnV4L3NpZ25hbGZkLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX1NJR05BTEZEX0gKKyNkZWZpbmUgX0xJTlVYX1NJR05BTEZEX0gKKworCitzdHJ1Y3Qgc2lnbmFsZmRfc2lnaW5mbyB7CisJX191MzIgc2lnbm87CisJX19zMzIgZXJyOworCV9fczMyIGNvZGU7CisJX191MzIgcGlkOworCV9fdTMyIHVpZDsKKwlfX3MzMiBmZDsKKwlfX3UzMiB0aWQ7CisJX191MzIgYmFuZDsKKwlfX3UzMiBvdmVycnVuOworCV9fdTMyIHRyYXBubzsKKwlfX3MzMiBzdGF0dXM7CisJX19zMzIgc3ZpbnQ7CisJX191NjQgc3ZwdHI7CisJX191NjQgdXRpbWU7CisJX191NjQgc3RpbWU7CisJX191NjQgYWRkcjsKKworCS8qCisJICogUGFkIHN0cmN0dXJlIHRvIDEyOCBieXRlcy4gUmVtZW1iZXIgdG8gdXBkYXRlIHRoZQorCSAqIHBhZCBzaXplIHdoZW4geW91IGFkZCBuZXcgbWVtZWJlcnMuIFdlIHVzZSBhIGZpeGVkCisJICogc2l6ZSBzdHJ1Y3R1cmUgdG8gYXZvaWQgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyB3aXRoCisJICogZnV0dXJlIHZlcnNpb25zLCBhbmQgd2UgbGVhdmUgZXh0cmEgc3BhY2UgZm9yIGFkZGl0aW9uYWwKKwkgKiBtZW1iZXJzLiBXZSB1c2UgZml4ZWQgc2l6ZSBtZW1iZXJzIGJlY2F1c2UgdGhpcyBzdHJjdHVyZQorCSAqIGNvbWVzIG91dCBvZiBhIHJlYWQoMikgYW5kIHdlIHJlYWxseSBkb24ndCB3YW50IHRvIGhhdmUKKwkgKiBhIGNvbXBhdCBvbiByZWFkKDIpLgorCSAqLworCV9fdTggX19wYWRbNDhdOworfTsKKworCisjaWZkZWYgX19LRVJORUxfXworCisjaWZkZWYgQ09ORklHX1NJR05BTEZECisKKy8qCisgKiBEZWxpdmVyIHRoZSBzaWduYWwgdG8gbGlzdGVuaW5nIHNpZ25hbGZkLiBUaGlzIG11c3QgYmUgY2FsbGVkCisgKiB3aXRoIHRoZSBzaWdoYW5kIGxvY2sgaGVsZC4gU2FtZSBhcmUgdGhlIGZvbGxvd2luZyB0aGF0IGVuZCB1cAorICogY2FsbGluZyBzaWduYWxmZF9kZWxpdmVyKCkuCisgKi8KK3ZvaWQgc2lnbmFsZmRfZGVsaXZlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IHNpZyk7CisKKy8qCisgKiBObyBuZWVkIHRvIGZhbGwgaW5zaWRlIHNpZ25hbGZkX2RlbGl2ZXIoKSBpZiBubyBzaWduYWwgbGlzdGVuZXJzCisgKiBhcmUgYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2lnbmFsZmRfbm90aWZ5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgc2lnKQoreworCWlmICh1bmxpa2VseSghbGlzdF9lbXB0eSgmdHNrLT5zaWdoYW5kLT5zaWduYWxmZF9saXN0KSkpCisJCXNpZ25hbGZkX2RlbGl2ZXIodHNrLCBzaWcpOworfQorCisvKgorICogVGhlIHNpZ25hbCAtMSBpcyB1c2VkIHRvIG5vdGlmeSB0aGUgc2lnbmFsZmQgdGhhdCB0aGUgc2lnaGFuZAorICogaXMgb24gaXRzIHdheSB0byBiZSBkZXRhY2hlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNpZ25hbGZkX2RldGFjaF9sb2NrZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJaWYgKHVubGlrZWx5KCFsaXN0X2VtcHR5KCZ0c2stPnNpZ2hhbmQtPnNpZ25hbGZkX2xpc3QpKSkKKwkJc2lnbmFsZmRfZGVsaXZlcih0c2ssIC0xKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNpZ25hbGZkX2RldGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKnNpZ2hhbmQgPSB0c2stPnNpZ2hhbmQ7CisKKwlpZiAodW5saWtlbHkoIWxpc3RfZW1wdHkoJnNpZ2hhbmQtPnNpZ25hbGZkX2xpc3QpKSkgeworCQlzcGluX2xvY2tfaXJxKCZzaWdoYW5kLT5zaWdsb2NrKTsKKwkJc2lnbmFsZmRfZGVsaXZlcih0c2ssIC0xKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZzaWdoYW5kLT5zaWdsb2NrKTsKKwl9Cit9CisKKyNlbHNlIC8qIENPTkZJR19TSUdOQUxGRCAqLworCisjZGVmaW5lIHNpZ25hbGZkX2RlbGl2ZXIodCwgcykgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzaWduYWxmZF9ub3RpZnkodCwgcykgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzaWduYWxmZF9kZXRhY2hfbG9ja2VkKHQpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgc2lnbmFsZmRfZGV0YWNoKHQpIGRvIHsgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIENPTkZJR19TSUdOQUxGRCAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0xJTlVYX1NJR05BTEZEX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeW5jbGluay5oIGIvaW5jbHVkZS9saW51eC9zeW5jbGluay5oCmluZGV4IGM4YjA0MjYuLjU1NjJmYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3luY2xpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5bmNsaW5rLmgKQEAgLTI5MSw0ICsyOTEsMjggQEAKICNkZWZpbmUgTUdTTF9JT0NHR1BJTwkJX0lPUihNR1NMX01BR0lDX0lPQywxNyxzdHJ1Y3QgZ3Bpb19kZXNjKQogI2RlZmluZSBNR1NMX0lPQ1dBSVRHUElPCV9JT1dSKE1HU0xfTUFHSUNfSU9DLDE4LHN0cnVjdCBncGlvX2Rlc2MpCiAKKyNpZmRlZiBfX0tFUk5FTF9fCisvKiBwcm92aWRlIDMyIGJpdCBpb2N0bCBjb21wYXRpYmlsaXR5IG9uIDY0IGJpdCBzeXN0ZW1zICovCisjaWZkZWYgQ09ORklHX0NPTVBBVAorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorc3RydWN0IE1HU0xfUEFSQU1TMzIgeworCWNvbXBhdF91bG9uZ190CW1vZGU7CisJdW5zaWduZWQgY2hhcglsb29wYmFjazsKKwl1bnNpZ25lZCBzaG9ydAlmbGFnczsKKwl1bnNpZ25lZCBjaGFyCWVuY29kaW5nOworCWNvbXBhdF91bG9uZ190CWNsb2NrX3NwZWVkOworCXVuc2lnbmVkIGNoYXIJYWRkcl9maWx0ZXI7CisJdW5zaWduZWQgc2hvcnQJY3JjX3R5cGU7CisJdW5zaWduZWQgY2hhcglwcmVhbWJsZV9sZW5ndGg7CisJdW5zaWduZWQgY2hhcglwcmVhbWJsZTsKKwljb21wYXRfdWxvbmdfdAlkYXRhX3JhdGU7CisJdW5zaWduZWQgY2hhcglkYXRhX2JpdHM7CisJdW5zaWduZWQgY2hhcglzdG9wX2JpdHM7CisJdW5zaWduZWQgY2hhcglwYXJpdHk7Cit9OworI2RlZmluZSBNR1NMX0lPQ1NQQVJBTVMzMiBfSU9XKE1HU0xfTUFHSUNfSU9DLDAsc3RydWN0IE1HU0xfUEFSQU1TMzIpCisjZGVmaW5lIE1HU0xfSU9DR1BBUkFNUzMyIF9JT1IoTUdTTF9NQUdJQ19JT0MsMSxzdHJ1Y3QgTUdTTF9QQVJBTVMzMikKKyNlbmRpZgorI2VuZGlmCisKICNlbmRpZiAvKiBfU1lOQ0xJTktfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCAzMTM5ZjQ0Li5iMDIwNzBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC02MDQsNiArNjA0LDEwIEBACiBhc21saW5rYWdlIGxvbmcgc3lzX3NldF9yb2J1c3RfbGlzdChzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZCBfX3VzZXIgKmhlYWQsCiAJCQkJICAgIHNpemVfdCBsZW4pOwogYXNtbGlua2FnZSBsb25nIHN5c19nZXRjcHUodW5zaWduZWQgX191c2VyICpjcHUsIHVuc2lnbmVkIF9fdXNlciAqbm9kZSwgc3RydWN0IGdldGNwdV9jYWNoZSBfX3VzZXIgKmNhY2hlKTsKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc2lnbmFsZmQoaW50IHVmZCwgc2lnc2V0X3QgX191c2VyICp1c2VyX21hc2ssIHNpemVfdCBzaXplbWFzayk7Cithc21saW5rYWdlIGxvbmcgc3lzX3RpbWVyZmQoaW50IHVmZCwgaW50IGNsb2NraWQsIGludCBmbGFncywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaXRpbWVyc3BlYyBfX3VzZXIgKnV0bXIpOworYXNtbGlua2FnZSBsb25nIHN5c19ldmVudGZkKHVuc2lnbmVkIGludCBjb3VudCk7CiAKIGludCBrZXJuZWxfZXhlY3ZlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICpjb25zdCBhcmd2W10sIGNoYXIgKmNvbnN0IGVudnBbXSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oIGIvaW5jbHVkZS9saW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmgKaW5kZXggZGYyYTMxOS4uMTIxODczMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmgKKysrIGIvaW5jbHVkZS9saW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmgKQEAgLTEwLDExICsxMCwyOSBAQAogCWN1cnJlbnQtPmlvYWMucmVhZF9ieXRlcyArPSBieXRlczsKIH0KIAorLyoKKyAqIFdlIGFwcHJveGltYXRlIG51bWJlciBvZiBibG9ja3MsIGJlY2F1c2Ugd2UgYWNjb3VudCBieXRlcyBvbmx5LgorICogQSAnYmxvY2snIGlzIDUxMiBieXRlcworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGFza19pb19nZXRfaW5ibG9jayhjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIHAtPmlvYWMucmVhZF9ieXRlcyA+PiA5OworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza19pb19hY2NvdW50X3dyaXRlKHNpemVfdCBieXRlcykKIHsKIAljdXJyZW50LT5pb2FjLndyaXRlX2J5dGVzICs9IGJ5dGVzOwogfQogCisvKgorICogV2UgYXBwcm94aW1hdGUgbnVtYmVyIG9mIGJsb2NrcywgYmVjYXVzZSB3ZSBhY2NvdW50IGJ5dGVzIG9ubHkuCisgKiBBICdibG9jaycgaXMgNTEyIGJ5dGVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0YXNrX2lvX2dldF9vdWJsb2NrKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+aW9hYy53cml0ZV9ieXRlcyA+PiA5OworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza19pb19hY2NvdW50X2NhbmNlbGxlZF93cml0ZShzaXplX3QgYnl0ZXMpCiB7CiAJY3VycmVudC0+aW9hYy5jYW5jZWxsZWRfd3JpdGVfYnl0ZXMgKz0gYnl0ZXM7CkBAIC0zMSwxMCArNDksMjAgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRhc2tfaW9fZ2V0X2luYmxvY2soY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza19pb19hY2NvdW50X3dyaXRlKHNpemVfdCBieXRlcykKIHsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRhc2tfaW9fZ2V0X291YmxvY2soY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgdGFza19pb19hY2NvdW50X2NhbmNlbGxlZF93cml0ZShzaXplX3QgYnl0ZXMpCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWVyZmQuaCBiL2luY2x1ZGUvbGludXgvdGltZXJmZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmIxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWVyZmQuaApAQCAtMCwwICsxLDE3IEBACisvKgorICogIGluY2x1ZGUvbGludXgvdGltZXJmZC5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyAgRGF2aWRlIExpYmVuemkgPGRhdmlkZWxAeG1haWxzZXJ2ZXIub3JnPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9USU1FUkZEX0gKKyNkZWZpbmUgX0xJTlVYX1RJTUVSRkRfSAorCisKKyNkZWZpbmUgVEZEX1RJTUVSX0FCU1RJTUUgKDEgPDwgMCkKKworCisKKyNlbmRpZiAvKiBfTElOVVhfVElNRVJGRF9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdHR5X2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC90dHlfZHJpdmVyLmgKaW5kZXggNjU5NDg3ZS4uODVjOTVjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90dHlfZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC90dHlfZHJpdmVyLmgKQEAgLTUyLDYgKzUyLDExIEBACiAgKiAJVGhpcyByb3V0aW5lIGFsbG93cyB0aGUgdHR5IGRyaXZlciB0byBpbXBsZW1lbnQKICAqCWRldmljZS1zcGVjaWZpYyBpb2N0bCdzLiAgSWYgdGhlIGlvY3RsIG51bWJlciBwYXNzZWQgaW4gY21kCiAgKiAJaXMgbm90IHJlY29nbml6ZWQgYnkgdGhlIGRyaXZlciwgaXQgc2hvdWxkIHJldHVybiBFTk9JT0NUTENNRC4KKyAqCisgKiBsb25nICgqY29tcGF0X2lvY3RsKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisgKiAJICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyAqCisgKiAJaW1wbGVtZW50IGlvY3RsIHByb2Nlc3NpbmcgZm9yIDMyIGJpdCBwcm9jZXNzIG9uIDY0IGJpdCBzeXN0ZW0KICAqIAogICogdm9pZCAoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpOwogICoKQEAgLTEzMiw2ICsxMzcsOCBAQAogCWludCAgKCpjaGFyc19pbl9idWZmZXIpKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogCWludCAgKCppb2N0bCkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAogCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCWxvbmcgKCpjb21wYXRfaW9jdGwpKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogCXZvaWQgKCpzZXRfdGVybWlvcykoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICogb2xkKTsKIAl2b2lkICgqdGhyb3R0bGUpKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KTsKIAl2b2lkICgqdW50aHJvdHRsZSkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOwpAQCAtMTkzLDYgKzIwMCw4IEBACiAJaW50ICAoKmNoYXJzX2luX2J1ZmZlcikoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAJaW50ICAoKmlvY3RsKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCiAJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisJbG9uZyAoKmNvbXBhdF9pb2N0bCkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAJdm9pZCAoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpOwogCXZvaWQgKCp0aHJvdHRsZSkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHkpOwogCXZvaWQgKCp1bnRocm90dGxlKShzdHJ1Y3QgdHR5X3N0cnVjdCAqIHR0eSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oIGIvaW5jbHVkZS9saW51eC90dHlfbGRpc2MuaAppbmRleCBkNzU5MzJlLi42MjI2NTA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3R0eV9sZGlzYy5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5X2xkaXNjLmgKQEAgLTU5LDYgKzU5LDExIEBACiAgKiAJbG93LWxldmVsIGRyaXZlciBjYW4gImdyYWIiIGFuIGlvY3RsIHJlcXVlc3QgYmVmb3JlIHRoZSBsaW5lCiAgKiAJZGlzY3BsaW5lIGhhcyBhIGNoYW5jZSB0byBzZWUgaXQuCiAgKiAKKyAqIGxvbmcJKCpjb21wYXRfaW9jdGwpKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5LCBzdHJ1Y3QgZmlsZSAqIGZpbGUsCisgKiAJCSAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworICoKKyAqICAgICAgUHJvY2VzcyBpb2N0bCBjYWxscyBmcm9tIDMyLWJpdCBwcm9jZXNzIG9uIDY0LWJpdCBzeXN0ZW0KKyAqCiAgKiB2b2lkCSgqc2V0X3Rlcm1pb3MpKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqIG9sZCk7CiAgKgogICogCVRoaXMgZnVuY3Rpb24gbm90aWZpZXMgdGhlIGxpbmUgZGlzY3BsaW5lIHRoYXQgYSBjaGFuZ2UgaGFzCkBAIC0xMTgsNiArMTIzLDggQEAKIAkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmLCBzaXplX3QgbnIpOwkKIAlpbnQJKCppb2N0bCkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisJbG9uZwkoKmNvbXBhdF9pb2N0bCkoc3RydWN0IHR0eV9zdHJ1Y3QgKiB0dHksIHN0cnVjdCBmaWxlICogZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiAJdm9pZAkoKnNldF90ZXJtaW9zKShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3Qga3Rlcm1pb3MgKiBvbGQpOwogCXVuc2lnbmVkIGludCAoKnBvbGwpKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICosCiAJCQkgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmggYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCmluZGV4IGRhYTZjMTIuLjA1MDkxNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKKysrIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaApAQCAtMTExLDkgKzExMSwxNSBAQAogCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWRfbnIobWFwcGluZywgMSk7CiB9CiAKK3R5cGVkZWYgaW50ICgqd3JpdGVwYWdlX3QpKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKKwkJCQl2b2lkICpkYXRhKTsKKwogaW50IHBkZmx1c2hfb3BlcmF0aW9uKHZvaWQgKCpmbikodW5zaWduZWQgbG9uZyksIHVuc2lnbmVkIGxvbmcgYXJnMCk7Ci1leHRlcm4gaW50IGdlbmVyaWNfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCSAgICAgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKK2ludCBnZW5lcmljX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCSAgICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CitpbnQgd3JpdGVfY2FjaGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCSAgICAgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLCB3cml0ZXBhZ2VfdCB3cml0ZXBhZ2UsCisJCSAgICAgIHZvaWQgKmRhdGEpOwogaW50IGRvX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKTsKIGludCBzeW5jX3BhZ2VfcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQlsb2ZmX3QgcG9zLCBsb2ZmX3QgY291bnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2LmggYi9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaAppbmRleCA3OTZiY2YxLi5kM2Y0ZjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaAorKysgYi9pbmNsdWRlL21lZGlhL3NhYTcxNDYuaApAQCAtNTgsNiArNTgsNyBAQAogCXVuc2lnbmVkIGxvbmcJb2Zmc2V0OwogCS8qIHVzZWQgZm9yIGN1c3RvbSBwYWdldGFibGVzICh1c2VkIGZvciBleGFtcGxlIGJ5IGJ1ZGdldCBkdmIgY2FyZHMpICovCiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzbGlzdDsKKwlpbnQJCW5lbnRzOwogfTsKIAogc3RydWN0IHNhYTcxNDZfcGNpX2V4dGVuc2lvbl9kYXRhIHsKQEAgLTE1Nyw2ICsxNTgsNyBAQAogdm9pZCBzYWE3MTQ2X3BndGFibGVfZnJlZShzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3Qgc2FhNzE0Nl9wZ3RhYmxlICpwdCk7CiBpbnQgc2FhNzE0Nl9wZ3RhYmxlX2J1aWxkX3NpbmdsZShzdHJ1Y3QgcGNpX2RldiAqcGNpLCBzdHJ1Y3Qgc2FhNzE0Nl9wZ3RhYmxlICpwdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpsaXN0LCBpbnQgbGVuZ3RoICk7CiBjaGFyICpzYWE3MTQ2X3ZtYWxsb2NfYnVpbGRfcGd0YWJsZShzdHJ1Y3QgcGNpX2RldiAqcGNpLCBsb25nIGxlbmd0aCwgc3RydWN0IHNhYTcxNDZfcGd0YWJsZSAqcHQpOwordm9pZCBzYWE3MTQ2X3ZmcmVlX2Rlc3Ryb3lfcGd0YWJsZShzdHJ1Y3QgcGNpX2RldiAqcGNpLCBjaGFyICptZW0sIHN0cnVjdCBzYWE3MTQ2X3BndGFibGUgKnB0KTsKIHZvaWQgc2FhNzE0Nl9zZXRncGlvKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBpbnQgcG9ydCwgdTMyIGRhdGEpOwogaW50IHNhYTcxNDZfd2FpdF9mb3JfZGViaV9kb25lKHN0cnVjdCBzYWE3MTQ2X2RldiAqZGV2LCBpbnQgbm9idXN5bG9vcCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2FhNzE0Nl92di5oIGIvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2X3Z2LmgKaW5kZXggNTBlMzNiMC4uY2NlMjBlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2X3Z2LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2X3Z2LmgKQEAgLTIxNiw2ICsyMTYsOCBAQAogZXh0ZXJuIHN0cnVjdCBzYWE3MTQ2X3VzZV9vcHMgc2FhNzE0Nl92aWRlb191b3BzOwogaW50IHNhYTcxNDZfc3RhcnRfcHJldmlldyhzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmgpOwogaW50IHNhYTcxNDZfc3RvcF9wcmV2aWV3KHN0cnVjdCBzYWE3MTQ2X2ZoICpmaCk7CitpbnQgc2FhNzE0Nl92aWRlb19kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CiAKIC8qIGZyb20gc2FhNzE0Nl92YmkuYyAqLwogZXh0ZXJuIHN0cnVjdCBzYWE3MTQ2X3VzZV9vcHMgc2FhNzE0Nl92YmlfdW9wczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAppbmRleCAxYzZiOGJkLi40NzMyNDMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCkBAIC0xODMsMTMgKzE4Myw2IEBACiAKIGV4dGVybiB2b2lkIG5mX2Nvbm50cmFja19mbHVzaCh2b2lkKTsKIAotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKLW5mX2N0X2hlbHBlcl9maW5kX2dldCggY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpOwotZXh0ZXJuIHZvaWQgbmZfY3RfaGVscGVyX3B1dChzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyKTsKLQotZXh0ZXJuIHN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICoKLV9fbmZfY29ubnRyYWNrX2hlbHBlcl9maW5kX2J5bmFtZShjb25zdCBjaGFyICpuYW1lKTsKLQogZXh0ZXJuIGludCBuZl9jdF9pbnZlcnRfdHVwbGVwcihzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICppbnZlcnNlLAogCQkJCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm9yaWcpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oCmluZGV4IGYzMmY3MTQuLjk2YTU4ZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oCkBAIC01Niw5ICs1Niw2IEBACiAJICovCiAJaW50ICgqbmV3KShzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAotCS8qIENhbGxlZCB3aGVuIGEgY29ubnRyYWNrIGVudHJ5IGlzIGRlc3Ryb3llZCAqLwotCXZvaWQgKCpkZXN0cm95KShzdHJ1Y3QgbmZfY29ubiAqY29ubnRyYWNrKTsKLQogCS8qCiAJICogQ2FsbGVkIGJlZm9yZSB0cmFja2luZy4gCiAJICoJKmRhdGFvZmY6IG9mZnNldCBvZiBwcm90b2NvbCBoZWFkZXIgKFRDUCwgVURQLC4uLikgaW4gKnBza2IKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmgKaW5kZXggZTc2NTY1NC4uZjk3NDMxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmgKQEAgLTEwLDE2ICsxMCwxMSBAQAogCQkJICAgIHVuc2lnbmVkIGludCBob29rbnVtLAogCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJICAgIHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCSAgICBzdHJ1Y3QgbmZfbmF0X2luZm8gKmluZm8pOworCQkJICAgIHN0cnVjdCBuZl9jb25uICpjdCk7CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQKLWFsbG9jX251bGxfYmluZGluZyhzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCSAgIHN0cnVjdCBuZl9uYXRfaW5mbyAqaW5mbywKLQkJICAgdW5zaWduZWQgaW50IGhvb2tudW0pOworYWxsb2NfbnVsbF9iaW5kaW5nKHN0cnVjdCBuZl9jb25uICpjdCwgdW5zaWduZWQgaW50IGhvb2tudW0pOwogCiBleHRlcm4gdW5zaWduZWQgaW50Ci1hbGxvY19udWxsX2JpbmRpbmdfY29uZmlybWVkKHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCSAgICAgc3RydWN0IG5mX25hdF9pbmZvICppbmZvLAotCQkJICAgICB1bnNpZ25lZCBpbnQgaG9va251bSk7CithbGxvY19udWxsX2JpbmRpbmdfY29uZmlybWVkKHN0cnVjdCBuZl9jb25uICpjdCwgdW5zaWduZWQgaW50IGhvb2tudW0pOwogI2VuZGlmIC8qIF9ORl9OQVRfUlVMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC91ZHAuaCBiL2luY2x1ZGUvbmV0L3VkcC5oCmluZGV4IDk4NzU1ZWIuLjQ5NmY4OWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3VkcC5oCisrKyBiL2luY2x1ZGUvbmV0L3VkcC5oCkBAIC0xMTksOSArMTE5LDE2IEBACiB9CiAKIAorc3RydWN0IHVkcF9nZXRfcG9ydF9vcHMgeworCWludCAoKnNhZGRyX2NtcCkoY29uc3Qgc3RydWN0IHNvY2sgKnNrMSwgY29uc3Qgc3RydWN0IHNvY2sgKnNrMik7CisJaW50ICgqc2FkZHJfYW55KShjb25zdCBzdHJ1Y3Qgc29jayAqc2spOworCXVuc2lnbmVkIGludCAoKmhhc2hfcG9ydF9hbmRfcmN2X3NhZGRyKShfX3UxNiBwb3J0LAorCQkJCQkJY29uc3Qgc3RydWN0IHNvY2sgKnNrKTsKK307CisKIC8qIG5ldC9pcHY0L3VkcC5jICovCiBleHRlcm4gaW50CXVkcF9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0sCi0JCQkgICAgIGludCAoKnNhZGRyX2NtcCkoY29uc3Qgc3RydWN0IHNvY2sgKiwgY29uc3Qgc3RydWN0IHNvY2sgKikpOworCQkJICAgICBjb25zdCBzdHJ1Y3QgdWRwX2dldF9wb3J0X29wcyAqb3BzKTsKIGV4dGVybiB2b2lkCXVkcF9lcnIoc3RydWN0IHNrX2J1ZmYgKiwgdTMyKTsKIAogZXh0ZXJuIGludAl1ZHBfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3VkcGxpdGUuaCBiL2luY2x1ZGUvbmV0L3VkcGxpdGUuaAppbmRleCA2MzViMGVhLi41MGI0YjQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC91ZHBsaXRlLmgKKysrIGIvaW5jbHVkZS9uZXQvdWRwbGl0ZS5oCkBAIC0xMjAsNSArMTIwLDUgQEAKIAogZXh0ZXJuIHZvaWQJdWRwbGl0ZTRfcmVnaXN0ZXIodm9pZCk7CiBleHRlcm4gaW50IAl1ZHBsaXRlX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKLQkJCWludCAoKnNjbXApKGNvbnN0IHN0cnVjdCBzb2NrICosIGNvbnN0IHN0cnVjdCBzb2NrICopKTsKKwkJCQkgY29uc3Qgc3RydWN0IHVkcF9nZXRfcG9ydF9vcHMgKm9wcyk7CiAjZW5kaWYJLyogX1VEUExJVEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hazQxMTQuaCBiL2luY2x1ZGUvc291bmQvYWs0MTE0LmgKaW5kZXggYzE0OWQzYjI1Li5kNjQ3ZGFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2FrNDExNC5oCisrKyBiL2luY2x1ZGUvc291bmQvYWs0MTE0LmgKQEAgLTczLDcgKzczLDcgQEAKIAogLyogQUs0MTE0X1JFUV9GT1JNQVQgYml0cyAqLwogI2RlZmluZSBBSzQxMTRfTU9OTwkJKDE8PDcpCS8qIERvdWJsZSBTYW1wbGluZyBGcmVxdWVuY3kgTW9kZTogMCA9IHN0ZXJlbywgMSA9IG1vbm8gKi8KLSNkZWZpbmUgQUs0MTE0X0RJRjIJCSgxPDw1KQkvKiBBdWRpbyBEYXRhIENvbnRyb2wgKi8KKyNkZWZpbmUgQUs0MTE0X0RJRjIJCSgxPDw2KQkvKiBBdWRpbyBEYXRhIENvbnRyb2wgKi8KICNkZWZpbmUgQUs0MTE0X0RJRjEJCSgxPDw1KQkvKiBBdWRpbyBEYXRhIENvbnRyb2wgKi8KICNkZWZpbmUgQUs0MTE0X0RJRjAJCSgxPDw0KQkvKiBBdWRpbyBEYXRhIENvbnRyb2wgKi8KICNkZWZpbmUgQUs0MTE0X0RJRl8xNlIJCSgwKQkJCQkvKiBTVERPOiAxNi1iaXQsIHJpZ2h0IGp1c3RpZmllZCAqLwpAQCAtMTU4LDcgKzE1OCw3IEBACiAjZGVmaW5lIEFLNDExNF9DSEVDS19OT19TVEFUCSgxPDwwKQkvKiBubyBzdGF0aXN0aWNzICovCiAjZGVmaW5lIEFLNDExNF9DSEVDS19OT19SQVRFCSgxPDwxKQkvKiBubyByYXRlIGNoZWNrICovCiAKLSNkZWZpbmUgQUs0MTE0X0NPTlRST0xTCQkxNAorI2RlZmluZSBBSzQxMTRfQ09OVFJPTFMJCTE1CiAKIHR5cGVkZWYgdm9pZCAoYWs0MTE0X3dyaXRlX3QpKHZvaWQgKnByaXZhdGVfZGF0YSwgdW5zaWduZWQgY2hhciBhZGRyLCB1bnNpZ25lZCBjaGFyIGRhdGEpOwogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIChhazQxMTRfcmVhZF90KSh2b2lkICpwcml2YXRlX2RhdGEsIHVuc2lnbmVkIGNoYXIgYWRkcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL21wdTQwMS5oIGIvaW5jbHVkZS9zb3VuZC9tcHU0MDEuaAppbmRleCA4Yzg4MjY3Li5kNWMxMzk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL21wdTQwMS5oCisrKyBiL2luY2x1ZGUvc291bmQvbXB1NDAxLmgKQEAgLTUwLDYgKzUwLDcgQEAKICNkZWZpbmUgTVBVNDAxX0lORk9fSU5URUdSQVRFRAkoMSA8PCAyKQkvKiBpbnRlZ3JhdGVkIGgvdyBwb3J0ICovCiAjZGVmaW5lIE1QVTQwMV9JTkZPX01NSU8JKDEgPDwgMykJLyogTU1JTyBhY2Nlc3MgKi8KICNkZWZpbmUgTVBVNDAxX0lORk9fVFhfSVJRCSgxIDw8IDQpCS8qIGluZGVwZW5kZW50IFRYIGlycSAqLworI2RlZmluZSBNUFU0MDFfSU5GT19VQVJUX09OTFkJKDEgPDwgNSkJLyogTm8gRU5URVJfVUFSVCBjbWQgbmVlZGVkICovCiAKICNkZWZpbmUgTVBVNDAxX01PREVfQklUX0lOUFVUCQkwCiAjZGVmaW5lIE1QVTQwMV9NT0RFX0JJVF9PVVRQVVQJCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcGNtLmggYi9pbmNsdWRlL3NvdW5kL3BjbS5oCmluZGV4IGRlZmY1YTkuLjczMzM0ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvcGNtLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9wY20uaApAQCAtNjAzLDExICs2MDMsOCBAQAogCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJnNuZF9wY21fbGlua19yd2xvY2ssIChmbGFncykpOyBcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIHNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIFwKLQlsaXN0X2Zvcl9lYWNoKHBvcywgJnN1YnN0cmVhbS0+Z3JvdXAtPnN1YnN0cmVhbXMpCi0KLSNkZWZpbmUgc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKSBcCi0JbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSwgbGlua19saXN0KQorI2RlZmluZSBzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgXAorCWxpc3RfZm9yX2VhY2hfZW50cnkocywgJnN1YnN0cmVhbS0+Z3JvdXAtPnN1YnN0cmVhbXMsIGxpbmtfbGlzdCkKIAogc3RhdGljIGlubGluZSBpbnQgc25kX3BjbV9ydW5uaW5nKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmggYi9pbmNsdWRlL3NvdW5kL3ZlcnNpb24uaAppbmRleCA0MmExOGNjLi5lODIwZjBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL3NvdW5kL3ZlcnNpb24uaApAQCAtMSwzICsxLDMgQEAKIC8qIGluY2x1ZGUvdmVyc2lvbi5oLiAgR2VuZXJhdGVkIGJ5IGFsc2Eva3N5bmMgc2NyaXB0LiAgKi8KLSNkZWZpbmUgQ09ORklHX1NORF9WRVJTSU9OICIxLjAuMTRyYzMiCi0jZGVmaW5lIENPTkZJR19TTkRfREFURSAiIChXZWQgTWFyIDE0IDA3OjI1OjUwIDIwMDcgVVRDKSIKKyNkZWZpbmUgQ09ORklHX1NORF9WRVJTSU9OICIxLjAuMTRyYzQiCisjZGVmaW5lIENPTkZJR19TTkRfREFURSAiIChXZWQgTWF5IDA5IDA5OjUxOjM5IDIwMDcgVVRDKSIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdmlkZW8vYXRtZWxfbGNkYy5oIGIvaW5jbHVkZS92aWRlby9hdG1lbF9sY2RjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlYTYzNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdmlkZW8vYXRtZWxfbGNkYy5oCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogIEhlYWRlciBmaWxlIGZvciBBVDkxL0FUMzIgTENEIENvbnRyb2xsZXIKKyAqCisgKiAgRGF0YSBzdHJ1Y3R1cmUgYW5kIHJlZ2lzdGVyIHVzZXIgaW50ZXJmYWNlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfX0FUTUVMX0xDRENfSF9fCisjZGVmaW5lIF9fQVRNRUxfTENEQ19IX18KKworIC8qIExDRCBDb250cm9sbGVyIGluZm8gZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBhdG1lbF9sY2RmYl9pbmZvIHsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBmYl9pbmZvCQkqaW5mbzsKKwl2b2lkIF9faW9tZW0JCSptbWlvOworCXVuc2lnbmVkIGxvbmcJCWlycV9iYXNlOworCisJdW5zaWduZWQgaW50CQlndWFyZF90aW1lOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBkZXY7CisJc3RydWN0IGNsawkJKmJ1c19jbGs7CisJc3RydWN0IGNsawkJKmxjZGNfY2xrOworCXVuc2lnbmVkIGludAkJZGVmYXVsdF9icHA7CisJdW5zaWduZWQgaW50CQlkZWZhdWx0X2xjZGNvbjI7CisJdW5zaWduZWQgaW50CQlkZWZhdWx0X2RtYWNvbjsKKwl2b2lkICgqYXRtZWxfbGNkZmJfcG93ZXJfY29udHJvbCkoaW50IG9uKTsKKwlzdHJ1Y3QgZmJfbW9uc3BlY3MJKmRlZmF1bHRfbW9uc3BlY3M7CisJdTMyCQkJcHNldWRvX3BhbGV0dGVbMTZdOworfTsKKworI2RlZmluZSBBVE1FTF9MQ0RDX0RNQUJBRERSMQkweDAwCisjZGVmaW5lIEFUTUVMX0xDRENfRE1BQkFERFIyCTB4MDQKKyNkZWZpbmUgQVRNRUxfTENEQ19ETUFGUk1QVDEJMHgwOAorI2RlZmluZSBBVE1FTF9MQ0RDX0RNQUZSTVBUMgkweDBjCisjZGVmaW5lIEFUTUVMX0xDRENfRE1BRlJNQUREMQkweDEwCisjZGVmaW5lIEFUTUVMX0xDRENfRE1BRlJNQUREMgkweDE0CisKKyNkZWZpbmUgQVRNRUxfTENEQ19ETUFGUk1DRkcJMHgxOAorI2RlZmluZQlBVE1FTF9MQ0RDX0ZSU0laRQkoMHg3ZmZmZmYgPDwgIDApCisjZGVmaW5lCUFUTUVMX0xDRENfQkxFTkdUSF9PRkZTRVQJMjQKKyNkZWZpbmUJQVRNRUxfTENEQ19CTEVOR1RICSgweDdmICAgICA8PCBBVE1FTF9MQ0RDX0JMRU5HVEhfT0ZGU0VUKQorCisjZGVmaW5lIEFUTUVMX0xDRENfRE1BQ09OCTB4MWMKKyNkZWZpbmUJQVRNRUxfTENEQ19ETUFFTgkoMHgxIDw8IDApCisjZGVmaW5lCUFUTUVMX0xDRENfRE1BUlNUCSgweDEgPDwgMSkKKyNkZWZpbmUJQVRNRUxfTENEQ19ETUFCVVNZCSgweDEgPDwgMikKKyNkZWZpbmUJCUFUTUVMX0xDRENfRE1BVVBEVAkoMHgxIDw8IDMpCisjZGVmaW5lCQlBVE1FTF9MQ0RDX0RNQTJERU4JKDB4MSA8PCA0KQorCisjZGVmaW5lIEFUTUVMX0xDRENfRE1BMkRDRkcJMHgyMAorI2RlZmluZQkJQVRNRUxfTENEQ19BRERSSU5DX09GRlNFVAkwCisjZGVmaW5lCQlBVE1FTF9MQ0RDX0FERFJJTkMJCSgweGZmZmYpCisjZGVmaW5lCQlBVE1FTF9MQ0RDX1BJWEVMT0ZGX09GRlNFVAkyNAorI2RlZmluZQkJQVRNRUxfTENEQ19QSVhFTE9GRgkJKDB4MWYgPDwgMjQpCisKKyNkZWZpbmUgQVRNRUxfTENEQ19MQ0RDT04xCTB4MDgwMAorI2RlZmluZQlBVE1FTF9MQ0RDX0JZUEFTUwkoMSAgICAgPDwgIDApCisjZGVmaW5lCUFUTUVMX0xDRENfQ0xLVkFMX09GRlNFVAkxMgorI2RlZmluZQlBVE1FTF9MQ0RDX0NMS1ZBTAkoMHgxZmYgPDwgQVRNRUxfTENEQ19DTEtWQUxfT0ZGU0VUKQorI2RlZmluZQlBVE1FTF9MQ0RDX0xJTkNOVAkoMHg3ZmYgPDwgMjEpCisKKyNkZWZpbmUgQVRNRUxfTENEQ19MQ0RDT04yCTB4MDgwNAorI2RlZmluZQlBVE1FTF9MQ0RDX0RJU1RZUEUJKDMgPDwgMCkKKyNkZWZpbmUJCUFUTUVMX0xDRENfRElTVFlQRV9TVE5NT05PCSgwIDw8IDApCisjZGVmaW5lCQlBVE1FTF9MQ0RDX0RJU1RZUEVfU1ROQ09MT1IJKDEgPDwgMCkKKyNkZWZpbmUJCUFUTUVMX0xDRENfRElTVFlQRV9URlQJCSgyIDw8IDApCisjZGVmaW5lCUFUTUVMX0xDRENfU0NBTk1PRAkoMSA8PCAyKQorI2RlZmluZQkJQVRNRUxfTENEQ19TQ0FOTU9EX1NJTkdMRQkoMCA8PCAyKQorI2RlZmluZQkJQVRNRUxfTENEQ19TQ0FOTU9EX0RVQUwJCSgxIDw8IDIpCisjZGVmaW5lCUFUTUVMX0xDRENfSUZXSURUSAkoMyA8PCAzKQorI2RlZmluZQkJQVRNRUxfTENEQ19JRldJRFRIXzQJCSgwIDw8IDMpCisjZGVmaW5lCQlBVE1FTF9MQ0RDX0lGV0lEVEhfOAkJKDEgPDwgMykKKyNkZWZpbmUJCUFUTUVMX0xDRENfSUZXSURUSF8xNgkJKDIgPDwgMykKKyNkZWZpbmUJQVRNRUxfTENEQ19QSVhFTFNJWkUJKDcgPDwgNSkKKyNkZWZpbmUJCUFUTUVMX0xDRENfUElYRUxTSVpFXzEJCSgwIDw8IDUpCisjZGVmaW5lCQlBVE1FTF9MQ0RDX1BJWEVMU0laRV8yCQkoMSA8PCA1KQorI2RlZmluZQkJQVRNRUxfTENEQ19QSVhFTFNJWkVfNAkJKDIgPDwgNSkKKyNkZWZpbmUJCUFUTUVMX0xDRENfUElYRUxTSVpFXzgJCSgzIDw8IDUpCisjZGVmaW5lCQlBVE1FTF9MQ0RDX1BJWEVMU0laRV8xNgkJKDQgPDwgNSkKKyNkZWZpbmUJCUFUTUVMX0xDRENfUElYRUxTSVpFXzI0CQkoNSA8PCA1KQorI2RlZmluZQkJQVRNRUxfTENEQ19QSVhFTFNJWkVfMzIJCSg2IDw8IDUpCisjZGVmaW5lCUFUTUVMX0xDRENfSU5WVkQJKDEgPDwgOCkKKyNkZWZpbmUJCUFUTUVMX0xDRENfSU5WVkRfTk9STUFMCQkoMCA8PCA4KQorI2RlZmluZQkJQVRNRUxfTENEQ19JTlZWRF9JTlZFUlRFRAkoMSA8PCA4KQorI2RlZmluZQlBVE1FTF9MQ0RDX0lOVkZSQU1FCSgxIDw8IDkgKQorI2RlZmluZQkJQVRNRUxfTENEQ19JTlZGUkFNRV9OT1JNQUwJKDAgPDwgOSkKKyNkZWZpbmUJCUFUTUVMX0xDRENfSU5WRlJBTUVfSU5WRVJURUQJKDEgPDwgOSkKKyNkZWZpbmUJQVRNRUxfTENEQ19JTlZMSU5FCSgxIDw8IDEwKQorI2RlZmluZQkJQVRNRUxfTENEQ19JTlZMSU5FX05PUk1BTAkoMCA8PCAxMCkKKyNkZWZpbmUJCUFUTUVMX0xDRENfSU5WTElORV9JTlZFUlRFRAkoMSA8PCAxMCkKKyNkZWZpbmUJQVRNRUxfTENEQ19JTlZDTEsJKDEgPDwgMTEpCisjZGVmaW5lCQlBVE1FTF9MQ0RDX0lOVkNMS19OT1JNQUwJKDAgPDwgMTEpCisjZGVmaW5lCQlBVE1FTF9MQ0RDX0lOVkNMS19JTlZFUlRFRAkoMSA8PCAxMSkKKyNkZWZpbmUJQVRNRUxfTENEQ19JTlZEVkFMCSgxIDw8IDEyKQorI2RlZmluZQkJQVRNRUxfTENEQ19JTlZEVkFMX05PUk1BTAkoMCA8PCAxMikKKyNkZWZpbmUJCUFUTUVMX0xDRENfSU5WRFZBTF9JTlZFUlRFRAkoMSA8PCAxMikKKyNkZWZpbmUJQVRNRUxfTENEQ19DTEtNT0QJKDEgPDwgMTUpCisjZGVmaW5lCQlBVE1FTF9MQ0RDX0NMS01PRF9BQ1RJVkVESVNQTEFZCSgwIDw8IDE1KQorI2RlZmluZQkJQVRNRUxfTENEQ19DTEtNT0RfQUxXQVlTQUNUSVZFCSgxIDw8IDE1KQorI2RlZmluZQlBVE1FTF9MQ0RDX01FTU9SCSgxIDw8IDMxKQorI2RlZmluZQkJQVRNRUxfTENEQ19NRU1PUl9CSUcJCSgwIDw8IDMxKQorI2RlZmluZQkJQVRNRUxfTENEQ19NRU1PUl9MSVRUTEUJCSgxIDw8IDMxKQorCisjZGVmaW5lIEFUTUVMX0xDRENfVElNMQkJMHgwODA4CisjZGVmaW5lCUFUTUVMX0xDRENfVkZQCQkoMHhmZiA8PCAgMCkKKyNkZWZpbmUJQVRNRUxfTENEQ19WQlBfT0ZGU0VUCQk4CisjZGVmaW5lCUFUTUVMX0xDRENfVkJQCQkoMHhmZiA8PCAgQVRNRUxfTENEQ19WQlBfT0ZGU0VUKQorI2RlZmluZQlBVE1FTF9MQ0RDX1ZQV19PRkZTRVQJCTE2CisjZGVmaW5lCUFUTUVMX0xDRENfVlBXCQkoMHgzZiA8PCBBVE1FTF9MQ0RDX1ZQV19PRkZTRVQpCisjZGVmaW5lCUFUTUVMX0xDRENfVkhETFlfT0ZGU0VUCQkyNAorI2RlZmluZQlBVE1FTF9MQ0RDX1ZIRExZCSgweGYgIDw8IEFUTUVMX0xDRENfVkhETFlfT0ZGU0VUKQorCisjZGVmaW5lIEFUTUVMX0xDRENfVElNMgkJMHgwODBjCisjZGVmaW5lCUFUTUVMX0xDRENfSEJQCQkoMHhmZiAgPDwgIDApCisjZGVmaW5lCUFUTUVMX0xDRENfSFBXX09GRlNFVAkJOAorI2RlZmluZQlBVE1FTF9MQ0RDX0hQVwkJKDB4M2YgIDw8ICBBVE1FTF9MQ0RDX0hQV19PRkZTRVQpCisjZGVmaW5lCUFUTUVMX0xDRENfSEZQX09GRlNFVAkJMjEKKyNkZWZpbmUJQVRNRUxfTENEQ19IRlAJCSgweDdmZiA8PCBBVE1FTF9MQ0RDX0hGUF9PRkZTRVQpCisKKyNkZWZpbmUgQVRNRUxfTENEQ19MQ0RGUk1DRkcJMHgwODEwCisjZGVmaW5lCUFUTUVMX0xDRENfTElORVZBTAkoMHg3ZmYgPDwgIDApCisjZGVmaW5lCUFUTUVMX0xDRENfSE9aVkFMX09GRlNFVAkyMQorI2RlZmluZQlBVE1FTF9MQ0RDX0hPWlZBTAkoMHg3ZmYgPDwgQVRNRUxfTENEQ19IT1pWQUxfT0ZGU0VUKQorCisjZGVmaW5lIEFUTUVMX0xDRENfRklGTwkJMHgwODE0CisjZGVmaW5lCUFUTUVMX0xDRENfRklGT1RICSgweGZmZmYpCisKKyNkZWZpbmUgQVRNRUxfTENEQ19NVkFMCQkweDA4MTgKKworI2RlZmluZSBBVE1FTF9MQ0RDX0RQMV8yCTB4MDgxYworI2RlZmluZSBBVE1FTF9MQ0RDX0RQNF83CTB4MDgyMAorI2RlZmluZSBBVE1FTF9MQ0RDX0RQM181CTB4MDgyNAorI2RlZmluZSBBVE1FTF9MQ0RDX0RQMl8zCTB4MDgyOAorI2RlZmluZSBBVE1FTF9MQ0RDX0RQNV83CTB4MDgyYworI2RlZmluZSBBVE1FTF9MQ0RDX0RQM180CTB4MDgzMAorI2RlZmluZSBBVE1FTF9MQ0RDX0RQNF81CTB4MDgzNAorI2RlZmluZSBBVE1FTF9MQ0RDX0RQNl83CTB4MDgzOAorI2RlZmluZQlBVE1FTF9MQ0RDX0RQMV8yX1ZBTAkoMHhmZikKKyNkZWZpbmUJQVRNRUxfTENEQ19EUDRfN19WQUwJKDB4ZmZmZmZmZikKKyNkZWZpbmUJQVRNRUxfTENEQ19EUDNfNV9WQUwJKDB4ZmZmZmYpCisjZGVmaW5lCUFUTUVMX0xDRENfRFAyXzNfVkFMCSgweGZmZikKKyNkZWZpbmUJQVRNRUxfTENEQ19EUDVfN19WQUwJKDB4ZmZmZmZmZikKKyNkZWZpbmUJQVRNRUxfTENEQ19EUDNfNF9WQUwJKDB4ZmZmZikKKyNkZWZpbmUJQVRNRUxfTENEQ19EUDRfNV9WQUwJKDB4ZmZmZmYpCisjZGVmaW5lCUFUTUVMX0xDRENfRFA2XzdfVkFMCSgweGZmZmZmZmYpCisKKyNkZWZpbmUgQVRNRUxfTENEQ19QV1JDT04JMHgwODNjCisjZGVmaW5lCUFUTUVMX0xDRENfUFdSCQkoMSAgICA8PCAgMCkKKyNkZWZpbmUJQVRNRUxfTENEQ19HVUFSRFRfT0ZGU0VUCTEKKyNkZWZpbmUJQVRNRUxfTENEQ19HVUFSRFQJKDB4N2YgPDwgIEFUTUVMX0xDRENfR1VBUkRUX09GRlNFVCkKKyNkZWZpbmUJQVRNRUxfTENEQ19CVVNZCQkoMSAgICA8PCAzMSkKKworI2RlZmluZSBBVE1FTF9MQ0RDX0NPTlRSQVNUX0NUUgkweDA4NDAKKyNkZWZpbmUJQVRNRUxfTENEQ19QUwkJKDMgPDwgMCkKKyNkZWZpbmUJCUFUTUVMX0xDRENfUFNfRElWMQkJKDAgPDwgMCkKKyNkZWZpbmUJCUFUTUVMX0xDRENfUFNfRElWMgkJKDEgPDwgMCkKKyNkZWZpbmUJCUFUTUVMX0xDRENfUFNfRElWNAkJKDIgPDwgMCkKKyNkZWZpbmUJCUFUTUVMX0xDRENfUFNfRElWOAkJKDMgPDwgMCkKKyNkZWZpbmUJQVRNRUxfTENEQ19QT0wJCSgxIDw8IDIpCisjZGVmaW5lCQlBVE1FTF9MQ0RDX1BPTF9ORUdBVElWRQkJKDAgPDwgMikKKyNkZWZpbmUJCUFUTUVMX0xDRENfUE9MX1BPU0lUSVZFCQkoMSA8PCAyKQorI2RlZmluZQlBVE1FTF9MQ0RDX0VOQQkJKDEgPDwgMykKKyNkZWZpbmUJCUFUTUVMX0xDRENfRU5BX1BXTURJU0FCTEUJKDAgPDwgMykKKyNkZWZpbmUJCUFUTUVMX0xDRENfRU5BX1BXTUVOQUJMRQkoMSA8PCAzKQorCisjZGVmaW5lIEFUTUVMX0xDRENfQ09OVFJBU1RfVkFMCTB4MDg0NAorI2RlZmluZQlBVE1FTF9MQ0RDX0NWQUwJKDB4ZmYpCisKKyNkZWZpbmUgQVRNRUxfTENEQ19JRVIJCTB4MDg0OAorI2RlZmluZSBBVE1FTF9MQ0RDX0lEUgkJMHgwODRjCisjZGVmaW5lIEFUTUVMX0xDRENfSU1SCQkweDA4NTAKKyNkZWZpbmUgQVRNRUxfTENEQ19JU1IJCTB4MDg1NAorI2RlZmluZSBBVE1FTF9MQ0RDX0lDUgkJMHgwODU4CisjZGVmaW5lCUFUTUVMX0xDRENfTE5JCQkoMSA8PCAwKQorI2RlZmluZQlBVE1FTF9MQ0RDX0xTVExOSQkoMSA8PCAxKQorI2RlZmluZQlBVE1FTF9MQ0RDX0VPRkkJCSgxIDw8IDIpCisjZGVmaW5lCUFUTUVMX0xDRENfVUZMV0kJKDEgPDwgNCkKKyNkZWZpbmUJQVRNRUxfTENEQ19PV1JJCQkoMSA8PCA1KQorI2RlZmluZQlBVE1FTF9MQ0RDX01FUkkJCSgxIDw8IDYpCisKKyNkZWZpbmUgQVRNRUxfTENEQ19MVVQobikJKDB4MGMwMCArICgobikqNCkpCisKKyNlbmRpZiAvKiBfX0FUTUVMX0xDRENfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL3BtM2ZiLmggYi9pbmNsdWRlL3ZpZGVvL3BtM2ZiLmgKaW5kZXggOTRjN2QyZC4uZDUyZTQ1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS92aWRlby9wbTNmYi5oCisrKyBiL2luY2x1ZGUvdmlkZW8vcG0zZmIuaApAQCAtNyw5ICs3LDYgQEAKICAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCiAgKiAgbW9yZSBkZXRhaWxzLgotICoKLSAqICAkSGVhZGVyOiAvY3Zzcm9vdC9saW51eC9kcml2ZXJzL3ZpZGVvL3BtM2ZiLmgsdiAxLjEgMjAwMi8wMi8yNSAxOToxMTowNiBtYXJjZWxvIEV4cCAkCi0gKgogICovCiAKICNpZm5kZWYgUE0zRkJfSApAQCAtMTExOSwxMTcgKzExMTYsMTAgQEAKIC8qICoqKioqIHBtM2ZiIHVzZWZ1bCBkZWZpbmUgYW5kIG1hY3JvICoqKioqICovCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwogCi0vKiBwZXJtZWRpYTMgLXNwZWNpZmljIGRlZmluaXRpb25zICovCi0jZGVmaW5lIFBNM19TQ0FMRV9UT19DTE9DSyhwciwgZmUsIHBvKSAoKDIgKiBQTTNfUkVGX0NMT0NLICogZmUpIC8gKHByICogKDEgPDwgKHBvKSkpKQotCi0vKiBpbiBjYXNlIGl0J3Mgbm90IGluIGxpbnV4L3BjaS5oICovCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfM0RMQUJTX1BFUk1FRElBMwotI2RlZmluZSBQQ0lfREVWSUNFX0lEXzNETEFCU19QRVJNRURJQTMgMHgwMDBhCi0jZW5kaWYKLQotLyogbWF4IG51bWJlciBvZiBzaW11bHRhbmVvdXMgYm9hcmQgKi8KLSNkZWZpbmUgUE0zX01BWF9CT0FSRCA0Ci0KIC8qIG1heCBzaXplIG9mIG9wdGlvbnMgKi8KICNkZWZpbmUgUE0zX09QVElPTlNfU0laRSAyNTYKIAogLyogbWF4IHNpemUgb2YgZm9udCBuYW1lICovCiAjZGVmaW5lIFBNM19GT05UTkFNRV9TSVpFIDQwCiAKLS8qIGRvIHdlIHdhbnQgYWNjZWxlcmF0ZWQgY29uc29sZSAgKi8KLSNkZWZpbmUgUE0zRkJfVVNFX0FDQ0VMIDEKLQotLyogZm9yIGRyaXZlciBkZWJ1Z2dpbmcgT05MWSAqLwotLyogMCA9IGFzc2VydCBvbmx5LCAxID0gZXJyb3IsIDIgPSBpbmZvLCAzKyA9IHZlcmJvc2UgKi8KLS8qIGRlZmluZSBQTTNGQl9NQVNURVJfREVCVUcgMSAqLwotI2lmIGRlZmluZWQoUE0zRkJfTUFTVEVSX0RFQlVHKSAmJiAoUE0zRkJfTUFTVEVSX0RFQlVHID49IDMpCi0jZGVmaW5lIFBNM0ZCX1RSQUNFCi0jZW5kaWYgLyogZGVmaW5lZChQTTNGQl9NQVNURVJfREVCVUcpICYmIChQTTNGQl9NQVNURVJfREVCVUcgPj0gMykgKi8KLQotI2lmZGVmIFBNM0ZCX01BU1RFUl9ERUJVRwotI2RlZmluZSBEUFJJTlRLKGwsYSxiLi4uKSBkbyB7IGlmICgobCkgPD0gUE0zRkJfTUFTVEVSX0RFQlVHKSBwcmludGsoInBtM2ZiOiAlczogIiBhLCBfX0ZVTkNUSU9OX18gLCAjIyBiKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgREFTU0VSVCh0LGEsYi4uLikgZG8geyBpZiAoISh0KSkgcHJpbnRrKCJwbTNmYjogX2Fzc2VydCBmYWlsZWQ6ICVzOiAiIGEsIF9fRlVOQ1RJT05fXyAsICMjIGIpOyB9IHdoaWxlICgwKQotI2lmZGVmIFBNM0ZCX1RSQUNFCi0jZGVmaW5lIERUUkFDRSBwcmludGsoInBtM2ZiOiBfZW50ZXIgJXNcbiIsIF9fRlVOQ1RJT05fXykKLSNlbHNlIC8qIFBNM0ZCX1RSQUNFICovCi0jZGVmaW5lIERUUkFDRQotI2VuZGlmIC8qIFBNM0ZCX1RSQUNFICovCi0jZWxzZSAvKiBQTTNGQl9NQVNURVJfREVCVUcgKi8KLSNkZWZpbmUgRFBSSU5USyhsLGEsYi4uLikKLSNkZWZpbmUgREFTU0VSVCh0LGEsYi4uLikKLSNkZWZpbmUgRFRSQUNFCi0jZW5kaWYgLyogUE0zRkJfTUFTVEVSX0RFQlVHICovCi0KLSNpZiBkZWZpbmVkKFBNM0ZCX01BU1RFUl9ERUJVRykgJiYgKFBNM0ZCX01BU1RFUl9ERUJVRyA+PSAyKQotI2RlZmluZSBQTTNfU0hPV19DVVJfTU9ERSBwbTNmYl9zaG93X2N1cl9tb2RlKGxfZmJfaW5mbykKLSNlbHNlCi0jZGVmaW5lIFBNM19TSE9XX0NVUl9NT0RFIC8qIHBtM2ZiX3Nob3dfY3VyX21vZGUoKSAqLwotI2VuZGlmCi0KLS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0vKiAqKioqKiBBIGJ1bmNoIG9mIHJlZ2lzdGVyLWFjY2VzcyBtYWNybyAqKioqKiAqLwotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotI2RlZmluZSBQTTNfV1JJVEVfUkVHKHIsIHYpIGZiX3dyaXRlbCh2LCAobF9mYl9pbmZvLT52SU9CYXNlICsgcikpCi0jZGVmaW5lIFBNM19SRUFEX1JFRyhyKSBmYl9yZWFkbCgobF9mYl9pbmZvLT52SU9CYXNlICsgcikpCi0KLQotI2RlZmluZSBkZXB0aDJicHAoZCkgKChkICsgN0wpICYgfjdMKQotI2RlZmluZSBkZXB0aDJCeVBQKGQpIChkZXB0aDJicHAoZCkgLyA4KQotCi0jZGVmaW5lIGRlcHRoX3N1cHBvcnRlZChkKSAoKGQgPT0gOCkgfHwgKGQgPT0gMTIpIHx8IChkID09IDE1KSB8fCAoZCA9PSAxNikgfHwgKGQ9PTMyKSkKLQotCi0jZGVmaW5lIFBNM19XQUlUKG4pIFwKLWRveyBcCi0Jd2hpbGUoUE0zX1JFQURfUkVHKFBNM0luRklGT1NwYWNlKTwobikpOyBcCi19IHdoaWxlKDApCi0KLSNkZWZpbmUgUE0zX0RFTEFZKHgpIGRvIHsgXAotICAgICAgICBpbnQgZGVsYXkgPSB4OyBcCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgdG1wOyBcCi0gICAgICAgIHdoaWxlKGRlbGF5LS0pe3RtcCA9IFBNM19SRUFEX1JFRyhQTTNJbkZJRk9TcGFjZSk7fTsgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIFBNM19TTE9XX1dSSVRFX1JFRyhyLHYpCVwKLWRveyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIERBU1NFUlQoKGxfZmJfaW5mby0+dklPQmFzZSAhPSAodW5zaWduZWQgY2hhciopKC0xKSksICJsX2ZiX2luZm8tPnZJT0Jhc2UgbWFwcGVkIGluIHNsb3cgd3JpdGVcbiIpOyBcCi0JbWIoKTsgICAgICAgICAgICAgICAgICAgXAotCVBNM19XQUlUKDEpOyAgICAgICAgICAgIFwKLQltYigpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgUE0zX1dSSVRFX1JFRyhyLHYpOyAgICAgXAotfSB3aGlsZSgwKQotCi0jZGVmaW5lIFBNM19TRVRfSU5ERVgoaW5kZXgpIFwKLWRveyBcCi0JUE0zX1NMT1dfV1JJVEVfUkVHKFBNM1JEX0luZGV4SGlnaCwoKChpbmRleCk+PjgpJjB4ZmYpKTsgXAotCVBNM19TTE9XX1dSSVRFX1JFRyhQTTNSRF9JbmRleExvdywoKGluZGV4KSYweGZmKSk7IFwKLX0gd2hpbGUoMCkKLQotI2RlZmluZSBQTTNfV1JJVEVfREFDX1JFRyhyLCB2KSBcCi1kbyB7IFwKLSAgICAgREFTU0VSVCgobF9mYl9pbmZvLT52SU9CYXNlICE9ICh1bnNpZ25lZCBjaGFyKikoLTEpKSwgImxfZmJfaW5mby0+dklPQmFzZSBtYXBwZWQgaW4gd3JpdGUgZGFjIHJlZ1xuIik7IFwKLSAgICAgUE0zX1NFVF9JTkRFWChyKTsgXAotICAgICBtYigpOyBcCi0gICAgIFBNM19XUklURV9SRUcoUE0zUkRfSW5kZXhlZERhdGEsIHYpOyBcCi19IHdoaWxlICgwKQotCi0vKiBuZXh0IG9uZSBpcyByZWFsbHkgYSBmdW5jdGlvbiwgYWRkZWQgYXMgYSBtYWNybyB0byBiZSBjb25zaXN0ZW50ICovCi0jZGVmaW5lIFBNM19SRUFEX0RBQ19SRUcocikgcG0zZmJfcmVhZF9kYWNfcmVnKGxfZmJfaW5mbywgcikKLQotCi0jZGVmaW5lIFBNM19DT0xPUihjKSBcCi1kbyB7IFwKLSAgaWYgKGxfZmJfaW5mby0+Y3VycmVudF9wYXItPmRlcHRoID09IDgpIFwKLSAgICB7IFwKLSAgICAgIGMgPSAoYyAmIDB4RkYpOyBcCi0gICAgICBjID0gYyB8IChjIDw8IDgpOyBcCi0gICAgfSBcCi0gIGlmICgobF9mYl9pbmZvLT5jdXJyZW50X3Bhci0+ZGVwdGggPT0gOCkgfHwgKGRlcHRoMmJwcChsX2ZiX2luZm8tPmN1cnJlbnRfcGFyLT5kZXB0aCkgPT0gMTYpKSBcCi0gICAgeyBcCi0gICAgICBjID0gKGMgJiAweEZGRkYpOyBcCi0gICAgICBjID0gYyB8IChjIDw8IDE2KTsgXAotICAgIH0gXAotfSB3aGlsZSAoMCkKLQogI2VuZGlmIC8qIFBNM0ZCX0ggKi8KZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCAzMjJiMWY4Li40ZTAwOWZkIDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC00NzUsMTMgKzQ3NSw1MyBAQAogCSAgc3VwcG9ydCBmb3IgImZhc3QgdXNlcnNwYWNlIG11dGV4ZXMiLiAgVGhlIHJlc3VsdGluZyBrZXJuZWwgbWF5IG5vdAogCSAgcnVuIGdsaWJjLWJhc2VkIGFwcGxpY2F0aW9ucyBjb3JyZWN0bHkuCiAKK2NvbmZpZyBBTk9OX0lOT0RFUworCWJvb2wgIkVuYWJsZSBhbm9ueW1vdXMgaW5vZGUgc291cmNlIiBpZiBFTUJFRERFRAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEFub255bW91cyBpbm9kZSBzb3VyY2UgZm9yIHBzZXVkby1maWxlcyBsaWtlIGVwb2xsLCBzaWduYWxmZCwKKwkgIHRpbWVyZmQgYW5kIGV2ZW50ZmQuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKIGNvbmZpZyBFUE9MTAogCWJvb2wgIkVuYWJsZSBldmVudHBvbGwgc3VwcG9ydCIgaWYgRU1CRURERUQKIAlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFOT05fSU5PREVTCiAJaGVscAogCSAgRGlzYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgdGhlIGtlcm5lbCB0byBiZSBidWlsdCB3aXRob3V0CiAJICBzdXBwb3J0IGZvciBlcG9sbCBmYW1pbHkgb2Ygc3lzdGVtIGNhbGxzLgogCitjb25maWcgU0lHTkFMRkQKKwlib29sICJFbmFibGUgc2lnbmFsZmQoKSBzeXN0ZW0gY2FsbCIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIEFOT05fSU5PREVTCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIHRoZSBzaWduYWxmZCgpIHN5c3RlbSBjYWxsIHRoYXQgYWxsb3dzIHRvIHJlY2VpdmUgc2lnbmFscworCSAgb24gYSBmaWxlIGRlc2NyaXB0b3IuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBUSU1FUkZECisJYm9vbCAiRW5hYmxlIHRpbWVyZmQoKSBzeXN0ZW0gY2FsbCIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIEFOT05fSU5PREVTCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIHRoZSB0aW1lcmZkKCkgc3lzdGVtIGNhbGwgdGhhdCBhbGxvd3MgdG8gcmVjZWl2ZSB0aW1lcgorCSAgZXZlbnRzIG9uIGEgZmlsZSBkZXNjcmlwdG9yLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgRVZFTlRGRAorCWJvb2wgIkVuYWJsZSBldmVudGZkKCkgc3lzdGVtIGNhbGwiIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiBBTk9OX0lOT0RFUworCWRlZmF1bHQgeQorCWhlbHAKKwkgIEVuYWJsZSB0aGUgZXZlbnRmZCgpIHN5c3RlbSBjYWxsIHRoYXQgYWxsb3dzIHRvIHJlY2VpdmUgYm90aAorCSAga2VybmVsIG5vdGlmaWNhdGlvbiAoaWUuIEtBSU8pIG9yIHVzZXJzcGFjZSBub3RpZmljYXRpb25zLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCiBjb25maWcgU0hNRU0KIAlib29sICJVc2UgZnVsbCBzaG1lbSBmaWxlc3lzdGVtIiBpZiBFTUJFRERFRAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCBlOGQwODBjLi4xOTQwZmE3IDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtODAxLDYgKzgwMSw3IEBACiAJICovCiAJaW5pdF9waWRfbnMuY2hpbGRfcmVhcGVyID0gY3VycmVudDsKIAorCV9fc2V0X3NwZWNpYWxfcGlkcygxLCAxKTsKIAljYWRfcGlkID0gdGFza19waWQoY3VycmVudCk7CiAKIAlzbXBfcHJlcGFyZV9jcHVzKG1heF9jcHVzKTsKZGlmZiAtLWdpdCBhL2lwYy9tcXVldWUuYyBiL2lwYy9tcXVldWUuYwppbmRleCBkMTc4MjFkLi5mYWI1NzA3IDEwMDY0NAotLS0gYS9pcGMvbXF1ZXVlLmMKKysrIGIvaXBjL21xdWV1ZS5jCkBAIC02ODEsNiArNjgxLDcgQEAKIAogCWlmIChvZmxhZyAmIE9fQ1JFQVQpIHsKIAkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgewkvKiBlbnRyeSBhbHJlYWR5IGV4aXN0cyAqLworCQkJYXVkaXRfaW5vZGUobmFtZSwgZGVudHJ5LT5kX2lub2RlKTsKIAkJCWVycm9yID0gLUVFWElTVDsKIAkJCWlmIChvZmxhZyAmIE9fRVhDTCkKIAkJCQlnb3RvIG91dDsKQEAgLTY5Myw2ICs2OTQsNyBAQAogCQllcnJvciA9IC1FTk9FTlQ7CiAJCWlmICghZGVudHJ5LT5kX2lub2RlKQogCQkJZ290byBvdXQ7CisJCWF1ZGl0X2lub2RlKG5hbWUsIGRlbnRyeS0+ZF9pbm9kZSk7CiAJCWZpbHAgPSBkb19vcGVuKGRlbnRyeSwgb2ZsYWcpOwogCX0KIApAQCAtODQwLDYgKzg0Miw3IEBACiAJaWYgKHVubGlrZWx5KGZpbHAtPmZfb3AgIT0gJm1xdWV1ZV9maWxlX29wZXJhdGlvbnMpKQogCQlnb3RvIG91dF9mcHV0OwogCWluZm8gPSBNUVVFVUVfSShpbm9kZSk7CisJYXVkaXRfaW5vZGUoTlVMTCwgaW5vZGUpOwogCiAJaWYgKHVubGlrZWx5KCEoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSkKIAkJZ290byBvdXRfZnB1dDsKQEAgLTkyMyw2ICs5MjYsNyBAQAogCWlmICh1bmxpa2VseShmaWxwLT5mX29wICE9ICZtcXVldWVfZmlsZV9vcGVyYXRpb25zKSkKIAkJZ290byBvdXRfZnB1dDsKIAlpbmZvID0gTVFVRVVFX0koaW5vZGUpOworCWF1ZGl0X2lub2RlKE5VTEwsIGlub2RlKTsKIAogCWlmICh1bmxpa2VseSghKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSkKIAkJZ290byBvdXRfZnB1dDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdC5oIGIva2VybmVsL2F1ZGl0LmgKaW5kZXggYTMzNzAyMy4uODE1ZDZmNSAxMDA2NDQKLS0tIGEva2VybmVsL2F1ZGl0LmgKKysrIGIva2VybmVsL2F1ZGl0LmgKQEAgLTgzLDYgKzgzLDcgQEAKIAl1MzIJCQlmaWVsZF9jb3VudDsKIAljaGFyCQkJKmZpbHRlcmtleTsgLyogdGllcyBldmVudHMgdG8gcnVsZXMgKi8KIAlzdHJ1Y3QgYXVkaXRfZmllbGQJKmZpZWxkczsKKwlzdHJ1Y3QgYXVkaXRfZmllbGQJKmFyY2hfZjsgLyogcXVpY2sgYWNjZXNzIHRvIGFyY2ggZmllbGQgKi8KIAlzdHJ1Y3QgYXVkaXRfZmllbGQJKmlub2RlX2Y7IC8qIHF1aWNrIGFjY2VzcyB0byBhbiBpbm9kZSBmaWVsZCAqLwogCXN0cnVjdCBhdWRpdF93YXRjaAkqd2F0Y2g7CS8qIGFzc29jaWF0ZWQgd2F0Y2ggKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXJsaXN0OwkvKiBlbnRyeSBpbiBhdWRpdF93YXRjaC5ydWxlcyBsaXN0ICovCkBAIC0xMzEsMTcgKzEzMiwxOSBAQAogZXh0ZXJuIGludCBzZWxpbnV4X2F1ZGl0X3J1bGVfdXBkYXRlKHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAotZXh0ZXJuIHZvaWQgX19hdWRpdF9zaWduYWxfaW5mbyhpbnQgc2lnLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpOwotc3RhdGljIGlubGluZSB2b2lkIGF1ZGl0X3NpZ25hbF9pbmZvKGludCBzaWcsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK2V4dGVybiBpbnQgX19hdWRpdF9zaWduYWxfaW5mbyhpbnQgc2lnLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpOworc3RhdGljIGlubGluZSBpbnQgYXVkaXRfc2lnbmFsX2luZm8oaW50IHNpZywgc3RydWN0IHRhc2tfc3RydWN0ICp0KQogewotCWlmICh1bmxpa2VseShhdWRpdF9waWQgJiYgdC0+dGdpZCA9PSBhdWRpdF9waWQpKQotCQlfX2F1ZGl0X3NpZ25hbF9pbmZvKHNpZywgdCk7CisJaWYgKHVubGlrZWx5KChhdWRpdF9waWQgJiYgdC0+dGdpZCA9PSBhdWRpdF9waWQpIHx8CisJCSAgICAgKGF1ZGl0X3NpZ25hbHMgJiYgIWF1ZGl0X2R1bW15X2NvbnRleHQoKSkpKQorCQlyZXR1cm4gX19hdWRpdF9zaWduYWxfaW5mbyhzaWcsIHQpOworCXJldHVybiAwOwogfQogZXh0ZXJuIGVudW0gYXVkaXRfc3RhdGUgYXVkaXRfZmlsdGVyX2lub2RlcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwKIAkJCQkJICAgIHN0cnVjdCBhdWRpdF9jb250ZXh0ICopOwogZXh0ZXJuIHZvaWQgYXVkaXRfc2V0X2F1ZGl0YWJsZShzdHJ1Y3QgYXVkaXRfY29udGV4dCAqKTsKICNlbHNlCi0jZGVmaW5lIGF1ZGl0X3NpZ25hbF9pbmZvKHMsdCkKKyNkZWZpbmUgYXVkaXRfc2lnbmFsX2luZm8ocyx0KSBBVURJVF9ESVNBQkxFRAogI2RlZmluZSBhdWRpdF9maWx0ZXJfaW5vZGVzKHQsYykgQVVESVRfRElTQUJMRUQKICNkZWZpbmUgYXVkaXRfc2V0X2F1ZGl0YWJsZShjKQogI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRmaWx0ZXIuYyBiL2tlcm5lbC9hdWRpdGZpbHRlci5jCmluZGV4IDM3NDkxOTMuLjZjNjEyNjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdGZpbHRlci5jCisrKyBiL2tlcm5lbC9hdWRpdGZpbHRlci5jCkBAIC0zMTEsNiArMzExLDQzIEBACiAJcmV0dXJuIGNsYXNzZXNbY2xhc3NdW0FVRElUX1dPUkQoc3lzY2FsbCldICYgQVVESVRfQklUKHN5c2NhbGwpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBhdWRpdF9tYXRjaF9jbGFzc19iaXRzKGludCBjbGFzcywgdTMyICptYXNrKQoreworCWludCBpOworCisJaWYgKGNsYXNzZXNbY2xhc3NdKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBVURJVF9CSVRNQVNLX1NJWkU7IGkrKykKKwkJCWlmIChtYXNrW2ldICYgY2xhc3Nlc1tjbGFzc11baV0pCisJCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGF1ZGl0X21hdGNoX3NpZ25hbChzdHJ1Y3QgYXVkaXRfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBhdWRpdF9maWVsZCAqYXJjaCA9IGVudHJ5LT5ydWxlLmFyY2hfZjsKKworCWlmICghYXJjaCkgeworCQkvKiBXaGVuIGFyY2ggaXMgdW5zcGVjaWZpZWQsIHdlIG11c3QgY2hlY2sgYm90aCBtYXNrcyBvbiBiaWFyY2gKKwkJICogYXMgc3lzY2FsbCBudW1iZXIgYWxvbmUgaXMgYW1iaWd1b3VzLiAqLworCQlyZXR1cm4gKGF1ZGl0X21hdGNoX2NsYXNzX2JpdHMoQVVESVRfQ0xBU1NfU0lHTkFMLAorCQkJCQkgICAgICAgZW50cnktPnJ1bGUubWFzaykgJiYKKwkJCWF1ZGl0X21hdGNoX2NsYXNzX2JpdHMoQVVESVRfQ0xBU1NfU0lHTkFMXzMyLAorCQkJCQkgICAgICAgZW50cnktPnJ1bGUubWFzaykpOworCX0KKworCXN3aXRjaChhdWRpdF9jbGFzc2lmeV9hcmNoKGFyY2gtPnZhbCkpIHsKKwljYXNlIDA6IC8qIG5hdGl2ZSAqLworCQlyZXR1cm4gKGF1ZGl0X21hdGNoX2NsYXNzX2JpdHMoQVVESVRfQ0xBU1NfU0lHTkFMLAorCQkJCQkgICAgICAgZW50cnktPnJ1bGUubWFzaykpOworCWNhc2UgMTogLyogMzJiaXQgb24gYmlhcmNoICovCisJCXJldHVybiAoYXVkaXRfbWF0Y2hfY2xhc3NfYml0cyhBVURJVF9DTEFTU19TSUdOQUxfMzIsCisJCQkJCSAgICAgICBlbnRyeS0+cnVsZS5tYXNrKSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJfQorfQorCiAvKiBDb21tb24gdXNlci1zcGFjZSB0byBrZXJuZWwgcnVsZSB0cmFuc2xhdGlvbi4gKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGF1ZGl0X2VudHJ5ICphdWRpdF90b19lbnRyeV9jb21tb24oc3RydWN0IGF1ZGl0X3J1bGUgKnJ1bGUpCiB7CkBAIC00MjksNiArNDY2LDcgQEAKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWdvdG8gZXhpdF9mcmVlOwogCQkJfQorCQkJZW50cnktPnJ1bGUuYXJjaF9mID0gZjsKIAkJCWJyZWFrOwogCQljYXNlIEFVRElUX1BFUk06CiAJCQlpZiAoZi0+dmFsICYgfjE1KQpAQCAtNTE5LDcgKzU1Nyw2IEBACiAJCWNhc2UgQVVESVRfRlNHSUQ6CiAJCWNhc2UgQVVESVRfTE9HSU5VSUQ6CiAJCWNhc2UgQVVESVRfUEVSUzoKLQkJY2FzZSBBVURJVF9BUkNIOgogCQljYXNlIEFVRElUX01TR1RZUEU6CiAJCWNhc2UgQVVESVRfUFBJRDoKIAkJY2FzZSBBVURJVF9ERVZNQUpPUjoKQEAgLTUzMSw2ICs1NjgsOSBAQAogCQljYXNlIEFVRElUX0FSRzI6CiAJCWNhc2UgQVVESVRfQVJHMzoKIAkJCWJyZWFrOworCQljYXNlIEFVRElUX0FSQ0g6CisJCQllbnRyeS0+cnVsZS5hcmNoX2YgPSBmOworCQkJYnJlYWs7CiAJCWNhc2UgQVVESVRfU1VCSl9VU0VSOgogCQljYXNlIEFVRElUX1NVQkpfUk9MRToKIAkJY2FzZSBBVURJVF9TVUJKX1RZUEU6CkBAIC0xMjIxLDYgKzEyNjEsOSBAQAogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKIAlpZiAoIWRvbnRfY291bnQpCiAJCWF1ZGl0X25fcnVsZXMrKzsKKworCWlmICghYXVkaXRfbWF0Y2hfc2lnbmFsKGVudHJ5KSkKKwkJYXVkaXRfc2lnbmFscysrOwogI2VuZGlmCiAJbXV0ZXhfdW5sb2NrKCZhdWRpdF9maWx0ZXJfbXV0ZXgpOwogCkBAIC0xMjk0LDYgKzEzMzcsOSBAQAogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKIAlpZiAoIWRvbnRfY291bnQpCiAJCWF1ZGl0X25fcnVsZXMtLTsKKworCWlmICghYXVkaXRfbWF0Y2hfc2lnbmFsKGVudHJ5KSkKKwkJYXVkaXRfc2lnbmFscy0tOwogI2VuZGlmCiAJbXV0ZXhfdW5sb2NrKCZhdWRpdF9maWx0ZXJfbXV0ZXgpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRzYy5jIGIva2VybmVsL2F1ZGl0c2MuYwppbmRleCA2MjhjN2FjLi5lMzY0ODFlIDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXRzYy5jCisrKyBiL2tlcm5lbC9hdWRpdHNjLmMKQEAgLTc4LDE3ICs3OCwxNSBAQAogICogZm9yIHNhdmluZyBuYW1lcyBmcm9tIGdldG5hbWUoKS4gKi8KICNkZWZpbmUgQVVESVRfTkFNRVMgICAgMjAKIAotLyogQVVESVRfTkFNRVNfUkVTRVJWRUQgaXMgdGhlIG51bWJlciBvZiBzbG90cyB3ZSByZXNlcnZlIGluIHRoZQotICogYXVkaXRfY29udGV4dCBmcm9tIGJlaW5nIHVzZWQgZm9yIG5hbWVsZXNzIGlub2RlcyBmcm9tCi0gKiBwYXRoX2xvb2t1cC4gKi8KLSNkZWZpbmUgQVVESVRfTkFNRVNfUkVTRVJWRUQgNwotCiAvKiBJbmRpY2F0ZXMgdGhhdCBhdWRpdCBzaG91bGQgbG9nIHRoZSBmdWxsIHBhdGhuYW1lLiAqLwogI2RlZmluZSBBVURJVF9OQU1FX0ZVTEwgLTEKIAogLyogbnVtYmVyIG9mIGF1ZGl0IHJ1bGVzICovCiBpbnQgYXVkaXRfbl9ydWxlczsKIAorLyogZGV0ZXJtaW5lcyB3aGV0aGVyIHdlIGNvbGxlY3QgZGF0YSBmb3Igc2lnbmFscyBzZW50ICovCitpbnQgYXVkaXRfc2lnbmFsczsKKwogLyogV2hlbiBmcy9uYW1laS5jOmdldG5hbWUoKSBpcyBjYWxsZWQsIHdlIHN0b3JlIHRoZSBwb2ludGVyIGluIG5hbWUgYW5kCiAgKiB3ZSBkb24ndCBsZXQgcHV0bmFtZSgpIGZyZWUgaXQgKGluc3RlYWQgd2UgZnJlZSBhbGwgb2YgdGhlIHNhdmVkCiAgKiBwb2ludGVycyBhdCBzeXNjYWxsIGV4aXQgdGltZSkuCkBAIC0xMTQsNiArMTEyLDkgQEAKIAogI2RlZmluZSBBVURJVF9BVVhfSVBDUEVSTQkwCiAKKy8qIE51bWJlciBvZiB0YXJnZXQgcGlkcyBwZXIgYXV4IHN0cnVjdC4gKi8KKyNkZWZpbmUgQVVESVRfQVVYX1BJRFMJMTYKKwogc3RydWN0IGF1ZGl0X2F1eF9kYXRhX21xX29wZW4gewogCXN0cnVjdCBhdWRpdF9hdXhfZGF0YQlkOwogCWludAkJCW9mbGFnOwpAQCAtMTgxLDYgKzE4MiwxMyBAQAogCXN0cnVjdCB2ZnNtb3VudAkJKm1udDsKIH07CiAKK3N0cnVjdCBhdWRpdF9hdXhfZGF0YV9waWRzIHsKKwlzdHJ1Y3QgYXVkaXRfYXV4X2RhdGEJZDsKKwlwaWRfdAkJCXRhcmdldF9waWRbQVVESVRfQVVYX1BJRFNdOworCXUzMgkJCXRhcmdldF9zaWRbQVVESVRfQVVYX1BJRFNdOworCWludAkJCXBpZF9jb3VudDsKK307CisKIC8qIFRoZSBwZXItdGFzayBhdWRpdCBjb250ZXh0LiAqLwogc3RydWN0IGF1ZGl0X2NvbnRleHQgewogCWludAkJICAgIGR1bW15OwkvKiBtdXN0IGJlIHRoZSBmaXJzdCBlbGVtZW50ICovCkBAIC0yMDEsNiArMjA5LDcgQEAKIAlzdHJ1Y3QgdmZzbW91bnQgKiAgIHB3ZG1udDsKIAlzdHJ1Y3QgYXVkaXRfY29udGV4dCAqcHJldmlvdXM7IC8qIEZvciBuZXN0ZWQgc3lzY2FsbHMgKi8KIAlzdHJ1Y3QgYXVkaXRfYXV4X2RhdGEgKmF1eDsKKwlzdHJ1Y3QgYXVkaXRfYXV4X2RhdGEgKmF1eF9waWRzOwogCiAJCQkJLyogU2F2ZSB0aGluZ3MgdG8gcHJpbnQgYWJvdXQgdGFza19zdHJ1Y3QgKi8KIAlwaWRfdAkJICAgIHBpZCwgcHBpZDsKQEAgLTIwOSw2ICsyMTgsOSBAQAogCXVuc2lnbmVkIGxvbmcJICAgIHBlcnNvbmFsaXR5OwogCWludAkJICAgIGFyY2g7CiAKKwlwaWRfdAkJICAgIHRhcmdldF9waWQ7CisJdTMyCQkgICAgdGFyZ2V0X3NpZDsKKwogI2lmIEFVRElUX0RFQlVHCiAJaW50CQkgICAgcHV0X2NvdW50OwogCWludAkJICAgIGlub19jb3VudDsKQEAgLTY1NCw2ICs2NjYsMTAgQEAKIAkJY29udGV4dC0+YXV4ID0gYXV4LT5uZXh0OwogCQlrZnJlZShhdXgpOwogCX0KKwl3aGlsZSAoKGF1eCA9IGNvbnRleHQtPmF1eF9waWRzKSkgeworCQljb250ZXh0LT5hdXhfcGlkcyA9IGF1eC0+bmV4dDsKKwkJa2ZyZWUoYXV4KTsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhdWRpdF96ZXJvX2NvbnRleHQoc3RydWN0IGF1ZGl0X2NvbnRleHQgKmNvbnRleHQsCkBAIC03OTUsNiArODExLDI5IEBACiAJYXVkaXRfbG9nX3Rhc2tfY29udGV4dChhYik7CiB9CiAKK3N0YXRpYyBpbnQgYXVkaXRfbG9nX3BpZF9jb250ZXh0KHN0cnVjdCBhdWRpdF9jb250ZXh0ICpjb250ZXh0LCBwaWRfdCBwaWQsCisJCQkJIHUzMiBzaWQpCit7CisJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWI7CisJY2hhciAqcyA9IE5VTEw7CisJdTMyIGxlbjsKKwlpbnQgcmMgPSAwOworCisJYWIgPSBhdWRpdF9sb2dfc3RhcnQoY29udGV4dCwgR0ZQX0tFUk5FTCwgQVVESVRfT0JKX1BJRCk7CisJaWYgKCFhYikKKwkJcmV0dXJuIDE7CisKKwlpZiAoc2VsaW51eF9zaWRfdG9fc3RyaW5nKHNpZCwgJnMsICZsZW4pKSB7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICJvcGlkPSVkIG9iaj0obm9uZSkiLCBwaWQpOworCQlyYyA9IDE7CisJfSBlbHNlCisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICJvcGlkPSVkICBvYmo9JXMiLCBwaWQsIHMpOworCWF1ZGl0X2xvZ19lbmQoYWIpOworCWtmcmVlKHMpOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgdm9pZCBhdWRpdF9sb2dfZXhpdChzdHJ1Y3QgYXVkaXRfY29udGV4dCAqY29udGV4dCwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJaW50IGksIGNhbGxfcGFuaWMgPSAwOwpAQCAtOTczLDYgKzEwMTIsMjEgQEAKIAkJYXVkaXRfbG9nX2VuZChhYik7CiAJfQogCisJZm9yIChhdXggPSBjb250ZXh0LT5hdXhfcGlkczsgYXV4OyBhdXggPSBhdXgtPm5leHQpIHsKKwkJc3RydWN0IGF1ZGl0X2F1eF9kYXRhX3BpZHMgKmF4cyA9ICh2b2lkICopYXV4OworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgYXhzLT5waWRfY291bnQ7IGkrKykKKwkJCWlmIChhdWRpdF9sb2dfcGlkX2NvbnRleHQoY29udGV4dCwgYXhzLT50YXJnZXRfcGlkW2ldLAorCQkJCQkJICBheHMtPnRhcmdldF9zaWRbaV0pKQorCQkJCWNhbGxfcGFuaWMgPSAxOworCX0KKworCWlmIChjb250ZXh0LT50YXJnZXRfcGlkICYmCisJICAgIGF1ZGl0X2xvZ19waWRfY29udGV4dChjb250ZXh0LCBjb250ZXh0LT50YXJnZXRfcGlkLAorCQkJCSAgY29udGV4dC0+dGFyZ2V0X3NpZCkpCisJCQljYWxsX3BhbmljID0gMTsKKwogCWlmIChjb250ZXh0LT5wd2QgJiYgY29udGV4dC0+cHdkbW50KSB7CiAJCWFiID0gYXVkaXRfbG9nX3N0YXJ0KGNvbnRleHQsIEdGUF9LRVJORUwsIEFVRElUX0NXRCk7CiAJCWlmIChhYikgewpAQCAtMTE5Myw2ICsxMjQ3LDEwIEBACiAJfSBlbHNlIHsKIAkJYXVkaXRfZnJlZV9uYW1lcyhjb250ZXh0KTsKIAkJYXVkaXRfZnJlZV9hdXgoY29udGV4dCk7CisJCWNvbnRleHQtPmF1eCA9IE5VTEw7CisJCWNvbnRleHQtPmF1eF9waWRzID0gTlVMTDsKKwkJY29udGV4dC0+dGFyZ2V0X3BpZCA9IDA7CisJCWNvbnRleHQtPnRhcmdldF9zaWQgPSAwOwogCQlrZnJlZShjb250ZXh0LT5maWx0ZXJrZXkpOwogCQljb250ZXh0LT5maWx0ZXJrZXkgPSBOVUxMOwogCQl0c2stPmF1ZGl0X2NvbnRleHQgPSBjb250ZXh0OwpAQCAtMTIyNiw2ICsxMjg0LDcgQEAKIAljb250ZXh0LT5uYW1lc1tjb250ZXh0LT5uYW1lX2NvdW50XS5uYW1lX2xlbiA9IEFVRElUX05BTUVfRlVMTDsKIAljb250ZXh0LT5uYW1lc1tjb250ZXh0LT5uYW1lX2NvdW50XS5uYW1lX3B1dCA9IDE7CiAJY29udGV4dC0+bmFtZXNbY29udGV4dC0+bmFtZV9jb3VudF0uaW5vICA9ICh1bnNpZ25lZCBsb25nKS0xOworCWNvbnRleHQtPm5hbWVzW2NvbnRleHQtPm5hbWVfY291bnRdLm9zaWQgPSAwOwogCSsrY29udGV4dC0+bmFtZV9jb3VudDsKIAlpZiAoIWNvbnRleHQtPnB3ZCkgewogCQlyZWFkX2xvY2soJmN1cnJlbnQtPmZzLT5sb2NrKTsKQEAgLTEyNzksNiArMTMzOCwyOCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbnQgYXVkaXRfaW5jX25hbWVfY291bnQoc3RydWN0IGF1ZGl0X2NvbnRleHQgKmNvbnRleHQsCisJCQkJY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoY29udGV4dC0+bmFtZV9jb3VudCA+PSBBVURJVF9OQU1FUykgeworCQlpZiAoaW5vZGUpCisJCQlwcmludGsoS0VSTl9ERUJVRyAibmFtZV9jb3VudCBtYXhlZCwgbG9zaW5nIGlub2RlIGRhdGE6ICIKKwkJCSAgICAgICAiZGV2PSUwMng6JTAyeCwgaW5vZGU9JWx1IiwKKwkJCSAgICAgICBNQUpPUihpbm9kZS0+aV9zYi0+c19kZXYpLAorCQkJICAgICAgIE1JTk9SKGlub2RlLT5pX3NiLT5zX2RldiksCisJCQkgICAgICAgaW5vZGUtPmlfaW5vKTsKKworCQllbHNlCisJCQlwcmludGsoS0VSTl9ERUJVRyAibmFtZV9jb3VudCBtYXhlZCwgbG9zaW5nIGlub2RlIGRhdGEiKTsKKwkJcmV0dXJuIDE7CisJfQorCWNvbnRleHQtPm5hbWVfY291bnQrKzsKKyNpZiBBVURJVF9ERUJVRworCWNvbnRleHQtPmlub19jb3VudCsrOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKIC8qIENvcHkgaW5vZGUgZGF0YSBpbnRvIGFuIGF1ZGl0X25hbWVzLiAqLwogc3RhdGljIHZvaWQgYXVkaXRfY29weV9pbm9kZShzdHJ1Y3QgYXVkaXRfbmFtZXMgKm5hbWUsIGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CkBAIC0xMzE2LDEzICsxMzk3LDEwIEBACiAJZWxzZSB7CiAJCS8qIEZJWE1FOiBob3cgbXVjaCBkbyB3ZSBjYXJlIGFib3V0IGlub2RlcyB0aGF0IGhhdmUgbm8KIAkJICogYXNzb2NpYXRlZCBuYW1lPyAqLwotCQlpZiAoY29udGV4dC0+bmFtZV9jb3VudCA+PSBBVURJVF9OQU1FUyAtIEFVRElUX05BTUVTX1JFU0VSVkVEKQorCQlpZiAoYXVkaXRfaW5jX25hbWVfY291bnQoY29udGV4dCwgaW5vZGUpKQogCQkJcmV0dXJuOwotCQlpZHggPSBjb250ZXh0LT5uYW1lX2NvdW50Kys7CisJCWlkeCA9IGNvbnRleHQtPm5hbWVfY291bnQgLSAxOwogCQljb250ZXh0LT5uYW1lc1tpZHhdLm5hbWUgPSBOVUxMOwotI2lmIEFVRElUX0RFQlVHCi0JCSsrY29udGV4dC0+aW5vX2NvdW50OwotI2VuZGlmCiAJfQogCWF1ZGl0X2NvcHlfaW5vZGUoJmNvbnRleHQtPm5hbWVzW2lkeF0sIGlub2RlKTsKIH0KQEAgLTEzNDYsNyArMTQyNCw3IEBACiB7CiAJaW50IGlkeDsKIAlzdHJ1Y3QgYXVkaXRfY29udGV4dCAqY29udGV4dCA9IGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQ7Ci0JY29uc3QgY2hhciAqZm91bmRfbmFtZSA9IE5VTEw7CisJY29uc3QgY2hhciAqZm91bmRfcGFyZW50ID0gTlVMTCwgKmZvdW5kX2NoaWxkID0gTlVMTDsKIAlpbnQgZGlybGVuID0gMDsKIAogCWlmICghY29udGV4dC0+aW5fc3lzY2FsbCkKQEAgLTEzNTQsODggKzE0MzIsNzMgQEAKIAogCS8qIGRldGVybWluZSBtYXRjaGluZyBwYXJlbnQgKi8KIAlpZiAoIWRuYW1lKQotCQlnb3RvIHVwZGF0ZV9jb250ZXh0OwotCWZvciAoaWR4ID0gMDsgaWR4IDwgY29udGV4dC0+bmFtZV9jb3VudDsgaWR4KyspCi0JCWlmIChjb250ZXh0LT5uYW1lc1tpZHhdLmlubyA9PSBwYXJlbnQtPmlfaW5vKSB7Ci0JCQljb25zdCBjaGFyICpuYW1lID0gY29udGV4dC0+bmFtZXNbaWR4XS5uYW1lOworCQlnb3RvIGFkZF9uYW1lczsKIAotCQkJaWYgKCFuYW1lKQotCQkJCWNvbnRpbnVlOworCS8qIHBhcmVudCBpcyBtb3JlIGxpa2VseSwgbG9vayBmb3IgaXQgZmlyc3QgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvbnRleHQtPm5hbWVfY291bnQ7IGlkeCsrKSB7CisJCXN0cnVjdCBhdWRpdF9uYW1lcyAqbiA9ICZjb250ZXh0LT5uYW1lc1tpZHhdOwogCi0JCQlpZiAoYXVkaXRfY29tcGFyZV9kbmFtZV9wYXRoKGRuYW1lLCBuYW1lLCAmZGlybGVuKSA9PSAwKSB7Ci0JCQkJY29udGV4dC0+bmFtZXNbaWR4XS5uYW1lX2xlbiA9IGRpcmxlbjsKLQkJCQlmb3VuZF9uYW1lID0gbmFtZTsKLQkJCQlicmVhazsKLQkJCX0KKwkJaWYgKCFuLT5uYW1lKQorCQkJY29udGludWU7CisKKwkJaWYgKG4tPmlubyA9PSBwYXJlbnQtPmlfaW5vICYmCisJCSAgICAhYXVkaXRfY29tcGFyZV9kbmFtZV9wYXRoKGRuYW1lLCBuLT5uYW1lLCAmZGlybGVuKSkgeworCQkJbi0+bmFtZV9sZW4gPSBkaXJsZW47IC8qIHVwZGF0ZSBwYXJlbnQgZGF0YSBpbiBwbGFjZSAqLworCQkJZm91bmRfcGFyZW50ID0gbi0+bmFtZTsKKwkJCWdvdG8gYWRkX25hbWVzOwogCQl9Ci0KLXVwZGF0ZV9jb250ZXh0OgotCWlkeCA9IGNvbnRleHQtPm5hbWVfY291bnQ7Ci0JaWYgKGNvbnRleHQtPm5hbWVfY291bnQgPT0gQVVESVRfTkFNRVMpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIm5hbWVfY291bnQgbWF4ZWQgYW5kIGxvc2luZyAlc1xuIiwKLQkJCWZvdW5kX25hbWUgPzogIihudWxsKSIpOwotCQlyZXR1cm47CiAJfQotCWNvbnRleHQtPm5hbWVfY291bnQrKzsKLSNpZiBBVURJVF9ERUJVRwotCWNvbnRleHQtPmlub19jb3VudCsrOwotI2VuZGlmCi0JLyogUmUtdXNlIHRoZSBuYW1lIGJlbG9uZ2luZyB0byB0aGUgc2xvdCBmb3IgYSBtYXRjaGluZyBwYXJlbnQgZGlyZWN0b3J5LgotCSAqIEFsbCBuYW1lcyBmb3IgdGhpcyBjb250ZXh0IGFyZSByZWxpbnF1aXNoZWQgaW4gYXVkaXRfZnJlZV9uYW1lcygpICovCi0JY29udGV4dC0+bmFtZXNbaWR4XS5uYW1lID0gZm91bmRfbmFtZTsKLQljb250ZXh0LT5uYW1lc1tpZHhdLm5hbWVfbGVuID0gQVVESVRfTkFNRV9GVUxMOwotCWNvbnRleHQtPm5hbWVzW2lkeF0ubmFtZV9wdXQgPSAwOwkvKiBkb24ndCBjYWxsIF9fcHV0bmFtZSgpICovCiAKLQlpZiAoIWlub2RlKQotCQljb250ZXh0LT5uYW1lc1tpZHhdLmlubyA9ICh1bnNpZ25lZCBsb25nKS0xOwotCWVsc2UKLQkJYXVkaXRfY29weV9pbm9kZSgmY29udGV4dC0+bmFtZXNbaWR4XSwgaW5vZGUpOworCS8qIG5vIG1hdGNoaW5nIHBhcmVudCwgbG9vayBmb3IgbWF0Y2hpbmcgY2hpbGQgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvbnRleHQtPm5hbWVfY291bnQ7IGlkeCsrKSB7CisJCXN0cnVjdCBhdWRpdF9uYW1lcyAqbiA9ICZjb250ZXh0LT5uYW1lc1tpZHhdOwogCi0JLyogQSBwYXJlbnQgd2FzIG5vdCBmb3VuZCBpbiBhdWRpdF9uYW1lcywgc28gY29weSB0aGUgaW5vZGUgZGF0YSBmb3IgdGhlCi0JICogcHJvdmlkZWQgcGFyZW50LiAqLwotCWlmICghZm91bmRfbmFtZSkgewotCQlpZHggPSBjb250ZXh0LT5uYW1lX2NvdW50OwotCQlpZiAoY29udGV4dC0+bmFtZV9jb3VudCA9PSBBVURJVF9OQU1FUykgewotCQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCQkibmFtZV9jb3VudCBtYXhlZCBhbmQgbG9zaW5nIHBhcmVudCBpbm9kZSBkYXRhOiBkZXY9JTAyeDolMDJ4LCBpbm9kZT0lbHUiLAotCQkJCU1BSk9SKHBhcmVudC0+aV9zYi0+c19kZXYpLAotCQkJCU1JTk9SKHBhcmVudC0+aV9zYi0+c19kZXYpLAotCQkJCXBhcmVudC0+aV9pbm8pOwotCQkJcmV0dXJuOworCQlpZiAoIW4tPm5hbWUpCisJCQljb250aW51ZTsKKworCQkvKiBzdHJjbXAoKSBpcyB0aGUgbW9yZSBsaWtlbHkgc2NlbmFyaW8gKi8KKwkJaWYgKCFzdHJjbXAoZG5hbWUsIG4tPm5hbWUpIHx8CisJCSAgICAgIWF1ZGl0X2NvbXBhcmVfZG5hbWVfcGF0aChkbmFtZSwgbi0+bmFtZSwgJmRpcmxlbikpIHsKKwkJCWlmIChpbm9kZSkKKwkJCQlhdWRpdF9jb3B5X2lub2RlKG4sIGlub2RlKTsKKwkJCWVsc2UKKwkJCQluLT5pbm8gPSAodW5zaWduZWQgbG9uZyktMTsKKwkJCWZvdW5kX2NoaWxkID0gbi0+bmFtZTsKKwkJCWdvdG8gYWRkX25hbWVzOwogCQl9Ci0JCWNvbnRleHQtPm5hbWVfY291bnQrKzsKLSNpZiBBVURJVF9ERUJVRwotCQljb250ZXh0LT5pbm9fY291bnQrKzsKLSNlbmRpZgorCX0KKworYWRkX25hbWVzOgorCWlmICghZm91bmRfcGFyZW50KSB7CisJCWlmIChhdWRpdF9pbmNfbmFtZV9jb3VudChjb250ZXh0LCBwYXJlbnQpKQorCQkJcmV0dXJuOworCQlpZHggPSBjb250ZXh0LT5uYW1lX2NvdW50IC0gMTsKKwkJY29udGV4dC0+bmFtZXNbaWR4XS5uYW1lID0gTlVMTDsKIAkJYXVkaXRfY29weV9pbm9kZSgmY29udGV4dC0+bmFtZXNbaWR4XSwgcGFyZW50KTsKIAl9Ci19CiAKLS8qKgotICogYXVkaXRfaW5vZGVfdXBkYXRlIC0gdXBkYXRlIGlub2RlIGluZm8gZm9yIGxhc3QgY29sbGVjdGVkIG5hbWUKLSAqIEBpbm9kZTogaW5vZGUgYmVpbmcgYXVkaXRlZAotICoKLSAqIFdoZW4gb3BlbigpIGlzIGNhbGxlZCBvbiBhbiBleGlzdGluZyBvYmplY3Qgd2l0aCB0aGUgT19DUkVBVCBmbGFnLCB0aGUgaW5vZGUKLSAqIGRhdGEgYXVkaXQgaW5pdGlhbGx5IGNvbGxlY3RzIGlzIGluY29ycmVjdC4gIFRoaXMgYWRkaXRpb25hbCBob29rIGVuc3VyZXMKLSAqIGF1ZGl0IGhhcyB0aGUgaW5vZGUgZGF0YSBmb3IgdGhlIGFjdHVhbCBvYmplY3QgdG8gYmUgb3BlbmVkLgotICovCi12b2lkIF9fYXVkaXRfaW5vZGVfdXBkYXRlKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0Jc3RydWN0IGF1ZGl0X2NvbnRleHQgKmNvbnRleHQgPSBjdXJyZW50LT5hdWRpdF9jb250ZXh0OwotCWludCBpZHg7CisJaWYgKCFmb3VuZF9jaGlsZCkgeworCQlpZiAoYXVkaXRfaW5jX25hbWVfY291bnQoY29udGV4dCwgaW5vZGUpKQorCQkJcmV0dXJuOworCQlpZHggPSBjb250ZXh0LT5uYW1lX2NvdW50IC0gMTsKIAotCWlmICghY29udGV4dC0+aW5fc3lzY2FsbCB8fCAhaW5vZGUpCi0JCXJldHVybjsKKwkJLyogUmUtdXNlIHRoZSBuYW1lIGJlbG9uZ2luZyB0byB0aGUgc2xvdCBmb3IgYSBtYXRjaGluZyBwYXJlbnQKKwkJICogZGlyZWN0b3J5LiBBbGwgbmFtZXMgZm9yIHRoaXMgY29udGV4dCBhcmUgcmVsaW5xdWlzaGVkIGluCisJCSAqIGF1ZGl0X2ZyZWVfbmFtZXMoKSAqLworCQlpZiAoZm91bmRfcGFyZW50KSB7CisJCQljb250ZXh0LT5uYW1lc1tpZHhdLm5hbWUgPSBmb3VuZF9wYXJlbnQ7CisJCQljb250ZXh0LT5uYW1lc1tpZHhdLm5hbWVfbGVuID0gQVVESVRfTkFNRV9GVUxMOworCQkJLyogZG9uJ3QgY2FsbCBfX3B1dG5hbWUoKSAqLworCQkJY29udGV4dC0+bmFtZXNbaWR4XS5uYW1lX3B1dCA9IDA7CisJCX0gZWxzZSB7CisJCQljb250ZXh0LT5uYW1lc1tpZHhdLm5hbWUgPSBOVUxMOworCQl9CiAKLQlpZiAoY29udGV4dC0+bmFtZV9jb3VudCA9PSAwKSB7Ci0JCWNvbnRleHQtPm5hbWVfY291bnQrKzsKLSNpZiBBVURJVF9ERUJVRwotCQljb250ZXh0LT5pbm9fY291bnQrKzsKLSNlbmRpZgorCQlpZiAoaW5vZGUpCisJCQlhdWRpdF9jb3B5X2lub2RlKCZjb250ZXh0LT5uYW1lc1tpZHhdLCBpbm9kZSk7CisJCWVsc2UKKwkJCWNvbnRleHQtPm5hbWVzW2lkeF0uaW5vID0gKHVuc2lnbmVkIGxvbmcpLTE7CiAJfQotCWlkeCA9IGNvbnRleHQtPm5hbWVfY291bnQgLSAxOwotCi0JYXVkaXRfY29weV9pbm9kZSgmY29udGV4dC0+bmFtZXNbaWR4XSwgaW5vZGUpOwogfQogCiAvKioKQEAgLTE4ODAsNiArMTk0MywxNCBAQAogCXJldHVybiAwOwogfQogCit2b2lkIF9fYXVkaXRfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK3sKKwlzdHJ1Y3QgYXVkaXRfY29udGV4dCAqY29udGV4dCA9IGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQ7CisKKwljb250ZXh0LT50YXJnZXRfcGlkID0gdC0+cGlkOworCXNlbGludXhfZ2V0X3Rhc2tfc2lkKHQsICZjb250ZXh0LT50YXJnZXRfc2lkKTsKK30KKwogLyoqCiAgKiBhdWRpdF9hdmNfcGF0aCAtIHJlY29yZCB0aGUgZ3JhbnRpbmcgb3IgZGVuaWFsIG9mIHBlcm1pc3Npb25zCiAgKiBAZGVudHJ5OiBkZW50cnkgdG8gcmVjb3JkCkBAIC0xOTE4LDE1ICsxOTg5LDE3IEBACiAgKiBJZiB0aGUgYXVkaXQgc3Vic3lzdGVtIGlzIGJlaW5nIHRlcm1pbmF0ZWQsIHJlY29yZCB0aGUgdGFzayAocGlkKQogICogYW5kIHVpZCB0aGF0IGlzIGRvaW5nIHRoYXQuCiAgKi8KLXZvaWQgX19hdWRpdF9zaWduYWxfaW5mbyhpbnQgc2lnLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCitpbnQgX19hdWRpdF9zaWduYWxfaW5mbyhpbnQgc2lnLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCiB7CisJc3RydWN0IGF1ZGl0X2F1eF9kYXRhX3BpZHMgKmF4cDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisJc3RydWN0IGF1ZGl0X2NvbnRleHQgKmN0eCA9IHRzay0+YXVkaXRfY29udGV4dDsKIAlleHRlcm4gcGlkX3QgYXVkaXRfc2lnX3BpZDsKIAlleHRlcm4gdWlkX3QgYXVkaXRfc2lnX3VpZDsKIAlleHRlcm4gdTMyIGF1ZGl0X3NpZ19zaWQ7CiAKLQlpZiAoc2lnID09IFNJR1RFUk0gfHwgc2lnID09IFNJR0hVUCB8fCBzaWcgPT0gU0lHVVNSMSkgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JCXN0cnVjdCBhdWRpdF9jb250ZXh0ICpjdHggPSB0c2stPmF1ZGl0X2NvbnRleHQ7CisJaWYgKGF1ZGl0X3BpZCAmJiB0LT50Z2lkID09IGF1ZGl0X3BpZCAmJgorCSAgICAoc2lnID09IFNJR1RFUk0gfHwgc2lnID09IFNJR0hVUCB8fCBzaWcgPT0gU0lHVVNSMSkpIHsKIAkJYXVkaXRfc2lnX3BpZCA9IHRzay0+cGlkOwogCQlpZiAoY3R4KQogCQkJYXVkaXRfc2lnX3VpZCA9IGN0eC0+bG9naW51aWQ7CkBAIC0xOTM0LDQgKzIwMDcsNzIgQEAKIAkJCWF1ZGl0X3NpZ191aWQgPSB0c2stPnVpZDsKIAkJc2VsaW51eF9nZXRfdGFza19zaWQodHNrLCAmYXVkaXRfc2lnX3NpZCk7CiAJfQorCisJaWYgKCFhdWRpdF9zaWduYWxzKSAvKiBhdWRpdF9jb250ZXh0IGNoZWNrZWQgaW4gd3JhcHBlciAqLworCQlyZXR1cm4gMDsKKworCS8qIG9wdGltaXplIHRoZSBjb21tb24gY2FzZSBieSBwdXR0aW5nIGZpcnN0IHNpZ25hbCByZWNpcGllbnQgZGlyZWN0bHkKKwkgKiBpbiBhdWRpdF9jb250ZXh0ICovCisJaWYgKCFjdHgtPnRhcmdldF9waWQpIHsKKwkJY3R4LT50YXJnZXRfcGlkID0gdC0+dGdpZDsKKwkJc2VsaW51eF9nZXRfdGFza19zaWQodCwgJmN0eC0+dGFyZ2V0X3NpZCk7CisJCXJldHVybiAwOworCX0KKworCWF4cCA9ICh2b2lkICopY3R4LT5hdXhfcGlkczsKKwlpZiAoIWF4cCB8fCBheHAtPnBpZF9jb3VudCA9PSBBVURJVF9BVVhfUElEUykgeworCQlheHAgPSBremFsbG9jKHNpemVvZigqYXhwKSwgR0ZQX0FUT01JQyk7CisJCWlmICghYXhwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJYXhwLT5kLnR5cGUgPSBBVURJVF9PQkpfUElEOworCQlheHAtPmQubmV4dCA9IGN0eC0+YXV4X3BpZHM7CisJCWN0eC0+YXV4X3BpZHMgPSAodm9pZCAqKWF4cDsKKwl9CisJQlVHX09OKGF4cC0+cGlkX2NvdW50ID4gQVVESVRfQVVYX1BJRFMpOworCisJYXhwLT50YXJnZXRfcGlkW2F4cC0+cGlkX2NvdW50XSA9IHQtPnRnaWQ7CisJc2VsaW51eF9nZXRfdGFza19zaWQodCwgJmF4cC0+dGFyZ2V0X3NpZFtheHAtPnBpZF9jb3VudF0pOworCWF4cC0+cGlkX2NvdW50Kys7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhdWRpdF9jb3JlX2R1bXBzIC0gcmVjb3JkIGluZm9ybWF0aW9uIGFib3V0IHByb2Nlc3NlcyB0aGF0IGVuZCBhYm5vcm1hbGx5CisgKiBAc2lnOiBzaWduYWwgdmFsdWUKKyAqCisgKiBJZiBhIHByb2Nlc3MgZW5kcyB3aXRoIGEgY29yZSBkdW1wLCBzb21ldGhpbmcgZmlzaHkgaXMgZ29pbmcgb24gYW5kIHdlCisgKiBzaG91bGQgcmVjb3JkIHRoZSBldmVudCBmb3IgaW52ZXN0aWdhdGlvbi4KKyAqLwordm9pZCBhdWRpdF9jb3JlX2R1bXBzKGxvbmcgc2lnbnIpCit7CisJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWI7CisJdTMyIHNpZDsKKworCWlmICghYXVkaXRfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJaWYgKHNpZ25yID09IFNJR1FVSVQpCS8qIGRvbid0IGNhcmUgZm9yIHRob3NlICovCisJCXJldHVybjsKKworCWFiID0gYXVkaXRfbG9nX3N0YXJ0KE5VTEwsIEdGUF9LRVJORUwsIEFVRElUX0FOT01fQUJFTkQpOworCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICJhdWlkPSV1IHVpZD0ldSBnaWQ9JXUiLAorCQkJYXVkaXRfZ2V0X2xvZ2ludWlkKGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpLAorCQkJY3VycmVudC0+dWlkLCBjdXJyZW50LT5naWQpOworCXNlbGludXhfZ2V0X3Rhc2tfc2lkKGN1cnJlbnQsICZzaWQpOworCWlmIChzaWQpIHsKKwkJY2hhciAqY3R4ID0gTlVMTDsKKwkJdTMyIGxlbjsKKworCQlpZiAoc2VsaW51eF9zaWRfdG9fc3RyaW5nKHNpZCwgJmN0eCwgJmxlbikpCisJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHNzaWQ9JXUiLCBzaWQpOworCQllbHNlCisJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHN1Ymo9JXMiLCBjdHgpOworCQlrZnJlZShjdHgpOworCX0KKwlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHBpZD0lZCBjb21tPSIsIGN1cnJlbnQtPnBpZCk7CisJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgY3VycmVudC0+Y29tbSk7CisJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBzaWc9JWxkIiwgc2lnbnIpOworCWF1ZGl0X2xvZ19lbmQoYWIpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2NvbXBhdC5jIGIva2VybmVsL2NvbXBhdC5jCmluZGV4IGNlYmI0YzIuLjNiYWUzNzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTQ3NSw4ICs0NzUsOCBAQAogCXJldHVybiBtaW5fbGVuZ3RoOwogfQogCi1zdGF0aWMgaW50IGdldF9jb21wYXRfaXRpbWVyc3BlYyhzdHJ1Y3QgaXRpbWVyc3BlYyAqZHN0LCAKLQkJCQkgc3RydWN0IGNvbXBhdF9pdGltZXJzcGVjIF9fdXNlciAqc3JjKQoraW50IGdldF9jb21wYXRfaXRpbWVyc3BlYyhzdHJ1Y3QgaXRpbWVyc3BlYyAqZHN0LAorCQkJICBjb25zdCBzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgX191c2VyICpzcmMpCiB7IAogCWlmIChnZXRfY29tcGF0X3RpbWVzcGVjKCZkc3QtPml0X2ludGVydmFsLCAmc3JjLT5pdF9pbnRlcnZhbCkgfHwKIAkgICAgZ2V0X2NvbXBhdF90aW1lc3BlYygmZHN0LT5pdF92YWx1ZSwgJnNyYy0+aXRfdmFsdWUpKQpAQCAtNDg0LDggKzQ4NCw4IEBACiAJcmV0dXJuIDA7CiB9IAogCi1zdGF0aWMgaW50IHB1dF9jb21wYXRfaXRpbWVyc3BlYyhzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgX191c2VyICpkc3QsIAotCQkJCSBzdHJ1Y3QgaXRpbWVyc3BlYyAqc3JjKQoraW50IHB1dF9jb21wYXRfaXRpbWVyc3BlYyhzdHJ1Y3QgY29tcGF0X2l0aW1lcnNwZWMgX191c2VyICpkc3QsCisJCQkgIGNvbnN0IHN0cnVjdCBpdGltZXJzcGVjICpzcmMpCiB7IAogCWlmIChwdXRfY29tcGF0X3RpbWVzcGVjKCZzcmMtPml0X2ludGVydmFsLCAmZHN0LT5pdF9pbnRlcnZhbCkgfHwKIAkgICAgcHV0X2NvbXBhdF90aW1lc3BlYygmc3JjLT5pdF92YWx1ZSwgJmRzdC0+aXRfdmFsdWUpKQpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggYjBjNmYwYy4uYzZkMTRiOCAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWxmZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KQEAgLTQyLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPiAvKiBmb3IgYXVkaXRfZnJlZSgpICovCiAjaW5jbHVkZSA8bGludXgvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmdfb3BzLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KQEAgLTgyLDYgKzg0LDE0IEBACiAJc2lnaGFuZCA9IHJjdV9kZXJlZmVyZW5jZSh0c2stPnNpZ2hhbmQpOwogCXNwaW5fbG9jaygmc2lnaGFuZC0+c2lnbG9jayk7CiAKKwkvKgorCSAqIE5vdGlmeSB0aGF0IHRoaXMgc2lnaGFuZCBoYXMgYmVlbiBkZXRhY2hlZC4gVGhpcyBtdXN0CisJICogYmUgY2FsbGVkIHdpdGggdGhlIHRzay0+c2lnaGFuZCBsb2NrIGhlbGQuIEFsc28sIHRoaXMKKwkgKiBhY2Nlc3MgdHNrLT5zaWdoYW5kIGludGVybmFsbHksIHNvIGl0IG11c3QgYmUgY2FsbGVkCisJICogYmVmb3JlIHRzay0+c2lnaGFuZCBpcyByZXNldC4KKwkgKi8KKwlzaWduYWxmZF9kZXRhY2hfbG9ja2VkKHRzayk7CisKIAlwb3NpeF9jcHVfdGltZXJzX2V4aXQodHNrKTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2lnLT5jb3VudCkpCiAJCXBvc2l4X2NwdV90aW1lcnNfZXhpdF9ncm91cCh0c2spOwpAQCAtMTEzLDYgKzEyMyw4IEBACiAJCXNpZy0+bnZjc3cgKz0gdHNrLT5udmNzdzsKIAkJc2lnLT5uaXZjc3cgKz0gdHNrLT5uaXZjc3c7CiAJCXNpZy0+c2NoZWRfdGltZSArPSB0c2stPnNjaGVkX3RpbWU7CisJCXNpZy0+aW5ibG9jayArPSB0YXNrX2lvX2dldF9pbmJsb2NrKHRzayk7CisJCXNpZy0+b3VibG9jayArPSB0YXNrX2lvX2dldF9vdWJsb2NrKHRzayk7CiAJCXNpZyA9IE5VTEw7IC8qIE1hcmtlciBmb3IgYmVsb3cuICovCiAJfQogCkBAIC0yOTksMTIgKzMxMSwxMiBAQAogCWlmIChwcm9jZXNzX3Nlc3Npb24oY3VycikgIT0gc2Vzc2lvbikgewogCQlkZXRhY2hfcGlkKGN1cnIsIFBJRFRZUEVfU0lEKTsKIAkJc2V0X3NpZ25hbF9zZXNzaW9uKGN1cnItPnNpZ25hbCwgc2Vzc2lvbik7Ci0JCWF0dGFjaF9waWQoY3VyciwgUElEVFlQRV9TSUQsIHNlc3Npb24pOworCQlhdHRhY2hfcGlkKGN1cnIsIFBJRFRZUEVfU0lELCBmaW5kX3BpZChzZXNzaW9uKSk7CiAJfQogCWlmIChwcm9jZXNzX2dyb3VwKGN1cnIpICE9IHBncnApIHsKIAkJZGV0YWNoX3BpZChjdXJyLCBQSURUWVBFX1BHSUQpOwogCQljdXJyLT5zaWduYWwtPnBncnAgPSBwZ3JwOwotCQlhdHRhY2hfcGlkKGN1cnIsIFBJRFRZUEVfUEdJRCwgcGdycCk7CisJCWF0dGFjaF9waWQoY3VyciwgUElEVFlQRV9QR0lELCBmaW5kX3BpZChwZ3JwKSk7CiAJfQogfQogCkBAIC0xMTkzLDYgKzEyMDUsMTIgQEAKIAkJCXAtPm52Y3N3ICsgc2lnLT5udmNzdyArIHNpZy0+Y252Y3N3OwogCQlwc2lnLT5jbml2Y3N3ICs9CiAJCQlwLT5uaXZjc3cgKyBzaWctPm5pdmNzdyArIHNpZy0+Y25pdmNzdzsKKwkJcHNpZy0+Y2luYmxvY2sgKz0KKwkJCXRhc2tfaW9fZ2V0X2luYmxvY2socCkgKworCQkJc2lnLT5pbmJsb2NrICsgc2lnLT5jaW5ibG9jazsKKwkJcHNpZy0+Y291YmxvY2sgKz0KKwkJCXRhc2tfaW9fZ2V0X291YmxvY2socCkgKworCQkJc2lnLT5vdWJsb2NrICsgc2lnLT5jb3VibG9jazsKIAkJc3Bpbl91bmxvY2tfaXJxKCZwLT5wYXJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCX0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggNWRkMzk3OS4uNDk1MzBlNCAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC04NzUsNiArODc1LDcgQEAKIAlzaWctPnV0aW1lID0gc2lnLT5zdGltZSA9IHNpZy0+Y3V0aW1lID0gc2lnLT5jc3RpbWUgPSBjcHV0aW1lX3plcm87CiAJc2lnLT5udmNzdyA9IHNpZy0+bml2Y3N3ID0gc2lnLT5jbnZjc3cgPSBzaWctPmNuaXZjc3cgPSAwOwogCXNpZy0+bWluX2ZsdCA9IHNpZy0+bWFqX2ZsdCA9IHNpZy0+Y21pbl9mbHQgPSBzaWctPmNtYWpfZmx0ID0gMDsKKwlzaWctPmluYmxvY2sgPSBzaWctPm91YmxvY2sgPSBzaWctPmNpbmJsb2NrID0gc2lnLT5jb3VibG9jayA9IDA7CiAJc2lnLT5zY2hlZF90aW1lID0gMDsKIAlJTklUX0xJU1RfSEVBRCgmc2lnLT5jcHVfdGltZXJzWzBdKTsKIAlJTklUX0xJU1RfSEVBRCgmc2lnLT5jcHVfdGltZXJzWzFdKTsKQEAgLTk1NSw3ICs5NTYsNyBAQAogCQkJCQl1bnNpZ25lZCBsb25nIHN0YWNrX3NpemUsCiAJCQkJCWludCBfX3VzZXIgKnBhcmVudF90aWRwdHIsCiAJCQkJCWludCBfX3VzZXIgKmNoaWxkX3RpZHB0ciwKLQkJCQkJaW50IHBpZCkKKwkJCQkJc3RydWN0IHBpZCAqcGlkKQogewogCWludCByZXR2YWw7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gTlVMTDsKQEAgLTEwMjIsNyArMTAyMyw3IEBACiAJcC0+ZGlkX2V4ZWMgPSAwOwogCWRlbGF5YWNjdF90c2tfaW5pdChwKTsJLyogTXVzdCByZW1haW4gYWZ0ZXIgZHVwX3Rhc2tfc3RydWN0KCkgKi8KIAljb3B5X2ZsYWdzKGNsb25lX2ZsYWdzLCBwKTsKLQlwLT5waWQgPSBwaWQ7CisJcC0+cGlkID0gcGlkX25yKHBpZCk7CiAJcmV0dmFsID0gLUVGQVVMVDsKIAlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9QQVJFTlRfU0VUVElEKQogCQlpZiAocHV0X3VzZXIocC0+cGlkLCBwYXJlbnRfdGlkcHRyKSkKQEAgLTEyNTEsMTMgKzEyNTIsMTMgQEAKIAkJCXAtPnNpZ25hbC0+dHR5ID0gY3VycmVudC0+c2lnbmFsLT50dHk7CiAJCQlwLT5zaWduYWwtPnBncnAgPSBwcm9jZXNzX2dyb3VwKGN1cnJlbnQpOwogCQkJc2V0X3NpZ25hbF9zZXNzaW9uKHAtPnNpZ25hbCwgcHJvY2Vzc19zZXNzaW9uKGN1cnJlbnQpKTsKLQkJCWF0dGFjaF9waWQocCwgUElEVFlQRV9QR0lELCBwcm9jZXNzX2dyb3VwKHApKTsKLQkJCWF0dGFjaF9waWQocCwgUElEVFlQRV9TSUQsIHByb2Nlc3Nfc2Vzc2lvbihwKSk7CisJCQlhdHRhY2hfcGlkKHAsIFBJRFRZUEVfUEdJRCwgdGFza19wZ3JwKGN1cnJlbnQpKTsKKwkJCWF0dGFjaF9waWQocCwgUElEVFlQRV9TSUQsIHRhc2tfc2Vzc2lvbihjdXJyZW50KSk7CiAKIAkJCWxpc3RfYWRkX3RhaWxfcmN1KCZwLT50YXNrcywgJmluaXRfdGFzay50YXNrcyk7CiAJCQlfX2dldF9jcHVfdmFyKHByb2Nlc3NfY291bnRzKSsrOwogCQl9Ci0JCWF0dGFjaF9waWQocCwgUElEVFlQRV9QSUQsIHAtPnBpZCk7CisJCWF0dGFjaF9waWQocCwgUElEVFlQRV9QSUQsIHBpZCk7CiAJCW5yX3RocmVhZHMrKzsKIAl9CiAKQEAgLTEzMjEsNyArMTMyMiw4IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CiAKLQl0YXNrID0gY29weV9wcm9jZXNzKENMT05FX1ZNLCAwLCBpZGxlX3JlZ3MoJnJlZ3MpLCAwLCBOVUxMLCBOVUxMLCAwKTsKKwl0YXNrID0gY29weV9wcm9jZXNzKENMT05FX1ZNLCAwLCBpZGxlX3JlZ3MoJnJlZ3MpLCAwLCBOVUxMLCBOVUxMLAorCQkJCSZpbml0X3N0cnVjdF9waWQpOwogCWlmICghSVNfRVJSKHRhc2spKQogCQlpbml0X2lkbGUodGFzaywgY3B1KTsKIApAQCAtMTM3MSw3ICsxMzczLDcgQEAKIAkJCWNsb25lX2ZsYWdzIHw9IENMT05FX1BUUkFDRTsKIAl9CiAKLQlwID0gY29weV9wcm9jZXNzKGNsb25lX2ZsYWdzLCBzdGFja19zdGFydCwgcmVncywgc3RhY2tfc2l6ZSwgcGFyZW50X3RpZHB0ciwgY2hpbGRfdGlkcHRyLCBucik7CisJcCA9IGNvcHlfcHJvY2VzcyhjbG9uZV9mbGFncywgc3RhY2tfc3RhcnQsIHJlZ3MsIHN0YWNrX3NpemUsIHBhcmVudF90aWRwdHIsIGNoaWxkX3RpZHB0ciwgcGlkKTsKIAkvKgogCSAqIERvIHRoaXMgcHJpb3Igd2FraW5nIHVwIHRoZSBuZXcgdGhyZWFkIC0gdGhlIHRocmVhZCBwb2ludGVyCiAJICogbWlnaHQgZ2V0IGludmFsaWQgYWZ0ZXIgdGhhdCBwb2ludCwgaWYgdGhlIHRocmVhZCBleGl0cyBxdWlja2x5LgpAQCAtMTQyMCwxMiArMTQyMiwxNSBAQAogI2RlZmluZSBBUkNIX01JTl9NTVNUUlVDVF9BTElHTiAwCiAjZW5kaWYKIAotc3RhdGljIHZvaWQgc2lnaGFuZF9jdG9yKHZvaWQgKmRhdGEsIHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCitzdGF0aWMgdm9pZCBzaWdoYW5kX2N0b3Iodm9pZCAqZGF0YSwgc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpzaWdoYW5kID0gZGF0YTsKIAotCWlmIChmbGFncyAmIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwlpZiAoZmxhZ3MgJiBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpIHsKIAkJc3Bpbl9sb2NrX2luaXQoJnNpZ2hhbmQtPnNpZ2xvY2spOworCQlJTklUX0xJU1RfSEVBRCgmc2lnaGFuZC0+c2lnbmFsZmRfbGlzdCk7CisJfQogfQogCiB2b2lkIF9faW5pdCBwcm9jX2NhY2hlc19pbml0KHZvaWQpCkBAIC0xNDUxLDcgKzE0NTYsNiBAQAogCQkJU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOwogfQogCi0KIC8qCiAgKiBDaGVjayBjb25zdHJhaW50cyBvbiBmbGFncyBwYXNzZWQgdG8gdGhlIHVuc2hhcmUgc3lzdGVtIGNhbGwgYW5kCiAgKiBmb3JjZSB1bnNoYXJpbmcgb2YgYWRkaXRpb25hbCBwcm9jZXNzIGNvbnRleHQgYXMgYXBwcm9wcmlhdGUuCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3Byb2MuYyBiL2tlcm5lbC9pcnEvcHJvYy5jCmluZGV4IGRkZGUwZWYuLmI0ZjE2NzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvcHJvYy5jCisrKyBiL2tlcm5lbC9pcnEvcHJvYy5jCkBAIC0yNyw2ICsyNywxMCBAQAogCXJldHVybiBsZW47CiB9CiAKKyNpZm5kZWYgaXNfYWZmaW5pdHlfbWFza192YWxpZAorI2RlZmluZSBpc19hZmZpbml0eV9tYXNrX3ZhbGlkKHZhbCkgMQorI2VuZGlmCisKIGludCBub19pcnFfYWZmaW5pdHk7CiBzdGF0aWMgaW50IGlycV9hZmZpbml0eV93cml0ZV9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCkBAIC00Miw2ICs0Niw5IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCWlmICghaXNfYWZmaW5pdHlfbWFza192YWxpZChuZXdfdmFsdWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCS8qCiAJICogRG8gbm90IGFsbG93IGRpc2FibGluZyBJUlFzIGNvbXBsZXRlbHkgLSBpdCdzIGEgdG9vIGVhc3kKIAkgKiB3YXkgdG8gbWFrZSB0aGUgc3lzdGVtIHVudXNhYmxlIGFjY2lkZW50YWxseSA6LSkgQXQgbGVhc3QKZGlmZiAtLWdpdCBhL2tlcm5lbC9waWQuYyBiL2tlcm5lbC9waWQuYwppbmRleCBkM2FkNzI0Li5lYjY2YmQyIDEwMDY0NAotLS0gYS9rZXJuZWwvcGlkLmMKKysrIGIva2VybmVsL3BpZC5jCkBAIC0yNywxMSArMjcsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KIAogI2RlZmluZSBwaWRfaGFzaGZuKG5yKSBoYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpbnIsIHBpZGhhc2hfc2hpZnQpCiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgKnBpZF9oYXNoOwogc3RhdGljIGludCBwaWRoYXNoX3NoaWZ0Owogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwaWRfY2FjaGVwOworc3RydWN0IHBpZCBpbml0X3N0cnVjdF9waWQgPSBJTklUX1NUUlVDVF9QSUQ7CiAKIGludCBwaWRfbWF4ID0gUElEX01BWF9ERUZBVUxUOwogCkBAIC0yNDcsMTMgKzI0OSwxNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZmluZF9waWQpOwogCi1pbnQgZmFzdGNhbGwgYXR0YWNoX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGVudW0gcGlkX3R5cGUgdHlwZSwgaW50IG5yKQorLyoKKyAqIGF0dGFjaF9waWQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSB0YXNrbGlzdF9sb2NrIHdyaXRlLWhlbGQuCisgKi8KK2ludCBmYXN0Y2FsbCBhdHRhY2hfcGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgZW51bSBwaWRfdHlwZSB0eXBlLAorCQlzdHJ1Y3QgcGlkICpwaWQpCiB7CiAJc3RydWN0IHBpZF9saW5rICpsaW5rOwotCXN0cnVjdCBwaWQgKnBpZDsKIAogCWxpbmsgPSAmdGFzay0+cGlkc1t0eXBlXTsKLQlsaW5rLT5waWQgPSBwaWQgPSBmaW5kX3BpZChucik7CisJbGluay0+cGlkID0gcGlkOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmbGluay0+bm9kZSwgJnBpZC0+dGFza3NbdHlwZV0pOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9rZXJuZWwvcHRyYWNlLmMgYi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNGQ1MGUwNi4uYWQ3OTQ5YSAxMDA2NDQKLS0tIGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2tlcm5lbC9wdHJhY2UuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTE2MSw2ICsxNjIsOCBAQAogewogCWludCByZXR2YWw7CiAKKwlhdWRpdF9wdHJhY2UodGFzayk7CisKIAlyZXR2YWwgPSAtRVBFUk07CiAJaWYgKHRhc2stPnBpZCA8PSAxKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCAyYWMzYTY2Li4zNjRmYzk1IDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWxmZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgpAQCAtMTEzLDggKzExNCw3IEBACiAKIC8qIEdpdmVuIHRoZSBtYXNrLCBmaW5kIHRoZSBmaXJzdCBhdmFpbGFibGUgc2lnbmFsIHRoYXQgc2hvdWxkIGJlIHNlcnZpY2VkLiAqLwogCi1zdGF0aWMgaW50Ci1uZXh0X3NpZ25hbChzdHJ1Y3Qgc2lncGVuZGluZyAqcGVuZGluZywgc2lnc2V0X3QgKm1hc2spCitpbnQgbmV4dF9zaWduYWwoc3RydWN0IHNpZ3BlbmRpbmcgKnBlbmRpbmcsIHNpZ3NldF90ICptYXNrKQogewogCXVuc2lnbmVkIGxvbmcgaSwgKnMsICptLCB4OwogCWludCBzaWcgPSAwOwpAQCAtNDk3LDYgKzQ5NywxMSBAQAogCWludCBlcnJvciA9IC1FSU5WQUw7CiAJaWYgKCF2YWxpZF9zaWduYWwoc2lnKSkKIAkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBhdWRpdF9zaWduYWxfaW5mbyhzaWcsIHQpOyAvKiBMZXQgYXVkaXQgc3lzdGVtIHNlZSB0aGUgc2lnbmFsICovCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKIAllcnJvciA9IC1FUEVSTTsKIAlpZiAoKGluZm8gPT0gU0VORF9TSUdfTk9JTkZPIHx8ICghaXNfc2lfc3BlY2lhbChpbmZvKSAmJiBTSV9GUk9NVVNFUihpbmZvKSkpCiAJICAgICYmICgoc2lnICE9IFNJR0NPTlQpIHx8CkBAIC01MDYsMTAgKzUxMSw3IEBACiAJICAgICYmICFjYXBhYmxlKENBUF9LSUxMKSkKIAkJcmV0dXJuIGVycm9yOwogCi0JZXJyb3IgPSBzZWN1cml0eV90YXNrX2tpbGwodCwgaW5mbywgc2lnLCAwKTsKLQlpZiAoIWVycm9yKQotCQlhdWRpdF9zaWduYWxfaW5mbyhzaWcsIHQpOyAvKiBMZXQgYXVkaXQgc3lzdGVtIHNlZSB0aGUgc2lnbmFsICovCi0JcmV0dXJuIGVycm9yOworCXJldHVybiBzZWN1cml0eV90YXNrX2tpbGwodCwgaW5mbywgc2lnLCAwKTsKIH0KIAogLyogZm9yd2FyZCBkZWNsICovCkBAIC02MzAsNiArNjMyLDEyIEBACiAJaW50IHJldCA9IDA7CiAKIAkvKgorCSAqIERlbGl2ZXIgdGhlIHNpZ25hbCB0byBsaXN0ZW5pbmcgc2lnbmFsZmRzLiBUaGlzIG11c3QgYmUgY2FsbGVkCisJICogd2l0aCB0aGUgc2lnaGFuZCBsb2NrIGhlbGQuCisJICovCisJc2lnbmFsZmRfbm90aWZ5KHQsIHNpZyk7CisKKwkvKgogCSAqIGZhc3QtcGF0aGVkIHNpZ25hbHMgZm9yIGtlcm5lbC1pbnRlcm5hbCB0aGluZ3MgbGlrZSBTSUdTVE9QCiAJICogb3IgU0lHS0lMTC4KIAkgKi8KQEAgLTEyODAsNiArMTI4OCwxMSBAQAogCQlyZXQgPSAxOwogCQlnb3RvIG91dDsKIAl9CisJLyoKKwkgKiBEZWxpdmVyIHRoZSBzaWduYWwgdG8gbGlzdGVuaW5nIHNpZ25hbGZkcy4gVGhpcyBtdXN0IGJlIGNhbGxlZAorCSAqIHdpdGggdGhlIHNpZ2hhbmQgbG9jayBoZWxkLgorCSAqLworCXNpZ25hbGZkX25vdGlmeShwLCBzaWcpOwogCiAJbGlzdF9hZGRfdGFpbCgmcS0+bGlzdCwgJnAtPnBlbmRpbmcubGlzdCk7CiAJc2lnYWRkc2V0KCZwLT5wZW5kaW5nLnNpZ25hbCwgc2lnKTsKQEAgLTEzMjMsNiArMTMzNiwxMSBAQAogCQlxLT5pbmZvLnNpX292ZXJydW4rKzsKIAkJZ290byBvdXQ7CiAJfSAKKwkvKgorCSAqIERlbGl2ZXIgdGhlIHNpZ25hbCB0byBsaXN0ZW5pbmcgc2lnbmFsZmRzLiBUaGlzIG11c3QgYmUgY2FsbGVkCisJICogd2l0aCB0aGUgc2lnaGFuZCBsb2NrIGhlbGQuCisJICovCisJc2lnbmFsZmRfbm90aWZ5KHAsIHNpZyk7CiAKIAkvKgogCSAqIFB1dCB0aGlzIHNpZ25hbCBvbiB0aGUgc2hhcmVkLXBlbmRpbmcgcXVldWUuCkBAIC0xOTgzLDYgKzIwMDEsOCBAQAogCS8qCiAJICogSWYgeW91IGNoYW5nZSBzaWdpbmZvX3Qgc3RydWN0dXJlLCBwbGVhc2UgYmUgc3VyZQogCSAqIHRoaXMgY29kZSBpcyBmaXhlZCBhY2NvcmRpbmdseS4KKwkgKiBQbGVhc2UgcmVtZW1iZXIgdG8gdXBkYXRlIHRoZSBzaWduYWxmZF9jb3B5aW5mbygpIGZ1bmN0aW9uCisJICogaW5zaWRlIGZzL3NpZ25hbGZkLmMgdG9vLCBpbiBjYXNlIHNpZ2luZm9fdCBjaGFuZ2VzLgogCSAqIEl0IHNob3VsZCBuZXZlciBjb3B5IGFueSBwYWQgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUKIAkgKiB0byBhdm9pZCBzZWN1cml0eSBsZWFrcywgYnV0IG11c3QgY29weSB0aGUgZ2VuZXJpYwogCSAqIDMgaW50cyBwbHVzIHRoZSByZWxldmFudCB1bmlvbiBtZW1iZXIuCmRpZmYgLS1naXQgYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMgYi9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKaW5kZXggZGFhYmI3NC4uZmNlZTJhOCAxMDA2NDQKLS0tIGEva2VybmVsL3N0b3BfbWFjaGluZS5jCisrKyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwpAQCAtOCw2ICs4LDggQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0b3BfbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC00NSw2ICs0Nyw3IEBACiAJCWlmIChzdG9wbWFjaGluZV9zdGF0ZSA9PSBTVE9QTUFDSElORV9ESVNBQkxFX0lSUSAKIAkJICAgICYmICFpcnFzX2Rpc2FibGVkKSB7CiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQkJaGFyZF9pcnFfZGlzYWJsZSgpOwogCQkJaXJxc19kaXNhYmxlZCA9IDE7CiAJCQkvKiBBY2s6IGlycXMgZGlzYWJsZWQuICovCiAJCQlzbXBfbWIoKTsgLyogTXVzdCByZWFkIHN0YXRlIGZpcnN0LiAqLwpAQCAtMTI0LDYgKzEyNyw3IEBACiAKIAkvKiBNYWtlIHRoZW0gZGlzYWJsZSBpcnFzLiAqLwogCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJaGFyZF9pcnFfZGlzYWJsZSgpOwogCXN0b3BtYWNoaW5lX3NldF9zdGF0ZShTVE9QTUFDSElORV9ESVNBQkxFX0lSUSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXMuYyBiL2tlcm5lbC9zeXMuYwppbmRleCBjZGI3ZTk0Li44NzIyNzFjIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzLmMKKysrIGIva2VybmVsL3N5cy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CkBAIC0yOSw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvY25fcHJvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2dldGNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CkBAIC02NTgsNyArNjYwLDcgQEAKIAlpbnQgZXJyb3IgPSAtRUlOVkFMOwogCXN0cnVjdCBwaWQgKnBncnA7CiAKLQlpZiAod2hpY2ggPiAyIHx8IHdoaWNoIDwgMCkKKwlpZiAod2hpY2ggPiBQUklPX1VTRVIgfHwgd2hpY2ggPCBQUklPX1BST0NFU1MpCiAJCWdvdG8gb3V0OwogCiAJLyogbm9ybWFsaXplOiBhdm9pZCBzaWduZWQgZGl2aXNpb24gKHJvdW5kaW5nIHByb2JsZW1zKSAqLwpAQCAtNzIyLDcgKzcyNCw3IEBACiAJbG9uZyBuaWNldmFsLCByZXR2YWwgPSAtRVNSQ0g7CiAJc3RydWN0IHBpZCAqcGdycDsKIAotCWlmICh3aGljaCA+IDIgfHwgd2hpY2ggPCAwKQorCWlmICh3aGljaCA+IFBSSU9fVVNFUiB8fCB3aGljaCA8IFBSSU9fUFJPQ0VTUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwpAQCAtMTQ4Niw3ICsxNDg4LDcgQEAKIAlpZiAocHJvY2Vzc19ncm91cChwKSAhPSBwZ2lkKSB7CiAJCWRldGFjaF9waWQocCwgUElEVFlQRV9QR0lEKTsKIAkJcC0+c2lnbmFsLT5wZ3JwID0gcGdpZDsKLQkJYXR0YWNoX3BpZChwLCBQSURUWVBFX1BHSUQsIHBnaWQpOworCQlhdHRhY2hfcGlkKHAsIFBJRFRZUEVfUEdJRCwgZmluZF9waWQocGdpZCkpOwogCX0KIAogCWVyciA9IDA7CkBAIC0yMDgyLDYgKzIwODQsOCBAQAogCQkJci0+cnVfbml2Y3N3ID0gcC0+c2lnbmFsLT5jbml2Y3N3OwogCQkJci0+cnVfbWluZmx0ID0gcC0+c2lnbmFsLT5jbWluX2ZsdDsKIAkJCXItPnJ1X21hamZsdCA9IHAtPnNpZ25hbC0+Y21hal9mbHQ7CisJCQlyLT5ydV9pbmJsb2NrID0gcC0+c2lnbmFsLT5jaW5ibG9jazsKKwkJCXItPnJ1X291YmxvY2sgPSBwLT5zaWduYWwtPmNvdWJsb2NrOwogCiAJCQlpZiAod2hvID09IFJVU0FHRV9DSElMRFJFTikKIAkJCQlicmVhazsKQEAgLTIwOTMsNiArMjA5Nyw4IEBACiAJCQlyLT5ydV9uaXZjc3cgKz0gcC0+c2lnbmFsLT5uaXZjc3c7CiAJCQlyLT5ydV9taW5mbHQgKz0gcC0+c2lnbmFsLT5taW5fZmx0OwogCQkJci0+cnVfbWFqZmx0ICs9IHAtPnNpZ25hbC0+bWFqX2ZsdDsKKwkJCXItPnJ1X2luYmxvY2sgKz0gcC0+c2lnbmFsLT5pbmJsb2NrOworCQkJci0+cnVfb3VibG9jayArPSBwLT5zaWduYWwtPm91YmxvY2s7CiAJCQl0ID0gcDsKIAkJCWRvIHsKIAkJCQl1dGltZSA9IGNwdXRpbWVfYWRkKHV0aW1lLCB0LT51dGltZSk7CkBAIC0yMTAxLDYgKzIxMDcsOCBAQAogCQkJCXItPnJ1X25pdmNzdyArPSB0LT5uaXZjc3c7CiAJCQkJci0+cnVfbWluZmx0ICs9IHQtPm1pbl9mbHQ7CiAJCQkJci0+cnVfbWFqZmx0ICs9IHQtPm1hal9mbHQ7CisJCQkJci0+cnVfaW5ibG9jayArPSB0YXNrX2lvX2dldF9pbmJsb2NrKHQpOworCQkJCXItPnJ1X291YmxvY2sgKz0gdGFza19pb19nZXRfb3VibG9jayh0KTsKIAkJCQl0ID0gbmV4dF90aHJlYWQodCk7CiAJCQl9IHdoaWxlICh0ICE9IHApOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzX25pLmMgYi9rZXJuZWwvc3lzX25pLmMKaW5kZXggZDczMDZkMC4uN2UxMWUyYyAxMDA2NDQKLS0tIGEva2VybmVsL3N5c19uaS5jCisrKyBiL2tlcm5lbC9zeXNfbmkuYwpAQCAtMTQxLDMgKzE0MSwxMCBAQAogY29uZF9zeXNjYWxsKHN5c19iZGZsdXNoKTsKIGNvbmRfc3lzY2FsbChzeXNfaW9wcmlvX3NldCk7CiBjb25kX3N5c2NhbGwoc3lzX2lvcHJpb19nZXQpOworCisvKiBOZXcgZmlsZSBkZXNjcmlwdG9ycyAqLworY29uZF9zeXNjYWxsKHN5c19zaWduYWxmZCk7Citjb25kX3N5c2NhbGwoc3lzX3RpbWVyZmQpOworY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfc2lnbmFsZmQpOworY29uZF9zeXNjYWxsKGNvbXBhdF9zeXNfdGltZXJmZCk7Citjb25kX3N5c2NhbGwoc3lzX2V2ZW50ZmQpOwpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCBlZTA1YjhhLi5mYmM1YzYyIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtNDM4LDYgKzQzOCw3IEBACiBjb25maWcgRkFVTFRfSU5KRUNUSU9OX1NUQUNLVFJBQ0VfRklMVEVSCiAJYm9vbCAic3RhY2t0cmFjZSBmaWx0ZXIgZm9yIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXRpZXMiCiAJZGVwZW5kcyBvbiBGQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMgJiYgU1RBQ0tUUkFDRV9TVVBQT1JUCisJZGVwZW5kcyBvbiAhWDg2XzY0CiAJc2VsZWN0IFNUQUNLVFJBQ0UKIAlzZWxlY3QgRlJBTUVfUE9JTlRFUgogCWhlbHAKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCAxZjY1YjQ2Li5jOGM4ZTIwIDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw3IEBACiBsaWIteQkrPSBrb2JqZWN0Lm8ga3JlZi5vIGtvYmplY3RfdWV2ZW50Lm8ga2xpc3QubwogCiBvYmoteSArPSBkaXY2NC5vIHNvcnQubyBwYXJzZXIubyBoYWxmbWQ0Lm8gZGVidWdfbG9ja3MubyByYW5kb20zMi5vIFwKLQkgYnVzdF9zcGlubG9ja3MubworCSBidXN0X3NwaW5sb2Nrcy5vIGhleGR1bXAubwogCiBpZmVxICgkKENPTkZJR19ERUJVR19LT0JKRUNUKSx5KQogQ0ZMQUdTX2tvYmplY3QubyArPSAtRERFQlVHCmRpZmYgLS1naXQgYS9saWIvYXVkaXQuYyBiL2xpYi9hdWRpdC5jCmluZGV4IDNiMTI4OWYuLjhlN2RjMWMgMTAwNjQ0Ci0tLSBhL2xpYi9hdWRpdC5jCisrKyBiL2xpYi9hdWRpdC5jCkBAIC0yMyw2ICsyMywxNiBAQAogfjBVCiB9OwogCitzdGF0aWMgdW5zaWduZWQgc2lnbmFsX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfc2lnbmFsLmg+Cit+MFUKK307CisKK2ludCBhdWRpdF9jbGFzc2lmeV9hcmNoKGludCBhcmNoKQoreworCXJldHVybiAwOworfQorCiBpbnQgYXVkaXRfY2xhc3NpZnlfc3lzY2FsbChpbnQgYWJpLCB1bnNpZ25lZCBzeXNjYWxsKQogewogCXN3aXRjaChzeXNjYWxsKSB7CkBAIC00OSw2ICs1OSw3IEBACiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfUkVBRCwgcmVhZF9jbGFzcyk7CiAJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfRElSX1dSSVRFLCBkaXJfY2xhc3MpOwogCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0NIQVRUUiwgY2hhdHRyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19TSUdOQUwsIHNpZ25hbF9jbGFzcyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9oZXhkdW1wLmMgYi9saWIvaGV4ZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZGE1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvaGV4ZHVtcC5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogbGliL2hleGR1bXAuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyoqCisgKiBoZXhfZHVtcF90b19idWZmZXIgLSBjb252ZXJ0IGEgYmxvYiBvZiBkYXRhIHRvICJoZXggQVNDSUkiIGluIG1lbW9yeQorICogQGJ1ZjogZGF0YSBibG9iIHRvIGR1bXAKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyBpbiB0aGUgQGJ1ZgorICogQGxpbmVidWY6IHdoZXJlIHRvIHB1dCB0aGUgY29udmVydGVkIGRhdGEKKyAqIEBsaW5lYnVmbGVuOiB0b3RhbCBzaXplIG9mIEBsaW5lYnVmLCBpbmNsdWRpbmcgc3BhY2UgZm9yIHRlcm1pbmF0aW5nIE5VTAorICoKKyAqIGhleF9kdW1wX3RvX2J1ZmZlcigpIHdvcmtzIG9uIG9uZSAibGluZSIgb2Ygb3V0cHV0IGF0IGEgdGltZSwgaS5lLiwKKyAqIDE2IGJ5dGVzIG9mIGlucHV0IGRhdGEgY29udmVydGVkIHRvIGhleCArIEFTQ0lJIG91dHB1dC4KKyAqCisgKiBHaXZlbiBhIGJ1ZmZlciBvZiB1OCBkYXRhLCBoZXhfZHVtcF90b19idWZmZXIoKSBjb252ZXJ0cyB0aGUgaW5wdXQgZGF0YQorICogdG8gYSBoZXggKyBBU0NJSSBkdW1wIGF0IHRoZSBzdXBwbGllZCBtZW1vcnkgbG9jYXRpb24uCisgKiBUaGUgY29udmVydGVkIG91dHB1dCBpcyBhbHdheXMgTlVMLXRlcm1pbmF0ZWQuCisgKgorICogRS5nLjoKKyAqCWhleF9kdW1wX3RvX2J1ZmZlcihmcmFtZS0+ZGF0YSwgZnJhbWUtPmxlbiwgbGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpKTsKKyAqCisgKiBleGFtcGxlIG91dHB1dCBidWZmZXI6CisgKiA0MDQxNDI0MyA0NDQ1NDY0NyA0ODQ5NGE0YiA0YzRkNGU0ZiAgQEFCQ0RFRkdISUpLTE1OTworICovCit2b2lkIGhleF9kdW1wX3RvX2J1ZmZlcihjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGNoYXIgKmxpbmVidWYsCisJCQlzaXplX3QgbGluZWJ1ZmxlbikKK3sKKwljb25zdCB1OCAqcHRyID0gYnVmOworCXU4IGNoOworCWludCBqLCBseCA9IDA7CisKKwlmb3IgKGogPSAwOyAoaiA8IDE2KSAmJiAoaiA8IGxlbikgJiYgKGx4ICsgMykgPCBsaW5lYnVmbGVuOyBqKyspIHsKKwkJaWYgKGogJiYgIShqICUgNCkpCisJCQlsaW5lYnVmW2x4KytdID0gJyAnOworCQljaCA9IHB0cltqXTsKKwkJbGluZWJ1ZltseCsrXSA9IGhleF9hc2MoY2ggPj4gNCk7CisJCWxpbmVidWZbbHgrK10gPSBoZXhfYXNjKGNoICYgMHgwZik7CisJfQorCWlmICgobHggKyAyKSA8IGxpbmVidWZsZW4pIHsKKwkJbGluZWJ1ZltseCsrXSA9ICcgJzsKKwkJbGluZWJ1ZltseCsrXSA9ICcgJzsKKwl9CisJZm9yIChqID0gMDsgKGogPCAxNikgJiYgKGogPCBsZW4pICYmIChseCArIDIpIDwgbGluZWJ1ZmxlbjsgaisrKQorCQlsaW5lYnVmW2x4KytdID0gaXNwcmludChwdHJbal0pID8gcHRyW2pdIDogJy4nOworCWxpbmVidWZbbHgrK10gPSAnXDAnOworfQorRVhQT1JUX1NZTUJPTChoZXhfZHVtcF90b19idWZmZXIpOworCisvKioKKyAqIHByaW50X2hleF9kdW1wIC0gcHJpbnQgYSB0ZXh0IGhleCBkdW1wIHRvIHN5c2xvZyBmb3IgYSBiaW5hcnkgYmxvYiBvZiBkYXRhCisgKiBAbGV2ZWw6IGtlcm5lbCBsb2cgbGV2ZWwgKGUuZy4gS0VSTl9ERUJVRykKKyAqIEBwcmVmaXhfdHlwZTogY29udHJvbHMgd2hldGhlciBwcmVmaXggb2YgYW4gb2Zmc2V0LCBhZGRyZXNzLCBvciBub25lCisgKiAgaXMgcHJpbnRlZCAoJURVTVBfUFJFRklYX09GRlNFVCwgJURVTVBfUFJFRklYX0FERFJFU1MsICVEVU1QX1BSRUZJWF9OT05FKQorICogQGJ1ZjogZGF0YSBibG9iIHRvIGR1bXAKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyBpbiB0aGUgQGJ1ZgorICoKKyAqIEdpdmVuIGEgYnVmZmVyIG9mIHU4IGRhdGEsIHByaW50X2hleF9kdW1wKCkgcHJpbnRzIGEgaGV4ICsgQVNDSUkgZHVtcAorICogdG8gdGhlIGtlcm5lbCBsb2cgYXQgdGhlIHNwZWNpZmllZCBrZXJuZWwgbG9nIGxldmVsLCB3aXRoIGFuIG9wdGlvbmFsCisgKiBsZWFkaW5nIHByZWZpeC4KKyAqCisgKiBFLmcuOgorICogICBwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCBEVU1QX1BSRUZJWF9BRERSRVNTLCBmcmFtZS0+ZGF0YSwgZnJhbWUtPmxlbik7CisgKgorICogRXhhbXBsZSBvdXRwdXQgdXNpbmcgJURVTVBfUFJFRklYX09GRlNFVDoKKyAqIDAwMDlhYjQyOiA0MDQxNDI0MyA0NDQ1NDY0NyA0ODQ5NGE0YiA0YzRkNGU0ZiAgQEFCQ0RFRkdISUpLTE1OTworICogRXhhbXBsZSBvdXRwdXQgdXNpbmcgJURVTVBfUFJFRklYX0FERFJFU1M6CisgKiBmZmZmZmZmZjg4MDg5YWYwOiA3MDcxNzI3MyA3NDc1NzY3NyA3ODc5N2E3YiA3YzdkN2U3ZiAgcHFyc3R1dnd4eXp7fH1+LgorICovCit2b2lkIHByaW50X2hleF9kdW1wKGNvbnN0IGNoYXIgKmxldmVsLCBpbnQgcHJlZml4X3R5cGUsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwl1OCAqcHRyID0gYnVmOworCWludCBpLCBsaW5lbGVuLCByZW1haW5pbmcgPSBsZW47CisJdW5zaWduZWQgY2hhciBsaW5lYnVmWzEwMF07CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDE2KSB7CisJCWxpbmVsZW4gPSBtaW4ocmVtYWluaW5nLCAxNik7CisJCXJlbWFpbmluZyAtPSAxNjsKKwkJaGV4X2R1bXBfdG9fYnVmZmVyKHB0ciArIGksIGxpbmVsZW4sIGxpbmVidWYsIHNpemVvZihsaW5lYnVmKSk7CisKKwkJc3dpdGNoIChwcmVmaXhfdHlwZSkgeworCQljYXNlIERVTVBfUFJFRklYX0FERFJFU1M6CisJCQlwcmludGsoIiVzJSpwOiAlc1xuIiwgbGV2ZWwsCisJCQkJKGludCkoMiAqIHNpemVvZih2b2lkICopKSwgcHRyICsgaSwgbGluZWJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSBEVU1QX1BSRUZJWF9PRkZTRVQ6CisJCQlwcmludGsoIiVzJS44eDogJXNcbiIsIGxldmVsLCBpLCBsaW5lYnVmKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCIlcyVzXG4iLCBsZXZlbCwgbGluZWJ1Zik7CisJCQlicmVhazsKKwkJfQorCX0KK30KK0VYUE9SVF9TWU1CT0wocHJpbnRfaGV4X2R1bXApOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggNjNjZDg4OC4uZWVjMTQ4MSAxMDA2NDQKLS0tIGEvbW0vcGFnZS13cml0ZWJhY2suYworKysgYi9tbS9wYWdlLXdyaXRlYmFjay5jCkBAIC01ODgsMzEgKzU4OCwyNyBAQAogfQogCiAvKioKLSAqIGdlbmVyaWNfd3JpdGVwYWdlcyAtIHdhbGsgdGhlIGxpc3Qgb2YgZGlydHkgcGFnZXMgb2YgdGhlIGdpdmVuIGFkZHJlc3Mgc3BhY2UgYW5kIHdyaXRlcGFnZSgpIGFsbCBvZiB0aGVtLgorICogd3JpdGVfY2FjaGVfcGFnZXMgLSB3YWxrIHRoZSBsaXN0IG9mIGRpcnR5IHBhZ2VzIG9mIHRoZSBnaXZlbiBhZGRyZXNzIHNwYWNlIGFuZCB3cml0ZSBhbGwgb2YgdGhlbS4KICAqIEBtYXBwaW5nOiBhZGRyZXNzIHNwYWNlIHN0cnVjdHVyZSB0byB3cml0ZQogICogQHdiYzogc3VidHJhY3QgdGhlIG51bWJlciBvZiB3cml0dGVuIHBhZ2VzIGZyb20gKkB3YmMtPm5yX3RvX3dyaXRlCisgKiBAd3JpdGVwYWdlOiBmdW5jdGlvbiBjYWxsZWQgZm9yIGVhY2ggcGFnZQorICogQGRhdGE6IGRhdGEgcGFzc2VkIHRvIHdyaXRlcGFnZSBmdW5jdGlvbgogICoKLSAqIFRoaXMgaXMgYSBsaWJyYXJ5IGZ1bmN0aW9uLCB3aGljaCBpbXBsZW1lbnRzIHRoZSB3cml0ZXBhZ2VzKCkKLSAqIGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9uLgotICoKLSAqIElmIGEgcGFnZSBpcyBhbHJlYWR5IHVuZGVyIEkvTywgZ2VuZXJpY193cml0ZXBhZ2VzKCkgc2tpcHMgaXQsIGV2ZW4KKyAqIElmIGEgcGFnZSBpcyBhbHJlYWR5IHVuZGVyIEkvTywgd3JpdGVfY2FjaGVfcGFnZXMoKSBza2lwcyBpdCwgZXZlbgogICogaWYgaXQncyBkaXJ0eS4gIFRoaXMgaXMgZGVzaXJhYmxlIGJlaGF2aW91ciBmb3IgbWVtb3J5LWNsZWFuaW5nIHdyaXRlYmFjaywKICAqIGJ1dCBpdCBpcyBJTkNPUlJFQ1QgZm9yIGRhdGEtaW50ZWdyaXR5IHN5c3RlbSBjYWxscyBzdWNoIGFzIGZzeW5jKCkuICBmc3luYygpCiAgKiBhbmQgbXN5bmMoKSBuZWVkIHRvIGd1YXJhbnRlZSB0aGF0IGFsbCB0aGUgZGF0YSB3aGljaCB3YXMgZGlydHkgYXQgdGhlIHRpbWUKICAqIHRoZSBjYWxsIHdhcyBtYWRlIGdldCBuZXcgSS9PIHN0YXJ0ZWQgYWdhaW5zdCB0aGVtLiAgSWYgd2JjLT5zeW5jX21vZGUgaXMKICAqIFdCX1NZTkNfQUxMIHRoZW4gd2Ugd2VyZSBjYWxsZWQgZm9yIGRhdGEgaW50ZWdyaXR5IGFuZCB3ZSBtdXN0IHdhaXQgZm9yCiAgKiBleGlzdGluZyBJTyB0byBjb21wbGV0ZS4KLSAqCi0gKiBEZXJpdmVkIGZyb20gbXBhZ2Vfd3JpdGVwYWdlcygpIC0gaWYgeW91IGZpeCB0aGlzIHlvdSBzaG91bGQgY2hlY2sgdGhhdAotICogYWxzbyEKICAqLwotaW50IGdlbmVyaWNfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJICAgICAgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoraW50IHdyaXRlX2NhY2hlX3BhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkgICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywgd3JpdGVwYWdlX3Qgd3JpdGVwYWdlLAorCQkgICAgICB2b2lkICpkYXRhKQogewogCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkgPSBtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOwogCWludCByZXQgPSAwOwogCWludCBkb25lID0gMDsKLQlpbnQgKCp3cml0ZXBhZ2UpKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CiAJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKIAlpbnQgbnJfcGFnZXM7CiAJcGdvZmZfdCBpbmRleDsKQEAgLTYyNSwxMiArNjIxLDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0Jd3JpdGVwYWdlID0gbWFwcGluZy0+YV9vcHMtPndyaXRlcGFnZTsKLQotCS8qIGRlYWwgd2l0aCBjaGFyZGV2cyBhbmQgb3RoZXIgc3BlY2lhbCBmaWxlICovCi0JaWYgKCF3cml0ZXBhZ2UpCi0JCXJldHVybiAwOwotCiAJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKIAlpZiAod2JjLT5yYW5nZV9jeWNsaWMpIHsKIAkJaW5kZXggPSBtYXBwaW5nLT53cml0ZWJhY2tfaW5kZXg7IC8qIFN0YXJ0IGZyb20gcHJldiBvZmZzZXQgKi8KQEAgLTY4Miw4ICs2NzIsNyBAQAogCQkJCWNvbnRpbnVlOwogCQkJfQogCi0JCQlyZXQgPSAoKndyaXRlcGFnZSkocGFnZSwgd2JjKTsKLQkJCW1hcHBpbmdfc2V0X2Vycm9yKG1hcHBpbmcsIHJldCk7CisJCQlyZXQgPSAoKndyaXRlcGFnZSkocGFnZSwgd2JjLCBkYXRhKTsKIAogCQkJaWYgKHVubGlrZWx5KHJldCA9PSBBT1BfV1JJVEVQQUdFX0FDVElWQVRFKSkKIAkJCQl1bmxvY2tfcGFnZShwYWdlKTsKQEAgLTcxMCw2ICs2OTksMzggQEAKIAkJbWFwcGluZy0+d3JpdGViYWNrX2luZGV4ID0gaW5kZXg7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0wod3JpdGVfY2FjaGVfcGFnZXMpOworCisvKgorICogRnVuY3Rpb24gdXNlZCBieSBnZW5lcmljX3dyaXRlcGFnZXMgdG8gY2FsbCB0aGUgcmVhbCB3cml0ZXBhZ2UKKyAqIGZ1bmN0aW9uIGFuZCBzZXQgdGhlIG1hcHBpbmcgZmxhZ3Mgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBfX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCisJCSAgICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGF0YTsKKwlpbnQgcmV0ID0gbWFwcGluZy0+YV9vcHMtPndyaXRlcGFnZShwYWdlLCB3YmMpOworCW1hcHBpbmdfc2V0X2Vycm9yKG1hcHBpbmcsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBnZW5lcmljX3dyaXRlcGFnZXMgLSB3YWxrIHRoZSBsaXN0IG9mIGRpcnR5IHBhZ2VzIG9mIHRoZSBnaXZlbiBhZGRyZXNzIHNwYWNlIGFuZCB3cml0ZXBhZ2UoKSBhbGwgb2YgdGhlbS4KKyAqIEBtYXBwaW5nOiBhZGRyZXNzIHNwYWNlIHN0cnVjdHVyZSB0byB3cml0ZQorICogQHdiYzogc3VidHJhY3QgdGhlIG51bWJlciBvZiB3cml0dGVuIHBhZ2VzIGZyb20gKkB3YmMtPm5yX3RvX3dyaXRlCisgKgorICogVGhpcyBpcyBhIGxpYnJhcnkgZnVuY3Rpb24sIHdoaWNoIGltcGxlbWVudHMgdGhlIHdyaXRlcGFnZXMoKQorICogYWRkcmVzc19zcGFjZV9vcGVyYXRpb24uCisgKi8KK2ludCBnZW5lcmljX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCSAgICAgICBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwkvKiBkZWFsIHdpdGggY2hhcmRldnMgYW5kIG90aGVyIHNwZWNpYWwgZmlsZSAqLworCWlmICghbWFwcGluZy0+YV9vcHMtPndyaXRlcGFnZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gd3JpdGVfY2FjaGVfcGFnZXMobWFwcGluZywgd2JjLCBfX3dyaXRlcGFnZSwgbWFwcGluZyk7Cit9CiAKIEVYUE9SVF9TWU1CT0woZ2VuZXJpY193cml0ZXBhZ2VzKTsKIApkaWZmIC0tZ2l0IGEvbW0vdGhyYXNoLmMgYi9tbS90aHJhc2guYwppbmRleCA5ZWY5MDcxLi5jNGM1MjA1IDEwMDY0NAotLS0gYS9tbS90aHJhc2guYworKysgYi9tbS90aHJhc2guYwpAQCAtNDgsOSArNDgsOCBAQAogCQlpZiAoY3VycmVudF9pbnRlcnZhbCA8IGN1cnJlbnQtPm1tLT5sYXN0X2ludGVydmFsKQogCQkJY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5Kys7CiAJCWVsc2UgewotCQkJY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5LS07Ci0JCQlpZiAodW5saWtlbHkoY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5IDwgMCkpCi0JCQkJY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5ID0gMDsKKwkJCWlmIChsaWtlbHkoY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5ID4gMCkpCisJCQkJY3VycmVudC0+bW0tPnRva2VuX3ByaW9yaXR5LS07CiAJCX0KIAkJLyogQ2hlY2sgaWYgd2UgZGVzZXJ2ZSB0aGUgdG9rZW4gKi8KIAkJaWYgKGN1cnJlbnQtPm1tLT50b2tlbl9wcmlvcml0eSA+CmRpZmYgLS1naXQgYS9tbS92bXN0YXQuYyBiL21tL3Ztc3RhdC5jCmluZGV4IDk4MzJkOWEuLjhmYWYyN2UgMTAwNjQ0Ci0tLSBhL21tL3Ztc3RhdC5jCisrKyBiL21tL3Ztc3RhdC5jCkBAIC02OTgsNyArNjk4LDcgQEAKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICp2bXN0YXRfd29yayA9ICZwZXJfY3B1KHZtc3RhdF93b3JrLCBjcHUpOwogCi0JSU5JVF9ERUxBWUVEX1dPUksodm1zdGF0X3dvcmssIHZtc3RhdF91cGRhdGUpOworCUlOSVRfREVMQVlFRF9XT1JLX0RFRkVSUkFCTEUodm1zdGF0X3dvcmssIHZtc3RhdF91cGRhdGUpOwogCXNjaGVkdWxlX2RlbGF5ZWRfd29ya19vbihjcHUsIHZtc3RhdF93b3JrLCBIWiArIGNwdSk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IGQzNDJlODkuLmNlYWRmY2YgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAKIHN0YXRpYyBpbnQgaGlkcF9oaWRpbnB1dF9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQogewotCXN0cnVjdCBoaWRfZGV2aWNlICpoaWQgPSBkZXYtPnByaXZhdGU7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IGhpZC0+ZHJpdmVyX2RhdGE7CiAKIAlyZXR1cm4gaGlkcF9xdWV1ZV9ldmVudChzZXNzaW9uLCBkZXYsIHR5cGUsIGNvZGUsIHZhbHVlKTsKQEAgLTE4Miw3ICsxODIsNyBAQAogCiBzdGF0aWMgaW50IGhpZHBfaW5wdXRfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKIHsKLQlzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24gPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIGhpZHBfcXVldWVfZXZlbnQoc2Vzc2lvbiwgZGV2LCB0eXBlLCBjb2RlLCB2YWx1ZSk7CiB9CkBAIC02MzAsNyArNjMwLDcgQEAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHNlc3Npb24tPmlucHV0OwogCWludCBpOwogCi0JaW5wdXQtPnByaXZhdGUgPSBzZXNzaW9uOworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0LCBzZXNzaW9uKTsKIAogCWlucHV0LT5uYW1lID0gIkJsdWV0b290aCBISUQgQm9vdCBQcm90b2NvbCBEZXZpY2UiOwogCkBAIC02NjMsNyArNjYzLDcgQEAKIAkJaW5wdXQtPnJlbGJpdFswXSB8PSBCSVQoUkVMX1dIRUVMKTsKIAl9CiAKLQlpbnB1dC0+Y2Rldi5kZXYgPSBoaWRwX2dldF9kZXZpY2Uoc2Vzc2lvbik7CisJaW5wdXQtPmRldi5wYXJlbnQgPSBoaWRwX2dldF9kZXZpY2Uoc2Vzc2lvbik7CiAKIAlpbnB1dC0+ZXZlbnQgPSBoaWRwX2lucHV0X2V2ZW50OwogCkBAIC03MzcsMTAgKzczNyw4IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXBvcnQsICZoaWQtPnJlcG9ydF9lbnVtW0hJRF9GRUFUVVJFX1JFUE9SVF0ucmVwb3J0X2xpc3QsIGxpc3QpCiAJCWhpZHBfc2VuZF9yZXBvcnQoc2Vzc2lvbiwgcmVwb3J0KTsKIAotCWlmIChoaWRpbnB1dF9jb25uZWN0KGhpZCkgPT0gMCkgeworCWlmIChoaWRpbnB1dF9jb25uZWN0KGhpZCkgPT0gMCkKIAkJaGlkLT5jbGFpbWVkIHw9IEhJRF9DTEFJTUVEX0lOUFVUOwotCQloaWRfZmZfaW5pdChoaWQpOwotCX0KIH0KIAogaW50IGhpZHBfYWRkX2Nvbm5lY3Rpb24oc3RydWN0IGhpZHBfY29ubmFkZF9yZXEgKnJlcSwgc3RydWN0IHNvY2tldCAqY3RybF9zb2NrLCBzdHJ1Y3Qgc29ja2V0ICppbnRyX3NvY2spCkBAIC04NjQsNyArODYyLDcgQEAKIAlpZiAoc2Vzc2lvbi0+aGlkKQogCQloaWRfZnJlZV9kZXZpY2Uoc2Vzc2lvbi0+aGlkKTsKIAotCWtmcmVlKHNlc3Npb24tPmlucHV0KTsKKwlpbnB1dF9mcmVlX2RldmljZShzZXNzaW9uLT5pbnB1dCk7CiAJa2ZyZWUoc2Vzc2lvbik7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2xpbmtfd2F0Y2guYyBiL25ldC9jb3JlL2xpbmtfd2F0Y2guYwppbmRleCBlM2MyNmE5Li5hNWUzNzJiIDEwMDY0NAotLS0gYS9uZXQvY29yZS9saW5rX3dhdGNoLmMKKysrIGIvbmV0L2NvcmUvbGlua193YXRjaC5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KQEAgLTI3LDggKzI2LDcgQEAKIAogCiBlbnVtIGx3X2JpdHMgewotCUxXX1JVTk5JTkcgPSAwLAotCUxXX1NFX1VTRUQKKwlMV19VUkdFTlQgPSAwLAogfTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbGlua3dhdGNoX2ZsYWdzOwpAQCAtMzcsMTcgKzM1LDkgQEAKIHN0YXRpYyB2b2lkIGxpbmt3YXRjaF9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmR1bW15KTsKIHN0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhsaW5rd2F0Y2hfd29yaywgbGlua3dhdGNoX2V2ZW50KTsKIAotc3RhdGljIExJU1RfSEVBRChsd2V2ZW50bGlzdCk7CitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmx3ZXZlbnRsaXN0Owogc3RhdGljIERFRklORV9TUElOTE9DSyhsd2V2ZW50bGlzdF9sb2NrKTsKIAotc3RydWN0IGx3X2V2ZW50IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLX07Ci0KLS8qIEF2b2lkIGttYWxsb2MoKSBmb3IgbW9zdCBzeXN0ZW1zICovCi1zdGF0aWMgc3RydWN0IGx3X2V2ZW50IHNpbmdsZWV2ZW50OwotCiBzdGF0aWMgdW5zaWduZWQgY2hhciBkZWZhdWx0X29wZXJzdGF0ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQpAQCAtODcsMjUgKzc3LDEwMiBAQAogfQogCiAKLS8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHJ0bmwgc2VtYXBob3JlIGhlbGQgKi8KLXZvaWQgbGlua3dhdGNoX3J1bl9xdWV1ZSh2b2lkKQorc3RhdGljIGludCBsaW5rd2F0Y2hfdXJnZW50X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBoZWFkLCAqbiwgKm5leHQ7CisJcmV0dXJuIG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBuZXRpZl9jYXJyaWVyX29rKGRldikgJiYKKwkgICAgICAgZGV2LT5xZGlzYyAhPSBkZXYtPnFkaXNjX3NsZWVwaW5nOworfQorCisKK3N0YXRpYyB2b2lkIGxpbmt3YXRjaF9hZGRfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmx3ZXZlbnRsaXN0X2xvY2ssIGZsYWdzKTsKKwlkZXYtPmxpbmtfd2F0Y2hfbmV4dCA9IGx3ZXZlbnRsaXN0OworCWx3ZXZlbnRsaXN0ID0gZGV2OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx3ZXZlbnRsaXN0X2xvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCBsaW5rd2F0Y2hfc2NoZWR1bGVfd29yayhpbnQgdXJnZW50KQoreworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSBsaW5rd2F0Y2hfbmV4dGV2ZW50IC0gamlmZmllczsKKworCWlmICh0ZXN0X2JpdChMV19VUkdFTlQsICZsaW5rd2F0Y2hfZmxhZ3MpKQorCQlyZXR1cm47CisKKwkvKiBNaW5pbWlzZSBkb3duLXRpbWU6IGRyb3AgZGVsYXkgZm9yIHVwIGV2ZW50LiAqLworCWlmICh1cmdlbnQpIHsKKwkJaWYgKHRlc3RfYW5kX3NldF9iaXQoTFdfVVJHRU5ULCAmbGlua3dhdGNoX2ZsYWdzKSkKKwkJCXJldHVybjsKKwkJZGVsYXkgPSAwOworCX0KKworCS8qIElmIHdlIHdyYXAgYXJvdW5kIHdlJ2xsIGRlbGF5IGl0IGJ5IGF0IG1vc3QgSFouICovCisJaWYgKGRlbGF5ID4gSFopCisJCWRlbGF5ID0gMDsKKworCS8qCisJICogVGhpcyBpcyB0cnVlIGlmIHdlJ3ZlIHNjaGVkdWxlZCBpdCBpbW1lZGl0YXRlbHkgb3IgaWYgd2UgZG9uJ3QKKwkgKiBuZWVkIGFuIGltbWVkaWF0ZSBleGVjdXRpb24gYW5kIGl0J3MgYWxyZWFkeSBwZW5kaW5nLgorCSAqLworCWlmIChzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmxpbmt3YXRjaF93b3JrLCBkZWxheSkgPT0gIWRlbGF5KQorCQlyZXR1cm47CisKKwkvKiBEb24ndCBib3RoZXIgaWYgdGhlcmUgaXMgbm90aGluZyB1cmdlbnQuICovCisJaWYgKCF0ZXN0X2JpdChMV19VUkdFTlQsICZsaW5rd2F0Y2hfZmxhZ3MpKQorCQlyZXR1cm47CisKKwkvKiBJdCdzIGFscmVhZHkgcnVubmluZyB3aGljaCBpcyBnb29kIGVub3VnaC4gKi8KKwlpZiAoIWNhbmNlbF9kZWxheWVkX3dvcmsoJmxpbmt3YXRjaF93b3JrKSkKKwkJcmV0dXJuOworCisJLyogT3RoZXJ3aXNlIHdlIHJlc2NoZWR1bGUgaXQgYWdhaW4gZm9yIGltbWVkaWF0ZSBleGVjdGlvbi4gKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmxpbmt3YXRjaF93b3JrLCAwKTsKK30KKworCitzdGF0aWMgdm9pZCBfX2xpbmt3YXRjaF9ydW5fcXVldWUoaW50IHVyZ2VudF9vbmx5KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0OworCisJLyoKKwkgKiBMaW1pdCB0aGUgbnVtYmVyIG9mIGxpbmt3YXRjaCBldmVudHMgdG8gb25lCisJICogcGVyIHNlY29uZCBzbyB0aGF0IGEgcnVuYXdheSBkcml2ZXIgZG9lcyBub3QKKwkgKiBjYXVzZSBhIHN0b3JtIG9mIG1lc3NhZ2VzIG9uIHRoZSBuZXRsaW5rCisJICogc29ja2V0LiAgVGhpcyBsaW1pdCBkb2VzIG5vdCBhcHBseSB0byB1cCBldmVudHMKKwkgKiB3aGlsZSB0aGUgZGV2aWNlIHFkaXNjIGlzIGRvd24uCisJICovCisJaWYgKCF1cmdlbnRfb25seSkKKwkJbGlua3dhdGNoX25leHRldmVudCA9IGppZmZpZXMgKyBIWjsKKwkvKiBMaW1pdCB3cmFwLWFyb3VuZCBlZmZlY3Qgb24gZGVsYXkuICovCisJZWxzZSBpZiAodGltZV9hZnRlcihsaW5rd2F0Y2hfbmV4dGV2ZW50LCBqaWZmaWVzICsgSFopKQorCQlsaW5rd2F0Y2hfbmV4dGV2ZW50ID0gamlmZmllczsKKworCWNsZWFyX2JpdChMV19VUkdFTlQsICZsaW5rd2F0Y2hfZmxhZ3MpOwogCiAJc3Bpbl9sb2NrX2lycSgmbHdldmVudGxpc3RfbG9jayk7Ci0JbGlzdF9yZXBsYWNlX2luaXQoJmx3ZXZlbnRsaXN0LCAmaGVhZCk7CisJbmV4dCA9IGx3ZXZlbnRsaXN0OworCWx3ZXZlbnRsaXN0ID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnEoJmx3ZXZlbnRsaXN0X2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKG4sIG5leHQsICZoZWFkKSB7Ci0JCXN0cnVjdCBsd19ldmVudCAqZXZlbnQgPSBsaXN0X2VudHJ5KG4sIHN0cnVjdCBsd19ldmVudCwgbGlzdCk7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBldmVudC0+ZGV2OworCXdoaWxlIChuZXh0KSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXh0OwogCi0JCWlmIChldmVudCA9PSAmc2luZ2xlZXZlbnQpIHsKLQkJCWNsZWFyX2JpdChMV19TRV9VU0VELCAmbGlua3dhdGNoX2ZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCWtmcmVlKGV2ZW50KTsKKwkJbmV4dCA9IGRldi0+bGlua193YXRjaF9uZXh0OworCisJCWlmICh1cmdlbnRfb25seSAmJiAhbGlua3dhdGNoX3VyZ2VudF9ldmVudChkZXYpKSB7CisJCQlsaW5rd2F0Y2hfYWRkX2V2ZW50KGRldik7CisJCQljb250aW51ZTsKIAkJfQogCisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgYWJvdmUgcmVhZCBpcyBjb21wbGV0ZSBzaW5jZSBpdCBjYW4gYmUKKwkJICogcmV3cml0dGVuIGFzIHNvb24gYXMgd2UgY2xlYXIgdGhlIGJpdCBiZWxvdy4KKwkJICovCisJCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCiAJCS8qIFdlIGFyZSBhYm91dCB0byBoYW5kbGUgdGhpcyBkZXZpY2UsCiAJCSAqIHNvIG5ldyBldmVudHMgY2FuIGJlIGFjY2VwdGVkCiAJCSAqLwpAQCAtMTI0LDU4ICsxOTEsMzkgQEAKIAogCQlkZXZfcHV0KGRldik7CiAJfQorCisJaWYgKGx3ZXZlbnRsaXN0KQorCQlsaW5rd2F0Y2hfc2NoZWR1bGVfd29yaygwKTsKK30KKworCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBydG5sIHNlbWFwaG9yZSBoZWxkICovCit2b2lkIGxpbmt3YXRjaF9ydW5fcXVldWUodm9pZCkKK3sKKwlfX2xpbmt3YXRjaF9ydW5fcXVldWUoMCk7CiB9CiAKIAogc3RhdGljIHZvaWQgbGlua3dhdGNoX2V2ZW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCiB7Ci0JLyogTGltaXQgdGhlIG51bWJlciBvZiBsaW5rd2F0Y2ggZXZlbnRzIHRvIG9uZQotCSAqIHBlciBzZWNvbmQgc28gdGhhdCBhIHJ1bmF3YXkgZHJpdmVyIGRvZXMgbm90Ci0JICogY2F1c2UgYSBzdG9ybSBvZiBtZXNzYWdlcyBvbiB0aGUgbmV0bGluawotCSAqIHNvY2tldAotCSAqLwotCWxpbmt3YXRjaF9uZXh0ZXZlbnQgPSBqaWZmaWVzICsgSFo7Ci0JY2xlYXJfYml0KExXX1JVTk5JTkcsICZsaW5rd2F0Y2hfZmxhZ3MpOwotCiAJcnRubF9sb2NrKCk7Ci0JbGlua3dhdGNoX3J1bl9xdWV1ZSgpOworCV9fbGlua3dhdGNoX3J1bl9xdWV1ZSh0aW1lX2FmdGVyKGxpbmt3YXRjaF9uZXh0ZXZlbnQsIGppZmZpZXMpKTsKIAlydG5sX3VubG9jaygpOwogfQogCiAKIHZvaWQgbGlua3dhdGNoX2ZpcmVfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwlpbnQgdXJnZW50ID0gbGlua3dhdGNoX3VyZ2VudF9ldmVudChkZXYpOworCiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KF9fTElOS19TVEFURV9MSU5LV0FUQ0hfUEVORElORywgJmRldi0+c3RhdGUpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXN0cnVjdCBsd19ldmVudCAqZXZlbnQ7Ci0KLQkJaWYgKHRlc3RfYW5kX3NldF9iaXQoTFdfU0VfVVNFRCwgJmxpbmt3YXRjaF9mbGFncykpIHsKLQkJCWV2ZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGx3X2V2ZW50KSwgR0ZQX0FUT01JQyk7Ci0KLQkJCWlmICh1bmxpa2VseShldmVudCA9PSBOVUxMKSkgewotCQkJCWNsZWFyX2JpdChfX0xJTktfU1RBVEVfTElOS1dBVENIX1BFTkRJTkcsICZkZXYtPnN0YXRlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlldmVudCA9ICZzaW5nbGVldmVudDsKLQkJfQotCiAJCWRldl9ob2xkKGRldik7Ci0JCWV2ZW50LT5kZXYgPSBkZXY7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmx3ZXZlbnRsaXN0X2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9hZGRfdGFpbCgmZXZlbnQtPmxpc3QsICZsd2V2ZW50bGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmx3ZXZlbnRsaXN0X2xvY2ssIGZsYWdzKTsKKwkJbGlua3dhdGNoX2FkZF9ldmVudChkZXYpOworCX0gZWxzZSBpZiAoIXVyZ2VudCkKKwkJcmV0dXJuOwogCi0JCWlmICghdGVzdF9hbmRfc2V0X2JpdChMV19SVU5OSU5HLCAmbGlua3dhdGNoX2ZsYWdzKSkgewotCQkJdW5zaWduZWQgbG9uZyBkZWxheSA9IGxpbmt3YXRjaF9uZXh0ZXZlbnQgLSBqaWZmaWVzOwotCi0JCQkvKiBJZiB3ZSB3cmFwIGFyb3VuZCB3ZSdsbCBkZWxheSBpdCBieSBhdCBtb3N0IEhaLiAqLwotCQkJaWYgKGRlbGF5ID4gSFopCi0JCQkJZGVsYXkgPSAwOwotCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZsaW5rd2F0Y2hfd29yaywgZGVsYXkpOwotCQl9Ci0JfQorCWxpbmt3YXRjaF9zY2hlZHVsZV93b3JrKHVyZ2VudCk7CiB9CiAKIEVYUE9SVF9TWU1CT0wobGlua3dhdGNoX2ZpcmVfZXZlbnQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRhYmxlX2ZpbHRlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRhYmxlX2ZpbHRlci5jCmluZGV4IDdlZGVhMmEuLjc1YzAyMzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9hcnB0YWJsZV9maWx0ZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMKQEAgLTE1LDEyOCArMTUsMzQgQEAKICNkZWZpbmUgRklMVEVSX1ZBTElEX0hPT0tTICgoMSA8PCBORl9BUlBfSU4pIHwgKDEgPDwgTkZfQVJQX09VVCkgfCBcCiAJCQkgICAoMSA8PCBORl9BUlBfRk9SV0FSRCkpCiAKLS8qIFN0YW5kYXJkIGVudHJ5LiAqLwotc3RydWN0IGFycHRfc3RhbmRhcmQKLXsKLQlzdHJ1Y3QgYXJwdF9lbnRyeSBlbnRyeTsKLQlzdHJ1Y3QgYXJwdF9zdGFuZGFyZF90YXJnZXQgdGFyZ2V0OwotfTsKLQotc3RydWN0IGFycHRfZXJyb3JfdGFyZ2V0Ci17Ci0Jc3RydWN0IGFycHRfZW50cnlfdGFyZ2V0IHRhcmdldDsKLQljaGFyIGVycm9ybmFtZVtBUlBUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOwotfTsKLQotc3RydWN0IGFycHRfZXJyb3IKLXsKLQlzdHJ1Y3QgYXJwdF9lbnRyeSBlbnRyeTsKLQlzdHJ1Y3QgYXJwdF9lcnJvcl90YXJnZXQgdGFyZ2V0OwotfTsKLQogc3RhdGljIHN0cnVjdAogewogCXN0cnVjdCBhcnB0X3JlcGxhY2UgcmVwbDsKIAlzdHJ1Y3QgYXJwdF9zdGFuZGFyZCBlbnRyaWVzWzNdOwogCXN0cnVjdCBhcnB0X2Vycm9yIHRlcm07Ci19IGluaXRpYWxfdGFibGUgX19pbml0ZGF0YQotPSB7IHsgImZpbHRlciIsIEZJTFRFUl9WQUxJRF9IT09LUywgNCwKLSAgICAgIHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZCkgKiAzICsgc2l6ZW9mKHN0cnVjdCBhcnB0X2Vycm9yKSwKLSAgICAgIHsgW05GX0FSUF9JTl0gPSAwLAotCVtORl9BUlBfT1VUXSA9IHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZCksCi0JW05GX0FSUF9GT1JXQVJEXSA9IDIgKiBzaXplb2Yoc3RydWN0IGFycHRfc3RhbmRhcmQpLCB9LAotICAgICAgeyBbTkZfQVJQX0lOXSA9IDAsCi0JW05GX0FSUF9PVVRdID0gc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkKSwKLQlbTkZfQVJQX0ZPUldBUkRdID0gMiAqIHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZCksIH0sCi0gICAgICAwLCBOVUxMLCB7IH0gfSwKLSAgICB7Ci0JICAgIC8qIEFSUF9JTiAqLwotCSAgICB7Ci0JCSAgICB7Ci0JCQkgICAgewotCQkJCSAgICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLQkJCQkgICAgMCwgMCwKLQkJCQkgICAgeyB7IDAsIH0sIHsgMCwgfSB9LAotCQkJCSAgICB7IHsgMCwgfSwgeyAwLCB9IH0sCi0JCQkJICAgIDAsIDAsCi0JCQkJICAgIDAsIDAsCi0JCQkJICAgIDAsIDAsCi0JCQkJICAgICIiLCAiIiwgeyAwIH0sIHsgMCB9LAotCQkJCSAgICAwLCAwCi0JCQkgICAgfSwKLQkJCSAgICBzaXplb2Yoc3RydWN0IGFycHRfZW50cnkpLAotCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZCksCi0JCQkgICAgMCwKLQkJCSAgICB7IDAsIDAgfSwgeyB9IH0sCi0JCSAgICB7IHsgeyB7IEFSUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAotCQkgICAgICAtTkZfQUNDRVBUIC0gMSB9Ci0JICAgIH0sCi0JICAgIC8qIEFSUF9PVVQgKi8KLQkgICAgewotCQkgICAgewotCQkJICAgIHsKLQkJCQkgICAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0JCQkJICAgIDAsIDAsCi0JCQkJICAgIHsgeyAwLCB9LCB7IDAsIH0gfSwKLQkJCQkgICAgeyB7IDAsIH0sIHsgMCwgfSB9LAotCQkJCSAgICAwLCAwLAotCQkJCSAgICAwLCAwLAotCQkJCSAgICAwLCAwLAotCQkJCSAgICAiIiwgIiIsIHsgMCB9LCB7IDAgfSwKLQkJCQkgICAgMCwgMAotCQkJICAgIH0sCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBhcnB0X2VudHJ5KSwKLQkJCSAgICBzaXplb2Yoc3RydWN0IGFycHRfc3RhbmRhcmQpLAotCQkJICAgIDAsCi0JCQkgICAgeyAwLCAwIH0sIHsgfSB9LAotCQkgICAgeyB7IHsgeyBBUlBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKLQkJICAgICAgLU5GX0FDQ0VQVCAtIDEgfQotCSAgICB9LAotCSAgICAvKiBBUlBfRk9SV0FSRCAqLwotCSAgICB7Ci0JCSAgICB7Ci0JCQkgICAgewotCQkJCSAgICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLQkJCQkgICAgMCwgMCwKLQkJCQkgICAgeyB7IDAsIH0sIHsgMCwgfSB9LAotCQkJCSAgICB7IHsgMCwgfSwgeyAwLCB9IH0sCi0JCQkJICAgIDAsIDAsCi0JCQkJICAgIDAsIDAsCi0JCQkJICAgIDAsIDAsCi0JCQkJICAgICIiLCAiIiwgeyAwIH0sIHsgMCB9LAotCQkJCSAgICAwLCAwCi0JCQkgICAgfSwKLQkJCSAgICBzaXplb2Yoc3RydWN0IGFycHRfZW50cnkpLAotCQkJICAgIHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZCksCi0JCQkgICAgMCwKLQkJCSAgICB7IDAsIDAgfSwgeyB9IH0sCi0JCSAgICB7IHsgeyB7IEFSUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAotCQkgICAgICAtTkZfQUNDRVBUIC0gMSB9Ci0JICAgIH0KLSAgICB9LAotICAgIC8qIEVSUk9SICovCi0gICAgewotCSAgICB7Ci0JCSAgICB7Ci0JCQkgICAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0JCQkgICAgMCwgMCwKLQkJCSAgICB7IHsgMCwgfSwgeyAwLCB9IH0sCi0JCQkgICAgeyB7IDAsIH0sIHsgMCwgfSB9LAotCQkJICAgIDAsIDAsCi0JCQkgICAgMCwgMCwKLQkJCSAgICAwLCAwLAotCQkJICAgICIiLCAiIiwgeyAwIH0sIHsgMCB9LAotCQkJICAgIDAsIDAKLQkJICAgIH0sCi0JCSAgICBzaXplb2Yoc3RydWN0IGFycHRfZW50cnkpLAotCQkgICAgc2l6ZW9mKHN0cnVjdCBhcnB0X2Vycm9yKSwKLQkJICAgIDAsCi0JCSAgICB7IDAsIDAgfSwgeyB9IH0sCi0JICAgIHsgeyB7IHsgQVJQVF9BTElHTihzaXplb2Yoc3RydWN0IGFycHRfZXJyb3JfdGFyZ2V0KSksIEFSUFRfRVJST1JfVEFSR0VUIH0gfSwKLQkJeyB9IH0sCi0JICAgICAgIkVSUk9SIgotCSAgICB9Ci0gICAgfQorfSBpbml0aWFsX3RhYmxlIF9faW5pdGRhdGEgPSB7CisJLnJlcGwgPSB7CisJCS5uYW1lID0gImZpbHRlciIsCisJCS52YWxpZF9ob29rcyA9IEZJTFRFUl9WQUxJRF9IT09LUywKKwkJLm51bV9lbnRyaWVzID0gNCwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGFycHRfc3RhbmRhcmQpICogMyArIHNpemVvZihzdHJ1Y3QgYXJwdF9lcnJvciksCisJCS5ob29rX2VudHJ5ID0geworCQkJW05GX0FSUF9JTl0gPSAwLAorCQkJW05GX0FSUF9PVVRdID0gc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkKSwKKwkJCVtORl9BUlBfRk9SV0FSRF0gPSAyICogc2l6ZW9mKHN0cnVjdCBhcnB0X3N0YW5kYXJkKSwKKwkJfSwKKwkJLnVuZGVyZmxvdyA9IHsKKwkJCVtORl9BUlBfSU5dID0gMCwKKwkJCVtORl9BUlBfT1VUXSA9IHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZCksCisJCQlbTkZfQVJQX0ZPUldBUkRdID0gMiAqIHNpemVvZihzdHJ1Y3QgYXJwdF9zdGFuZGFyZCksCisJCX0sCisJfSwKKwkuZW50cmllcyA9IHsKKwkJQVJQVF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIEFSUF9JTiAqLworCQlBUlBUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogQVJQX09VVCAqLworCQlBUlBUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogQVJQX0ZPUldBUkQgKi8KKwl9LAorCS50ZXJtID0gQVJQVF9FUlJPUl9JTklULAogfTsKIAogc3RhdGljIHN0cnVjdCBhcnB0X3RhYmxlIHBhY2tldF9maWx0ZXIgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCmluZGV4IDQyNzI4OTAuLjRmNTFjMWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCkBAIC0yNiw1MyArMjYsMjkgQEAKIAlzdHJ1Y3QgaXB0X3JlcGxhY2UgcmVwbDsKIAlzdHJ1Y3QgaXB0X3N0YW5kYXJkIGVudHJpZXNbM107CiAJc3RydWN0IGlwdF9lcnJvciB0ZXJtOwotfSBpbml0aWFsX3RhYmxlIF9faW5pdGRhdGEKLT0geyB7ICJmaWx0ZXIiLCBGSUxURVJfVkFMSURfSE9PS1MsIDQsCi0gICAgICBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAzICsgc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3IpLAotICAgICAgeyBbTkZfSVBfTE9DQUxfSU5dID0gMCwKLQlbTkZfSVBfRk9SV0FSRF0gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCi0JW05GX0lQX0xPQ0FMX09VVF0gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAyIH0sCi0gICAgICB7IFtORl9JUF9MT0NBTF9JTl0gPSAwLAotCVtORl9JUF9GT1JXQVJEXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKLQlbTkZfSVBfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIgfSwKLSAgICAgIDAsIE5VTEwsIHsgfSB9LAotICAgIHsKLQkgICAgLyogTE9DQUxfSU4gKi8KLQkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCi0JCTAsCi0JCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0JICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfSwKLQkgICAgLyogRk9SV0FSRCAqLwotCSAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkJMCwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAotCQlzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCi0JCTAsIHsgMCwgMCB9LCB7IH0gfSwKLQkgICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKLQkJLU5GX0FDQ0VQVCAtIDEgfSB9LAotCSAgICAvKiBMT0NBTF9PVVQgKi8KLQkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCi0JCTAsCi0JCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0JICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfQotICAgIH0sCi0gICAgLyogRVJST1IgKi8KLSAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkwLAotCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQlzaXplb2Yoc3RydWN0IGlwdF9lcnJvciksCi0JMCwgeyAwLCAwIH0sIHsgfSB9LAotICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3JfdGFyZ2V0KSksIElQVF9FUlJPUl9UQVJHRVQgfSB9LAotCSAgeyB9IH0sCi0JIkVSUk9SIgotICAgICAgfQotICAgIH0KK30gaW5pdGlhbF90YWJsZSBfX2luaXRkYXRhID0geworCS5yZXBsID0geworCQkubmFtZSA9ICJmaWx0ZXIiLAorCQkudmFsaWRfaG9va3MgPSBGSUxURVJfVkFMSURfSE9PS1MsCisJCS5udW1fZW50cmllcyA9IDQsCisJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogMyArIHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yKSwKKwkJLmhvb2tfZW50cnkgPSB7CisJCQlbTkZfSVBfTE9DQUxfSU5dID0gMCwKKwkJCVtORl9JUF9GT1JXQVJEXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKKwkJCVtORl9JUF9MT0NBTF9PVVRdID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogMiwKKwkJfSwKKwkJLnVuZGVyZmxvdyA9IHsKKwkJCVtORl9JUF9MT0NBTF9JTl0gPSAwLAorCQkJW05GX0lQX0ZPUldBUkRdID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAorCQkJW05GX0lQX0xPQ0FMX09VVF0gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAyLAorCQl9LAorCX0sCisJLmVudHJpZXMgPSB7CisJCUlQVF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIExPQ0FMX0lOICovCisJCUlQVF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIEZPUldBUkQgKi8KKwkJSVBUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogTE9DQUxfT1VUICovCisJfSwKKwkudGVybSA9IElQVF9FUlJPUl9JTklULAkJCS8qIEVSUk9SICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHh0X3RhYmxlIHBhY2tldF9maWx0ZXIgPSB7CkBAIC0xMDUsNyArODEsOCBAQAogCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQogCSAgICB8fCBpcF9oZHJsZW4oKnBza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXB0X2hvb2s6IGhhcHB5IGNyYWNraW5nLlxuIik7CisJCQlwcmludGsoImlwdGFibGVfZmlsdGVyOiBpZ25vcmluZyBzaG9ydCBTT0NLX1JBVyAiCisJCQkgICAgICAgInBhY2tldC5cbiIpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwppbmRleCA5Mjc4ODAyLi45MDI0NDZmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwpAQCAtMzMsNzMgKzMzLDM1IEBACiAJc3RydWN0IGlwdF9yZXBsYWNlIHJlcGw7CiAJc3RydWN0IGlwdF9zdGFuZGFyZCBlbnRyaWVzWzVdOwogCXN0cnVjdCBpcHRfZXJyb3IgdGVybTsKLX0gaW5pdGlhbF90YWJsZSBfX2luaXRkYXRhCi09IHsgeyAibWFuZ2xlIiwgTUFOR0xFX1ZBTElEX0hPT0tTLCA2LAotICAgICAgc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogNSArIHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yKSwKLSAgICAgIHsgW05GX0lQX1BSRV9ST1VUSU5HXSAJPSAwLAotCVtORl9JUF9MT0NBTF9JTl0gCT0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCVtORl9JUF9GT1JXQVJEXSAJPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAyLAotCVtORl9JUF9MT0NBTF9PVVRdIAk9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDMsCi0JW05GX0lQX1BPU1RfUk9VVElOR10gCT0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogNCB9LAotICAgICAgeyBbTkZfSVBfUFJFX1JPVVRJTkddIAk9IDAsCi0JW05GX0lQX0xPQ0FMX0lOXSAJPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCi0JW05GX0lQX0ZPUldBUkRdIAk9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIsCi0JW05GX0lQX0xPQ0FMX09VVF0gCT0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogMywKLQlbTkZfSVBfUE9TVF9ST1VUSU5HXQk9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDQgfSwKLSAgICAgIDAsIE5VTEwsIHsgfSB9LAotICAgIHsKLQkgICAgLyogUFJFX1JPVVRJTkcgKi8KLQkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCi0JCTAsCi0JCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0JICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfSwKLQkgICAgLyogTE9DQUxfSU4gKi8KLQkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCi0JCTAsCi0JCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0JICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfSwKLQkgICAgLyogRk9SV0FSRCAqLwotCSAgICB7IHsgeyB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkJMCwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAotCQlzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCi0JCTAsIHsgMCwgMCB9LCB7IH0gfSwKLQkgICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKLQkJLU5GX0FDQ0VQVCAtIDEgfSB9LAotCSAgICAvKiBMT0NBTF9PVVQgKi8KLQkgICAgeyB7IHsgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCi0JCTAsCi0JCXNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0JICAgICAgeyB7IHsgeyBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfSwKLQkgICAgLyogUE9TVF9ST1VUSU5HICovCi0JICAgIHsgeyB7IHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAotCQkwLAotCQlzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCi0JCXNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKLQkJMCwgeyAwLCAwIH0sIHsgfSB9LAotCSAgICAgIHsgeyB7IHsgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAotCQktTkZfQUNDRVBUIC0gMSB9IH0sCi0gICAgfSwKLSAgICAvKiBFUlJPUiAqLwotICAgIHsgeyB7IHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAotCTAsCi0Jc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAotCXNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yKSwKLQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0gICAgICB7IHsgeyB7IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9lcnJvcl90YXJnZXQpKSwgSVBUX0VSUk9SX1RBUkdFVCB9IH0sCi0JICB7IH0gfSwKLQkiRVJST1IiCi0gICAgICB9Ci0gICAgfQorfSBpbml0aWFsX3RhYmxlIF9faW5pdGRhdGEgPSB7CisJLnJlcGwgPSB7CisJCS5uYW1lID0gIm1hbmdsZSIsCisJCS52YWxpZF9ob29rcyA9IE1BTkdMRV9WQUxJRF9IT09LUywKKwkJLm51bV9lbnRyaWVzID0gNiwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiA1ICsgc2l6ZW9mKHN0cnVjdCBpcHRfZXJyb3IpLAorCQkuaG9va19lbnRyeSA9IHsKKwkJCVtORl9JUF9QUkVfUk9VVElOR10gCT0gMCwKKwkJCVtORl9JUF9MT0NBTF9JTl0gCT0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAorCQkJW05GX0lQX0ZPUldBUkRdIAk9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIsCisJCQlbTkZfSVBfTE9DQUxfT1VUXSAJPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAzLAorCQkJW05GX0lQX1BPU1RfUk9VVElOR10gCT0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogNCwKKwkJfSwKKwkJLnVuZGVyZmxvdyA9IHsKKwkJCVtORl9JUF9QUkVfUk9VVElOR10gCT0gMCwKKwkJCVtORl9JUF9MT0NBTF9JTl0gCT0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAorCQkJW05GX0lQX0ZPUldBUkRdIAk9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIsCisJCQlbTkZfSVBfTE9DQUxfT1VUXSAJPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAzLAorCQkJW05GX0lQX1BPU1RfUk9VVElOR10JPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiA0LAorCQl9LAorCX0sCisJLmVudHJpZXMgPSB7CisJCUlQVF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIFBSRV9ST1VUSU5HICovCisJCUlQVF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIExPQ0FMX0lOICovCisJCUlQVF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIEZPUldBUkQgKi8KKwkJSVBUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogTE9DQUxfT1VUICovCisJCUlQVF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIFBPU1RfUk9VVElORyAqLworCX0sCisJLnRlcm0gPSBJUFRfRVJST1JfSU5JVCwJCQkvKiBFUlJPUiAqLwogfTsKIAogc3RhdGljIHN0cnVjdCB4dF90YWJsZSBwYWNrZXRfbWFuZ2xlciA9IHsKQEAgLTEzOCw3ICsxMDAsOCBAQAogCWlmICgoKnBza2IpLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKQogCSAgICB8fCBpcF9oZHJsZW4oKnBza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCXByaW50aygiaXB0X2hvb2s6IGhhcHB5IGNyYWNraW5nLlxuIik7CisJCQlwcmludGsoImlwdGFibGVfbWFuZ2xlOiBpZ25vcmluZyBzaG9ydCBTT0NLX1JBVyAiCisJCQkgICAgICAgInBhY2tldC5cbiIpOwogCQlyZXR1cm4gTkZfQUNDRVBUOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfcmF3LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYwppbmRleCAxOGMzZDRjLi5kNmU1MDMzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYwpAQCAtNSw2ICs1LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgogCiAjZGVmaW5lIFJBV19WQUxJRF9IT09LUyAoKDEgPDwgTkZfSVBfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSkKIApAQCAtMjEsNjIgKzIyLDE4IEBACiAJCS5zaXplID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogMiArIHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yKSwKIAkJLmhvb2tfZW50cnkgPSB7CiAJCQlbTkZfSVBfUFJFX1JPVVRJTkddID0gMCwKLQkJCVtORl9JUF9MT0NBTF9PVVRdID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpIH0sCisJCQlbTkZfSVBfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKQorCQl9LAogCQkudW5kZXJmbG93ID0gewogCQkJW05GX0lQX1BSRV9ST1VUSU5HXSA9IDAsCi0JCQlbTkZfSVBfTE9DQUxfT1VUXSAgPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgfSwKKwkJCVtORl9JUF9MT0NBTF9PVVRdICA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKQorCQl9LAogCX0sCiAJLmVudHJpZXMgPSB7Ci0JICAgICAvKiBQUkVfUk9VVElORyAqLwotCSAgICAgewotCQkgICAgIC5lbnRyeSA9IHsKLQkJCSAgICAgLnRhcmdldF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCi0JCQkgICAgIC5uZXh0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKLQkJICAgICB9LAotCQkgICAgIC50YXJnZXQgPSB7Ci0JCQkgIC50YXJnZXQgPSB7Ci0JCQkJICAudSA9IHsKLQkJCQkJICAudGFyZ2V0X3NpemUgPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksCi0JCQkJICB9LAotCQkJICB9LAotCQkJICAudmVyZGljdCA9IC1ORl9BQ0NFUFQgLSAxLAotCQkgICAgIH0sCi0JICAgICB9LAotCi0JICAgICAvKiBMT0NBTF9PVVQgKi8KLQkgICAgIHsKLQkJICAgICAuZW50cnkgPSB7Ci0JCQkgICAgIC50YXJnZXRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAotCQkJICAgICAubmV4dF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCi0JCSAgICAgfSwKLQkJICAgICAudGFyZ2V0ID0gewotCQkJICAgICAudGFyZ2V0ID0gewotCQkJCSAgICAgLnUgPSB7Ci0JCQkJCSAgICAgLnRhcmdldF9zaXplID0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpLAotCQkJCSAgICAgfSwKLQkJCSAgICAgfSwKLQkJCSAgICAgLnZlcmRpY3QgPSAtTkZfQUNDRVBUIC0gMSwKLQkJICAgICB9LAotCSAgICAgfSwKKwkJSVBUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogUFJFX1JPVVRJTkcgKi8KKwkJSVBUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogTE9DQUxfT1VUICovCiAJfSwKLQkvKiBFUlJPUiAqLwotCS50ZXJtID0gewotCQkuZW50cnkgPSB7Ci0JCQkudGFyZ2V0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQkJCS5uZXh0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yKSwKLQkJfSwKLQkJLnRhcmdldCA9IHsKLQkJCS50YXJnZXQgPSB7Ci0JCQkJLnUgPSB7Ci0JCQkJCS51c2VyID0gewotCQkJCQkJLnRhcmdldF9zaXplID0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2Vycm9yX3RhcmdldCkpLAotCQkJCQkJLm5hbWUgPSBJUFRfRVJST1JfVEFSR0VULAotCQkJCQl9LAotCQkJCX0sCi0JCQl9LAotCQkJLmVycm9ybmFtZSA9ICJFUlJPUiIsCi0JCX0sCi0JfQorCS50ZXJtID0gSVBUX0VSUk9SX0lOSVQsCQkJLyogRVJST1IgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFibGUgcGFja2V0X3JhdyA9IHsKQEAgLTk4LDYgKzU1LDI0IEBACiAJcmV0dXJuIGlwdF9kb190YWJsZShwc2tiLCBob29rLCBpbiwgb3V0LCAmcGFja2V0X3Jhdyk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lwdF9sb2NhbF9ob29rKHVuc2lnbmVkIGludCBob29rLAorCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCisJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCit7CisJLyogcm9vdCBpcyBwbGF5aW5nIHdpdGggcmF3IHNvY2tldHMuICovCisJaWYgKCgqcHNrYiktPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpIHx8CisJICAgIGlwX2hkcmxlbigqcHNrYikgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJpcHRhYmxlX3JhdzogaWdub3Jpbmcgc2hvcnQgU09DS19SQVciCisJCQkgICAgICAgInBhY2tldC5cbiIpOworCQlyZXR1cm4gTkZfQUNDRVBUOworCX0KKwlyZXR1cm4gaXB0X2RvX3RhYmxlKHBza2IsIGhvb2ssIGluLCBvdXQsICZwYWNrZXRfcmF3KTsKK30KKwogLyogJ3JhdycgaXMgdGhlIHZlcnkgZmlyc3QgdGFibGUuICovCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwdF9vcHNbXSA9IHsKIAl7CkBAIC0xMDgsNyArODMsNyBAQAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAl9LAogCXsKLQkJLmhvb2sgPSBpcHRfaG9vaywKKwkJLmhvb2sgPSBpcHRfbG9jYWxfaG9vaywKIAkJLnBmID0gUEZfSU5FVCwKIAkJLmhvb2tudW0gPSBORl9JUF9MT0NBTF9PVVQsCiAJCS5wcmlvcml0eSA9IE5GX0lQX1BSSV9SQVcsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3J1bGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCmluZGV4IDI1MzRmNzEuLjY3NDA3MzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jCkBAIC00Niw3NyArNDYsMjAgQEAKIAkJLmhvb2tfZW50cnkgPSB7CiAJCQlbTkZfSVBfUFJFX1JPVVRJTkddID0gMCwKIAkJCVtORl9JUF9QT1NUX1JPVVRJTkddID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCQkJW05GX0lQX0xPQ0FMX09VVF0gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCkgKiAyIH0sCisJCQlbTkZfSVBfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIKKwkJfSwKIAkJLnVuZGVyZmxvdyA9IHsKIAkJCVtORl9JUF9QUkVfUk9VVElOR10gPSAwLAogCQkJW05GX0lQX1BPU1RfUk9VVElOR10gPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCi0JCQlbTkZfSVBfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSAqIDIgfSwKKwkJCVtORl9JUF9MT0NBTF9PVVRdID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpICogMgorCQl9LAogCX0sCiAJLmVudHJpZXMgPSB7Ci0JCS8qIFBSRV9ST1VUSU5HICovCi0JCXsKLQkJCS5lbnRyeSA9IHsKLQkJCQkudGFyZ2V0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB0X2VudHJ5KSwKLQkJCQkubmV4dF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZCksCi0JCQl9LAotCQkJLnRhcmdldCA9IHsKLQkJCQkudGFyZ2V0ID0gewotCQkJCQkudSA9IHsKLQkJCQkJCS50YXJnZXRfc2l6ZSA9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGFuZGFyZF90YXJnZXQpKSwKLQkJCQkJfSwKLQkJCQl9LAotCQkJCS52ZXJkaWN0ID0gLU5GX0FDQ0VQVCAtIDEsCi0JCQl9LAotCQl9LAotCQkvKiBQT1NUX1JPVVRJTkcgKi8KLQkJewotCQkJLmVudHJ5ID0gewotCQkJCS50YXJnZXRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHRfZW50cnkpLAotCQkJCS5uZXh0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkKSwKLQkJCX0sCi0JCQkudGFyZ2V0ID0gewotCQkJCS50YXJnZXQgPSB7Ci0JCQkJCS51ID0gewotCQkJCQkJLnRhcmdldF9zaXplID0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3N0YW5kYXJkX3RhcmdldCkpLAotCQkJCQl9LAotCQkJCX0sCi0JCQkJLnZlcmRpY3QgPSAtTkZfQUNDRVBUIC0gMSwKLQkJCX0sCi0JCX0sCi0JCS8qIExPQ0FMX09VVCAqLwotCQl7Ci0JCQkuZW50cnkgPSB7Ci0JCQkJLnRhcmdldF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCi0JCQkJLm5leHRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmQpLAotCQkJfSwKLQkJCS50YXJnZXQgPSB7Ci0JCQkJLnRhcmdldCA9IHsKLQkJCQkJLnUgPSB7Ci0JCQkJCQkudGFyZ2V0X3NpemUgPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc3RhbmRhcmRfdGFyZ2V0KSksCi0JCQkJCX0sCi0JCQkJfSwKLQkJCQkudmVyZGljdCA9IC1ORl9BQ0NFUFQgLSAxLAotCQkJfSwKLQkJfSwKKwkJSVBUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogUFJFX1JPVVRJTkcgKi8KKwkJSVBUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogUE9TVF9ST1VUSU5HICovCisJCUlQVF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIExPQ0FMX09VVCAqLwogCX0sCi0JLyogRVJST1IgKi8KLQkudGVybSA9IHsKLQkJLmVudHJ5ID0gewotCQkJLnRhcmdldF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9lbnRyeSksCi0JCQkubmV4dF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwdF9lcnJvciksCi0JCX0sCi0JCS50YXJnZXQgPSB7Ci0JCQkudGFyZ2V0ID0gewotCQkJCS51ID0gewotCQkJCQkudXNlciA9IHsKLQkJCQkJCS50YXJnZXRfc2l6ZSA9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9lcnJvcl90YXJnZXQpKSwKLQkJCQkJCS5uYW1lID0gSVBUX0VSUk9SX1RBUkdFVCwKLQkJCQkJfSwKLQkJCQl9LAotCQkJfSwKLQkJCS5lcnJvcm5hbWUgPSAiRVJST1IiLAotCQl9LAotCX0KKwkudGVybSA9IElQVF9FUlJPUl9JTklULAkJCS8qIEVSUk9SICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHh0X3RhYmxlIG5hdF90YWJsZSA9IHsKQEAgLTIzMCw5ICsxNzMsNyBAQAogfQogCiBpbmxpbmUgdW5zaWduZWQgaW50Ci1hbGxvY19udWxsX2JpbmRpbmcoc3RydWN0IG5mX2Nvbm4gKmN0LAotCQkgICBzdHJ1Y3QgbmZfbmF0X2luZm8gKmluZm8sCi0JCSAgIHVuc2lnbmVkIGludCBob29rbnVtKQorYWxsb2NfbnVsbF9iaW5kaW5nKHN0cnVjdCBuZl9jb25uICpjdCwgdW5zaWduZWQgaW50IGhvb2tudW0pCiB7CiAJLyogRm9yY2UgcmFuZ2UgdG8gdGhpcyBJUDsgbGV0IHByb3RvIGRlY2lkZSBtYXBwaW5nIGZvcgogCSAgIHBlci1wcm90byBwYXJ0cyAoaGVuY2Ugbm90IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpLgpAQCAtMjUxLDkgKzE5Miw3IEBACiB9CiAKIHVuc2lnbmVkIGludAotYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChzdHJ1Y3QgbmZfY29ubiAqY3QsCi0JCQkgICAgIHN0cnVjdCBuZl9uYXRfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCithbGxvY19udWxsX2JpbmRpbmdfY29uZmlybWVkKHN0cnVjdCBuZl9jb25uICpjdCwgdW5zaWduZWQgaW50IGhvb2tudW0pCiB7CiAJX19iZTMyIGlwCiAJCT0gKEhPT0syTUFOSVAoaG9va251bSkgPT0gSVBfTkFUX01BTklQX1NSQwpAQCAtMjc1LDggKzIxNCw3IEBACiAJCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCiAJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAotCQkgICAgIHN0cnVjdCBuZl9uYXRfaW5mbyAqaW5mbykKKwkJICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CiAJaW50IHJldDsKIApAQCAtMjg1LDcgKzIyMyw3IEBACiAJaWYgKHJldCA9PSBORl9BQ0NFUFQpIHsKIAkJaWYgKCFuZl9uYXRfaW5pdGlhbGl6ZWQoY3QsIEhPT0syTUFOSVAoaG9va251bSkpKQogCQkJLyogTlVMIG1hcHBpbmcgKi8KLQkJCXJldCA9IGFsbG9jX251bGxfYmluZGluZyhjdCwgaW5mbywgaG9va251bSk7CisJCQlyZXQgPSBhbGxvY19udWxsX2JpbmRpbmcoY3QsIGhvb2tudW0pOwogCX0KIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zdGFuZGFsb25lLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYwppbmRleCA2NGJiZWQyLi41NWRhYzM2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYwpAQCAtODAsNyArODAsNiBAQAogCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAlzdHJ1Y3QgbmZfY29ubl9uYXQgKm5hdDsKLQlzdHJ1Y3QgbmZfbmF0X2luZm8gKmluZm87CiAJLyogbWFuaXB0eXBlID09IFNSQyBmb3IgcG9zdHJvdXRpbmcuICovCiAJZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUgPSBIT09LMk1BTklQKGhvb2tudW0pOwogCkBAIC0xMjksNyArMTI4LDYgQEAKIAkJfQogCQkvKiBGYWxsIHRocnUuLi4gKE9ubHkgSUNNUHMgY2FuIGJlIElQX0NUX0lTX1JFUExZKSAqLwogCWNhc2UgSVBfQ1RfTkVXOgotCQlpbmZvID0gJm5hdC0+aW5mbzsKIAogCQkvKiBTZWVuIGl0IGJlZm9yZT8gIFRoaXMgY2FuIGhhcHBlbiBmb3IgbG9vcGJhY2ssIHJldHJhbnMsCiAJCSAgIG9yIGxvY2FsIHBhY2tldHMuLiAqLwpAQCAtMTM4LDE0ICsxMzYsMTMgQEAKIAogCQkJaWYgKHVubGlrZWx5KG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpKQogCQkJCS8qIE5BVCBtb2R1bGUgd2FzIGxvYWRlZCBsYXRlICovCi0JCQkJcmV0ID0gYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChjdCwgaW5mbywKLQkJCQkJCQkJICAgaG9va251bSk7CisJCQkJcmV0ID0gYWxsb2NfbnVsbF9iaW5kaW5nX2NvbmZpcm1lZChjdCwgaG9va251bSk7CiAJCQllbHNlIGlmIChob29rbnVtID09IE5GX0lQX0xPQ0FMX0lOKQogCQkJCS8qIExPQ0FMX0lOIGhvb2sgZG9lc24ndCBoYXZlIGEgY2hhaW4hICAqLwotCQkJCXJldCA9IGFsbG9jX251bGxfYmluZGluZyhjdCwgaW5mbywgaG9va251bSk7CisJCQkJcmV0ID0gYWxsb2NfbnVsbF9iaW5kaW5nKGN0LCBob29rbnVtKTsKIAkJCWVsc2UKIAkJCQlyZXQgPSBuZl9uYXRfcnVsZV9maW5kKHBza2IsIGhvb2tudW0sIGluLCBvdXQsCi0JCQkJCQkgICAgICAgY3QsIGluZm8pOworCQkJCQkJICAgICAgIGN0KTsKIAogCQkJaWYgKHJldCAhPSBORl9BQ0NFUFQpIHsKIAkJCQlyZXR1cm4gcmV0OwpAQCAtMTYwLDEwICsxNTcsOCBAQAogCQkvKiBFU1RBQkxJU0hFRCAqLwogCQlORl9DVF9BU1NFUlQoY3RpbmZvID09IElQX0NUX0VTVEFCTElTSEVEIHx8CiAJCQkgICAgIGN0aW5mbyA9PSAoSVBfQ1RfRVNUQUJMSVNIRUQrSVBfQ1RfSVNfUkVQTFkpKTsKLQkJaW5mbyA9ICZuYXQtPmluZm87CiAJfQogCi0JTkZfQ1RfQVNTRVJUKGluZm8pOwogCXJldHVybiBuZl9uYXRfcGFja2V0KGN0LCBjdGluZm8sIGhvb2tudW0sIHBza2IpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHAuYyBiL25ldC9pcHY0L3VkcC5jCmluZGV4IDY2MDI2ZGYuLjRjN2U5NWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcC5jCisrKyBiL25ldC9pcHY0L3VkcC5jCkBAIC0xMTgsMTUgKzExOCwxNSBAQAogICogTm90ZSBhYm91dCB0aGlzIGhhc2ggZnVuY3Rpb24gOgogICogVHlwaWNhbCB1c2UgaXMgcHJvYmFibHkgZGFkZHIgPSAwLCBvbmx5IGRwb3J0IGlzIGdvaW5nIHRvIHZhcnkgaGFzaAogICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBoYXNoX3BvcnRfYW5kX2FkZHIoX191MTYgcG9ydCwgX19iZTMyIGFkZHIpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB1ZHBfaGFzaF9wb3J0KF9fdTE2IHBvcnQpCiB7Ci0JYWRkciBePSBhZGRyID4+IDE2OwotCWFkZHIgXj0gYWRkciA+PiA4OwotCXJldHVybiBwb3J0IF4gYWRkcjsKKwlyZXR1cm4gcG9ydDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgX191ZHBfbGliX3BvcnRfaW51c2UodW5zaWduZWQgaW50IGhhc2gsIGludCBwb3J0LAotCV9fYmUzMiBkYWRkciwgc3RydWN0IGhsaXN0X2hlYWQgdWRwdGFibGVbXSkKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHNvY2sgKnRoaXNfc2ssCisJCQkJICAgICAgIHN0cnVjdCBobGlzdF9oZWFkIHVkcHRhYmxlW10sCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCB1ZHBfZ2V0X3BvcnRfb3BzICpvcHMpCiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwpAQCAtMTM4LDcgKzEzOCwxMCBAQAogCQlpbmV0ID0gaW5ldF9zayhzayk7CiAJCWlmIChpbmV0LT5udW0gIT0gcG9ydCkKIAkJCWNvbnRpbnVlOwotCQlpZiAoaW5ldC0+cmN2X3NhZGRyID09IGRhZGRyKQorCQlpZiAodGhpc19zaykgeworCQkJaWYgKG9wcy0+c2FkZHJfY21wKHNrLCB0aGlzX3NrKSkKKwkJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmIChvcHMtPnNhZGRyX2FueShzaykpCiAJCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNTEsMTIgKzE1NCwxMSBAQAogICogIEBzbnVtOiAgICAgICAgcG9ydCBudW1iZXIgdG8gbG9vayB1cAogICogIEB1ZHB0YWJsZTogICAgaGFzaCBsaXN0IHRhYmxlLCBtdXN0IGJlIG9mIFVEUF9IVEFCTEVfU0laRQogICogIEBwb3J0X3JvdmVyOiAgcG9pbnRlciB0byByZWNvcmQgb2YgbGFzdCB1bmFsbG9jYXRlZCBwb3J0Ci0gKiAgQHNhZGRyX2NvbXA6ICBBRi1kZXBlbmRlbnQgY29tcGFyaXNvbiBvZiBib3VuZCBsb2NhbCBJUCBhZGRyZXNzZXMKKyAqICBAb3BzOiAgICAgICAgIEFGLWRlcGVuZGVudCBhZGRyZXNzIG9wZXJhdGlvbnMKICAqLwogaW50IF9fdWRwX2xpYl9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0sCiAJCSAgICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdLCBpbnQgKnBvcnRfcm92ZXIsCi0JCSAgICAgICBpbnQgKCpzYWRkcl9jb21wKShjb25zdCBzdHJ1Y3Qgc29jayAqc2sxLAotCQkJCQkgY29uc3Qgc3RydWN0IHNvY2sgKnNrMiApICAgICkKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB1ZHBfZ2V0X3BvcnRfb3BzICpvcHMpCiB7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CkBAIC0xNzYsOCArMTc4LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IFVEUF9IVEFCTEVfU0laRTsgaSsrLCByZXN1bHQrKykgewogCQkJaW50IHNpemU7CiAKLQkJCWhhc2ggPSBoYXNoX3BvcnRfYW5kX2FkZHIocmVzdWx0LAotCQkJCQlpbmV0X3NrKHNrKS0+cmN2X3NhZGRyKTsKKwkJCWhhc2ggPSBvcHMtPmhhc2hfcG9ydF9hbmRfcmN2X3NhZGRyKHJlc3VsdCwgc2spOwogCQkJaGVhZCA9ICZ1ZHB0YWJsZVtoYXNoICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXTsKIAkJCWlmIChobGlzdF9lbXB0eShoZWFkKSkgewogCQkJCWlmIChyZXN1bHQgPiBzeXNjdGxfbG9jYWxfcG9ydF9yYW5nZVsxXSkKQEAgLTIwMywxNyArMjA0LDE2IEBACiAJCQkJcmVzdWx0ID0gc3lzY3RsX2xvY2FsX3BvcnRfcmFuZ2VbMF0KIAkJCQkJKyAoKHJlc3VsdCAtIHN5c2N0bF9sb2NhbF9wb3J0X3JhbmdlWzBdKSAmCiAJCQkJCSAgIChVRFBfSFRBQkxFX1NJWkUgLSAxKSk7Ci0JCQloYXNoID0gaGFzaF9wb3J0X2FuZF9hZGRyKHJlc3VsdCwgMCk7CisJCQloYXNoID0gdWRwX2hhc2hfcG9ydChyZXN1bHQpOwogCQkJaWYgKF9fdWRwX2xpYl9wb3J0X2ludXNlKGhhc2gsIHJlc3VsdCwKLQkJCQkJCSAwLCB1ZHB0YWJsZSkpCisJCQkJCQkgTlVMTCwgdWRwdGFibGUsIG9wcykpCiAJCQkJY29udGludWU7Ci0JCQlpZiAoIWluZXRfc2soc2spLT5yY3Zfc2FkZHIpCisJCQlpZiAob3BzLT5zYWRkcl9hbnkoc2spKQogCQkJCWJyZWFrOwogCi0JCQloYXNoID0gaGFzaF9wb3J0X2FuZF9hZGRyKHJlc3VsdCwKLQkJCQkJaW5ldF9zayhzayktPnJjdl9zYWRkcik7CisJCQloYXNoID0gb3BzLT5oYXNoX3BvcnRfYW5kX3Jjdl9zYWRkcihyZXN1bHQsIHNrKTsKIAkJCWlmICghIF9fdWRwX2xpYl9wb3J0X2ludXNlKGhhc2gsIHJlc3VsdCwKLQkJCQlpbmV0X3NrKHNrKS0+cmN2X3NhZGRyLCB1ZHB0YWJsZSkpCisJCQkJCQkgICBzaywgdWRwdGFibGUsIG9wcykpCiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGkgPj0gKDEgPDwgMTYpIC8gVURQX0hUQUJMRV9TSVpFKQpAQCAtMjIxLDcgKzIyMSw3IEBACiBnb3RpdDoKIAkJKnBvcnRfcm92ZXIgPSBzbnVtID0gcmVzdWx0OwogCX0gZWxzZSB7Ci0JCWhhc2ggPSBoYXNoX3BvcnRfYW5kX2FkZHIoc251bSwgMCk7CisJCWhhc2ggPSB1ZHBfaGFzaF9wb3J0KHNudW0pOwogCQloZWFkID0gJnVkcHRhYmxlW2hhc2ggJiAoVURQX0hUQUJMRV9TSVpFIC0gMSldOwogCiAJCXNrX2Zvcl9lYWNoKHNrMiwgbm9kZSwgaGVhZCkKQEAgLTIzMSwxMiArMjMxLDExIEBACiAJCQkgICAgKCFzazItPnNrX3JldXNlIHx8ICFzay0+c2tfcmV1c2UpICYmCiAJCQkgICAgKCFzazItPnNrX2JvdW5kX2Rldl9pZiB8fCAhc2stPnNrX2JvdW5kX2Rldl9pZiB8fAogCQkJICAgICBzazItPnNrX2JvdW5kX2Rldl9pZiA9PSBzay0+c2tfYm91bmRfZGV2X2lmKSAmJgotCQkJICAgICgqc2FkZHJfY29tcCkoc2ssIHNrMikpCisJCQkgICAgb3BzLT5zYWRkcl9jbXAoc2ssIHNrMikpCiAJCQkJZ290byBmYWlsOwogCi0JCWlmIChpbmV0X3NrKHNrKS0+cmN2X3NhZGRyKSB7Ci0JCQloYXNoID0gaGFzaF9wb3J0X2FuZF9hZGRyKHNudW0sCi0JCQkJCQkgIGluZXRfc2soc2spLT5yY3Zfc2FkZHIpOworCQlpZiAoIW9wcy0+c2FkZHJfYW55KHNrKSkgeworCQkJaGFzaCA9IG9wcy0+aGFzaF9wb3J0X2FuZF9yY3Zfc2FkZHIoc251bSwgc2spOwogCQkJaGVhZCA9ICZ1ZHB0YWJsZVtoYXNoICYgKFVEUF9IVEFCTEVfU0laRSAtIDEpXTsKIAogCQkJc2tfZm9yX2VhY2goc2syLCBub2RlLCBoZWFkKQpAQCAtMjQ4LDcgKzI0Nyw3IEBACiAJCQkJICAgICAhc2stPnNrX2JvdW5kX2Rldl9pZiB8fAogCQkJCSAgICAgc2syLT5za19ib3VuZF9kZXZfaWYgPT0KIAkJCQkgICAgIHNrLT5za19ib3VuZF9kZXZfaWYpICYmCi0JCQkJICAgICgqc2FkZHJfY29tcCkoc2ssIHNrMikpCisJCQkJICAgIG9wcy0+c2FkZHJfY21wKHNrLCBzazIpKQogCQkJCQlnb3RvIGZhaWw7CiAJCX0KIAl9CkBAIC0yNjYsMTIgKzI2NSwxMiBAQAogfQogCiBpbnQgdWRwX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKLQkJCWludCAoKnNjbXApKGNvbnN0IHN0cnVjdCBzb2NrICosIGNvbnN0IHN0cnVjdCBzb2NrICopKQorCQkgY29uc3Qgc3RydWN0IHVkcF9nZXRfcG9ydF9vcHMgKm9wcykKIHsKLQlyZXR1cm4gIF9fdWRwX2xpYl9nZXRfcG9ydChzaywgc251bSwgdWRwX2hhc2gsICZ1ZHBfcG9ydF9yb3Zlciwgc2NtcCk7CisJcmV0dXJuICBfX3VkcF9saWJfZ2V0X3BvcnQoc2ssIHNudW0sIHVkcF9oYXNoLCAmdWRwX3BvcnRfcm92ZXIsIG9wcyk7CiB9CiAKLWludCBpcHY0X3Jjdl9zYWRkcl9lcXVhbChjb25zdCBzdHJ1Y3Qgc29jayAqc2sxLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2syKQorc3RhdGljIGludCBpcHY0X3Jjdl9zYWRkcl9lcXVhbChjb25zdCBzdHJ1Y3Qgc29jayAqc2sxLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2syKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQxID0gaW5ldF9zayhzazEpLCAqaW5ldDIgPSBpbmV0X3NrKHNrMik7CiAKQEAgLTI4MCw5ICsyNzksMzMgQEAKIAkJICAgaW5ldDEtPnJjdl9zYWRkciA9PSBpbmV0Mi0+cmN2X3NhZGRyICAgICAgKSk7CiB9CiAKK3N0YXRpYyBpbnQgaXB2NF9yY3Zfc2FkZHJfYW55KGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gIWluZXRfc2soc2spLT5yY3Zfc2FkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGlwdjRfaGFzaF9wb3J0X2FuZF9hZGRyKF9fdTE2IHBvcnQsIF9fYmUzMiBhZGRyKQoreworCWFkZHIgXj0gYWRkciA+PiAxNjsKKwlhZGRyIF49IGFkZHIgPj4gODsKKwlyZXR1cm4gcG9ydCBeIGFkZHI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXB2NF9oYXNoX3BvcnRfYW5kX3Jjdl9zYWRkcihfX3UxNiBwb3J0LAorCQkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gaXB2NF9oYXNoX3BvcnRfYW5kX2FkZHIocG9ydCwgaW5ldF9zayhzayktPnJjdl9zYWRkcik7Cit9CisKK2NvbnN0IHN0cnVjdCB1ZHBfZ2V0X3BvcnRfb3BzIHVkcF9pcHY0X29wcyA9IHsKKwkuc2FkZHJfY21wID0gaXB2NF9yY3Zfc2FkZHJfZXF1YWwsCisJLnNhZGRyX2FueSA9IGlwdjRfcmN2X3NhZGRyX2FueSwKKwkuaGFzaF9wb3J0X2FuZF9yY3Zfc2FkZHIgPSBpcHY0X2hhc2hfcG9ydF9hbmRfcmN2X3NhZGRyLAorfTsKKwogc3RhdGljIGlubGluZSBpbnQgdWRwX3Y0X2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSkKIHsKLQlyZXR1cm4gdWRwX2dldF9wb3J0KHNrLCBzbnVtLCBpcHY0X3Jjdl9zYWRkcl9lcXVhbCk7CisJcmV0dXJuIHVkcF9nZXRfcG9ydChzaywgc251bSwgJnVkcF9pcHY0X29wcyk7CiB9CiAKIC8qIFVEUCBpcyBuZWFybHkgYWx3YXlzIHdpbGRjYXJkcyBvdXQgdGhlIHdhem9vLCBpdCBtYWtlcyBubyBzZW5zZSB0byB0cnkKQEAgLTI5Nyw4ICszMjAsOCBAQAogCXVuc2lnbmVkIGludCBoYXNoLCBoYXNod2lsZDsKIAlpbnQgc2NvcmUsIGJlc3QgPSAtMSwgaHBvcnQgPSBudG9ocyhkcG9ydCk7CiAKLSAJaGFzaCA9IGhhc2hfcG9ydF9hbmRfYWRkcihocG9ydCwgZGFkZHIpOwotIAloYXNod2lsZCA9IGhhc2hfcG9ydF9hbmRfYWRkcihocG9ydCwgMCk7CisJaGFzaCA9IGlwdjRfaGFzaF9wb3J0X2FuZF9hZGRyKGhwb3J0LCBkYWRkcik7CisJaGFzaHdpbGQgPSB1ZHBfaGFzaF9wb3J0KGhwb3J0KTsKIAogCXJlYWRfbG9jaygmdWRwX2hhc2hfbG9jayk7CiAKQEAgLTExOTgsOCArMTIyMSw4IEBACiAJc3RydWN0IHNvY2sgKnNrLCAqc2t3LCAqc2tuZXh0OwogCWludCBkaWY7CiAJaW50IGhwb3J0ID0gbnRvaHModWgtPmRlc3QpOwotCXVuc2lnbmVkIGludCBoYXNoID0gaGFzaF9wb3J0X2FuZF9hZGRyKGhwb3J0LCBkYWRkcik7Ci0JdW5zaWduZWQgaW50IGhhc2h3aWxkID0gaGFzaF9wb3J0X2FuZF9hZGRyKGhwb3J0LCAwKTsKKwl1bnNpZ25lZCBpbnQgaGFzaCA9IGlwdjRfaGFzaF9wb3J0X2FuZF9hZGRyKGhwb3J0LCBkYWRkcik7CisJdW5zaWduZWQgaW50IGhhc2h3aWxkID0gdWRwX2hhc2hfcG9ydChocG9ydCk7CiAKIAlkaWYgPSBza2ItPmRldi0+aWZpbmRleDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwX2ltcGwuaCBiL25ldC9pcHY0L3VkcF9pbXBsLmgKaW5kZXggODIwYTQ3Ny4uMDZkOTQxOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwX2ltcGwuaAorKysgYi9uZXQvaXB2NC91ZHBfaW1wbC5oCkBAIC01LDE0ICs1LDE0IEBACiAjaW5jbHVkZSA8bmV0L3Byb3RvY29sLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdWRwX2dldF9wb3J0X29wcyB1ZHBfaXB2NF9vcHM7CisKIGV4dGVybiBpbnQgIAlfX3VkcDRfbGliX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgaGxpc3RfaGVhZCBbXSwgaW50ICk7CiBleHRlcm4gdm9pZCAJX191ZHA0X2xpYl9lcnIoc3RydWN0IHNrX2J1ZmYgKiwgdTMyLCBzdHJ1Y3QgaGxpc3RfaGVhZCBbXSk7CiAKIGV4dGVybiBpbnQJX191ZHBfbGliX2dldF9wb3J0KHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgc2hvcnQgc251bSwKIAkJCQkgICBzdHJ1Y3QgaGxpc3RfaGVhZCB1ZHB0YWJsZVtdLCBpbnQgKnBvcnRfcm92ZXIsCi0JCQkJICAgaW50ICgqKShjb25zdCBzdHJ1Y3Qgc29jayosY29uc3Qgc3RydWN0IHNvY2sqKSk7Ci1leHRlcm4gaW50CWlwdjRfcmN2X3NhZGRyX2VxdWFsKGNvbnN0IHN0cnVjdCBzb2NrICosIGNvbnN0IHN0cnVjdCBzb2NrICopOwotCisJCQkJICAgY29uc3Qgc3RydWN0IHVkcF9nZXRfcG9ydF9vcHMgKm9wcyk7CiAKIGV4dGVybiBpbnQJdWRwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwbGl0ZS5jIGIvbmV0L2lwdjQvdWRwbGl0ZS5jCmluZGV4IGYzNGZkNjguLjM2NTNiMzIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcGxpdGUuYworKysgYi9uZXQvaXB2NC91ZHBsaXRlLmMKQEAgLTE5LDE0ICsxOSwxNSBAQAogc3RhdGljIGludAkJdWRwbGl0ZV9wb3J0X3JvdmVyOwogCiBpbnQgdWRwbGl0ZV9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHAsCi0JCSAgICAgaW50ICgqYykoY29uc3Qgc3RydWN0IHNvY2sgKiwgY29uc3Qgc3RydWN0IHNvY2sgKikpCisJCSAgICAgY29uc3Qgc3RydWN0IHVkcF9nZXRfcG9ydF9vcHMgKm9wcykKIHsKLQlyZXR1cm4gIF9fdWRwX2xpYl9nZXRfcG9ydChzaywgcCwgdWRwbGl0ZV9oYXNoLCAmdWRwbGl0ZV9wb3J0X3JvdmVyLCBjKTsKKwlyZXR1cm4gIF9fdWRwX2xpYl9nZXRfcG9ydChzaywgcCwgdWRwbGl0ZV9oYXNoLAorCQkJCSAgICZ1ZHBsaXRlX3BvcnRfcm92ZXIsIG9wcyk7CiB9CiAKIHN0YXRpYyBpbnQgdWRwbGl0ZV92NF9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0pCiB7Ci0JcmV0dXJuIHVkcGxpdGVfZ2V0X3BvcnQoc2ssIHNudW0sIGlwdjRfcmN2X3NhZGRyX2VxdWFsKTsKKwlyZXR1cm4gdWRwbGl0ZV9nZXRfcG9ydChzaywgc251bSwgJnVkcF9pcHY0X29wcyk7CiB9CiAKIHN0YXRpYyBpbnQgdWRwbGl0ZV9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IGQwMjY4NWMuLmM3ZWEyNDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtNDIwNCw2ICs0MjA0LDEwIEBACiAJCXJldHVybiBlcnI7CiAKIAlpcDZfbnVsbF9lbnRyeS5ydDZpX2lkZXYgPSBpbjZfZGV2X2dldCgmbG9vcGJhY2tfZGV2KTsKKyNpZmRlZiBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMKKwlpcDZfcHJvaGliaXRfZW50cnkucnQ2aV9pZGV2ID0gaW42X2Rldl9nZXQoJmxvb3BiYWNrX2Rldik7CisJaXA2X2Jsa19ob2xlX2VudHJ5LnJ0NmlfaWRldiA9IGluNl9kZXZfZ2V0KCZsb29wYmFja19kZXYpOworI2VuZGlmCiAKIAlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmlwdjZfZGV2X25vdGYpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9leHRoZHJzLmMgYi9uZXQvaXB2Ni9leHRoZHJzLmMKaW5kZXggNmQ4ZTRhYy4uMTRiZTBiOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXh0aGRycy5jCisrKyBiL25ldC9pcHY2L2V4dGhkcnMuYwpAQCAtNjYwLDYgKzY2MCwxNCBAQAogICBIb3AtYnktaG9wIG9wdGlvbnMuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorLyoKKyAqIE5vdGU6IHdlIGNhbm5vdCByZWx5IG9uIHNrYi0+ZHN0IGJlZm9yZSB3ZSBhc3NpZ24gaXQgaW4gaXA2X3JvdXRlX2lucHV0KCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGluZXQ2X2RldiAqaXB2Nl9za2JfaWRldihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPmRzdCA/IGlwNl9kc3RfaWRldihza2ItPmRzdCkgOiBfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKK30KKwogLyogUm91dGVyIEFsZXJ0IGFzIG9mIFJGQyAyNzExICovCiAKIHN0YXRpYyBpbnQgaXB2Nl9ob3BfcmEoc3RydWN0IHNrX2J1ZmYgKipza2JwLCBpbnQgb3B0b2ZmKQpAQCAtNjg4LDI1ICs2OTYsMjUgQEAKIAlpZiAobmhbb3B0b2ZmICsgMV0gIT0gNCB8fCAob3B0b2ZmICYgMykgIT0gMikgewogCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJpcHY2X2hvcF9qdW1ibzogd3JvbmcganVtYm8gb3B0IGxlbmd0aC9hbGlnbm1lbnQgJWRcbiIsCiAJCQkgICAgICAgbmhbb3B0b2ZmKzFdKTsKLQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLAorCQlJUDZfSU5DX1NUQVRTX0JIKGlwdjZfc2tiX2lkZXYoc2tiKSwKIAkJCQkgSVBTVEFUU19NSUJfSU5IRFJFUlJPUlMpOwogCQlnb3RvIGRyb3A7CiAJfQogCiAJcGt0X2xlbiA9IG50b2hsKCooX19iZTMyICopKG5oICsgb3B0b2ZmICsgMikpOwogCWlmIChwa3RfbGVuIDw9IElQVjZfTUFYUExFTikgewotCQlJUDZfSU5DX1NUQVRTX0JIKGlwNl9kc3RfaWRldihza2ItPmRzdCksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKKwkJSVA2X0lOQ19TVEFUU19CSChpcHY2X3NrYl9pZGV2KHNrYiksIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKIAkJaWNtcHY2X3BhcmFtX3Byb2Ioc2tiLCBJQ01QVjZfSERSX0ZJRUxELCBvcHRvZmYrMik7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4pIHsKLQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CisJCUlQNl9JTkNfU1RBVFNfQkgoaXB2Nl9za2JfaWRldihza2IpLCBJUFNUQVRTX01JQl9JTkhEUkVSUk9SUyk7CiAJCWljbXB2Nl9wYXJhbV9wcm9iKHNrYiwgSUNNUFY2X0hEUl9GSUVMRCwgb3B0b2ZmKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHBrdF9sZW4gPiBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpIHsKLQkJSVA2X0lOQ19TVEFUU19CSChpcDZfZHN0X2lkZXYoc2tiLT5kc3QpLCBJUFNUQVRTX01JQl9JTlRSVU5DQVRFRFBLVFMpOworCQlJUDZfSU5DX1NUQVRTX0JIKGlwdjZfc2tiX2lkZXYoc2tiKSwgSVBTVEFUU19NSUJfSU5UUlVOQ0FURURQS1RTKTsKIAkJZ290byBkcm9wOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X291dHB1dC5jIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCmluZGV4IGY1MDgxNzEuLjQ3MDRiNWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKQEAgLTQ2MywxMCArNDYzLDE3IEBACiAJCSAqLwogCQlpZiAoeHJsaW1fYWxsb3coZHN0LCAxKkhaKSkKIAkJCW5kaXNjX3NlbmRfcmVkaXJlY3Qoc2tiLCBuLCB0YXJnZXQpOwotCX0gZWxzZSBpZiAoaXB2Nl9hZGRyX3R5cGUoJmhkci0+c2FkZHIpJihJUFY2X0FERFJfTVVMVElDQVNUfElQVjZfQUREUl9MT09QQkFDSwotCQkJCQkJfElQVjZfQUREUl9MSU5LTE9DQUwpKSB7CisJfSBlbHNlIHsKKwkJaW50IGFkZHJ0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmhkci0+c2FkZHIpOworCiAJCS8qIFRoaXMgY2hlY2sgaXMgc2VjdXJpdHkgY3JpdGljYWwuICovCi0JCWdvdG8gZXJyb3I7CisJCWlmIChhZGRydHlwZSAmIChJUFY2X0FERFJfTVVMVElDQVNUfElQVjZfQUREUl9MT09QQkFDSykpCisJCQlnb3RvIGVycm9yOworCQlpZiAoYWRkcnR5cGUgJiBJUFY2X0FERFJfTElOS0xPQ0FMKSB7CisJCQlpY21wdjZfc2VuZChza2IsIElDTVBWNl9ERVNUX1VOUkVBQ0gsCisJCQkJSUNNUFY2X05PVF9ORUlHSEJPVVIsIDAsIHNrYi0+ZGV2KTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KIAl9CiAKIAlpZiAoc2tiLT5sZW4gPiBkc3RfbXR1KGRzdCkpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwppbmRleCA3NmYwY2Y2Li43ZTMyZTJhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCkBAIC0yNCw1MyArMjQsMjkgQEAKIAlzdHJ1Y3QgaXA2dF9yZXBsYWNlIHJlcGw7CiAJc3RydWN0IGlwNnRfc3RhbmRhcmQgZW50cmllc1szXTsKIAlzdHJ1Y3QgaXA2dF9lcnJvciB0ZXJtOwotfSBpbml0aWFsX3RhYmxlIF9faW5pdGRhdGEKLT0geyB7ICJmaWx0ZXIiLCBGSUxURVJfVkFMSURfSE9PS1MsIDQsCi0gICAgICBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogMyArIHNpemVvZihzdHJ1Y3QgaXA2dF9lcnJvciksCi0gICAgICB7IFtORl9JUDZfTE9DQUxfSU5dID0gMCwKLQlbTkZfSVA2X0ZPUldBUkRdID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKLQlbTkZfSVA2X0xPQ0FMX09VVF0gPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogMiB9LAotICAgICAgeyBbTkZfSVA2X0xPQ0FMX0lOXSA9IDAsCi0JW05GX0lQNl9GT1JXQVJEXSA9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCksCi0JW05GX0lQNl9MT0NBTF9PVVRdID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSAqIDIgfSwKLSAgICAgIDAsIE5VTEwsIHsgfSB9LAotICAgIHsKLQkgICAgLyogTE9DQUxfSU4gKi8KLQkgICAgeyB7IHsgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkJMCwKLQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKLQkJMCwgeyAwLCAwIH0sIHsgfSB9LAotCSAgICAgIHsgeyB7IHsgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfSwKLQkgICAgLyogRk9SV0FSRCAqLwotCSAgICB7IHsgeyB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAotCQkwLAotCQlzaXplb2Yoc3RydWN0IGlwNnRfZW50cnkpLAotCQlzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpLAotCQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0JICAgICAgeyB7IHsgeyBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKLQkJLU5GX0FDQ0VQVCAtIDEgfSB9LAotCSAgICAvKiBMT0NBTF9PVVQgKi8KLQkgICAgeyB7IHsgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkJMCwKLQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKLQkJMCwgeyAwLCAwIH0sIHsgfSB9LAotCSAgICAgIHsgeyB7IHsgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfQotICAgIH0sCi0gICAgLyogRVJST1IgKi8KLSAgICB7IHsgeyB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAotCTAsCi0Jc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwKLQlzaXplb2Yoc3RydWN0IGlwNnRfZXJyb3IpLAotCTAsIHsgMCwgMCB9LCB7IH0gfSwKLSAgICAgIHsgeyB7IHsgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfZXJyb3JfdGFyZ2V0KSksIElQNlRfRVJST1JfVEFSR0VUIH0gfSwKLQkgIHsgfSB9LAotCSJFUlJPUiIKLSAgICAgIH0KLSAgICB9Cit9IGluaXRpYWxfdGFibGUgX19pbml0ZGF0YSA9IHsKKwkucmVwbCA9IHsKKwkJLm5hbWUgPSAiZmlsdGVyIiwKKwkJLnZhbGlkX2hvb2tzID0gRklMVEVSX1ZBTElEX0hPT0tTLAorCQkubnVtX2VudHJpZXMgPSA0LAorCQkuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiAzICsgc2l6ZW9mKHN0cnVjdCBpcDZ0X2Vycm9yKSwKKwkJLmhvb2tfZW50cnkgPSB7CisJCQlbTkZfSVA2X0xPQ0FMX0lOXSA9IDAsCisJCQlbTkZfSVA2X0ZPUldBUkRdID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKKwkJCVtORl9JUDZfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiAyCisJCX0sCisJCS51bmRlcmZsb3cgPSB7CisJCQlbTkZfSVA2X0xPQ0FMX0lOXSA9IDAsCisJCQlbTkZfSVA2X0ZPUldBUkRdID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKKwkJCVtORl9JUDZfTE9DQUxfT1VUXSA9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiAyCisJCX0sCisJfSwKKwkuZW50cmllcyA9IHsKKwkJSVA2VF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIExPQ0FMX0lOICovCisJCUlQNlRfU1RBTkRBUkRfSU5JVChORl9BQ0NFUFQpLAkvKiBGT1JXQVJEICovCisJCUlQNlRfU1RBTkRBUkRfSU5JVChORl9BQ0NFUFQpLAkvKiBMT0NBTF9PVVQgKi8KKwl9LAorCS50ZXJtID0gSVA2VF9FUlJPUl9JTklULAkJLyogRVJST1IgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFibGUgcGFja2V0X2ZpbHRlciA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwppbmRleCBhOWYxMGUzLi5mMmQyNjQ5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCkBAIC0zMiw3MyArMzIsMzUgQEAKIAlzdHJ1Y3QgaXA2dF9yZXBsYWNlIHJlcGw7CiAJc3RydWN0IGlwNnRfc3RhbmRhcmQgZW50cmllc1s1XTsKIAlzdHJ1Y3QgaXA2dF9lcnJvciB0ZXJtOwotfSBpbml0aWFsX3RhYmxlIF9faW5pdGRhdGEKLT0geyB7ICJtYW5nbGUiLCBNQU5HTEVfVkFMSURfSE9PS1MsIDYsCi0gICAgICBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogNSArIHNpemVvZihzdHJ1Y3QgaXA2dF9lcnJvciksCi0gICAgICB7IFtORl9JUDZfUFJFX1JPVVRJTkddIAk9IDAsCi0JW05GX0lQNl9MT0NBTF9JTl0JPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpLAotCVtORl9JUDZfRk9SV0FSRF0JPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogMiwKLQlbTkZfSVA2X0xPQ0FMX09VVF0gCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSAqIDMsCi0JW05GX0lQNl9QT1NUX1JPVVRJTkddCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSAqIDR9LAotICAgICAgeyBbTkZfSVA2X1BSRV9ST1VUSU5HXSAJPSAwLAotCVtORl9JUDZfTE9DQUxfSU5dCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKLQlbTkZfSVA2X0ZPUldBUkRdCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSAqIDIsCi0JW05GX0lQNl9MT0NBTF9PVVRdIAk9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiAzLAotCVtORl9JUDZfUE9TVF9ST1VUSU5HXQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiA0fSwKLSAgICAgIDAsIE5VTEwsIHsgfSB9LAotICAgIHsKLQkgICAgLyogUFJFX1JPVVRJTkcgKi8KLQkgICAgeyB7IHsgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkJMCwKLQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKLQkJMCwgeyAwLCAwIH0sIHsgfSB9LAotCSAgICAgIHsgeyB7IHsgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfSwKLQkgICAgLyogTE9DQUxfSU4gKi8KLQkgICAgeyB7IHsgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkJMCwKLQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKLQkJMCwgeyAwLCAwIH0sIHsgfSB9LAotCSAgICAgIHsgeyB7IHsgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfSwKLQkgICAgLyogRk9SV0FSRCAqLwotCSAgICB7IHsgeyB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCB7IHsgeyAwIH0gfSB9LCAiIiwgIiIsIHsgMCB9LCB7IDAgfSwgMCwgMCwgMCB9LAotCQkwLAotCQlzaXplb2Yoc3RydWN0IGlwNnRfZW50cnkpLAotCQlzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpLAotCQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0JICAgICAgeyB7IHsgeyBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQpKSwgIiIgfSB9LCB7IH0gfSwKLQkJLU5GX0FDQ0VQVCAtIDEgfSB9LAotCSAgICAvKiBMT0NBTF9PVVQgKi8KLQkgICAgeyB7IHsgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkJMCwKLQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwKLQkJc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKLQkJMCwgeyAwLCAwIH0sIHsgfSB9LAotCSAgICAgIHsgeyB7IHsgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0KSksICIiIH0gfSwgeyB9IH0sCi0JCS1ORl9BQ0NFUFQgLSAxIH0gfSwKLQkgICAgLyogUE9TVF9ST1VUSU5HICovCi0JICAgIHsgeyB7IHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sIHsgeyB7IDAgfSB9IH0sICIiLCAiIiwgeyAwIH0sIHsgMCB9LCAwLCAwLCAwIH0sCi0JCTAsCi0JCXNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSksCi0JCXNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCksCi0JCTAsIHsgMCwgMCB9LCB7IH0gfSwKLQkgICAgICB7IHsgeyB7IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkX3RhcmdldCkpLCAiIiB9IH0sIHsgfSB9LAotCQktTkZfQUNDRVBUIC0gMSB9IH0KLSAgICB9LAotICAgIC8qIEVSUk9SICovCi0gICAgeyB7IHsgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgeyB7IHsgMCB9IH0gfSwgIiIsICIiLCB7IDAgfSwgeyAwIH0sIDAsIDAsIDAgfSwKLQkwLAotCXNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSksCi0Jc2l6ZW9mKHN0cnVjdCBpcDZ0X2Vycm9yKSwKLQkwLCB7IDAsIDAgfSwgeyB9IH0sCi0gICAgICB7IHsgeyB7IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X2Vycm9yX3RhcmdldCkpLCBJUDZUX0VSUk9SX1RBUkdFVCB9IH0sCi0JICB7IH0gfSwKLQkiRVJST1IiCi0gICAgICB9Ci0gICAgfQorfSBpbml0aWFsX3RhYmxlIF9faW5pdGRhdGEgPSB7CisJLnJlcGwgPSB7CisJCS5uYW1lID0gIm1hbmdsZSIsCisJCS52YWxpZF9ob29rcyA9IE1BTkdMRV9WQUxJRF9IT09LUywKKwkJLm51bV9lbnRyaWVzID0gNiwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogNSArIHNpemVvZihzdHJ1Y3QgaXA2dF9lcnJvciksCisJCS5ob29rX2VudHJ5ID0geworCQkJW05GX0lQNl9QUkVfUk9VVElOR10gCT0gMCwKKwkJCVtORl9JUDZfTE9DQUxfSU5dCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKKwkJCVtORl9JUDZfRk9SV0FSRF0JPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogMiwKKwkJCVtORl9JUDZfTE9DQUxfT1VUXSAJPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogMywKKwkJCVtORl9JUDZfUE9TVF9ST1VUSU5HXQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiA0LAorCQl9LAorCQkudW5kZXJmbG93ID0geworCQkJW05GX0lQNl9QUkVfUk9VVElOR10gCT0gMCwKKwkJCVtORl9JUDZfTE9DQUxfSU5dCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKKwkJCVtORl9JUDZfRk9SV0FSRF0JPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogMiwKKwkJCVtORl9JUDZfTE9DQUxfT1VUXSAJPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpICogMywKKwkJCVtORl9JUDZfUE9TVF9ST1VUSU5HXQk9IHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZCkgKiA0LAorCQl9LAorCX0sCisJLmVudHJpZXMgPSB7CisJCUlQNlRfU1RBTkRBUkRfSU5JVChORl9BQ0NFUFQpLAkvKiBQUkVfUk9VVElORyAqLworCQlJUDZUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogTE9DQUxfSU4gKi8KKwkJSVA2VF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIEZPUldBUkQgKi8KKwkJSVA2VF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIExPQ0FMX09VVCAqLworCQlJUDZUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogUE9TVF9ST1VUSU5HICovCisJfSwKKwkudGVybSA9IElQNlRfRVJST1JfSU5JVCwJCS8qIEVSUk9SICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHh0X3RhYmxlIHBhY2tldF9tYW5nbGVyID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3Jhdy5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3Jhdy5jCmluZGV4IGEzZWI1YjguLjBhY2RhNDUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfcmF3LmMKQEAgLTM1LDU2ICszNSwxMCBAQAogCQl9LAogCX0sCiAJLmVudHJpZXMgPSB7Ci0JCS8qIFBSRV9ST1VUSU5HICovCi0JCXsKLQkJCS5lbnRyeSA9IHsKLQkJCQkudGFyZ2V0X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgaXA2dF9lbnRyeSksCi0JCQkJLm5leHRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X3N0YW5kYXJkKSwKLQkJCX0sCi0JCQkudGFyZ2V0ID0gewotCQkJCS50YXJnZXQgPSB7Ci0JCQkJCS51ID0gewotCQkJCQkJLnRhcmdldF9zaXplID0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmRfdGFyZ2V0KSksCi0JCQkJCX0sCi0JCQkJfSwKLQkJCQkudmVyZGljdCA9IC1ORl9BQ0NFUFQgLSAxLAotCQkJfSwKLQkJfSwKLQotCQkvKiBMT0NBTF9PVVQgKi8KLQkJewotCQkJLmVudHJ5ID0gewotCQkJCS50YXJnZXRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2VudHJ5KSwKLQkJCQkubmV4dF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwNnRfc3RhbmRhcmQpLAotCQkJfSwKLQkJCS50YXJnZXQgPSB7Ci0JCQkJLnRhcmdldCA9IHsKLQkJCQkJLnUgPSB7Ci0JCQkJCQkudGFyZ2V0X3NpemUgPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9zdGFuZGFyZF90YXJnZXQpKSwKLQkJCQkJfSwKLQkJCQl9LAotCQkJCS52ZXJkaWN0ID0gLU5GX0FDQ0VQVCAtIDEsCi0JCQl9LAotCQl9LAorCQlJUDZUX1NUQU5EQVJEX0lOSVQoTkZfQUNDRVBUKSwJLyogUFJFX1JPVVRJTkcgKi8KKwkJSVA2VF9TVEFOREFSRF9JTklUKE5GX0FDQ0VQVCksCS8qIExPQ0FMX09VVCAqLwogCX0sCi0JLyogRVJST1IgKi8KLQkudGVybSA9IHsKLQkJLmVudHJ5ID0gewotCQkJLnRhcmdldF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGlwNnRfZW50cnkpLAotCQkJLm5leHRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBpcDZ0X2Vycm9yKSwKLQkJfSwKLQkJLnRhcmdldCA9IHsKLQkJCS50YXJnZXQgPSB7Ci0JCQkJLnUgPSB7Ci0JCQkJCS51c2VyID0gewotCQkJCQkJLnRhcmdldF9zaXplID0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfZXJyb3JfdGFyZ2V0KSksCi0JCQkJCQkubmFtZSA9IElQNlRfRVJST1JfVEFSR0VULAotCQkJCQl9LAotCQkJCX0sCi0JCQl9LAotCQkJLmVycm9ybmFtZSA9ICJFUlJPUiIsCi0JCX0sCi0JfQorCS50ZXJtID0gSVA2VF9FUlJPUl9JTklULAkJLyogRVJST1IgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgeHRfdGFibGUgcGFja2V0X3JhdyA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggYjA4M2MwOS4uYTdhZTU5YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTUyLDkgKzUyLDI4IEBACiAKIERFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcF9zdGF0c19pbjYpIF9fcmVhZF9tb3N0bHk7CiAKK3N0YXRpYyBpbnQgaXB2Nl9yY3Zfc2FkZHJfYW55KGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CisKKwlyZXR1cm4gaXB2Nl9hZGRyX2FueSgmbnAtPnJjdl9zYWRkcik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXB2Nl9oYXNoX3BvcnRfYW5kX3Jjdl9zYWRkcihfX3UxNiBwb3J0LAorCQkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gcG9ydDsKK30KKworY29uc3Qgc3RydWN0IHVkcF9nZXRfcG9ydF9vcHMgdWRwX2lwdjZfb3BzID0geworCS5zYWRkcl9jbXAgPSBpcHY2X3Jjdl9zYWRkcl9lcXVhbCwKKwkuc2FkZHJfYW55ID0gaXB2Nl9yY3Zfc2FkZHJfYW55LAorCS5oYXNoX3BvcnRfYW5kX3Jjdl9zYWRkciA9IGlwdjZfaGFzaF9wb3J0X2FuZF9yY3Zfc2FkZHIsCit9OworCiBzdGF0aWMgaW5saW5lIGludCB1ZHBfdjZfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtKQogewotCXJldHVybiB1ZHBfZ2V0X3BvcnQoc2ssIHNudW0sIGlwdjZfcmN2X3NhZGRyX2VxdWFsKTsKKwlyZXR1cm4gdWRwX2dldF9wb3J0KHNrLCBzbnVtLCAmdWRwX2lwdjZfb3BzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzb2NrICpfX3VkcDZfbGliX2xvb2t1cChzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBfX2JlMTYgc3BvcnQsCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHBfaW1wbC5oIGIvbmV0L2lwdjYvdWRwX2ltcGwuaAppbmRleCA2ZTI1MmYzLi4zNmIwYzExIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHBfaW1wbC5oCisrKyBiL25ldC9pcHY2L3VkcF9pbXBsLmgKQEAgLTYsNiArNiw4IEBACiAjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+CiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdWRwX2dldF9wb3J0X29wcyB1ZHBfaXB2Nl9vcHM7CisKIGV4dGVybiBpbnQgIAlfX3VkcDZfbGliX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqKiwgc3RydWN0IGhsaXN0X2hlYWQgW10sIGludCApOwogZXh0ZXJuIHZvaWQgCV9fdWRwNl9saWJfZXJyKHN0cnVjdCBza19idWZmICosIHN0cnVjdCBpbmV0Nl9za2JfcGFybSAqLAogCQkJICAgICAgIGludCAsIGludCAsIGludCAsIF9fYmUzMiAsIHN0cnVjdCBobGlzdF9oZWFkIFtdKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcGxpdGUuYyBiL25ldC9pcHY2L3VkcGxpdGUuYwppbmRleCBmNTQwMTZhLi5jNDBhNTEzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHBsaXRlLmMKKysrIGIvbmV0L2lwdjYvdWRwbGl0ZS5jCkBAIC0zNyw3ICszNyw3IEBACiAKIHN0YXRpYyBpbnQgdWRwbGl0ZV92Nl9nZXRfcG9ydChzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0pCiB7Ci0JcmV0dXJuIHVkcGxpdGVfZ2V0X3BvcnQoc2ssIHNudW0sIGlwdjZfcmN2X3NhZGRyX2VxdWFsKTsKKwlyZXR1cm4gdWRwbGl0ZV9nZXRfcG9ydChzaywgc251bSwgJnVkcF9pcHY2X29wcyk7CiB9CiAKIHN0cnVjdCBwcm90byB1ZHBsaXRldjZfcHJvdCA9IHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfc3RhLmMgYi9uZXQvbWFjODAyMTEvaWVlZTgwMjExX3N0YS5jCmluZGV4IDgyMjkxN2QuLjNlMDdlOWQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfc3RhLmMKKysrIGIvbmV0L21hYzgwMjExL2llZWU4MDIxMV9zdGEuYwpAQCAtMTcsNiArMTcsNyBAQAogICogc2NhbiByZXN1bHQgdGFibGUgZmlsdGVyaW5nIChieSBjYXBhYmlsaXR5IChwcml2YWN5LCBJQlNTL0JTUywgV1BBL1JTTiBJRSwKICAqICAgIFNTSUQpCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CkBAIC0yNyw3ICsyOCw2IEBACiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KIAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgImllZWU4MDIxMV9pLmgiCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKaW5kZXggZTEzMmM4YS4uZThiNWMyZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYwpAQCAtMjk5LDcgKzI5OSw2IEBACiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0ID0gKHN0cnVjdCBuZl9jb25uICopbmZjdDsKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwID0gbmZjdF9oZWxwKGN0KTsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2wzcHJvdG8gKmwzcHJvdG87CiAJc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwogCXR5cGVvZihuZl9jb25udHJhY2tfZGVzdHJveWVkKSBkZXN0cm95ZWQ7CiAKQEAgLTMxNywxMCArMzE2LDYgQEAKIAkgKiBkZXN0cm95X2Nvbm50cmFjaygpIE1VU1QgTk9UIGJlIGNhbGxlZCB3aXRoIGEgd3JpdGUgbG9jawogCSAqIHRvIG5mX2Nvbm50cmFja19sb2NrISEhIC1IVyAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQlsM3Byb3RvID0gX19uZl9jdF9sM3Byb3RvX2ZpbmQoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5sM251bSk7Ci0JaWYgKGwzcHJvdG8gJiYgbDNwcm90by0+ZGVzdHJveSkKLQkJbDNwcm90by0+ZGVzdHJveShjdCk7Ci0KIAlsNHByb3RvID0gX19uZl9jdF9sNHByb3RvX2ZpbmQoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5sM251bSwKIAkJCQkgICAgICAgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC5wcm90b251bSk7CiAJaWYgKGw0cHJvdG8gJiYgbDRwcm90by0+ZGVzdHJveSkKQEAgLTg5Myw4ICs4ODgsMTMgQEAKIAlORl9DVF9EVU1QX1RVUExFKG5ld3JlcGx5KTsKIAogCWN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZSA9ICpuZXdyZXBseTsKLQlpZiAoIWN0LT5tYXN0ZXIgJiYgaGVscCAmJiBoZWxwLT5leHBlY3RpbmcgPT0gMCkKLQkJaGVscC0+aGVscGVyID0gX19uZl9jdF9oZWxwZXJfZmluZChuZXdyZXBseSk7CisJaWYgKCFjdC0+bWFzdGVyICYmIGhlbHAgJiYgaGVscC0+ZXhwZWN0aW5nID09IDApIHsKKwkJc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlcjsKKwkJaGVscGVyID0gX19uZl9jdF9oZWxwZXJfZmluZChuZXdyZXBseSk7CisJCWlmIChoZWxwZXIpCisJCQltZW1zZXQoJmhlbHAtPmhlbHAsIDAsIHNpemVvZihoZWxwLT5oZWxwKSk7CisJCWhlbHAtPmhlbHBlciA9IGhlbHBlcjsKKwl9CiAJd3JpdGVfdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfYWx0ZXJfcmVwbHkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCmluZGV4IGFhMWE5N2UuLmQ2ZDM5ZTIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKQEAgLTgzMCwxMSArODMwLDYgQEAKIAljaGFyICpoZWxwbmFtZTsKIAlpbnQgZXJyOwogCi0JaWYgKCFoZWxwKSB7Ci0JCS8qIEZJWE1FOiB3ZSBuZWVkIHRvIHJlYWxsb2NhdGUgYW5kIHJlaGFzaCAqLwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQogCS8qIGRvbid0IGNoYW5nZSBoZWxwZXIgb2Ygc2libGluZyBjb25uZWN0aW9ucyAqLwogCWlmIChjdC0+bWFzdGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg0MywyNSArODM4LDM0IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQloZWxwZXIgPSBfX25mX2Nvbm50cmFja19oZWxwZXJfZmluZF9ieW5hbWUoaGVscG5hbWUpOwotCWlmICghaGVscGVyKSB7Ci0JCWlmICghc3RyY21wKGhlbHBuYW1lLCAiIikpCi0JCQloZWxwZXIgPSBOVUxMOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoaGVscC0+aGVscGVyKSB7Ci0JCWlmICghaGVscGVyKSB7CisJaWYgKCFzdHJjbXAoaGVscG5hbWUsICIiKSkgeworCQlpZiAoaGVscCAmJiBoZWxwLT5oZWxwZXIpIHsKIAkJCS8qIHdlIGhhZCBhIGhlbHBlciBiZWZvcmUgLi4uICovCiAJCQluZl9jdF9yZW1vdmVfZXhwZWN0YXRpb25zKGN0KTsKIAkJCWhlbHAtPmhlbHBlciA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBuZWVkIHRvIHplcm8gZGF0YSBvZiBvbGQgaGVscGVyICovCi0JCQltZW1zZXQoJmhlbHAtPmhlbHAsIDAsIHNpemVvZihoZWxwLT5oZWxwKSk7CiAJCX0KKworCQlyZXR1cm4gMDsKIAl9CiAKKwlpZiAoIWhlbHApIHsKKwkJLyogRklYTUU6IHdlIG5lZWQgdG8gcmVhbGxvY2F0ZSBhbmQgcmVoYXNoICovCisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaGVscGVyID0gX19uZl9jb25udHJhY2tfaGVscGVyX2ZpbmRfYnluYW1lKGhlbHBuYW1lKTsKKwlpZiAoaGVscGVyID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhlbHAtPmhlbHBlciA9PSBoZWxwZXIpCisJCXJldHVybiAwOworCisJaWYgKGhlbHAtPmhlbHBlcikKKwkJLyogd2UgaGFkIGEgaGVscGVyIGJlZm9yZSAuLi4gKi8KKwkJbmZfY3RfcmVtb3ZlX2V4cGVjdGF0aW9ucyhjdCk7CisKKwkvKiBuZWVkIHRvIHplcm8gZGF0YSBvZiBvbGQgaGVscGVyICovCisJbWVtc2V0KCZoZWxwLT5oZWxwLCAwLCBzaXplb2YoaGVscC0+aGVscCkpOwogCWhlbHAtPmhlbHBlciA9IGhlbHBlcjsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMKaW5kZXggZjRlYThmZS4uMTg5ZGVkNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9jb25udHJhY2suYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCkBAIC0xMzQsMTIgKzEzNCw2NiBAQAogCW5mX2N0X2wzcHJvdG9fbW9kdWxlX3B1dChtYXRjaC0+ZmFtaWx5KTsKIH0KIAorI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBjb21wYXRfeHRfY29ubnRyYWNrX2luZm8KK3sKKwljb21wYXRfdWludF90CQkJc3RhdGVtYXNrOworCWNvbXBhdF91aW50X3QJCQlzdGF0dXNtYXNrOworCXN0cnVjdCBpcF9jb25udHJhY2tfb2xkX3R1cGxlCXR1cGxlW0lQX0NUX0RJUl9NQVhdOworCXN0cnVjdCBpbl9hZGRyCQkJc2lwbXNrW0lQX0NUX0RJUl9NQVhdOworCXN0cnVjdCBpbl9hZGRyCQkJZGlwbXNrW0lQX0NUX0RJUl9NQVhdOworCWNvbXBhdF91bG9uZ190CQkJZXhwaXJlc19taW47CisJY29tcGF0X3Vsb25nX3QJCQlleHBpcmVzX21heDsKKwl1X2ludDhfdAkJCWZsYWdzOworCXVfaW50OF90CQkJaW52ZmxhZ3M7Cit9OworCitzdGF0aWMgdm9pZCBjb21wYXRfZnJvbV91c2VyKHZvaWQgKmRzdCwgdm9pZCAqc3JjKQoreworCXN0cnVjdCBjb21wYXRfeHRfY29ubnRyYWNrX2luZm8gKmNtID0gc3JjOworCXN0cnVjdCB4dF9jb25udHJhY2tfaW5mbyBtID0geworCQkuc3RhdGVtYXNrCT0gY20tPnN0YXRlbWFzaywKKwkJLnN0YXR1c21hc2sJPSBjbS0+c3RhdHVzbWFzaywKKwkJLmV4cGlyZXNfbWluCT0gY20tPmV4cGlyZXNfbWluLAorCQkuZXhwaXJlc19tYXgJPSBjbS0+ZXhwaXJlc19tYXgsCisJCS5mbGFncwkJPSBjbS0+ZmxhZ3MsCisJCS5pbnZmbGFncwk9IGNtLT5pbnZmbGFncywKKwl9OworCW1lbWNweShtLnR1cGxlLCBjbS0+dHVwbGUsIHNpemVvZihtLnR1cGxlKSk7CisJbWVtY3B5KG0uc2lwbXNrLCBjbS0+c2lwbXNrLCBzaXplb2YobS5zaXBtc2spKTsKKwltZW1jcHkobS5kaXBtc2ssIGNtLT5kaXBtc2ssIHNpemVvZihtLmRpcG1zaykpOworCW1lbWNweShkc3QsICZtLCBzaXplb2YobSkpOworfQorCitzdGF0aWMgaW50IGNvbXBhdF90b191c2VyKHZvaWQgX191c2VyICpkc3QsIHZvaWQgKnNyYykKK3sKKwlzdHJ1Y3QgeHRfY29ubnRyYWNrX2luZm8gKm0gPSBzcmM7CisJc3RydWN0IGNvbXBhdF94dF9jb25udHJhY2tfaW5mbyBjbSA9IHsKKwkJLnN0YXRlbWFzawk9IG0tPnN0YXRlbWFzaywKKwkJLnN0YXR1c21hc2sJPSBtLT5zdGF0dXNtYXNrLAorCQkuZXhwaXJlc19taW4JPSBtLT5leHBpcmVzX21pbiwKKwkJLmV4cGlyZXNfbWF4CT0gbS0+ZXhwaXJlc19tYXgsCisJCS5mbGFncwkJPSBtLT5mbGFncywKKwkJLmludmZsYWdzCT0gbS0+aW52ZmxhZ3MsCisJfTsKKwltZW1jcHkoY20udHVwbGUsIG0tPnR1cGxlLCBzaXplb2YoY20udHVwbGUpKTsKKwltZW1jcHkoY20uc2lwbXNrLCBtLT5zaXBtc2ssIHNpemVvZihjbS5zaXBtc2spKTsKKwltZW1jcHkoY20uZGlwbXNrLCBtLT5kaXBtc2ssIHNpemVvZihjbS5kaXBtc2spKTsKKwlyZXR1cm4gY29weV90b191c2VyKGRzdCwgJmNtLCBzaXplb2YoY20pKSA/IC1FRkFVTFQgOiAwOworfQorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggY29ubnRyYWNrX21hdGNoID0gewogCS5uYW1lCQk9ICJjb25udHJhY2siLAogCS5tYXRjaAkJPSBtYXRjaCwKIAkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCiAJLmRlc3Ryb3kJPSBkZXN0cm95LAogCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2Nvbm50cmFja19pbmZvKSwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdHNpemUJPSBzaXplb2Yoc3RydWN0IGNvbXBhdF94dF9jb25udHJhY2tfaW5mbyksCisJLmNvbXBhdF9mcm9tX3VzZXIgPSBjb21wYXRfZnJvbV91c2VyLAorCS5jb21wYXRfdG9fdXNlcgk9IGNvbXBhdF90b191c2VyLAorI2VuZGlmCiAJLmZhbWlseQkJPSBBRl9JTkVULAogCS5tZQkJPSBUSElTX01PRFVMRSwKIH07CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCmluZGV4IDMzODVlZTUuLmYyOGJiMmQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCisrKyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCkBAIC03MSwxMiArNzEsOSBAQAogCiAKIC8qIEtpY2sgZGV2aWNlLgotICAgTm90ZSwgdGhhdCB0aGlzIHByb2NlZHVyZSBjYW4gYmUgY2FsbGVkIGJ5IGEgd2F0Y2hkb2cgdGltZXIsIHNvIHRoYXQKLSAgIHdlIGRvIG5vdCBjaGVjayBkZXYtPnRidXN5IGZsYWcgaGVyZS4KIAotICAgUmV0dXJuczogIDAgIC0gcXVldWUgaXMgZW1wdHkuCi0JICAgID4wICAtIHF1ZXVlIGlzIG5vdCBlbXB0eSwgYnV0IHRocm90dGxlZC4KLQkgICAgPDAgIC0gcXVldWUgaXMgbm90IGVtcHR5LiBEZXZpY2UgaXMgdGhyb3R0bGVkLCBpZiBkZXYtPnRidXN5ICE9IDAuCisgICBSZXR1cm5zOiAgMCAgLSBxdWV1ZSBpcyBlbXB0eSBvciB0aHJvdHRsZWQuCisJICAgID4wICAtIHF1ZXVlIGlzIG5vdCBlbXB0eS4KIAogICAgTk9URTogQ2FsbGVkIHVuZGVyIGRldi0+cXVldWVfbG9jayB3aXRoIGxvY2FsbHkgZGlzYWJsZWQgQkguCiAqLwpAQCAtMTE1LDcgKzExMiw3IEBACiAJCQkJCWtmcmVlX3NrYihza2IpOwogCQkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQogCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIkRlYWQgbG9vcCBvbiBuZXRkZXZpY2UgJXMsIGZpeCBpdCB1cmdlbnRseSFcbiIsIGRldi0+bmFtZSk7Ci0JCQkJCXJldHVybiAtMTsKKwkJCQkJZ290byBvdXQ7CiAJCQkJfQogCQkJCV9fZ2V0X2NwdV92YXIobmV0ZGV2X3J4X3N0YXQpLmNwdV9jb2xsaXNpb24rKzsKIAkJCQlnb3RvIHJlcXVldWU7CkBAIC0xMzUsMTAgKzEzMiwxMiBAQAogCQkJCQkJbmV0aWZfdHhfdW5sb2NrKGRldik7CiAJCQkJCX0KIAkJCQkJc3Bpbl9sb2NrKCZkZXYtPnF1ZXVlX2xvY2spOwotCQkJCQlyZXR1cm4gLTE7CisJCQkJCXEgPSBkZXYtPnFkaXNjOworCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAJCQkJaWYgKHJldCA9PSBORVRERVZfVFhfTE9DS0VEICYmIG5vbG9jaykgewogCQkJCQlzcGluX2xvY2soJmRldi0+cXVldWVfbG9jayk7CisJCQkJCXEgPSBkZXYtPnFkaXNjOwogCQkJCQlnb3RvIGNvbGxpc2lvbjsKIAkJCQl9CiAJCQl9CkBAIC0xNjMsMjYgKzE2MiwyOCBAQAogCQkgKi8KIAogcmVxdWV1ZToKLQkJaWYgKHNrYi0+bmV4dCkKKwkJaWYgKHVubGlrZWx5KHEgPT0gJm5vb3BfcWRpc2MpKQorCQkJa2ZyZWVfc2tiKHNrYik7CisJCWVsc2UgaWYgKHNrYi0+bmV4dCkKIAkJCWRldi0+Z3NvX3NrYiA9IHNrYjsKIAkJZWxzZQogCQkJcS0+b3BzLT5yZXF1ZXVlKHNrYiwgcSk7CiAJCW5ldGlmX3NjaGVkdWxlKGRldik7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gMDsKIAl9CisKK291dDoKIAlCVUdfT04oKGludCkgcS0+cS5xbGVuIDwgMCk7CiAJcmV0dXJuIHEtPnEucWxlbjsKIH0KIAogdm9pZCBfX3FkaXNjX3J1bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWlmICh1bmxpa2VseShkZXYtPnFkaXNjID09ICZub29wX3FkaXNjKSkKLQkJZ290byBvdXQ7CisJZG8geworCQlpZiAoIXFkaXNjX3Jlc3RhcnQoZGV2KSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpOwogCi0Jd2hpbGUgKHFkaXNjX3Jlc3RhcnQoZGV2KSA8IDAgJiYgIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKLQkJLyogTk9USElORyAqLzsKLQotb3V0OgogCWNsZWFyX2JpdChfX0xJTktfU1RBVEVfUURJU0NfUlVOTklORywgJmRldi0+c3RhdGUpOwogfQogCkBAIC01NDQsNiArNTQ1LDcgQEAKIHZvaWQgZGV2X2RlYWN0aXZhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgUWRpc2MgKnFkaXNjOworCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlzcGluX2xvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CiAJcWRpc2MgPSBkZXYtPnFkaXNjOwpAQCAtNTUxLDggKzU1MywxMiBAQAogCiAJcWRpc2NfcmVzZXQocWRpc2MpOwogCisJc2tiID0gZGV2LT5nc29fc2tiOworCWRldi0+Z3NvX3NrYiA9IE5VTEw7CiAJc3Bpbl91bmxvY2tfYmgoJmRldi0+cXVldWVfbG9jayk7CiAKKwlrZnJlZV9za2Ioc2tiKTsKKwogCWRldl93YXRjaGRvZ19kb3duKGRldik7CiAKIAkvKiBXYWl0IGZvciBvdXRzdGFuZGluZyBkZXZfcXVldWVfeG1pdCBjYWxscy4gKi8KQEAgLTU2MSwxMSArNTY3LDYgQEAKIAkvKiBXYWl0IGZvciBvdXRzdGFuZGluZyBxZGlzY19ydW4gY2FsbHMuICovCiAJd2hpbGUgKHRlc3RfYml0KF9fTElOS19TVEFURV9RRElTQ19SVU5OSU5HLCAmZGV2LT5zdGF0ZSkpCiAJCXlpZWxkKCk7Ci0KLQlpZiAoZGV2LT5nc29fc2tiKSB7Ci0JCWtmcmVlX3NrYihkZXYtPmdzb19za2IpOwotCQlkZXYtPmdzb19za2IgPSBOVUxMOwotCX0KIH0KIAogdm9pZCBkZXZfaW5pdF9zY2hlZHVsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfdGVxbC5jIGIvbmV0L3NjaGVkL3NjaF90ZXFsLmMKaW5kZXggZDI0OTE0ZC4uZjA1YWQ5YSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF90ZXFsLmMKKysrIGIvbmV0L3NjaGVkL3NjaF90ZXFsLmMKQEAgLTk0LDE0ICs5NCwxMyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzY2gtPmRldjsKIAlzdHJ1Y3QgdGVxbF9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwogCi0JX19za2JfcXVldWVfdGFpbCgmcS0+cSwgc2tiKTsKLQlpZiAocS0+cS5xbGVuIDw9IGRldi0+dHhfcXVldWVfbGVuKSB7CisJaWYgKHEtPnEucWxlbiA8IGRldi0+dHhfcXVldWVfbGVuKSB7CisJCV9fc2tiX3F1ZXVlX3RhaWwoJnEtPnEsIHNrYik7CiAJCXNjaC0+YnN0YXRzLmJ5dGVzICs9IHNrYi0+bGVuOwogCQlzY2gtPmJzdGF0cy5wYWNrZXRzKys7CiAJCXJldHVybiAwOwogCX0KIAotCV9fc2tiX3VubGluayhza2IsICZxLT5xKTsKIAlrZnJlZV9za2Ioc2tiKTsKIAlzY2gtPnFzdGF0cy5kcm9wcysrOwogCXJldHVybiBORVRfWE1JVF9EUk9QOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc29ja2V0LmMgYi9uZXQvc2N0cC9zb2NrZXQuYwppbmRleCA4M2E3NmJhLi40ZGNkYWJmIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zb2NrZXQuYworKysgYi9uZXQvc2N0cC9zb2NrZXQuYwpAQCAtNDE2NCw2ICs0MTY0LDcgQEAKIAlyd2xvY2tfdCAqYWRkcl9sb2NrOwogCWludCBlcnIgPSAwOwogCXZvaWQgKmFkZHJzOworCXZvaWQgKmJ1ZjsKIAlpbnQgYnl0ZXNfY29waWVkID0gMDsKIAogCWlmIChsZW4gIT0gc2l6ZW9mKHN0cnVjdCBzY3RwX2dldGFkZHJzX29sZCkpCkBAIC00MjE3LDEzICs0MjE4LDE0IEBACiAJCX0KIAl9CiAKKwlidWYgPSBhZGRyczsKIAlsaXN0X2Zvcl9lYWNoKHBvcywgJmJwLT5hZGRyZXNzX2xpc3QpIHsKIAkJYWRkciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3Qgc2N0cF9zb2NrYWRkcl9lbnRyeSwgbGlzdCk7CiAJCW1lbWNweSgmdGVtcCwgJmFkZHItPmEsIHNpemVvZih0ZW1wKSk7CiAJCXNjdHBfZ2V0X3BmX3NwZWNpZmljKHNrLT5za19mYW1pbHkpLT5hZGRyX3Y0bWFwKHNwLCAmdGVtcCk7CiAJCWFkZHJsZW4gPSBzY3RwX2dldF9hZl9zcGVjaWZpYyh0ZW1wLnNhLnNhX2ZhbWlseSktPnNvY2thZGRyX2xlbjsKLQkJbWVtY3B5KGFkZHJzLCAmdGVtcCwgYWRkcmxlbik7Ci0JCXRvICs9IGFkZHJsZW47CisJCW1lbWNweShidWYsICZ0ZW1wLCBhZGRybGVuKTsKKwkJYnVmICs9IGFkZHJsZW47CiAJCWJ5dGVzX2NvcGllZCArPSBhZGRybGVuOwogCQljbnQgKys7CiAJCWlmIChjbnQgPj0gZ2V0YWRkcnMuYWRkcl9udW0pIGJyZWFrOwpAQCAtNDI2Niw2ICs0MjY4LDcgQEAKIAlzaXplX3Qgc3BhY2VfbGVmdDsKIAlpbnQgYnl0ZXNfY29waWVkID0gMDsKIAl2b2lkICphZGRyczsKKwl2b2lkICpidWY7CiAKIAlpZiAobGVuIDw9IHNpemVvZihzdHJ1Y3Qgc2N0cF9nZXRhZGRycykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDMxNiw2ICs0MzE5LDcgQEAKIAkJfQogCX0KIAorCWJ1ZiA9IGFkZHJzOwogCWxpc3RfZm9yX2VhY2gocG9zLCAmYnAtPmFkZHJlc3NfbGlzdCkgewogCQlhZGRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzY3RwX3NvY2thZGRyX2VudHJ5LCBsaXN0KTsKIAkJbWVtY3B5KCZ0ZW1wLCAmYWRkci0+YSwgc2l6ZW9mKHRlbXApKTsKQEAgLTQzMjUsOCArNDMyOSw4IEBACiAJCQllcnIgPSAgLUVOT01FTTsgLypmaXhtZTogcmlnaHQgZXJyb3I/Ki8KIAkJCWdvdG8gZXJyb3I7CiAJCX0KLQkJbWVtY3B5KGFkZHJzLCAmdGVtcCwgYWRkcmxlbik7Ci0JCXRvICs9IGFkZHJsZW47CisJCW1lbWNweShidWYsICZ0ZW1wLCBhZGRybGVuKTsKKwkJYnVmICs9IGFkZHJsZW47CiAJCWJ5dGVzX2NvcGllZCArPSBhZGRybGVuOwogCQljbnQgKys7CiAJCXNwYWNlX2xlZnQgLT0gYWRkcmxlbjsKQEAgLTUyMjcsNyArNTIzMSwxMiBAQAogCS8qIEFsbG9jYXRlIEhNQUMgZm9yIGdlbmVyYXRpbmcgY29va2llLiAqLwogCWlmIChzY3RwX2htYWNfYWxnKSB7CiAJCXRmbSA9IGNyeXB0b19hbGxvY19oYXNoKHNjdHBfaG1hY19hbGcsIDAsIENSWVBUT19BTEdfQVNZTkMpOwotCQlpZiAoIXRmbSkgeworCQlpZiAoSVNfRVJSKHRmbSkpIHsKKwkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICJTQ1RQOiBmYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yICVzOiAlbGRcbiIsCisJCQkJCXNjdHBfaG1hY19hbGcsIFBUUl9FUlIodGZtKSk7CisJCQl9CiAJCQllcnIgPSAtRU5PU1lTOwogCQkJZ290byBvdXQ7CiAJCX0KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscGV2ZW50LmMgYi9uZXQvc2N0cC91bHBldmVudC5jCmluZGV4IDY2MWVhMmQuLmJmZWNiMzUgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscGV2ZW50LmMKKysrIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwpAQCAtMTQxLDExICsxNDEsNiBAQAogCSAqIGFuIEFCT1JULCBzbyB3ZSBuZWVkIHRvIGluY2x1ZGUgaXQgaW4gdGhlIHNhY19pbmZvLgogCSAqLwogCWlmIChjaHVuaykgewotCQkvKiBzY3RwX2lucXVfcG9wKCkgaGFzIGFsbHJlYWR5IHB1bGxlZCBvZmYgdGhlIGNodW5rCi0JCSAqIGhlYWRlci4gIFdlIG5lZWQgdG8gcHV0IGl0IGJhY2sgdGVtcG9yYXJpbHkKLQkJICovCi0JCXNrYl9wdXNoKGNodW5rLT5za2IsIHNpemVvZihzY3RwX2NodW5raGRyX3QpKTsKLQogCQkvKiBDb3B5IHRoZSBjaHVuayBkYXRhIHRvIGEgbmV3IHNrYiBhbmQgcmVzZXJ2ZSBlbm91Z2gKIAkJICogaGVhZCByb29tIHRvIHVzZSBhcyBub3RpZmljYXRpb24uCiAJCSAqLwpAQCAtMTU1LDkgKzE1MCw2IEBACiAJCWlmICghc2tiKQogCQkJZ290byBmYWlsOwogCi0JCS8qIHB1dCBiYWNrIHRoZSBjaHVuayBoZWFkZXIgbm93IHRoYXQgd2UgaGF2ZSBhIGNvcHkgKi8KLQkJc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOwotCiAJCS8qIEVtYmVkIHRoZSBldmVudCBmaWVsZHMgaW5zaWRlIHRoZSBjbG9uZWQgc2tiLiAgKi8KIAkJZXZlbnQgPSBzY3RwX3NrYjJldmVudChza2IpOwogCQlzY3RwX3VscGV2ZW50X2luaXQoZXZlbnQsIE1TR19OT1RJRklDQVRJT04sIHNrYi0+dHJ1ZXNpemUpOwpAQCAtMTY4LDcgKzE2MCw4IEBACiAKIAkJLyogVHJpbSB0aGUgYnVmZmVyIHRvIHRoZSByaWdodCBsZW5ndGguICAqLwogCQlza2JfdHJpbShza2IsIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpICsKLQkJCSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpKTsKKwkJCSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpIC0KKwkJCSBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSk7CiAJfSBlbHNlIHsKIAkJZXZlbnQgPSBzY3RwX3VscGV2ZW50X25ldyhzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKIAkJCQkgIE1TR19OT1RJRklDQVRJT04sIGdmcCk7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtb255eC5jIGIvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLW9ueXguYwppbmRleCBlOTFmOWY2Li5kZWQ1MTY3IDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtb255eC5jCisrKyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy1vbnl4LmMKQEAgLTEwMTgsNyArMTAxOCw3IEBACiAJb255eC0+aTJjLmRyaXZlciA9ICZvbnl4X2RyaXZlcjsKIAlvbnl4LT5pMmMuYWRhcHRlciA9IGFkYXB0ZXI7CiAJb255eC0+aTJjLmFkZHIgPSBhZGRyICYgMHg3ZjsKLQlzdHJsY3B5KG9ueXgtPmkyYy5uYW1lLCAib255eCBhdWRpbyBjb2RlYyIsIEkyQ19OQU1FX1NJWkUtMSk7CisJc3RybGNweShvbnl4LT5pMmMubmFtZSwgIm9ueXggYXVkaW8gY29kZWMiLCBJMkNfTkFNRV9TSVpFKTsKIAogCWlmIChpMmNfYXR0YWNoX2NsaWVudCgmb255eC0+aTJjKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gYXR0YWNoIHRvIGkyY1xuIik7CkBAIC0xMDMzLDcgKzEwMzMsNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCi0Jc3RybGNweShvbnl4LT5jb2RlYy5uYW1lLCAib255eCIsIE1BWF9DT0RFQ19OQU1FX0xFTi0xKTsKKwlzdHJsY3B5KG9ueXgtPmNvZGVjLm5hbWUsICJvbnl4IiwgTUFYX0NPREVDX05BTUVfTEVOKTsKIAlvbnl4LT5jb2RlYy5vd25lciA9IFRISVNfTU9EVUxFOwogCW9ueXgtPmNvZGVjLmluaXQgPSBvbnl4X2luaXRfY29kZWM7CiAJb255eC0+Y29kZWMuZXhpdCA9IG9ueXhfZXhpdF9jb2RlYzsKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuYyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuYwppbmRleCAwNDFmZTUyLi4yZjc3MWY1IDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLmMKKysrIGIvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLXRhcy5jCkBAIC04OTksMTQgKzg5OSwxNCBAQAogCXRhcy0+aTJjLmFkZHIgPSBhZGRyOwogCS8qIHNlZW1zIHRoYXQgaGFsZiBpcyBhIHNhbmVyIGRlZmF1bHQgKi8KIAl0YXMtPmRyY19yYW5nZSA9IFRBUzMwMDRfRFJDX01BWCAvIDI7Ci0Jc3RybGNweSh0YXMtPmkyYy5uYW1lLCAidGFzIGF1ZGlvIGNvZGVjIiwgSTJDX05BTUVfU0laRS0xKTsKKwlzdHJsY3B5KHRhcy0+aTJjLm5hbWUsICJ0YXMgYXVkaW8gY29kZWMiLCBJMkNfTkFNRV9TSVpFKTsKIAogCWlmIChpMmNfYXR0YWNoX2NsaWVudCgmdGFzLT5pMmMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBhdHRhY2ggdG8gaTJjXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIAotCXN0cmxjcHkodGFzLT5jb2RlYy5uYW1lLCAidGFzIiwgTUFYX0NPREVDX05BTUVfTEVOLTEpOworCXN0cmxjcHkodGFzLT5jb2RlYy5uYW1lLCAidGFzIiwgTUFYX0NPREVDX05BTUVfTEVOKTsKIAl0YXMtPmNvZGVjLm93bmVyID0gVEhJU19NT0RVTEU7CiAJdGFzLT5jb2RlYy5pbml0ID0gdGFzX2luaXRfY29kZWM7CiAJdGFzLT5jb2RlYy5leGl0ID0gdGFzX2V4aXRfY29kZWM7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2Evc291bmRidXMvY29yZS5jIGIvc291bmQvYW9hL3NvdW5kYnVzL2NvcmUuYwppbmRleCA4YjJlOWI5Li42NGQxNjM5IDEwMDY0NAotLS0gYS9zb3VuZC9hb2Evc291bmRidXMvY29yZS5jCisrKyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9jb3JlLmMKQEAgLTE2Myw4ICsxNjMsNiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKLWV4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzb3VuZGJ1c19kZXZfYXR0cnNbXTsKLQogc3RhdGljIHN0cnVjdCBidXNfdHlwZSBzb3VuZGJ1c19idXNfdHlwZSA9IHsKIAkubmFtZQkJPSAiYW9hLXNvdW5kYnVzIiwKIAkucHJvYmUJCT0gc291bmRidXNfcHJvYmUsCmRpZmYgLS1naXQgYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1jb3JlLmMgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1jb3JlLmMKaW5kZXggMGZjY2RiZi4uZWZiOTQ0MSAxMDA2NDQKLS0tIGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtY29yZS5jCisrKyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLWNvcmUuYwpAQCAtMjMsOSArMjMsNiBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQXBwbGUgU291bmRidXM6IEkyUyBzdXBwb3J0Iik7Ci0vKiBmb3IgYXV0by1sb2FkaW5nLCBkZWNsYXJlIHRoYXQgd2UgaGFuZGxlIHRoaXMgd2VpcmQKLSAqIHN0cmluZyB0aGF0IG1hY2lvIHB1dHMgaW50byB0aGUgcmVsZXZhbnQgZGV2aWNlICovCi1NT0RVTEVfQUxJQVMoIm9mOk5pMnNUaTJzQyIpOwogCiBzdGF0aWMgaW50IGZvcmNlOwogbW9kdWxlX3BhcmFtKGZvcmNlLCBpbnQsIDA0NDQpOwpAQCAtMzcsNiArMzQsOCBAQAogCXsgfQogfTsKIAorTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaTJzYnVzX21hdGNoKTsKKwogc3RhdGljIGludCBhbGxvY19kYmRtYV9kZXNjcmlwdG9yX3Jpbmcoc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldiwKIAkJCQkgICAgICAgc3RydWN0IGRiZG1hX2NvbW1hbmRfbWVtICpyLAogCQkJCSAgICAgICBpbnQgbnVtY21kcykKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9zb3VuZGJ1cy5oIGIvc291bmQvYW9hL3NvdW5kYnVzL3NvdW5kYnVzLmgKaW5kZXggNWMyNzI5Ny4uNjIyY2QzNyAxMDA2NDQKLS0tIGEvc291bmQvYW9hL3NvdW5kYnVzL3NvdW5kYnVzLmgKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL3NvdW5kYnVzLmgKQEAgLTE5OSw0ICsxOTksNiBAQAogZXh0ZXJuIGludCBzb3VuZGJ1c19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNvdW5kYnVzX2RyaXZlciAqZHJ2KTsKIGV4dGVybiB2b2lkIHNvdW5kYnVzX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzb3VuZGJ1c19kcml2ZXIgKmRydik7CiAKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzb3VuZGJ1c19kZXZfYXR0cnNbXTsKKwogI2VuZGlmIC8qIF9fU09VTkRCVVNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwppbmRleCA5MDUyMzQ4Li5hOTY3MzNhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYworKysgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwpAQCAtNzEyLDI2ICs3MTIsMjMgQEAKIAkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQlpbnQgc3RhdGUsIGludCBkb19sb2NrKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnMgPSBOVUxMOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczE7CiAJaW50IHJlcyA9IDA7CiAKLQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7Ci0JCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CiAJCWlmIChkb19sb2NrICYmIHMgIT0gc3Vic3RyZWFtKQotCQkJc3Bpbl9sb2NrKCZzLT5zZWxmX2dyb3VwLmxvY2spOworCQkJc3Bpbl9sb2NrX25lc3RlZCgmcy0+c2VsZl9ncm91cC5sb2NrLAorCQkJCQkgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwogCQlyZXMgPSBvcHMtPnByZV9hY3Rpb24ocywgc3RhdGUpOwogCQlpZiAocmVzIDwgMCkKIAkJCWdvdG8gX3VubG9jazsKIAl9Ci0Jc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgewotCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQlyZXMgPSBvcHMtPmRvX2FjdGlvbihzLCBzdGF0ZSk7CiAJCWlmIChyZXMgPCAwKSB7CiAJCQlpZiAob3BzLT51bmRvX2FjdGlvbikgewotCQkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLQkJCQkJczEgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQkJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkoczEsIHN1YnN0cmVhbSkgewogCQkJCQlpZiAoczEgPT0gcykgLyogZmFpbGVkIHN0cmVhbSAqLwogCQkJCQkJYnJlYWs7CiAJCQkJCW9wcy0+dW5kb19hY3Rpb24oczEsIHN0YXRlKTsKQEAgLTc0MSwxNSArNzM4LDEzIEBACiAJCQlnb3RvIF91bmxvY2s7CiAJCX0KIAl9Ci0Jc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgewotCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQlvcHMtPnBvc3RfYWN0aW9uKHMsIHN0YXRlKTsKIAl9CiAgX3VubG9jazoKIAlpZiAoZG9fbG9jaykgewogCQkvKiB1bmxvY2sgc3RyZWFtcyAqLwotCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7Ci0JCQlzMSA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7CisJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkoczEsIHN1YnN0cmVhbSkgewogCQkJaWYgKHMxICE9IHN1YnN0cmVhbSkKIAkJCQlzcGluX3VubG9jaygmczEtPnNlbGZfZ3JvdXAubG9jayk7CiAJCQlpZiAoczEgPT0gcykJLyogZW5kICovCkBAIC0xNDM4LDcgKzE0MzMsNyBAQAogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7CiAJaW50IHJlc3VsdCA9IDA7CiAJaW50IGksIG51bV9kcmVjczsKIAlzdHJ1Y3QgZHJhaW5fcmVjICpkcmVjLCBkcmVjX3RtcCwgKmQ7CkBAIC0xNDczLDggKzE0NjgsNyBAQAogCiAJLyogY291bnQgb25seSBwbGF5YmFjayBzdHJlYW1zICovCiAJbnVtX2RyZWNzID0gMDsKLQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7Ci0JCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcyA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7CisJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKIAkJcnVudGltZSA9IHMtPnJ1bnRpbWU7CiAJCWlmIChzLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewogCQkJZCA9ICZkcmVjW251bV9kcmVjcysrXTsKQEAgLTE2NzQsNyArMTY2OCw3IEBACiAKIHN0YXRpYyBpbnQgc25kX3BjbV91bmxpbmsoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKIAlpbnQgcmVzID0gMDsKIAogCWRvd25fd3JpdGUoJnNuZF9wY21fbGlua19yd3NlbSk7CkBAIC0xNjg2LDggKzE2ODAsOCBAQAogCWxpc3RfZGVsKCZzdWJzdHJlYW0tPmxpbmtfbGlzdCk7CiAJc3Vic3RyZWFtLT5ncm91cC0+Y291bnQtLTsKIAlpZiAoc3Vic3RyZWFtLT5ncm91cC0+Y291bnQgPT0gMSkgewkvKiBkZXRhY2ggdGhlIGxhc3Qgc3RyZWFtLCB0b28gKi8KLQkJc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgewotCQkJcmVsaW5rX3RvX2xvY2FsKHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcykpOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgeworCQkJcmVsaW5rX3RvX2xvY2FsKHMpOwogCQkJYnJlYWs7CiAJCX0KIAkJa2ZyZWUoc3Vic3RyZWFtLT5ncm91cCk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMgYi9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMKaW5kZXggOWY3YjMyZS4uN2NkNWU4ZiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9ydGN0aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvcnRjdGltZXIuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvdGltZXIuaD4KIApAQCAtMTI5LDcgKzEzMCw3IEBACiAJc3RydWN0IHNuZF90aW1lciAqdGltZXI7CiAKIAlpZiAocnRjdGltZXJfZnJlcSA8IDIgfHwgcnRjdGltZXJfZnJlcSA+IDgxOTIgfHwKLQkgICAgKHJ0Y3RpbWVyX2ZyZXEgJiAocnRjdGltZXJfZnJlcSAtIDEpKSAhPSAwKSB7CisJICAgICFpc19wb3dlcl9vZl8yKHJ0Y3RpbWVyX2ZyZXEpKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInJ0Y3RpbWVyOiBpbnZhbGlkIGZyZXF1ZW5jeSAlZFxuIiwKIAkJCSAgIHJ0Y3RpbWVyX2ZyZXEpOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMS5jIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKaW5kZXggMmRlMTgxYS4uMWQ1NjNlNSAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKKysrIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNlbmRpZgogc3RhdGljIGxvbmcgcG9ydFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1BPUlQ7CS8qIE1QVS00MDEgcG9ydCBudW1iZXIgKi8KIHN0YXRpYyBpbnQgaXJxW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSVJROwkvKiBNUFUtNDAxIElSUSAqLworc3RhdGljIGludCB1YXJ0X2VudGVyW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMX07CiAKIG1vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgTVBVLTQwMSBkZXZpY2UuIik7CkBAIC01Nyw2ICs1OCw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJQb3J0ICMgZm9yIE1QVS00MDEgZGV2aWNlLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRICMgZm9yIE1QVS00MDEgZGV2aWNlLiIpOworbW9kdWxlX3BhcmFtX2FycmF5KHVhcnRfZW50ZXIsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyh1YXJ0X2VudGVyLCAiSXNzdWUgVUFSVF9FTlRFUiBjb21tYW5kIGF0IG9wZW4uIik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW1NORFJWX0NBUkRTXTsKIHN0YXRpYyBpbnQgcG5wX3JlZ2lzdGVyZWQ7CkBAIC04MCwxMCArODMsMTEgQEAKIAkJc3RyY2F0KGNhcmQtPmxvbmduYW1lLCAicG9sbGVkIik7CiAJfQogCi0JaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsCi0JCQkJICAgICAgIE1QVTQwMV9IV19NUFU0MDEsCi0JCQkJICAgICAgIHBvcnRbZGV2XSwgMCwKLQkJCQkgICAgICAgaXJxW2Rldl0sIGlycVtkZXZdID49IDAgPyBJUlFGX0RJU0FCTEVEIDogMCwgTlVMTCkpIDwgMCkgeworCWVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwgcG9ydFtkZXZdLAorCQkJCSAgdWFydF9lbnRlcltkZXZdID8gMCA6IE1QVTQwMV9JTkZPX1VBUlRfT05MWSwKKwkJCQkgIGlycVtkZXZdLCBpcnFbZGV2XSA+PSAwID8gSVJRRl9ESVNBQkxFRCA6IDAsCisJCQkJICBOVUxMKTsKKwlpZiAoZXJyIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIk1QVTQwMSBub3QgZGV0ZWN0ZWQgYXQgMHglbHhcbiIsIHBvcnRbZGV2XSk7CiAJCWdvdG8gX2VycjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL21wdTQwMS9tcHU0MDFfdWFydC5jIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxX3VhcnQuYwppbmRleCAzZGFhOWZhLi44NWFlZGMzIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL21wdTQwMS9tcHU0MDFfdWFydC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMV91YXJ0LmMKQEAgLTI2Niw2ICsyNjYsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzbmRfbXB1NDAxX2RvX3Jlc2V0KHN0cnVjdCBzbmRfbXB1NDAxICptcHUpCit7CisJaWYgKHNuZF9tcHU0MDFfdWFydF9jbWQobXB1LCBNUFU0MDFfUkVTRVQsIDEpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoIShtcHUtPmluZm9fZmxhZ3MgJiBNUFU0MDFfSU5GT19VQVJUX09OTFkpICYmCisJICAgIHNuZF9tcHU0MDFfdWFydF9jbWQobXB1LCBNUFU0MDFfRU5URVJfVUFSVCwgMSkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCiAvKgogICogaW5wdXQvb3V0cHV0IG9wZW4vY2xvc2UgLSBwcm90ZWN0ZWQgYnkgb3Blbl9tdXRleCBpbiByYXdtaWRpLmMKICAqLwpAQCAtMjc4LDkgKzI4OCw3IEBACiAJaWYgKG1wdS0+b3Blbl9pbnB1dCAmJiAoZXJyID0gbXB1LT5vcGVuX2lucHV0KG1wdSkpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlpZiAoISB0ZXN0X2JpdChNUFU0MDFfTU9ERV9CSVRfT1VUUFVULCAmbXB1LT5tb2RlKSkgewotCQlpZiAoc25kX21wdTQwMV91YXJ0X2NtZChtcHUsIE1QVTQwMV9SRVNFVCwgMSkpCi0JCQlnb3RvIGVycm9yX291dDsKLQkJaWYgKHNuZF9tcHU0MDFfdWFydF9jbWQobXB1LCBNUFU0MDFfRU5URVJfVUFSVCwgMSkpCisJCWlmIChzbmRfbXB1NDAxX2RvX3Jlc2V0KG1wdSkgPCAwKQogCQkJZ290byBlcnJvcl9vdXQ7CiAJfQogCW1wdS0+c3Vic3RyZWFtX2lucHV0ID0gc3Vic3RyZWFtOwpAQCAtMzAyLDkgKzMxMCw3IEBACiAJaWYgKG1wdS0+b3Blbl9vdXRwdXQgJiYgKGVyciA9IG1wdS0+b3Blbl9vdXRwdXQobXB1KSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmICghIHRlc3RfYml0KE1QVTQwMV9NT0RFX0JJVF9JTlBVVCwgJm1wdS0+bW9kZSkpIHsKLQkJaWYgKHNuZF9tcHU0MDFfdWFydF9jbWQobXB1LCBNUFU0MDFfUkVTRVQsIDEpKQotCQkJZ290byBlcnJvcl9vdXQ7Ci0JCWlmIChzbmRfbXB1NDAxX3VhcnRfY21kKG1wdSwgTVBVNDAxX0VOVEVSX1VBUlQsIDEpKQorCQlpZiAoc25kX21wdTQwMV9kb19yZXNldChtcHUpIDwgMCkKIAkJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAltcHUtPnN1YnN0cmVhbV9vdXRwdXQgPSBzdWJzdHJlYW07CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL210czY0LmMgYi9zb3VuZC9kcml2ZXJzL210czY0LmMKaW5kZXggNmM5ZjRjOS4uZWJiMWJkYSAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tdHM2NC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbXRzNjQuYwpAQCAtODkyLDEzICs4OTIsMTMgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7CiAKIAlkZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoUExBVEZPUk1fRFJJVkVSLCBkZXZpY2VfY291bnQpOwotCWlmICghZGV2aWNlKSAKKwlpZiAoIWRldmljZSkKIAkJcmV0dXJuOwogCiAJLyogVGVtcG9yYXJ5IGFzc2lnbm1lbnQgdG8gZm9yd2FyZCB0aGUgcGFycG9ydCAqLwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldmljZSwgcCk7CiAKLQlpZiAocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKGRldmljZSkgPCAwKSB7CisJaWYgKHBsYXRmb3JtX2RldmljZV9hZGQoZGV2aWNlKSA8IDApIHsKIAkJcGxhdGZvcm1fZGV2aWNlX3B1dChkZXZpY2UpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9wb3J0bWFuMng0LmMgYi9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYwppbmRleCBiMmQwYmE0Li40OTdjYWZiIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYworKysgYi9zb3VuZC9kcml2ZXJzL3BvcnRtYW4yeDQuYwpAQCAtNjc2LDEzICs2NzYsMTMgQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7CiAKIAlkZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoUExBVEZPUk1fRFJJVkVSLCBkZXZpY2VfY291bnQpOwotCWlmICghZGV2aWNlKSAKKwlpZiAoIWRldmljZSkKIAkJcmV0dXJuOwogCiAJLyogVGVtcG9yYXJ5IGFzc2lnbm1lbnQgdG8gZm9yd2FyZCB0aGUgcGFycG9ydCAqLwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldmljZSwgcCk7CiAKLQlpZiAocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKGRldmljZSkgPCAwKSB7CisJaWYgKHBsYXRmb3JtX2RldmljZV9hZGQoZGV2aWNlKSA8IDApIHsKIAkJcGxhdGZvcm1fZGV2aWNlX3B1dChkZXZpY2UpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy92eC92eF9od2RlcC5jIGIvc291bmQvZHJpdmVycy92eC92eF9od2RlcC5jCmluZGV4IGUxOTIwYWYuLjlhODE1NGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvdngvdnhfaHdkZXAuYworKysgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2h3ZGVwLmMKQEAgLTMwLDYgKzMwLDIwIEBACiAKICNpZmRlZiBTTkRfVlhfRldfTE9BREVSCiAKK01PRFVMRV9GSVJNV0FSRSgidngvYnhfMV92eHAuYjU2Iik7CitNT0RVTEVfRklSTVdBUkUoInZ4L2J4XzFfdnA0LmI1NiIpOworTU9EVUxFX0ZJUk1XQVJFKCJ2eC94MV8xX3Z4Mi54bHgiKTsKK01PRFVMRV9GSVJNV0FSRSgidngveDFfMl92MjIueGx4Iik7CitNT0RVTEVfRklSTVdBUkUoInZ4L3gxXzFfdnhwLnhseCIpOworTU9EVUxFX0ZJUk1XQVJFKCJ2eC94MV8xX3ZwNC54bHgiKTsKK01PRFVMRV9GSVJNV0FSRSgidngvYmQ1NjAwMi5ib290Iik7CitNT0RVTEVfRklSTVdBUkUoInZ4L2JkNTYzdjIuYm9vdCIpOworTU9EVUxFX0ZJUk1XQVJFKCJ2eC9iZDU2M3MzLmJvb3QiKTsKK01PRFVMRV9GSVJNV0FSRSgidngvbF8xX3Z4Mi5kNTYiKTsKK01PRFVMRV9GSVJNV0FSRSgidngvbF8xX3YyMi5kNTYiKTsKK01PRFVMRV9GSVJNV0FSRSgidngvbF8xX3Z4cC5kNTYiKTsKK01PRFVMRV9GSVJNV0FSRSgidngvbF8xX3ZwNC5kNTYiKTsKKwogaW50IHNuZF92eF9zZXR1cF9maXJtd2FyZShzdHJ1Y3QgdnhfY29yZSAqY2hpcCkKIHsKIAlzdGF0aWMgY2hhciAqZndfZmlsZXNbVlhfVFlQRV9OVU1TXVs0XSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTQuYwppbmRleCBhZGJmZDU4Li4xZWZiOTczIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTE0LmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExNC5jCkBAIC0zNiw2ICszNiw3IEBACiAjZGVmaW5lIEFLNDExNF9BRERSCQkJMHgwMCAvKiBmaXhlZCBhZGRyZXNzICovCiAKIHN0YXRpYyB2b2lkIGFrNDExNF9zdGF0cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgYWs0MTE0X2luaXRfcmVncyhzdHJ1Y3QgYWs0MTE0ICpjaGlwKTsKIAogc3RhdGljIHZvaWQgcmVnX3dyaXRlKHN0cnVjdCBhazQxMTQgKmFrNDExNCwgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKQogewpAQCAtMTA1LDcgKzEwNiw3IEBACiAJZm9yIChyZWcgPSAwOyByZWcgPCA1OyByZWcrKykKIAkJY2hpcC0+dHhjc2JbcmVnXSA9IHR4Y3NiW3JlZ107CiAKLQlzbmRfYWs0MTE0X3JlaW5pdChjaGlwKTsKKwlhazQxMTRfaW5pdF9yZWdzKGNoaXApOwogCiAJY2hpcC0+cmNzMCA9IHJlZ19yZWFkKGNoaXAsIEFLNDExNF9SRUdfUkNTMCkgJiB+KEFLNDExNF9RSU5UIHwgQUs0MTE0X0NJTlQpOwogCWNoaXAtPnJjczEgPSByZWdfcmVhZChjaGlwLCBBSzQxMTRfUkVHX1JDUzEpOwpAQCAtMTMxLDEzICsxMzIsMTAgQEAKIAkJCSAgKGNoaXAtPnR4Y3NiW3JlZy1BSzQxMTRfUkVHX1RYQ1NCMF0gJiB+bWFzaykgfCB2YWwpOwogfQogCi12b2lkIHNuZF9hazQxMTRfcmVpbml0KHN0cnVjdCBhazQxMTQgKmNoaXApCitzdGF0aWMgdm9pZCBhazQxMTRfaW5pdF9yZWdzKHN0cnVjdCBhazQxMTQgKmNoaXApCiB7CiAJdW5zaWduZWQgY2hhciBvbGQgPSBjaGlwLT5yZWdtYXBbQUs0MTE0X1JFR19QV1JETl0sIHJlZzsKIAotCWNoaXAtPmluaXQgPSAxOwotCW1iKCk7Ci0JZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAkvKiBicmluZyB0aGUgY2hpcCB0byByZXNldCBzdGF0ZSBhbmQgcG93ZXJkb3duIHN0YXRlICovCiAJcmVnX3dyaXRlKGNoaXAsIEFLNDExNF9SRUdfUFdSRE4sIG9sZCAmIH4oQUs0MTE0X1JTVHxBSzQxMTRfUFdOKSk7CiAJdWRlbGF5KDIwMCk7CkBAIC0xNTAsOSArMTQ4LDE4IEBACiAJCXJlZ193cml0ZShjaGlwLCByZWcgKyBBSzQxMTRfUkVHX1RYQ1NCMCwgY2hpcC0+dHhjc2JbcmVnXSk7CiAJLyogcmVsZWFzZSBwb3dlcmRvd24sIGV2ZXJ5dGhpbmcgaXMgaW5pdGlhbGl6ZWQgbm93ICovCiAJcmVnX3dyaXRlKGNoaXAsIEFLNDExNF9SRUdfUFdSRE4sIG9sZCB8IEFLNDExNF9SU1QgfCBBSzQxMTRfUFdOKTsKK30KKwordm9pZCBzbmRfYWs0MTE0X3JlaW5pdChzdHJ1Y3QgYWs0MTE0ICpjaGlwKQoreworCWNoaXAtPmluaXQgPSAxOworCW1iKCk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlhazQxMTRfaW5pdF9yZWdzKGNoaXApOwogCS8qIGJyaW5nIHVwIHN0YXRpc3RpY3MgLyBldmVudCBxdWVpbmcgKi8KIAljaGlwLT5pbml0ID0gMDsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoaXAtPndvcmssIEhaIC8gMTApOworCWlmIChjaGlwLT5rY3Rsc1swXSkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT53b3JrLCBIWiAvIDEwKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBleHRlcm5hbF9yYXRlKHVuc2lnbmVkIGNoYXIgcmNzMSkKQEAgLTQyOCw3ICs0MzUsNyBAQAogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSwKIAkuaW5mbyA9CQlzbmRfYWs0MTE0X2luX2JpdF9pbmZvLAogCS5nZXQgPQkJc25kX2FrNDExNF9pbl9iaXRfZ2V0LAotCS5wcml2YXRlX3ZhbHVlID0gKDY8PDgpIHwgQUs0MTE0X1JFR19SQ1MxLAorCS5wcml2YXRlX3ZhbHVlID0gKDY8PDgpIHwgQUs0MTE0X1JFR19SQ1MwLAogfSwKIHsKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCkBAIC00MzYsNyArNDQzLDE1IEBACiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLAogCS5pbmZvID0JCXNuZF9hazQxMTRfaW5fYml0X2luZm8sCiAJLmdldCA9CQlzbmRfYWs0MTE0X2luX2JpdF9nZXQsCi0JLnByaXZhdGVfdmFsdWUgPSAoMzw8OCkgfCBBSzQxMTRfUkVHX1JDUzEsCisJLnByaXZhdGVfdmFsdWUgPSAoMzw8OCkgfCBBSzQxMTRfUkVHX1JDUzAsCit9LAoreworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9CQkiSUVDOTU4IFBQTCBMb2NrIFN0YXR1cyIsCisJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLAorCS5pbmZvID0JCXNuZF9hazQxMTRfaW5fYml0X2luZm8sCisJLmdldCA9CQlzbmRfYWs0MTE0X2luX2JpdF9nZXQsCisJLnByaXZhdGVfdmFsdWUgPSAoMTw8MzEpIHwgKDQ8PDgpIHwgQUs0MTE0X1JFR19SQ1MwLAogfQogfTsKIApAQCAtNDU1LDcgKzQ3MCw3IEBACiAJCWtjdGwgPSBzbmRfY3RsX25ldzEoJnNuZF9hazQxMTRfaWVjOTU4X2NvbnRyb2xzW2lkeF0sIGFrNDExNCk7CiAJCWlmIChrY3RsID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJaWYgKCFzdHJzdHIoa2N0bC0+aWQubmFtZSwgIlBsYXliYWNrIikpIHsKKwkJaWYgKHN0cnN0cihrY3RsLT5pZC5uYW1lLCAiUGxheWJhY2siKSkgewogCQkJaWYgKHBseV9zdWJzdHJlYW0gPT0gTlVMTCkgewogCQkJCXNuZF9jdGxfZnJlZV9vbmUoa2N0bCk7CiAJCQkJYWs0MTE0LT5rY3Rsc1tpZHhdID0gTlVMTDsKQEAgLTQ3Miw5ICs0ODcsNTggQEAKIAkJCXJldHVybiBlcnI7CiAJCWFrNDExNC0+a2N0bHNbaWR4XSA9IGtjdGw7CiAJfQorCS8qIHRyaWdnZXIgd29ya3EgKi8KKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFrNDExNC0+d29yaywgSFogLyAxMCk7CiAJcmV0dXJuIDA7CiB9CiAKKy8qIG5vdGlmeSBrY29udHJvbHMgaWYgYW55IHBhcmFtZXRlcnMgYXJlIGNoYW5nZWQgKi8KK3N0YXRpYyB2b2lkIGFrNDExNF9ub3RpZnkoc3RydWN0IGFrNDExNCAqYWs0MTE0LAorCQkJICB1bnNpZ25lZCBjaGFyIHJjczAsIHVuc2lnbmVkIGNoYXIgcmNzMSwKKwkJCSAgdW5zaWduZWQgY2hhciBjMCwgdW5zaWduZWQgY2hhciBjMSkKK3sKKwlpZiAoIWFrNDExNC0+a2N0bHNbMF0pCisJCXJldHVybjsKKworCWlmIChyY3MwICYgQUs0MTE0X1BBUikKKwkJc25kX2N0bF9ub3RpZnkoYWs0MTE0LT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwKKwkJCSAgICAgICAmYWs0MTE0LT5rY3Rsc1swXS0+aWQpOworCWlmIChyY3MwICYgQUs0MTE0X1YpCisJCXNuZF9jdGxfbm90aWZ5KGFrNDExNC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCisJCQkgICAgICAgJmFrNDExNC0+a2N0bHNbMV0tPmlkKTsKKwlpZiAocmNzMSAmIEFLNDExNF9DQ1JDKQorCQlzbmRfY3RsX25vdGlmeShhazQxMTQtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAgICAgICZhazQxMTQtPmtjdGxzWzJdLT5pZCk7CisJaWYgKHJjczEgJiBBSzQxMTRfUUNSQykKKwkJc25kX2N0bF9ub3RpZnkoYWs0MTE0LT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwKKwkJCSAgICAgICAmYWs0MTE0LT5rY3Rsc1szXS0+aWQpOworCisJLyogcmF0ZSBjaGFuZ2UgKi8KKwlpZiAoYzEgJiAweGYwKQorCQlzbmRfY3RsX25vdGlmeShhazQxMTQtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAgICAgICZhazQxMTQtPmtjdGxzWzRdLT5pZCk7CisKKwlpZiAoKGMwICYgQUs0MTE0X1BFTSkgfCAoYzAgJiBBSzQxMTRfQ0lOVCkpCisJCXNuZF9jdGxfbm90aWZ5KGFrNDExNC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCisJCQkgICAgICAgJmFrNDExNC0+a2N0bHNbOV0tPmlkKTsKKwlpZiAoYzAgJiBBSzQxMTRfUUlOVCkKKwkJc25kX2N0bF9ub3RpZnkoYWs0MTE0LT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwKKwkJCSAgICAgICAmYWs0MTE0LT5rY3Rsc1sxMF0tPmlkKTsKKworCWlmIChjMCAmIEFLNDExNF9BVURJT04pCisJCXNuZF9jdGxfbm90aWZ5KGFrNDExNC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCisJCQkgICAgICAgJmFrNDExNC0+a2N0bHNbMTFdLT5pZCk7CisJaWYgKGMwICYgQUs0MTE0X0FVVE8pCisJCXNuZF9jdGxfbm90aWZ5KGFrNDExNC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCisJCQkgICAgICAgJmFrNDExNC0+a2N0bHNbMTJdLT5pZCk7CisJaWYgKGMwICYgQUs0MTE0X0RUU0NEKQorCQlzbmRfY3RsX25vdGlmeShhazQxMTQtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAgICAgICZhazQxMTQtPmtjdGxzWzEzXS0+aWQpOworCWlmIChjMCAmIEFLNDExNF9VTkxDSykKKwkJc25kX2N0bF9ub3RpZnkoYWs0MTE0LT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwKKwkJCSAgICAgICAmYWs0MTE0LT5rY3Rsc1sxNF0tPmlkKTsKK30KKwogaW50IHNuZF9hazQxMTRfZXh0ZXJuYWxfcmF0ZShzdHJ1Y3QgYWs0MTE0ICphazQxMTQpCiB7CiAJdW5zaWduZWQgY2hhciByY3MxOwpAQCAtNTExLDMxICs1NzUsNyBAQAogCWFrNDExNC0+cmNzMSA9IHJjczE7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWs0MTE0LT5sb2NrLCBfZmxhZ3MpOwogCi0JaWYgKHJjczAgJiBBSzQxMTRfUEFSKQotCQlzbmRfY3RsX25vdGlmeShhazQxMTQtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLCAmYWs0MTE0LT5rY3Rsc1swXS0+aWQpOwotCWlmIChyY3MwICYgQUs0MTE0X1YpCi0JCXNuZF9jdGxfbm90aWZ5KGFrNDExNC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsICZhazQxMTQtPmtjdGxzWzFdLT5pZCk7Ci0JaWYgKHJjczEgJiBBSzQxMTRfQ0NSQykKLQkJc25kX2N0bF9ub3RpZnkoYWs0MTE0LT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwgJmFrNDExNC0+a2N0bHNbMl0tPmlkKTsKLQlpZiAocmNzMSAmIEFLNDExNF9RQ1JDKQotCQlzbmRfY3RsX25vdGlmeShhazQxMTQtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLCAmYWs0MTE0LT5rY3Rsc1szXS0+aWQpOwotCi0JLyogcmF0ZSBjaGFuZ2UgKi8KLQlpZiAoYzEgJiAweGYwKQotCQlzbmRfY3RsX25vdGlmeShhazQxMTQtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLCAmYWs0MTE0LT5rY3Rsc1s0XS0+aWQpOwotCi0JaWYgKChjMCAmIEFLNDExNF9QRU0pIHwgKGMwICYgQUs0MTE0X0NJTlQpKQotCQlzbmRfY3RsX25vdGlmeShhazQxMTQtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLCAmYWs0MTE0LT5rY3Rsc1s5XS0+aWQpOwotCWlmIChjMCAmIEFLNDExNF9RSU5UKQotCQlzbmRfY3RsX25vdGlmeShhazQxMTQtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLCAmYWs0MTE0LT5rY3Rsc1sxMF0tPmlkKTsKLQotCWlmIChjMCAmIEFLNDExNF9BVURJT04pCi0JCXNuZF9jdGxfbm90aWZ5KGFrNDExNC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsICZhazQxMTQtPmtjdGxzWzExXS0+aWQpOwotCWlmIChjMCAmIEFLNDExNF9BVVRPKQotCQlzbmRfY3RsX25vdGlmeShhazQxMTQtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLCAmYWs0MTE0LT5rY3Rsc1sxMl0tPmlkKTsKLQlpZiAoYzAgJiBBSzQxMTRfRFRTQ0QpCi0JCXNuZF9jdGxfbm90aWZ5KGFrNDExNC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsICZhazQxMTQtPmtjdGxzWzEzXS0+aWQpOwotCisJYWs0MTE0X25vdGlmeShhazQxMTQsIHJjczAsIHJjczEsIGMwLCBjMSk7CiAJaWYgKGFrNDExNC0+Y2hhbmdlX2NhbGxiYWNrICYmIChjMCB8IGMxKSAhPSAwKQogCQlhazQxMTQtPmNoYW5nZV9jYWxsYmFjayhhazQxMTQsIGMwLCBjMSk7CiAKQEAgLTU1OCw5ICs1OTgsOSBAQAogewogCXN0cnVjdCBhazQxMTQgKmNoaXAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFrNDExNCwgd29yay53b3JrKTsKIAotCWlmIChjaGlwLT5pbml0KQotCQlyZXR1cm47Ci0Jc25kX2FrNDExNF9jaGVja19yYXRlX2FuZF9lcnJvcnMoY2hpcCwgMCk7CisJaWYgKCFjaGlwLT5pbml0KQorCQlzbmRfYWs0MTE0X2NoZWNrX3JhdGVfYW5kX2Vycm9ycyhjaGlwLCAwKTsKKwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+d29yaywgSFogLyAxMCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9LY29uZmlnIGIvc291bmQvaXNhL0tjb25maWcKaW5kZXggNGUzYTk3Mi4uY2YzODAzYyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL0tjb25maWcKKysrIGIvc291bmQvaXNhL0tjb25maWcKQEAgLTM1OCwxMiArMzU4LDIxIEBACiBjb25maWcgU05EX1NCMTZfQ1NQCiAJYm9vbCAiU291bmQgQmxhc3RlciAxNi9BV0UgQ1NQIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiAoU05EX1NCMTYgfHwgU05EX1NCQVdFKSAmJiAoQlJPS0VOIHx8ICFQUEMpCi0Jc2VsZWN0IEZXX0xPQURFUgorCXNlbGVjdCBGV19MT0FERVIgaWYgIVNORF9TQjE2X0NTUF9GSVJNV0FSRV9JTl9LRVJORUwKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIENTUCBjb3JlLiAgVGhpcyBzcGVjaWFsCiAJICBjb3Byb2Nlc3NvciBjYW4gZG8gdmFyaWFibGUgdGFza3MgbGlrZSB2YXJpb3VzIGNvbXByZXNzaW9uIGFuZAogCSAgZGVjb21wcmVzc2lvbiBhbGdvcml0aG1zLgogCitjb25maWcgU05EX1NCMTZfQ1NQX0ZJUk1XQVJFX0lOX0tFUk5FTAorCWJvb2wgIkluLWtlcm5lbCBmaXJtd2FyZSBmb3IgU0IxNiBDU1AiCisJZGVwZW5kcyBvbiBTTkRfU0IxNl9DU1AKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlIHN0YXRpYyBmaXJtd2FyZSBidWlsdCBpbiB0aGUga2VybmVsCisJICBmb3IgdGhlIFNCMTYgQ1NQIGNvbnRyb2xsZXIuICBJZiB5b3UgY2hvb3NlIE4gaGVyZSwgeW91IG5lZWQKKwkgIHRvIGluc3RhbGwgdGhlIGZpcm13YXJlIGZpbGVzIGZyb20gdGhlIGFsc2EtZmlybXdhcmUgcGFja2FnZS4KKwogY29uZmlnIFNORF9TR0FMQVhZCiAJdHJpc3RhdGUgIkF6dGVjaCBTb3VuZCBHYWxheHkiCiAJZGVwZW5kcyBvbiBTTkQKQEAgLTM5MSw3ICs0MDAsNyBAQAogY29uZmlnIFNORF9XQVZFRlJPTlQKIAl0cmlzdGF0ZSAiVHVydGxlIEJlYWNoIE1hdWksVHJvcGV6LFRyb3BleisgKFdhdmVmcm9udCkiCiAJZGVwZW5kcyBvbiBTTkQKLQlzZWxlY3QgRldfTE9BREVSCisJc2VsZWN0IEZXX0xPQURFUiBpZiAhU05EX1dBVkVGUk9OVF9GSVJNV0FSRV9JTl9LRVJORUwKIAlzZWxlY3QgU05EX09QTDNfTElCCiAJc2VsZWN0IFNORF9NUFU0MDFfVUFSVAogCXNlbGVjdCBTTkRfQ1M0MjMxX0xJQgpAQCAtNDAyLDQgKzQxMSwxMyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc25kLXdhdmVmcm9udC4KIAorY29uZmlnIFNORF9XQVZFRlJPTlRfRklSTVdBUkVfSU5fS0VSTkVMCisJYm9vbCAiSW4ta2VybmVsIGZpcm13YXJlIGZvciBXYXZlZnJvbnQiCisJZGVwZW5kcyBvbiBTTkRfV0FWRUZST05UCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHRoZSBzdGF0aWMgZmlybXdhcmUgYnVpbHQgaW4gdGhlIGtlcm5lbAorCSAgZm9yIHRoZSBXYXZlZnJvbnQgZHJpdmVyLiAgSWYgeW91IGNob29zZSBOIGhlcmUsIHlvdSBuZWVkIHRvCisJICBpbnN0YWxsIHRoZSBmaXJtd2FyZSBmaWxlcyBmcm9tIHRoZSBhbHNhLWZpcm13YXJlIHBhY2thZ2UuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYyBiL3NvdW5kL2lzYS9hZDE4MTZhL2FkMTgxNmEuYwppbmRleCA1OTAzNDUwLi5mYzg4YTMxIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODE2YS9hZDE4MTZhLmMKKysrIGIvc291bmQvaXNhL2FkMTgxNmEvYWQxODE2YS5jCkBAIC0xMjksOCArMTI5LDggQEAKIAl9CiAJYWNhcmQtPmRldm1wdSA9IHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKGNhcmQsIGlkLT5kZXZzWzFdLmlkLCBOVUxMKTsKIAlpZiAoYWNhcmQtPmRldm1wdSA9PSBOVUxMKSB7Ci0JCWtmcmVlKGNmZyk7Ci0JCXJldHVybiAtRUJVU1k7CisJCW1wdV9wb3J0W2Rldl0gPSAtMTsKKwkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJNUFU0MDEgZGV2aWNlIGJ1c3ksIHNraXBwaW5nLlxuIik7CiAJfQogCiAJcGRldiA9IGFjYXJkLT5kZXY7CkBAIC0xNjIsNiArMTYyLDEwIEBACiAJZG1hMltkZXZdID0gcG5wX2RtYShwZGV2LCAxKTsKIAlpcnFbZGV2XSA9IHBucF9pcnEocGRldiwgMCk7CiAKKwlpZiAoYWNhcmQtPmRldm1wdSA9PSBOVUxMKSB7CisJCWtmcmVlKGNmZyk7CisJCXJldHVybiAwOworCX0KIAlwZGV2ID0gYWNhcmQtPmRldm1wdTsKIAlwbnBfaW5pdF9yZXNvdXJjZV90YWJsZShjZmcpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvYWQxODQ4L2FkMTg0OC5jIGIvc291bmQvaXNhL2FkMTg0OC9hZDE4NDguYwppbmRleCA3NGU1MDFkLi5kMDlhN2ZhIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWQxODQ4L2FkMTg0OC5jCisrKyBiL3NvdW5kL2lzYS9hZDE4NDgvYWQxODQ4LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgpAQCAtMzIsOCArMzIsMTEgQEAKICNpbmNsdWRlIDxzb3VuZC9hZDE4NDguaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKKyNkZWZpbmUgQ1JEX05BTUUgIkdlbmVyaWMgQUQxODQ4L0FEMTg0Ny9DUzQyNDgiCisjZGVmaW5lIERFVl9OQU1FICJhZDE4NDgiCisKK01PRFVMRV9ERVNDUklQVElPTihDUkRfTkFNRSk7CiBNT0RVTEVfQVVUSE9SKCJUdWdydWwgR2FsYXRhbGkgPGdhbGF0YWx0QHN0dXkuZWR1PiwgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBRDE4NDgvQUQxODQ3L0NTNDI0OCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7QW5hbG9nIERldmljZXMsQUQxODQ4fSwiCiAJICAgICAgICAie0FuYWxvZyBEZXZpY2VzLEFEMTg0N30sIgpAQCAtNDgsOTUgKzUxLDk4IEBACiBzdGF0aWMgaW50IHRoaW5rcGFkW1NORFJWX0NBUkRTXTsJCQkvKiBUaGlua3BhZCBzcGVjaWFsIGNhc2UgKi8KIAogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBBRDE4NDggc291bmRjYXJkLiIpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciAiIENSRF9OQU1FICIgc291bmRjYXJkLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBBRDE4NDggc291bmRjYXJkLiIpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgIiBDUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKIG1vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgQUQxODQ4IHNvdW5kY2FyZC4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICIgQ1JEX05BTUUgIiBzb3VuZGNhcmQuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkocG9ydCwgbG9uZywgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJQb3J0ICMgZm9yIEFEMTg0OCBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJQb3J0ICMgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgIyBmb3IgQUQxODQ4IGRyaXZlci4iKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRICMgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoZG1hMSwgaW50LCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZG1hMSwgIkRNQTEgIyBmb3IgQUQxODQ4IGRyaXZlci4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hMSwgIkRNQTEgIyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlci4iKTsKIG1vZHVsZV9wYXJhbV9hcnJheSh0aGlua3BhZCwgYm9vbCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHRoaW5rcGFkLCAiRW5hYmxlIG9ubHkgZm9yIHRoZSBvbmJvYXJkIENTNDI0OCBvZiBJQk0gVGhpbmtwYWQgMzYwLzc1MC83NTUgc2VyaWVzLiIpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tTTkRSVl9DQVJEU107Ci0KLQotc3RhdGljIGludCBfX2RldmluaXQgc25kX2FkMTg0OF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgc25kX2FkMTg0OF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewotCWludCBkZXYgPSBwZGV2LT5pZDsKKwlpZiAoIWVuYWJsZVtuXSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocG9ydFtuXSA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IHBsZWFzZSBzcGVjaWZ5IHBvcnRcbiIsIGRldi0+YnVzX2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpcnFbbl0gPT0gU05EUlZfQVVUT19JUlEpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IHBsZWFzZSBzcGVjaWZ5IGlycVxuIiwgZGV2LT5idXNfaWQpOworCQlyZXR1cm4gMDsJCisJfQorCWlmIChkbWExW25dID09IFNORFJWX0FVVE9fRE1BKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzOiBwbGVhc2Ugc3BlY2lmeSBkbWExXG4iLCBkZXYtPmJ1c19pZCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2FkMTg0OF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQorewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcDsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCWludCBlcnI7CisJaW50IGVycm9yOwogCi0JaWYgKHBvcnRbZGV2XSA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWQxODQ4OiBzcGVjaWZ5IHBvcnRcbiIpOworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKCFjYXJkKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGlycVtkZXZdID09IFNORFJWX0FVVE9fSVJRKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFkMTg0ODogc3BlY2lmeSBpcnFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGRtYTFbZGV2XSA9PSBTTkRSVl9BVVRPX0RNQSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhZDE4NDg6IHNwZWNpZnkgZG1hMVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KIAotCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOwotCWlmIChjYXJkID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOworCWVycm9yID0gc25kX2FkMTg0OF9jcmVhdGUoY2FyZCwgcG9ydFtuXSwgaXJxW25dLCBkbWExW25dLAorCQkJdGhpbmtwYWRbbl0gPyBBRDE4NDhfSFdfVEhJTktQQUQgOiBBRDE4NDhfSFdfREVURUNULCAmY2hpcCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlpZiAoKGVyciA9IHNuZF9hZDE4NDhfY3JlYXRlKGNhcmQsIHBvcnRbZGV2XSwKLQkJCQkgICAgIGlycVtkZXZdLAotCQkJCSAgICAgZG1hMVtkZXZdLAotCQkJCSAgICAgdGhpbmtwYWRbZGV2XSA/IEFEMTg0OF9IV19USElOS1BBRCA6IEFEMTg0OF9IV19ERVRFQ1QsCi0JCQkJICAgICAmY2hpcCkpIDwgMCkKLQkJZ290byBfZXJyOwogCWNhcmQtPnByaXZhdGVfZGF0YSA9IGNoaXA7CiAKLQlpZiAoKGVyciA9IHNuZF9hZDE4NDhfcGNtKGNoaXAsIDAsICZwY20pKSA8IDApCi0JCWdvdG8gX2VycjsKKwllcnJvciA9IHNuZF9hZDE4NDhfcGNtKGNoaXAsIDAsICZwY20pOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OwogCi0JaWYgKChlcnIgPSBzbmRfYWQxODQ4X21peGVyKGNoaXApKSA8IDApCi0JCWdvdG8gX2VycjsKKwllcnJvciA9IHNuZF9hZDE4NDhfbWl4ZXIoY2hpcCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CiAKIAlzdHJjcHkoY2FyZC0+ZHJpdmVyLCAiQUQxODQ4Iik7CiAJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgcGNtLT5uYW1lKTsKIAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCwgaXJxICVkLCBkbWEgJWQiLAotCQlwY20tPm5hbWUsIGNoaXAtPnBvcnQsIGlycVtkZXZdLCBkbWExW2Rldl0pOwotCi0JaWYgKHRoaW5rcGFkW2Rldl0pCisJCXBjbS0+bmFtZSwgY2hpcC0+cG9ydCwgaXJxW25dLCBkbWExW25dKTsKKwlpZiAodGhpbmtwYWRbbl0pCiAJCXN0cmNhdChjYXJkLT5sb25nbmFtZSwgIiBbVGhpbmtwYWRdIik7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKIAotCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkKLQkJZ290byBfZXJyOworCWVycm9yID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBjYXJkKTsKIAlyZXR1cm4gMDsKIAotIF9lcnI6Ci0Jc25kX2NhcmRfZnJlZShjYXJkKTsKLQlyZXR1cm4gZXJyOworb3V0OglzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc25kX2FkMTg0OF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmV4aXQgc25kX2FkMTg0OF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbikKIHsKLQlzbmRfY2FyZF9mcmVlKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldnB0cikpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldnB0ciwgTlVMTCk7CisJc25kX2NhcmRfZnJlZShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAJcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgc25kX2FkMTg0OF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgc25kX2FkMTg0OF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4sIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKQEAgLTE0NCw5ICsxNTAsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNuZF9hZDE4NDhfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHNuZF9hZDE4NDhfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4pCiB7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHNuZF9hZDE4NDggKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAljaGlwLT5yZXN1bWUoY2hpcCk7CkBAIC0xNTUsOSArMTYxLDggQEAKIH0KICNlbmRpZgogCi0jZGVmaW5lIFNORF9BRDE4NDhfRFJJVkVSCSJzbmRfYWQxODQ4IgotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfYWQxODQ4X2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBzbmRfYWQxODQ4X2RyaXZlciA9IHsKKwkubWF0Y2gJCT0gc25kX2FkMTg0OF9tYXRjaCwKIAkucHJvYmUJCT0gc25kX2FkMTg0OF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9hZDE4NDhfcmVtb3ZlKSwKICNpZmRlZiBDT05GSUdfUE0KQEAgLTE2NSw1NyArMTcwLDE5IEBACiAJLnJlc3VtZQkJPSBzbmRfYWQxODQ4X3Jlc3VtZSwKICNlbmRpZgogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9IFNORF9BRDE4NDhfRFJJVkVSCi0JfSwKKwkJLm5hbWUJPSBERVZfTkFNRQorCX0KIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUgc25kX2FkMTg0OF91bnJlZ2lzdGVyX2FsbCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlcyk7ICsraSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlc1tpXSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZF9hZDE4NDhfZHJpdmVyKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX2FkMTg0OF9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGNhcmRzLCBlcnI7Ci0KLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9hZDE4NDhfZHJpdmVyKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWNhcmRzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7IGkrKykgewotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7Ci0JCWlmICghIGVuYWJsZVtpXSkKLQkJCWNvbnRpbnVlOwotCQlkZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKFNORF9BRDE4NDhfRFJJVkVSLAotCQkJCQkJCSBpLCBOVUxMLCAwKTsKLQkJaWYgKElTX0VSUihkZXZpY2UpKQotCQkJY29udGludWU7Ci0JCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWRldmljZXNbaV0gPSBkZXZpY2U7Ci0JCWNhcmRzKys7Ci0JfQotCWlmICghY2FyZHMpIHsKLSNpZmRlZiBNT0RVTEUKLQkJcHJpbnRrKEtFUk5fRVJSICJBRDE4NDggc291bmRjYXJkIG5vdCBmb3VuZCBvciBkZXZpY2UgYnVzeVxuIik7Ci0jZW5kaWYKLQkJc25kX2FkMTg0OF91bnJlZ2lzdGVyX2FsbCgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGlzYV9yZWdpc3Rlcl9kcml2ZXIoJnNuZF9hZDE4NDhfZHJpdmVyLCBTTkRSVl9DQVJEUyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfYWQxODQ4X2V4aXQodm9pZCkKIHsKLQlzbmRfYWQxODQ4X3VucmVnaXN0ZXJfYWxsKCk7CisJaXNhX3VucmVnaXN0ZXJfZHJpdmVyKCZzbmRfYWQxODQ4X2RyaXZlcik7CiB9CiAKLW1vZHVsZV9pbml0KGFsc2FfY2FyZF9hZDE4NDhfaW5pdCkKLW1vZHVsZV9leGl0KGFsc2FfY2FyZF9hZDE4NDhfZXhpdCkKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9hZDE4NDhfaW5pdCk7Cittb2R1bGVfZXhpdChhbHNhX2NhcmRfYWQxODQ4X2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2FkbGliLmMgYi9zb3VuZC9pc2EvYWRsaWIuYwppbmRleCAxMTI0MzQ0Li5kNjg3MjA3IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvYWRsaWIuYworKysgYi9zb3VuZC9pc2EvYWRsaWIuYwpAQCAtNSwxMyArNSwxMyBAQAogI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvb3BsMy5oPgogCiAjZGVmaW5lIENSRF9OQU1FICJBZExpYiBGTSIKLSNkZWZpbmUgRFJWX05BTUUgInNuZF9hZGxpYiIKKyNkZWZpbmUgREVWX05BTUUgImFkbGliIgogCiBNT0RVTEVfREVTQ1JJUFRJT04oQ1JEX05BTUUpOwogTU9EVUxFX0FVVEhPUigiUmVuZSBIZXJtYW4iKTsKQEAgLTMxLDEzMyArMzEsOTkgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShwb3J0LCBsb25nLCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocG9ydCwgIlBvcnQgIyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlci4iKTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbU05EUlZfQ0FSRFNdOworc3RhdGljIGludCBfX2RldmluaXQgc25kX2FkbGliX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4pCit7CisJaWYgKCFlbmFibGVbbl0pCisJCXJldHVybiAwOworCisJaWYgKHBvcnRbbl0gPT0gU05EUlZfQVVUT19QT1JUKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzOiBwbGVhc2Ugc3BlY2lmeSBwb3J0XG4iLCBkZXYtPmJ1c19pZCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KIAogc3RhdGljIHZvaWQgc25kX2FkbGliX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewogCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2FyZC0+cHJpdmF0ZV9kYXRhKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgc25kX2FkbGliX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9hZGxpYl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7CisJaW50IGVycm9yOwogCi0JaW50IGVycm9yLCBpID0gZGV2aWNlLT5pZDsKLQotCWlmIChwb3J0W2ldID09IFNORFJWX0FVVE9fUE9SVCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IHBsZWFzZSBzcGVjaWZ5IHBvcnRcbiIpOwotCQllcnJvciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0MDsKLQl9Ci0KLQljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2ldLCBpZFtpXSwgVEhJU19NT0RVTEUsIDApOworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCk7CiAJaWYgKCFjYXJkKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogY291bGQgbm90IGNyZWF0ZSBjYXJkXG4iKTsKLQkJZXJyb3IgPSAtRUlOVkFMOwotCQlnb3RvIG91dDA7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZCBub3QgY3JlYXRlIGNhcmRcbiIsIGRldi0+YnVzX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY2FyZC0+cHJpdmF0ZV9kYXRhID0gcmVxdWVzdF9yZWdpb24ocG9ydFtpXSwgNCwgQ1JEX05BTUUpOworCWNhcmQtPnByaXZhdGVfZGF0YSA9IHJlcXVlc3RfcmVnaW9uKHBvcnRbbl0sIDQsIENSRF9OQU1FKTsKIAlpZiAoIWNhcmQtPnByaXZhdGVfZGF0YSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGNvdWxkIG5vdCBncmFiIHBvcnRzXG4iKTsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBncmFiIHBvcnRzXG4iLCBkZXYtPmJ1c19pZCk7CiAJCWVycm9yID0gLUVCVVNZOwotCQlnb3RvIG91dDE7CisJCWdvdG8gb3V0OwogCX0KIAljYXJkLT5wcml2YXRlX2ZyZWUgPSBzbmRfYWRsaWJfZnJlZTsKIAotCWVycm9yID0gc25kX29wbDNfY3JlYXRlKGNhcmQsIHBvcnRbaV0sIHBvcnRbaV0gKyAyLCBPUEwzX0hXX0FVVE8sIDEsICZvcGwzKTsKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCBERVZfTkFNRSk7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgQ1JEX05BTUUpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsIENSRF9OQU1FICIgYXQgJSNseCIsIHBvcnRbbl0pOworCisJZXJyb3IgPSBzbmRfb3BsM19jcmVhdGUoY2FyZCwgcG9ydFtuXSwgcG9ydFtuXSArIDIsIE9QTDNfSFdfQVVUTywgMSwgJm9wbDMpOwogCWlmIChlcnJvciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBjb3VsZCBub3QgY3JlYXRlIE9QTFxuIik7Ci0JCWdvdG8gb3V0MTsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkIG5vdCBjcmVhdGUgT1BMXG4iLCBkZXYtPmJ1c19pZCk7CisJCWdvdG8gb3V0OwogCX0KIAogCWVycm9yID0gc25kX29wbDNfaHdkZXBfbmV3KG9wbDMsIDAsIDAsIE5VTEwpOwogCWlmIChlcnJvciA8IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBEUlZfTkFNRSAiOiBjb3VsZCBub3QgY3JlYXRlIEZNXG4iKTsKLQkJZ290byBvdXQxOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGNyZWF0ZSBGTVxuIiwgZGV2LT5idXNfaWQpOworCQlnb3RvIG91dDsKIAl9CiAKLQlzdHJjcHkoY2FyZC0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgQ1JEX05BTUUpOwotCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsIENSRF9OQU1FICIgYXQgJSNseCIsIHBvcnRbaV0pOwotCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2aWNlLT5kZXYpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKIAogCWVycm9yID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVycm9yIDwgMCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGNvdWxkIG5vdCByZWdpc3RlciBjYXJkXG4iKTsKLQkJZ290byBvdXQxOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IHJlZ2lzdGVyIGNhcmRcbiIsIGRldi0+YnVzX2lkKTsKKwkJZ290byBvdXQ7CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2aWNlLCBjYXJkKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBjYXJkKTsKIAlyZXR1cm4gMDsKIAotb3V0MToJc25kX2NhcmRfZnJlZShjYXJkKTsKLW91dDA6CXJldHVybiBlcnJvcjsKK291dDoJc25kX2NhcmRfZnJlZShjYXJkKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9hZGxpYl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlKQorc3RhdGljIGludCBfX2RldmV4aXQgc25kX2FkbGliX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewotCXNuZF9jYXJkX2ZyZWUocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2aWNlLCBOVUxMKTsKKwlzbmRfY2FyZF9mcmVlKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX2FkbGliX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBzbmRfYWRsaWJfZHJpdmVyID0geworCS5tYXRjaAkJPSBzbmRfYWRsaWJfbWF0Y2gsCiAJLnByb2JlCQk9IHNuZF9hZGxpYl9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9hZGxpYl9yZW1vdmUpLAogCiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gRFJWX05BTUUKKwkJLm5hbWUJPSBERVZfTkFNRQogCX0KIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9hZGxpYl9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGNhcmRzOwotCi0JaWYgKHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kX2FkbGliX2RyaXZlcikgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogY291bGQgbm90IHJlZ2lzdGVyIGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWZvciAoY2FyZHMgPSAwLCBpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKLQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOwotCi0JCWlmICghZW5hYmxlW2ldKQotCQkJY29udGludWU7Ci0KLQkJZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShEUlZfTkFNRSwgaSwgTlVMTCwgMCk7Ci0JCWlmIChJU19FUlIoZGV2aWNlKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJZGV2aWNlc1tpXSA9IGRldmljZTsKLQkJY2FyZHMrKzsKLQl9Ci0KLQlpZiAoIWNhcmRzKSB7Ci0jaWZkZWYgTU9EVUxFCi0JCXByaW50ayhLRVJOX0VSUiBDUkRfTkFNRSAiIHNvdW5kY2FyZCBub3QgZm91bmQgb3IgZGV2aWNlIGJ1c3lcbiIpOwotI2VuZGlmCi0JCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfYWRsaWJfZHJpdmVyKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiAwOworCXJldHVybiBpc2FfcmVnaXN0ZXJfZHJpdmVyKCZzbmRfYWRsaWJfZHJpdmVyLCBTTkRSVl9DQVJEUyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfYWRsaWJfZXhpdCh2b2lkKQogewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspCi0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZXNbaV0pOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfYWRsaWJfZHJpdmVyKTsKKwlpc2FfdW5yZWdpc3Rlcl9kcml2ZXIoJnNuZF9hZGxpYl9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChhbHNhX2NhcmRfYWRsaWJfaW5pdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvY21pODMzMC5jIGIvc291bmQvaXNhL2NtaTgzMzAuYwppbmRleCBjMDlhODAwLi4yMTRkNjVkIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY21pODMzMC5jCisrKyBiL3NvdW5kL2lzYS9jbWk4MzMwLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CkBAIC0xMDgsNyArMTA4LDYgQEAKIG1vZHVsZV9wYXJhbV9hcnJheSh3c3NkbWEsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHdzc2RtYSwgIkRNQSBmb3IgQ01JODMzMCBXU1MgZHJpdmVyLiIpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tTTkRSVl9DQVJEU107CiAjaWZkZWYgQ09ORklHX1BOUAogc3RhdGljIGludCBwbnBfcmVnaXN0ZXJlZDsKICNlbmRpZgpAQCAtNTQ3LDcwICs1NDYsNzggQEAKIAlyZXR1cm4gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jbWk4MzMwX25vbnBucF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgc25kX2NtaTgzMzBfaXNhX21hdGNoKHN0cnVjdCBkZXZpY2UgKnBkZXYsCisJCQkJCSAgIHVuc2lnbmVkIGludCBkZXYpCiB7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCWludCBlcnI7Ci0JaW50IGRldiA9IHBkZXYtPmlkOwotCisJaWYgKCFlbmFibGVbZGV2XSB8fCBpc19pc2FwbnBfc2VsZWN0ZWQoZGV2KSkKKwkJcmV0dXJuIDA7CiAJaWYgKHdzc3BvcnRbZGV2XSA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggInNwZWNpZnkgd3NzcG9ydFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHNicG9ydFtkZXZdID09IFNORFJWX0FVVE9fUE9SVCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAic3BlY2lmeSBzYnBvcnRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CiAJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY21pODMzMF9pc2FfcHJvYmUoc3RydWN0IGRldmljZSAqcGRldiwKKwkJCQkJICAgdW5zaWduZWQgaW50IGRldikKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJaW50IGVycjsKIAogCWNhcmQgPSBzbmRfY21pODMzMF9jYXJkX25ldyhkZXYpOwogCWlmICghIGNhcmQpCiAJCXJldHVybiAtRU5PTUVNOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAlpZiAoKGVyciA9IHNuZF9jbWk4MzMwX3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwlkZXZfc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9jbWk4MzMwX25vbnBucF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmV4aXQgc25kX2NtaTgzMzBfaXNhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZwdHIsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgZGV2KQogewotCXNuZF9jYXJkX2ZyZWUocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2cHRyKSk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBOVUxMKTsKKwlzbmRfY2FyZF9mcmVlKGRldl9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2cHRyLCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBzbmRfY21pODMzMF9ub25wbnBfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgc25kX2NtaTgzMzBfaXNhX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbiwKKwkJCQkgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHNuZF9jbWk4MzMwX3N1c3BlbmQocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KSk7CisJcmV0dXJuIHNuZF9jbWk4MzMwX3N1c3BlbmQoZGV2X2dldF9kcnZkYXRhKGRldikpOwogfQogCi1zdGF0aWMgaW50IHNuZF9jbWk4MzMwX25vbnBucF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBzbmRfY21pODMzMF9pc2FfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4pCiB7Ci0JcmV0dXJuIHNuZF9jbWk4MzMwX3Jlc3VtZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlyZXR1cm4gc25kX2NtaTgzMzBfcmVzdW1lKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIH0KICNlbmRpZgogCi0jZGVmaW5lIENNSTgzMzBfRFJJVkVSCSJzbmRfY21pODMzMCIKKyNkZWZpbmUgREVWX05BTUUJImNtaTgzMzAiCiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZF9jbWk4MzMwX2RyaXZlciA9IHsKLQkucHJvYmUJCT0gc25kX2NtaTgzMzBfbm9ucG5wX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc25kX2NtaTgzMzBfbm9ucG5wX3JlbW92ZSksCitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgc25kX2NtaTgzMzBfZHJpdmVyID0geworCS5tYXRjaAkJPSBzbmRfY21pODMzMF9pc2FfbWF0Y2gsCisJLnByb2JlCQk9IHNuZF9jbWk4MzMwX2lzYV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9jbWk4MzMwX2lzYV9yZW1vdmUpLAogI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gc25kX2NtaTgzMzBfbm9ucG5wX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzbmRfY21pODMzMF9ub25wbnBfcmVzdW1lLAorCS5zdXNwZW5kCT0gc25kX2NtaTgzMzBfaXNhX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzbmRfY21pODMzMF9pc2FfcmVzdW1lLAogI2VuZGlmCiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gQ01JODMzMF9EUklWRVIKKwkJLm5hbWUJPSBERVZfTkFNRQogCX0sCiB9OwogCiAKICNpZmRlZiBDT05GSUdfUE5QCi1zdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdGRhdGEgY21pODMzMF9wbnBfZGV2aWNlczsKLQogc3RhdGljIGludCBfX2RldmluaXQgc25kX2NtaTgzMzBfcG5wX2RldGVjdChzdHJ1Y3QgcG5wX2NhcmRfbGluayAqcGNhcmQsCiAJCQkJCSAgICBjb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICpwaWQpCiB7CkBAIC02NDAsNyArNjQ3LDYgQEAKIAl9CiAJcG5wX3NldF9jYXJkX2RydmRhdGEocGNhcmQsIGNhcmQpOwogCWRldisrOwotCWNtaTgzMzBfcG5wX2RldmljZXMrKzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjc1LDYzICs2ODEsMjggQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1BOUCAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXRfb3JfbW9kdWxlIHNuZF9jbWk4MzMwX3VucmVnaXN0ZXJfYWxsKHZvaWQpCi17Ci0JaW50IGk7Ci0KLSNpZmRlZiBDT05GSUdfUE5QCi0JaWYgKHBucF9yZWdpc3RlcmVkKQotCQlwbnBfdW5yZWdpc3Rlcl9jYXJkX2RyaXZlcigmY21pODMzMF9wbnBjX2RyaXZlcik7Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKTsgKytpKQotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwbGF0Zm9ybV9kZXZpY2VzW2ldKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kX2NtaTgzMzBfZHJpdmVyKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX2NtaTgzMzBfaW5pdCh2b2lkKQogewotCWludCBpLCBlcnIsIGNhcmRzID0gMDsKKwlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9jbWk4MzMwX2RyaXZlcikpIDwgMCkKKwllcnIgPSBpc2FfcmVnaXN0ZXJfZHJpdmVyKCZzbmRfY21pODMzMF9kcml2ZXIsIFNORFJWX0NBUkRTKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9DQVJEUzsgaSsrKSB7Ci0JCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZTsKLQkJaWYgKCEgZW5hYmxlW2ldIHx8IGlzX2lzYXBucF9zZWxlY3RlZChpKSkKLQkJCWNvbnRpbnVlOwotCQlkZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKENNSTgzMzBfRFJJVkVSLAotCQkJCQkJCSBpLCBOVUxMLCAwKTsKLQkJaWYgKElTX0VSUihkZXZpY2UpKQotCQkJY29udGludWU7Ci0JCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXBsYXRmb3JtX2RldmljZXNbaV0gPSBkZXZpY2U7Ci0JCWNhcmRzKys7Ci0JfQotCiAjaWZkZWYgQ09ORklHX1BOUAogCWVyciA9IHBucF9yZWdpc3Rlcl9jYXJkX2RyaXZlcigmY21pODMzMF9wbnBjX2RyaXZlcik7Ci0JaWYgKCFlcnIpIHsKKwlpZiAoIWVycikKIAkJcG5wX3JlZ2lzdGVyZWQgPSAxOwotCQljYXJkcyArPSBjbWk4MzMwX3BucF9kZXZpY2VzOwotCX0KICNlbmRpZgotCi0JaWYgKCFjYXJkcykgewotI2lmZGVmIE1PRFVMRQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJDTUk4MzMwIG5vdCBmb3VuZCBvciBkZXZpY2UgYnVzeVxuIik7Ci0jZW5kaWYKLQkJc25kX2NtaTgzMzBfdW5yZWdpc3Rlcl9hbGwoKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2NtaTgzMzBfZXhpdCh2b2lkKQogewotCXNuZF9jbWk4MzMwX3VucmVnaXN0ZXJfYWxsKCk7CisjaWZkZWYgQ09ORklHX1BOUAorCWlmIChwbnBfcmVnaXN0ZXJlZCkKKwkJcG5wX3VucmVnaXN0ZXJfY2FyZF9kcml2ZXIoJmNtaTgzMzBfcG5wY19kcml2ZXIpOworI2VuZGlmCisJaXNhX3VucmVnaXN0ZXJfZHJpdmVyKCZzbmRfY21pODMzMF9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChhbHNhX2NhcmRfY21pODMzMF9pbml0KQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzEuYyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjMxLmMKaW5kZXggNjk2YTVjOC4uYWM0MDQxMSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzEuYworKysgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMS5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KQEAgLTMyLDggKzMyLDExIEBACiAjaW5jbHVkZSA8c291bmQvbXB1NDAxLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCisjZGVmaW5lIENSRF9OQU1FICJHZW5lcmljIENTNDIzMSIKKyNkZWZpbmUgREVWX05BTUUgImNzNDIzMSIKKworTU9EVUxFX0RFU0NSSVBUSU9OKENSRF9OQU1FKTsKIE1PRFVMRV9BVVRIT1IoIkphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiR2VuZXJpYyBDUzQyMzEiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e0NyeXN0YWwgU2VtaWNvbmR1Y3RvcnMsQ1M0MjMxfX0iKTsKIApAQCAtNDgsMTMyICs1MSwxMzYgQEAKIHN0YXRpYyBpbnQgZG1hMltTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0RNQTsJLyogMCwxLDMsNSw2LDcgKi8KIAogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBDUzQyMzEgc291bmRjYXJkLiIpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciAiIENSRF9OQU1FICIgc291bmRjYXJkLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBDUzQyMzEgc291bmRjYXJkLiIpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgIiBDUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKIG1vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgQ1M0MjMxIHNvdW5kY2FyZC4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICIgQ1JEX05BTUUgIiBzb3VuZGNhcmQuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkocG9ydCwgbG9uZywgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJQb3J0ICMgZm9yIENTNDIzMSBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJQb3J0ICMgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkobXB1X3BvcnQsIGxvbmcsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhtcHVfcG9ydCwgIk1QVS00MDEgcG9ydCAjIGZvciBDUzQyMzEgZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhtcHVfcG9ydCwgIk1QVS00MDEgcG9ydCAjIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRICMgZm9yIENTNDIzMSBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSAjIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KG1wdV9pcnEsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1wdV9pcnEsICJNUFUtNDAxIElSUSAjIGZvciBDUzQyMzEgZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhtcHVfaXJxLCAiTVBVLTQwMSBJUlEgIyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlci4iKTsKIG1vZHVsZV9wYXJhbV9hcnJheShkbWExLCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkbWExLCAiRE1BMSAjIGZvciBDUzQyMzEgZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhkbWExLCAiRE1BMSAjIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGRtYTIsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRtYTIsICJETUEyICMgZm9yIENTNDIzMSBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKGRtYTIsICJETUEyICMgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW1NORFJWX0NBUkRTXTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfY3M0MjMxX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY3M0MjMxX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4pCiB7Ci0JaW50IGRldiA9IHBkZXYtPmlkOwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwotCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwOwotCWludCBlcnI7CisJaWYgKCFlbmFibGVbbl0pCisJCXJldHVybiAwOwogCi0JaWYgKHBvcnRbZGV2XSA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic3BlY2lmeSBwb3J0XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBvcnRbbl0gPT0gU05EUlZfQVVUT19QT1JUKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzOiBwbGVhc2Ugc3BlY2lmeSBwb3J0XG4iLCBkZXYtPmJ1c19pZCk7CisJCXJldHVybiAwOwogCX0KLQlpZiAoaXJxW2Rldl0gPT0gU05EUlZfQVVUT19JUlEpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic3BlY2lmeSBpcnFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaXJxW25dID09IFNORFJWX0FVVE9fSVJRKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzOiBwbGVhc2Ugc3BlY2lmeSBpcnFcbiIsIGRldi0+YnVzX2lkKTsKKwkJcmV0dXJuIDA7CiAJfQotCWlmIChkbWExW2Rldl0gPT0gU05EUlZfQVVUT19ETUEpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic3BlY2lmeSBkbWExXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGRtYTFbbl0gPT0gU05EUlZfQVVUT19ETUEpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IHBsZWFzZSBzcGVjaWZ5IGRtYTFcbiIsIGRldi0+YnVzX2lkKTsKKwkJcmV0dXJuIDA7CiAJfQotCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOwotCWlmIChjYXJkID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmICgoZXJyID0gc25kX2NzNDIzMV9jcmVhdGUoY2FyZCwgcG9ydFtkZXZdLCAtMSwKLQkJCQkgICAgIGlycVtkZXZdLAotCQkJCSAgICAgZG1hMVtkZXZdLAotCQkJCSAgICAgZG1hMltkZXZdLAotCQkJCSAgICAgQ1M0MjMxX0hXX0RFVEVDVCwKLQkJCQkgICAgIDAsICZjaGlwKSkgPCAwKQotCQlnb3RvIF9lcnI7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jczQyMzFfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbikKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHNuZF9jczQyMzEgKmNoaXA7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKKwlpbnQgZXJyb3I7CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIDApOworCWlmICghY2FyZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IHNuZF9jczQyMzFfY3JlYXRlKGNhcmQsIHBvcnRbbl0sIC0xLCBpcnFbbl0sIGRtYTFbbl0sIGRtYTJbbl0sCisJCQlDUzQyMzFfSFdfREVURUNULCAwLCAmY2hpcCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKIAljYXJkLT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX3BjbShjaGlwLCAwLCAmcGNtKSkgPCAwKQotCQlnb3RvIF9lcnI7CisJZXJyb3IgPSBzbmRfY3M0MjMxX3BjbShjaGlwLCAwLCAmcGNtKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKIAogCXN0cmNweShjYXJkLT5kcml2ZXIsICJDUzQyMzEiKTsKIAlzdHJjcHkoY2FyZC0+c2hvcnRuYW1lLCBwY20tPm5hbWUpOworCiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWQsIGRtYSAlZCIsCi0JCXBjbS0+bmFtZSwgY2hpcC0+cG9ydCwgaXJxW2Rldl0sIGRtYTFbZGV2XSk7Ci0JaWYgKGRtYTJbZGV2XSA+PSAwKQotCQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lICsgc3RybGVuKGNhcmQtPmxvbmduYW1lKSwgIiYlZCIsIGRtYTJbZGV2XSk7CisJCXBjbS0+bmFtZSwgY2hpcC0+cG9ydCwgaXJxW25dLCBkbWExW25dKTsKKwlpZiAoZG1hMltuXSA+PSAwKQorCQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lICsgc3RybGVuKGNhcmQtPmxvbmduYW1lKSwgIiYlZCIsIGRtYTJbbl0pOwogCi0JaWYgKChlcnIgPSBzbmRfY3M0MjMxX21peGVyKGNoaXApKSA8IDApCi0JCWdvdG8gX2VycjsKLQlpZiAoKGVyciA9IHNuZF9jczQyMzFfdGltZXIoY2hpcCwgMCwgTlVMTCkpIDwgMCkKLQkJZ290byBfZXJyOworCWVycm9yID0gc25kX2NzNDIzMV9taXhlcihjaGlwKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKIAotCWlmIChtcHVfcG9ydFtkZXZdID4gMCAmJiBtcHVfcG9ydFtkZXZdICE9IFNORFJWX0FVVE9fUE9SVCkgewotCQlpZiAobXB1X2lycVtkZXZdID09IFNORFJWX0FVVE9fSVJRKQotCQkJbXB1X2lycVtkZXZdID0gLTE7CisJZXJyb3IgPSBzbmRfY3M0MjMxX3RpbWVyKGNoaXAsIDAsIE5VTEwpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKG1wdV9wb3J0W25dID4gMCAmJiBtcHVfcG9ydFtuXSAhPSBTTkRSVl9BVVRPX1BPUlQpIHsKKwkJaWYgKG1wdV9pcnFbbl0gPT0gU05EUlZfQVVUT19JUlEpCisJCQltcHVfaXJxW25dID0gLTE7CiAJCWlmIChzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19DUzQyMzIsCi0JCQkJCW1wdV9wb3J0W2Rldl0sIDAsCi0JCQkJCW1wdV9pcnFbZGV2XSwKLQkJCQkJbXB1X2lycVtkZXZdID49IDAgPyBJUlFGX0RJU0FCTEVEIDogMCwKKwkJCQkJbXB1X3BvcnRbbl0sIDAsIG1wdV9pcnFbbl0sCisJCQkJCW1wdV9pcnFbbl0gPj0gMCA/IElSUUZfRElTQUJMRUQgOiAwLAogCQkJCQlOVUxMKSA8IDApCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjczQyMzE6IE1QVTQwMSBub3QgZGV0ZWN0ZWRcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE1QVTQwMSBub3QgZGV0ZWN0ZWRcbiIsIGRldi0+YnVzX2lkKTsKIAl9CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKIAotCWlmICgoZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkKLQkJZ290byBfZXJyOworCWVycm9yID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBjYXJkKTsKIAlyZXR1cm4gMDsKIAotIF9lcnI6Ci0Jc25kX2NhcmRfZnJlZShjYXJkKTsKLQlyZXR1cm4gZXJyOworb3V0OglzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc25kX2NzNDIzMV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmV4aXQgc25kX2NzNDIzMV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbikKIHsKLQlzbmRfY2FyZF9mcmVlKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldnB0cikpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldnB0ciwgTlVMTCk7CisJc25kX2NhcmRfZnJlZShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAJcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgc25kX2NzNDIzMV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBzbmRfY3M0MjMxX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcDsKLQljYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKwogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKLQljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOwogCWNoaXAtPnN1c3BlbmQoY2hpcCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2NzNDIzMV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBzbmRfY3M0MjMxX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlzdHJ1Y3Qgc25kX2NzNDIzMSAqY2hpcDsKLQljYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzbmRfY3M0MjMxICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOworCiAJY2hpcC0+cmVzdW1lKGNoaXApOwogCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgogCi0jZGVmaW5lIFNORF9DUzQyMzFfRFJJVkVSCSJzbmRfY3M0MjMxIgotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfY3M0MjMxX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBzbmRfY3M0MjMxX2RyaXZlciA9IHsKKwkubWF0Y2gJCT0gc25kX2NzNDIzMV9tYXRjaCwKIAkucHJvYmUJCT0gc25kX2NzNDIzMV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9jczQyMzFfcmVtb3ZlKSwKICNpZmRlZiBDT05GSUdfUE0KQEAgLTE4MSw1NyArMTg4LDE5IEBACiAJLnJlc3VtZQkJPSBzbmRfY3M0MjMxX3Jlc3VtZSwKICNlbmRpZgogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9IFNORF9DUzQyMzFfRFJJVkVSCi0JfSwKKwkJLm5hbWUJPSBERVZfTkFNRQorCX0KIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUgc25kX2NzNDIzMV91bnJlZ2lzdGVyX2FsbCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlcyk7ICsraSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlc1tpXSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZF9jczQyMzFfZHJpdmVyKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX2NzNDIzMV9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGNhcmRzLCBlcnI7Ci0KLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9jczQyMzFfZHJpdmVyKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWNhcmRzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7IGkrKykgewotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7Ci0JCWlmICghIGVuYWJsZVtpXSkKLQkJCWNvbnRpbnVlOwotCQlkZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKFNORF9DUzQyMzFfRFJJVkVSLAotCQkJCQkJCSBpLCBOVUxMLCAwKTsKLQkJaWYgKElTX0VSUihkZXZpY2UpKQotCQkJY29udGludWU7Ci0JCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWRldmljZXNbaV0gPSBkZXZpY2U7Ci0JCWNhcmRzKys7Ci0JfQotCWlmICghY2FyZHMpIHsKLSNpZmRlZiBNT0RVTEUKLQkJcHJpbnRrKEtFUk5fRVJSICJDUzQyMzEgc291bmRjYXJkIG5vdCBmb3VuZCBvciBkZXZpY2UgYnVzeVxuIik7Ci0jZW5kaWYKLQkJc25kX2NzNDIzMV91bnJlZ2lzdGVyX2FsbCgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGlzYV9yZWdpc3Rlcl9kcml2ZXIoJnNuZF9jczQyMzFfZHJpdmVyLCBTTkRSVl9DQVJEUyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfY3M0MjMxX2V4aXQodm9pZCkKIHsKLQlzbmRfY3M0MjMxX3VucmVnaXN0ZXJfYWxsKCk7CisJaXNhX3VucmVnaXN0ZXJfZHJpdmVyKCZzbmRfY3M0MjMxX2RyaXZlcik7CiB9CiAKLW1vZHVsZV9pbml0KGFsc2FfY2FyZF9jczQyMzFfaW5pdCkKLW1vZHVsZV9leGl0KGFsc2FfY2FyZF9jczQyMzFfZXhpdCkKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9jczQyMzFfaW5pdCk7Cittb2R1bGVfZXhpdChhbHNhX2NhcmRfY3M0MjMxX2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzFfbGliLmMgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMV9saWIuYwppbmRleCA3NWM3YzVmLi45MTRkNzdiIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMV9saWIuYworKysgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzMV9saWIuYwpAQCAtNDA1LDcgKzQwNSw2IEBACiAJc3RydWN0IHNuZF9jczQyMzEgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJaW50IHJlc3VsdCA9IDA7CiAJdW5zaWduZWQgaW50IHdoYXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKIAlpbnQgZG9fc3RhcnQ7CiAKQEAgLTQyNSw4ICs0MjQsNyBAQAogCX0KIAogCXdoYXQgPSAwOwotCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLQkJcyA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7CisJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKIAkJaWYgKHMgPT0gY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKSB7CiAJCQl3aGF0IHw9IENTNDIzMV9QTEFZQkFDS19FTkFCTEU7CiAJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYyBiL3NvdW5kL2lzYS9jczQyM3gvY3M0MjM2LmMKaW5kZXggMDdmZmQ1Yy4uODdmMTM5MiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2NzNDIzeC9jczQyMzYuYworKysgYi9zb3VuZC9pc2EvY3M0MjN4L2NzNDIzNi5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgpAQCAtNzUsMTAgKzc1LDEwIEBACiAKICNpZmRlZiBDUzQyMzIKICNkZWZpbmUgSURFTlQgIkNTNDIzMiIKLSNkZWZpbmUgQ1M0MjNYX0RSSVZFUiAic25kX2NzNDIzMiIKKyNkZWZpbmUgREVWX05BTUUgImNzNDIzMiIKICNlbHNlCiAjZGVmaW5lIElERU5UICJDUzQyMzYrIgotI2RlZmluZSBDUzQyM1hfRFJJVkVSICJzbmRfY3M0MjM2IgorI2RlZmluZSBERVZfTkFNRSAiY3M0MjM2IgogI2VuZGlmCiAKIHN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCkBAIC0xMjYsMTQgKzEyNiwxMiBAQAogbW9kdWxlX3BhcmFtX2FycmF5KGRtYTIsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRtYTIsICJETUEyICMgZm9yICIgSURFTlQgIiBkcml2ZXIuIik7CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwbGF0Zm9ybV9kZXZpY2VzW1NORFJWX0NBUkRTXTsKICNpZmRlZiBDT05GSUdfUE5QCiBzdGF0aWMgaW50IHBucGNfcmVnaXN0ZXJlZDsKICNpZmRlZiBDUzQyMzIKIHN0YXRpYyBpbnQgcG5wX3JlZ2lzdGVyZWQ7CiAjZW5kaWYKICNlbmRpZiAvKiBDT05GSUdfUE5QICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNuZF9jczQyM3hfZGV2aWNlczsKIAogc3RydWN0IHNuZF9jYXJkX2NzNDIzNiB7CiAJc3RydWN0IHNuZF9jczQyMzEgKmNoaXA7CkBAIC01NDIsMzggKzU0MCw1NSBAQAogCXJldHVybiBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc25kX2NzNDIzeF9ub25wbnBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jczQyM3hfaXNhX21hdGNoKHN0cnVjdCBkZXZpY2UgKnBkZXYsCisJCQkJCSAgdW5zaWduZWQgaW50IGRldikKIHsKLQlpbnQgZGV2ID0gcGRldi0+aWQ7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCWludCBlcnI7CisJaWYgKCFlbmFibGVbZGV2XSB8fCBpc19pc2FwbnBfc2VsZWN0ZWQoZGV2KSkKKwkJcmV0dXJuIDA7CiAKIAlpZiAocG9ydFtkZXZdID09IFNORFJWX0FVVE9fUE9SVCkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJzcGVjaWZ5IHBvcnRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IHBsZWFzZSBzcGVjaWZ5IHBvcnRcbiIsIHBkZXYtPmJ1c19pZCk7CisJCXJldHVybiAwOwogCX0KIAlpZiAoY3BvcnRbZGV2XSA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAic3BlY2lmeSBjcG9ydFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogcGxlYXNlIHNwZWNpZnkgY3BvcnRcbiIsIHBkZXYtPmJ1c19pZCk7CisJCXJldHVybiAwOwogCX0KKwlpZiAoaXJxW2Rldl0gPT0gU05EUlZfQVVUT19JUlEpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IHBsZWFzZSBzcGVjaWZ5IGlycVxuIiwgcGRldi0+YnVzX2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChkbWExW2Rldl0gPT0gU05EUlZfQVVUT19ETUEpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IHBsZWFzZSBzcGVjaWZ5IGRtYTFcbiIsIHBkZXYtPmJ1c19pZCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2NzNDIzeF9pc2FfcHJvYmUoc3RydWN0IGRldmljZSAqcGRldiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgZGV2KQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlpbnQgZXJyOwogCiAJY2FyZCA9IHNuZF9jczQyM3hfY2FyZF9uZXcoZGV2KTsKIAlpZiAoISBjYXJkKQogCQlyZXR1cm4gLUVOT01FTTsKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAJaWYgKChlcnIgPSBzbmRfY3M0MjN4X3Byb2JlKGNhcmQsIGRldikpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCWRldl9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc25kX2NzNDIzeF9ub25wbnBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9jczQyM3hfaXNhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpwZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgZGV2KQogewotCXNuZF9jYXJkX2ZyZWUocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2cHRyKSk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBOVUxMKTsKKwlzbmRfY2FyZF9mcmVlKGRldl9nZXRfZHJ2ZGF0YShwZGV2KSk7CisJZGV2X3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCXJldHVybiAwOwogfQogCkBAIC01OTQsMjYgKzYwOSwyOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNuZF9jczQyM3hfbm9ucG5wX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHNuZF9jczQyM3hfaXNhX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbiwKKwkJCQkgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlyZXR1cm4gc25kX2NzNDIzeF9zdXNwZW5kKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldikpOworCXJldHVybiBzbmRfY3M0MjN4X3N1c3BlbmQoZGV2X2dldF9kcnZkYXRhKGRldikpOwogfQogCi1zdGF0aWMgaW50IHNuZF9jczQyM3hfbm9ucG5wX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNuZF9jczQyM3hfaXNhX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewotCXJldHVybiBzbmRfY3M0MjN4X3Jlc3VtZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlyZXR1cm4gc25kX2NzNDIzeF9yZXN1bWUoZGV2X2dldF9kcnZkYXRhKGRldikpOwogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNzNDIzeF9ub25wbnBfZHJpdmVyID0gewotCS5wcm9iZQkJPSBzbmRfY3M0MjN4X25vbnBucF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9jczQyM3hfbm9ucG5wX3JlbW92ZSksCitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgY3M0MjN4X2lzYV9kcml2ZXIgPSB7CisJLm1hdGNoCQk9IHNuZF9jczQyM3hfaXNhX21hdGNoLAorCS5wcm9iZQkJPSBzbmRfY3M0MjN4X2lzYV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9jczQyM3hfaXNhX3JlbW92ZSksCiAjaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSBzbmRfY3M0MjN4X25vbnBucF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gc25kX2NzNDIzeF9ub25wbnBfcmVzdW1lLAorCS5zdXNwZW5kCT0gc25kX2NzNDIzeF9pc2Ffc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNuZF9jczQyM3hfaXNhX3Jlc3VtZSwKICNlbmRpZgogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9IENTNDIzWF9EUklWRVIKKwkJLm5hbWUJPSBERVZfTkFNRQogCX0sCiB9OwogCkBAIC02NTEsNyArNjY4LDYgQEAKIAl9CiAJcG5wX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOwogCWRldisrOwotCXNuZF9jczQyM3hfZGV2aWNlcysrOwogCXJldHVybiAwOwogfQogCkBAIC03MTUsNyArNzMxLDYgQEAKIAl9CiAJcG5wX3NldF9jYXJkX2RydmRhdGEocGNhcmQsIGNhcmQpOwogCWRldisrOwotCXNuZF9jczQyM3hfZGV2aWNlcysrOwogCXJldHVybiAwOwogfQogCkBAIC03NTAsNDUgKzc2NSwxMyBAQAogfTsKICNlbmRpZiAvKiBDT05GSUdfUE5QICovCiAKLXN0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUgc25kX2NzNDIzeF91bnJlZ2lzdGVyX2FsbCh2b2lkKQotewotCWludCBpOwotCi0jaWZkZWYgQ09ORklHX1BOUAotCWlmIChwbnBjX3JlZ2lzdGVyZWQpCi0JCXBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKCZjczQyM3hfcG5wY19kcml2ZXIpOwotI2lmZGVmIENTNDIzMgotCWlmIChwbnBfcmVnaXN0ZXJlZCkKLQkJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZjczQyMzJfcG5wX2RyaXZlcik7Ci0jZW5kaWYKLSNlbmRpZiAvKiBDT05GSUdfUE5QICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2aWNlcyk7ICsraSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGxhdGZvcm1fZGV2aWNlc1tpXSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNzNDIzeF9ub25wbnBfZHJpdmVyKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX2NzNDIzeF9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGVycjsKKwlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNzNDIzeF9ub25wbnBfZHJpdmVyKSkgPCAwKQorCWVyciA9IGlzYV9yZWdpc3Rlcl9kcml2ZXIoJmNzNDIzeF9pc2FfZHJpdmVyLCBTTkRSVl9DQVJEUyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7IGkrKykgewotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7Ci0JCWlmICghIGVuYWJsZVtpXSB8fCBpc19pc2FwbnBfc2VsZWN0ZWQoaSkpCi0JCQljb250aW51ZTsKLQkJZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShDUzQyM1hfRFJJVkVSLAotCQkJCQkJCSBpLCBOVUxMLCAwKTsKLQkJaWYgKElTX0VSUihkZXZpY2UpKQotCQkJY29udGludWU7Ci0JCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXBsYXRmb3JtX2RldmljZXNbaV0gPSBkZXZpY2U7Ci0JCXNuZF9jczQyM3hfZGV2aWNlcysrOwotCX0KICNpZmRlZiBDT05GSUdfUE5QCiAjaWZkZWYgQ1M0MjMyCiAJZXJyID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmY3M0MjMyX3BucF9kcml2ZXIpOwpAQCAtNzk5LDIwICs3ODIsMjAgQEAKIAlpZiAoIWVycikKIAkJcG5wY19yZWdpc3RlcmVkID0gMTsKICNlbmRpZiAvKiBDT05GSUdfUE5QICovCi0KLQlpZiAoIXNuZF9jczQyM3hfZGV2aWNlcykgewotI2lmZGVmIE1PRFVMRQotCQlwcmludGsoS0VSTl9FUlIgSURFTlQgIiBzb3VuZGNhcmQgbm90IGZvdW5kIG9yIGRldmljZSBidXN5XG4iKTsKLSNlbmRpZgotCQlzbmRfY3M0MjN4X3VucmVnaXN0ZXJfYWxsKCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9jczQyM3hfZXhpdCh2b2lkKQogewotCXNuZF9jczQyM3hfdW5yZWdpc3Rlcl9hbGwoKTsKKyNpZmRlZiBDT05GSUdfUE5QCisJaWYgKHBucGNfcmVnaXN0ZXJlZCkKKwkJcG5wX3VucmVnaXN0ZXJfY2FyZF9kcml2ZXIoJmNzNDIzeF9wbnBjX2RyaXZlcik7CisjaWZkZWYgQ1M0MjMyCisJaWYgKHBucF9yZWdpc3RlcmVkKQorCQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJmNzNDIzMl9wbnBfZHJpdmVyKTsKKyNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KKwlpc2FfdW5yZWdpc3Rlcl9kcml2ZXIoJmNzNDIzeF9pc2FfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoYWxzYV9jYXJkX2NzNDIzeF9pbml0KQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2VzMTY4OC9lczE2ODguYyBiL3NvdW5kL2lzYS9lczE2ODgvZXMxNjg4LmMKaW5kZXggNjVmOTdmZi4uZWRjMzk4NyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2VzMTY4OC9lczE2ODguYworKysgYi9zb3VuZC9pc2EvZXMxNjg4L2VzMTY4OC5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KQEAgLTM1LDggKzM1LDExIEBACiAjZGVmaW5lIFNORFJWX0xFR0FDWV9GSU5EX0ZSRUVfRE1BCiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCisjZGVmaW5lIENSRF9OQU1FICJHZW5lcmljIEVTUyBFUzE2ODgvRVM2ODggQXVkaW9Ecml2ZSIKKyNkZWZpbmUgREVWX05BTUUgImVzMTY4OCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKENSRF9OQU1FKTsKIE1PRFVMRV9BVVRIT1IoIkphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRVNTIEVTeDY4OCBBdWRpb0RyaXZlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tFU1MsRVM2ODggUG5QIEF1ZGlvRHJpdmUscG5wOkVTUzAxMDB9LCIKIAkgICAgICAgICJ7RVNTLEVTMTY4OCBQblAgQXVkaW9Ecml2ZSxwbnA6RVNTMDEwMn0sIgpAQCAtNTMsMTg5ICs1NiwxNTcgQEAKIHN0YXRpYyBpbnQgZG1hOFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0RNQTsJLyogMCwxLDMgKi8KIAogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBFU3g2ODggc291bmRjYXJkLiIpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciAiIENSRF9OQU1FICIgc291bmRjYXJkLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGlkLCBjaGFycCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBFU3g2ODggc291bmRjYXJkLiIpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgIiBDUkRfTkFNRSAiIHNvdW5kY2FyZC4iKTsKIG1vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgRVN4Njg4IHNvdW5kY2FyZC4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICIgQ1JEX05BTUUgIiBzb3VuZGNhcmQuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkocG9ydCwgbG9uZywgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJQb3J0ICMgZm9yIEVTeDY4OCBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJQb3J0ICMgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkobXB1X3BvcnQsIGxvbmcsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhtcHVfcG9ydCwgIk1QVS00MDEgcG9ydCAjIGZvciBFU3g2ODggZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhtcHVfcG9ydCwgIk1QVS00MDEgcG9ydCAjIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRICMgZm9yIEVTeDY4OCBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSAjIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KG1wdV9pcnEsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1wdV9pcnEsICJNUFUtNDAxIElSUSAjIGZvciBFU3g2ODggZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhtcHVfaXJxLCAiTVBVLTQwMSBJUlEgIyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlci4iKTsKIG1vZHVsZV9wYXJhbV9hcnJheShkbWE4LCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkbWE4LCAiOC1iaXQgRE1BICMgZm9yIEVTeDY4OCBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKGRtYTgsICI4LWJpdCBETUEgIyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlci4iKTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbU05EUlZfQ0FSRFNdOwotCi0jZGVmaW5lIFBGWAkiZXMxNjg4OiAiCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lczE2ODhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lczE2ODhfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbikKIHsKLQlpbnQgZGV2ID0gcGRldi0+aWQ7CisJcmV0dXJuIGVuYWJsZVtuXTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2VzMTY4OF9sZWdhY3lfY3JlYXRlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgCisJCXN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4sIHN0cnVjdCBzbmRfZXMxNjg4ICoqcmNoaXApCit7CisJc3RhdGljIGxvbmcgcG9zc2libGVfcG9ydHNbXSA9IHsweDIyMCwgMHgyNDAsIDB4MjYwfTsKIAlzdGF0aWMgaW50IHBvc3NpYmxlX2lycXNbXSA9IHs1LCA5LCAxMCwgNywgLTF9OwogCXN0YXRpYyBpbnQgcG9zc2libGVfZG1hc1tdID0gezEsIDMsIDAsIC0xfTsKLQlpbnQgeGlycSwgeGRtYSwgeG1wdV9pcnE7CisKKwlpbnQgaSwgZXJyb3I7CisKKwlpZiAoaXJxW25dID09IFNORFJWX0FVVE9fSVJRKSB7CisJCWlycVtuXSA9IHNuZF9sZWdhY3lfZmluZF9mcmVlX2lycShwb3NzaWJsZV9pcnFzKTsKKwkJaWYgKGlycVtuXSA8IDApIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZmluZCBhIGZyZWUgSVJRXG4iLAorCQkJCWRldi0+YnVzX2lkKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJaWYgKGRtYThbbl0gPT0gU05EUlZfQVVUT19ETUEpIHsKKwkJZG1hOFtuXSA9IHNuZF9sZWdhY3lfZmluZF9mcmVlX2RtYShwb3NzaWJsZV9kbWFzKTsKKwkJaWYgKGRtYThbbl0gPCAwKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGZpbmQgYSBmcmVlIERNQVxuIiwKKwkJCQlkZXYtPmJ1c19pZCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJaWYgKHBvcnRbbl0gIT0gU05EUlZfQVVUT19QT1JUKQorCQlyZXR1cm4gc25kX2VzMTY4OF9jcmVhdGUoY2FyZCwgcG9ydFtuXSwgbXB1X3BvcnRbbl0sIGlycVtuXSwKKwkJCQltcHVfaXJxW25dLCBkbWE4W25dLCBFUzE2ODhfSFdfQVVUTywgcmNoaXApOworCisJaSA9IDA7CisJZG8geworCQlwb3J0W25dID0gcG9zc2libGVfcG9ydHNbaV07CisJCWVycm9yID0gc25kX2VzMTY4OF9jcmVhdGUoY2FyZCwgcG9ydFtuXSwgbXB1X3BvcnRbbl0sIGlycVtuXSwKKwkJCQltcHVfaXJxW25dLCBkbWE4W25dLCBFUzE2ODhfSFdfQVVUTywgcmNoaXApOworCX0gd2hpbGUgKGVycm9yIDwgMCAmJiArK2kgPCBBUlJBWV9TSVpFKHBvc3NpYmxlX3BvcnRzKSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lczE2ODhfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbikKK3sKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9lczE2ODggKmNoaXA7CiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCXN0cnVjdCBzbmRfcGNtICpwY207Ci0JaW50IGVycjsKKwlpbnQgZXJyb3I7CiAKLQljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKLQlpZiAoY2FyZCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIDApOworCWlmICghY2FyZCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQl4aXJxID0gaXJxW2Rldl07Ci0JaWYgKHhpcnEgPT0gU05EUlZfQVVUT19JUlEpIHsKLQkJaWYgKCh4aXJxID0gc25kX2xlZ2FjeV9maW5kX2ZyZWVfaXJxKHBvc3NpYmxlX2lycXMpKSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gZmluZCBhIGZyZWUgSVJRXG4iKTsKLQkJCWVyciA9IC1FQlVTWTsKLQkJCWdvdG8gX2VycjsKLQkJfQotCX0KLQl4bXB1X2lycSA9IG1wdV9pcnFbZGV2XTsKLQl4ZG1hID0gZG1hOFtkZXZdOwotCWlmICh4ZG1hID09IFNORFJWX0FVVE9fRE1BKSB7Ci0JCWlmICgoeGRtYSA9IHNuZF9sZWdhY3lfZmluZF9mcmVlX2RtYShwb3NzaWJsZV9kbWFzKSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGZpbmQgYSBmcmVlIERNQVxuIik7Ci0JCQllcnIgPSAtRUJVU1k7Ci0JCQlnb3RvIF9lcnI7Ci0JCX0KLQl9CisJZXJyb3IgPSBzbmRfZXMxNjg4X2xlZ2FjeV9jcmVhdGUoY2FyZCwgZGV2LCBuLCAmY2hpcCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlpZiAocG9ydFtkZXZdICE9IFNORFJWX0FVVE9fUE9SVCkgewotCQlpZiAoKGVyciA9IHNuZF9lczE2ODhfY3JlYXRlKGNhcmQsIHBvcnRbZGV2XSwgbXB1X3BvcnRbZGV2XSwKLQkJCQkJICAgICB4aXJxLCB4bXB1X2lycSwgeGRtYSwKLQkJCQkJICAgICBFUzE2ODhfSFdfQVVUTywgJmNoaXApKSA8IDApCi0JCQlnb3RvIF9lcnI7Ci0JfSBlbHNlIHsKLQkJLyogYXV0by1wcm9iZSBsZWdhY3kgcG9ydHMgKi8KLQkJc3RhdGljIHVuc2lnbmVkIGxvbmcgcG9zc2libGVfcG9ydHNbXSA9IHsKLQkJCTB4MjIwLCAweDI0MCwgMHgyNjAsCi0JCX07Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3NzaWJsZV9wb3J0cyk7IGkrKykgewotCQkJZXJyID0gc25kX2VzMTY4OF9jcmVhdGUoY2FyZCwgcG9zc2libGVfcG9ydHNbaV0sCi0JCQkJCQltcHVfcG9ydFtkZXZdLAotCQkJCQkJeGlycSwgeG1wdV9pcnEsIHhkbWEsCi0JCQkJCQlFUzE2ODhfSFdfQVVUTywgJmNoaXApOwotCQkJaWYgKGVyciA+PSAwKSB7Ci0JCQkJcG9ydFtkZXZdID0gcG9zc2libGVfcG9ydHNbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGkgPj0gQVJSQVlfU0laRShwb3NzaWJsZV9wb3J0cykpCi0JCQlnb3RvIF9lcnI7Ci0JfQorCWVycm9yID0gc25kX2VzMTY4OF9wY20oY2hpcCwgMCwgJnBjbSk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlpZiAoKGVyciA9IHNuZF9lczE2ODhfcGNtKGNoaXAsIDAsICZwY20pKSA8IDApCi0JCWdvdG8gX2VycjsKLQotCWlmICgoZXJyID0gc25kX2VzMTY4OF9taXhlcihjaGlwKSkgPCAwKQotCQlnb3RvIF9lcnI7CisJZXJyb3IgPSBzbmRfZXMxNjg4X21peGVyKGNoaXApOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OwogCiAJc3RyY3B5KGNhcmQtPmRyaXZlciwgIkVTMTY4OCIpOwogCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsIHBjbS0+bmFtZSk7Ci0Jc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWksIGRtYSAlaSIsIHBjbS0+bmFtZSwgY2hpcC0+cG9ydCwgeGlycSwgeGRtYSk7CisJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWksIGRtYSAlaSIsIHBjbS0+bmFtZSwKKwkJY2hpcC0+cG9ydCwgY2hpcC0+aXJxLCBjaGlwLT5kbWE4KTsKIAotCWlmICgoc25kX29wbDNfY3JlYXRlKGNhcmQsIGNoaXAtPnBvcnQsIGNoaXAtPnBvcnQgKyAyLCBPUEwzX0hXX09QTDMsIDAsICZvcGwzKSkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJvcGwzIG5vdCBkZXRlY3RlZCBhdCAweCVseFxuIiwgY2hpcC0+cG9ydCk7Ci0JfSBlbHNlIHsKLQkJaWYgKChlcnIgPSBzbmRfb3BsM19od2RlcF9uZXcob3BsMywgMCwgMSwgTlVMTCkpIDwgMCkKLQkJCWdvdG8gX2VycjsKKwlpZiAoc25kX29wbDNfY3JlYXRlKGNhcmQsIGNoaXAtPnBvcnQsIGNoaXAtPnBvcnQgKyAyLAorCQkJT1BMM19IV19PUEwzLCAwLCAmb3BsMykgPCAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogb3BsMyBub3QgZGV0ZWN0ZWQgYXQgMHglbHhcbiIsCisJCQlkZXYtPmJ1c19pZCwgY2hpcC0+cG9ydCk7CisJZWxzZSB7CisJCWVycm9yID0Jc25kX29wbDNfaHdkZXBfbmV3KG9wbDMsIDAsIDEsIE5VTEwpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHhtcHVfaXJxID49IDAgJiYgeG1wdV9pcnEgIT0gU05EUlZfQVVUT19JUlEgJiYgY2hpcC0+bXB1X3BvcnQgPiAwKSB7Ci0JCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfRVMxNjg4LAotCQkJCQkgICAgICAgY2hpcC0+bXB1X3BvcnQsIDAsCi0JCQkJCSAgICAgICB4bXB1X2lycSwKLQkJCQkJICAgICAgIElSUUZfRElTQUJMRUQsCi0JCQkJCSAgICAgICBOVUxMKSkgPCAwKQotCQkJZ290byBfZXJyOworCWlmIChtcHVfaXJxW25dID49IDAgJiYgbXB1X2lycVtuXSAhPSBTTkRSVl9BVVRPX0lSUSAmJgorCQkJY2hpcC0+bXB1X3BvcnQgPiAwKSB7CisJCWVycm9yID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfRVMxNjg4LAorCQkJCWNoaXAtPm1wdV9wb3J0LCAwLAorCQkJCW1wdV9pcnFbbl0sIElSUUZfRElTQUJMRUQsIE5VTEwpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldik7CiAKLQlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCi0JCWdvdG8gX2VycjsKKwllcnJvciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgY2FyZCk7CiAJcmV0dXJuIDA7CiAKLSBfZXJyOgotCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Ci0JcmV0dXJuIGVycjsKK291dDoJc25kX2NhcmRfZnJlZShjYXJkKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9lczE2ODhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9lczE2ODhfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4pCiB7Ci0Jc25kX2NhcmRfZnJlZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOworCXNuZF9jYXJkX2ZyZWUoZGV2X2dldF9kcnZkYXRhKGRldikpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIEVTMTY4OF9EUklWRVIJInNuZF9lczE2ODgiCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZF9lczE2ODhfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBpc2FfZHJpdmVyIHNuZF9lczE2ODhfZHJpdmVyID0geworCS5tYXRjaAkJPSBzbmRfZXMxNjg4X21hdGNoLAogCS5wcm9iZQkJPSBzbmRfZXMxNjg4X3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc25kX2VzMTY4OF9yZW1vdmUpLAotCS8qIEZJWE1FOiBzdXNwZW5kL3Jlc3VtZSAqLworCS5yZW1vdmUJCT0gc25kX2VzMTY4OF9yZW1vdmUsCisjaWYgMAkvKiBGSVhNRSAqLworCS5zdXNwZW5kCT0gc25kX2VzMTY4OF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc25kX2VzMTY4OF9yZXN1bWUsCisjZW5kaWYKIAkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSBFUzE2ODhfRFJJVkVSCi0JfSwKKwkJLm5hbWUJPSBERVZfTkFNRQorCX0KIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUgc25kX2VzMTY4OF91bnJlZ2lzdGVyX2FsbCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlcyk7ICsraSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlc1tpXSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZF9lczE2ODhfZHJpdmVyKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX2VzMTY4OF9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGNhcmRzLCBlcnI7Ci0KLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9lczE2ODhfZHJpdmVyKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWNhcmRzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7IGkrKykgewotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7Ci0JCWlmICghIGVuYWJsZVtpXSkKLQkJCWNvbnRpbnVlOwotCQlkZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKEVTMTY4OF9EUklWRVIsCi0JCQkJCQkJIGksIE5VTEwsIDApOwotCQlpZiAoSVNfRVJSKGRldmljZSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCFwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZpY2UpKSB7Ci0JCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkZXZpY2UpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZGV2aWNlc1tpXSA9IGRldmljZTsKLQkJY2FyZHMrKzsKLQl9Ci0JaWYgKCFjYXJkcykgewotI2lmZGVmIE1PRFVMRQotCQlwcmludGsoS0VSTl9FUlIgIkVTUyBBdWRpb0RyaXZlIEVTMTY4OCBzb3VuZGNhcmQgbm90IGZvdW5kIG9yIGRldmljZSBidXN5XG4iKTsKLSNlbmRpZgotCQlzbmRfZXMxNjg4X3VucmVnaXN0ZXJfYWxsKCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gaXNhX3JlZ2lzdGVyX2RyaXZlcigmc25kX2VzMTY4OF9kcml2ZXIsIFNORFJWX0NBUkRTKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9lczE2ODhfZXhpdCh2b2lkKQogewotCXNuZF9lczE2ODhfdW5yZWdpc3Rlcl9hbGwoKTsKKwlpc2FfdW5yZWdpc3Rlcl9kcml2ZXIoJnNuZF9lczE2ODhfZHJpdmVyKTsKIH0KIAotbW9kdWxlX2luaXQoYWxzYV9jYXJkX2VzMTY4OF9pbml0KQotbW9kdWxlX2V4aXQoYWxzYV9jYXJkX2VzMTY4OF9leGl0KQorbW9kdWxlX2luaXQoYWxzYV9jYXJkX2VzMTY4OF9pbml0KTsKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9lczE2ODhfZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZXMxOHh4LmMgYi9zb3VuZC9pc2EvZXMxOHh4LmMKaW5kZXggNzI1YzExNS4uZDJhOWM3ZCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2VzMTh4eC5jCisrKyBiL3NvdW5kL2lzYS9lczE4eHguYwpAQCAtODAsNyArODAsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CkBAIC0yMDM1LDggKzIwMzUsNiBAQAogbW9kdWxlX3BhcmFtX2FycmF5KGRtYTIsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRtYTIsICJETUEgMiAjIGZvciBFUzE4eHggZHJpdmVyLiIpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tTTkRSVl9DQVJEU107Ci0KICNpZmRlZiBDT05GSUdfUE5QCiBzdGF0aWMgaW50IHBucF9yZWdpc3RlcmVkLCBwbnBjX3JlZ2lzdGVyZWQ7CiAKQEAgLTIyMzcsNyArMjIzNSwxMiBAQAogCXJldHVybiBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgc25kX2VzMTh4eF9ub25wbnBfcHJvYmUxKGludCBkZXYsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lczE4eHhfaXNhX21hdGNoKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBkZXYpCit7CisJcmV0dXJuIGVuYWJsZVtkZXZdICYmICFpc19pc2FwbnBfc2VsZWN0ZWQoZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2VzMTh4eF9pc2FfcHJvYmUxKGludCBkZXYsIHN0cnVjdCBkZXZpY2UgKmRldnB0cikKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKQEAgLTIyNDUsMTggKzIyNDgsMTcgQEAKIAljYXJkID0gc25kX2VzMTh4eF9jYXJkX25ldyhkZXYpOwogCWlmICghIGNhcmQpCiAJCXJldHVybiAtRU5PTUVNOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJmRldnB0ci0+ZGV2KTsKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIGRldnB0cik7CiAJaWYgKChlcnIgPSBzbmRfYXVkaW9kcml2ZV9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBjYXJkKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2cHRyLCBjYXJkKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgc25kX2VzMTh4eF9ub25wbnBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9lczE4eHhfaXNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBkZXYpCiB7Ci0JaW50IGRldiA9IHBkZXYtPmlkOwogCWludCBlcnI7CiAJc3RhdGljIGludCBwb3NzaWJsZV9pcnFzW10gPSB7NSwgOSwgMTAsIDcsIDExLCAxMiwgLTF9OwogCXN0YXRpYyBpbnQgcG9zc2libGVfZG1hc1tdID0gezEsIDAsIDMsIDUsIC0xfTsKQEAgLTIyODEsMTMgKzIyODMsMTMgQEAKIAl9CiAKIAlpZiAocG9ydFtkZXZdICE9IFNORFJWX0FVVE9fUE9SVCkgewotCQlyZXR1cm4gc25kX2VzMTh4eF9ub25wbnBfcHJvYmUxKGRldiwgcGRldik7CisJCXJldHVybiBzbmRfZXMxOHh4X2lzYV9wcm9iZTEoZGV2LCBwZGV2KTsKIAl9IGVsc2UgewogCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBwb3NzaWJsZV9wb3J0c1tdID0gezB4MjIwLCAweDI0MCwgMHgyNjAsIDB4MjgwfTsKIAkJaW50IGk7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvc3NpYmxlX3BvcnRzKTsgaSsrKSB7CiAJCQlwb3J0W2Rldl0gPSBwb3NzaWJsZV9wb3J0c1tpXTsKLQkJCWVyciA9IHNuZF9lczE4eHhfbm9ucG5wX3Byb2JlMShkZXYsIHBkZXYpOworCQkJZXJyID0gc25kX2VzMTh4eF9pc2FfcHJvYmUxKGRldiwgcGRldik7CiAJCQlpZiAoISBlcnIpCiAJCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTIyOTUsNDMgKzIyOTcsNDQgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9lczE4eHhfbm9ucG5wX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZwdHIpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmRfZXMxOHh4X2lzYV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2cHRyLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgZGV2KQogewotCXNuZF9jYXJkX2ZyZWUocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2cHRyKSk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBOVUxMKTsKKwlzbmRfY2FyZF9mcmVlKGRldl9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2cHRyLCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBzbmRfZXMxOHh4X25vbnBucF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBzbmRfZXMxOHh4X2lzYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4sCisJCQkJICBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JcmV0dXJuIHNuZF9lczE4eHhfc3VzcGVuZChwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpLCBzdGF0ZSk7CisJcmV0dXJuIHNuZF9lczE4eHhfc3VzcGVuZChkZXZfZ2V0X2RydmRhdGEoZGV2KSwgc3RhdGUpOwogfQogCi1zdGF0aWMgaW50IHNuZF9lczE4eHhfbm9ucG5wX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNuZF9lczE4eHhfaXNhX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewotCXJldHVybiBzbmRfZXMxOHh4X3Jlc3VtZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlyZXR1cm4gc25kX2VzMTh4eF9yZXN1bWUoZGV2X2dldF9kcnZkYXRhKGRldikpOwogfQogI2VuZGlmCiAKLSNkZWZpbmUgRVMxOFhYX0RSSVZFUgkic25kX2VzMTh4eCIKKyNkZWZpbmUgREVWX05BTUUgImVzMTh4eCIKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX2VzMTh4eF9ub25wbnBfZHJpdmVyID0gewotCS5wcm9iZQkJPSBzbmRfZXMxOHh4X25vbnBucF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9lczE4eHhfbm9ucG5wX3JlbW92ZSksCitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgc25kX2VzMTh4eF9pc2FfZHJpdmVyID0geworCS5tYXRjaAkJPSBzbmRfZXMxOHh4X2lzYV9tYXRjaCwKKwkucHJvYmUJCT0gc25kX2VzMTh4eF9pc2FfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzbmRfZXMxOHh4X2lzYV9yZW1vdmUpLAogI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gc25kX2VzMTh4eF9ub25wbnBfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNuZF9lczE4eHhfbm9ucG5wX3Jlc3VtZSwKKwkuc3VzcGVuZAk9IHNuZF9lczE4eHhfaXNhX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzbmRfZXMxOHh4X2lzYV9yZXN1bWUsCiAjZW5kaWYKIAkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSBFUzE4WFhfRFJJVkVSCisJCS5uYW1lCT0gREVWX05BTUUKIAl9LAogfTsKIAogCiAjaWZkZWYgQ09ORklHX1BOUAotc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXRkYXRhIGVzMTh4eF9wbnBfZGV2aWNlczsKLQogc3RhdGljIGludCBfX2RldmluaXQgc25kX2F1ZGlvZHJpdmVfcG5wX2RldGVjdChzdHJ1Y3QgcG5wX2RldiAqcGRldiwKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICppZCkKIHsKQEAgLTIzNjIsNyArMjM2NSw2IEBACiAJfQogCXBucF9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKIAlkZXYrKzsKLQllczE4eHhfcG5wX2RldmljZXMrKzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQyNCw3ICsyNDI2LDYgQEAKIAogCXBucF9zZXRfY2FyZF9kcnZkYXRhKHBjYXJkLCBjYXJkKTsKIAlkZXYrKzsKLQllczE4eHhfcG5wX2RldmljZXMrKzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQ2MCw0NCArMjQ2MSwxNCBAQAogfTsKICNlbmRpZiAvKiBDT05GSUdfUE5QICovCiAKLXN0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUgc25kX2VzMTh4eF91bnJlZ2lzdGVyX2FsbCh2b2lkKQotewotCWludCBpOwotCi0jaWZkZWYgQ09ORklHX1BOUAotCWlmIChwbnBjX3JlZ2lzdGVyZWQpCi0JCXBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKCZlczE4eHhfcG5wY19kcml2ZXIpOwotCWlmIChwbnBfcmVnaXN0ZXJlZCkKLQkJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZlczE4eHhfcG5wX2RyaXZlcik7Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKTsgKytpKQotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwbGF0Zm9ybV9kZXZpY2VzW2ldKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kX2VzMTh4eF9ub25wbnBfZHJpdmVyKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX2VzMTh4eF9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGVyciwgY2FyZHMgPSAwOworCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kX2VzMTh4eF9ub25wbnBfZHJpdmVyKSkgPCAwKQorCWVyciA9IGlzYV9yZWdpc3Rlcl9kcml2ZXIoJnNuZF9lczE4eHhfaXNhX2RyaXZlciwgU05EUlZfQ0FSRFMpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKLQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOwotCQlpZiAoISBlbmFibGVbaV0gfHwgaXNfaXNhcG5wX3NlbGVjdGVkKGkpKQotCQkJY29udGludWU7Ci0JCWRldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRVMxOFhYX0RSSVZFUiwKLQkJCQkJCQkgaSwgTlVMTCwgMCk7Ci0JCWlmIChJU19FUlIoZGV2aWNlKSkKLQkgICAgICAgCQljb250aW51ZTsKLQkJaWYgKCFwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZpY2UpKSB7Ci0JCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkZXZpY2UpOwotCQkJY29udGludWU7Ci0JCX0KLQkJcGxhdGZvcm1fZGV2aWNlc1tpXSA9IGRldmljZTsKLQkJY2FyZHMrKzsKLQl9Ci0KICNpZmRlZiBDT05GSUdfUE5QCiAJZXJyID0gcG5wX3JlZ2lzdGVyX2RyaXZlcigmZXMxOHh4X3BucF9kcml2ZXIpOwogCWlmICghZXJyKQpAQCAtMjUwNSwyMiArMjQ3NiwxOSBAQAogCWVyciA9IHBucF9yZWdpc3Rlcl9jYXJkX2RyaXZlcigmZXMxOHh4X3BucGNfZHJpdmVyKTsKIAlpZiAoIWVycikKIAkJcG5wY19yZWdpc3RlcmVkID0gMTsKLQljYXJkcyArPSBlczE4eHhfcG5wX2RldmljZXM7CiAjZW5kaWYKLQotCWlmKCFjYXJkcykgewotI2lmZGVmIE1PRFVMRQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJFU1MgQXVkaW9Ecml2ZSBFUzE4eHggc291bmRjYXJkIG5vdCBmb3VuZCBvciBkZXZpY2UgYnVzeVxuIik7Ci0jZW5kaWYKLQkJc25kX2VzMTh4eF91bnJlZ2lzdGVyX2FsbCgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfZXMxOHh4X2V4aXQodm9pZCkKIHsKLQlzbmRfZXMxOHh4X3VucmVnaXN0ZXJfYWxsKCk7CisjaWZkZWYgQ09ORklHX1BOUAorCWlmIChwbnBjX3JlZ2lzdGVyZWQpCisJCXBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKCZlczE4eHhfcG5wY19kcml2ZXIpOworCWlmIChwbnBfcmVnaXN0ZXJlZCkKKwkJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZlczE4eHhfcG5wX2RyaXZlcik7CisjZW5kaWYKKwlpc2FfdW5yZWdpc3Rlcl9kcml2ZXIoJnNuZF9lczE4eHhfaXNhX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGFsc2FfY2FyZF9lczE4eHhfaW5pdCkKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzY2xhc3NpYy5jIGIvc291bmQvaXNhL2d1cy9ndXNjbGFzc2ljLmMKaW5kZXggMDM5NWUyZS4uOGYyM2Y0MyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2d1cy9ndXNjbGFzc2ljLmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNjbGFzc2ljLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KQEAgLTMzLDggKzMzLDExIEBACiAjZGVmaW5lIFNORFJWX0xFR0FDWV9GSU5EX0ZSRUVfRE1BCiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogCisjZGVmaW5lIENSRF9OQU1FICJHcmF2aXMgVWx0cmFTb3VuZCBDbGFzc2ljIgorI2RlZmluZSBERVZfTkFNRSAiZ3VzY2xhc3NpYyIKKworTU9EVUxFX0RFU0NSSVBUSU9OKENSRF9OQU1FKTsKIE1PRFVMRV9BVVRIT1IoIkphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiR3JhdmlzIFVsdHJhU291bmQgQ2xhc3NpYyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7R3JhdmlzLFVsdHJhU291bmQgQ2xhc3NpY319Iik7CiAKQEAgLTUxLDMyICs1NCw4MCBAQAogc3RhdGljIGludCBwY21fY2hhbm5lbHNbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAyfTsKIAogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBHVVMgQ2xhc3NpYyBzb3VuZGNhcmQuIik7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yICIgQ1JEX05BTUUgIiBzb3VuZGNhcmQuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIEdVUyBDbGFzc2ljIHNvdW5kY2FyZC4iKTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yICIgQ1JEX05BTUUgIiBzb3VuZGNhcmQuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIEdVUyBDbGFzc2ljIHNvdW5kY2FyZC4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICIgQ1JEX05BTUUgIiBzb3VuZGNhcmQuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkocG9ydCwgbG9uZywgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJQb3J0ICMgZm9yIEdVUyBDbGFzc2ljIGRyaXZlci4iKTsKK01PRFVMRV9QQVJNX0RFU0MocG9ydCwgIlBvcnQgIyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlci4iKTsKIG1vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSAjIGZvciBHVVMgQ2xhc3NpYyBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSAjIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGRtYTEsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRtYTEsICJETUExICMgZm9yIEdVUyBDbGFzc2ljIGRyaXZlci4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hMSwgIkRNQTEgIyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlci4iKTsKIG1vZHVsZV9wYXJhbV9hcnJheShkbWEyLCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkbWEyLCAiRE1BMiAjIGZvciBHVVMgQ2xhc3NpYyBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKGRtYTIsICJETUEyICMgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoam95c3RpY2tfZGFjLCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhqb3lzdGlja19kYWMsICJKb3lzdGljayBEQUMgbGV2ZWwgMC41OVYtNC41MlYgb3IgMC4zODlWLTIuOThWIGZvciBHVVMgQ2xhc3NpYyBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKGpveXN0aWNrX2RhYywgIkpveXN0aWNrIERBQyBsZXZlbCAwLjU5Vi00LjUyViBvciAwLjM4OVYtMi45OFYgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoY2hhbm5lbHMsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNoYW5uZWxzLCAiR0YxIGNoYW5uZWxzIGZvciBHVVMgQ2xhc3NpYyBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKGNoYW5uZWxzLCAiR0YxIGNoYW5uZWxzIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KHBjbV9jaGFubmVscywgaW50LCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocGNtX2NoYW5uZWxzLCAiUmVzZXJ2ZWQgUENNIGNoYW5uZWxzIGZvciBHVVMgQ2xhc3NpYyBkcml2ZXIuIik7CitNT0RVTEVfUEFSTV9ERVNDKHBjbV9jaGFubmVscywgIlJlc2VydmVkIFBDTSBjaGFubmVscyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlci4iKTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZXNbU05EUlZfQ0FSRFNdOworc3RhdGljIGludCBfX2RldmluaXQgc25kX2d1c2NsYXNzaWNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbikKK3sKKwlyZXR1cm4gZW5hYmxlW25dOworfQogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZ3VzY2xhc3NpY19jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLAorCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuLCBzdHJ1Y3Qgc25kX2d1c19jYXJkICoqcmd1cykKK3sKKwlzdGF0aWMgbG9uZyBwb3NzaWJsZV9wb3J0c1tdID0gezB4MjIwLCAweDIzMCwgMHgyNDAsIDB4MjUwLCAweDI2MH07CisJc3RhdGljIGludCBwb3NzaWJsZV9pcnFzW10gPSB7NSwgMTEsIDEyLCA5LCA3LCAxNSwgMywgNCwgLTF9OworCXN0YXRpYyBpbnQgcG9zc2libGVfZG1hc1tdID0gezUsIDYsIDcsIDEsIDMsIC0xfTsKIAotI2RlZmluZSBQRlgJImd1c2NsYXNzaWM6ICIKKwlpbnQgaSwgZXJyb3I7CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9ndXNjbGFzc2ljX2RldGVjdChzdHJ1Y3Qgc25kX2d1c19jYXJkICogZ3VzKQorCWlmIChpcnFbbl0gPT0gU05EUlZfQVVUT19JUlEpIHsKKwkJaXJxW25dID0gc25kX2xlZ2FjeV9maW5kX2ZyZWVfaXJxKHBvc3NpYmxlX2lycXMpOworCQlpZiAoaXJxW25dIDwgMCkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBmaW5kIGEgZnJlZSBJUlFcbiIsCisJCQkJZGV2LT5idXNfaWQpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwlpZiAoZG1hMVtuXSA9PSBTTkRSVl9BVVRPX0RNQSkgeworCQlkbWExW25dID0gc25kX2xlZ2FjeV9maW5kX2ZyZWVfZG1hKHBvc3NpYmxlX2RtYXMpOworCQlpZiAoZG1hMVtuXSA8IDApIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gZmluZCBhIGZyZWUgRE1BMVxuIiwKKwkJCQlkZXYtPmJ1c19pZCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCWlmIChkbWEyW25dID09IFNORFJWX0FVVE9fRE1BKSB7CisJCWRtYTJbbl0gPSBzbmRfbGVnYWN5X2ZpbmRfZnJlZV9kbWEocG9zc2libGVfZG1hcyk7CisJCWlmIChkbWEyW25dIDwgMCkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBmaW5kIGEgZnJlZSBETUEyXG4iLAorCQkJCWRldi0+YnVzX2lkKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwlpZiAocG9ydFtuXSAhPSBTTkRSVl9BVVRPX1BPUlQpCisJCXJldHVybiBzbmRfZ3VzX2NyZWF0ZShjYXJkLCBwb3J0W25dLCBpcnFbbl0sIGRtYTFbbl0sIGRtYTJbbl0sCisJCQkJMCwgY2hhbm5lbHNbbl0sIHBjbV9jaGFubmVsc1tuXSwgMCwgcmd1cyk7CisKKwlpID0gMDsKKwlkbyB7CisJCXBvcnRbbl0gPSBwb3NzaWJsZV9wb3J0c1tpXTsKKwkJZXJyb3IgPSBzbmRfZ3VzX2NyZWF0ZShjYXJkLCBwb3J0W25dLCBpcnFbbl0sIGRtYTFbbl0sIGRtYTJbbl0sCisJCQkJMCwgY2hhbm5lbHNbbl0sIHBjbV9jaGFubmVsc1tuXSwgMCwgcmd1cyk7CisJfSB3aGlsZSAoZXJyb3IgPCAwICYmICsraSA8IEFSUkFZX1NJWkUocG9zc2libGVfcG9ydHMpKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2d1c2NsYXNzaWNfZGV0ZWN0KHN0cnVjdCBzbmRfZ3VzX2NhcmQgKmd1cykKIHsKIAl1bnNpZ25lZCBjaGFyIGQ7CiAKQEAgLTk1LDE4NyArMTQ2LDEwNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgc25kX2d1c2NsYXNzaWNfaW5pdChpbnQgZGV2LCBzdHJ1Y3Qgc25kX2d1c19jYXJkICogZ3VzKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX2d1c2NsYXNzaWNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbikKIHsKLQlndXMtPmVxdWFsX2lycSA9IDA7Ci0JZ3VzLT5jb2RlY19mbGFnID0gMDsKLQlndXMtPm1heF9mbGFnID0gMDsKLQlndXMtPmpveXN0aWNrX2RhYyA9IGpveXN0aWNrX2RhY1tkZXZdOwotfQotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZ3VzY2xhc3NpY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCBkZXYgPSBwZGV2LT5pZDsKLQlzdGF0aWMgaW50IHBvc3NpYmxlX2lycXNbXSA9IHs1LCAxMSwgMTIsIDksIDcsIDE1LCAzLCA0LCAtMX07Ci0Jc3RhdGljIGludCBwb3NzaWJsZV9kbWFzW10gPSB7NSwgNiwgNywgMSwgMywgLTF9OwotCWludCB4aXJxLCB4ZG1hMSwgeGRtYTI7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBzbmRfZ3VzX2NhcmQgKmd1cyA9IE5VTEw7Ci0JaW50IGVycjsKKwlzdHJ1Y3Qgc25kX2d1c19jYXJkICpndXM7CisJaW50IGVycm9yOwogCi0JY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7Ci0JaWYgKGNhcmQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKHBjbV9jaGFubmVsc1tkZXZdIDwgMikKLQkJcGNtX2NoYW5uZWxzW2Rldl0gPSAyOworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbbl0sIGlkW25dLCBUSElTX01PRFVMRSwgMCk7CisJaWYgKCFjYXJkKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCXhpcnEgPSBpcnFbZGV2XTsKLQlpZiAoeGlycSA9PSBTTkRSVl9BVVRPX0lSUSkgewotCQlpZiAoKHhpcnEgPSBzbmRfbGVnYWN5X2ZpbmRfZnJlZV9pcnEocG9zc2libGVfaXJxcykpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBmaW5kIGEgZnJlZSBJUlFcbiIpOwotCQkJZXJyID0gLUVCVVNZOwotCQkJZ290byBfZXJyOwotCQl9Ci0JfQotCXhkbWExID0gZG1hMVtkZXZdOwotCWlmICh4ZG1hMSA9PSBTTkRSVl9BVVRPX0RNQSkgewotCQlpZiAoKHhkbWExID0gc25kX2xlZ2FjeV9maW5kX2ZyZWVfZG1hKHBvc3NpYmxlX2RtYXMpKSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gZmluZCBhIGZyZWUgRE1BMVxuIik7Ci0JCQllcnIgPSAtRUJVU1k7Ci0JCQlnb3RvIF9lcnI7Ci0JCX0KLQl9Ci0JeGRtYTIgPSBkbWEyW2Rldl07Ci0JaWYgKHhkbWEyID09IFNORFJWX0FVVE9fRE1BKSB7Ci0JCWlmICgoeGRtYTIgPSBzbmRfbGVnYWN5X2ZpbmRfZnJlZV9kbWEocG9zc2libGVfZG1hcykpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBmaW5kIGEgZnJlZSBETUEyXG4iKTsKLQkJCWVyciA9IC1FQlVTWTsKLQkJCWdvdG8gX2VycjsKLQkJfQotCX0KKwlpZiAocGNtX2NoYW5uZWxzW25dIDwgMikKKwkJcGNtX2NoYW5uZWxzW25dID0gMjsKIAotCWlmIChwb3J0W2Rldl0gIT0gU05EUlZfQVVUT19QT1JUKSB7Ci0JCWVyciA9IHNuZF9ndXNfY3JlYXRlKGNhcmQsCi0JCQkJICAgICBwb3J0W2Rldl0sCi0JCQkJICAgICB4aXJxLCB4ZG1hMSwgeGRtYTIsCi0JCQkJICAgICAwLCBjaGFubmVsc1tkZXZdLCBwY21fY2hhbm5lbHNbZGV2XSwKLQkJCQkgICAgIDAsICZndXMpOwotCX0gZWxzZSB7Ci0JCS8qIGF1dG8tcHJvYmUgbGVnYWN5IHBvcnRzICovCi0JCXN0YXRpYyB1bnNpZ25lZCBsb25nIHBvc3NpYmxlX3BvcnRzW10gPSB7Ci0JCQkweDIyMCwgMHgyMzAsIDB4MjQwLCAweDI1MCwgMHgyNjAsCi0JCX07Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3NzaWJsZV9wb3J0cyk7IGkrKykgewotCQkJZXJyID0gc25kX2d1c19jcmVhdGUoY2FyZCwKLQkJCQkJICAgICBwb3NzaWJsZV9wb3J0c1tpXSwKLQkJCQkJICAgICB4aXJxLCB4ZG1hMSwgeGRtYTIsCi0JCQkJCSAgICAgMCwgY2hhbm5lbHNbZGV2XSwgcGNtX2NoYW5uZWxzW2Rldl0sCi0JCQkJCSAgICAgMCwgJmd1cyk7Ci0JCQlpZiAoZXJyID49IDApIHsKLQkJCQlwb3J0W2Rldl0gPSBwb3NzaWJsZV9wb3J0c1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAoZXJyIDwgMCkKLQkJZ290byBfZXJyOworCWVycm9yID0gc25kX2d1c2NsYXNzaWNfY3JlYXRlKGNhcmQsIGRldiwgbiwgJmd1cyk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlpZiAoKGVyciA9IHNuZF9ndXNjbGFzc2ljX2RldGVjdChndXMpKSA8IDApCi0JCWdvdG8gX2VycjsKKwllcnJvciA9IHNuZF9ndXNjbGFzc2ljX2RldGVjdChndXMpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OwogCi0Jc25kX2d1c2NsYXNzaWNfaW5pdChkZXYsIGd1cyk7Ci0JaWYgKChlcnIgPSBzbmRfZ3VzX2luaXRpYWxpemUoZ3VzKSkgPCAwKQotCQlnb3RvIF9lcnI7CisJZ3VzLT5qb3lzdGlja19kYWMgPSBqb3lzdGlja19kYWNbbl07CiAKKwllcnJvciA9IHNuZF9ndXNfaW5pdGlhbGl6ZShndXMpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRU5PREVWOwogCWlmIChndXMtPm1heF9mbGFnIHx8IGd1cy0+ZXNzX2ZsYWcpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggIkdVUyBDbGFzc2ljIG9yIEFDRSBzb3VuZGNhcmQgd2FzIG5vdCBkZXRlY3RlZCBhdCAweCVseFxuIiwgZ3VzLT5nZjEucG9ydCk7Ci0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gX2VycjsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IEdVUyBDbGFzc2ljIG9yIEFDRSBzb3VuZGNhcmQgd2FzICIKKwkJCSJub3QgZGV0ZWN0ZWQgYXQgMHglbHhcbiIsIGRldi0+YnVzX2lkLCBndXMtPmdmMS5wb3J0KTsKKwkJZ290byBvdXQ7CiAJfQogCi0JaWYgKChlcnIgPSBzbmRfZ2YxX25ld19taXhlcihndXMpKSA8IDApCi0JCWdvdG8gX2VycjsKKwllcnJvciA9IHNuZF9nZjFfbmV3X21peGVyKGd1cyk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlpZiAoKGVyciA9IHNuZF9nZjFfcGNtX25ldyhndXMsIDAsIDAsIE5VTEwpKSA8IDApCi0JCWdvdG8gX2VycjsKKwllcnJvciA9IHNuZF9nZjFfcGNtX25ldyhndXMsIDAsIDAsIE5VTEwpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OwogCiAJaWYgKCFndXMtPmFjZV9mbGFnKSB7Ci0JCWlmICgoZXJyID0gc25kX2dmMV9yYXdtaWRpX25ldyhndXMsIDAsIE5VTEwpKSA8IDApCi0JCQlnb3RvIF9lcnI7CisJCWVycm9yID0gc25kX2dmMV9yYXdtaWRpX25ldyhndXMsIDAsIE5VTEwpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CiAJfQotCXNwcmludGYoY2FyZC0+bG9uZ25hbWUgKyBzdHJsZW4oY2FyZC0+bG9uZ25hbWUpLCAiIGF0IDB4JWx4LCBpcnEgJWQsIGRtYSAlZCIsIGd1cy0+Z2YxLnBvcnQsIHhpcnEsIHhkbWExKTsKLQlpZiAoeGRtYTIgPj0gMCkKLQkJc3ByaW50ZihjYXJkLT5sb25nbmFtZSArIHN0cmxlbihjYXJkLT5sb25nbmFtZSksICImJWQiLCB4ZG1hMik7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUgKyBzdHJsZW4oY2FyZC0+bG9uZ25hbWUpLAorCQkiIGF0IDB4JWx4LCBpcnEgJWQsIGRtYSAlZCIsCisJCWd1cy0+Z2YxLnBvcnQsIGd1cy0+Z2YxLmlycSwgZ3VzLT5nZjEuZG1hMSk7CiAKLQlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCi0JCWdvdG8gX2VycjsKKwlpZiAoZ3VzLT5nZjEuZG1hMiA+PSAwKQorCQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lICsgc3RybGVuKGNhcmQtPmxvbmduYW1lKSwKKwkJCSImJWQiLCBndXMtPmdmMS5kbWEyKTsKIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKKworCWVycm9yID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBjYXJkKTsKIAlyZXR1cm4gMDsKIAotIF9lcnI6Ci0Jc25kX2NhcmRfZnJlZShjYXJkKTsKLQlyZXR1cm4gZXJyOworb3V0OglzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiBlcnJvcjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc25kX2d1c2NsYXNzaWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9ndXNjbGFzc2ljX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewotCXNuZF9jYXJkX2ZyZWUocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2cHRyKSk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBOVUxMKTsKKwlzbmRfY2FyZF9mcmVlKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBHVVNDTEFTU0lDX0RSSVZFUgkic25kX2d1c2NsYXNzaWMiCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZF9ndXNjbGFzc2ljX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBzbmRfZ3VzY2xhc3NpY19kcml2ZXIgPSB7CisJLm1hdGNoCQk9IHNuZF9ndXNjbGFzc2ljX21hdGNoLAogCS5wcm9iZQkJPSBzbmRfZ3VzY2xhc3NpY19wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9ndXNjbGFzc2ljX3JlbW92ZSksCi0JLyogRklYTUU6IHN1c3BlbmQvcmVzdW1lICovCisjaWYgMAkvKiBGSVhNRSAqLworCS5zdXNwZW5kCT0gc25kX2d1c2NsYXNzaWNfc3VzcGVuZCwKKwkucmVtb3ZlCQk9IHNuZF9ndXNjbGFzc2ljX3JlbW92ZSwKKyNlbmRpZgogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9IEdVU0NMQVNTSUNfRFJJVkVSCi0JfSwKKwkJLm5hbWUJPSBERVZfTkFNRQorCX0KIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUgc25kX2d1c2NsYXNzaWNfdW5yZWdpc3Rlcl9hbGwodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldmljZXMpOyArK2kpCi0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZXNbaV0pOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfZ3VzY2xhc3NpY19kcml2ZXIpOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfZ3VzY2xhc3NpY19pbml0KHZvaWQpCiB7Ci0JaW50IGksIGNhcmRzLCBlcnI7Ci0KLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9ndXNjbGFzc2ljX2RyaXZlcik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQljYXJkcyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKLQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOwotCQlpZiAoISBlbmFibGVbaV0pCi0JCQljb250aW51ZTsKLQkJZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShHVVNDTEFTU0lDX0RSSVZFUiwKLQkJCQkJCQkgaSwgTlVMTCwgMCk7Ci0JCWlmIChJU19FUlIoZGV2aWNlKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIXBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpIHsKLQkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlkZXZpY2VzW2ldID0gZGV2aWNlOwotCQljYXJkcysrOwotCX0KLQlpZiAoIWNhcmRzKSB7Ci0jaWZkZWYgTU9EVUxFCi0JCXByaW50ayhLRVJOX0VSUiAiR1VTIENsYXNzaWMgc291bmRjYXJkIG5vdCBmb3VuZCBvciBkZXZpY2UgYnVzeVxuIik7Ci0jZW5kaWYKLQkJc25kX2d1c2NsYXNzaWNfdW5yZWdpc3Rlcl9hbGwoKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiAwOworCXJldHVybiBpc2FfcmVnaXN0ZXJfZHJpdmVyKCZzbmRfZ3VzY2xhc3NpY19kcml2ZXIsIFNORFJWX0NBUkRTKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9ndXNjbGFzc2ljX2V4aXQodm9pZCkKIHsKLQlzbmRfZ3VzY2xhc3NpY191bnJlZ2lzdGVyX2FsbCgpOworCWlzYV91bnJlZ2lzdGVyX2RyaXZlcigmc25kX2d1c2NsYXNzaWNfZHJpdmVyKTsKIH0KIAotbW9kdWxlX2luaXQoYWxzYV9jYXJkX2d1c2NsYXNzaWNfaW5pdCkKLW1vZHVsZV9leGl0KGFsc2FfY2FyZF9ndXNjbGFzc2ljX2V4aXQpCittb2R1bGVfaW5pdChhbHNhX2NhcmRfZ3VzY2xhc3NpY19pbml0KTsKK21vZHVsZV9leGl0KGFsc2FfY2FyZF9ndXNjbGFzc2ljX2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9ndXNleHRyZW1lLmMgYi9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYwppbmRleCA0ZjU1ZmMzLi4wYWVhYTZjIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYworKysgYi9zb3VuZC9pc2EvZ3VzL2d1c2V4dHJlbWUuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pc2EuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgpAQCAtMzcsOCArMzcsMTEgQEAKICNkZWZpbmUgU05EUlZfTEVHQUNZX0ZJTkRfRlJFRV9ETUEKICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAKKyNkZWZpbmUgQ1JEX05BTUUgIkdyYXZpcyBVbHRyYVNvdW5kIEV4dHJlbWUiCisjZGVmaW5lIERFVl9OQU1FICJndXNleHRyZW1lIgorCitNT0RVTEVfREVTQ1JJUFRJT04oQ1JEX05BTUUpOwogTU9EVUxFX0FVVEhPUigiSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJHcmF2aXMgVWx0cmFTb3VuZCBFeHRyZW1lIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tHcmF2aXMsVWx0cmFTb3VuZCBFeHRyZW1lfX0iKTsKIApAQCAtNTksNDMgKzYyLDEwNyBAQAogc3RhdGljIGludCBwY21fY2hhbm5lbHNbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAyfTsKIAogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBHVVMgRXh0cmVtZSBzb3VuZGNhcmQuIik7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yICIgQ1JEX05BTUUgIiBzb3VuZGNhcmQuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoaWQsIGNoYXJwLCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIEdVUyBFeHRyZW1lIHNvdW5kY2FyZC4iKTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yICIgQ1JEX05BTUUgIiBzb3VuZGNhcmQuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlIEdVUyBFeHRyZW1lIHNvdW5kY2FyZC4iKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICIgQ1JEX05BTUUgIiBzb3VuZGNhcmQuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkocG9ydCwgbG9uZywgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJQb3J0ICMgZm9yIEdVUyBFeHRyZW1lIGRyaXZlci4iKTsKK01PRFVMRV9QQVJNX0RFU0MocG9ydCwgIlBvcnQgIyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlci4iKTsKIG1vZHVsZV9wYXJhbV9hcnJheShnZjFfcG9ydCwgbG9uZywgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGdmMV9wb3J0LCAiR0YxIHBvcnQgIyBmb3IgR1VTIEV4dHJlbWUgZHJpdmVyIChvcHRpb25hbCkuIik7CitNT0RVTEVfUEFSTV9ERVNDKGdmMV9wb3J0LCAiR0YxIHBvcnQgIyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlciAob3B0aW9uYWwpLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KG1wdV9wb3J0LCBsb25nLCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobXB1X3BvcnQsICJNUFUtNDAxIHBvcnQgIyBmb3IgR1VTIEV4dHJlbWUgZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhtcHVfcG9ydCwgIk1QVS00MDEgcG9ydCAjIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGlycSwgaW50LCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRICMgZm9yIEdVUyBFeHRyZW1lIGRyaXZlci4iKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCAiSVJRICMgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkobXB1X2lycSwgaW50LCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobXB1X2lycSwgIk1QVS00MDEgSVJRICMgZm9yIEdVUyBFeHRyZW1lIGRyaXZlci4iKTsKK01PRFVMRV9QQVJNX0RFU0MobXB1X2lycSwgIk1QVS00MDEgSVJRICMgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoZ2YxX2lycSwgaW50LCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZ2YxX2lycSwgIkdGMSBJUlEgIyBmb3IgR1VTIEV4dHJlbWUgZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhnZjFfaXJxLCAiR0YxIElSUSAjIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGRtYTgsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRtYTgsICI4LWJpdCBETUEgIyBmb3IgR1VTIEV4dHJlbWUgZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhkbWE4LCAiOC1iaXQgRE1BICMgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiBtb2R1bGVfcGFyYW1fYXJyYXkoZG1hMSwgaW50LCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZG1hMSwgIkdGMSBETUEgIyBmb3IgR1VTIEV4dHJlbWUgZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhkbWExLCAiR0YxIERNQSAjIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGpveXN0aWNrX2RhYywgaW50LCBOVUxMLCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0Moam95c3RpY2tfZGFjLCAiSm95c3RpY2sgREFDIGxldmVsIDAuNTlWLTQuNTJWIG9yIDAuMzg5Vi0yLjk4ViBmb3IgR1VTIEV4dHJlbWUgZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhqb3lzdGlja19kYWMsICJKb3lzdGljayBEQUMgbGV2ZWwgMC41OVYtNC41MlYgb3IgMC4zODlWLTIuOThWIGZvciAiIENSRF9OQU1FICIgZHJpdmVyLiIpOwogbW9kdWxlX3BhcmFtX2FycmF5KGNoYW5uZWxzLCBpbnQsIE5VTEwsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhjaGFubmVscywgIkdGMSBjaGFubmVscyBmb3IgR1VTIEV4dHJlbWUgZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhjaGFubmVscywgIkdGMSBjaGFubmVscyBmb3IgIiBDUkRfTkFNRSAiIGRyaXZlci4iKTsKIG1vZHVsZV9wYXJhbV9hcnJheShwY21fY2hhbm5lbHMsIGludCwgTlVMTCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHBjbV9jaGFubmVscywgIlJlc2VydmVkIFBDTSBjaGFubmVscyBmb3IgR1VTIEV4dHJlbWUgZHJpdmVyLiIpOworTU9EVUxFX1BBUk1fREVTQyhwY21fY2hhbm5lbHMsICJSZXNlcnZlZCBQQ00gY2hhbm5lbHMgZm9yICIgQ1JEX05BTUUgIiBkcml2ZXIuIik7CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW1NORFJWX0NBUkRTXTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9ndXNleHRyZW1lX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4pCit7CisJcmV0dXJuIGVuYWJsZVtuXTsKK30KIAorc3RhdGljIGludCBfX2RldmluaXQgc25kX2d1c2V4dHJlbWVfZXMxNjg4X2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCisJCXN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4sIHN0cnVjdCBzbmRfZXMxNjg4ICoqcmNoaXApCit7CisJc3RhdGljIGxvbmcgcG9zc2libGVfcG9ydHNbXSA9IHsweDIyMCwgMHgyNDAsIDB4MjYwfTsKKwlzdGF0aWMgaW50IHBvc3NpYmxlX2lycXNbXSA9IHs1LCA5LCAxMCwgNywgLTF9OworCXN0YXRpYyBpbnQgcG9zc2libGVfZG1hc1tdID0gezEsIDMsIDAsIC0xfTsKIAotI2RlZmluZSBQRlgJImd1c2V4dHJlbWU6ICIKKwlpbnQgaSwgZXJyb3I7CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9ndXNleHRyZW1lX2RldGVjdChpbnQgZGV2LAotCQkJCQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCQkJCXN0cnVjdCBzbmRfZ3VzX2NhcmQgKiBndXMsCi0JCQkJCXN0cnVjdCBzbmRfZXMxNjg4ICplczE2ODgpCisJaWYgKGlycVtuXSA9PSBTTkRSVl9BVVRPX0lSUSkgeworCQlpcnFbbl0gPSBzbmRfbGVnYWN5X2ZpbmRfZnJlZV9pcnEocG9zc2libGVfaXJxcyk7CisJCWlmIChpcnFbbl0gPCAwKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGZpbmQgYSBmcmVlIElSUSAiCisJCQkJImZvciBFUzE2ODhcbiIsIGRldi0+YnVzX2lkKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJaWYgKGRtYThbbl0gPT0gU05EUlZfQVVUT19ETUEpIHsKKwkJZG1hOFtuXSA9IHNuZF9sZWdhY3lfZmluZF9mcmVlX2RtYShwb3NzaWJsZV9kbWFzKTsKKwkJaWYgKGRtYThbbl0gPCAwKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGZpbmQgYSBmcmVlIERNQSAiCisJCQkJImZvciBFUzE2ODhcbiIsIGRldi0+YnVzX2lkKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwlpZiAocG9ydFtuXSAhPSBTTkRSVl9BVVRPX1BPUlQpCisJCXJldHVybiBzbmRfZXMxNjg4X2NyZWF0ZShjYXJkLCBwb3J0W25dLCBtcHVfcG9ydFtuXSwgaXJxW25dLAorCQkJCW1wdV9pcnFbbl0sIGRtYThbbl0sIEVTMTY4OF9IV18xNjg4LCByY2hpcCk7CisKKwlpID0gMDsKKwlkbyB7CisJCXBvcnRbbl0gPSBwb3NzaWJsZV9wb3J0c1tpXTsKKwkJZXJyb3IgPSBzbmRfZXMxNjg4X2NyZWF0ZShjYXJkLCBwb3J0W25dLCBtcHVfcG9ydFtuXSwgaXJxW25dLAorCQkJCW1wdV9pcnFbbl0sIGRtYThbbl0sIEVTMTY4OF9IV18xNjg4LCByY2hpcCk7CisJfSB3aGlsZSAoZXJyb3IgPCAwICYmICsraSA8IEFSUkFZX1NJWkUocG9zc2libGVfcG9ydHMpKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2d1c2V4dHJlbWVfZ3VzX2NhcmRfY3JlYXRlKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKKwkJc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbiwgc3RydWN0IHNuZF9ndXNfY2FyZCAqKnJndXMpCit7CisJc3RhdGljIGludCBwb3NzaWJsZV9pcnFzW10gPSB7MTEsIDEyLCAxNSwgOSwgNSwgNywgMywgLTF9OworCXN0YXRpYyBpbnQgcG9zc2libGVfZG1hc1tdID0gezUsIDYsIDcsIDMsIDEsIC0xfTsKKworCWlmIChnZjFfaXJxW25dID09IFNORFJWX0FVVE9fSVJRKSB7CisJCWdmMV9pcnFbbl0gPSBzbmRfbGVnYWN5X2ZpbmRfZnJlZV9pcnEocG9zc2libGVfaXJxcyk7CisJCWlmIChnZjFfaXJxW25dIDwgMCkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBmaW5kIGEgZnJlZSBJUlEgIgorCQkJCSJmb3IgR0YxXG4iLCBkZXYtPmJ1c19pZCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCWlmIChkbWExW25dID09IFNORFJWX0FVVE9fRE1BKSB7CisJCWRtYTFbbl0gPSBzbmRfbGVnYWN5X2ZpbmRfZnJlZV9kbWEocG9zc2libGVfZG1hcyk7CisJCWlmIChkbWExW25dIDwgMCkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byBmaW5kIGEgZnJlZSBETUEgIgorCQkJCSJmb3IgR0YxXG4iLCBkZXYtPmJ1c19pZCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCXJldHVybiBzbmRfZ3VzX2NyZWF0ZShjYXJkLCBnZjFfcG9ydFtuXSwgZ2YxX2lycVtuXSwgZG1hMVtuXSwgLTEsCisJCQkwLCBjaGFubmVsc1tuXSwgcGNtX2NoYW5uZWxzW25dLCAwLCByZ3VzKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX2d1c2V4dHJlbWVfZGV0ZWN0KHN0cnVjdCBzbmRfZ3VzX2NhcmQgKmd1cywKKwlzdHJ1Y3Qgc25kX2VzMTY4OCAqZXMxNjg4KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciBkOwpAQCAtMTE3LDEyICsxODQsMTMgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXMxNjg4LT5taXhlcl9sb2NrLCBmbGFncyk7CiAJc25kX2VzMTY4OF9taXhlcl93cml0ZShlczE2ODgsIDB4NDAsIDB4MGIpOwkvKiBkb24ndCBjaGFuZ2UhISEgKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlczE2ODgtPm1peGVyX2xvY2ssIGZsYWdzKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZlczE2ODgtPnJlZ19sb2NrLCBmbGFncyk7Ci0Jb3V0YihnZjFfcG9ydFtkZXZdICYgMHgwNDAgPyAyIDogMCwgRVMxNjg4UChlczE2ODgsIElOSVQxKSk7CisJb3V0YihndXMtPmdmMS5wb3J0ICYgMHgwNDAgPyAyIDogMCwgRVMxNjg4UChlczE2ODgsIElOSVQxKSk7CiAJb3V0YigwLCAweDIwMSk7Ci0Jb3V0YihnZjFfcG9ydFtkZXZdICYgMHgwMjAgPyAyIDogMCwgRVMxNjg4UChlczE2ODgsIElOSVQxKSk7CisJb3V0YihndXMtPmdmMS5wb3J0ICYgMHgwMjAgPyAyIDogMCwgRVMxNjg4UChlczE2ODgsIElOSVQxKSk7CiAJb3V0YigwLCAweDIwMSk7Ci0Jb3V0YihnZjFfcG9ydFtkZXZdICYgMHgwMTAgPyAzIDogMSwgRVMxNjg4UChlczE2ODgsIElOSVQxKSk7CisJb3V0YihndXMtPmdmMS5wb3J0ICYgMHgwMTAgPyAzIDogMSwgRVMxNjg4UChlczE2ODgsIElOSVQxKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXMxNjg4LT5yZWdfbG9jaywgZmxhZ3MpOwogCiAJdWRlbGF5KDEwMCk7CkBAIC0xMzksMjUzICsyMDcsMTcyIEBACiAJCXNuZF9wcmludGRkKCJbMHglbHhdIGNoZWNrIDIgZmFpbGVkIC0gMHgleFxuIiwgZ3VzLT5nZjEucG9ydCwgZCk7CiAJCXJldHVybiAtRUlPOwogCX0KLQlyZXR1cm4gMDsKLX0KIAotc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9ndXNleHRyZW1lX2luaXQoaW50IGRldiwgc3RydWN0IHNuZF9ndXNfY2FyZCAqIGd1cykKLXsKLQlndXMtPmpveXN0aWNrX2RhYyA9IGpveXN0aWNrX2RhY1tkZXZdOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZ3VzZXh0cmVtZV9taXhlcihzdHJ1Y3Qgc25kX2VzMTY4OCAqY2hpcCkKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjaGlwLT5jYXJkOwogCXN0cnVjdCBzbmRfY3RsX2VsZW1faWQgaWQxLCBpZDI7Ci0JaW50IGVycjsKKwlpbnQgZXJyb3I7CiAKIAltZW1zZXQoJmlkMSwgMCwgc2l6ZW9mKGlkMSkpOwogCW1lbXNldCgmaWQyLCAwLCBzaXplb2YoaWQyKSk7CiAJaWQxLmlmYWNlID0gaWQyLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVI7CisKIAkvKiByZWFzc2lnbiBBVVggdG8gU1lOVEhFU0laRVIgKi8KIAlzdHJjcHkoaWQxLm5hbWUsICJBdXggUGxheWJhY2sgVm9sdW1lIik7CiAJc3RyY3B5KGlkMi5uYW1lLCAiU3ludGggUGxheWJhY2sgVm9sdW1lIik7Ci0JaWYgKChlcnIgPSBzbmRfY3RsX3JlbmFtZV9pZChjYXJkLCAmaWQxLCAmaWQyKSkgPCAwKQotCQlyZXR1cm4gZXJyOworCWVycm9yID0gc25kX2N0bF9yZW5hbWVfaWQoY2FyZCwgJmlkMSwgJmlkMik7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCiAJLyogcmVhc3NpZ24gTWFzdGVyIFBsYXliYWNrIFN3aXRjaCB0byBTeW50aCBQbGF5YmFjayBTd2l0Y2ggKi8KIAlzdHJjcHkoaWQxLm5hbWUsICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIik7CiAJc3RyY3B5KGlkMi5uYW1lLCAiU3ludGggUGxheWJhY2sgU3dpdGNoIik7Ci0JaWYgKChlcnIgPSBzbmRfY3RsX3JlbmFtZV9pZChjYXJkLCAmaWQxLCAmaWQyKSkgPCAwKQotCQlyZXR1cm4gZXJyOworCWVycm9yID0gc25kX2N0bF9yZW5hbWVfaWQoY2FyZCwgJmlkMSwgJmlkMik7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9ndXNleHRyZW1lX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZ3VzZXh0cmVtZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewotCWludCBkZXYgPSBwZGV2LT5pZDsKLQlzdGF0aWMgaW50IHBvc3NpYmxlX2Vzc19pcnFzW10gPSB7NSwgOSwgMTAsIDcsIC0xfTsKLQlzdGF0aWMgaW50IHBvc3NpYmxlX2Vzc19kbWFzW10gPSB7MSwgMywgMCwgLTF9OwotCXN0YXRpYyBpbnQgcG9zc2libGVfZ2YxX2lycXNbXSA9IHs1LCAxMSwgMTIsIDksIDcsIDE1LCAzLCAtMX07Ci0Jc3RhdGljIGludCBwb3NzaWJsZV9nZjFfZG1hc1tdID0gezUsIDYsIDcsIDEsIDMsIC0xfTsKLQlpbnQgeGdmMV9pcnEsIHhnZjFfZG1hLCB4ZXNzX2lycSwgeG1wdV9pcnEsIHhlc3NfZG1hOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX2d1c19jYXJkICpndXM7CiAJc3RydWN0IHNuZF9lczE2ODggKmVzMTY4ODsKIAlzdHJ1Y3Qgc25kX29wbDMgKm9wbDM7Ci0JaW50IGVycjsKKwlpbnQgZXJyb3I7CiAKLQljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldl0sIGlkW2Rldl0sIFRISVNfTU9EVUxFLCAwKTsKLQlpZiAoY2FyZCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W25dLCBpZFtuXSwgVEhJU19NT0RVTEUsIDApOworCWlmICghY2FyZCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQl4Z2YxX2lycSA9IGdmMV9pcnFbZGV2XTsKLQlpZiAoeGdmMV9pcnEgPT0gU05EUlZfQVVUT19JUlEpIHsKLQkJaWYgKCh4Z2YxX2lycSA9IHNuZF9sZWdhY3lfZmluZF9mcmVlX2lycShwb3NzaWJsZV9nZjFfaXJxcykpIDwgMCkgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBmaW5kIGEgZnJlZSBJUlEgZm9yIEdGMVxuIik7Ci0JCQllcnIgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQl4ZXNzX2lycSA9IGlycVtkZXZdOwotCWlmICh4ZXNzX2lycSA9PSBTTkRSVl9BVVRPX0lSUSkgewotCQlpZiAoKHhlc3NfaXJxID0gc25kX2xlZ2FjeV9maW5kX2ZyZWVfaXJxKHBvc3NpYmxlX2Vzc19pcnFzKSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGZpbmQgYSBmcmVlIElSUSBmb3IgRVMxNjg4XG4iKTsKLQkJCWVyciA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCWlmIChtcHVfcG9ydFtkZXZdID09IFNORFJWX0FVVE9fUE9SVCkKLQkJbXB1X3BvcnRbZGV2XSA9IDA7Ci0JeG1wdV9pcnEgPSBtcHVfaXJxW2Rldl07Ci0JaWYgKHhtcHVfaXJxID4gMTUpCi0JCXhtcHVfaXJxID0gLTE7Ci0JeGdmMV9kbWEgPSBkbWExW2Rldl07Ci0JaWYgKHhnZjFfZG1hID09IFNORFJWX0FVVE9fRE1BKSB7Ci0JCWlmICgoeGdmMV9kbWEgPSBzbmRfbGVnYWN5X2ZpbmRfZnJlZV9kbWEocG9zc2libGVfZ2YxX2RtYXMpKSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gZmluZCBhIGZyZWUgRE1BIGZvciBHRjFcbiIpOwotCQkJZXJyID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0JeGVzc19kbWEgPSBkbWE4W2Rldl07Ci0JaWYgKHhlc3NfZG1hID09IFNORFJWX0FVVE9fRE1BKSB7Ci0JCWlmICgoeGVzc19kbWEgPSBzbmRfbGVnYWN5X2ZpbmRfZnJlZV9kbWEocG9zc2libGVfZXNzX2RtYXMpKSA8IDApIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gZmluZCBhIGZyZWUgRE1BIGZvciBFUzE2ODhcbiIpOwotCQkJZXJyID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9CisJaWYgKG1wdV9wb3J0W25dID09IFNORFJWX0FVVE9fUE9SVCkKKwkJbXB1X3BvcnRbbl0gPSAwOwogCi0JaWYgKHBvcnRbZGV2XSAhPSBTTkRSVl9BVVRPX1BPUlQpIHsKLQkJZXJyID0gc25kX2VzMTY4OF9jcmVhdGUoY2FyZCwgcG9ydFtkZXZdLCBtcHVfcG9ydFtkZXZdLAotCQkJCQl4ZXNzX2lycSwgeG1wdV9pcnEsIHhlc3NfZG1hLAotCQkJCQlFUzE2ODhfSFdfMTY4OCwgJmVzMTY4OCk7Ci0JfSBlbHNlIHsKLQkJLyogYXV0by1wcm9iZSBsZWdhY3kgcG9ydHMgKi8KLQkJc3RhdGljIHVuc2lnbmVkIGxvbmcgcG9zc2libGVfcG9ydHNbXSA9IHsweDIyMCwgMHgyNDAsIDB4MjYwfTsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvc3NpYmxlX3BvcnRzKTsgaSsrKSB7Ci0JCQllcnIgPSBzbmRfZXMxNjg4X2NyZWF0ZShjYXJkLAotCQkJCQkJcG9zc2libGVfcG9ydHNbaV0sCi0JCQkJCQltcHVfcG9ydFtkZXZdLAotCQkJCQkJeGVzc19pcnEsIHhtcHVfaXJxLCB4ZXNzX2RtYSwKLQkJCQkJCUVTMTY4OF9IV18xNjg4LCAmZXMxNjg4KTsKLQkJCWlmIChlcnIgPj0gMCkgewotCQkJCXBvcnRbZGV2XSA9IHBvc3NpYmxlX3BvcnRzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWlmIChlcnIgPCAwKQorCWlmIChtcHVfaXJxW25dID4gMTUpCisJCW1wdV9pcnFbbl0gPSAtMTsKKworCWVycm9yID0gc25kX2d1c2V4dHJlbWVfZXMxNjg4X2NyZWF0ZShjYXJkLCBkZXYsIG4sICZlczE2ODgpOworCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwogCi0JaWYgKGdmMV9wb3J0W2Rldl0gPCAwKQotCQlnZjFfcG9ydFtkZXZdID0gcG9ydFtkZXZdICsgMHgyMDsKLQlpZiAoKGVyciA9IHNuZF9ndXNfY3JlYXRlKGNhcmQsCi0JCQkJICBnZjFfcG9ydFtkZXZdLAotCQkJCSAgeGdmMV9pcnEsCi0JCQkJICB4Z2YxX2RtYSwKLQkJCQkgIC0xLAotCQkJCSAgMCwgY2hhbm5lbHNbZGV2XSwKLQkJCQkgIHBjbV9jaGFubmVsc1tkZXZdLCAwLAotCQkJCSAgJmd1cykpIDwgMCkKKwlpZiAoZ2YxX3BvcnRbbl0gPCAwKQorCQlnZjFfcG9ydFtuXSA9IGVzMTY4OC0+cG9ydCArIDB4MjA7CisKKwllcnJvciA9IHNuZF9ndXNleHRyZW1lX2d1c19jYXJkX2NyZWF0ZShjYXJkLCBkZXYsIG4sICZndXMpOworCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwogCi0JaWYgKChlcnIgPSBzbmRfZ3VzZXh0cmVtZV9kZXRlY3QoZGV2LCBjYXJkLCBndXMsIGVzMTY4OCkpIDwgMCkKKwllcnJvciA9IHNuZF9ndXNleHRyZW1lX2RldGVjdChndXMsIGVzMTY4OCk7CisJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXQ7CiAKLQlzbmRfZ3VzZXh0cmVtZV9pbml0KGRldiwgZ3VzKTsKLQlpZiAoKGVyciA9IHNuZF9ndXNfaW5pdGlhbGl6ZShndXMpKSA8IDApCisJZ3VzLT5qb3lzdGlja19kYWMgPSBqb3lzdGlja19kYWNbbl07CisKKwllcnJvciA9IHNuZF9ndXNfaW5pdGlhbGl6ZShndXMpOworCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwogCisJZXJyb3IgPSAtRU5PREVWOwogCWlmICghZ3VzLT5lc3NfZmxhZykgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAiR1VTIEV4dHJlbWUgc291bmRjYXJkIHdhcyBub3QgZGV0ZWN0ZWQgYXQgMHglbHhcbiIsIGd1cy0+Z2YxLnBvcnQpOwotCQllcnIgPSAtRU5PREVWOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogR1VTIEV4dHJlbWUgc291bmRjYXJkIHdhcyBub3QgIgorCQkJImRldGVjdGVkIGF0IDB4JWx4XG4iLCBkZXYtPmJ1c19pZCwgZ3VzLT5nZjEucG9ydCk7CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAoKGVyciA9IHNuZF9lczE2ODhfcGNtKGVzMTY4OCwgMCwgTlVMTCkpIDwgMCkKKwlndXMtPmNvZGVjX2ZsYWcgPSAxOworCisJZXJyb3IgPSBzbmRfZXMxNjg4X3BjbShlczE2ODgsIDAsIE5VTEwpOworCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0OwogCi0JaWYgKChlcnIgPSBzbmRfZXMxNjg4X21peGVyKGVzMTY4OCkpIDwgMCkKKwllcnJvciA9IHNuZF9lczE2ODhfbWl4ZXIoZXMxNjg4KTsKKwlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dDsKIAogCXNuZF9jb21wb25lbnRfYWRkKGNhcmQsICJFUzE2ODgiKTsKLQlpZiAocGNtX2NoYW5uZWxzW2Rldl0gPiAwKSB7Ci0JCWlmICgoZXJyID0gc25kX2dmMV9wY21fbmV3KGd1cywgMSwgMSwgTlVMTCkpIDwgMCkKKworCWlmIChwY21fY2hhbm5lbHNbbl0gPiAwKSB7CisJCWVycm9yID0gc25kX2dmMV9wY21fbmV3KGd1cywgMSwgMSwgTlVMTCk7CisJCWlmIChlcnJvciA8IDApCiAJCQlnb3RvIG91dDsKIAl9Ci0JaWYgKChlcnIgPSBzbmRfZ2YxX25ld19taXhlcihndXMpKSA8IDApCisKKwllcnJvciA9IHNuZF9nZjFfbmV3X21peGVyKGd1cyk7CisJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoKGVyciA9IHNuZF9ndXNleHRyZW1lX21peGVyKGVzMTY4OCkpIDwgMCkKKwllcnJvciA9IHNuZF9ndXNleHRyZW1lX21peGVyKGVzMTY4OCk7CisJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXQ7CiAKIAlpZiAoc25kX29wbDNfY3JlYXRlKGNhcmQsIGVzMTY4OC0+cG9ydCwgZXMxNjg4LT5wb3J0ICsgMiwKLQkJCSAgICBPUEwzX0hXX09QTDMsIDAsICZvcGwzKSA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZ3VzZXh0cmVtZTogb3BsMyBub3QgZGV0ZWN0ZWQgYXQgMHglbHhcbiIsIGVzMTY4OC0+cG9ydCk7Ci0JfSBlbHNlIHsKLQkJaWYgKChlcnIgPSBzbmRfb3BsM19od2RlcF9uZXcob3BsMywgMCwgMiwgTlVMTCkpIDwgMCkKKwkJCU9QTDNfSFdfT1BMMywgMCwgJm9wbDMpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogb3BsMyBub3QgZGV0ZWN0ZWQgYXQgMHglbHhcbiIsCisJCQlkZXYtPmJ1c19pZCwgZXMxNjg4LT5wb3J0KTsKKwllbHNlIHsKKwkJZXJyb3IgPSBzbmRfb3BsM19od2RlcF9uZXcob3BsMywgMCwgMiwgTlVMTCk7CisJCWlmIChlcnJvciA8IDApCiAJCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoZXMxNjg4LT5tcHVfcG9ydCA+PSAweDMwMCAmJgotCSAgICAoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfRVMxNjg4LAotCQkJCQkgICAgICAgZXMxNjg4LT5tcHVfcG9ydCwgMCwKLQkJCQkJICAgICAgIHhtcHVfaXJxLAotCQkJCQkgICAgICAgSVJRRl9ESVNBQkxFRCwKLQkJCQkJICAgICAgIE5VTEwpKSA8IDApCisJaWYgKGVzMTY4OC0+bXB1X3BvcnQgPj0gMHgzMDApIHsKKwkJZXJyb3IgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19FUzE2ODgsCisJCQkJZXMxNjg4LT5tcHVfcG9ydCwgMCwKKwkJCQltcHVfaXJxW25dLCBJUlFGX0RJU0FCTEVELCBOVUxMKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJHcmF2aXMgVWx0cmFTb3VuZCBFeHRyZW1lIGF0IDB4JWx4LCAiCisJCSJpcnEgJWkmJWksIGRtYSAlaSYlaSIsIGVzMTY4OC0+cG9ydCwKKwkJZ3VzLT5nZjEuaXJxLCBlczE2ODgtPmlycSwgZ3VzLT5nZjEuZG1hMSwgZXMxNjg4LT5kbWE4KTsKKworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2KTsKKworCWVycm9yID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXQ7CiAKLQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiR3JhdmlzIFVsdHJhU291bmQgRXh0cmVtZSBhdCAweCVseCwgaXJxICVpJiVpLCBkbWEgJWkmJWkiLAotCQllczE2ODgtPnBvcnQsIHhnZjFfaXJxLCB4ZXNzX2lycSwgeGdmMV9kbWEsIHhlc3NfZG1hKTsKLQotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7Ci0KLQlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCi0JCWdvdG8gb3V0OwotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgY2FyZCk7CiAJcmV0dXJuIDA7CiAKLSAgICAgIG91dDoKLQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCXJldHVybiBlcnI7CitvdXQ6CXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmRfZ3VzZXh0cmVtZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmV4aXQgc25kX2d1c2V4dHJlbWVfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4pCiB7Ci0Jc25kX2NhcmRfZnJlZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOworCXNuZF9jYXJkX2ZyZWUoZGV2X2dldF9kcnZkYXRhKGRldikpOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIEdVU0VYVFJFTUVfRFJJVkVSCSJzbmRfZ3VzZXh0cmVtZSIKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX2d1c2V4dHJlbWVfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBpc2FfZHJpdmVyIHNuZF9ndXNleHRyZW1lX2RyaXZlciA9IHsKKwkubWF0Y2gJCT0gc25kX2d1c2V4dHJlbWVfbWF0Y2gsCiAJLnByb2JlCQk9IHNuZF9ndXNleHRyZW1lX3Byb2JlLAotCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc25kX2d1c2V4dHJlbWVfcmVtb3ZlKSwKLQkvKiBGSVhNRTogc3VzcGVuZC9yZXN1bWUgKi8KKwkucmVtb3ZlCQk9IHNuZF9ndXNleHRyZW1lX3JlbW92ZSwKKyNpZiAwCS8qIEZJWE1FICovCisJLnN1c3BlbmQJPSBzbmRfZ3VzZXh0cmVtZV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc25kX2d1c2V4dHJlbWVfcmVzdW1lLAorI2VuZGlmCiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gR1VTRVhUUkVNRV9EUklWRVIKLQl9LAorCQkubmFtZQk9IERFVl9OQU1FCisJfQogfTsKIAotc3RhdGljIHZvaWQgX19pbml0X29yX21vZHVsZSBzbmRfZ3VzZXh0cmVtZV91bnJlZ2lzdGVyX2FsbCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlcyk7ICsraSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlc1tpXSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZF9ndXNleHRyZW1lX2RyaXZlcik7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9ndXNleHRyZW1lX2luaXQodm9pZCkKIHsKLQlpbnQgaSwgY2FyZHMsIGVycjsKLQotCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kX2d1c2V4dHJlbWVfZHJpdmVyKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWNhcmRzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7IGkrKykgewotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7Ci0JCWlmICghIGVuYWJsZVtpXSkKLQkJCWNvbnRpbnVlOwotCQlkZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKEdVU0VYVFJFTUVfRFJJVkVSLAotCQkJCQkJCSBpLCBOVUxMLCAwKTsKLQkJaWYgKElTX0VSUihkZXZpY2UpKQotCQkJY29udGludWU7Ci0JCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWRldmljZXNbaV0gPSBkZXZpY2U7Ci0JCWNhcmRzKys7Ci0JfQotCWlmICghY2FyZHMpIHsKLSNpZmRlZiBNT0RVTEUKLQkJcHJpbnRrKEtFUk5fRVJSICJHVVMgRXh0cmVtZSBzb3VuZGNhcmQgbm90IGZvdW5kIG9yIGRldmljZSBidXN5XG4iKTsKLSNlbmRpZgotCQlzbmRfZ3VzZXh0cmVtZV91bnJlZ2lzdGVyX2FsbCgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGlzYV9yZWdpc3Rlcl9kcml2ZXIoJnNuZF9ndXNleHRyZW1lX2RyaXZlciwgU05EUlZfQ0FSRFMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2d1c2V4dHJlbWVfZXhpdCh2b2lkKQogewotCXNuZF9ndXNleHRyZW1lX3VucmVnaXN0ZXJfYWxsKCk7CisJaXNhX3VucmVnaXN0ZXJfZHJpdmVyKCZzbmRfZ3VzZXh0cmVtZV9kcml2ZXIpOwogfQogCi1tb2R1bGVfaW5pdChhbHNhX2NhcmRfZ3VzZXh0cmVtZV9pbml0KQotbW9kdWxlX2V4aXQoYWxzYV9jYXJkX2d1c2V4dHJlbWVfZXhpdCkKK21vZHVsZV9pbml0KGFsc2FfY2FyZF9ndXNleHRyZW1lX2luaXQpOworbW9kdWxlX2V4aXQoYWxzYV9jYXJkX2d1c2V4dHJlbWVfZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2d1c21heC5jIGIvc291bmQvaXNhL2d1cy9ndXNtYXguYwppbmRleCBkMWFkOTBjLi43MDg3ODNkIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c21heC5jCisrKyBiL3NvdW5kL2lzYS9ndXMvZ3VzbWF4LmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KQEAgLTcyLDggKzcyLDYgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShwY21fY2hhbm5lbHMsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBjbV9jaGFubmVscywgIlJlc2VydmVkIFBDTSBjaGFubmVscyBmb3IgR1VTIE1BWCBkcml2ZXIuIik7CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW1NORFJWX0NBUkRTXTsKLQogc3RydWN0IHNuZF9ndXNtYXggewogCWludCBpcnE7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwpAQCAtMjA1LDkgKzIwMywxMyBAQAogCQlmcmVlX2lycShtYXhjYXJkLT5pcnEsICh2b2lkICopbWF4Y2FyZCk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9ndXNtYXhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9ndXNtYXhfbWF0Y2goc3RydWN0IGRldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGRldikKIHsKLQlpbnQgZGV2ID0gcGRldi0+aWQ7CisJcmV0dXJuIGVuYWJsZVtkZXZdOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfZ3VzbWF4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBkZXYpCit7CiAJc3RhdGljIGludCBwb3NzaWJsZV9pcnFzW10gPSB7NSwgMTEsIDEyLCA5LCA3LCAxNSwgMywgLTF9OwogCXN0YXRpYyBpbnQgcG9zc2libGVfZG1hc1tdID0gezUsIDYsIDcsIDEsIDMsIC0xfTsKIAlpbnQgeGlycSwgeGRtYTEsIHhkbWEyLCBlcnI7CkBAIC0zMzMsNyArMzM1LDcgQEAKIAlpZiAoeGRtYTIgPj0gMCkKIAkJc3ByaW50ZihjYXJkLT5sb25nbmFtZSArIHN0cmxlbihjYXJkLT5sb25nbmFtZSksICImJWkiLCB4ZG1hMik7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAKIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCiAJCWdvdG8gX2VycjsKQEAgLTM0MSw3ICszNDMsNyBAQAogCW1heGNhcmQtPmd1cyA9IGd1czsKIAltYXhjYXJkLT5jczQyMzEgPSBjczQyMzE7CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwlkZXZfc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CiAJcmV0dXJuIDA7CiAKICBfZXJyOgpAQCAtMzQ5LDcwICszNTEsMzMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmRfZ3VzbWF4X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZwdHIpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmRfZ3VzbWF4X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZwdHIsIHVuc2lnbmVkIGludCBkZXYpCiB7Ci0Jc25kX2NhcmRfZnJlZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOworCXNuZF9jYXJkX2ZyZWUoZGV2X2dldF9kcnZkYXRhKGRldnB0cikpOworCWRldl9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOwogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIEdVU01BWF9EUklWRVIJInNuZF9ndXNtYXgiCisjZGVmaW5lIERFVl9OQU1FICJndXNtYXgiCiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZF9ndXNtYXhfZHJpdmVyID0geworc3RhdGljIHN0cnVjdCBpc2FfZHJpdmVyIHNuZF9ndXNtYXhfZHJpdmVyID0geworCS5tYXRjaAkJPSBzbmRfZ3VzbWF4X21hdGNoLAogCS5wcm9iZQkJPSBzbmRfZ3VzbWF4X3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc25kX2d1c21heF9yZW1vdmUpLAogCS8qIEZJWE1FOiBzdXNwZW5kL3Jlc3VtZSAqLwogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9IEdVU01BWF9EUklWRVIKKwkJLm5hbWUJPSBERVZfTkFNRQogCX0sCiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXRfb3JfbW9kdWxlIHNuZF9ndXNtYXhfdW5yZWdpc3Rlcl9hbGwodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldmljZXMpOyArK2kpCi0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZXNbaV0pOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfZ3VzbWF4X2RyaXZlcik7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9ndXNtYXhfaW5pdCh2b2lkKQogewotCWludCBpLCBjYXJkcywgZXJyOwotCi0JZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzbmRfZ3VzbWF4X2RyaXZlcik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQljYXJkcyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKLQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOwotCQlpZiAoISBlbmFibGVbaV0pCi0JCQljb250aW51ZTsKLQkJZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShHVVNNQVhfRFJJVkVSLAotCQkJCQkJCSBpLCBOVUxMLCAwKTsKLQkJaWYgKElTX0VSUihkZXZpY2UpKQotCQkJY29udGludWU7Ci0JCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWRldmljZXNbaV0gPSBkZXZpY2U7Ci0JCWNhcmRzKys7Ci0JfQotCWlmICghY2FyZHMpIHsKLSNpZmRlZiBNT0RVTEUKLQkJcHJpbnRrKEtFUk5fRVJSICJHVVMgTUFYIHNvdW5kY2FyZCBub3QgZm91bmQgb3IgZGV2aWNlIGJ1c3lcbiIpOwotI2VuZGlmCi0JCXNuZF9ndXNtYXhfdW5yZWdpc3Rlcl9hbGwoKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiAwOworCXJldHVybiBpc2FfcmVnaXN0ZXJfZHJpdmVyKCZzbmRfZ3VzbWF4X2RyaXZlciwgU05EUlZfQ0FSRFMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX2d1c21heF9leGl0KHZvaWQpCiB7Ci0Jc25kX2d1c21heF91bnJlZ2lzdGVyX2FsbCgpOworCWlzYV91bnJlZ2lzdGVyX2RyaXZlcigmc25kX2d1c21heF9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChhbHNhX2NhcmRfZ3VzbWF4X2luaXQpCmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jIGIvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYwppbmRleCA0ZWMyZDc5Li4zZTQ2NTcyIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jCisrKyBiL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CkBAIC0xMTUsOSArMTE1LDYgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShlZmZlY3QsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGVmZmVjdCwgIkVmZmVjdHMgZW5hYmxlIGZvciBJbnRlcldhdmUgZHJpdmVyLiIpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tTTkRSVl9DQVJEU107Ci1zdGF0aWMgaW50IHBucF9yZWdpc3RlcmVkOwotCiBzdHJ1Y3Qgc25kX2ludGVyd2F2ZSB7CiAJaW50IGlycTsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CkBAIC0xMzgsNiArMTM1LDcgQEAKIAogCiAjaWZkZWYgQ09ORklHX1BOUAorc3RhdGljIGludCBwbnBfcmVnaXN0ZXJlZDsKIAogc3RhdGljIHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgc25kX2ludGVyd2F2ZV9wbnBpZHNbXSA9IHsKICNpZm5kZWYgU05EUlZfU1RCCkBAIC03OTMsNyArNzkxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgc25kX2ludGVyd2F2ZV9ub25wbnBfcHJvYmUxKGludCBkZXYsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlcndhdmVfaXNhX3Byb2JlMShpbnQgZGV2LCBzdHJ1Y3QgZGV2aWNlICpkZXZwdHIpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnI7CkBAIC04MDIsMTggKzgwMCwzMCBAQAogCWlmICghIGNhcmQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2cHRyLT5kZXYpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2cHRyKTsKIAlpZiAoKGVyciA9IHNuZF9pbnRlcndhdmVfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldnB0ciwgY2FyZCk7CisJZGV2X3NldF9kcnZkYXRhKGRldnB0ciwgY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlcndhdmVfbm9ucG5wX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaW50ZXJ3YXZlX2lzYV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpwZGV2LAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkZXYpCiB7Ci0JaW50IGRldiA9IHBkZXYtPmlkOworCWlmICghZW5hYmxlW2Rldl0pCisJCXJldHVybiAwOworI2lmZGVmIENPTkZJR19QTlAKKwlpZiAoaXNhcG5wW2Rldl0pCisJCXJldHVybiAwOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9pbnRlcndhdmVfaXNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKnBkZXYsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGRldikKK3sKIAlpbnQgZXJyOwogCXN0YXRpYyBpbnQgcG9zc2libGVfaXJxc1tdID0gezUsIDExLCAxMiwgOSwgNywgMTUsIDMsIC0xfTsKIAlzdGF0aWMgaW50IHBvc3NpYmxlX2RtYXNbXSA9IHswLCAxLCAzLCA1LCA2LCA3LCAtMX07CkBAIC04MzgsMTMgKzg0OCwxMyBAQAogCX0KIAogCWlmIChwb3J0W2Rldl0gIT0gU05EUlZfQVVUT19QT1JUKQotCQlyZXR1cm4gc25kX2ludGVyd2F2ZV9ub25wbnBfcHJvYmUxKGRldiwgcGRldik7CisJCXJldHVybiBzbmRfaW50ZXJ3YXZlX2lzYV9wcm9iZTEoZGV2LCBwZGV2KTsKIAllbHNlIHsKIAkJc3RhdGljIGxvbmcgcG9zc2libGVfcG9ydHNbXSA9IHsweDIxMCwgMHgyMjAsIDB4MjMwLCAweDI0MCwgMHgyNTAsIDB4MjYwfTsKIAkJaW50IGk7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvc3NpYmxlX3BvcnRzKTsgaSsrKSB7CiAJCQlwb3J0W2Rldl0gPSBwb3NzaWJsZV9wb3J0c1tpXTsKLQkJCWVyciA9IHNuZF9pbnRlcndhdmVfbm9ucG5wX3Byb2JlMShkZXYsIHBkZXYpOworCQkJZXJyID0gc25kX2ludGVyd2F2ZV9pc2FfcHJvYmUxKGRldiwgcGRldik7CiAJCQlpZiAoISBlcnIpCiAJCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTg1MiwxNiArODYyLDE3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmRfaW50ZXJ3YXZlX25vbnBucF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmV4aXQgc25kX2ludGVyd2F2ZV9pc2FfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldnB0ciwgdW5zaWduZWQgaW50IGRldikKIHsKLQlzbmRfY2FyZF9mcmVlKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldnB0cikpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldnB0ciwgTlVMTCk7CisJc25kX2NhcmRfZnJlZShkZXZfZ2V0X2RydmRhdGEoZGV2cHRyKSk7CisJZGV2X3NldF9kcnZkYXRhKGRldnB0ciwgTlVMTCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZF9pbnRlcndhdmVfZHJpdmVyID0gewotCS5wcm9iZQkJPSBzbmRfaW50ZXJ3YXZlX25vbnBucF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9pbnRlcndhdmVfbm9ucG5wX3JlbW92ZSksCitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgc25kX2ludGVyd2F2ZV9kcml2ZXIgPSB7CisJLm1hdGNoCQk9IHNuZF9pbnRlcndhdmVfaXNhX21hdGNoLAorCS5wcm9iZQkJPSBzbmRfaW50ZXJ3YXZlX2lzYV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9pbnRlcndhdmVfaXNhX3JlbW92ZSksCiAJLyogRklYTUU6IHN1c3BlbmQscmVzdW1lICovCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gSU5URVJXQVZFX0RSSVZFUgpAQCAtODY5LDggKzg4MCw2IEBACiB9OwogCiAjaWZkZWYgQ09ORklHX1BOUAotc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXRkYXRhIGludGVyd2F2ZV9wbnBfZGV2aWNlczsKLQogc3RhdGljIGludCBfX2RldmluaXQgc25kX2ludGVyd2F2ZV9wbnBfZGV0ZWN0KHN0cnVjdCBwbnBfY2FyZF9saW5rICpwY2FyZCwKIAkJCQkJICAgICAgY29uc3Qgc3RydWN0IHBucF9jYXJkX2RldmljZV9pZCAqcGlkKQogewpAQCAtOTAwLDcgKzkwOSw2IEBACiAJfQogCXBucF9zZXRfY2FyZF9kcnZkYXRhKHBjYXJkLCBjYXJkKTsKIAlkZXYrKzsKLQlpbnRlcndhdmVfcG5wX2RldmljZXMrKzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTIxLDY0ICs5MjksMjkgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KIAotc3RhdGljIHZvaWQgX19pbml0X29yX21vZHVsZSBzbmRfaW50ZXJ3YXZlX3VucmVnaXN0ZXJfYWxsKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAocG5wX3JlZ2lzdGVyZWQpCi0JCXBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKCZpbnRlcndhdmVfcG5wY19kcml2ZXIpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpOyArK2kpCi0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBsYXRmb3JtX2RldmljZXNbaV0pOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfaW50ZXJ3YXZlX2RyaXZlcik7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9pbnRlcndhdmVfaW5pdCh2b2lkKQogewotCWludCBpLCBlcnIsIGNhcmRzID0gMDsKKwlpbnQgZXJyOwogCi0JaWYgKChlcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9pbnRlcndhdmVfZHJpdmVyKSkgPCAwKQorCWVyciA9IGlzYV9yZWdpc3Rlcl9kcml2ZXIoJnNuZF9pbnRlcndhdmVfZHJpdmVyLCBTTkRSVl9DQVJEUyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7IGkrKykgewotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7Ci0JCWlmICghIGVuYWJsZVtpXSkKLQkJCWNvbnRpbnVlOwogI2lmZGVmIENPTkZJR19QTlAKLQkJaWYgKGlzYXBucFtpXSkKLQkJCWNvbnRpbnVlOwotI2VuZGlmCi0JCWRldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoSU5URVJXQVZFX0RSSVZFUiwKLQkJCQkJCQkgaSwgTlVMTCwgMCk7Ci0JCWlmIChJU19FUlIoZGV2aWNlKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIXBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpIHsKLQkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlwbGF0Zm9ybV9kZXZpY2VzW2ldID0gZGV2aWNlOwotCQljYXJkcysrOwotCX0KLQogCS8qIElTQSBQblAgY2FyZHMgKi8KIAllcnIgPSBwbnBfcmVnaXN0ZXJfY2FyZF9kcml2ZXIoJmludGVyd2F2ZV9wbnBjX2RyaXZlcik7Ci0JaWYgKCFlcnIpIHsKKwlpZiAoIWVycikKIAkJcG5wX3JlZ2lzdGVyZWQgPSAxOwotCQljYXJkcyArPSBpbnRlcndhdmVfcG5wX2RldmljZXM7OwotCX0KLQotCWlmICghY2FyZHMpIHsKLSNpZmRlZiBNT0RVTEUKLQkJcHJpbnRrKEtFUk5fRVJSICJJbnRlcldhdmUgc291bmRjYXJkIG5vdCBmb3VuZCBvciBkZXZpY2UgYnVzeVxuIik7CiAjZW5kaWYKLQkJc25kX2ludGVyd2F2ZV91bnJlZ2lzdGVyX2FsbCgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfaW50ZXJ3YXZlX2V4aXQodm9pZCkKIHsKLQlzbmRfaW50ZXJ3YXZlX3VucmVnaXN0ZXJfYWxsKCk7CisjaWZkZWYgQ09ORklHX1BOUAorCWlmIChwbnBfcmVnaXN0ZXJlZCkKKwkJcG5wX3VucmVnaXN0ZXJfY2FyZF9kcml2ZXIoJmludGVyd2F2ZV9wbnBjX2RyaXZlcik7CisjZW5kaWYKKwlpc2FfdW5yZWdpc3Rlcl9kcml2ZXIoJnNuZF9pbnRlcndhdmVfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoYWxzYV9jYXJkX2ludGVyd2F2ZV9pbml0KQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wbDNzYTIuYyBiL3NvdW5kL2lzYS9vcGwzc2EyLmMKaW5kZXggZjNkYjY4Ni4uNDg3NDNlYiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL29wbDNzYTIuYworKysgYi9zb3VuZC9pc2Evb3BsM3NhMi5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtOTEsMTIgKzkxLDEwIEBACiBtb2R1bGVfcGFyYW1fYXJyYXkob3BsM3NhM195bW9kZSwgaW50LCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mob3BsM3NhM195bW9kZSwgIlNwZWFrZXIgc2l6ZSBzZWxlY3Rpb24gZm9yIDNEIEVuaGFuY2VtZW50IG1vZGU6IERlc2t0b3AvTGFyZ2UgTm90ZWJvb2svU21hbGwgTm90ZWJvb2svSGlGaS4iKTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbU05EUlZfQ0FSRFNdOwogI2lmZGVmIENPTkZJR19QTlAKIHN0YXRpYyBpbnQgcG5wX3JlZ2lzdGVyZWQ7CiBzdGF0aWMgaW50IHBucGNfcmVnaXN0ZXJlZDsKICNlbmRpZgotc3RhdGljIHVuc2lnbmVkIGludCBzbmRfb3BsM3NhMl9kZXZpY2VzOwogCiAvKiBjb250cm9sIHBvcnRzICovCiAjZGVmaW5lIE9QTDNTQTJfUE1fQ1RSTAkJMHgwMQpAQCAtNzgzLDcgKzc4MSw2IEBACiAJfQogCXBucF9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKIAlkZXYrKzsKLQlzbmRfb3BsM3NhMl9kZXZpY2VzKys7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTg1MCw3ICs4NDcsNiBAQAogCX0KIAlwbnBfc2V0X2NhcmRfZHJ2ZGF0YShwY2FyZCwgY2FyZCk7CiAJZGV2Kys7Ci0Jc25kX29wbDNzYTJfZGV2aWNlcysrOwogCXJldHVybiAwOwogfQogCkBAIC04ODQsMTE2ICs4ODAsOTUgQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1BOUCAqLwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfb3BsM3NhMl9ub25wbnBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9vcGwzc2EyX2lzYV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpwZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgZGV2KQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlpbnQgZXJyOwotCWludCBkZXYgPSBwZGV2LT5pZDsKLQorCWlmICghZW5hYmxlW2Rldl0pCisJCXJldHVybiAwOworI2lmZGVmIENPTkZJR19QTlAKKwlpZiAoaXNhcG5wW2Rldl0pCisJCXJldHVybiAwOworI2VuZGlmCiAJaWYgKHBvcnRbZGV2XSA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggInNwZWNpZnkgcG9ydFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHdzc19wb3J0W2Rldl0gPT0gU05EUlZfQVVUT19QT1JUKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJzcGVjaWZ5IHdzc19wb3J0XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCX0KIAlpZiAoZm1fcG9ydFtkZXZdID09IFNORFJWX0FVVE9fUE9SVCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAic3BlY2lmeSBmbV9wb3J0XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCX0KIAlpZiAobWlkaV9wb3J0W2Rldl0gPT0gU05EUlZfQVVUT19QT1JUKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJzcGVjaWZ5IG1pZGlfcG9ydFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9vcGwzc2EyX2lzYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpwZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgZGV2KQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKKwlpbnQgZXJyOwogCiAJY2FyZCA9IHNuZF9vcGwzc2EyX2NhcmRfbmV3KGRldik7CiAJaWYgKCEgY2FyZCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIHBkZXYpOwogCWlmICgoZXJyID0gc25kX29wbDNzYTJfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCWRldl9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc25kX29wbDNzYTJfbm9ucG5wX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZwdHIpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmRfb3BsM3NhMl9pc2FfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldnB0ciwKKwkJCQkJICAgIHVuc2lnbmVkIGludCBkZXYpCiB7Ci0Jc25kX2NhcmRfZnJlZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOworCXNuZF9jYXJkX2ZyZWUoZGV2X2dldF9kcnZkYXRhKGRldnB0cikpOworCWRldl9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOwogCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHNuZF9vcGwzc2EyX25vbnBucF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBzbmRfb3BsM3NhMl9pc2Ffc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuLAorCQkJCSAgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlyZXR1cm4gc25kX29wbDNzYTJfc3VzcGVuZChwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpLCBzdGF0ZSk7CisJcmV0dXJuIHNuZF9vcGwzc2EyX3N1c3BlbmQoZGV2X2dldF9kcnZkYXRhKGRldiksIHN0YXRlKTsKIH0KIAotc3RhdGljIGludCBzbmRfb3BsM3NhMl9ub25wbnBfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc25kX29wbDNzYTJfaXNhX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuKQogewotCXJldHVybiBzbmRfb3BsM3NhMl9yZXN1bWUocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KSk7CisJcmV0dXJuIHNuZF9vcGwzc2EyX3Jlc3VtZShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiB9CiAjZW5kaWYKIAotI2RlZmluZSBPUEwzU0EyX0RSSVZFUgkic25kX29wbDNzYTIiCisjZGVmaW5lIERFVl9OQU1FICJvcGwzc2EyIgogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfb3BsM3NhMl9ub25wbnBfZHJpdmVyID0gewotCS5wcm9iZQkJPSBzbmRfb3BsM3NhMl9ub25wbnBfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXQoIHNuZF9vcGwzc2EyX25vbnBucF9yZW1vdmUpLAorc3RhdGljIHN0cnVjdCBpc2FfZHJpdmVyIHNuZF9vcGwzc2EyX2lzYV9kcml2ZXIgPSB7CisJLm1hdGNoCQk9IHNuZF9vcGwzc2EyX2lzYV9tYXRjaCwKKwkucHJvYmUJCT0gc25kX29wbDNzYTJfaXNhX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0KCBzbmRfb3BsM3NhMl9pc2FfcmVtb3ZlKSwKICNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZAk9IHNuZF9vcGwzc2EyX25vbnBucF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gc25kX29wbDNzYTJfbm9ucG5wX3Jlc3VtZSwKKwkuc3VzcGVuZAk9IHNuZF9vcGwzc2EyX2lzYV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc25kX29wbDNzYTJfaXNhX3Jlc3VtZSwKICNlbmRpZgogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9IE9QTDNTQTJfRFJJVkVSCisJCS5uYW1lCT0gREVWX05BTUUKIAl9LAogfTsKIAotc3RhdGljIHZvaWQgX19pbml0X29yX21vZHVsZSBzbmRfb3BsM3NhMl91bnJlZ2lzdGVyX2FsbCh2b2lkKQotewotCWludCBpOwotCi0jaWZkZWYgQ09ORklHX1BOUAotCWlmIChwbnBjX3JlZ2lzdGVyZWQpCi0JCXBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKCZvcGwzc2EyX3BucGNfZHJpdmVyKTsKLQlpZiAocG5wX3JlZ2lzdGVyZWQpCi0JCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmb3BsM3NhMl9wbnBfZHJpdmVyKTsKLSNlbmRpZgotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBsYXRmb3JtX2RldmljZXMpOyArK2kpCi0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBsYXRmb3JtX2RldmljZXNbaV0pOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfb3BsM3NhMl9ub25wbnBfZHJpdmVyKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX29wbDNzYTJfaW5pdCh2b2lkKQogewotCWludCBpLCBlcnI7CisJaW50IGVycjsKIAotCWlmICgoZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzbmRfb3BsM3NhMl9ub25wbnBfZHJpdmVyKSkgPCAwKQorCWVyciA9IGlzYV9yZWdpc3Rlcl9kcml2ZXIoJnNuZF9vcGwzc2EyX2lzYV9kcml2ZXIsIFNORFJWX0NBUkRTKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9DQVJEUzsgaSsrKSB7Ci0JCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZTsKLQkJaWYgKCEgZW5hYmxlW2ldKQotCQkJY29udGludWU7Ci0jaWZkZWYgQ09ORklHX1BOUAotCQlpZiAoaXNhcG5wW2ldKQotCQkJY29udGludWU7Ci0jZW5kaWYKLQkJZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShPUEwzU0EyX0RSSVZFUiwKLQkJCQkJCQkgaSwgTlVMTCwgMCk7Ci0JCWlmIChJU19FUlIoZGV2aWNlKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIXBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpIHsKLQkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlwbGF0Zm9ybV9kZXZpY2VzW2ldID0gZGV2aWNlOwotCQlzbmRfb3BsM3NhMl9kZXZpY2VzKys7Ci0JfQotCiAjaWZkZWYgQ09ORklHX1BOUAogCWVyciA9IHBucF9yZWdpc3Rlcl9kcml2ZXIoJm9wbDNzYTJfcG5wX2RyaXZlcik7CiAJaWYgKCFlcnIpCkBAIC0xMDAyLDIwICs5NzcsMTggQEAKIAlpZiAoIWVycikKIAkJcG5wY19yZWdpc3RlcmVkID0gMTsKICNlbmRpZgotCi0JaWYgKCFzbmRfb3BsM3NhMl9kZXZpY2VzKSB7Ci0jaWZkZWYgTU9EVUxFCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIllhbWFoYSBPUEwzLVNBIHNvdW5kY2FyZCBub3QgZm91bmQgb3IgZGV2aWNlIGJ1c3lcbiIpOwotI2VuZGlmCi0JCXNuZF9vcGwzc2EyX3VucmVnaXN0ZXJfYWxsKCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9vcGwzc2EyX2V4aXQodm9pZCkKIHsKLQlzbmRfb3BsM3NhMl91bnJlZ2lzdGVyX2FsbCgpOworI2lmZGVmIENPTkZJR19QTlAKKwlpZiAocG5wY19yZWdpc3RlcmVkKQorCQlwbnBfdW5yZWdpc3Rlcl9jYXJkX2RyaXZlcigmb3BsM3NhMl9wbnBjX2RyaXZlcik7CisJaWYgKHBucF9yZWdpc3RlcmVkKQorCQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJm9wbDNzYTJfcG5wX2RyaXZlcik7CisjZW5kaWYKKwlpc2FfdW5yZWdpc3Rlcl9kcml2ZXIoJnNuZF9vcGwzc2EyX2lzYV9kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChhbHNhX2NhcmRfb3BsM3NhMl9pbml0KQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wdGk5eHgvbWlyby5jIGIvc291bmQvaXNhL29wdGk5eHgvbWlyby5jCmluZGV4IDFkZDk4MzcuLmNkMjliMzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYworKysgYi9zb3VuZC9pc2Evb3B0aTl4eC9taXJvLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CkBAIC0xMzcsMTAgKzEzNyw2IEBACiAKIHN0YXRpYyB2b2lkIHNuZF9taXJvX3Byb2NfaW5pdChzdHJ1Y3Qgc25kX21pcm8gKiBtaXJvKTsKIAotI2RlZmluZSBEUklWRVJfTkFNRSAic25kLW1pcm8iCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7Ci0KIHN0YXRpYyBjaGFyICogc25kX29wdGk5eHhfbmFtZXNbXSA9IHsKIAkidW5rb3duIiwKIAkiODJDOTI4IiwgIjgyQzkyOSIsCkBAIC01NTgsNyArNTU0LDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX21pcm9fY29udHJvbHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfbWlyb19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiBNSVJPX0RPVUJMRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDAsIEFDSV9HRVRfTUFTVEVSLCBBQ0lfU0VUX01BU1RFUiksCiBNSVJPX0RPVUJMRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDEsIEFDSV9HRVRfTUlDLCBBQ0lfU0VUX01JQyksCiBNSVJPX0RPVUJMRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAxLCBBQ0lfR0VUX0xJTkUsIEFDSV9TRVRfTElORSksCkBAIC01NzAsNyArNTY2LDcgQEAKIAogLyogRXF1YWxpemVyIHdpdGggc2V2ZW4gYmFuZHMgKG9ubHkgUENNMjApIAogICAgZnJvbSAtMTJkQiB1cCB0byArMTJkQiBvbiBlYWNoIGJhbmQgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfbWlyb19lcV9jb250cm9sc1tdID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9taXJvX2VxX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIE1JUk9fRE9VQkxFKCJUb25lIENvbnRyb2wgLSAyOCBIeiIsIDAsIEFDSV9HRVRfRVExLCBBQ0lfU0VUX0VRMSksCiBNSVJPX0RPVUJMRSgiVG9uZSBDb250cm9sIC0gMTYwIEh6IiwgMCwgQUNJX0dFVF9FUTIsIEFDSV9TRVRfRVEyKSwKIE1JUk9fRE9VQkxFKCJUb25lIENvbnRyb2wgLSA0MDAgSHoiLCAwLCBBQ0lfR0VUX0VRMywgQUNJX1NFVF9FUTMpLApAQCAtNTgwLDE1ICs1NzYsMTUgQEAKIE1JUk9fRE9VQkxFKCJUb25lIENvbnRyb2wgLSAxNiBrSHoiLCAwLCBBQ0lfR0VUX0VRNywgQUNJX1NFVF9FUTcpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9taXJvX3JhZGlvX2NvbnRyb2xbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfbWlyb19yYWRpb19jb250cm9sW10gX19kZXZpbml0ZGF0YSA9IHsKIE1JUk9fRE9VQkxFKCJSYWRpbyBQbGF5YmFjayBWb2x1bWUiLCAwLCBBQ0lfR0VUX0xJTkUxLCBBQ0lfU0VUX0xJTkUxKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfbWlyb19saW5lX2NvbnRyb2xbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfbWlyb19saW5lX2NvbnRyb2xbXSBfX2RldmluaXRkYXRhID0gewogTUlST19ET1VCTEUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMiwgQUNJX0dFVF9MSU5FMSwgQUNJX1NFVF9MSU5FMSksCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX21pcm9fcHJlYW1wX2NvbnRyb2xbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfbWlyb19wcmVhbXBfY29udHJvbFtdIF9fZGV2aW5pdGRhdGEgPSB7CiB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTWljIEJvb3N0IiwKQEAgLTU5OCw3ICs1OTQsNyBAQAogCS5wdXQgPSBzbmRfbWlyb19wdXRfcHJlYW1wLAogfX07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfbWlyb19hbXBfY29udHJvbFtdID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9taXJvX2FtcF9jb250cm9sW10gX19kZXZpbml0ZGF0YSA9IHsKIHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJMaW5lIEJvb3N0IiwKQEAgLTYwOCw3ICs2MDQsNyBAQAogCS5wdXQgPSBzbmRfbWlyb19wdXRfYW1wLAogfX07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfbWlyb19jYXB0dXJlX2NvbnRyb2xbXSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfbWlyb19jYXB0dXJlX2NvbnRyb2xbXSBfX2RldmluaXRkYXRhID0gewogewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIlBDTSBDYXB0dXJlIFN3aXRjaCIsCkBAIC02MTgsNyArNjE0LDcgQEAKIAkucHV0ID0gc25kX21pcm9fcHV0X2NhcHR1cmUsCiB9fTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgYWNpX2luaXRfdmFsdWVzW11bMl0gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFjaV9pbml0X3ZhbHVlc1tdWzJdIF9fZGV2aW5pdGRhdGEgPSB7CiAJeyBBQ0lfU0VUX01VVEUsIDB4MDAgfSwKIAl7IEFDSV9TRVRfUE9XRVJBTVAsIDB4MDAgfSwKIAl7IEFDSV9TRVRfUFJFQU1QLCAweDAwIH0sCkBAIC02NDEsNyArNjM3LDcgQEAKIAl7IEFDSV9TRVRfTUFTVEVSICsgMSwgMHgyMCB9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc25kX3NldF9hY2lfaW5pdF92YWx1ZXMoc3RydWN0IHNuZF9taXJvICptaXJvKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX3NldF9hY2lfaW5pdF92YWx1ZXMoc3RydWN0IHNuZF9taXJvICptaXJvKQogewogCWludCBpZHgsIGVycm9yOwogCkBAIC03NTEsNyArNzQ3LDggQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHNuZF9taXJvX2luaXQoc3RydWN0IHNuZF9taXJvICpjaGlwLCB1bnNpZ25lZCBzaG9ydCBoYXJkd2FyZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9taXJvX2luaXQoc3RydWN0IHNuZF9taXJvICpjaGlwLAorCQkJCSAgIHVuc2lnbmVkIHNob3J0IGhhcmR3YXJlKQogewogCXN0YXRpYyBpbnQgb3B0aTl4eF9tY19zaXplW10gPSB7NywgNywgMTAsIDEwLCAyLCAyLCAyfTsKIApAQCAtOTYyLDcgKzk1OSw3IEBACiAJc25kX2lwcmludGYoYnVmZmVyLCAiICBwcmVhbXAgIDogMHgleFxuIiwgbWlyby0+YWNpX3ByZWFtcCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzbmRfbWlyb19wcm9jX2luaXQoc3RydWN0IHNuZF9taXJvICogbWlybykKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzbmRfbWlyb19wcm9jX2luaXQoc3RydWN0IHNuZF9taXJvICogbWlybykKIHsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCkBAIC05NzQsNyArOTcxLDcgQEAKICAqICBJbml0CiAgKi8KIAotc3RhdGljIGludCBfX2luaXQgc25kX21pcm9fY29uZmlndXJlKHN0cnVjdCBzbmRfbWlybyAqY2hpcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9taXJvX2NvbmZpZ3VyZShzdHJ1Y3Qgc25kX21pcm8gKmNoaXApCiB7CiAJdW5zaWduZWQgY2hhciB3c3NfYmFzZV9iaXRzOwogCXVuc2lnbmVkIGNoYXIgaXJxX2JpdHM7CkBAIC0xMTMxLDcgKzExMjgsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfY2FyZF9taXJvX2RldGVjdChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBzbmRfbWlybyAqY2hpcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jYXJkX21pcm9fZGV0ZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKKwkJCQkJICBzdHJ1Y3Qgc25kX21pcm8gKmNoaXApCiB7CiAJaW50IGksIGVycjsKIAl1bnNpZ25lZCBjaGFyIHZhbHVlOwpAQCAtMTE1Nyw3ICsxMTU1LDggQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc25kX2NhcmRfbWlyb19hY2lfZGV0ZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9taXJvICogbWlybykKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9jYXJkX21pcm9fYWNpX2RldGVjdChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCisJCQkJCSAgICAgIHN0cnVjdCBzbmRfbWlybyAqIG1pcm8pCiB7CiAJdW5zaWduZWQgY2hhciByZWd2YWw7CiAJaW50IGk7CkBAIC0xMjEzLDcgKzEyMTIsMTIgQEAKIAlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKG1pcm8tPnJlc19tY19iYXNlKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc25kX21pcm9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX21pcm9fbWF0Y2goc3RydWN0IGRldmljZSAqZGV2cHRyLCB1bnNpZ25lZCBpbnQgbikKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX21pcm9fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2cHRyLCB1bnNpZ25lZCBpbnQgbikKIHsKIAlzdGF0aWMgbG9uZyBwb3NzaWJsZV9wb3J0c1tdID0gezB4NTMwLCAweGU4MCwgMHhmNDAsIDB4NjA0LCAtMX07CiAJc3RhdGljIGxvbmcgcG9zc2libGVfbXB1X3BvcnRzW10gPSB7MHgzMzAsIDB4MzAwLCAweDMxMCwgMHgzMjAsIC0xfTsKQEAgLTEzOTksNTYgKzE0MDMsNDQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAJfQogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2cHRyLT5kZXYpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2cHRyKTsKIAogCWlmICgoZXJyb3IgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkpIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldnB0ciwgY2FyZCk7CisJZGV2X3NldF9kcnZkYXRhKGRldnB0ciwgY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9taXJvX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZwdHIpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmRfbWlyb19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2cHRyLCB1bnNpZ25lZCBpbnQgZGV2KQogewotCXNuZF9jYXJkX2ZyZWUocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2cHRyKSk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBOVUxMKTsKKwlzbmRfY2FyZF9mcmVlKGRldl9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2cHRyLCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX21pcm9fZHJpdmVyID0geworI2RlZmluZSBERVZfTkFNRSAibWlybyIKKworc3RhdGljIHN0cnVjdCBpc2FfZHJpdmVyIHNuZF9taXJvX2RyaXZlciA9IHsKKwkubWF0Y2gJCT0gc25kX21pcm9fbWF0Y2gsCiAJLnByb2JlCQk9IHNuZF9taXJvX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc25kX21pcm9fcmVtb3ZlKSwKIAkvKiBGSVhNRTogc3VzcGVuZC9yZXN1bWUgKi8KIAkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSBEUklWRVJfTkFNRQorCQkubmFtZQk9IERFVl9OQU1FCiAJfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9taXJvX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoKGVycm9yID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzbmRfbWlyb19kcml2ZXIpKSA8IDApCi0JCXJldHVybiBlcnJvcjsKLQlkZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKERSSVZFUl9OQU1FLCAtMSwgTlVMTCwgMCk7Ci0JaWYgKCEgSVNfRVJSKGRldmljZSkpIHsKLQkJaWYgKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpCi0JCQlyZXR1cm4gMDsKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQl9Ci0jaWZkZWYgTU9EVUxFCi0JcHJpbnRrKEtFUk5fRVJSICJubyBtaXJvIHNvdW5kY2FyZCBmb3VuZFxuIik7Ci0jZW5kaWYKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kX21pcm9fZHJpdmVyKTsKLQlyZXR1cm4gUFRSX0VSUihkZXZpY2UpOworCXJldHVybiBpc2FfcmVnaXN0ZXJfZHJpdmVyKCZzbmRfbWlyb19kcml2ZXIsIDEpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX21pcm9fZXhpdCh2b2lkKQogewotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZF9taXJvX2RyaXZlcik7CisJaXNhX3VucmVnaXN0ZXJfZHJpdmVyKCZzbmRfbWlyb19kcml2ZXIpOwogfQogCiBtb2R1bGVfaW5pdChhbHNhX2NhcmRfbWlyb19pbml0KQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYyBiL3NvdW5kL2lzYS9vcHRpOXh4L29wdGk5MngtYWQxODQ4LmMKaW5kZXggZGYyMjczNy4uNjBjMTIwZiAxMDA2NDQKLS0tIGEvc291bmQvaXNhL29wdGk5eHgvb3B0aTkyeC1hZDE4NDguYworKysgYi9zb3VuZC9pc2Evb3B0aTl4eC9vcHRpOTJ4LWFkMTg0OC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgpAQCAtMjU5LDcgKzI1OSw2IEBACiB9OwogCiBzdGF0aWMgaW50IHNuZF9vcHRpOXh4X3BucF9pc19wcm9iZWQ7Ci1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc25kX29wdGk5eHhfcGxhdGZvcm1fZGV2aWNlOwogCiAjaWZkZWYgQ09ORklHX1BOUAogCkBAIC0yODEsMTAgKzI4MCwxMCBAQAogI2VuZGlmCS8qIENPTkZJR19QTlAgKi8KIAogI2lmZGVmIE9QVGk5M1gKLSNkZWZpbmUgRFJJVkVSX05BTUUJInNuZC1jYXJkLW9wdGk5M3giCisjZGVmaW5lIERFVl9OQU1FICJvcHRpOTN4IgogI2Vsc2UKLSNkZWZpbmUgRFJJVkVSX05BTUUJInNuZC1jYXJkLW9wdGk5MngiCi0jZW5kaWYJLyogT1BUaTkzWCAqLworI2RlZmluZSBERVZfTkFNRSAib3B0aTkyeCIKKyNlbmRpZgogCiBzdGF0aWMgY2hhciAqIHNuZF9vcHRpOXh4X25hbWVzW10gPSB7CiAJInVua293biIsCkBAIC0yOTQsNyArMjkzLDcgQEAKIH07CiAKIAotc3RhdGljIGxvbmcgX19pbml0IHNuZF9sZWdhY3lfZmluZF9mcmVlX2lvcG9ydChsb25nICpwb3J0X3RhYmxlLCBsb25nIHNpemUpCitzdGF0aWMgbG9uZyBfX2RldmluaXQgc25kX2xlZ2FjeV9maW5kX2ZyZWVfaW9wb3J0KGxvbmcgKnBvcnRfdGFibGUsIGxvbmcgc2l6ZSkKIHsKIAl3aGlsZSAoKnBvcnRfdGFibGUgIT0gLTEpIHsKIAkJaWYgKHJlcXVlc3RfcmVnaW9uKCpwb3J0X3RhYmxlLCBzaXplLCAiQUxTQSB0ZXN0IikpIHsKQEAgLTMwNiw3ICszMDUsOCBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc25kX29wdGk5eHhfaW5pdChzdHJ1Y3Qgc25kX29wdGk5eHggKmNoaXAsIHVuc2lnbmVkIHNob3J0IGhhcmR3YXJlKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX29wdGk5eHhfaW5pdChzdHJ1Y3Qgc25kX29wdGk5eHggKmNoaXAsCisJCQkJICAgICAgdW5zaWduZWQgc2hvcnQgaGFyZHdhcmUpCiB7CiAJc3RhdGljIGludCBvcHRpOXh4X21jX3NpemVbXSA9IHs3LCA3LCAxMCwgMTAsIDIsIDIsIDJ9OwogCkBAIC00NTEsNyArNDUxLDcgQEAKIAkJKHNuZF9vcHRpOXh4X3JlYWQoY2hpcCwgcmVnKSAmIH4obWFzaykpIHwgKCh2YWx1ZSkgJiAobWFzaykpKQogCiAKLXN0YXRpYyBpbnQgX19pbml0IHNuZF9vcHRpOXh4X2NvbmZpZ3VyZShzdHJ1Y3Qgc25kX29wdGk5eHggKmNoaXApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfb3B0aTl4eF9jb25maWd1cmUoc3RydWN0IHNuZF9vcHRpOXh4ICpjaGlwKQogewogCXVuc2lnbmVkIGNoYXIgd3NzX2Jhc2VfYml0czsKIAl1bnNpZ25lZCBjaGFyIGlycV9iaXRzOwpAQCAtOTM0LDEwICs5MzQsOCBAQAogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAl7CiAJCXVuc2lnbmVkIGludCB3aGF0ID0gMDsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7Ci0JCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLQkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQkJaWYgKHMgPT0gY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKSB7CiAJCQkJd2hhdCB8PSBPUFRpOTNYX1BMQVlCQUNLX0VOQUJMRTsKIAkJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOwpAQCAtMTI5MSw3ICsxMjg5LDcgQEAKIAl9CiAJY29kZWMtPmRtYTIgPSBjaGlwLT5kbWEyOwogCi0JaWYgKHJlcXVlc3RfaXJxKGNoaXAtPmlycSwgc25kX29wdGk5M3hfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCBEUklWRVJfTkFNRSIgLSBXU1MiLCBjb2RlYykpIHsKKwlpZiAocmVxdWVzdF9pcnEoY2hpcC0+aXJxLCBzbmRfb3B0aTkzeF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsIERFVl9OQU1FIiAtIFdTUyIsIGNvZGVjKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJvcHRpOXh4OiBjYW4ndCBncmFiIElSUSAlZFxuIiwgY2hpcC0+aXJxKTsKIAkJc25kX29wdGk5M3hfZnJlZShjb2RlYyk7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0xNTYxLDcgKzE1NTksNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfb3B0aTkzeF9jb250cm9sc1tdID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9vcHRpOTN4X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIE9QVGk5M1hfRE9VQkxFKCJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwgMCwgT1BUaTkzWF9PVVRfTEVGVCwgT1BUaTkzWF9PVVRfUklHSFQsIDcsIDcsIDEsIDEpLAogT1BUaTkzWF9ET1VCTEUoIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCAwLCBPUFRpOTNYX09VVF9MRUZULCBPUFRpOTNYX09VVF9SSUdIVCwgMSwgMSwgMzEsIDEpLCAKIE9QVGk5M1hfRE9VQkxFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMCwgT1BUaTkzWF9EQUNfTEVGVCwgT1BUaTkzWF9EQUNfUklHSFQsIDcsIDcsIDEsIDEpLApAQCAtMTYyMiw3ICsxNjIwLDggQEAKIAogI2VuZGlmIC8qIE9QVGk5M1ggKi8KIAotc3RhdGljIGludCBfX2luaXQgc25kX2NhcmRfb3B0aTl4eF9kZXRlY3Qoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBzdHJ1Y3Qgc25kX29wdGk5eHggKmNoaXApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY2FyZF9vcHRpOXh4X2RldGVjdChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCisJCQkJCSAgICAgc3RydWN0IHNuZF9vcHRpOXh4ICpjaGlwKQogewogCWludCBpLCBlcnI7CiAKQEAgLTE2NzYsOCArMTY3NSw5IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE5QCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfY2FyZF9vcHRpOXh4X3BucChzdHJ1Y3Qgc25kX29wdGk5eHggKmNoaXAsIHN0cnVjdCBwbnBfY2FyZF9saW5rICpjYXJkLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICpwaWQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY2FyZF9vcHRpOXh4X3BucChzdHJ1Y3Qgc25kX29wdGk5eHggKmNoaXAsCisJCQkJCSAgc3RydWN0IHBucF9jYXJkX2xpbmsgKmNhcmQsCisJCQkJCSAgY29uc3Qgc3RydWN0IHBucF9jYXJkX2RldmljZV9pZCAqcGlkKQogewogCXN0cnVjdCBwbnBfZGV2ICpwZGV2OwogCXN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKmNmZyA9IGttYWxsb2Moc2l6ZW9mKCpjZmcpLCBHRlBfS0VSTkVMKTsKQEAgLTE3NzgsNyArMTc3OCw3IEBACiAJCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoY2hpcC0+cmVzX21jX2Jhc2UpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfb3B0aTl4eF9wcm9iZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfb3B0aTl4eF9wcm9iZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7CiAJc3RhdGljIGxvbmcgcG9zc2libGVfcG9ydHNbXSA9IHsweDUzMCwgMHhlODAsIDB4ZjQwLCAweDYwNCwgLTF9OwogCWludCBlcnJvcjsKQEAgLTE5MjQsNyArMTkyNCwxOCBAQAogCXJldHVybiBjYXJkOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfb3B0aTl4eF9ub25wbnBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX29wdGk5eHhfaXNhX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldnB0ciwKKwkJCQkJICAgdW5zaWduZWQgaW50IGRldikKK3sKKwlpZiAoc25kX29wdGk5eHhfcG5wX2lzX3Byb2JlZCkKKwkJcmV0dXJuIDA7CisJaWYgKGlzYXBucCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9vcHRpOXh4X2lzYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZwdHIsCisJCQkJCSAgIHVuc2lnbmVkIGludCBkZXYpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCWludCBlcnJvcjsKQEAgLTE5NDAsOSArMTk1MSw2IEBACiAJc3RhdGljIGludCBwb3NzaWJsZV9kbWEyc1tdWzJdID0ge3sxLC0xfSwgezAsLTF9LCB7LTEsLTF9LCB7MCwtMX19OwogI2VuZGlmCS8qIENTNDIzMSB8fCBPUFRpOTNYICovCiAKLQlpZiAoc25kX29wdGk5eHhfcG5wX2lzX3Byb2JlZCkKLQkJcmV0dXJuIC1FQlVTWTsKLQogCWlmIChtcHVfcG9ydCA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKIAkJaWYgKChtcHVfcG9ydCA9IHNuZF9sZWdhY3lfZmluZF9mcmVlX2lvcG9ydChwb3NzaWJsZV9tcHVfcG9ydHMsIDIpKSA8IDApIHsKIAkJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBmaW5kIGEgZnJlZSBNUFU0MDEgcG9ydFxuIik7CkBAIC0xOTg0LDM0ICsxOTkyLDM2IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnJvcjsKIAl9Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2cHRyLT5kZXYpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgZGV2cHRyKTsKIAlpZiAoKGVycm9yID0gc25kX29wdGk5eHhfcHJvYmUoY2FyZCkpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldnB0ciwgY2FyZCk7CisJZGV2X3NldF9kcnZkYXRhKGRldnB0ciwgY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9vcHRpOXh4X25vbnBucF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmV4aXQgc25kX29wdGk5eHhfaXNhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZwdHIsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgZGV2KQogewotCXNuZF9jYXJkX2ZyZWUocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2cHRyKSk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBOVUxMKTsKKwlzbmRfY2FyZF9mcmVlKGRldl9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKKwlkZXZfc2V0X2RydmRhdGEoZGV2cHRyLCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX29wdGk5eHhfZHJpdmVyID0gewotCS5wcm9iZQkJPSBzbmRfb3B0aTl4eF9ub25wbnBfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzbmRfb3B0aTl4eF9ub25wbnBfcmVtb3ZlKSwKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBzbmRfb3B0aTl4eF9kcml2ZXIgPSB7CisJLm1hdGNoCQk9IHNuZF9vcHRpOXh4X2lzYV9tYXRjaCwKKwkucHJvYmUJCT0gc25kX29wdGk5eHhfaXNhX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc25kX29wdGk5eHhfaXNhX3JlbW92ZSksCiAJLyogRklYTUU6IHN1c3BlbmQvcmVzdW1lICovCiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gRFJJVkVSX05BTUUKKwkJLm5hbWUJPSBERVZfTkFNRQogCX0sCiB9OwogCiAjaWZkZWYgQ09ORklHX1BOUAotc3RhdGljIGludCBfX2luaXQgc25kX29wdGk5eHhfcG5wX3Byb2JlKHN0cnVjdCBwbnBfY2FyZF9saW5rICpwY2FyZCwKLQkJCQkJY29uc3Qgc3RydWN0IHBucF9jYXJkX2RldmljZV9pZCAqcGlkKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX29wdGk5eHhfcG5wX3Byb2JlKHN0cnVjdCBwbnBfY2FyZF9saW5rICpwY2FyZCwKKwkJCQkJICAgY29uc3Qgc3RydWN0IHBucF9jYXJkX2RldmljZV9pZCAqcGlkKQogewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlpbnQgZXJyb3IsIGh3OwpAQCAtMjA3NCwxMSArMjA4NCw2IEBACiB9OwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUE5QCi0jZGVmaW5lIGlzX2lzYXBucF9zZWxlY3RlZCgpCWlzYXBucAotI2Vsc2UKLSNkZWZpbmUgaXNfaXNhcG5wX3NlbGVjdGVkKCkJMAotI2VuZGlmCiAjaWZkZWYgT1BUaTkzWAogI2RlZmluZSBDSElQX05BTUUJIjgyQzkzeCIKICNlbHNlCkBAIC0yMDg3LDQyICsyMDkyLDE5IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFsc2FfY2FyZF9vcHRpOXh4X2luaXQodm9pZCkKIHsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOwotCiAjaWZkZWYgQ09ORklHX1BOUAogCXBucF9yZWdpc3Rlcl9jYXJkX2RyaXZlcigmb3B0aTl4eF9wbnBjX2RyaXZlcik7CiAJaWYgKHNuZF9vcHRpOXh4X3BucF9pc19wcm9iZWQpCiAJCXJldHVybiAwOwogI2VuZGlmCi0JaWYgKCEgaXNfaXNhcG5wX3NlbGVjdGVkKCkpIHsKLQkJZXJyb3IgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9vcHRpOXh4X2RyaXZlcik7Ci0JCWlmIChlcnJvciA8IDApCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCWRldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoRFJJVkVSX05BTUUsIC0xLCBOVUxMLCAwKTsKLQkJaWYgKCFJU19FUlIoZGV2aWNlKSkgewotCQkJaWYgKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpIHsKLQkJCQlzbmRfb3B0aTl4eF9wbGF0Zm9ybV9kZXZpY2UgPSBkZXZpY2U7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkZXZpY2UpOwotCQl9Ci0JCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfb3B0aTl4eF9kcml2ZXIpOwotCX0KLSNpZmRlZiBDT05GSUdfUE5QCi0JcG5wX3VucmVnaXN0ZXJfY2FyZF9kcml2ZXIoJm9wdGk5eHhfcG5wY19kcml2ZXIpOwotI2VuZGlmCi0jaWZkZWYgTU9EVUxFCi0JcHJpbnRrKEtFUk5fRVJSICJubyBPUFRpICIgQ0hJUF9OQU1FICIgc291bmRjYXJkIGZvdW5kXG4iKTsKLSNlbmRpZgotCXJldHVybiAtRU5PREVWOworCXJldHVybiBpc2FfcmVnaXN0ZXJfZHJpdmVyKCZzbmRfb3B0aTl4eF9kcml2ZXIsIDEpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX29wdGk5eHhfZXhpdCh2b2lkKQogewogCWlmICghc25kX29wdGk5eHhfcG5wX2lzX3Byb2JlZCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzbmRfb3B0aTl4eF9wbGF0Zm9ybV9kZXZpY2UpOwotCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kX29wdGk5eHhfZHJpdmVyKTsKKwkJaXNhX3VucmVnaXN0ZXJfZHJpdmVyKCZzbmRfb3B0aTl4eF9kcml2ZXIpOworCQlyZXR1cm47CiAJfQogI2lmZGVmIENPTkZJR19QTlAKIAlwbnBfdW5yZWdpc3Rlcl9jYXJkX2RyaXZlcigmb3B0aTl4eF9wbnBjX2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2Ivc2IxNi5jIGIvc291bmQvaXNhL3NiL3NiMTYuYwppbmRleCBkNjRlNjdmLi4yYTE5YjBhIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2IxNi5jCisrKyBiL3NvdW5kL2lzYS9zYi9zYjE2LmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvc2IuaD4KQEAgLTEyOCw3ICsxMjgsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhzZXFfcG9ydHMsICJOdW1iZXIgb2Ygc2VxdWVuY2VyIHBvcnRzIGZvciBXYXZlVGFibGUgc3ludGguIik7CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbU05EUlZfQ0FSRFNdOwogI2lmZGVmIENPTkZJR19QTlAKIHN0YXRpYyBpbnQgcG5wX3JlZ2lzdGVyZWQ7CiAjZW5kaWYKQEAgLTUxOSw3ICs1MTgsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9zYjE2X25vbnBucF9wcm9iZTEoaW50IGRldiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX3NiMTZfaXNhX3Byb2JlMShpbnQgZGV2LCBzdHJ1Y3QgZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzbmRfY2FyZF9zYjE2ICphY2FyZDsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CkBAIC01MzksMTkgKzUzOCwyMyBAQAogCWF3ZV9wb3J0W2Rldl0gPSBwb3J0W2Rldl0gKyAweDQwMDsKICNlbmRpZgogCi0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2cHRyLT5kZXYpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAJaWYgKChlcnIgPSBzbmRfc2IxNl9wcm9iZShjYXJkLCBkZXYpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2cHRyLCBjYXJkKTsKKwlkZXZfc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKIAotc3RhdGljIGludCBfX2RldmluaXQgc25kX3NiMTZfbm9ucG5wX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfc2IxNl9pc2FfbWF0Y2goc3RydWN0IGRldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGRldikKIHsKLQlpbnQgZGV2ID0gcGRldi0+aWQ7CisJcmV0dXJuIGVuYWJsZVtkZXZdICYmICFpc19pc2FwbnBfc2VsZWN0ZWQoZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3NiMTZfaXNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBkZXYpCit7CiAJaW50IGVycjsKIAlzdGF0aWMgaW50IHBvc3NpYmxlX2lycXNbXSA9IHs1LCA5LCAxMCwgNywgLTF9OwogCXN0YXRpYyBpbnQgcG9zc2libGVfZG1hczhbXSA9IHsxLCAzLCAwLCAtMX07CkBAIC01NzcsMTMgKzU4MCwxMyBAQAogCX0KIAogCWlmIChwb3J0W2Rldl0gIT0gU05EUlZfQVVUT19QT1JUKQotCQlyZXR1cm4gc25kX3NiMTZfbm9ucG5wX3Byb2JlMShkZXYsIHBkZXYpOworCQlyZXR1cm4gc25kX3NiMTZfaXNhX3Byb2JlMShkZXYsIHBkZXYpOwogCWVsc2UgewogCQlzdGF0aWMgaW50IHBvc3NpYmxlX3BvcnRzW10gPSB7MHgyMjAsIDB4MjQwLCAweDI2MCwgMHgyODB9OwogCQlpbnQgaTsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9zc2libGVfcG9ydHMpOyBpKyspIHsKIAkJCXBvcnRbZGV2XSA9IHBvc3NpYmxlX3BvcnRzW2ldOwotCQkJZXJyID0gc25kX3NiMTZfbm9ucG5wX3Byb2JlMShkZXYsIHBkZXYpOworCQkJZXJyID0gc25kX3NiMTZfaXNhX3Byb2JlMShkZXYsIHBkZXYpOwogCQkJaWYgKCEgZXJyKQogCQkJCXJldHVybiAwOwogCQl9CkBAIC01OTEsNDcgKzU5NCw0NyBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc25kX3NiMTZfbm9ucG5wX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZwdHIpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmRfc2IxNl9pc2FfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBkZXYpCiB7Ci0Jc25kX2NhcmRfZnJlZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOworCXNuZF9jYXJkX2ZyZWUoZGV2X2dldF9kcnZkYXRhKHBkZXYpKTsKKwlkZXZfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgc25kX3NiMTZfbm9ucG5wX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHNuZF9zYjE2X2lzYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4sCisJCQkJcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXJldHVybiBzbmRfc2IxNl9zdXNwZW5kKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldiksIHN0YXRlKTsKKwlyZXR1cm4gc25kX3NiMTZfc3VzcGVuZChkZXZfZ2V0X2RydmRhdGEoZGV2KSwgc3RhdGUpOwogfQogCi1zdGF0aWMgaW50IHNuZF9zYjE2X25vbnBucF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBzbmRfc2IxNl9pc2FfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG4pCiB7Ci0JcmV0dXJuIHNuZF9zYjE2X3Jlc3VtZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlyZXR1cm4gc25kX3NiMTZfcmVzdW1lKGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKIH0KICNlbmRpZgogCiAjaWZkZWYgU05EUlZfU0JBV0UKLSNkZWZpbmUgU05EX1NCMTZfRFJJVkVSCSJzbmRfc2Jhd2UiCisjZGVmaW5lIERFVl9OQU1FICJzYmF3ZSIKICNlbHNlCi0jZGVmaW5lIFNORF9TQjE2X0RSSVZFUgkic25kX3NiMTYiCisjZGVmaW5lIERFVl9OQU1FICJzYjE2IgogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZF9zYjE2X25vbnBucF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IHNuZF9zYjE2X25vbnBucF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9zYjE2X25vbnBucF9yZW1vdmUpLAorc3RhdGljIHN0cnVjdCBpc2FfZHJpdmVyIHNuZF9zYjE2X2lzYV9kcml2ZXIgPSB7CisJLm1hdGNoCQk9IHNuZF9zYjE2X2lzYV9tYXRjaCwKKwkucHJvYmUJCT0gc25kX3NiMTZfaXNhX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc25kX3NiMTZfaXNhX3JlbW92ZSksCiAjaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSBzbmRfc2IxNl9ub25wbnBfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNuZF9zYjE2X25vbnBucF9yZXN1bWUsCisJLnN1c3BlbmQJPSBzbmRfc2IxNl9pc2Ffc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNuZF9zYjE2X2lzYV9yZXN1bWUsCiAjZW5kaWYKIAkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSBTTkRfU0IxNl9EUklWRVIKKwkJLm5hbWUJPSBERVZfTkFNRQogCX0sCiB9OwogCiAKICNpZmRlZiBDT05GSUdfUE5QCi1zdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdGRhdGEgc2IxNl9wbnBfZGV2aWNlczsKLQogc3RhdGljIGludCBfX2RldmluaXQgc25kX3NiMTZfcG5wX2RldGVjdChzdHJ1Y3QgcG5wX2NhcmRfbGluayAqcGNhcmQsCiAJCQkJCSBjb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICpwaWQpCiB7CkBAIC02NTMsNyArNjU2LDYgQEAKIAkJfQogCQlwbnBfc2V0X2NhcmRfZHJ2ZGF0YShwY2FyZCwgY2FyZCk7CiAJCWRldisrOwotCQlzYjE2X3BucF9kZXZpY2VzKys7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNjk1LDY4ICs2OTcsMjkgQEAKIAogI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KIAotc3RhdGljIHZvaWQgX19pbml0X29yX21vZHVsZSBzbmRfc2IxNl91bnJlZ2lzdGVyX2FsbCh2b2lkKQotewotCWludCBpOwotCi0jaWZkZWYgQ09ORklHX1BOUAotCWlmIChwbnBfcmVnaXN0ZXJlZCkKLQkJcG5wX3VucmVnaXN0ZXJfY2FyZF9kcml2ZXIoJnNiMTZfcG5wY19kcml2ZXIpOwotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2aWNlcyk7ICsraSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGxhdGZvcm1fZGV2aWNlc1tpXSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZF9zYjE2X25vbnBucF9kcml2ZXIpOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfc2IxNl9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGVyciwgY2FyZHMgPSAwOworCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kX3NiMTZfbm9ucG5wX2RyaXZlcikpIDwgMCkKKwllcnIgPSBpc2FfcmVnaXN0ZXJfZHJpdmVyKCZzbmRfc2IxNl9pc2FfZHJpdmVyLCBTTkRSVl9DQVJEUyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7IGkrKykgewotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7Ci0JCWlmICghIGVuYWJsZVtpXSB8fCBpc19pc2FwbnBfc2VsZWN0ZWQoaSkpCi0JCQljb250aW51ZTsKLQkJZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShTTkRfU0IxNl9EUklWRVIsCi0JCQkJCQkJIGksIE5VTEwsIDApOwotCQlpZiAoSVNfRVJSKGRldmljZSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCFwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZpY2UpKSB7Ci0JCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkZXZpY2UpOwotCQkJY29udGludWU7Ci0JCX0KLQkJcGxhdGZvcm1fZGV2aWNlc1tpXSA9IGRldmljZTsKLQkJY2FyZHMrKzsKLQl9CiAjaWZkZWYgQ09ORklHX1BOUAogCS8qIFBuUCBjYXJkcyBhdCBsYXN0ICovCiAJZXJyID0gcG5wX3JlZ2lzdGVyX2NhcmRfZHJpdmVyKCZzYjE2X3BucGNfZHJpdmVyKTsKLQlpZiAoIWVycikgeworCWlmICghZXJyKQogCQlwbnBfcmVnaXN0ZXJlZCA9IDE7Ci0JCWNhcmRzICs9IHNiMTZfcG5wX2RldmljZXM7Ci0JfQogI2VuZGlmCi0KLQlpZiAoIWNhcmRzKSB7Ci0jaWZkZWYgTU9EVUxFCi0JCXNuZF9wcmludGsoS0VSTl9FUlIgIlNvdW5kIEJsYXN0ZXIgMTYgc291bmRjYXJkIG5vdCBmb3VuZCBvciBkZXZpY2UgYnVzeVxuIik7Ci0jaWZkZWYgU05EUlZfU0JBV0VfRU1VODAwMAotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJJbiBjYXNlLCBpZiB5b3UgaGF2ZSBub24tQVdFIGNhcmQsIHRyeSBzbmQtc2IxNiBtb2R1bGVcbiIpOwotI2Vsc2UKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiSW4gY2FzZSwgaWYgeW91IGhhdmUgQVdFIGNhcmQsIHRyeSBzbmQtc2Jhd2UgbW9kdWxlXG4iKTsKLSNlbmRpZgotI2VuZGlmCi0JCXNuZF9zYjE2X3VucmVnaXN0ZXJfYWxsKCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9zYjE2X2V4aXQodm9pZCkKIHsKLQlzbmRfc2IxNl91bnJlZ2lzdGVyX2FsbCgpOworI2lmZGVmIENPTkZJR19QTlAKKwlpZiAocG5wX3JlZ2lzdGVyZWQpCisJCXBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKCZzYjE2X3BucGNfZHJpdmVyKTsKKyNlbmRpZgorCWlzYV91bnJlZ2lzdGVyX2RyaXZlcigmc25kX3NiMTZfaXNhX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGFsc2FfY2FyZF9zYjE2X2luaXQpCmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYyBiL3NvdW5kL2lzYS9zYi9zYjE2X2NzcC5jCmluZGV4IDNkOWQ3ZTAuLmIyNzlmMjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjE2X2NzcC5jCisrKyBiL3NvdW5kL2lzYS9zYi9zYjE2X2NzcC5jCkBAIC0zNiw2ICszNiwxMyBAQAogTU9EVUxFX0FVVEhPUigiVXJvcyBCaXpqYWsgPHVyb3NAa3NzLWxva2Euc2k+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgZHJpdmVyIGZvciBTQjE2IENyZWF0aXZlIFNpZ25hbCBQcm9jZXNzb3IiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNpZm5kZWYgQ09ORklHX1NORF9TQjE2X0NTUF9GSVJNV0FSRV9JTl9LRVJORUwKK01PRFVMRV9GSVJNV0FSRSgic2IxNi9tdWxhd19tYWluLmNzcCIpOworTU9EVUxFX0ZJUk1XQVJFKCJzYjE2L2FsYXdfbWFpbi5jc3AiKTsKK01PRFVMRV9GSVJNV0FSRSgic2IxNi9pbWFfYWRwY21faW5pdC5jc3AiKTsKK01PRFVMRV9GSVJNV0FSRSgic2IxNi9pbWFfYWRwY21fcGxheWJhY2suY3NwIik7CitNT0RVTEVfRklSTVdBUkUoInNiMTYvaW1hX2FkcGNtX2NhcHR1cmUuY3NwIik7CisjZW5kaWYKIAogI2lmZGVmIFNORFJWX0xJVFRMRV9FTkRJQU4KICNkZWZpbmUgQ1NQX0hEUl9WQUxVRShhLGIsYyxkKQkoKGEpIHwgKChiKTw8OCkgfCAoKGMpPDwxNikgfCAoKGQpPDwyNCkpCkBAIC0xNjEsMTMgKzE2OCwxNyBAQAogICovCiBzdGF0aWMgdm9pZCBzbmRfc2JfY3NwX2ZyZWUoc3RydWN0IHNuZF9od2RlcCAqaHdkZXApCiB7CisjaWZuZGVmIENPTkZJR19TTkRfU0IxNl9DU1BfRklSTVdBUkVfSU5fS0VSTkVMCiAJaW50IGk7CisjZW5kaWYKIAlzdHJ1Y3Qgc25kX3NiX2NzcCAqcCA9IGh3ZGVwLT5wcml2YXRlX2RhdGE7CiAJaWYgKHApIHsKIAkJaWYgKHAtPnJ1bm5pbmcgJiBTTkRSVl9TQl9DU1BfU1RfUlVOTklORykKIAkJCXNuZF9zYl9jc3Bfc3RvcChwKTsKKyNpZm5kZWYgQ09ORklHX1NORF9TQjE2X0NTUF9GSVJNV0FSRV9JTl9LRVJORUwKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocC0+Y3NwX3Byb2dyYW1zKTsgKytpKQogCQkJcmVsZWFzZV9maXJtd2FyZShwLT5jc3BfcHJvZ3JhbXNbaV0pOworI2VuZGlmCiAJCWtmcmVlKHApOwogCX0KIH0KQEAgLTY5MCw5ICs3MDEsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNkZWZpbmUgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAotCi0jaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorI2lmZGVmIENPTkZJR19TTkRfU0IxNl9DU1BfRklSTVdBUkVfSU5fS0VSTkVMCiAjaW5jbHVkZSAic2IxNl9jc3BfY29kZWNzLmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgc25kX3NiX2NzcF9zdGF0aWNfcHJvZ3JhbXNbXSA9IHsKQEAgLTcxNCwyMiArNzIzLDE5IEBACiAJCSJzYjE2L2ltYV9hZHBjbV9jYXB0dXJlLmNzcCIsCiAJfTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnByb2dyYW07Ci0JaW50IGVycjsKIAogCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKG5hbWVzKSAhPSBDU1BfUFJPR1JBTV9DT1VOVCk7CiAJcHJvZ3JhbSA9IHAtPmNzcF9wcm9ncmFtc1tpbmRleF07CiAJaWYgKCFwcm9ncmFtKSB7Ci0JCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJnByb2dyYW0sIG5hbWVzW2luZGV4XSwKLQkJCQkgICAgICAgcC0+Y2hpcC0+Y2FyZC0+ZGV2KTsKLQkJaWYgKGVyciA+PSAwKQotCQkJcC0+Y3NwX3Byb2dyYW1zW2luZGV4XSA9IHByb2dyYW07Ci0JCWVsc2UgewotI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKLQkJCXByb2dyYW0gPSAmc25kX3NiX2NzcF9zdGF0aWNfcHJvZ3JhbXNbaW5kZXhdOworI2lmZGVmIENPTkZJR19TTkRfU0IxNl9DU1BfRklSTVdBUkVfSU5fS0VSTkVMCisJCXByb2dyYW0gPSAmc25kX3NiX2NzcF9zdGF0aWNfcHJvZ3JhbXNbaW5kZXhdOwogI2Vsc2UKKwkJaW50IGVyciA9IHJlcXVlc3RfZmlybXdhcmUoJnByb2dyYW0sIG5hbWVzW2luZGV4XSwKKwkJCQkgICAgICAgcC0+Y2hpcC0+Y2FyZC0+ZGV2KTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogI2VuZGlmCi0JCX0KKwkJcC0+Y3NwX3Byb2dyYW1zW2luZGV4XSA9IHByb2dyYW07CiAJfQogCXJldHVybiBzbmRfc2JfY3NwX2xvYWQocCwgcHJvZ3JhbS0+ZGF0YSwgcHJvZ3JhbS0+c2l6ZSwgZmxhZ3MpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL3NiOC5jIGIvc291bmQvaXNhL3NiL3NiOC5jCmluZGV4IGJlMWU4M2UuLmExYjM3ODYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjguYworKysgYi9zb3VuZC9pc2Evc2Ivc2I4LmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CkBAIC01Niw4ICs1Niw2IEBACiBtb2R1bGVfcGFyYW1fYXJyYXkoZG1hOCwgaW50LCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZG1hOCwgIjgtYml0IERNQSAjIGZvciBTQjggZHJpdmVyLiIpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tTTkRSVl9DQVJEU107Ci0KIHN0cnVjdCBzbmRfc2I4IHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmZtX3JlczsJLyogdXNlZCB0byBibG9jayBGTSBpL28gcmVnaW9uIGZvciBsZWdhY3kgY2FyZHMgKi8KIAlzdHJ1Y3Qgc25kX3NiICpjaGlwOwpAQCAtODMsOSArODEsMjMgQEAKIAlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKGFjYXJkLT5mbV9yZXMpOwogfQogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfc2I4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfc2I4X21hdGNoKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBkZXYpCiB7Ci0JaW50IGRldiA9IHBkZXYtPmlkOworCWlmICghZW5hYmxlW2Rldl0pCisJCXJldHVybiAwOworCWlmIChpcnFbZGV2XSA9PSBTTkRSVl9BVVRPX0lSUSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogcGxlYXNlIHNwZWNpZnkgaXJxXG4iLCBwZGV2LT5idXNfaWQpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGRtYThbZGV2XSA9PSBTTkRSVl9BVVRPX0RNQSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlczogcGxlYXNlIHNwZWNpZnkgZG1hOFxuIiwgcGRldi0+YnVzX2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfc2I4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBkZXYpCit7CiAJc3RydWN0IHNuZF9zYiAqY2hpcDsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9zYjggKmFjYXJkOwpAQCAtMTgwLDEyICsxOTIsMTIgQEAKIAkJY2hpcC0+cG9ydCwKIAkJaXJxW2Rldl0sIGRtYThbZGV2XSk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZwZGV2LT5kZXYpOworCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgcGRldik7CiAKIAlpZiAoKGVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpKSA8IDApCiAJCWdvdG8gX2VycjsKIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCWRldl9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKIAlyZXR1cm4gMDsKIAogIF9lcnI6CkBAIC0xOTMsMTcgKzIwNSwxOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9zYjhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzbmRfc2I4X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgZGV2KQogewotCXNuZF9jYXJkX2ZyZWUocGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldikpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXNuZF9jYXJkX2ZyZWUoZGV2X2dldF9kcnZkYXRhKHBkZXYpKTsKKwlkZXZfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgc25kX3NiOF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBzbmRfc2I4X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbiwKKwkJCSAgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzbmRfc2I4ICphY2FyZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NiICpjaGlwID0gYWNhcmQtPmNoaXA7CiAKQEAgLTIxMyw5ICsyMjYsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNuZF9zYjhfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc25kX3NiOF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbikKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzbmRfc2I4ICphY2FyZCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc25kX3NiICpjaGlwID0gYWNhcmQtPmNoaXA7CiAKQEAgLTIyNiw5ICsyMzksMTAgQEAKIH0KICNlbmRpZgogCi0jZGVmaW5lIFNORF9TQjhfRFJJVkVSCSJzbmRfc2I4IgorI2RlZmluZSBERVZfTkFNRSAic2I4IgogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfc2I4X2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBzbmRfc2I4X2RyaXZlciA9IHsKKwkubWF0Y2gJCT0gc25kX3NiOF9tYXRjaCwKIAkucHJvYmUJCT0gc25kX3NiOF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF9zYjhfcmVtb3ZlKSwKICNpZmRlZiBDT05GSUdfUE0KQEAgLTIzNiw1NiArMjUwLDE4IEBACiAJLnJlc3VtZQkJPSBzbmRfc2I4X3Jlc3VtZSwKICNlbmRpZgogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9IFNORF9TQjhfRFJJVkVSCisJCS5uYW1lCT0gREVWX05BTUUgCiAJfSwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUgc25kX3NiOF91bnJlZ2lzdGVyX2FsbCh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGV2aWNlcyk7ICsraSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlc1tpXSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZF9zYjhfZHJpdmVyKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX3NiOF9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGNhcmRzLCBlcnI7Ci0KLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9zYjhfZHJpdmVyKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWNhcmRzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgU05EUlZfQ0FSRFM7IGkrKykgewotCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2U7Ci0JCWlmICghIGVuYWJsZVtpXSkKLQkJCWNvbnRpbnVlOwotCQlkZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKFNORF9TQjhfRFJJVkVSLAotCQkJCQkJCSBpLCBOVUxMLCAwKTsKLQkJaWYgKElTX0VSUihkZXZpY2UpKQotCQkJY29udGludWU7Ci0JCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWRldmljZXNbaV0gPSBkZXZpY2U7Ci0JCWNhcmRzKys7Ci0JfQotCWlmICghY2FyZHMpIHsKLSNpZmRlZiBNT0RVTEUKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiU291bmQgQmxhc3RlciBzb3VuZGNhcmQgbm90IGZvdW5kIG9yIGRldmljZSBidXN5XG4iKTsKLSNlbmRpZgotCQlzbmRfc2I4X3VucmVnaXN0ZXJfYWxsKCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gaXNhX3JlZ2lzdGVyX2RyaXZlcigmc25kX3NiOF9kcml2ZXIsIFNORFJWX0NBUkRTKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9zYjhfZXhpdCh2b2lkKQogewotCXNuZF9zYjhfdW5yZWdpc3Rlcl9hbGwoKTsKKwlpc2FfdW5yZWdpc3Rlcl9kcml2ZXIoJnNuZF9zYjhfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoYWxzYV9jYXJkX3NiOF9pbml0KQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NnYWxheHkuYyBiL3NvdW5kL2lzYS9zZ2FsYXh5LmMKaW5kZXggNGZjZDBmNC4uOTIyNTE5ZCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NnYWxheHkuYworKysgYi9zb3VuZC9pc2Evc2dhbGF4eS5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtNjQsOCArNjQsNiBAQAogbW9kdWxlX3BhcmFtX2FycmF5KGRtYTEsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRtYTEsICJETUExICMgZm9yIFNvdW5kIEdhbGF4eSBkcml2ZXIuIik7CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW1NORFJWX0NBUkRTXTsKLQogI2RlZmluZSBTR0FMQVhZX0FVWENfTEVGVCAxOAogI2RlZmluZSBTR0FMQVhZX0FVWENfUklHSFQgMTkKIApAQCAtOTYsNyArOTQsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfc2dhbGF4eV9zYmRzcF9jb21tYW5kKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgY2hhciB2YWwpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfc2dhbGF4eV9zYmRzcF9jb21tYW5kKHVuc2lnbmVkIGxvbmcgcG9ydCwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgdmFsKQogewogCWludCBpOwogICAgICAgIAkKQEAgLTExNCw3ICsxMTMsNyBAQAogCXJldHVybiBJUlFfTk9ORTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc25kX3NnYWxheHlfc2V0dXBfd3NzKHVuc2lnbmVkIGxvbmcgcG9ydCwgaW50IGlycSwgaW50IGRtYSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9zZ2FsYXh5X3NldHVwX3dzcyh1bnNpZ25lZCBsb25nIHBvcnQsIGludCBpcnEsIGludCBkbWEpCiB7CiAJc3RhdGljIGludCBpbnRlcnJ1cHRfYml0c1tdID0gey0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAweDA4LCAtMSwgCiAJCQkJICAgICAgIDB4MTAsIDB4MTgsIDB4MjAsIC0xLCAtMSwgLTEsIC0xfTsKQEAgLTE2MSw3ICsxNjAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfc2dhbGF4eV9kZXRlY3QoaW50IGRldiwgaW50IGlycSwgaW50IGRtYSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9zZ2FsYXh5X2RldGVjdChpbnQgZGV2LCBpbnQgaXJxLCBpbnQgZG1hKQogewogI2lmIDAKIAlzbmRfcHJpbnRkZChQRlggInN3aXRjaGluZyB0byBXU1MgbW9kZVxuIik7CkBAIC0xODIsNyArMTgxLDcgQEAKIEFEMTg0OF9ET1VCTEUoIkF1eCBQbGF5YmFjayBWb2x1bWUiLCAwLCBTR0FMQVhZX0FVWENfTEVGVCwgU0dBTEFYWV9BVVhDX1JJR0hULCAwLCAwLCAzMSwgMCkKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNuZF9zZ2FsYXh5X21peGVyKHN0cnVjdCBzbmRfYWQxODQ4ICpjaGlwKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX3NnYWxheHlfbWl4ZXIoc3RydWN0IHNuZF9hZDE4NDggKmNoaXApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gY2hpcC0+Y2FyZDsKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkMSwgaWQyOwpAQCAtMjE4LDIzICsyMTcsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc25kX3NnYWxheHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2cHRyKQorc3RhdGljIGludCBfX2RldmluaXQgc25kX3NnYWxheHlfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2cHRyLCB1bnNpZ25lZCBpbnQgZGV2KQogewotCWludCBkZXYgPSBkZXZwdHItPmlkOworCWlmICghZW5hYmxlW2Rldl0pCisJCXJldHVybiAwOworCWlmIChzYnBvcnRbZGV2XSA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggInNwZWNpZnkgU0IgcG9ydFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAod3NzcG9ydFtkZXZdID09IFNORFJWX0FVVE9fUE9SVCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFBGWCAic3BlY2lmeSBXU1MgcG9ydFxuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc25kX3NnYWxheHlfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2cHRyLCB1bnNpZ25lZCBpbnQgZGV2KQorewogCXN0YXRpYyBpbnQgcG9zc2libGVfaXJxc1tdID0gezcsIDksIDEwLCAxMSwgLTF9OwogCXN0YXRpYyBpbnQgcG9zc2libGVfZG1hc1tdID0gezEsIDMsIDAsIC0xfTsKIAlpbnQgZXJyLCB4aXJxLCB4ZG1hMTsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9hZDE4NDggKmNoaXA7CiAKLQlpZiAoc2Jwb3J0W2Rldl0gPT0gU05EUlZfQVVUT19QT1JUKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgUEZYICJzcGVjaWZ5IFNCIHBvcnRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHdzc3BvcnRbZGV2XSA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiBQRlggInNwZWNpZnkgV1NTIHBvcnRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleFtkZXZdLCBpZFtkZXZdLCBUSElTX01PRFVMRSwgMCk7CiAJaWYgKGNhcmQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yODMsMTIgKzI4OCwxMiBAQAogCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICJTb3VuZCBHYWxheHkgYXQgMHglbHgsIGlycSAlZCwgZG1hICVkIiwKIAkJd3NzcG9ydFtkZXZdLCB4aXJxLCB4ZG1hMSk7CiAKLQlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsICZkZXZwdHItPmRldik7CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCBkZXZwdHIpOwogCiAJaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKQogCQlnb3RvIF9lcnI7CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIGNhcmQpOworCWRldl9zZXRfZHJ2ZGF0YShkZXZwdHIsIGNhcmQpOwogCXJldHVybiAwOwogCiAgX2VycjoKQEAgLTI5NiwxNyArMzAxLDE4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc25kX3NnYWxheHlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9zZ2FsYXh5X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZwdHIsIHVuc2lnbmVkIGludCBkZXYpCiB7Ci0Jc25kX2NhcmRfZnJlZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOworCXNuZF9jYXJkX2ZyZWUoZGV2X2dldF9kcnZkYXRhKGRldnB0cikpOworCWRldl9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOwogCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHNuZF9zZ2FsYXh5X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBzbmRfc2dhbGF4eV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBuLAorCQkJICAgICAgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IHNuZF9hZDE4NDggKmNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CiAKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CkBAIC0zMTQsOSArMzIwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzbmRfc2dhbGF4eV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgc25kX3NnYWxheHlfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBuKQogewotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3Qgc25kX2FkMTg0OCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKIAogCWNoaXAtPnJlc3VtZShjaGlwKTsKQEAgLTMyOCw5ICszMzQsMTAgQEAKIH0KICNlbmRpZgogCi0jZGVmaW5lIFNORF9TR0FMQVhZX0RSSVZFUgkic25kX3NnYWxheHkiCisjZGVmaW5lIERFVl9OQU1FICJzZ2FsYXh5IgogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfc2dhbGF4eV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgc25kX3NnYWxheHlfZHJpdmVyID0geworCS5tYXRjaAkJPSBzbmRfc2dhbGF4eV9tYXRjaCwKIAkucHJvYmUJCT0gc25kX3NnYWxheHlfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzbmRfc2dhbGF4eV9yZW1vdmUpLAogI2lmZGVmIENPTkZJR19QTQpAQCAtMzM4LDU2ICszNDUsMTggQEAKIAkucmVzdW1lCQk9IHNuZF9zZ2FsYXh5X3Jlc3VtZSwKICNlbmRpZgogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9IFNORF9TR0FMQVhZX0RSSVZFUgorCQkubmFtZQk9IERFVl9OQU1FCiAJfSwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUgc25kX3NnYWxheHlfdW5yZWdpc3Rlcl9hbGwodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRldmljZXMpOyArK2kpCi0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZXNbaV0pOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfc2dhbGF4eV9kcml2ZXIpOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfc2dhbGF4eV9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGNhcmRzLCBlcnI7Ci0KLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9zZ2FsYXh5X2RyaXZlcik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQljYXJkcyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKLQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOwotCQlpZiAoISBlbmFibGVbaV0pCi0JCQljb250aW51ZTsKLQkJZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShTTkRfU0dBTEFYWV9EUklWRVIsCi0JCQkJCQkJIGksIE5VTEwsIDApOwotCQlpZiAoSVNfRVJSKGRldmljZSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCFwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZpY2UpKSB7Ci0JCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkZXZpY2UpOwotCQkJY29udGludWU7Ci0JCX0KLQkJZGV2aWNlc1tpXSA9IGRldmljZTsKLQkJY2FyZHMrKzsKLQl9Ci0JaWYgKCFjYXJkcykgewotI2lmZGVmIE1PRFVMRQotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJTb3VuZCBHYWxheHkgc291bmRjYXJkIG5vdCBmb3VuZCBvciBkZXZpY2UgYnVzeVxuIik7Ci0jZW5kaWYKLQkJc25kX3NnYWxheHlfdW5yZWdpc3Rlcl9hbGwoKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiAwOworCXJldHVybiBpc2FfcmVnaXN0ZXJfZHJpdmVyKCZzbmRfc2dhbGF4eV9kcml2ZXIsIFNORFJWX0NBUkRTKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGFsc2FfY2FyZF9zZ2FsYXh5X2V4aXQodm9pZCkKIHsKLQlzbmRfc2dhbGF4eV91bnJlZ2lzdGVyX2FsbCgpOworCWlzYV91bnJlZ2lzdGVyX2RyaXZlcigmc25kX3NnYWxheHlfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoYWxzYV9jYXJkX3NnYWxheHlfaW5pdCkKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zc2NhcGUuYyBiL3NvdW5kL2lzYS9zc2NhcGUuYwppbmRleCBiMWYyNTgyLi4wOGMxNDk3IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc3NjYXBlLmMKKysrIGIvc291bmQvaXNhL3NzY2FwZS5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTY4LDggKzY4LDYgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShkbWEsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRtYSwgIkRNQSAjIGZvciBTb3VuZFNjYXBlIGRyaXZlci4iKTsKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRmb3JtX2RldmljZXNbU05EUlZfQ0FSRFNdOwotICAKICNpZmRlZiBDT05GSUdfUE5QCiBzdGF0aWMgaW50IHBucF9yZWdpc3RlcmVkOwogc3RhdGljIHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgc3NjYXBlX3BucGlkc1tdID0gewpAQCAtMTI1NCw5ICsxMjUyLDI3IEBACiB9CiAKIAotc3RhdGljIGludCBfX2RldmluaXQgc25kX3NzY2FwZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgc25kX3NzY2FwZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgaSkKIHsKLQlpbnQgZGV2ID0gcGRldi0+aWQ7CisJLyoKKwkgKiBNYWtlIHN1cmUgd2Ugd2VyZSBnaXZlbiBBTEwgb2YgdGhlIG90aGVyIHBhcmFtZXRlcnMuCisJICovCisJaWYgKHBvcnRbaV0gPT0gU05EUlZfQVVUT19QT1JUKQorCQlyZXR1cm4gMDsKKworCWlmIChpcnFbaV0gPT0gU05EUlZfQVVUT19JUlEgfHwKKwkgICAgbXB1X2lycVtpXSA9PSBTTkRSVl9BVVRPX0lSUSB8fAorCSAgICBkbWFbaV0gPT0gU05EUlZfQVVUT19ETUEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgInNzY2FwZTogaW5zdWZmaWNpZW50IHBhcmFtZXRlcnMsIG5lZWQgSU8sIElSUSwgTVBVLUlSUSBhbmQgRE1BXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9zc2NhcGVfcHJvYmUoc3RydWN0IGRldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGRldikKK3sKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IHJldDsKIApAQCAtMTI2NCwzMCArMTI4MCwzMSBAQAogCXJldCA9IGNyZWF0ZV9zc2NhcGUoZGV2LCAmY2FyZCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0Jc25kX2NhcmRfc2V0X2RldihjYXJkLCAmcGRldi0+ZGV2KTsKKwlzbmRfY2FyZF9zZXRfZGV2KGNhcmQsIHBkZXYpOwogCWlmICgocmV0ID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCkpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgInNzY2FwZTogRmFpbGVkIHRvIHJlZ2lzdGVyIHNvdW5kIGNhcmRcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKwlkZXZfc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9zc2NhcGVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNuZF9zc2NhcGVfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldnB0ciwgdW5zaWduZWQgaW50IGRldikKIHsKLQlzbmRfY2FyZF9mcmVlKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldnB0cikpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldnB0ciwgTlVMTCk7CisJc25kX2NhcmRfZnJlZShkZXZfZ2V0X2RydmRhdGEoZGV2cHRyKSk7CisJZGV2X3NldF9kcnZkYXRhKGRldnB0ciwgTlVMTCk7CiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgU1NDQVBFX0RSSVZFUgkic25kX3NzY2FwZSIKKyNkZWZpbmUgREVWX05BTUUgInNzY2FwZSIKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX3NzY2FwZV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgc25kX3NzY2FwZV9kcml2ZXIgPSB7CisJLm1hdGNoCQk9IHNuZF9zc2NhcGVfbWF0Y2gsCiAJLnByb2JlCQk9IHNuZF9zc2NhcGVfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzbmRfc3NjYXBlX3JlbW92ZSksCiAJLyogRklYTUU6IHN1c3BlbmQvcmVzdW1lICovCiAJLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gU1NDQVBFX0RSSVZFUgorCQkubmFtZQk9IERFVl9OQU1FCiAJfSwKIH07CiAKQEAgLTEzODYsNzIgKzE0MDMsNiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BOUCAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXRfb3JfbW9kdWxlIHNzY2FwZV91bnJlZ2lzdGVyX2FsbCh2b2lkKQotewotCWludCBpOwotCi0jaWZkZWYgQ09ORklHX1BOUAotCWlmIChwbnBfcmVnaXN0ZXJlZCkKLQkJcG5wX3VucmVnaXN0ZXJfY2FyZF9kcml2ZXIoJnNzY2FwZV9wbnBjX2RyaXZlcik7Ci0jZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwbGF0Zm9ybV9kZXZpY2VzKTsgKytpKQotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwbGF0Zm9ybV9kZXZpY2VzW2ldKTsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kX3NzY2FwZV9kcml2ZXIpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBzc2NhcGVfbWFudWFsX3Byb2JlKHZvaWQpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlOwotCWludCBpLCByZXQ7Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuZF9zc2NhcGVfZHJpdmVyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9DQVJEUzsgKytpKSB7Ci0JCS8qCi0JCSAqIFdlIGRvIE5PVCBwcm9iZSBmb3IgcG9ydHMuCi0JCSAqIElmIHdlJ3JlIG5vdCBnaXZlbiBhIHBvcnQgbnVtYmVyIGZvciB0aGlzCi0JCSAqIGNhcmQgdGhlbiB3ZSBjb21wbGV0ZWx5IGlnbm9yZSB0aGlzIGxpbmUKLQkJICogb2YgcGFyYW1ldGVycy4KLQkJICovCi0JCWlmIChwb3J0W2ldID09IFNORFJWX0FVVE9fUE9SVCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qCi0JCSAqIE1ha2Ugc3VyZSB3ZSB3ZXJlIGdpdmVuIEFMTCBvZiB0aGUgb3RoZXIgcGFyYW1ldGVycy4KLQkJICovCi0JCWlmIChpcnFbaV0gPT0gU05EUlZfQVVUT19JUlEgfHwKLQkJICAgIG1wdV9pcnFbaV0gPT0gU05EUlZfQVVUT19JUlEgfHwKLQkJICAgIGRtYVtpXSA9PSBTTkRSVl9BVVRPX0RNQSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICAgICJzc2NhcGU6IGluc3VmZmljaWVudCBwYXJhbWV0ZXJzLCBuZWVkIElPLCBJUlEsIE1QVS1JUlEgYW5kIERNQVxuIik7Ci0JCQlzc2NhcGVfdW5yZWdpc3Rlcl9hbGwoKTsKLQkJCXJldHVybiAtRU5YSU87Ci0JCX0KLQotCQkvKgotCQkgKiBUaGlzIGNhcmRzIGxvb2tzIE9LIC4uLgotCQkgKi8KLQkJZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShTU0NBUEVfRFJJVkVSLAotCQkJCQkJCSBpLCBOVUxMLCAwKTsKLQkJaWYgKElTX0VSUihkZXZpY2UpKQotCQkJY29udGludWU7Ci0JCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXBsYXRmb3JtX2RldmljZXNbaV0gPSBkZXZpY2U7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzc2NhcGVfZXhpdCh2b2lkKQotewotCXNzY2FwZV91bnJlZ2lzdGVyX2FsbCgpOwotfQotCi0KIHN0YXRpYyBpbnQgX19pbml0IHNzY2FwZV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTE0NjIsNyArMTQxMyw3IEBACiAJICogb2YgYWxsb2NhdGluZyBjYXJkcywgYmVjYXVzZSB0aGUgb3BlcmF0b3IgaXMKIAkgKiBTLVAtRS1MLUwtSS1OLUcgaXQgb3V0IGZvciB1cy4uLgogCSAqLwotCXJldCA9IHNzY2FwZV9tYW51YWxfcHJvYmUoKTsKKwlyZXQgPSBpc2FfcmVnaXN0ZXJfZHJpdmVyKCZzbmRfc3NjYXBlX2RyaXZlciwgU05EUlZfQ0FSRFMpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogI2lmZGVmIENPTkZJR19QTlAKQEAgLTE0NzIsNSArMTQyMywxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBfX2V4aXQgc3NjYXBlX2V4aXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUE5QCisJaWYgKHBucF9yZWdpc3RlcmVkKQorCQlwbnBfdW5yZWdpc3Rlcl9jYXJkX2RyaXZlcigmc3NjYXBlX3BucGNfZHJpdmVyKTsKKyNlbmRpZgorCWlzYV91bnJlZ2lzdGVyX2RyaXZlcigmc25kX3NzY2FwZV9kcml2ZXIpOworfQorCiBtb2R1bGVfaW5pdChzc2NhcGVfaW5pdCk7CiBtb2R1bGVfZXhpdChzc2NhcGVfZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYwppbmRleCBlMmZkZDVmLi43NTY3M2Y3IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jCisrKyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CiAjaW5jbHVkZSA8bGludXgvcG5wLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CkBAIC00MCw3ICs0MCw5IEBACiBzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkgICAgLyogSW5kZXggMC1NQVggKi8KIHN0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJICAgIC8qIElEIGZvciB0aGlzIGNhcmQgKi8KIHN0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFOwkgICAgLyogRW5hYmxlIHRoaXMgY2FyZCAqLworI2lmZGVmIENPTkZJR19QTlAKIHN0YXRpYyBpbnQgaXNhcG5wW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMX07CisjZW5kaWYKIHN0YXRpYyBsb25nIGNzNDIzMl9wY21fcG9ydFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1BPUlQ7CS8qIFBuUCBzZXR1cCAqLwogc3RhdGljIGludCBjczQyMzJfcGNtX2lycVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lSUTsgLyogNSw3LDksMTEsMTIsMTUgKi8KIHN0YXRpYyBsb25nIGNzNDIzMl9tcHVfcG9ydFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1BPUlQ7IC8qIFBuUCBzZXR1cCAqLwpAQCAtODMsOCArODUsNiBAQAogbW9kdWxlX3BhcmFtX2FycmF5KHVzZV9jczQyMzJfbWlkaSwgYm9vbCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHVzZV9jczQyMzJfbWlkaSwgIlVzZSBDUzQyMzIgTVBVLTQwMSBpbnRlcmZhY2UgKGluYWNjZXNzaWJseSBsb2NhdGVkIGluc2lkZSB5b3VyIGNvbXB1dGVyKSIpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2aWNlc1tTTkRSVl9DQVJEU107Ci0KICNpZmRlZiBDT05GSUdfUE5QCiBzdGF0aWMgaW50IHBucF9yZWdpc3RlcmVkOwogCkBAIC01ODgsNTYgKzU4OCw2NyBAQAogCXJldHVybiBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKIH0JCiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNuZF93YXZlZnJvbnRfbm9ucG5wX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfd2F2ZWZyb250X2lzYV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpwZGV2LAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkZXYpCiB7Ci0JaW50IGRldiA9IHBkZXYtPmlkOwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKLQlpbnQgZXJyOwotCisJaWYgKCFlbmFibGVbZGV2XSkKKwkJcmV0dXJuIDA7CisjaWZkZWYgQ09ORklHX1BOUAorCWlmIChpc2FwbnBbZGV2XSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKIAlpZiAoY3M0MjMyX3BjbV9wb3J0W2Rldl0gPT0gU05EUlZfQVVUT19QT1JUKSB7CiAJCXNuZF9wcmludGsoInNwZWNpZnkgQ1M0MjMyIHBvcnRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIDA7CiAJfQogCWlmIChpY3MyMTE1X3BvcnRbZGV2XSA9PSBTTkRSVl9BVVRPX1BPUlQpIHsKIAkJc25kX3ByaW50aygic3BlY2lmeSBJQ1MyMTE1IHBvcnRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIDA7CiAJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfd2F2ZWZyb250X2lzYV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpwZGV2LAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkZXYpCit7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCWludCBlcnI7CiAKIAljYXJkID0gc25kX3dhdmVmcm9udF9jYXJkX25ldyhkZXYpOwogCWlmICghIGNhcmQpCiAJCXJldHVybiAtRU5PTUVNOwotCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBkZXYtPmRldik7CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCBwZGV2KTsKIAlpZiAoKGVyciA9IHNuZF93YXZlZnJvbnRfcHJvYmUoY2FyZCwgZGV2KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CiAJfQogCQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNhcmQpOworCWRldl9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc25kX3dhdmVmcm9udF9ub25wbnBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNuZF93YXZlZnJvbnRfaXNhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZwdHIsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBkZXYpCiB7Ci0Jc25kX2NhcmRfZnJlZShwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZwdHIpKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOworCXNuZF9jYXJkX2ZyZWUoZGV2X2dldF9kcnZkYXRhKGRldnB0cikpOworCWRldl9zZXRfZHJ2ZGF0YShkZXZwdHIsIE5VTEwpOwogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIFdBVkVGUk9OVF9EUklWRVIJInNuZF93YXZlZnJvbnQiCisjZGVmaW5lIERFVl9OQU1FICJ3YXZlZnJvbnQiCiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZF93YXZlZnJvbnRfZHJpdmVyID0gewotCS5wcm9iZQkJPSBzbmRfd2F2ZWZyb250X25vbnBucF9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF93YXZlZnJvbnRfbm9ucG5wX3JlbW92ZSksCitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgc25kX3dhdmVmcm9udF9kcml2ZXIgPSB7CisJLm1hdGNoCQk9IHNuZF93YXZlZnJvbnRfaXNhX21hdGNoLAorCS5wcm9iZQkJPSBzbmRfd2F2ZWZyb250X2lzYV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNuZF93YXZlZnJvbnRfaXNhX3JlbW92ZSksCiAJLyogRklYTUU6IHN1c3BlbmQsIHJlc3VtZSAqLwogCS5kcml2ZXIJCT0gewotCQkubmFtZQk9IFdBVkVGUk9OVF9EUklWRVIKKwkJLm5hbWUJPSBERVZfTkFNRQogCX0sCiB9OwogCiAKICNpZmRlZiBDT05GSUdfUE5QCi1zdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdGRhdGEgd2F2ZWZyb250X3BucF9kZXZpY2VzOwotCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfd2F2ZWZyb250X3BucF9kZXRlY3Qoc3RydWN0IHBucF9jYXJkX2xpbmsgKnBjYXJkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgKnBpZCkKIHsKQEAgLTY3MCw3ICs2ODEsNiBAQAogCiAJcG5wX3NldF9jYXJkX2RydmRhdGEocGNhcmQsIGNhcmQpOwogCWRldisrOwotCXdhdmVmcm9udF9wbnBfZGV2aWNlcysrOwogCXJldHVybiAwOwogfQogCkBAIC02OTEsNjcgKzcwMSwyOCBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BOUCAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXRfb3JfbW9kdWxlIHNuZF93YXZlZnJvbnRfdW5yZWdpc3Rlcl9hbGwodm9pZCkKLXsKLQlpbnQgaTsKLQotI2lmZGVmIENPTkZJR19QTlAKLQlpZiAocG5wX3JlZ2lzdGVyZWQpCi0JCXBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKCZ3YXZlZnJvbnRfcG5wY19kcml2ZXIpOwotI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGxhdGZvcm1fZGV2aWNlcyk7ICsraSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGxhdGZvcm1fZGV2aWNlc1tpXSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNuZF93YXZlZnJvbnRfZHJpdmVyKTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgYWxzYV9jYXJkX3dhdmVmcm9udF9pbml0KHZvaWQpCiB7Ci0JaW50IGksIGVyciwgY2FyZHMgPSAwOworCWludCBlcnI7CiAKLQlpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kX3dhdmVmcm9udF9kcml2ZXIpKSA8IDApCisJZXJyID0gaXNhX3JlZ2lzdGVyX2RyaXZlcigmc25kX3dhdmVmcm9udF9kcml2ZXIsIFNORFJWX0NBUkRTKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9DQVJEUzsgaSsrKSB7Ci0JCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZTsKLQkJaWYgKCEgZW5hYmxlW2ldKQotCQkJY29udGludWU7Ci0jaWZkZWYgQ09ORklHX1BOUAotCQlpZiAoaXNhcG5wW2ldKQotCQkJY29udGludWU7Ci0jZW5kaWYKLQkJZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShXQVZFRlJPTlRfRFJJVkVSLAotCQkJCQkJCSBpLCBOVUxMLCAwKTsKLQkJaWYgKElTX0VSUihkZXZpY2UpKQotCQkJY29udGludWU7Ci0JCWlmICghcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkgewotCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCXBsYXRmb3JtX2RldmljZXNbaV0gPSBkZXZpY2U7Ci0JCWNhcmRzKys7Ci0JfQotCiAjaWZkZWYgQ09ORklHX1BOUAogCWVyciA9IHBucF9yZWdpc3Rlcl9jYXJkX2RyaXZlcigmd2F2ZWZyb250X3BucGNfZHJpdmVyKTsKLQlpZiAoIWVycikgeworCWlmICghZXJyKQogCQlwbnBfcmVnaXN0ZXJlZCA9IDE7Ci0JCWNhcmRzICs9IHdhdmVmcm9udF9wbnBfZGV2aWNlczsKLQl9CiAjZW5kaWYKLQotCWlmICghY2FyZHMpIHsKLSNpZmRlZiBNT0RVTEUKLQkJcHJpbnRrIChLRVJOX0VSUiAiTm8gV2F2ZUZyb250IGNhcmRzIGZvdW5kIG9yIGRldmljZXMgYnVzeVxuIik7Ci0jZW5kaWYKLQkJc25kX3dhdmVmcm9udF91bnJlZ2lzdGVyX2FsbCgpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2NhcmRfd2F2ZWZyb250X2V4aXQodm9pZCkKIHsKLQlzbmRfd2F2ZWZyb250X3VucmVnaXN0ZXJfYWxsKCk7CisjaWZkZWYgQ09ORklHX1BOUAorCWlmIChwbnBfcmVnaXN0ZXJlZCkKKwkJcG5wX3VucmVnaXN0ZXJfY2FyZF9kcml2ZXIoJndhdmVmcm9udF9wbnBjX2RyaXZlcik7CisjZW5kaWYKKwlpc2FfdW5yZWdpc3Rlcl9kcml2ZXIoJnNuZF93YXZlZnJvbnRfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoYWxzYV9jYXJkX3dhdmVmcm9udF9pbml0KQpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfZnguYyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMKaW5kZXggMTUzMzFlZC4uZmM5NWE4NyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfZnguYworKysgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9meC5jCkBAIC0zNSw5ICszNSw3IEBACiAKICNkZWZpbmUgV0FJVF9JRExFCTB4ZmYKIAotI2RlZmluZSBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCi0KLSNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCisjaWZkZWYgQ09ORklHX1NORF9XQVZFRlJPTlRfRklSTVdBUkVfSU5fS0VSTkVMCiAjaW5jbHVkZSAieXNzMjI1LmMiCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpcm13YXJlIHlzczIyNV9yZWdpc3RlcnNfZmlybXdhcmUgPSB7CiAJLmRhdGEgPSAodTggKil5c3MyMjVfcmVnaXN0ZXJzLApAQCAtMjU4LDIxICsyNTYsMjEgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgZXJyOwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZSA9IE5VTEw7CiAKIAlpZiAoZGV2LT5meF9pbml0aWFsaXplZCkKIAkJcmV0dXJuIDA7CiAKKyNpZmRlZiBDT05GSUdfU05EX1dBVkVGUk9OVF9GSVJNV0FSRV9JTl9LRVJORUwKKwlmaXJtd2FyZSA9ICZ5c3MyMjVfcmVnaXN0ZXJzX2Zpcm13YXJlOworI2Vsc2UKIAllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmaXJtd2FyZSwgInlhbWFoYS95c3MyMjVfcmVnaXN0ZXJzLmJpbiIsCiAJCQkgICAgICAgZGV2LT5jYXJkLT5kZXYpOwogCWlmIChlcnIgPCAwKSB7Ci0jaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAotCQlmaXJtd2FyZSA9ICZ5c3MyMjVfcmVnaXN0ZXJzX2Zpcm13YXJlOwotI2Vsc2UKIAkJZXJyID0gLTE7CiAJCWdvdG8gb3V0OwotI2VuZGlmCiAJfQorI2VuZGlmCiAKIAlmb3IgKGkgPSAwOyBpICsgMSA8IGZpcm13YXJlLT5zaXplOyBpICs9IDIpIHsKIAkJaWYgKGZpcm13YXJlLT5kYXRhW2ldID49IDggJiYgZmlybXdhcmUtPmRhdGFbaV0gPCAxNikgewpAQCAtMjk1LDkgKzI5MywxMiBAQAogCWVyciA9IDA7CiAKIG91dDoKLSNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCi0JaWYgKGZpcm13YXJlICE9ICZ5c3MyMjVfcmVnaXN0ZXJzX2Zpcm13YXJlKQorI2lmbmRlZiBDT05GSUdfU05EX1dBVkVGUk9OVF9GSVJNV0FSRV9JTl9LRVJORUwKKwlyZWxlYXNlX2Zpcm13YXJlKGZpcm13YXJlKTsKICNlbmRpZgotCQlyZWxlYXNlX2Zpcm13YXJlKGZpcm13YXJlKTsKIAlyZXR1cm4gZXJyOwogfQorCisjaWZuZGVmIENPTkZJR19TTkRfV0FWRUZST05UX0ZJUk1XQVJFX0lOX0tFUk5FTAorTU9EVUxFX0ZJUk1XQVJFKCJ5YW1haGEveXNzMjI1X3JlZ2lzdGVycy5iaW4iKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL0tjb25maWcgYi9zb3VuZC9wY2kvS2NvbmZpZwppbmRleCAxYmNmYjNhLi42MWUzNWVjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvS2NvbmZpZworKysgYi9zb3VuZC9wY2kvS2NvbmZpZwpAQCAtNTc2LDcgKzU3Niw3IEBACiBjb25maWcgU05EX0tPUkcxMjEyCiAJdHJpc3RhdGUgIktvcmcgMTIxMiBJTyIKIAlkZXBlbmRzIG9uIFNORAotCXNlbGVjdCBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSIGlmICFTTkRfS09SRzEyMTJfRklSTVdBUkVfSU5fS0VSTkVMCiAJc2VsZWN0IFNORF9QQ00KIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgS29yZyAxMjEySU8gc291bmRjYXJkcy4KQEAgLTU4NCwxMCArNTg0LDE5IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzbmQta29yZzEyMTIuCiAKK2NvbmZpZyBTTkRfS09SRzEyMTJfRklSTVdBUkVfSU5fS0VSTkVMCisJYm9vbCAiSW4ta2VybmVsIGZpcm13YXJlIGZvciBLb3JnMTIxMiBkcml2ZXIiCisJZGVwZW5kcyBvbiBTTkRfS09SRzEyMTIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlIHN0YXRpYyBmaXJtd2FyZSBidWlsdCBpbiB0aGUga2VybmVsCisJICBmb3IgdGhlIEtvcmcxMjEyIGRyaXZlci4gIElmIHlvdSBjaG9vc2UgTiBoZXJlLCB5b3UgbmVlZCB0bworCSAgaW5zdGFsbCB0aGUgZmlybXdhcmUgZmlsZXMgZnJvbSB0aGUgYWxzYS1maXJtd2FyZSBwYWNrYWdlLgorCiBjb25maWcgU05EX01BRVNUUk8zCiAJdHJpc3RhdGUgIkVTUyBBbGxlZ3JvL01hZXN0cm8zIgogCWRlcGVuZHMgb24gU05ECi0Jc2VsZWN0IEZXX0xPQURFUgorCXNlbGVjdCBGV19MT0FERVIgaWYgIVNORF9NQUVTVFJPM19GSVJNV0FSRV9JTl9LRVJORUwKIAlzZWxlY3QgU05EX0FDOTdfQ09ERUMKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3Igc291bmRjYXJkcyBiYXNlZCBvbiBFU1MgTWFlc3RybyAzCkBAIC01OTYsNiArNjA1LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzbmQtbWFlc3RybzMuCiAKK2NvbmZpZyBTTkRfTUFFU1RSTzNfRklSTVdBUkVfSU5fS0VSTkVMCisJYm9vbCAiSW4ta2VybmVsIGZpcm13YXJlIGZvciBNYWVzdHJvMyBkcml2ZXIiCisJZGVwZW5kcyBvbiBTTkRfTUFFU1RSTzMKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgdGhlIHN0YXRpYyBmaXJtd2FyZSBidWlsdCBpbiB0aGUga2VybmVsCisJICBmb3IgdGhlIE1hZXN0cm8zIGRyaXZlci4gIElmIHlvdSBjaG9vc2UgTiBoZXJlLCB5b3UgbmVlZCB0bworCSAgaW5zdGFsbCB0aGUgZmlybXdhcmUgZmlsZXMgZnJvbSB0aGUgYWxzYS1maXJtd2FyZSBwYWNrYWdlLgorCiBjb25maWcgU05EX01JWEFSVAogCXRyaXN0YXRlICJEaWdpZ3JhbSBtaVhhcnQiCiAJZGVwZW5kcyBvbiBTTkQKQEAgLTczNyw3ICs3NTUsNyBAQAogY29uZmlnIFNORF9ZTUZQQ0kKIAl0cmlzdGF0ZSAiWWFtYWhhIFlNRjcyNC83NDAvNzQ0Lzc1NCIKIAlkZXBlbmRzIG9uIFNORAotCXNlbGVjdCBGV19MT0FERVIKKwlzZWxlY3QgRldfTE9BREVSIGlmICFTTkRfWU1GUENJX0ZJUk1XQVJFX0lOX0tFUk5FTAogCXNlbGVjdCBTTkRfT1BMM19MSUIKIAlzZWxlY3QgU05EX01QVTQwMV9VQVJUCiAJc2VsZWN0IFNORF9BQzk3X0NPREVDCkBAIC03NDgsNiArNzY2LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzbmQteW1mcGNpLgogCitjb25maWcgU05EX1lNRlBDSV9GSVJNV0FSRV9JTl9LRVJORUwKKwlib29sICJJbi1rZXJuZWwgZmlybXdhcmUgZm9yIFlNRlBDSSBkcml2ZXIiCisJZGVwZW5kcyBvbiBTTkRfWU1GUENJCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIHRoZSBzdGF0aWMgZmlybXdhcmUgYnVpbHQgaW4gdGhlIGtlcm5lbAorCSAgZm9yIHRoZSBZTUZQQ0kgZHJpdmVyLiAgSWYgeW91IGNob29zZSBOIGhlcmUsIHlvdSBuZWVkIHRvCisJICBpbnN0YWxsIHRoZSBmaXJtd2FyZSBmaWxlcyBmcm9tIHRoZSBhbHNhLWZpcm13YXJlIHBhY2thZ2UuCisKIGNvbmZpZyBTTkRfQUM5N19QT1dFUl9TQVZFCiAJYm9vbCAiQUM5NyBQb3dlci1TYXZpbmcgTW9kZSIKIAlkZXBlbmRzIG9uIFNORF9BQzk3X0NPREVDICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvTWFrZWZpbGUgYi9zb3VuZC9wY2kvYWM5Ny9NYWtlZmlsZQppbmRleCAzYzMyMjIxLi5mNWQ0NzE4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9NYWtlZmlsZQorKysgYi9zb3VuZC9wY2kvYWM5Ny9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KICMKIAotc25kLWFjOTctY29kZWMtb2JqcyA6PSBhYzk3X2NvZGVjLm8gYWM5N19wY20ubyBhYzk3X3BhdGNoLm8KK3NuZC1hYzk3LWNvZGVjLW9ianMgOj0gYWM5N19jb2RlYy5vIGFjOTdfcGNtLm8KIAogaWZuZXEgKCQoQ09ORklHX1BST0NfRlMpLCkKIHNuZC1hYzk3LWNvZGVjLW9ianMgKz0gYWM5N19wcm9jLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwppbmRleCAzYmZiMjEwLi5iYmVkNjQ0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCkBAIC0zNSw5ICszNSw5IEBACiAjaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgotI2luY2x1ZGUgImFjOTdfbG9jYWwuaCIKICNpbmNsdWRlICJhYzk3X2lkLmgiCi0jaW5jbHVkZSAiYWM5N19wYXRjaC5oIgorCisjaW5jbHVkZSAiYWM5N19wYXRjaC5jIgogCiBNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlVuaXZlcnNhbCBpbnRlcmZhY2UgZm9yIEF1ZGlvIENvZGVjICc5NyIpOwpAQCAtNDMyLDcgKzQzMiw4IEBACiAgKiBDb250cm9scwogICovCiAKLWludCBzbmRfYWM5N19pbmZvX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQorc3RhdGljIGludCBzbmRfYWM5N19pbmZvX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAlzdHJ1Y3QgYWM5N19lbnVtICplID0gKHN0cnVjdCBhYzk3X2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAkKQEAgLTQ0Niw3ICs0NDcsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc25kX2FjOTdfZ2V0X2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgc25kX2FjOTdfZ2V0X2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IGFjOTdfZW51bSAqZSA9IChzdHJ1Y3QgYWM5N19lbnVtICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CkBAIC00NjIsNyArNDY0LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHNuZF9hYzk3X3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHNuZF9hYzk3X3B1dF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9hYzk3ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCBhYzk3X2VudW0gKmUgPSAoc3RydWN0IGFjOTdfZW51bSAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwpAQCAtNTA4LDcgKzUxMSw4IEBACiB9CiAKIC8qIHZvbHVtZSBhbmQgc3dpdGNoIGNvbnRyb2xzICovCi1pbnQgc25kX2FjOTdfaW5mb192b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3N0YXRpYyBpbnQgc25kX2FjOTdfaW5mb192b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCWludCBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7CiAJaW50IHNoaWZ0ID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDgpICYgMHgwZjsKQEAgLTUyMSw3ICs1MjUsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc25kX2FjOTdfZ2V0X3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgc25kX2FjOTdfZ2V0X3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9hYzk3ICphYzk3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCWludCByZWcgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmY7CkBAIC01NDQsNyArNTQ5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHNuZF9hYzk3X3B1dF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHNuZF9hYzk3X3B1dF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfYWM5NyAqYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlpbnQgcmVnID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmOwpAQCAtNjQ2LDcgKzY1Miw3IEBACiBBQzk3X1NJTkdMRSgiQURDL0RBQyBMb29wYmFjayIsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCA3LCAxLCAwKQogfTsKIAotY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FjOTdfY29udHJvbHNfM2RbMl0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FjOTdfY29udHJvbHNfM2RbMl0gPSB7CiBBQzk3X1NJTkdMRSgiM0QgQ29udHJvbCAtIENlbnRlciIsIEFDOTdfM0RfQ09OVFJPTCwgOCwgMTUsIDApLAogQUM5N19TSU5HTEUoIjNEIENvbnRyb2wgLSBEZXB0aCIsIEFDOTdfM0RfQ09OVFJPTCwgMCwgMTUsIDApCiB9OwpAQCAtODE3LDcgKzgyMyw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FjOTdfY29udHJvbHNfc3BkaWZbNV0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FjOTdfY29udHJvbHNfc3BkaWZbNV0gPSB7CiAJewogCQkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLApAQCAtMTA5Nyw3ICsxMTAzLDcgQEAKIAl9CiB9CiAKLWludCBzbmRfYWM5N190cnlfYml0KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcsIGludCByZWcsIGludCBiaXQpCitzdGF0aWMgaW50IHNuZF9hYzk3X3RyeV9iaXQoc3RydWN0IHNuZF9hYzk3ICogYWM5NywgaW50IHJlZywgaW50IGJpdCkKIHsKIAl1bnNpZ25lZCBzaG9ydCBtYXNrLCB2YWwsIG9yaWcsIHJlczsKIApAQCAtMTEzNyw3ICsxMTQzLDggQEAKIAlyZXR1cm4geDsKIH0KIAotc3RydWN0IHNuZF9rY29udHJvbCAqc25kX2FjOTdfY25ldyhjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqX3RlbXBsYXRlLCBzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2wgKnNuZF9hYzk3X2NuZXcoY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKl90ZW1wbGF0ZSwKKwkJCQkJICBzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRlbXBsYXRlOwogCW1lbWNweSgmdGVtcGxhdGUsIF90ZW1wbGF0ZSwgc2l6ZW9mKHRlbXBsYXRlKSk7CkBAIC0yNTQ0LDcgKzI1NTEsOCBAQAogfQkKIAogLyogcmVtb3ZlIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIHN1ZmZpeCAqLwotaW50IHNuZF9hYzk3X3JlbW92ZV9jdGwoc3RydWN0IHNuZF9hYzk3ICphYzk3LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzdWZmaXgpCitzdGF0aWMgaW50IHNuZF9hYzk3X3JlbW92ZV9jdGwoc3RydWN0IHNuZF9hYzk3ICphYzk3LCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCkKIHsKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkOwogCW1lbXNldCgmaWQsIDAsIHNpemVvZihpZCkpOwpAQCAtMjU2Myw3ICsyNTcxLDggQEAKIH0KIAogLyogcmVuYW1lIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9wdGlvbmFsIHN1ZmZpeCAqLwotaW50IHNuZF9hYzk3X3JlbmFtZV9jdGwoc3RydWN0IHNuZF9hYzk3ICphYzk3LCBjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3VmZml4KQorc3RhdGljIGludCBzbmRfYWM5N19yZW5hbWVfY3RsKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgY29uc3QgY2hhciAqc3JjLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3VmZml4KQogewogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwgPSBjdGxfZmluZChhYzk3LCBzcmMsIHN1ZmZpeCk7CiAJaWYgKGtjdGwpIHsKQEAgLTI1NzQsMTQgKzI1ODMsMTYgQEAKIH0KIAogLyogcmVuYW1lIGJvdGggVm9sdW1lIGFuZCBTd2l0Y2ggY29udHJvbHMgLSBkb24ndCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlICovCi12b2lkIHNuZF9hYzk3X3JlbmFtZV92b2xfY3RsKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyICpkc3QpCitzdGF0aWMgdm9pZCBzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIGNvbnN0IGNoYXIgKnNyYywKKwkJCQkgICAgY29uc3QgY2hhciAqZHN0KQogewogCXNuZF9hYzk3X3JlbmFtZV9jdGwoYWM5Nywgc3JjLCBkc3QsICJTd2l0Y2giKTsKIAlzbmRfYWM5N19yZW5hbWVfY3RsKGFjOTcsIHNyYywgZHN0LCAiVm9sdW1lIik7CiB9CiAKIC8qIHN3YXAgY29udHJvbHMgKi8KLWludCBzbmRfYWM5N19zd2FwX2N0bChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgY29uc3QgY2hhciAqc3VmZml4KQorc3RhdGljIGludCBzbmRfYWM5N19zd2FwX2N0bChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIGNvbnN0IGNoYXIgKnMxLAorCQkJICAgICBjb25zdCBjaGFyICpzMiwgY29uc3QgY2hhciAqc3VmZml4KQogewogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwxLCAqa2N0bDI7CiAJa2N0bDEgPSBjdGxfZmluZChhYzk3LCBzMSwgc3VmZml4KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfbG9jYWwuaCBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfbG9jYWwuaAppbmRleCBhNjI0NGM3Li43ODc0NWM1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2xvY2FsLmgKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19sb2NhbC5oCkBAIC0yMiw1OSArMjIsOCBAQAogICoKICAqLwogCi0jZGVmaW5lIEFDOTdfU0lOR0xFX1ZBTFVFKHJlZyxzaGlmdCxtYXNrLGludmVydCkgKChyZWcpIHwgKChzaGlmdCkgPDwgOCkgfCAoKHNoaWZ0KSA8PCAxMikgfCAoKG1hc2spIDw8IDE2KSB8ICgoaW52ZXJ0KSA8PCAyNCkpCi0jZGVmaW5lIEFDOTdfUEFHRV9TSU5HTEVfVkFMVUUocmVnLHNoaWZ0LG1hc2ssaW52ZXJ0LHBhZ2UpIChBQzk3X1NJTkdMRV9WQUxVRShyZWcsc2hpZnQsbWFzayxpbnZlcnQpIHwgKDE8PDI1KSB8ICgocGFnZSkgPDwgMjYpKQotI2RlZmluZSBBQzk3X1NJTkdMRSh4bmFtZSwgcmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0KSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5mbyA9IHNuZF9hYzk3X2luZm9fdm9sc3csIFwKLSAgLmdldCA9IHNuZF9hYzk3X2dldF92b2xzdywgLnB1dCA9IHNuZF9hYzk3X3B1dF92b2xzdywgXAotICAucHJpdmF0ZV92YWx1ZSA9ICBBQzk3X1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpIH0KLSNkZWZpbmUgQUM5N19QQUdFX1NJTkdMRSh4bmFtZSwgcmVnLCBzaGlmdCwgbWFzaywgaW52ZXJ0LCBwYWdlKQkJXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSB4bmFtZSwgLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LCBcCi0gIC5nZXQgPSBzbmRfYWM5N19nZXRfdm9sc3csIC5wdXQgPSBzbmRfYWM5N19wdXRfdm9sc3csIFwKLSAgLnByaXZhdGVfdmFsdWUgPSAgQUM5N19QQUdFX1NJTkdMRV9WQUxVRShyZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQsIHBhZ2UpIH0KLSNkZWZpbmUgQUM5N19ET1VCTEUoeG5hbWUsIHJlZywgc2hpZnRfbGVmdCwgc2hpZnRfcmlnaHQsIG1hc2ssIGludmVydCkgXAoteyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgLm5hbWUgPSAoeG5hbWUpLCAuaW5mbyA9IHNuZF9hYzk3X2luZm9fdm9sc3csIFwKLSAgLmdldCA9IHNuZF9hYzk3X2dldF92b2xzdywgLnB1dCA9IHNuZF9hYzk3X3B1dF92b2xzdywgXAotICAucHJpdmF0ZV92YWx1ZSA9IChyZWcpIHwgKChzaGlmdF9sZWZ0KSA8PCA4KSB8ICgoc2hpZnRfcmlnaHQpIDw8IDEyKSB8ICgobWFzaykgPDwgMTYpIHwgKChpbnZlcnQpIDw8IDI0KSB9Ci0KLS8qIGVudW0gY29udHJvbCAqLwotc3RydWN0IGFjOTdfZW51bSB7Ci0JdW5zaWduZWQgY2hhciByZWc7Ci0JdW5zaWduZWQgY2hhciBzaGlmdF9sOwotCXVuc2lnbmVkIGNoYXIgc2hpZnRfcjsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrOwotCWNvbnN0IGNoYXIgKip0ZXh0czsKLX07Ci0KLSNkZWZpbmUgQUM5N19FTlVNX0RPVUJMRSh4cmVnLCB4c2hpZnRfbCwgeHNoaWZ0X3IsIHhtYXNrLCB4dGV4dHMpIFwKLXsgLnJlZyA9IHhyZWcsIC5zaGlmdF9sID0geHNoaWZ0X2wsIC5zaGlmdF9yID0geHNoaWZ0X3IsIFwKLSAgLm1hc2sgPSB4bWFzaywgLnRleHRzID0geHRleHRzIH0KLSNkZWZpbmUgQUM5N19FTlVNX1NJTkdMRSh4cmVnLCB4c2hpZnQsIHhtYXNrLCB4dGV4dHMpIFwKLQlBQzk3X0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdCwgeHNoaWZ0LCB4bWFzaywgeHRleHRzKQotI2RlZmluZSBBQzk3X0VOVU0oeG5hbWUsIHhlbnVtKSBcCi17IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5mbyA9IHNuZF9hYzk3X2luZm9fZW51bV9kb3VibGUsIFwKLSAgLmdldCA9IHNuZF9hYzk3X2dldF9lbnVtX2RvdWJsZSwgLnB1dCA9IHNuZF9hYzk3X3B1dF9lbnVtX2RvdWJsZSwgXAotICAucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9Ci0KLS8qIGFjOTdfY29kZWMuYyAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hYzk3X2NvbnRyb2xzXzNkW107Ci1leHRlcm4gY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FjOTdfY29udHJvbHNfc3BkaWZbXTsKLXN0cnVjdCBzbmRfa2NvbnRyb2wgKnNuZF9hYzk3X2NuZXcoY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKl90ZW1wbGF0ZSwgc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci12b2lkIHNuZF9hYzk3X2dldF9uYW1lKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgaW50IGlkLCBjaGFyICpuYW1lLCBpbnQgbW9kZW0pOwotaW50IHNuZF9hYzk3X2luZm9fdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pOwotaW50IHNuZF9hYzk3X2dldF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotaW50IHNuZF9hYzk3X3B1dF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOwotaW50IHNuZF9hYzk3X3RyeV9iaXQoc3RydWN0IHNuZF9hYzk3ICogYWM5NywgaW50IHJlZywgaW50IGJpdCk7Ci1pbnQgc25kX2FjOTdfcmVtb3ZlX2N0bChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnN1ZmZpeCk7Ci1pbnQgc25kX2FjOTdfcmVuYW1lX2N0bChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZHN0LCBjb25zdCBjaGFyICpzdWZmaXgpOwotaW50IHNuZF9hYzk3X3N3YXBfY3RsKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBjb25zdCBjaGFyICpzdWZmaXgpOwotdm9pZCBzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZHN0KTsKLXZvaWQgc25kX2FjOTdfcmVzdG9yZV9zdGF0dXMoc3RydWN0IHNuZF9hYzk3ICphYzk3KTsKLXZvaWQgc25kX2FjOTdfcmVzdG9yZV9pZWM5NTgoc3RydWN0IHNuZF9hYzk3ICphYzk3KTsKLWludCBzbmRfYWM5N19pbmZvX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKTsKLWludCBzbmRfYWM5N19nZXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLWludCBzbmRfYWM5N19wdXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKLQordm9pZCBzbmRfYWM5N19nZXRfbmFtZShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIHVuc2lnbmVkIGludCBpZCwgY2hhciAqbmFtZSwKKwkJICAgICAgIGludCBtb2RlbSk7CiBpbnQgc25kX2FjOTdfdXBkYXRlX2JpdHNfbm9sb2NrKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgdW5zaWduZWQgc2hvcnQgcmVnLAogCQkJCXVuc2lnbmVkIHNob3J0IG1hc2ssIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCmluZGV4IGIxODhhNGQuLjNlYWMwZjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYworKysgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKQEAgLTIzLDIwICsyMyw4IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLQotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+Ci0jaW5jbHVkZSA8c291bmQvdGx2Lmg+Ci0jaW5jbHVkZSA8c291bmQvYWM5N19jb2RlYy5oPgotI2luY2x1ZGUgImFjOTdfcGF0Y2guaCIKLSNpbmNsdWRlICJhYzk3X2lkLmgiCiAjaW5jbHVkZSAiYWM5N19sb2NhbC5oIgorI2luY2x1ZGUgImFjOTdfcGF0Y2guaCIKIAogLyoKICAqICBDaGlwIHNwZWNpZmljIGluaXRpYWxpemF0aW9uCkBAIC0zOTAsNyArMzc4LDcgQEAKIAkuYnVpbGRfcG9zdF9zcGRpZiA9IHBhdGNoX3lhbWFoYV95bWY3NTNfcG9zdF9zcGRpZgogfTsKIAotaW50IHBhdGNoX3lhbWFoYV95bWY3NTMoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfeWFtYWhhX3ltZjc1MyhzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCS8qIFBhdGNoIGZvciBZYW1haGEgWU1GNzUzLCBDb3B5cmlnaHQgKGMpIGJ5IERhdmlkIFNodXN0LCBkc2h1c3RAc2h1c3RyaW5nLmNvbS4KIAkgICBUaGlzIGNoaXAgaGFzIG5vbnN0YW5kYXJkIGFuZCBleHRlbmRlZCBiZWhhdmlvdXIgd2l0aCByZWdhcmQgdG8gaXRzIFMvUERJRiBvdXRwdXQuCkBAIC00MzYsNyArNDI0LDcgQEAKIAkuYnVpbGRfc3BlY2lmaWMgPSBwYXRjaF93b2xmc29uX3dtOTcwM19zcGVjaWZpYywKIH07CiAKLWludCBwYXRjaF93b2xmc29uMDMoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfd29sZnNvbjAzKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3dvbGZzb25fd205NzAzX29wczsKIAlyZXR1cm4gMDsKQEAgLTQ2Nyw3ICs0NTUsNyBAQAogCS5idWlsZF9zcGVjaWZpYyA9IHBhdGNoX3dvbGZzb25fd205NzA0X3NwZWNpZmljLAogfTsKIAotaW50IHBhdGNoX3dvbGZzb24wNChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQorc3RhdGljIGludCBwYXRjaF93b2xmc29uMDQoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKIAkvKiBXTTk3MDRNLzk3MDRRICovCiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3dvbGZzb25fd205NzA0X29wczsKQEAgLTQ4OSw3ICs0NzcsNyBAQAogCS5idWlsZF9zcGVjaWZpYyA9IHBhdGNoX3dvbGZzb25fd205NzA1X3NwZWNpZmljLAogfTsKIAotaW50IHBhdGNoX3dvbGZzb24wNShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQorc3RhdGljIGludCBwYXRjaF93b2xmc29uMDUoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKIAkvKiBXTTk3MDUsIFdNOTcxMCAqLwogCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF93b2xmc29uX3dtOTcwNV9vcHM7CkBAIC02MjUsNyArNjEzLDcgQEAKIAkuYnVpbGRfc3BlY2lmaWMgPSBwYXRjaF93b2xmc29uX3dtOTcxMV9zcGVjaWZpYywKIH07CiAKLWludCBwYXRjaF93b2xmc29uMTEoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfd29sZnNvbjExKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJLyogV005NzExLCBXTTk3MTIgKi8KIAlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfd29sZnNvbl93bTk3MTFfb3BzOwpAQCAtODI0LDcgKzgxMiw3IEBACiAjZW5kaWYKIH07CiAKLWludCBwYXRjaF93b2xmc29uMTMoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfd29sZnNvbjEzKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJLyogV005NzEzLCBXTTk3MTQgKi8KIAlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfd29sZnNvbl93bTk3MTNfb3BzOwpAQCAtODQ0LDcgKzgzMiw3IEBACiAvKgogICogVHJpdGVjaCBjb2RlYwogICovCi1pbnQgcGF0Y2hfdHJpdGVjaF90cjI4MDI4KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCitzdGF0aWMgaW50IHBhdGNoX3RyaXRlY2hfdHIyODAyOChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIDB4MjYsIDB4MDMwMCk7CiAJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgMHgyNiwgMHgwMDAwKTsKQEAgLTkyMiw3ICs5MTAsNyBAQAogCS5idWlsZF9zcGVjaWZpYwk9IHBhdGNoX3NpZ21hdGVsX3N0YWM5N3h4X3NwZWNpZmljCiB9OwogCi1pbnQgcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3MDAoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3MDAoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKIAlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3MDBfb3BzOwogCXJldHVybiAwOwpAQCAtOTY5LDcgKzk1Nyw3IEBACiAJLmJ1aWxkX3NwZWNpZmljCT0gcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3MDhfc3BlY2lmaWMKIH07CiAKLWludCBwYXRjaF9zaWdtYXRlbF9zdGFjOTcwOChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQorc3RhdGljIGludCBwYXRjaF9zaWdtYXRlbF9zdGFjOTcwOChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCXVuc2lnbmVkIGludCBjb2RlYzcyLCBjb2RlYzZjOwogCkBAIC05OTUsNyArOTgzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzIxKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCitzdGF0aWMgaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzIxKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3NpZ21hdGVsX3N0YWM5NzAwX29wczsKIAlpZiAoc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X1NJR01BVEVMX0FOQUxPRykgPT0gMCkgewpAQCAtMTAwOSw3ICs5OTcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3NDQoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3NDQoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKIAkvLyBwYXRjaCBmb3IgU2lnbWFUZWwKIAlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3MDBfb3BzOwpAQCAtMTAyMSw3ICsxMDA5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzU2KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCitzdGF0aWMgaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzU2KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJLy8gcGF0Y2ggZm9yIFNpZ21hVGVsCiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3NpZ21hdGVsX3N0YWM5NzAwX29wczsKQEAgLTExOTgsNyArMTE4Niw3IEBACiAJLmJ1aWxkX3NwZWNpZmljCT0gcGF0Y2hfc2lnbWF0ZWxfc3RhYzk3NThfc3BlY2lmaWMKIH07CiAKLWludCBwYXRjaF9zaWdtYXRlbF9zdGFjOTc1OChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQorc3RhdGljIGludCBwYXRjaF9zaWdtYXRlbF9zdGFjOTc1OChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCByZWdzWzRdID0gewogCQlBQzk3X1NJR01BVEVMX09VVFNFTCwKQEAgLTEyNzIsNyArMTI2MCw3IEBACiAJLmJ1aWxkX3NwZGlmID0gcGF0Y2hfY2lycnVzX2J1aWxkX3NwZGlmCiB9OwogCi1pbnQgcGF0Y2hfY2lycnVzX3NwZGlmKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCitzdGF0aWMgaW50IHBhdGNoX2NpcnJ1c19zcGRpZihzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCS8qIEJhc2ljYWxseSwgdGhlIGNzNDIwMS9jczQyMDUvY3M0Mjk3YSBoYXMgbm9uLXN0YW5kYXJkIHNwL2RpZiByZWdpc3RlcnMuCiAJICAgV0hZIENBTidUIEFOWU9ORSBGT0xMT1cgVEhFIEJMT09EWSBTUEVDPyAgKnNpZ2gqCkBAIC0xMjkzLDcgKzEyODEsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcGF0Y2hfY2lycnVzX2NzNDI5OShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQorc3RhdGljIGludCBwYXRjaF9jaXJydXNfY3M0Mjk5KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJLyogZm9yY2UgdGhlIGRldGVjdGlvbiBvZiBQQyBCZWVwICovCiAJYWM5Ny0+ZmxhZ3MgfD0gQUM5N19IQVNfUENfQkVFUDsKQEAgLTEzMjksNyArMTMxNyw3IEBACiAJLmJ1aWxkX3NwZGlmID0gcGF0Y2hfY29uZXhhbnRfYnVpbGRfc3BkaWYKIH07CiAKLWludCBwYXRjaF9jb25leGFudChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQorc3RhdGljIGludCBwYXRjaF9jb25leGFudChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF9jb25leGFudF9vcHM7CiAJYWM5Ny0+ZmxhZ3MgfD0gQUM5N19DWF9TUERJRjsKQEAgLTEzMzgsNyArMTMyNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBwYXRjaF9jeDIwNTUxKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfY3gyMDU1MShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCiB7CiAJc25kX2FjOTdfdXBkYXRlX2JpdHMoYWM5NywgMHg1YywgMHgwMSwgMHgwMSk7CiAJcmV0dXJuIDA7CkBAIC0xNDMwLDcgKzE0MTgsNyBAQAogCXsgfSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCi1pbnQgcGF0Y2hfYWQxODE5KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCitzdGF0aWMgaW50IHBhdGNoX2FkMTgxOShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCXVuc2lnbmVkIHNob3J0IHNjZmc7CiAKQEAgLTE1MDcsNyArMTQ5NSw3IEBACiAjZW5kaWYKIH07CiAKLWludCBwYXRjaF9hZDE4ODEoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfYWQxODgxKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgY2ZnX2lkeHNbM11bMl0gPSB7CiAJCXsyLCAxfSwKQEAgLTE1OTUsNyArMTU4Myw3IEBACiAjZW5kaWYKIH07CiAKLWludCBwYXRjaF9hZDE4ODUoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfYWQxODg1KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJcGF0Y2hfYWQxODgxKGFjOTcpOwogCS8qIFRoaXMgaXMgcmVxdWlyZWQgdG8gZGVhbCB3aXRoIHRoZSBJbnRlbCBEODE1RUVBTDIgKi8KQEAgLTE2MjIsNyArMTYxMCw3IEBACiAjZW5kaWYKIH07CiAKLWludCBwYXRjaF9hZDE4ODYoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfYWQxODg2KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJcGF0Y2hfYWQxODgxKGFjOTcpOwogCS8qIFByZXNhcmlvNzAwIHdvcmthcm91bmQgKi8KQEAgLTE4NDQsNyArMTgzMiw3IEBACiAJCXNuZF9hYzk3X3VwZGF0ZV9iaXRzKGFjOTcsIEFDOTdfQURfSkFDS19TUERJRiwgMTw8MTEsIDE8PDExKTsKIH0KIAotaW50IHBhdGNoX2FkMTk4MWEoc3RydWN0IHNuZF9hYzk3ICphYzk3KQorc3RhdGljIGludCBwYXRjaF9hZDE5ODFhKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKIAlwYXRjaF9hZDE4ODEoYWM5Nyk7CiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2FkMTk4MWFfYnVpbGRfb3BzOwpAQCAtMTg3Nyw3ICsxODY1LDcgQEAKICNlbmRpZgogfTsKIAotaW50IHBhdGNoX2FkMTk4MWIoc3RydWN0IHNuZF9hYzk3ICphYzk3KQorc3RhdGljIGludCBwYXRjaF9hZDE5ODFiKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKIAlwYXRjaF9hZDE4ODEoYWM5Nyk7CiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2FkMTk4MWJfYnVpbGRfb3BzOwpAQCAtMjAxNCw3ICsyMDAyLDcgQEAKIAkudXBkYXRlX2phY2tzID0gYWQxODg4X3VwZGF0ZV9qYWNrcywKIH07CiAKLWludCBwYXRjaF9hZDE4ODgoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfYWQxODg4KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJdW5zaWduZWQgc2hvcnQgbWlzYzsKIAkKQEAgLTIwNTIsNyArMjA0MCw3IEBACiAJLnVwZGF0ZV9qYWNrcyA9IGFkMTg4OF91cGRhdGVfamFja3MsCiB9OwogCi1pbnQgcGF0Y2hfYWQxOTgwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCitzdGF0aWMgaW50IHBhdGNoX2FkMTk4MChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCXBhdGNoX2FkMTg4OChhYzk3KTsKIAlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfYWQxOTgwX2J1aWxkX29wczsKQEAgLTIxNjgsNyArMjE1Niw3IEBACiAJLnVwZGF0ZV9qYWNrcyA9IGFkMTk4NV91cGRhdGVfamFja3MsCiB9OwogCi1pbnQgcGF0Y2hfYWQxOTg1KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCitzdGF0aWMgaW50IHBhdGNoX2FkMTk4NShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCXVuc2lnbmVkIHNob3J0IG1pc2M7CiAJCkBAIC0yNDY4LDcgKzI0NTYsNyBAQAogCS51cGRhdGVfamFja3MgPSBhZDE5ODZfdXBkYXRlX2phY2tzLAogfTsKIAotaW50IHBhdGNoX2FkMTk4NihzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQorc3RhdGljIGludCBwYXRjaF9hZDE5ODYoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKIAlwYXRjaF9hZDE4ODEoYWM5Nyk7CiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2FkMTk4Nl9idWlsZF9vcHM7CkBAIC0yNTYxLDcgKzI1NDksNyBAQAogCS51cGRhdGVfamFja3MgPSBhbGM2NTBfdXBkYXRlX2phY2tzCiB9OwogCi1pbnQgcGF0Y2hfYWxjNjUwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCitzdGF0aWMgaW50IHBhdGNoX2FsYzY1MChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCXVuc2lnbmVkIHNob3J0IHZhbDsKIApAQCAtMjcxMyw3ICsyNzAxLDcgQEAKIAkudXBkYXRlX2phY2tzID0gYWxjNjU1X3VwZGF0ZV9qYWNrcwogfTsKIAotaW50IHBhdGNoX2FsYzY1NShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQorc3RhdGljIGludCBwYXRjaF9hbGM2NTUoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCkBAIC0yNzM5LDYgKzI3MjcsNyBAQAogCQkgICAgKGFjOTctPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMTMxIHx8IC8qIE1TSSBTMjcwIGxhcHRvcCAqLwogCQkgICAgIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMTYxIHx8IC8qIExHIEsxIEV4cHJlc3MgKi8KIAkJICAgICBhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDM1MSB8fCAvKiBNU0kgTDcyNSBsYXB0b3AgKi8KKwkJICAgICBhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDQ3MSB8fCAvKiBNU0kgTDcyMCBsYXB0b3AgKi8KIAkJICAgICBhYzk3LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4MDA2MSkpICAvKiBNU0kgUzI1MCBsYXB0b3AgKi8KIAkJCXZhbCAmPSB+KDEgPDwgMSk7IC8qIFBpbiA0NyBpcyBFQVBEIChmb3IgaW50ZXJuYWwgc3BlYWtlcikgKi8KIAkJZWxzZQpAQCAtMjgxNSw3ICsyODA0LDcgQEAKIAkudXBkYXRlX2phY2tzID0gYWxjODUwX3VwZGF0ZV9qYWNrcwogfTsKIAotaW50IHBhdGNoX2FsYzg1MChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCitzdGF0aWMgaW50IHBhdGNoX2FsYzg1MChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCiB7CiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2FsYzg1MF9vcHM7CiAKQEAgLTI4NzUsNyArMjg2NCw3IEBACiAJLnVwZGF0ZV9qYWNrcyA9IGNtOTczOF91cGRhdGVfamFja3MKIH07CiAKLWludCBwYXRjaF9jbTk3Mzgoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfY205NzM4KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX2NtOTczOF9vcHM7CiAJLyogRklYTUU6IGNhbiBhbnlvbmUgY29uZmlybSBiZWxvdz8gKi8KQEAgLTI5NjcsNyArMjk1Niw3IEBACiAJLnVwZGF0ZV9qYWNrcyA9IGNtOTczOV91cGRhdGVfamFja3MKIH07CiAKLWludCBwYXRjaF9jbTk3Mzkoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfY205NzM5KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJdW5zaWduZWQgc2hvcnQgdmFsOwogCkBAIC0zMTQxLDcgKzMxMzAsNyBAQAogCS51cGRhdGVfamFja3MgPSBjbTk3NjFfdXBkYXRlX2phY2tzCiB9OwogCi1pbnQgcGF0Y2hfY205NzYxKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfY205NzYxKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKIHsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7CiAKQEAgLTMyMzYsNyArMzIyNSw3IEBACiAJLmJ1aWxkX3Bvc3Rfc3BkaWYgPSBwYXRjaF9jbTk3NjFfcG9zdF9zcGRpZgkvKiBpZGVudGljYWwgd2l0aCBDTTk3NjEgKi8KIH07CiAKLWludCBwYXRjaF9jbTk3ODAoc3RydWN0IHNuZF9hYzk3ICphYzk3KQorc3RhdGljIGludCBwYXRjaF9jbTk3ODAoc3RydWN0IHNuZF9hYzk3ICphYzk3KQogewogCXVuc2lnbmVkIHNob3J0IHZhbDsKIApAQCAtMzI3OSw3ICszMjY4LDcgQEAKIAkuYnVpbGRfc3BlY2lmaWMJPSBwYXRjaF92dDE2MTZfc3BlY2lmaWMKIH07CiAKLWludCBwYXRjaF92dDE2MTYoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgcGF0Y2hfdnQxNjE2KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCiB7CiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3Z0MTYxNl9vcHM7CiAJcmV0dXJuIDA7CkBAIC0zMjg4LDE2ICszMjc3LDExMSBAQAogLyoKICAqIFZUMTYxN0EgY29kZWMKICAqLworCisvKgorICogdW5mb3J0dW5hdGVseSwgdGhlIHZ0MTYxN2Egc3Rhc2hlcyB0aGUgdHdpZGRsZXJzIHJlcXVpcmVkIGZvcgorICogbm9vZGluZyB0aGUgaS9vIGphY2tzIG9uIDIgZGlmZmVyZW50IHJlZ3MuICogdGhhbWVhbnMgdGhhdCB3ZSBjYW50CisgKiB1c2UgdGhlIGVhc3kgd2F5IHByb3ZpZGVkIGJ5IEFDOTdfRU5VTV9ET1VCTEUoKSB3ZSBoYXZlIHRvIHdyaXRlCisgKiBhcmUgb3duIGZ1bmNzLgorICoKKyAqIE5COiB0aGlzIGlzIGFic29sdXRlbHkgYW5kIHV0dGVybHkgZGlmZmVyZW50IGZyb20gdGhlIHZ0MTYxOC4gZHVubm8KKyAqIGFib3V0IHRoZSAxNjE2LgorICovCisKKy8qIGNvcGllZCBmcm9tIGFjOTdfc3Vycm91bmRfamFja19tb2RlX2luZm8oKSAqLworc3RhdGljIGludCBzbmRfYWM5N192dDE2MTdhX3NtYXJ0NTFfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJLyogb3JkZXJpbmcgaW4gdGhpcyBsaXN0IHJlZmxlY3RzIHZ0MTYxN2EgZG9jcyBmb3IgUmVnIDIwIGFuZAorCSAqIDdhIGFuZCBUYWJsZSA2IHRoYXQgbGF5cyBvdXQgdGhlIG1hdHJpeCBOQiBXUlQgVGFibGU2OiBTTTUxCisJICogaXMgU001MUVOICpBTkQqIGl0J3MgQml0MTQsIG5vdCBCaXQxNSBzbyB0aGUgdGFibGUgaXMgdmVyeQorCSAqIGNvdW50ZXItaW50dWl0aXZlICovIAorCisJc3RhdGljIGNvbnN0IGNoYXIqIHRleHRzW10gPSB7ICJMaW5lSW4gTWljMSIsICJMaW5lSW4gTWljMSBNaWMzIiwKKwkJCQkgICAgICAgIlN1cnIgTEZFL0MgTWljMyIsICJMaW5lSW4gTEZFL0MgTWljMyIsCisJCQkJICAgICAgICJMaW5lSW4gTWljMiIsICJMaW5lSW4gTWljMiBNaWMxIiwKKwkJCQkgICAgICAgIlN1cnIgTEZFIE1pYzEiLCAiU3VyciBMRkUgTWljMSBNaWMyIn07CisJcmV0dXJuIGFjOTdfZW51bV90ZXh0X2luZm8oa2NvbnRyb2wsIHVpbmZvLCB0ZXh0cywgOCk7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfdnQxNjE3YV9zbWFydDUxX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdXNob3J0IHVzU001MSwgdXNNUzsgIAorCisJc3RydWN0IHNuZF9hYzk3ICpwYWM5NzsKKwkKKwlwYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsgLyogZ3JhYiBjb2RlYyBoYW5kbGUgKi8KKworCS8qIGdyYWIgb3VyIGRlc2lyZWMgYml0cywgdGhlbiBtYXNoIHRoZW0gdG9nZXRoZXIgaW4gYSBtYW5uZXIKKwkgKiBjb25zaXN0ZW50IHdpdGggVGFibGUgNiBvbiBwYWdlIDE3IGluIHRoZSAxNjE3YSBkb2NzICovCisgCisJdXNTTTUxID0gc25kX2FjOTdfcmVhZChwYWM5NywgMHg3YSkgPj4gMTQ7CisJdXNNUyAgID0gc25kX2FjOTdfcmVhZChwYWM5NywgMHgyMCkgPj4gODsKKyAgCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh1c1NNNTEgPDwgMSkgKyB1c01TOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2FjOTdfdnQxNjE3YV9zbWFydDUxX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdXNob3J0IHVzU001MSwgdXNNUywgdXNSZWc7ICAKKworCXN0cnVjdCBzbmRfYWM5NyAqcGFjOTc7CisKKwlwYWM5NyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsgLyogZ3JhYiBjb2RlYyBoYW5kbGUgKi8KKworCXVzU001MSA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPj4gMTsKKwl1c01TICAgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdICYgIDE7CisKKwkvKiBwdXNoIG91ciB2YWx1ZXMgaW50byB0aGUgcmVnaXN0ZXIgLSBjb25zaWRlciB0aGF0IHRoaW5ncyB3aWxsIGJlIGxlZnQKKwkgKiBpbiBhIGZ1bmt5IHN0YXRlIGlmIHRoZSB3cml0ZSBmYWlscyAqLworCisJdXNSZWcgPSBzbmRfYWM5N19yZWFkKHBhYzk3LCAweDdhKTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShwYWM5NywgMHg3YSwgKHVzUmVnICYgMHgzRkZGKSArICh1c1NNNTEgPDwgMTQpKTsKKwl1c1JlZyA9IHNuZF9hYzk3X3JlYWQocGFjOTcsIDB4MjApOworCXNuZF9hYzk3X3dyaXRlX2NhY2hlKHBhYzk3LCAweDIwLCAodXNSZWcgJiAweEZFRkYpICsgKHVzTVMgICA8PCAgOCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfYWM5N19jb250cm9sc192dDE2MTdhW10gPSB7CisKKwlBQzk3X1NJTkdMRSgiQ2VudGVyL0xGRSBFeGNoYW5nZSIsIDB4NWEsIDgsIDEsIDApLAorCS8qCisJICogVGhlc2UgYXJlIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgc3Vycm91bmQgc291bmQgb24gbW90aGVyYm9hcmRzCisJICogdGhhdCBoYXZlIDMgYmlkaXJlY3Rpb25hbCBhbmFsb2cgamFja3MKKwkgKi8KKwl7CisJCS5pZmFjZSAgICAgICAgID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lICAgICAgICAgID0gIlNtYXJ0IDUuMSBTZWxlY3QiLAorCQkuaW5mbyAgICAgICAgICA9IHNuZF9hYzk3X3Z0MTYxN2Ffc21hcnQ1MV9pbmZvLAorCQkuZ2V0ICAgICAgICAgICA9IHNuZF9hYzk3X3Z0MTYxN2Ffc21hcnQ1MV9nZXQsCisJCS5wdXQgICAgICAgICAgID0gc25kX2FjOTdfdnQxNjE3YV9zbWFydDUxX3B1dCwKKwl9LAorfTsKKwogaW50IHBhdGNoX3Z0MTYxN2Eoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKLQkvKiBicmluZyBhbmFsb2cgcG93ZXIgY29uc3VtcHRpb24gdG8gbm9ybWFsLCBsaWtlIFdpblhQIGRyaXZlcgotCSAqIGZvciBFUElBIFNQCisJaW50IGVyciA9IDA7CisKKwkvKiB3ZSBjaG9vc2UgdG8gbm90IGZhaWwgb3V0IGF0IHRoaXMgcG9pbnQsIGJ1dCB3ZSB0ZWxsIHRoZQorCSAgIGNhbGxlciB3aGVuIHdlIHJldHVybiAqLworCisJZXJyID0gcGF0Y2hfYnVpbGRfY29udHJvbHMoYWM5NywgJnNuZF9hYzk3X2NvbnRyb2xzX3Z0MTYxN2FbMF0sCisJCQkJICAgQVJSQVlfU0laRShzbmRfYWM5N19jb250cm9sc192dDE2MTdhKSk7CisKKwkvKiBicmluZyBhbmFsb2cgcG93ZXIgY29uc3VtcHRpb24gdG8gbm9ybWFsIGJ5IHR1cm5pbmcgb2ZmIHRoZQorCSAqIGhlYWRwaG9uZSBhbXBsaWZpZXIsIGxpa2UgV2luWFAgZHJpdmVyIGZvciBFUElBIFNQCiAJICovCiAJc25kX2FjOTdfd3JpdGVfY2FjaGUoYWM5NywgMHg1YywgMHgyMCk7CiAJYWM5Ny0+ZXh0X2lkIHw9IEFDOTdfRUlfU1BESUY7CS8qIGZvcmNlIHRoZSBkZXRlY3Rpb24gb2Ygc3BkaWYgKi8KIAlhYzk3LT5yYXRlc1tBQzk3X1JBVEVTX1NQRElGXSA9IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDA7CiAJYWM5Ny0+YnVpbGRfb3BzID0gJnBhdGNoX3Z0MTYxNl9vcHM7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtMzMzOCw3ICszNDIyLDcgQEAKIAkudXBkYXRlX2phY2tzID0gaXQyNjQ2X3VwZGF0ZV9qYWNrcwogfTsKIAotaW50IHBhdGNoX2l0MjY0NihzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQorc3RhdGljIGludCBwYXRjaF9pdDI2NDYoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKIAlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfaXQyNjQ2X29wczsKIAkvKiBmdWxsIERBQyB2b2x1bWUgKi8KQEAgLTMzNzEsNyArMzQ1NSw3IEBACiAJLmJ1aWxkX3NwZWNpZmljCT0gcGF0Y2hfc2kzMDM2X3NwZWNpZmljLAogfTsKIAotaW50IG1wYXRjaF9zaTMwMzYoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKK3N0YXRpYyBpbnQgbXBhdGNoX3NpMzAzNihzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KQogewogCWFjOTctPmJ1aWxkX29wcyA9ICZwYXRjaF9zaTMwMzZfb3BzOwogCXNuZF9hYzk3X3dyaXRlX2NhY2hlKGFjOTcsIDB4NWMsIDB4ZjIxMCApOwpAQCAtMzQwMyw3ICszNDg3LDcgQEAKIAl7IH0gLyogdGVybWluYXRvciAqLwogfTsKIAotaW50IHBhdGNoX2xtNDU1MChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCitzdGF0aWMgaW50IHBhdGNoX2xtNDU1MChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCiB7CiAJYWM5Ny0+cmVzX3RhYmxlID0gbG00NTUwX3Jlc3RibDsKIAlyZXR1cm4gMDsKQEAgLTM0MzgsNyArMzUyMiw3IEBACiAJLmJ1aWxkX3NwZWNpZmljCT0gcGF0Y2hfdWNiMTQwMF9zcGVjaWZpYywKIH07CiAKLWludCBwYXRjaF91Y2IxNDAwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpCitzdGF0aWMgaW50IHBhdGNoX3VjYjE0MDAoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKIHsKIAlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfdWNiMTQwMF9vcHM7CiAJLyogZW5hYmxlIGhlYWRwaG9uZSBkcml2ZXIgYW5kIHNtYXJ0IGxvdyBwb3dlciBtb2RlIGJ5IGRlZmF1bHQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guaCBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guaAppbmRleCA1NTVkMWM5Li5mZDM0MWNlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmgKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5oCkBAIC0yMiw0NCArMjIsNzIgQEAKICAqCiAgKi8KIAotaW50IHBhdGNoX3lhbWFoYV95bWY3NTMoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfd29sZnNvbjAwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX3dvbGZzb24wMyhzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKLWludCBwYXRjaF93b2xmc29uMDQoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfd29sZnNvbjA1KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX3dvbGZzb24xMShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKLWludCBwYXRjaF93b2xmc29uMTMoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfdHJpdGVjaF90cjI4MDI4KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzAwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzA4KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzIxKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzQ0KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzU2KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX3NpZ21hdGVsX3N0YWM5NzU4KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX2NpcnJ1c19jczQyOTkoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfY2lycnVzX3NwZGlmKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX2NvbmV4YW50KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX2N4MjA1NTEoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfYWQxODE5KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX2FkMTg4MShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKLWludCBwYXRjaF9hZDE4ODUoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfYWQxODg2KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX2FkMTg4OChzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKLWludCBwYXRjaF9hZDE5ODAoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfYWQxOTgxYShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKLWludCBwYXRjaF9hZDE5ODFiKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX2FkMTk4NShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKLWludCBwYXRjaF9hZDE5ODYoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfYWxjNjUwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX2FsYzY1NShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKLWludCBwYXRjaF9hbGM4NTAoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfY205NzM4KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX2NtOTczOShzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKLWludCBwYXRjaF9jbTk3NjEoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfY205NzgwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX3Z0MTYxNihzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKLWludCBwYXRjaF92dDE2MTdhKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IHBhdGNoX2l0MjY0NihzdHJ1Y3Qgc25kX2FjOTcgKiBhYzk3KTsKLWludCBwYXRjaF91Y2IxNDAwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOwotaW50IG1wYXRjaF9zaTMwMzYoc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7Ci1pbnQgcGF0Y2hfbG00NTUwKHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcpOworI2RlZmluZSBBQzk3X1NJTkdMRV9WQUxVRShyZWcsc2hpZnQsbWFzayxpbnZlcnQpIFwKKwkoKHJlZykgfCAoKHNoaWZ0KSA8PCA4KSB8ICgoc2hpZnQpIDw8IDEyKSB8ICgobWFzaykgPDwgMTYpIHwgXAorCSAoKGludmVydCkgPDwgMjQpKQorI2RlZmluZSBBQzk3X1BBR0VfU0lOR0xFX1ZBTFVFKHJlZyxzaGlmdCxtYXNrLGludmVydCxwYWdlKSBcCisJKEFDOTdfU0lOR0xFX1ZBTFVFKHJlZyxzaGlmdCxtYXNrLGludmVydCkgfCAoMTw8MjUpIHwgKChwYWdlKSA8PCAyNikpCisjZGVmaW5lIEFDOTdfU0lOR0xFKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQpIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LAkJXAorICAuZ2V0ID0gc25kX2FjOTdfZ2V0X3ZvbHN3LCAucHV0ID0gc25kX2FjOTdfcHV0X3ZvbHN3LCBcCisgIC5wcml2YXRlX3ZhbHVlID0gIEFDOTdfU0lOR0xFX1ZBTFVFKHJlZywgc2hpZnQsIG1hc2ssIGludmVydCkgfQorI2RlZmluZSBBQzk3X1BBR0VfU0lOR0xFKHhuYW1lLCByZWcsIHNoaWZ0LCBtYXNrLCBpbnZlcnQsIHBhZ2UpCQlcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmZvID0gc25kX2FjOTdfaW5mb192b2xzdywJCVwKKyAgLmdldCA9IHNuZF9hYzk3X2dldF92b2xzdywgLnB1dCA9IHNuZF9hYzk3X3B1dF92b2xzdywgXAorICAucHJpdmF0ZV92YWx1ZSA9ICBBQzk3X1BBR0VfU0lOR0xFX1ZBTFVFKHJlZywgc2hpZnQsIG1hc2ssIGludmVydCwgcGFnZSkgfQorI2RlZmluZSBBQzk3X0RPVUJMRSh4bmFtZSwgcmVnLCBzaGlmdF9sZWZ0LCBzaGlmdF9yaWdodCwgbWFzaywgaW52ZXJ0KSBcCit7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9ICh4bmFtZSksIFwKKyAgLmluZm8gPSBzbmRfYWM5N19pbmZvX3ZvbHN3LAkJXAorICAuZ2V0ID0gc25kX2FjOTdfZ2V0X3ZvbHN3LCAucHV0ID0gc25kX2FjOTdfcHV0X3ZvbHN3LCBcCisgIC5wcml2YXRlX3ZhbHVlID0gKHJlZykgfCAoKHNoaWZ0X2xlZnQpIDw8IDgpIHwgKChzaGlmdF9yaWdodCkgPDwgMTIpIHwgKChtYXNrKSA8PCAxNikgfCAoKGludmVydCkgPDwgMjQpIH0KKworLyogZW51bSBjb250cm9sICovCitzdHJ1Y3QgYWM5N19lbnVtIHsKKwl1bnNpZ25lZCBjaGFyIHJlZzsKKwl1bnNpZ25lZCBjaGFyIHNoaWZ0X2w7CisJdW5zaWduZWQgY2hhciBzaGlmdF9yOworCXVuc2lnbmVkIHNob3J0IG1hc2s7CisJY29uc3QgY2hhciAqKnRleHRzOworfTsKKworI2RlZmluZSBBQzk3X0VOVU1fRE9VQkxFKHhyZWcsIHhzaGlmdF9sLCB4c2hpZnRfciwgeG1hc2ssIHh0ZXh0cykgXAoreyAucmVnID0geHJlZywgLnNoaWZ0X2wgPSB4c2hpZnRfbCwgLnNoaWZ0X3IgPSB4c2hpZnRfciwgXAorICAubWFzayA9IHhtYXNrLCAudGV4dHMgPSB4dGV4dHMgfQorI2RlZmluZSBBQzk3X0VOVU1fU0lOR0xFKHhyZWcsIHhzaGlmdCwgeG1hc2ssIHh0ZXh0cykgXAorCUFDOTdfRU5VTV9ET1VCTEUoeHJlZywgeHNoaWZ0LCB4c2hpZnQsIHhtYXNrLCB4dGV4dHMpCisjZGVmaW5lIEFDOTdfRU5VTSh4bmFtZSwgeGVudW0pIFwKK3sgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIFwKKyAgLmluZm8gPSBzbmRfYWM5N19pbmZvX2VudW1fZG91YmxlLAkJICAgIFwKKyAgLmdldCA9IHNuZF9hYzk3X2dldF9lbnVtX2RvdWJsZSwgLnB1dCA9IHNuZF9hYzk3X3B1dF9lbnVtX2RvdWJsZSwgXAorICAucHJpdmF0ZV92YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSZ4ZW51bSB9CisKKy8qIGFjOTdfY29kZWMuYyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hYzk3X2NvbnRyb2xzXzNkW107CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2FjOTdfY29udHJvbHNfc3BkaWZbXTsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sICpzbmRfYWM5N19jbmV3KGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpfdGVtcGxhdGUsCisJCQkJCSAgc3RydWN0IHNuZF9hYzk3ICogYWM5Nyk7CitzdGF0aWMgaW50IHNuZF9hYzk3X2luZm9fdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CitzdGF0aWMgaW50IHNuZF9hYzk3X2dldF92b2xzdyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKK3N0YXRpYyBpbnQgc25kX2FjOTdfcHV0X3ZvbHN3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworc3RhdGljIGludCBzbmRfYWM5N190cnlfYml0KHN0cnVjdCBzbmRfYWM5NyAqIGFjOTcsIGludCByZWcsIGludCBiaXQpOworc3RhdGljIGludCBzbmRfYWM5N19yZW1vdmVfY3RsKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICpzdWZmaXgpOworc3RhdGljIGludCBzbmRfYWM5N19yZW5hbWVfY3RsKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywgY29uc3QgY2hhciAqc3JjLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3VmZml4KTsKK3N0YXRpYyBpbnQgc25kX2FjOTdfc3dhcF9jdGwoc3RydWN0IHNuZF9hYzk3ICphYzk3LCBjb25zdCBjaGFyICpzMSwKKwkJCSAgICAgY29uc3QgY2hhciAqczIsIGNvbnN0IGNoYXIgKnN1ZmZpeCk7CitzdGF0aWMgdm9pZCBzbmRfYWM5N19yZW5hbWVfdm9sX2N0bChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIGNvbnN0IGNoYXIgKnNyYywKKwkJCQkgICAgY29uc3QgY2hhciAqZHN0KTsKK3N0YXRpYyB2b2lkIHNuZF9hYzk3X3Jlc3RvcmVfc3RhdHVzKHN0cnVjdCBzbmRfYWM5NyAqYWM5Nyk7CitzdGF0aWMgdm9pZCBzbmRfYWM5N19yZXN0b3JlX2llYzk1OChzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpOworc3RhdGljIGludCBzbmRfYWM5N19pbmZvX2VudW1fZG91YmxlKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbyk7CitzdGF0aWMgaW50IHNuZF9hYzk3X2dldF9lbnVtX2RvdWJsZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpOworc3RhdGljIGludCBzbmRfYWM5N19wdXRfZW51bV9kb3VibGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BjbS5jCmluZGV4IDM3NThkMDcuLjQyODFlNmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wY20uYwpAQCAtMzQsNyArMzQsNiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxzb3VuZC9hYzk3X2NvZGVjLmg+CiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KLSNpbmNsdWRlICJhYzk3X3BhdGNoLmgiCiAjaW5jbHVkZSAiYWM5N19pZC5oIgogI2luY2x1ZGUgImFjOTdfbG9jYWwuaCIKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jIGIvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCmluZGV4IGJhN2ZhMjIuLmUxZWQ1OTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYworKysgYi9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKQEAgLTY5LDEwICs2OSwxMCBAQAogICogIERlYnVnIHBhcnQgZGVmaW5pdGlvbnMKICAqLwogCi0vLyNkZWZpbmUgQUxJX0RFQlVHCisvKiAjZGVmaW5lIEFMSV9ERUJVRyAqLwogCiAjaWZkZWYgQUxJX0RFQlVHCi0jZGVmaW5lIHNuZF9hbGlfcHJpbnRrKGZvcm1hdCwgYXJncy4uLikgcHJpbnRrKGZvcm1hdCwgIyNhcmdzKTsKKyNkZWZpbmUgc25kX2FsaV9wcmludGsoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyBmb3JtYXQsICMjYXJncyk7CiAjZWxzZQogI2RlZmluZSBzbmRfYWxpX3ByaW50ayhmb3JtYXQsIGFyZ3MuLi4pCiAjZW5kaWYKQEAgLTEwNSwxMCArMTA1LDEwIEBACiAgKiAgRGlyZWN0IFJlZ2lzdGVycwogICovCiAKLSNkZWZpbmUgQUxJX0xFR0FDWV9ETUFSMCAgICAgICAgMHgwMCAgLy8gQURSMAotI2RlZmluZSBBTElfTEVHQUNZX0RNQVI0ICAgICAgICAweDA0ICAvLyBDTlQwCi0jZGVmaW5lIEFMSV9MRUdBQ1lfRE1BUjExICAgICAgIDB4MGIgIC8vIE1PRCAKLSNkZWZpbmUgQUxJX0xFR0FDWV9ETUFSMTUgICAgICAgMHgwZiAgLy8gTU1SIAorI2RlZmluZSBBTElfTEVHQUNZX0RNQVIwICAgICAgICAweDAwICAvKiBBRFIwICovCisjZGVmaW5lIEFMSV9MRUdBQ1lfRE1BUjQgICAgICAgIDB4MDQgIC8qIENOVDAgKi8KKyNkZWZpbmUgQUxJX0xFR0FDWV9ETUFSMTEgICAgICAgMHgwYiAgLyogTU9EICAqLworI2RlZmluZSBBTElfTEVHQUNZX0RNQVIxNSAgICAgICAweDBmICAvKiBNTVIgICovCiAjZGVmaW5lIEFMSV9NUFVSMAkJMHgyMAogI2RlZmluZSBBTElfTVBVUjEJCTB4MjEKICNkZWZpbmUgQUxJX01QVVIyCQkweDIyCkBAIC0xNzUsNyArMTc1LDcgQEAKIHN0cnVjdCBzbmRfYWxpX3ZvaWNlOwogCiBzdHJ1Y3Qgc25kX2FsaV9jaGFubmVsX2NvbnRyb2wgewotCS8vIHJlZ2lzdGVyIGRhdGEKKwkvKiByZWdpc3RlciBkYXRhICovCiAJc3RydWN0IFJFR0RBVEEgewogCQl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAJCXVuc2lnbmVkIGludCBzdG9wOwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJCXVuc2lnbmVkIGludCBhaW50ZW47CiAJfSBkYXRhOwogCQkKLQkvLyByZWdpc3RlciBhZGRyZXNzZXMKKwkvKiByZWdpc3RlciBhZGRyZXNzZXMgKi8KIAlzdHJ1Y3QgUkVHUyB7CiAJCXVuc2lnbmVkIGludCBzdGFydDsKIAkJdW5zaWduZWQgaW50IHN0b3A7CkBAIC0xOTcsMTkgKzE5NywxOCBAQAogCiBzdHJ1Y3Qgc25kX2FsaV92b2ljZSB7CiAJdW5zaWduZWQgaW50IG51bWJlcjsKLQl1bnNpZ25lZCBpbnQgdXNlOiAxLAotCSAgICBwY206IDEsCi0JICAgIG1pZGk6IDEsCi0JICAgIG1vZGU6IDEsCi0JICAgIHN5bnRoOiAxOworCXVuc2lnbmVkIGludCB1c2UgOjEsCisJCXBjbSA6MSwKKwkJbWlkaSA6MSwKKwkJbW9kZSA6MSwKKwkJc3ludGggOjEsCisJCXJ1bm5pbmcgOjE7CiAKIAkvKiBQQ00gZGF0YSAqLwogCXN0cnVjdCBzbmRfYWxpICpjb2RlYzsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKIAlzdHJ1Y3Qgc25kX2FsaV92b2ljZSAqZXh0cmE7CiAJCi0JdW5zaWduZWQgaW50IHJ1bm5pbmc6IDE7Ci0KIAlpbnQgZXNvOyAgICAgICAgICAgICAgICAvKiBmaW5hbCBFU08gdmFsdWUgZm9yIGNoYW5uZWwgKi8KIAlpbnQgY291bnQ7ICAgICAgICAgICAgICAvKiBydW50aW1lLT5wZXJpb2Rfc2l6ZSAqLwogCkBAIC0yMzEsMTQgKzIzMCwxMiBAQAogfTsKIAogCi0jaWZkZWYgQ09ORklHX1BNCiAjZGVmaW5lIEFMSV9HTE9CQUxfUkVHUwkJNTYKICNkZWZpbmUgQUxJX0NIQU5ORUxfUkVHUwk4CiBzdHJ1Y3Qgc25kX2FsaV9pbWFnZSB7Ci0JdW5zaWduZWQgbG9uZyByZWdzW0FMSV9HTE9CQUxfUkVHU107Ci0JdW5zaWduZWQgbG9uZyBjaGFubmVsX3JlZ3NbQUxJX0NIQU5ORUxTXVtBTElfQ0hBTk5FTF9SRUdTXTsKKwl1MzIgcmVnc1tBTElfR0xPQkFMX1JFR1NdOworCXUzMiBjaGFubmVsX3JlZ3NbQUxJX0NIQU5ORUxTXVtBTElfQ0hBTk5FTF9SRUdTXTsKIH07Ci0jZW5kaWYKIAogCiBzdHJ1Y3Qgc25kX2FsaSB7CkBAIC0yNDYsOCArMjQzLDggQEAKIAl1bnNpZ25lZCBsb25nCXBvcnQ7CiAJdW5zaWduZWQgY2hhcglyZXZpc2lvbjsKIAotCXVuc2lnbmVkIGludCBod19pbml0aWFsaXplZDogMTsKLQl1bnNpZ25lZCBpbnQgc3BkaWZfc3VwcG9ydDogMTsKKwl1bnNpZ25lZCBpbnQgaHdfaW5pdGlhbGl6ZWQgOjE7CisJdW5zaWduZWQgaW50IHNwZGlmX3N1cHBvcnQgOjE7CiAKIAlzdHJ1Y3QgcGNpX2RldgkqcGNpOwogCXN0cnVjdCBwY2lfZGV2CSpwY2lfbTE1MzM7CkBAIC0yODcsMTA4ICsyODQsMjggQEAKIAogc3RhdGljIHZvaWQgc25kX2FsaV9jbGVhcl92b2ljZXMoc3RydWN0IHNuZF9hbGkgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogc3RhdGljIHVuc2lnbmVkIHNob3J0IHNuZF9hbGlfY29kZWNfcGVlayhzdHJ1Y3Qgc25kX2FsaSAqLCBpbnQsIHVuc2lnbmVkIHNob3J0KTsKLXN0YXRpYyB2b2lkIHNuZF9hbGlfY29kZWNfcG9rZShzdHJ1Y3Qgc25kX2FsaSAqLCBpbnQsIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBzaG9ydCk7Ci0KLS8qCi0gKiAgRGVidWcgUGFydAotICovCi0KLSNpZmRlZiBBTElfREVCVUcKLQotc3RhdGljIHZvaWQgYWxpX3JlYWRfcmVncyhzdHJ1Y3Qgc25kX2FsaSAqY29kZWMsIGludCBjaGFubmVsKQotewotCWludCBpLGo7Ci0JdW5zaWduZWQgaW50IGR3VmFsOwotCi0JcHJpbnRrKCJjaGFubmVsICVkIHJlZ2lzdGVycyBtYXA6XG4iLCBjaGFubmVsKTsKLQlvdXRiKCh1bnNpZ25lZCBjaGFyKShjaGFubmVsICYgMHgwMDFmKSwgQUxJX1JFRyhjb2RlYyxBTElfR0NfQ0lSKSk7Ci0KLQlwcmludGsoIiAgICAiKTsKLQlmb3Ioaj0wO2o8ODtqKyspCi0JCXByaW50aygiJTIuMnggICAgICAgIiwgaio0KTsKLQlwcmludGsoIlxuIik7Ci0KLQlmb3IgKGk9MDsgaTw9MHhmOC80O2krKykgewotCQlpZihpJTggPT0gMCkKLQkJCXByaW50aygiJTIuMnggICIsIChpKjQvMHgxMCkqMHgxMCk7Ci0JCWR3VmFsID0gaW5sKEFMSV9SRUcoY29kZWMsaSo0KSk7Ci0JCXByaW50aygiJTguOHggIiwgZHdWYWwpOwotCQlpZiAoKGkrMSklOCA9PSAwKQotCQkJcHJpbnRrKCJcbiIpOwotCX0KLQlwcmludGsoIlxuIik7Ci19Ci1zdGF0aWMgdm9pZCBhbGlfcmVhZF9jZmcodW5zaWduZWQgaW50IHZlbmRvciwgdW5zaWduZWQgZGV2aWNlaWQpCi17Ci0JdW5zaWduZWQgaW50IGR3VmFsOwotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwotCWludCBpLGo7Ci0KLQlwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UodmVuZG9yLCBkZXZpY2VpZCwgTlVMTCk7Ci0JaWYgKHBjaV9kZXYgPT0gTlVMTCkKLQkJcmV0dXJuIDsKLQotCXByaW50aygiXG5NJXggUENJIENGR1xuIiwgZGV2aWNlaWQpOwotCXByaW50aygiICAgICIpOwotCWZvcihqPTA7ajw4O2orKykKLQkJcHJpbnRrKCIlZCAgICAgICAgIixqKTsKLQlwcmludGsoIlxuIik7Ci0KLQlmb3IoaT0wO2k8ODtpKyspIHsKLQkJcHJpbnRrKCIlZCAgICIsaSk7Ci0JCWZvcihqPTA7ajw4O2orKykKLQkJewotCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIGkqMHgyMCtqKjQsICZkd1ZhbCk7Ci0JCQlwcmludGsoIiU4Ljh4ICIsIGR3VmFsKTsKLQkJfQotCQlwcmludGsoIlxuIik7Ci0JfQotCXBjaV9kZXZfcHV0KHBjaV9kZXYpOwotIH0KLXN0YXRpYyB2b2lkIGFsaV9yZWFkX2FjOTdyZWdzKHN0cnVjdCBzbmRfYWxpICpjb2RlYywgaW50IHNlY29uZGFyeSkKLXsKLQl1bnNpZ25lZCBzaG9ydCBpLGo7Ci0JdW5zaWduZWQgc2hvcnQgd1ZhbDsKLQotCXByaW50aygiXG5jb2RlYyAlZCByZWdpc3RlcnMgbWFwOlxuIiwgc2Vjb25kYXJ5KTsKLQotCXByaW50aygiICAgICIpOwotCWZvcihqPTA7ajw4O2orKykKLQkJcHJpbnRrKCIlMi4yeCAgICIsaioyKTsKLQlwcmludGsoIlxuIik7Ci0KLQlmb3IgKGk9MDsgaTw2NDtpKyspIHsKLQkJaWYoaSU4ID09IDApCi0JCQlwcmludGsoIiUyLjJ4ICAiLCAoaS84KSoweDEwKTsKLQkJd1ZhbCA9IHNuZF9hbGlfY29kZWNfcGVlayhjb2RlYywgc2Vjb25kYXJ5LCBpKjIpOwotCQlwcmludGsoIiU0LjR4ICIsIHdWYWwpOwotCQlpZiAoKGkrMSklOCA9PSAwKQotCQkJcHJpbnRrKCJcbiIpOwotCX0KLQlwcmludGsoIlxuIik7Ci19Ci0KLSNlbmRpZgorc3RhdGljIHZvaWQgc25kX2FsaV9jb2RlY19wb2tlKHN0cnVjdCBzbmRfYWxpICosIGludCwgdW5zaWduZWQgc2hvcnQsCisJCQkgICAgICAgdW5zaWduZWQgc2hvcnQpOwogCiAvKgogICogIEFDOTcgQUNDRVNTCiAgKi8KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc25kX2FsaV81NDUxX3BlZWsoc3RydWN0IHNuZF9hbGkgKmNvZGVjLAotCQkJCQkJdW5zaWduZWQgaW50IHBvcnQgKQorCQkJCQkgICAgIHVuc2lnbmVkIGludCBwb3J0KQogewogCXJldHVybiAodW5zaWduZWQgaW50KWlubChBTElfUkVHKGNvZGVjLCBwb3J0KSk7IAogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc25kX2FsaV81NDUxX3Bva2UoCXN0cnVjdCBzbmRfYWxpICpjb2RlYywKLQkJCQkJdW5zaWduZWQgaW50IHBvcnQsCi0JCQkJCXVuc2lnbmVkIGludCB2YWwgKQorc3RhdGljIGlubGluZSB2b2lkIHNuZF9hbGlfNTQ1MV9wb2tlKHN0cnVjdCBzbmRfYWxpICpjb2RlYywKKwkJCQkgICAgIHVuc2lnbmVkIGludCBwb3J0LAorCQkJCSAgICAgdW5zaWduZWQgaW50IHZhbCkKIHsKIAlvdXRsKCh1bnNpZ25lZCBpbnQpdmFsLCBBTElfUkVHKGNvZGVjLCBwb3J0KSk7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2FsaV9jb2RlY19yZWFkeSgJc3RydWN0IHNuZF9hbGkgKmNvZGVjLAotCQkJCXVuc2lnbmVkIGludCBwb3J0ICkKK3N0YXRpYyBpbnQgc25kX2FsaV9jb2RlY19yZWFkeShzdHJ1Y3Qgc25kX2FsaSAqY29kZWMsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHBvcnQpCiB7CiAJdW5zaWduZWQgbG9uZyBlbmRfdGltZTsKIAl1bnNpZ25lZCBpbnQgcmVzOwpAQCAtMzk2LDcgKzMxMyw3IEBACiAJZW5kX3RpbWUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyNTApOwogCWRvIHsKIAkJcmVzID0gc25kX2FsaV81NDUxX3BlZWsoY29kZWMscG9ydCk7Ci0JCWlmICghIChyZXMgJiAweDgwMDApKQorCQlpZiAoIShyZXMgJiAweDgwMDApKQogCQkJcmV0dXJuIDA7CiAJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwogCX0gd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoZW5kX3RpbWUsIGppZmZpZXMpKTsKQEAgLTQyNSwxMSArMzQyLDExIEBACiB9CiAKIHN0YXRpYyB2b2lkIHNuZF9hbGlfY29kZWNfcG9rZShzdHJ1Y3Qgc25kX2FsaSAqY29kZWMsaW50IHNlY29uZGFyeSwKLQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHJlZywKLQkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHZhbCkKKwkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgdmFsKQogewotCXVuc2lnbmVkIGludCBkd1ZhbCA9IDA7Ci0JdW5zaWduZWQgaW50IHBvcnQgPSAwOworCXVuc2lnbmVkIGludCBkd1ZhbDsKKwl1bnNpZ25lZCBpbnQgcG9ydDsKIAogCWlmIChyZWcgPj0gMHg4MCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfY29kZWNfcG9rZTogcmVnKCV4aCkgaW52YWxpZC5cbiIsIHJlZyk7CkBAIC00NDUsMjAgKzM2MiwyMiBAQAogCiAJZHdWYWwgID0gKHVuc2lnbmVkIGludCkgKHJlZyAmIDB4ZmYpOwogCWR3VmFsIHw9IDB4ODAwMCB8ICh2YWwgPDwgMTYpOwotCWlmIChzZWNvbmRhcnkpIGR3VmFsIHw9IDB4MDA4MDsKLQlpZiAoY29kZWMtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikgZHdWYWwgfD0gMHgwMTAwOworCWlmIChzZWNvbmRhcnkpCisJCWR3VmFsIHw9IDB4MDA4MDsKKwlpZiAoY29kZWMtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikKKwkJZHdWYWwgfD0gMHgwMTAwOwogCi0Jc25kX2FsaV81NDUxX3Bva2UoY29kZWMscG9ydCxkd1ZhbCk7CisJc25kX2FsaV81NDUxX3Bva2UoY29kZWMsIHBvcnQsIGR3VmFsKTsKIAogCXJldHVybiA7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfYWxpX2NvZGVjX3BlZWsoIHN0cnVjdCBzbmRfYWxpICpjb2RlYywKLQkJCQkJICBpbnQgc2Vjb25kYXJ5LAotCQkJCQkgIHVuc2lnbmVkIHNob3J0IHJlZykKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfYWxpX2NvZGVjX3BlZWsoc3RydWN0IHNuZF9hbGkgKmNvZGVjLAorCQkJCQkgaW50IHNlY29uZGFyeSwKKwkJCQkJIHVuc2lnbmVkIHNob3J0IHJlZykKIHsKLQl1bnNpZ25lZCBpbnQgZHdWYWwgPSAwOwotCXVuc2lnbmVkIGludCBwb3J0ID0gMDsKKwl1bnNpZ25lZCBpbnQgZHdWYWw7CisJdW5zaWduZWQgaW50IHBvcnQ7CiAKIAlpZiAocmVnID49IDB4ODApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2NvZGVjX3BlZWs6IHJlZygleGgpIGludmFsaWQuXG4iLCByZWcpOwpAQCAtNDc0LDcgKzM5Myw4IEBACiAKIAlkd1ZhbCAgPSAodW5zaWduZWQgaW50KSAocmVnICYgMHhmZik7CiAJZHdWYWwgfD0gMHg4MDAwOwkJCQkvKiBiaXQgMTUqLwotCWlmIChzZWNvbmRhcnkpIGR3VmFsIHw9IDB4MDA4MDsKKwlpZiAoc2Vjb25kYXJ5KQorCQlkd1ZhbCB8PSAweDAwODA7CiAKIAlzbmRfYWxpXzU0NTFfcG9rZShjb2RlYywgcG9ydCwgZHdWYWwpOwogCkBAIC00ODMsNyArNDAzLDcgQEAKIAlpZiAoc25kX2FsaV9jb2RlY19yZWFkeShjb2RlYywgcG9ydCkgPCAwKQogCQlyZXR1cm4gfjA7CiAJCi0JcmV0dXJuIChzbmRfYWxpXzU0NTFfcGVlayhjb2RlYywgcG9ydCkgJiAweGZmZmYwMDAwKT4+MTY7CisJcmV0dXJuIChzbmRfYWxpXzU0NTFfcGVlayhjb2RlYywgcG9ydCkgJiAweGZmZmYwMDAwKSA+PiAxNjsKIH0KIAogc3RhdGljIHZvaWQgc25kX2FsaV9jb2RlY193cml0ZShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsCkBAIC00OTMsOSArNDEzLDkgQEAKIAlzdHJ1Y3Qgc25kX2FsaSAqY29kZWMgPSBhYzk3LT5wcml2YXRlX2RhdGE7CiAKIAlzbmRfYWxpX3ByaW50aygiY29kZWNfd3JpdGU6IHJlZz0leGggZGF0YT0leGguXG4iLCByZWcsIHZhbCk7Ci0JaWYocmVnID09IEFDOTdfR1BJT19TVEFUVVMpIHsKLQkJb3V0bCgodmFsIDw8IEFMSV9BQzk3X0dQSU9fREFUQV9TSElGVCl8QUxJX0FDOTdfR1BJT19FTkFCTEUsCi0JCQlBTElfUkVHKGNvZGVjLCBBTElfQUM5N19HUElPKSk7CisJaWYgKHJlZyA9PSBBQzk3X0dQSU9fU1RBVFVTKSB7CisJCW91dGwoKHZhbCA8PCBBTElfQUM5N19HUElPX0RBVEFfU0hJRlQpIHwgQUxJX0FDOTdfR1BJT19FTkFCTEUsCisJCSAgICAgQUxJX1JFRyhjb2RlYywgQUxJX0FDOTdfR1BJTykpOwogCQlyZXR1cm47CiAJfQogCXNuZF9hbGlfY29kZWNfcG9rZShjb2RlYywgYWM5Ny0+bnVtLCByZWcsIHZhbCk7CkBAIC01MDMsMTIgKzQyMywxMyBAQAogfQogCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzbmRfYWxpX2NvZGVjX3JlYWQoc3RydWN0IHNuZF9hYzk3ICphYzk3LCB1bnNpZ25lZCBzaG9ydCByZWcpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgc25kX2FsaV9jb2RlY19yZWFkKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywKKwkJCQkJIHVuc2lnbmVkIHNob3J0IHJlZykKIHsKIAlzdHJ1Y3Qgc25kX2FsaSAqY29kZWMgPSBhYzk3LT5wcml2YXRlX2RhdGE7CiAKIAlzbmRfYWxpX3ByaW50aygiY29kZWNfcmVhZCByZWc9JXhoLlxuIiwgcmVnKTsKLQlyZXR1cm4gKHNuZF9hbGlfY29kZWNfcGVlayhjb2RlYywgYWM5Ny0+bnVtLCByZWcpKTsKKwlyZXR1cm4gc25kX2FsaV9jb2RlY19wZWVrKGNvZGVjLCBhYzk3LT5udW0sIHJlZyk7CiB9CiAKIC8qCkBAIC01MTcsMTEgKzQzOCwxMiBAQAogCiBzdGF0aWMgaW50IHNuZF9hbGlfcmVzZXRfNTQ1MShzdHJ1Y3Qgc25kX2FsaSAqY29kZWMpCiB7Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwogCXVuc2lnbmVkIHNob3J0IHdDb3VudCwgd1JlZzsKIAl1bnNpZ25lZCBpbnQgICBkd1ZhbDsKIAkKLQlpZiAoKHBjaV9kZXYgPSBjb2RlYy0+cGNpX20xNTMzKSAhPSBOVUxMKSB7CisJcGNpX2RldiA9IGNvZGVjLT5wY2lfbTE1MzM7CisJaWYgKHBjaV9kZXYpIHsKIAkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsICZkd1ZhbCk7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg3YywgZHdWYWwgfCAweDA4MDAwMDAwKTsKIAkJdWRlbGF5KDUwMDApOwpAQCAtNTQxLDcgKzQ2Myw3IEBACiAJd0NvdW50ID0gMjAwOwogCXdoaWxlKHdDb3VudC0tKSB7CiAJCXdSZWcgPSBzbmRfYWxpX2NvZGVjX3BlZWsoY29kZWMsIDAsIEFDOTdfUE9XRVJET1dOKTsKLQkJaWYoKHdSZWcgJiAweDAwMGYpID09IDB4MDAwZikKKwkJaWYgKCh3UmVnICYgMHgwMDBmKSA9PSAweDAwMGYpCiAJCQlyZXR1cm4gMDsKIAkJdWRlbGF5KDUwMDApOwogCX0KQEAgLTU1NSw4ICs0NzcsOCBAQAogCiBzdGF0aWMgaW50IHNuZF9hbGlfcmVzZXRfY29kZWMoc3RydWN0IHNuZF9hbGkgKmNvZGVjKQogewotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyIGJWYWwgPSAwOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXVuc2lnbmVkIGNoYXIgYlZhbDsKIAl1bnNpZ25lZCBpbnQgICBkd1ZhbDsKIAl1bnNpZ25lZCBzaG9ydCB3Q291bnQsIHdSZWc7CiAKQEAgLTU3OSw5ICs1MDEsOSBAQAogCXVkZWxheSgxNTAwMCk7CiAKIAl3Q291bnQgPSAyMDA7Ci0Jd2hpbGUod0NvdW50LS0pIHsKKwl3aGlsZSAod0NvdW50LS0pIHsKIAkJd1JlZyA9IHNuZF9hbGlfY29kZWNfcmVhZChjb2RlYy0+YWM5NywgQUM5N19QT1dFUkRPV04pOwotCQlpZigod1JlZyAmIDB4MDAwZikgPT0gMHgwMDBmKQorCQlpZiAoKHdSZWcgJiAweDAwMGYpID09IDB4MDAwZikKIAkJCXJldHVybiAwOwogCQl1ZGVsYXkoNTAwMCk7CiAJfQpAQCAtNTk0LDI1ICs1MTYsMjcgQEAKICAqICBBTEkgNTQ1MSBDb250cm9sbGVyCiAgKi8KIAotc3RhdGljIHZvaWQgc25kX2FsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCBzbmRfYWxpICpjb2RlYywgdW5zaWduZWQgaW50IGNoYW5uZWwpCitzdGF0aWMgdm9pZCBzbmRfYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwoc3RydWN0IHNuZF9hbGkgKmNvZGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKIHsKLQl1bnNpZ25lZCBsb25nIGR3VmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGR3VmFsOwogCi0JZHdWYWwgID0gaW5sKEFMSV9SRUcoY29kZWMsQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJZHdWYWwgID0gaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwogCWR3VmFsIHw9IDEgPDwgKGNoYW5uZWwgJiAweDAwMDAwMDFmKTsKLQlvdXRsKGR3VmFsLCBBTElfUkVHKGNvZGVjLEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCW91dGwoZHdWYWwsIEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwogfQogCi1zdGF0aWMgdm9pZCBzbmRfYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCBzbmRfYWxpICpjb2RlYywgdW5zaWduZWQgaW50IGNoYW5uZWwpCitzdGF0aWMgdm9pZCBzbmRfYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCBzbmRfYWxpICpjb2RlYywKKwkJCQkJICAgIHVuc2lnbmVkIGludCBjaGFubmVsKQogewotCXVuc2lnbmVkIGxvbmcgZHdWYWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZHdWYWw7CiAKLQlkd1ZhbCAgPSBpbmwoQUxJX1JFRyhjb2RlYyxBTElfR0xPQkFMX0NPTlRST0wpKTsKKwlkd1ZhbCAgPSBpbmwoQUxJX1JFRyhjb2RlYywgQUxJX0dMT0JBTF9DT05UUk9MKSk7CiAJZHdWYWwgJj0gfigxIDw8IChjaGFubmVsICYgMHgwMDAwMDAxZikpOwotCW91dGwoZHdWYWwsIEFMSV9SRUcoY29kZWMsQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJb3V0bChkd1ZhbCwgQUxJX1JFRyhjb2RlYywgQUxJX0dMT0JBTF9DT05UUk9MKSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNuZF9hbGlfZW5hYmxlX2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCBzbmRfYWxpICogY29kZWMpCitzdGF0aWMgdm9pZCBzbmRfYWxpX2VuYWJsZV9hZGRyZXNzX2ludGVycnVwdChzdHJ1Y3Qgc25kX2FsaSAqY29kZWMpCiB7CiAJdW5zaWduZWQgaW50IGdjOwogCkBAIC02MjIsNyArNTQ2LDcgQEAKIAlvdXRsKCBnYywgQUxJX1JFRyhjb2RlYywgQUxJX0dDX0NJUikpOwogfQogCi1zdGF0aWMgdm9pZCBzbmRfYWxpX2Rpc2FibGVfYWRkcmVzc19pbnRlcnJ1cHQoc3RydWN0IHNuZF9hbGkgKiBjb2RlYykKK3N0YXRpYyB2b2lkIHNuZF9hbGlfZGlzYWJsZV9hZGRyZXNzX2ludGVycnVwdChzdHJ1Y3Qgc25kX2FsaSAqY29kZWMpCiB7CiAJdW5zaWduZWQgaW50IGdjOwogCkBAIC02MzIsOCArNTU2LDkgQEAKIAlvdXRsKGdjLCBBTElfUkVHKGNvZGVjLCBBTElfR0NfQ0lSKSk7CiB9CiAKLSNpZiAwIC8vIG5vdCB1c2VkCi1zdGF0aWMgdm9pZCBzbmRfYWxpX2VuYWJsZV92b2ljZV9pcnEoc3RydWN0IHNuZF9hbGkgKmNvZGVjLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKKyNpZiAwIC8qIG5vdCB1c2VkICovCitzdGF0aWMgdm9pZCBzbmRfYWxpX2VuYWJsZV92b2ljZV9pcnEoc3RydWN0IHNuZF9hbGkgKmNvZGVjLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwpCiB7CiAJdW5zaWduZWQgaW50IG1hc2s7CiAJc3RydWN0IHNuZF9hbGlfY2hhbm5lbF9jb250cm9sICpwY2hyZWdzID0gJihjb2RlYy0+Y2hyZWdzKTsKQEAgLTY0MSwxMyArNTY2LDE0IEBACiAJc25kX2FsaV9wcmludGsoImVuYWJsZV92b2ljZV9pcnEgY2hhbm5lbD0lZFxuIixjaGFubmVsKTsKIAkKIAltYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwotCXBjaHJlZ3MtPmRhdGEuYWludGVuICA9IGlubChBTElfUkVHKGNvZGVjLHBjaHJlZ3MtPnJlZ3MuYWludGVuKSk7CisJcGNocmVncy0+ZGF0YS5haW50ZW4gID0gaW5sKEFMSV9SRUcoY29kZWMsIHBjaHJlZ3MtPnJlZ3MuYWludGVuKSk7CiAJcGNocmVncy0+ZGF0YS5haW50ZW4gfD0gbWFzazsKLQlvdXRsKHBjaHJlZ3MtPmRhdGEuYWludGVuLEFMSV9SRUcoY29kZWMscGNocmVncy0+cmVncy5haW50ZW4pKTsKKwlvdXRsKHBjaHJlZ3MtPmRhdGEuYWludGVuLCBBTElfUkVHKGNvZGVjLCBwY2hyZWdzLT5yZWdzLmFpbnRlbikpOwogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHNuZF9hbGlfZGlzYWJsZV92b2ljZV9pcnEoc3RydWN0IHNuZF9hbGkgKmNvZGVjLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3N0YXRpYyB2b2lkIHNuZF9hbGlfZGlzYWJsZV92b2ljZV9pcnEoc3RydWN0IHNuZF9hbGkgKmNvZGVjLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsKQogewogCXVuc2lnbmVkIGludCBtYXNrOwogCXN0cnVjdCBzbmRfYWxpX2NoYW5uZWxfY29udHJvbCAqcGNocmVncyA9ICYoY29kZWMtPmNocmVncyk7CkBAIC02NTUsOSArNTgxLDkgQEAKIAlzbmRfYWxpX3ByaW50aygiZGlzYWJsZV92b2ljZV9pcnEgY2hhbm5lbD0lZFxuIixjaGFubmVsKTsKIAogCW1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7Ci0JcGNocmVncy0+ZGF0YS5haW50ZW4gID0gaW5sKEFMSV9SRUcoY29kZWMscGNocmVncy0+cmVncy5haW50ZW4pKTsKKwlwY2hyZWdzLT5kYXRhLmFpbnRlbiAgPSBpbmwoQUxJX1JFRyhjb2RlYywgcGNocmVncy0+cmVncy5haW50ZW4pKTsKIAlwY2hyZWdzLT5kYXRhLmFpbnRlbiAmPSB+bWFzazsKLQlvdXRsKHBjaHJlZ3MtPmRhdGEuYWludGVuLEFMSV9SRUcoY29kZWMscGNocmVncy0+cmVncy5haW50ZW4pKTsKKwlvdXRsKHBjaHJlZ3MtPmRhdGEuYWludGVuLCBBTElfUkVHKGNvZGVjLCBwY2hyZWdzLT5yZWdzLmFpbnRlbikpOwogfQogCiBzdGF0aWMgaW50IHNuZF9hbGlfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHNuZF9hbGkgKmNvZGVjLCBpbnQgY2hhbm5lbCkKQEAgLTY2NSw3ICs1OTEsOCBAQAogCXVuc2lnbmVkIGludCBpZHggPSAgY2hhbm5lbCAmIDB4MWY7CiAKIAlpZiAoY29kZWMtPnN5bnRoLmNoY250ID49IEFMSV9DSEFOTkVMUyl7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaV9hbGxvY19wY21fY2hhbm5lbDogbm8gZnJlZSBjaGFubmVscy5cbiIpOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSCisJCQkgICAiYWxpX2FsbG9jX3BjbV9jaGFubmVsOiBubyBmcmVlIGNoYW5uZWxzLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY4NSwzNSArNjEyLDQxIEBACiAKIAlzbmRfYWxpX3ByaW50aygiZmluZF9mcmVlX2NoYW5uZWw6IGZvciAlc1xuIixyZWMgPyAicmVjIiA6ICJwY20iKTsKIAotCS8vIHJlY29yZGluZworCS8qIHJlY29yZGluZyAqLwogCWlmIChyZWMpIHsKIAkJaWYgKGNvZGVjLT5zcGRpZl9zdXBwb3J0ICYmCi0JCSAgICAoaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgQUxJX1NQRElGX0lOX1NVUFBPUlQpKQorCQkgICAgKGlubChBTElfUkVHKGNvZGVjLCBBTElfR0xPQkFMX0NPTlRST0wpKSAmCisJCSAgICAgQUxJX1NQRElGX0lOX1NVUFBPUlQpKQogCQkJaWR4ID0gQUxJX1NQRElGX0lOX0NIQU5ORUw7CiAJCWVsc2UKIAkJCWlkeCA9IEFMSV9QQ01fSU5fQ0hBTk5FTDsKIAotCQlpZiAoKHJlc3VsdCA9IHNuZF9hbGlfYWxsb2NfcGNtX2NoYW5uZWwoY29kZWMsaWR4KSkgPj0gMCkgeworCQlyZXN1bHQgPSBzbmRfYWxpX2FsbG9jX3BjbV9jaGFubmVsKGNvZGVjLCBpZHgpOworCQlpZiAocmVzdWx0ID49IDApCiAJCQlyZXR1cm4gcmVzdWx0OwotCQl9IGVsc2UgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiByZWNvcmQgY2hhbm5lbCBpcyBidXN5IG5vdy5cbiIpOworCQllbHNlIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaV9maW5kX2ZyZWVfY2hhbm5lbDogIgorCQkJCSAgICJyZWNvcmQgY2hhbm5lbCBpcyBidXN5IG5vdy5cbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQogCi0JLy9wbGF5YmFjay4uLgorCS8qIHBsYXliYWNrLi4uICovCiAJaWYgKGNvZGVjLT5zcGRpZl9zdXBwb3J0ICYmCi0JICAgIChpbmwoQUxJX1JFRyhjb2RlYywgQUxJX0dMT0JBTF9DT05UUk9MKSkgJiBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkpIHsKKwkgICAgKGlubChBTElfUkVHKGNvZGVjLCBBTElfR0xPQkFMX0NPTlRST0wpKSAmCisJICAgICBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkpIHsKIAkJaWR4ID0gQUxJX1NQRElGX09VVF9DSEFOTkVMOwotCQlpZiAoKHJlc3VsdCA9IHNuZF9hbGlfYWxsb2NfcGNtX2NoYW5uZWwoY29kZWMsaWR4KSkgPj0gMCkgeworCQlyZXN1bHQgPSBzbmRfYWxpX2FsbG9jX3BjbV9jaGFubmVsKGNvZGVjLCBpZHgpOworCQlpZiAocmVzdWx0ID49IDApCiAJCQlyZXR1cm4gcmVzdWx0OwotCQl9IGVsc2UgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2ZpbmRfZnJlZV9jaGFubmVsOiBTL1BESUYgb3V0IGNoYW5uZWwgaXMgaW4gYnVzeSBub3cuXG4iKTsKLQkJfQorCQllbHNlCisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZmluZF9mcmVlX2NoYW5uZWw6ICIKKwkJCQkgICAiUy9QRElGIG91dCBjaGFubmVsIGlzIGluIGJ1c3kgbm93LlxuIik7CiAJfQogCiAJZm9yIChpZHggPSAwOyBpZHggPCBBTElfQ0hBTk5FTFM7IGlkeCsrKSB7Ci0JCWlmICgocmVzdWx0ID0gc25kX2FsaV9hbGxvY19wY21fY2hhbm5lbChjb2RlYyxpZHgpKSA+PSAwKQorCQlyZXN1bHQgPSBzbmRfYWxpX2FsbG9jX3BjbV9jaGFubmVsKGNvZGVjLCBpZHgpOworCQlpZiAocmVzdWx0ID49IDApCiAJCQlyZXR1cm4gcmVzdWx0OwogCX0KIAlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZmluZF9mcmVlX2NoYW5uZWw6IG5vIGZyZWUgY2hhbm5lbHMuXG4iKTsKQEAgLTczMCw3ICs2NjMsOCBAQAogCQlyZXR1cm47CiAKIAlpZiAoIShjb2RlYy0+c3ludGguY2htYXAgJiAoMSA8PCBpZHgpKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfZnJlZV9jaGFubmVsX3BjbTogY2hhbm5lbCAlZCBpcyBub3QgaW4gdXNlLlxuIixjaGFubmVsKTsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpX2ZyZWVfY2hhbm5lbF9wY206ICIKKwkJCSAgICJjaGFubmVsICVkIGlzIG5vdCBpbiB1c2UuXG4iLCBjaGFubmVsKTsKIAkJcmV0dXJuOwogCX0gZWxzZSB7CiAJCWNvZGVjLT5zeW50aC5jaG1hcCAmPSB+KDEgPDwgaWR4KTsKQEAgLTczOCw4ICs2NzIsOCBAQAogCX0KIH0KIAotI2lmIDAgLy8gbm90IHVzZWQKLXN0YXRpYyB2b2lkIHNuZF9hbGlfc3RhcnRfdm9pY2Uoc3RydWN0IHNuZF9hbGkgKiBjb2RlYywgdW5zaWduZWQgaW50IGNoYW5uZWwpCisjaWYgMCAvKiBub3QgdXNlZCAqLworc3RhdGljIHZvaWQgc25kX2FsaV9zdGFydF92b2ljZShzdHJ1Y3Qgc25kX2FsaSAqY29kZWMsIHVuc2lnbmVkIGludCBjaGFubmVsKQogewogCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwogCQpAQCAtNzQ4LDcgKzY4Miw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgc25kX2FsaV9zdG9wX3ZvaWNlKHN0cnVjdCBzbmRfYWxpICogY29kZWMsIHVuc2lnbmVkIGludCBjaGFubmVsKQorc3RhdGljIHZvaWQgc25kX2FsaV9zdG9wX3ZvaWNlKHN0cnVjdCBzbmRfYWxpICpjb2RlYywgdW5zaWduZWQgaW50IGNoYW5uZWwpCiB7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CiAKQEAgLTc2OCwyNiArNzAyLDI3IEBACiAJY3VycmVudHRpbWVyID0gaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9TVElNRVIpKTsKIAogCXdoaWxlIChjdXJyZW50dGltZXIgPCBiZWdpbnRpbWVyICsgaW50ZXJ2YWwpIHsKLQkJaWYoc25kX2FsaV9zdGltZXJfcmVhZHkoY29kZWMpIDwgMCkKKwkJaWYgKHNuZF9hbGlfc3RpbWVyX3JlYWR5KGNvZGVjKSA8IDApCiAJCQlicmVhazsKIAkJY3VycmVudHRpbWVyID0gaW5sKEFMSV9SRUcoY29kZWMsICBBTElfU1RJTUVSKSk7CisJCWNwdV9yZWxheCgpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgc25kX2FsaV9kZXRlY3Rfc3BkaWZfcmF0ZShzdHJ1Y3Qgc25kX2FsaSAqY29kZWMpCiB7Ci0JdTE2IHd2YWwgID0gMDsKKwl1MTYgd3ZhbDsKIAl1MTYgY291bnQgPSAwOwotCXU4ICBidmFsID0gMCwgUjEgPSAwLCBSMiA9IDA7CisJdTggIGJ2YWwsIFIxID0gMCwgUjI7CiAKLQlidmFsICA9IGluYihBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMICsgMSkpOworCWJ2YWwgID0gaW5iKEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DVFJMICsgMSkpOwogCWJ2YWwgfD0gMHgxRjsKLQlvdXRiKGJ2YWwsQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1RSTCArIDEpKTsKKwlvdXRiKGJ2YWwsIEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DVFJMICsgMSkpOwogCi0Jd2hpbGUgKCgoUjEgPCAweDBCICl8fChSMSA+IDB4MEUpKSAmJiAoUjEgIT0gMHgxMikgJiYgY291bnQgPD0gNTAwMDApIHsKKwl3aGlsZSAoKFIxIDwgMHgwYiB8fCBSMSA+IDB4MGUpICYmIFIxICE9IDB4MTIgJiYgY291bnQgPD0gNTAwMDApIHsKIAkJY291bnQgKys7CiAJCXNuZF9hbGlfZGVsYXkoY29kZWMsIDYpOwotCQlidmFsID0gaW5iKEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NUUkwgKyAxKSk7CisJCWJ2YWwgPSBpbmIoQUxJX1JFRyhjb2RlYywgQUxJX1NQRElGX0NUUkwgKyAxKSk7CiAJCVIxID0gYnZhbCAmIDB4MUY7CiAJfQogCkBAIC04MDEsNyArNzM2LDEwIEBACiAJCXNuZF9hbGlfZGVsYXkoY29kZWMsIDYpOwogCQlidmFsID0gaW5iKEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NUUkwgKyAxKSk7CiAJCVIyID0gYnZhbCAmIDB4MUY7Ci0JCWlmIChSMiAhPSBSMSkgUjEgPSBSMjsgZWxzZSBicmVhazsKKwkJaWYgKFIyICE9IFIxKQorCQkJUjEgPSBSMjsKKwkJZWxzZQorCQkJYnJlYWs7CiAJfQogCiAJaWYgKGNvdW50ID4gNTAwMDApIHsKQEAgLTgxMCw0MiArNzQ4LDQ1IEBACiAJfQogCiAJaWYgKFIyID49IDB4MGIgJiYgUjIgPD0gMHgwZSkgewotCQl3dmFsICA9IGludyhBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMICsgMikpOwotCQl3dmFsICY9IDB4RTBGMDsKLQkJd3ZhbCB8PSAodTE2KTB4MDkgPDwgOCB8ICh1MTYpMHgwNTsKLQkJb3V0dyh3dmFsLEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NUUkwgKyAyKSk7CisJCXd2YWwgID0gaW53KEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DVFJMICsgMikpOworCQl3dmFsICY9IDB4ZTBmMDsKKwkJd3ZhbCB8PSAoMHgwOSA8PCA4KSB8IDB4MDU7CisJCW91dHcod3ZhbCwgQUxJX1JFRyhjb2RlYywgQUxJX1NQRElGX0NUUkwgKyAyKSk7CiAKLQkJYnZhbCAgPSBpbmIoQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1MgKzMpKSAmIDB4RjA7Ci0JCW91dGIoYnZhbHwweDAyLEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NTICsgMykpOworCQlidmFsICA9IGluYihBTElfUkVHKGNvZGVjLCBBTElfU1BESUZfQ1MgKyAzKSkgJiAweGYwOworCQlvdXRiKGJ2YWwgfCAweDAyLCBBTElfUkVHKGNvZGVjLCBBTElfU1BESUZfQ1MgKyAzKSk7CiAJfSBlbHNlIGlmIChSMiA9PSAweDEyKSB7Ci0JCXd2YWwgID0gaW53KEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NUUkwgKyAyKSk7Ci0JCXd2YWwgJj0gMHhFMEYwOwotCQl3dmFsIHw9ICh1MTYpMHgwRSA8PCA4IHwgKHUxNikweDA4OwotCQlvdXR3KHd2YWwsQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1RSTCArIDIpKTsKKwkJd3ZhbCAgPSBpbncoQUxJX1JFRyhjb2RlYywgQUxJX1NQRElGX0NUUkwgKyAyKSk7CisJCXd2YWwgJj0gMHhlMGYwOworCQl3dmFsIHw9ICgweDBlIDw8IDgpIHwgMHgwODsKKwkJb3V0dyh3dmFsLCBBTElfUkVHKGNvZGVjLCBBTElfU1BESUZfQ1RSTCArIDIpKTsKIAotCQlidmFsICA9IGluYihBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DUyArMykpICYgMHhGMDsKLQkJb3V0YihidmFsfDB4MDMsQUxJX1JFRyhjb2RlYyxBTElfU1BESUZfQ1MgKyAzKSk7CisJCWJ2YWwgID0gaW5iKEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NTICsgMykpICYgMHhmMDsKKwkJb3V0YihidmFsIHwgMHgwMywgQUxJX1JFRyhjb2RlYywgQUxJX1NQRElGX0NTICsgMykpOwogCX0KIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBzbmRfYWxpX2dldF9zcGRpZl9pbl9yYXRlKHN0cnVjdCBzbmRfYWxpICpjb2RlYykKIHsKLQl1MzIJZHdSYXRlID0gMDsKLQl1OAlidmFsID0gMDsKKwl1MzIJZHdSYXRlOworCXU4CWJ2YWw7CiAKLQlidmFsICA9IGluYihBTElfUkVHKGNvZGVjLEFMSV9TUERJRl9DVFJMKSk7Ci0JYnZhbCAmPSAweDdGOworCWJ2YWwgID0gaW5iKEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DVFJMKSk7CisJYnZhbCAmPSAweDdmOwogCWJ2YWwgfD0gMHg0MDsKLQlvdXRiKGJ2YWwsIEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NUUkwpKTsKKwlvdXRiKGJ2YWwsIEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DVFJMKSk7CiAKIAlzbmRfYWxpX2RldGVjdF9zcGRpZl9yYXRlKGNvZGVjKTsKIAotCWJ2YWwgID0gaW5iKEFMSV9SRUcoY29kZWMsQUxJX1NQRElGX0NTICsgMykpOwotCWJ2YWwgJj0gMHgwRjsKKwlidmFsICA9IGluYihBTElfUkVHKGNvZGVjLCBBTElfU1BESUZfQ1MgKyAzKSk7CisJYnZhbCAmPSAweDBmOwogCi0JaWYgKGJ2YWwgPT0gMCkgZHdSYXRlID0gNDQxMDA7Ci0JaWYgKGJ2YWwgPT0gMSkgZHdSYXRlID0gNDgwMDA7Ci0JaWYgKGJ2YWwgPT0gMikgZHdSYXRlID0gMzIwMDA7CisJc3dpdGNoIChidmFsKSB7CisJY2FzZSAwOiBkd1JhdGUgPSA0NDEwMDsgYnJlYWs7CisJY2FzZSAxOiBkd1JhdGUgPSA0ODAwMDsgYnJlYWs7CisJY2FzZSAyOiBkd1JhdGUgPSAzMjAwMDsgYnJlYWs7CisJZGVmYXVsdDogZHdSYXRlID0gMDsgYnJlYWs7CisJfQogCiAJcmV0dXJuIGR3UmF0ZTsKIH0KQEAgLTg4MCwyMCArODIxLDIyIEBACiBzdGF0aWMgdm9pZCBzbmRfYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdHJ1Y3Qgc25kX2FsaSAqY29kZWMsIHVuc2lnbmVkIGludCByYXRlKQogewogCXVuc2lnbmVkIGNoYXIgIGJWYWw7Ci0JdW5zaWduZWQgaW50ICBkd1JhdGUgPSAwOworCXVuc2lnbmVkIGludCAgZHdSYXRlOwogCQotCWlmIChyYXRlID09IDMyMDAwKSBkd1JhdGUgPSAweDMwMDsKLQlpZiAocmF0ZSA9PSA0NDEwMCkgZHdSYXRlID0gMDsKLQlpZiAocmF0ZSA9PSA0ODAwMCkgZHdSYXRlID0gMHgyMDA7CisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSAzMjAwMDogZHdSYXRlID0gMHgzMDA7IGJyZWFrOworCWNhc2UgNDgwMDA6IGR3UmF0ZSA9IDB4MjAwOyBicmVhazsKKwlkZWZhdWx0OiBkd1JhdGUgPSAwOyBicmVhazsKKwl9CiAJCiAJYlZhbCAgPSBpbmIoQUxJX1JFRyhjb2RlYywgQUxJX1NQRElGX0NUUkwpKTsKIAliVmFsICY9ICh1bnNpZ25lZCBjaGFyKSh+KDE8PDYpKTsKIAkKLQliVmFsIHw9IDB4ODA7CQkvL3NlbGVjdCByaWdodAorCWJWYWwgfD0gMHg4MDsJCS8qIHNlbGVjdCByaWdodCAqLwogCW91dGIoYlZhbCwgQUxJX1JFRyhjb2RlYywgQUxJX1NQRElGX0NUUkwpKTsKIAlvdXRiKGR3UmF0ZSB8IDB4MjAsIEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DUyArIDIpKTsKIAkKLQliVmFsICY9ICh+MHg4MCk7CS8vc2VsZWN0IGxlZnQKKwliVmFsICY9IH4weDgwOwkvKiBzZWxlY3QgbGVmdCAqLwogCW91dGIoYlZhbCwgQUxJX1JFRyhjb2RlYywgQUxJX1NQRElGX0NUUkwpKTsKIAlvdXR3KHJhdGUgfCAweDEwLCBBTElfUkVHKGNvZGVjLCBBTElfU1BESUZfQ1MgKyAyKSk7CiB9CkBAIC05MDIsOCArODQ1LDcgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB3VmFsOwogCXVuc2lnbmVkIGNoYXIgYlZhbDsKLQotICAgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisgICAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwogCiAgICAgICAgIHBjaV9kZXYgPSBjb2RlYy0+cGNpX20xNTMzOwogICAgICAgICBpZiAocGNpX2RldiA9PSBOVUxMKQpAQCAtOTI2LDE3ICs4NjgsMTUgQEAKIAliVmFsID0gaW5iKEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DVFJMKSk7CiAJb3V0YihiVmFsICYgQUxJX1NQRElGX09VVF9DSF9TVEFUVVMsIEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DVFJMKSk7CiAgICAKLQl7Ci0gICAJCXdWYWwgPSBpbncoQUxJX1JFRyhjb2RlYywgQUxJX0dMT0JBTF9DT05UUk9MKSk7Ci0gICAJCXdWYWwgfD0gQUxJX1NQRElGX09VVF9TRUxfUENNOwotICAgCQlvdXR3KHdWYWwsIEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwotCQlzbmRfYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGNvZGVjLEFMSV9TUERJRl9PVVRfQ0hBTk5FTCk7Ci0gICAJfQorCXdWYWwgPSBpbncoQUxJX1JFRyhjb2RlYywgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJd1ZhbCB8PSBBTElfU1BESUZfT1VUX1NFTF9QQ007CisJb3V0dyh3VmFsLCBBTElfUkVHKGNvZGVjLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKKwlzbmRfYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGNvZGVjLCBBTElfU1BESUZfT1VUX0NIQU5ORUwpOwogfQogCiBzdGF0aWMgdm9pZCBzbmRfYWxpX2VuYWJsZV9zcGRpZl9jaG5vdXQoc3RydWN0IHNuZF9hbGkgKmNvZGVjKQogewotCXVuc2lnbmVkIHNob3J0IHdWYWwgPSAwOworCXVuc2lnbmVkIHNob3J0IHdWYWw7CiAKIAl3VmFsICA9IGludyhBTElfUkVHKGNvZGVjLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKICAgIAl3VmFsICY9IH5BTElfU1BESUZfT1VUX1NFTF9QQ007CkBAIC05NDksMTIgKzg4OSwxMyBAQAogCQl3VmFsICY9ICh+MHgwMDAyKTsKICAgIAlvdXR3KHdWYWwsIEFMSV9SRUcoY29kZWMsIEFMSV9TUERJRl9DUykpOwogKi8KLQlzbmRfYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwoY29kZWMsQUxJX1NQRElGX09VVF9DSEFOTkVMKTsKKwlzbmRfYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwoY29kZWMsIEFMSV9TUERJRl9PVVRfQ0hBTk5FTCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNuZF9hbGlfZGlzYWJsZV9zcGRpZl9jaG5vdXQoc3RydWN0IHNuZF9hbGkgKmNvZGVjKQogewotCXVuc2lnbmVkIHNob3J0IHdWYWwgPSAwOworCXVuc2lnbmVkIHNob3J0IHdWYWw7CisKICAgCXdWYWwgID0gaW53KEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwogICAgCXdWYWwgfD0gQUxJX1NQRElGX09VVF9TRUxfUENNOwogICAgCW91dHcod1ZhbCwgQUxJX1JFRyhjb2RlYywgQUxJX0dMT0JBTF9DT05UUk9MKSk7CkBAIC05NzIsMTEgKzkxMywxMSBAQAogCXNuZF9hbGlfZGlzYWJsZV9zcGRpZl9jaG5vdXQoY29kZWMpOwogfQogCi1zdGF0aWMgdm9pZCBzbmRfYWxpX3VwZGF0ZV9wdHIoc3RydWN0IHNuZF9hbGkgKmNvZGVjLGludCBjaGFubmVsKQorc3RhdGljIHZvaWQgc25kX2FsaV91cGRhdGVfcHRyKHN0cnVjdCBzbmRfYWxpICpjb2RlYywgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IHNuZF9hbGlfdm9pY2UgKnB2b2ljZSA9IE5VTEw7CisJc3RydWN0IHNuZF9hbGlfdm9pY2UgKnB2b2ljZTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOwotCXN0cnVjdCBzbmRfYWxpX2NoYW5uZWxfY29udHJvbCAqcGNocmVncyA9IE5VTEw7CisJc3RydWN0IHNuZF9hbGlfY2hhbm5lbF9jb250cm9sICpwY2hyZWdzOwogCXVuc2lnbmVkIGludCBvbGQsIG1hc2s7CiAjaWZkZWYgQUxJX0RFQlVHCiAJdW5zaWduZWQgaW50IHRlbXAsIGNzcGY7CkBAIC05ODQsOSArOTI1LDkgQEAKIAogCXBjaHJlZ3MgPSAmKGNvZGVjLT5jaHJlZ3MpOwogCi0JLy8gY2hlY2sgaWYgaW50ZXJydXB0IG9jY3VycmVkIGZvciBjaGFubmVsCisJLyogY2hlY2sgaWYgaW50ZXJydXB0IG9jY3VycmVkIGZvciBjaGFubmVsICovCiAJb2xkICA9IHBjaHJlZ3MtPmRhdGEuYWludDsKLQltYXNrID0gKCh1bnNpZ25lZCBpbnQpIDFMKSA8PCAoY2hhbm5lbCAmIDB4MWYpOworCW1hc2sgPSAxVSA8PCAoY2hhbm5lbCAmIDB4MWYpOwogCiAJaWYgKCEob2xkICYgbWFzaykpCiAJCXJldHVybjsKQEAgLTEwMDUsNyArOTQ2LDggQEAKIAkJY3NwZiA9IChpbmwoQUxJX1JFRyhjb2RlYywgQUxJX0NTUEYpKSAmIG1hc2spID09IG1hc2s7CiAjZW5kaWYKIAkJaWYgKHB2b2ljZS0+cnVubmluZykgewotCQkJc25kX2FsaV9wcmludGsoInVwZGF0ZV9wdHI6IGNzbz0lNC40eCBjc3BmPSVkLlxuIiwodTE2KXRlbXAsY3NwZik7CisJCQlzbmRfYWxpX3ByaW50aygidXBkYXRlX3B0cjogY3NvPSU0LjR4IGNzcGY9JWQuXG4iLAorCQkJCSAgICAgICAodTE2KXRlbXAsIGNzcGYpOwogCQkJc3Bpbl91bmxvY2soJmNvZGVjLT5yZWdfbG9jayk7CiAJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHB2b2ljZS0+c3Vic3RyZWFtKTsKIAkJCXNwaW5fbG9jaygmY29kZWMtPnJlZ19sb2NrKTsKQEAgLTEwMjcsNDkgKzk2OSw0NyBAQAogCXBjaHJlZ3MtPmRhdGEuYWludCA9IG9sZCAmICh+bWFzayk7CiB9CiAKLXN0YXRpYyB2b2lkIHNuZF9hbGlfaW50ZXJydXB0KHN0cnVjdCBzbmRfYWxpICogY29kZWMpCi17Ci0JaW50IGNoYW5uZWw7Ci0JdW5zaWduZWQgaW50IGF1ZGlvX2ludDsKLQlzdHJ1Y3Qgc25kX2FsaV9jaGFubmVsX2NvbnRyb2wgKnBjaHJlZ3MgPSBOVUxMOwotCXBjaHJlZ3MgPSAmKGNvZGVjLT5jaHJlZ3MpOwotCi0JYXVkaW9faW50ID0gaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9NSVNDSU5UKSk7Ci0JaWYgKGF1ZGlvX2ludCAmIEFERFJFU1NfSVJRKSB7Ci0JCS8vIGdldCBpbnRlcnJ1cHQgc3RhdHVzIGZvciBhbGwgY2hhbm5lbHMKLQkJcGNocmVncy0+ZGF0YS5haW50ID0gaW5sKEFMSV9SRUcoY29kZWMscGNocmVncy0+cmVncy5haW50KSk7Ci0JCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBBTElfQ0hBTk5FTFM7IGNoYW5uZWwrKykgewotCQkJc25kX2FsaV91cGRhdGVfcHRyKGNvZGVjLCBjaGFubmVsKTsKLQkJfQotCX0KLQlvdXRsKChUQVJHRVRfUkVBQ0hFRCB8IE1JWEVSX09WRVJGTE9XIHwgTUlYRVJfVU5ERVJGTE9XKSwKLQkJQUxJX1JFRyhjb2RlYyxBTElfTUlTQ0lOVCkpOwotfQotCi0KIHN0YXRpYyBpcnFyZXR1cm5fdCBzbmRfYWxpX2NhcmRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qgc25kX2FsaSAJKmNvZGVjID0gZGV2X2lkOworCWludCBjaGFubmVsOworCXVuc2lnbmVkIGludCBhdWRpb19pbnQ7CisJc3RydWN0IHNuZF9hbGlfY2hhbm5lbF9jb250cm9sICpwY2hyZWdzOwogCi0JaWYgKGNvZGVjID09IE5VTEwpCisJaWYgKGNvZGVjID09IE5VTEwgfHwgIWNvZGVjLT5od19pbml0aWFsaXplZCkKIAkJcmV0dXJuIElSUV9OT05FOwotCXNuZF9hbGlfaW50ZXJydXB0KGNvZGVjKTsKKworCWF1ZGlvX2ludCA9IGlubChBTElfUkVHKGNvZGVjLCBBTElfTUlTQ0lOVCkpOworCWlmICghYXVkaW9faW50KQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlwY2hyZWdzID0gJihjb2RlYy0+Y2hyZWdzKTsKKwlpZiAoYXVkaW9faW50ICYgQUREUkVTU19JUlEpIHsKKwkJLyogZ2V0IGludGVycnVwdCBzdGF0dXMgZm9yIGFsbCBjaGFubmVscyAqLworCQlwY2hyZWdzLT5kYXRhLmFpbnQgPSBpbmwoQUxJX1JFRyhjb2RlYywgcGNocmVncy0+cmVncy5haW50KSk7CisJCWZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBBTElfQ0hBTk5FTFM7IGNoYW5uZWwrKykKKwkJCXNuZF9hbGlfdXBkYXRlX3B0cihjb2RlYywgY2hhbm5lbCk7CisJfQorCW91dGwoKFRBUkdFVF9SRUFDSEVEIHwgTUlYRVJfT1ZFUkZMT1cgfCBNSVhFUl9VTkRFUkZMT1cpLAorCQlBTElfUkVHKGNvZGVjLCBBTElfTUlTQ0lOVCkpOworCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2FsaV92b2ljZSAqc25kX2FsaV9hbGxvY192b2ljZShzdHJ1Y3Qgc25kX2FsaSAqIGNvZGVjLCBpbnQgdHlwZSwgaW50IHJlYywgaW50IGNoYW5uZWwpCitzdGF0aWMgc3RydWN0IHNuZF9hbGlfdm9pY2UgKnNuZF9hbGlfYWxsb2Nfdm9pY2Uoc3RydWN0IHNuZF9hbGkgKiBjb2RlYywKKwkJCQkJCSBpbnQgdHlwZSwgaW50IHJlYywgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IHNuZF9hbGlfdm9pY2UgKnB2b2ljZSA9IE5VTEw7CisJc3RydWN0IHNuZF9hbGlfdm9pY2UgKnB2b2ljZTsKIAlpbnQgaWR4OwogCi0Jc25kX2FsaV9wcmludGsoImFsbG9jX3ZvaWNlOiB0eXBlPSVkIHJlYz0lZFxuIix0eXBlLHJlYyk7CisJc25kX2FsaV9wcmludGsoImFsbG9jX3ZvaWNlOiB0eXBlPSVkIHJlYz0lZFxuIiwgdHlwZSwgcmVjKTsKIAogCXNwaW5fbG9ja19pcnEoJmNvZGVjLT52b2ljZV9hbGxvYyk7CiAJaWYgKHR5cGUgPT0gU05EUlZfQUxJX1ZPSUNFX1RZUEVfUENNKSB7CiAJCWlkeCA9IGNoYW5uZWwgPiAwID8gc25kX2FsaV9hbGxvY19wY21fY2hhbm5lbChjb2RlYywgY2hhbm5lbCkgOgogCQkJc25kX2FsaV9maW5kX2ZyZWVfY2hhbm5lbChjb2RlYyxyZWMpOwotCQlpZihpZHggPCAwKSB7CisJCWlmIChpZHggPCAwKSB7CiAJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGlfYWxsb2Nfdm9pY2U6IGVyci5cbiIpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZjb2RlYy0+dm9pY2VfYWxsb2MpOwogCQkJcmV0dXJuIE5VTEw7CkBAIC0xMDg3LDcgKzEwMjcsOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHNuZF9hbGlfZnJlZV92b2ljZShzdHJ1Y3Qgc25kX2FsaSAqIGNvZGVjLCBzdHJ1Y3Qgc25kX2FsaV92b2ljZSAqcHZvaWNlKQorc3RhdGljIHZvaWQgc25kX2FsaV9mcmVlX3ZvaWNlKHN0cnVjdCBzbmRfYWxpICogY29kZWMsCisJCQkgICAgICAgc3RydWN0IHNuZF9hbGlfdm9pY2UgKnB2b2ljZSkKIHsKIAl2b2lkICgqcHJpdmF0ZV9mcmVlKSh2b2lkICopOwogCXZvaWQgKnByaXZhdGVfZGF0YTsKQEAgLTExMDEsOSArMTA0Miw4IEBACiAJcHJpdmF0ZV9kYXRhID0gcHZvaWNlLT5wcml2YXRlX2RhdGE7CiAJcHZvaWNlLT5wcml2YXRlX2ZyZWUgPSBOVUxMOwogCXB2b2ljZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLQlpZiAocHZvaWNlLT5wY20pIHsKKwlpZiAocHZvaWNlLT5wY20pCiAJCXNuZF9hbGlfZnJlZV9jaGFubmVsX3BjbShjb2RlYywgcHZvaWNlLT5udW1iZXIpOwotCX0KIAlwdm9pY2UtPnVzZSA9IHB2b2ljZS0+cGNtID0gcHZvaWNlLT5zeW50aCA9IDA7CiAJcHZvaWNlLT5zdWJzdHJlYW0gPSBOVUxMOwogCXNwaW5fdW5sb2NrX2lycSgmY29kZWMtPnZvaWNlX2FsbG9jKTsKQEAgLTExMTIsOSArMTA1Miw5IEBACiB9CiAKIAotc3RhdGljIHZvaWQgc25kX2FsaV9jbGVhcl92b2ljZXMoc3RydWN0IHNuZF9hbGkgKiBjb2RlYywKLQkJCSAgdW5zaWduZWQgaW50IHZfbWluLAotCQkJICB1bnNpZ25lZCBpbnQgdl9tYXgpCitzdGF0aWMgdm9pZCBzbmRfYWxpX2NsZWFyX3ZvaWNlcyhzdHJ1Y3Qgc25kX2FsaSAqY29kZWMsCisJCQkJIHVuc2lnbmVkIGludCB2X21pbiwKKwkJCQkgdW5zaWduZWQgaW50IHZfbWF4KQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC0xMTI0LDcgKzEwNjQsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc25kX2FsaV93cml0ZV92b2ljZV9yZWdzKHN0cnVjdCBzbmRfYWxpICogY29kZWMsCitzdGF0aWMgdm9pZCBzbmRfYWxpX3dyaXRlX3ZvaWNlX3JlZ3Moc3RydWN0IHNuZF9hbGkgKmNvZGVjLAogCQkJIHVuc2lnbmVkIGludCBDaGFubmVsLAogCQkJIHVuc2lnbmVkIGludCBMQkEsCiAJCQkgdW5zaWduZWQgaW50IENTTywKQEAgLTExMzksNyArMTA3OSw3IEBACiB7CiAJdW5zaWduZWQgaW50IGN0bGNtZHNbNF07CiAJCi0Jb3V0YigodW5zaWduZWQgY2hhcikoQ2hhbm5lbCAmIDB4MDAxZiksQUxJX1JFRyhjb2RlYyxBTElfR0NfQ0lSKSk7CisJb3V0YigodW5zaWduZWQgY2hhcikoQ2hhbm5lbCAmIDB4MDAxZiksIEFMSV9SRUcoY29kZWMsIEFMSV9HQ19DSVIpKTsKIAogCWN0bGNtZHNbMF0gPSAgKENTTyA8PCAxNikgfCAoQUxQSEFfRk1TICYgMHgwMDAwZmZmZik7CiAJY3RsY21kc1sxXSA9ICBMQkE7CkBAIC0xMTUyLDEwICsxMDkyLDEwIEBACiAKIAlvdXRiKENoYW5uZWwsIEFMSV9SRUcoY29kZWMsIEFMSV9HQ19DSVIpKTsKIAotCW91dGwoY3RsY21kc1swXSwgQUxJX1JFRyhjb2RlYyxBTElfQ1NPX0FMUEhBX0ZNUykpOwotCW91dGwoY3RsY21kc1sxXSwgQUxJX1JFRyhjb2RlYyxBTElfTEJBKSk7Ci0Jb3V0bChjdGxjbWRzWzJdLCBBTElfUkVHKGNvZGVjLEFMSV9FU09fREVMVEEpKTsKLQlvdXRsKGN0bGNtZHNbM10sIEFMSV9SRUcoY29kZWMsQUxJX0dWU0VMX1BBTl9WT0NfQ1RSTF9FQykpOworCW91dGwoY3RsY21kc1swXSwgQUxJX1JFRyhjb2RlYywgQUxJX0NTT19BTFBIQV9GTVMpKTsKKwlvdXRsKGN0bGNtZHNbMV0sIEFMSV9SRUcoY29kZWMsIEFMSV9MQkEpKTsKKwlvdXRsKGN0bGNtZHNbMl0sIEFMSV9SRUcoY29kZWMsIEFMSV9FU09fREVMVEEpKTsKKwlvdXRsKGN0bGNtZHNbM10sIEFMSV9SRUcoY29kZWMsIEFMSV9HVlNFTF9QQU5fVk9DX0NUUkxfRUMpKTsKIAogCW91dGwoMHgzMDAwMDAwMCwgQUxJX1JFRyhjb2RlYywgQUxJX0VCVUYxKSk7CS8qIFN0aWxsIE1vZGUgKi8KIAlvdXRsKDB4MzAwMDAwMDAsIEFMSV9SRUcoY29kZWMsIEFMSV9FQlVGMikpOwkvKiBTdGlsbCBNb2RlICovCkBAIC0xMTY1LDggKzExMDUsMTAgQEAKIHsKIAl1bnNpZ25lZCBpbnQgZGVsdGE7CiAKLQlpZiAocmF0ZSA8IDQwMDApICByYXRlID0gNDAwMDsKLQlpZiAocmF0ZSA+IDQ4MDAwKSByYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA0MDAwKQorCQlyYXRlID0gNDAwMDsKKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CiAKIAlpZiAocmVjKSB7CiAJCWlmIChyYXRlID09IDQ0MTAwKQpAQCAtMTIwMSwxMSArMTE0MywxMSBAQAogCSAqLwogCUNUUkwgPSAweDAwMDAwMDAxOwogCWlmIChzbmRfcGNtX2Zvcm1hdF93aWR0aChydW50aW1lLT5mb3JtYXQpID09IDE2KQotCQlDVFJMIHw9IDB4MDAwMDAwMDg7CS8vIDE2LWJpdCBkYXRhCisJCUNUUkwgfD0gMHgwMDAwMDAwODsJLyogMTYtYml0IGRhdGEgKi8KIAlpZiAoIXNuZF9wY21fZm9ybWF0X3Vuc2lnbmVkKHJ1bnRpbWUtPmZvcm1hdCkpCi0JCUNUUkwgfD0gMHgwMDAwMDAwMjsJLy8gc2lnbmVkIGRhdGEKKwkJQ1RSTCB8PSAweDAwMDAwMDAyOwkvKiBzaWduZWQgZGF0YSAqLwogCWlmIChydW50aW1lLT5jaGFubmVscyA+IDEpCi0JCUNUUkwgfD0gMHgwMDAwMDAwNDsJLy8gc3RlcmVvIGRhdGEKKwkJQ1RSTCB8PSAweDAwMDAwMDA0OwkvKiBzdGVyZW8gZGF0YSAqLwogCXJldHVybiBDVFJMOwogfQogCkBAIC0xMjEzLDQ1ICsxMTU1LDM5IEBACiAgKiAgUENNIHBhcnQKICAqLwogCi1zdGF0aWMgaW50IHNuZF9hbGlfaW9jdGwoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCi17Ci0JcmV0dXJuIHNuZF9wY21fbGliX2lvY3RsKHN1YnN0cmVhbSwgY21kLCBhcmcpOwotfQotCiBzdGF0aWMgaW50IHNuZF9hbGlfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCSAgICAgICBpbnQgY21kKQogCQkJCSAgICAKIHsKIAlzdHJ1Y3Qgc25kX2FsaSAqY29kZWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKIAl1bnNpZ25lZCBpbnQgd2hhdCwgd2hhdGksIGNhcHR1cmVfZmxhZzsKLQlzdHJ1Y3Qgc25kX2FsaV92b2ljZSAqcHZvaWNlID0gTlVMTCwgKmV2b2ljZSA9IE5VTEw7CisJc3RydWN0IHNuZF9hbGlfdm9pY2UgKnB2b2ljZSwgKmV2b2ljZTsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCWludCBkb19zdGFydDsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKLQkJZG9fc3RhcnQgPSAxOyBicmVhazsKKwkJZG9fc3RhcnQgPSAxOworCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgotCQlkb19zdGFydCA9IDA7IGJyZWFrOworCQlkb19zdGFydCA9IDA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXdoYXQgPSB3aGF0aSA9IGNhcHR1cmVfZmxhZyA9IDA7Ci0Jc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgewotCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQlpZiAoKHN0cnVjdCBzbmRfYWxpICopIHNuZF9wY21fc3Vic3RyZWFtX2NoaXAocykgPT0gY29kZWMpIHsKIAkJCXB2b2ljZSA9IHMtPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAkJCWV2b2ljZSA9IHB2b2ljZS0+ZXh0cmE7CiAJCQl3aGF0IHw9IDEgPDwgKHB2b2ljZS0+bnVtYmVyICYgMHgxZik7Ci0JCQlpZiAoZXZvaWNlID09IE5VTEwpIHsKKwkJCWlmIChldm9pY2UgPT0gTlVMTCkKIAkJCQl3aGF0aSB8PSAxIDw8IChwdm9pY2UtPm51bWJlciAmIDB4MWYpOwotCQkJfSBlbHNlIHsKKwkJCWVsc2UgewogCQkJCXdoYXRpIHw9IDEgPDwgKGV2b2ljZS0+bnVtYmVyICYgMHgxZik7CiAJCQkJd2hhdCB8PSAxIDw8IChldm9pY2UtPm51bWJlciAmIDB4MWYpOwogCQkJfQpAQCAtMTI3MCw0OCArMTIwNiw1MSBAQAogCQl9CiAJfQogCXNwaW5fbG9jaygmY29kZWMtPnJlZ19sb2NrKTsKLQlpZiAoISBkb19zdGFydCkgeworCWlmICghZG9fc3RhcnQpCiAJCW91dGwod2hhdCwgQUxJX1JFRyhjb2RlYywgQUxJX1NUT1ApKTsKLQl9CiAJdmFsID0gaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9BSU5URU4pKTsKLQlpZiAoZG9fc3RhcnQpIHsKKwlpZiAoZG9fc3RhcnQpCiAJCXZhbCB8PSB3aGF0aTsKLQl9IGVsc2UgeworCWVsc2UKIAkJdmFsICY9IH53aGF0aTsKLQl9CiAJb3V0bCh2YWwsIEFMSV9SRUcoY29kZWMsIEFMSV9BSU5URU4pKTsKLQlpZiAoZG9fc3RhcnQpIHsKKwlpZiAoZG9fc3RhcnQpCiAJCW91dGwod2hhdCwgQUxJX1JFRyhjb2RlYywgQUxJX1NUQVJUKSk7Ci0JfQotCXNuZF9hbGlfcHJpbnRrKCJ0cmlnZ2VyOiB3aGF0PSV4aCB3aGF0aT0leGhcbiIsd2hhdCx3aGF0aSk7CisJc25kX2FsaV9wcmludGsoInRyaWdnZXI6IHdoYXQ9JXhoIHdoYXRpPSV4aFxuIiwgd2hhdCwgd2hhdGkpOwogCXNwaW5fdW5sb2NrKCZjb2RlYy0+cmVnX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc25kX2FsaV9wbGF5YmFja19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQorCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogewogCXN0cnVjdCBzbmRfYWxpICpjb2RlYyA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCXN0cnVjdCBzbmRfYWxpX3ZvaWNlICpwdm9pY2UgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNuZF9hbGlfdm9pY2UgKmV2b2ljZSA9IHB2b2ljZS0+ZXh0cmE7CiAJaW50IGVycjsKLQllcnIgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOwotCWlmIChlcnIgPCAwKSByZXR1cm4gZXJyOworCisJZXJyID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKKwkJCQkgICAgICAgcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAkKIAkvKiB2b2ljZSBtYW5hZ2VtZW50ICovCiAKLQlpZiAocGFyYW1zX2J1ZmZlcl9zaXplKGh3X3BhcmFtcykvMiAhPSBwYXJhbXNfcGVyaW9kX3NpemUoaHdfcGFyYW1zKSkgewotCQlpZiAoZXZvaWNlID09IE5VTEwpIHsKLQkJCWV2b2ljZSA9IHNuZF9hbGlfYWxsb2Nfdm9pY2UoY29kZWMsIFNORFJWX0FMSV9WT0lDRV9UWVBFX1BDTSwgMCwgLTEpOwotCQkJaWYgKGV2b2ljZSA9PSBOVUxMKQorCWlmIChwYXJhbXNfYnVmZmVyX3NpemUoaHdfcGFyYW1zKSAvIDIgIT0KKwkgICAgcGFyYW1zX3BlcmlvZF9zaXplKGh3X3BhcmFtcykpIHsKKwkJaWYgKCFldm9pY2UpIHsKKwkJCWV2b2ljZSA9IHNuZF9hbGlfYWxsb2Nfdm9pY2UoY29kZWMsCisJCQkJCQkgICAgIFNORFJWX0FMSV9WT0lDRV9UWVBFX1BDTSwKKwkJCQkJCSAgICAgMCwgLTEpOworCQkJaWYgKCFldm9pY2UpCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQlwdm9pY2UtPmV4dHJhID0gZXZvaWNlOwogCQkJZXZvaWNlLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CiAJCX0KIAl9IGVsc2UgewotCQlpZiAoZXZvaWNlICE9IE5VTEwpIHsKKwkJaWYgKCFldm9pY2UpIHsKIAkJCXNuZF9hbGlfZnJlZV92b2ljZShjb2RlYywgZXZvaWNlKTsKIAkJCXB2b2ljZS0+ZXh0cmEgPSBldm9pY2UgPSBOVUxMOwogCQl9CkBAIC0xMzI4LDcgKzEyNjcsNyBAQAogCXN0cnVjdCBzbmRfYWxpX3ZvaWNlICpldm9pY2UgPSBwdm9pY2UgPyBwdm9pY2UtPmV4dHJhIDogTlVMTDsKIAogCXNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKLQlpZiAoZXZvaWNlICE9IE5VTEwpIHsKKwlpZiAoIWV2b2ljZSkgewogCQlzbmRfYWxpX2ZyZWVfdm9pY2UoY29kZWMsIGV2b2ljZSk7CiAJCXB2b2ljZS0+ZXh0cmEgPSBOVUxMOwogCX0KQEAgLTEzMzYsOSArMTI3NSwxMCBAQAogfQogCiBzdGF0aWMgaW50IHNuZF9hbGlfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKKwkJCSAgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCiB7Ci0JcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CisJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCisJCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CiB9CiAKIHN0YXRpYyBpbnQgc25kX2FsaV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpAQCAtMTM2OSwxMiArMTMwOSwxMyBAQAogCS8qIHNldCBEZWx0YSAocmF0ZSkgdmFsdWUgKi8KIAlEZWx0YSA9IHNuZF9hbGlfY29udmVydF9yYXRlKHJ1bnRpbWUtPnJhdGUsIDApOwogCi0JaWYgKChwdm9pY2UtPm51bWJlciA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkgfHwgCi0JICAgIChwdm9pY2UtPm51bWJlciA9PSBBTElfUENNX0lOX0NIQU5ORUwpKQorCWlmIChwdm9pY2UtPm51bWJlciA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCB8fCAKKwkgICAgcHZvaWNlLT5udW1iZXIgPT0gQUxJX1BDTV9JTl9DSEFOTkVMKQogCQlzbmRfYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGNvZGVjLCBwdm9pY2UtPm51bWJlcik7CiAJZWxzZSBpZiAoY29kZWMtPnNwZGlmX3N1cHBvcnQgJiYKLQkJIChpbmwoQUxJX1JFRyhjb2RlYywgQUxJX0dMT0JBTF9DT05UUk9MKSkgJiBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkKLQkJICYmIChwdm9pY2UtPm51bWJlciA9PSBBTElfU1BESUZfT1VUX0NIQU5ORUwpKSB7CisJCSAoaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYKKwkJICBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkKKwkJICYmIHB2b2ljZS0+bnVtYmVyID09IEFMSV9TUERJRl9PVVRfQ0hBTk5FTCkgewogCQlzbmRfYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShjb2RlYywgcnVudGltZS0+cmF0ZSk7CiAJCURlbHRhID0gMHgxMDAwOwogCX0KQEAgLTEzODgsNyArMTMyOSw4IEBACiAJLyogc2V0IHRhcmdldCBFU08gZm9yIGNoYW5uZWwgKi8KIAlwdm9pY2UtPmVzbyA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOyAKIAotCXNuZF9hbGlfcHJpbnRrKCJwbGF5YmFja19wcmVwYXJlOiBlc289JXhoIGNvdW50PSV4aFxuIixwdm9pY2UtPmVzbyxwdm9pY2UtPmNvdW50KTsKKwlzbmRfYWxpX3ByaW50aygicGxheWJhY2tfcHJlcGFyZTogZXNvPSV4aCBjb3VudD0leGhcbiIsCisJCSAgICAgICBwdm9pY2UtPmVzbywgcHZvaWNlLT5jb3VudCk7CiAKIAkvKiBzZXQgRVNPIHRvIGNhcHR1cmUgZmlyc3QgTUlETFAgaW50ZXJydXB0ICovCiAJRVNPID0gcHZvaWNlLT5lc28gLTE7CkBAIC0xMzk5LDM1ICsxMzQxLDM3IEBACiAJUEFOID0gMDsKIAlWT0wgPSAwOwogCUVDID0gMDsKLQlzbmRfYWxpX3ByaW50aygicGxheWJhY2tfcHJlcGFyZTpcbiAgICBjaD0lZCwgUmF0ZT0lZCBEZWx0YT0leGgsR1ZTRUw9JXhoLFBBTj0leGgsQ1RSTD0leGhcbiIscHZvaWNlLT5udW1iZXIscnVudGltZS0+cmF0ZSxEZWx0YSxHVlNFTCxQQU4sQ1RSTCk7Ci0Jc25kX2FsaV93cml0ZV92b2ljZV9yZWdzKCAgICBjb2RlYywKLQkJCQkgICAgIHB2b2ljZS0+bnVtYmVyLAotCQkJCSAgICAgTEJBLAotCQkJCSAgICAgMCwJLyogY3NvICovCi0JCQkJICAgICBFU08sCi0JCQkJICAgICBEZWx0YSwKLQkJCQkgICAgIDAsCS8qIGFscGhhICovCi0JCQkJICAgICBHVlNFTCwKLQkJCQkgICAgIFBBTiwKLQkJCQkgICAgIFZPTCwKLQkJCQkgICAgIENUUkwsCi0JCQkJICAgICBFQyk7Ci0JaWYgKGV2b2ljZSAhPSBOVUxMKSB7CisJc25kX2FsaV9wcmludGsoInBsYXliYWNrX3ByZXBhcmU6XG4iKTsKKwlzbmRfYWxpX3ByaW50aygiY2g9JWQsIFJhdGU9JWQgRGVsdGE9JXhoLEdWU0VMPSV4aCxQQU49JXhoLENUUkw9JXhoXG4iLAorCQkgICAgICAgcHZvaWNlLT5udW1iZXIscnVudGltZS0+cmF0ZSxEZWx0YSxHVlNFTCxQQU4sQ1RSTCk7CisJc25kX2FsaV93cml0ZV92b2ljZV9yZWdzKGNvZGVjLAorCQkJCSBwdm9pY2UtPm51bWJlciwKKwkJCQkgTEJBLAorCQkJCSAwLAkvKiBjc28gKi8KKwkJCQkgRVNPLAorCQkJCSBEZWx0YSwKKwkJCQkgMCwJLyogYWxwaGEgKi8KKwkJCQkgR1ZTRUwsCisJCQkJIFBBTiwKKwkJCQkgVk9MLAorCQkJCSBDVFJMLAorCQkJCSBFQyk7CisJaWYgKCFldm9pY2UpIHsKIAkJZXZvaWNlLT5jb3VudCA9IHB2b2ljZS0+Y291bnQ7CiAJCWV2b2ljZS0+ZXNvID0gcHZvaWNlLT5jb3VudCA8PCAxOwogCQlFU08gPSBldm9pY2UtPmVzbyAtIDE7CiAJCXNuZF9hbGlfd3JpdGVfdm9pY2VfcmVncyhjb2RlYywKLQkJCQkgICAgIGV2b2ljZS0+bnVtYmVyLAotCQkJCSAgICAgTEJBLAotCQkJCSAgICAgMCwJLyogY3NvICovCi0JCQkJICAgICBFU08sCi0JCQkJICAgICBEZWx0YSwKLQkJCQkgICAgIDAsCS8qIGFscGhhICovCi0JCQkJICAgICBHVlNFTCwKLQkJCQkgICAgICh1bnNpZ25lZCBpbnQpMHg3ZiwKLQkJCQkgICAgICh1bnNpZ25lZCBpbnQpMHgzZmYsCi0JCQkJICAgICBDVFJMLAotCQkJCSAgICAgRUMpOworCQkJCQkgZXZvaWNlLT5udW1iZXIsCisJCQkJCSBMQkEsCisJCQkJCSAwLAkvKiBjc28gKi8KKwkJCQkJIEVTTywKKwkJCQkJIERlbHRhLAorCQkJCQkgMCwJLyogYWxwaGEgKi8KKwkJCQkJIEdWU0VMLAorCQkJCQkgMHg3ZiwKKwkJCQkJIDB4M2ZmLAorCQkJCQkgQ1RSTCwKKwkJCQkJIEVDKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZjb2RlYy0+cmVnX2xvY2spOwogCXJldHVybiAwOwpAQCAtMTQ1OSw3ICsxNDAzLDcgQEAKIAkJIHB2b2ljZS0+bnVtYmVyID09IEFMSV9NT0RFTV9PVVRfQ0hBTk5FTCkgPyAKIAkJMHgxMDAwIDogc25kX2FsaV9jb252ZXJ0X3JhdGUocnVudGltZS0+cmF0ZSwgcHZvaWNlLT5tb2RlKTsKIAotCS8vIFByZXBhcmUgY2FwdHVyZSBpbnRyIGNoYW5uZWwKKwkvKiBQcmVwYXJlIGNhcHR1cmUgaW50ciBjaGFubmVsICovCiAJaWYgKHB2b2ljZS0+bnVtYmVyID09IEFMSV9TUERJRl9JTl9DSEFOTkVMKSB7CiAKIAkJdW5zaWduZWQgaW50IHJhdGU7CkBAIC0xNDcwLDcgKzE0MTQsOCBAQAogCiAJCXJhdGUgPSBzbmRfYWxpX2dldF9zcGRpZl9pbl9yYXRlKGNvZGVjKTsKIAkJaWYgKHJhdGUgPT0gMCkgewotCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImFsaV9jYXB0dXJlX3ByZWFwcmU6IHNwZGlmIHJhdGUgZGV0ZWN0IGVyciFcbiIpOworCQkJc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgImFsaV9jYXB0dXJlX3ByZWFwcmU6ICIKKwkJCQkgICAic3BkaWYgcmF0ZSBkZXRlY3QgZXJyIVxuIik7CiAJCQlyYXRlID0gNDgwMDA7CiAJCX0KIAkJc3Bpbl9sb2NrX2lycSgmY29kZWMtPnJlZ19sb2NrKTsKQEAgLTE0ODEsMTkgKzE0MjYsMTkgQEAKIAkJfQogCiAJCWlmIChyYXRlICE9IDQ4MDAwKQotCQkJRGVsdGEgPSAoKHJhdGUgPDwgMTIpL3J1bnRpbWUtPnJhdGUpJjB4MDBmZmZmOworCQkJRGVsdGEgPSAoKHJhdGUgPDwgMTIpIC8gcnVudGltZS0+cmF0ZSkgJiAweDAwZmZmZjsKIAl9CiAKLQkvLyBzZXQgdGFyZ2V0IEVTTyBmb3IgY2hhbm5lbCAKKwkvKiBzZXQgdGFyZ2V0IEVTTyBmb3IgY2hhbm5lbCAgKi8KIAlwdm9pY2UtPmVzbyA9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOyAKIAotCS8vIHNldCBpbnRlcnJ1cHQgY291bnQgc2l6ZSAKKwkvKiBzZXQgaW50ZXJydXB0IGNvdW50IHNpemUgICovCiAJcHZvaWNlLT5jb3VudCA9IHJ1bnRpbWUtPnBlcmlvZF9zaXplOwogCi0JLy8gc2V0IExvb3AgQmFjayBBZGRyZXNzIAorCS8qIHNldCBMb29wIEJhY2sgQWRkcmVzcyAgKi8KIAlMQkEgPSBydW50aW1lLT5kbWFfYWRkcjsKIAotCS8vIHNldCBFU08gdG8gY2FwdHVyZSBmaXJzdCBNSURMUCBpbnRlcnJ1cHQgCisJLyogc2V0IEVTTyB0byBjYXB0dXJlIGZpcnN0IE1JRExQIGludGVycnVwdCAgKi8KIAlFU08gPSBwdm9pY2UtPmVzbyAtIDE7CiAJQ1RSTCA9IHNuZF9hbGlfY29udHJvbF9tb2RlKHN1YnN0cmVhbSk7CiAJR1ZTRUwgPSAwOwpAQCAtMTUxNCwxNCArMTQ1OSwxNCBAQAogCQkJCSAgICAgQ1RSTCwKIAkJCQkgICAgIEVDKTsKIAotCiAJc3Bpbl91bmxvY2tfaXJxKCZjb2RlYy0+cmVnX2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CiAKIAotc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9hbGlfcGxheWJhY2tfcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdAorc25kX2FsaV9wbGF5YmFja19wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfYWxpICpjb2RlYyA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwpAQCAtMTU2MywxNCArMTUwOCwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc25kX2FsaV9wbGF5YmFjayA9CiB7Ci0JLmluZm8gPQkJCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUKSwKLQkuZm9ybWF0cyA9CQkoU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKLQkJCQkgU05EUlZfUENNX0ZNVEJJVF9TOCB8IFNORFJWX1BDTV9GTVRCSVRfVTE2X0xFKSwKLQkucmF0ZXMgPQkJU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUyB8IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJLmluZm8gPQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8CisJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJLmZvcm1hdHMgPQkoU05EUlZfUENNX0ZNVEJJVF9VOCB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCSBTTkRSVl9QQ01fRk1UQklUX1M4IHwgU05EUlZfUENNX0ZNVEJJVF9VMTZfTEUpLAorCS5yYXRlcyA9CVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAogCS5yYXRlX21pbiA9CQk0MDAwLAogCS5yYXRlX21heCA9CQk0ODAwMCwKIAkuY2hhbm5lbHNfbWluID0JCTEsCkBAIC0xNTg5LDE0ICsxNTM0LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfYWxpX2NhcHR1cmUgPQogewotCS5pbmZvID0JCQkoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKLQkJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJCQkgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKLQkJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCi0JLmZvcm1hdHMgPQkJKFNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8Ci0JCQkJIFNORFJWX1BDTV9GTVRCSVRfUzggfCBTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSksCi0JLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMgfCBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCS5pbmZvID0JCShTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCSBTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCSBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAorCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5mb3JtYXRzID0JKFNORFJWX1BDTV9GTVRCSVRfVTggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8CisJCQkgU05EUlZfUENNX0ZNVEJJVF9TOCB8IFNORFJWX1BDTV9GTVRCSVRfVTE2X0xFKSwKKwkucmF0ZXMgPQlTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTIHwgU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKIAkucmF0ZV9taW4gPQkJNDAwMCwKIAkucmF0ZV9tYXggPQkJNDgwMDAsCiAJLmNoYW5uZWxzX21pbiA9CQkxLApAQCAtMTYyMCwxNSArMTU2NSwxNiBAQAogCX0KIH0KIAotc3RhdGljIGludCBzbmRfYWxpX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCByZWMsIGludCBjaGFubmVsLAotCQlzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSAqcGh3KQorc3RhdGljIGludCBzbmRfYWxpX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCByZWMsCisJCQlpbnQgY2hhbm5lbCwgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgKnBodykKIHsKIAlzdHJ1Y3Qgc25kX2FsaSAqY29kZWMgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3Qgc25kX2FsaV92b2ljZSAqcHZvaWNlOwogCi0JcHZvaWNlID0gc25kX2FsaV9hbGxvY192b2ljZShjb2RlYywgU05EUlZfQUxJX1ZPSUNFX1RZUEVfUENNLCByZWMsIGNoYW5uZWwpOwotCWlmIChwdm9pY2UgPT0gTlVMTCkKKwlwdm9pY2UgPSBzbmRfYWxpX2FsbG9jX3ZvaWNlKGNvZGVjLCBTTkRSVl9BTElfVk9JQ0VfVFlQRV9QQ00sIHJlYywKKwkJCQkgICAgIGNoYW5uZWwpOworCWlmICghcHZvaWNlKQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCXB2b2ljZS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwpAQCAtMTYzNyw3ICsxNTgzLDggQEAKIAogCXJ1bnRpbWUtPmh3ID0gKnBodzsKIAlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7Ci0Jc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX1NJWkUsIDAsIDY0KjEwMjQpOworCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9TSVpFLAorCQkJCSAgICAgMCwgNjQqMTAyNCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NjksNyArMTYxNiw3IEBACiBzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hbGlfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9hbGlfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYWxpX3BsYXliYWNrX2Nsb3NlLAotCS5pb2N0bCA9CXNuZF9hbGlfaW9jdGwsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCiAJLmh3X3BhcmFtcyA9CXNuZF9hbGlfcGxheWJhY2tfaHdfcGFyYW1zLAogCS5od19mcmVlID0Jc25kX2FsaV9wbGF5YmFja19od19mcmVlLAogCS5wcmVwYXJlID0Jc25kX2FsaV9wbGF5YmFja19wcmVwYXJlLApAQCAtMTY4MCw3ICsxNjI3LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FsaV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYWxpX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYWxpX2Nsb3NlLAotCS5pb2N0bCA9CXNuZF9hbGlfaW9jdGwsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCiAJLmh3X3BhcmFtcyA9CXNuZF9hbGlfaHdfcGFyYW1zLAogCS5od19mcmVlID0Jc25kX2FsaV9od19mcmVlLAogCS5wcmVwYXJlID0Jc25kX2FsaV9wcmVwYXJlLApAQCAtMTY5NywyMCArMTY0NCwyMiBAQAogewogCXN0cnVjdCBzbmRfYWxpICpjaGlwID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXVuc2lnbmVkIGludCBtb2RlbV9udW0gPSBjaGlwLT5udW1fb2ZfY29kZWNzIC0gMTsKLQlzbmRfYWM5N193cml0ZShjaGlwLT5hYzk3W21vZGVtX251bV0sIEFDOTdfTElORTFfUkFURSwgcGFyYW1zX3JhdGUoaHdfcGFyYW1zKSk7CisJc25kX2FjOTdfd3JpdGUoY2hpcC0+YWM5N1ttb2RlbV9udW1dLCBBQzk3X0xJTkUxX1JBVEUsCisJCSAgICAgICBwYXJhbXNfcmF0ZShod19wYXJhbXMpKTsKIAlzbmRfYWM5N193cml0ZShjaGlwLT5hYzk3W21vZGVtX251bV0sIEFDOTdfTElORTFfTEVWRUwsIDApOwogCXJldHVybiBzbmRfYWxpX2h3X3BhcmFtcyhzdWJzdHJlYW0sIGh3X3BhcmFtcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBzbmRfYWxpX21vZGVtID0KIHsKLQkuaW5mbyA9CQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKLQkJCQkgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8Ci0JCQkJIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAotCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV9LTk9UfFNORFJWX1BDTV9SQVRFXzgwMDB8U05EUlZfUENNX1JBVEVfMTYwMDAsCisJLmluZm8gPQkJKFNORFJWX1BDTV9JTkZPX01NQVAgfCBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAorCQkJIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8CisJCQkgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJLmZvcm1hdHMgPQlTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkucmF0ZXMgPQkoU05EUlZfUENNX1JBVEVfS05PVCB8IFNORFJWX1BDTV9SQVRFXzgwMDAgfAorCQkJIFNORFJWX1BDTV9SQVRFXzE2MDAwKSwKIAkucmF0ZV9taW4gPQkJODAwMCwKIAkucmF0ZV9tYXggPQkJMTYwMDAsCiAJLmNoYW5uZWxzX21pbiA9CQkxLApAQCAtMTcyMywxNSArMTY3MiwxNyBAQAogCS5maWZvX3NpemUgPQkJMCwKIH07CiAKLXN0YXRpYyBpbnQgc25kX2FsaV9tb2RlbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgcmVjLCBpbnQgY2hhbm5lbCkKK3N0YXRpYyBpbnQgc25kX2FsaV9tb2RlbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgcmVjLAorCQkJICAgICAgaW50IGNoYW5uZWwpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGludCByYXRlcyBbXSA9IHs4MDAwLDk2MDAsMTIwMDAsMTYwMDB9OworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNbXSA9IHs4MDAwLCA5NjAwLCAxMjAwMCwgMTYwMDB9OwogCXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgaHdfY29uc3RyYWludF9yYXRlcyA9IHsKIAkJLmNvdW50ID0gQVJSQVlfU0laRShyYXRlcyksCiAJCS5saXN0ID0gcmF0ZXMsCiAJCS5tYXNrID0gMCwKIAl9OwogCWludCBlcnIgPSBzbmRfYWxpX29wZW4oc3Vic3RyZWFtLCByZWMsIGNoYW5uZWwsICZzbmRfYWxpX21vZGVtKTsKKwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHN1YnN0cmVhbS0+cnVudGltZSwgMCwKQEAgLTE3ODgsNyArMTczOSw4IEBACiB9CiAKIAotc3RhdGljIGludCBfX2RldmluaXQgc25kX2FsaV9wY20oc3RydWN0IHNuZF9hbGkgKiBjb2RlYywgaW50IGRldmljZSwgc3RydWN0IGFsaV9wY21fZGVzY3JpcHRpb24gKmRlc2MpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYWxpX3BjbShzdHJ1Y3Qgc25kX2FsaSAqIGNvZGVjLCBpbnQgZGV2aWNlLAorCQkJCSBzdHJ1Y3QgYWxpX3BjbV9kZXNjcmlwdGlvbiAqZGVzYykKIHsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCWludCBlcnI7CkBAIC0xODAyLDEyICsxNzU0LDE1IEBACiAJcGNtLT5wcml2YXRlX2RhdGEgPSBjb2RlYzsKIAlwY20tPnByaXZhdGVfZnJlZSA9IHNuZF9hbGlfcGNtX2ZyZWU7CiAJaWYgKGRlc2MtPnBsYXliYWNrX29wcykKLQkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgZGVzYy0+cGxheWJhY2tfb3BzKTsKKwkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywKKwkJCQlkZXNjLT5wbGF5YmFja19vcHMpOwogCWlmIChkZXNjLT5jYXB0dXJlX29wcykKLQkJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCBkZXNjLT5jYXB0dXJlX29wcyk7CisJCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKKwkJCQlkZXNjLT5jYXB0dXJlX29wcyk7CiAKIAlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAotCQkJCQkgICAgICBzbmRfZG1hX3BjaV9kYXRhKGNvZGVjLT5wY2kpLCA2NCoxMDI0LCAxMjgqMTAyNCk7CisJCQkJCSAgICAgIHNuZF9kbWFfcGNpX2RhdGEoY29kZWMtPnBjaSksCisJCQkJCSAgICAgIDY0KjEwMjQsIDEyOCoxMDI0KTsKIAogCXBjbS0+aW5mb19mbGFncyA9IDA7CiAJcGNtLT5kZXZfY2xhc3MgPSBkZXNjLT5jbGFzczsKQEAgLTE4MTgsMTYgKzE3NzMsMjkgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBhbGlfcGNtX2Rlc2NyaXB0aW9uIGFsaV9wY21zW10gPSB7Ci0JeyAiQUxJIDU0NTEiLCBBTElfQ0hBTk5FTFMsIDEsICZzbmRfYWxpX3BsYXliYWNrX29wcywgJnNuZF9hbGlfY2FwdHVyZV9vcHMgfSwKLQl7ICJBTEkgNTQ1MSBtb2RlbSIsIDEsIDEsICZzbmRfYWxpX21vZGVtX3BsYXliYWNrX29wcywgJnNuZF9hbGlfbW9kZW1fY2FwdHVyZV9vcHMsIFNORFJWX1BDTV9DTEFTU19NT0RFTSB9CisJeyAubmFtZSA9ICJBTEkgNTQ1MSIsCisJICAucGxheWJhY2tfbnVtID0gQUxJX0NIQU5ORUxTLAorCSAgLmNhcHR1cmVfbnVtID0gMSwKKwkgIC5wbGF5YmFja19vcHMgPSAmc25kX2FsaV9wbGF5YmFja19vcHMsCisJICAuY2FwdHVyZV9vcHMgPSAmc25kX2FsaV9jYXB0dXJlX29wcworCX0sCisJeyAubmFtZSA9ICJBTEkgNTQ1MSBtb2RlbSIsCisJICAucGxheWJhY2tfbnVtID0gMSwKKwkgIC5jYXB0dXJlX251bSA9IDEsCisJICAucGxheWJhY2tfb3BzID0gJnNuZF9hbGlfbW9kZW1fcGxheWJhY2tfb3BzLAorCSAgLmNhcHR1cmVfb3BzID0gJnNuZF9hbGlfbW9kZW1fY2FwdHVyZV9vcHMsCisJICAuY2xhc3MgPSBTTkRSVl9QQ01fQ0xBU1NfTU9ERU0KKwl9CiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYWxpX2J1aWxkX3BjbXMoc3RydWN0IHNuZF9hbGkgKmNvZGVjKQogewogCWludCBpLCBlcnI7Ci0JZm9yKGkgPSAwIDsgaSA8IGNvZGVjLT5udW1fb2ZfY29kZWNzICYmIGkgPCBBUlJBWV9TSVpFKGFsaV9wY21zKSA7IGkrKykKLQkJaWYoKGVyciA9IHNuZF9hbGlfcGNtKGNvZGVjLCBpLCAmYWxpX3BjbXNbaV0pKSA8IDApCisJZm9yIChpID0gMDsgaSA8IGNvZGVjLT5udW1fb2ZfY29kZWNzICYmIGkgPCBBUlJBWV9TSVpFKGFsaV9wY21zKTsgaSsrKSB7CisJCWVyciA9IHNuZF9hbGlfcGNtKGNvZGVjLCBpLCAmYWxpX3BjbXNbaV0pOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xODM3LDcgKzE4MDUsOCBAQAogLmluZm8gPSBzbmRfYWxpNTQ1MV9zcGRpZl9pbmZvLCAuZ2V0ID0gc25kX2FsaTU0NTFfc3BkaWZfZ2V0LCBcCiAucHV0ID0gc25kX2FsaTU0NTFfc3BkaWZfcHV0LCAucHJpdmF0ZV92YWx1ZSA9IHZhbHVlfQogCi1zdGF0aWMgaW50IHNuZF9hbGk1NDUxX3NwZGlmX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCitzdGF0aWMgaW50IHNuZF9hbGk1NDUxX3NwZGlmX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogICAgICAgICB1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKICAgICAgICAgdWluZm8tPmNvdW50ID0gMTsKQEAgLTE4NDYsNyArMTgxNSw4IEBACiAgICAgICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNuZF9hbGk1NDUxX3NwZGlmX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHNuZF9hbGk1NDUxX3NwZGlmX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9hbGkgKmNvZGVjID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBpbnQgZW5hYmxlOwpAQCAtMTg1NCwxMiArMTgyNCwxMyBAQAogCWVuYWJsZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID8gMSA6IDA7CiAKIAlzcGluX2xvY2tfaXJxKCZjb2RlYy0+cmVnX2xvY2spOwotCXN3aXRjaChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgeworCXN3aXRjaCAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpIHsKIAljYXNlIDA6CiAJCWVuYWJsZSA9IChjb2RlYy0+c3BkaWZfbWFzayAmIDB4MDIpID8gMSA6IDA7CiAJCWJyZWFrOwogCWNhc2UgMToKLQkJZW5hYmxlID0gKChjb2RlYy0+c3BkaWZfbWFzayAmIDB4MDIpICYmIChjb2RlYy0+c3BkaWZfbWFzayAmIDB4MDQpKSA/IDEgOiAwOworCQllbmFibGUgPSAoKGNvZGVjLT5zcGRpZl9tYXNrICYgMHgwMikgJiYKKwkJCSAgKGNvZGVjLT5zcGRpZl9tYXNrICYgMHgwNCkpID8gMSA6IDA7CiAJCWJyZWFrOwogCWNhc2UgMjoKIAkJZW5hYmxlID0gKGNvZGVjLT5zcGRpZl9tYXNrICYgMHgwMSkgPyAxIDogMDsKQEAgLTE4NzIsNyArMTg0Myw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2FsaTU0NTFfc3BkaWZfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgc25kX2FsaTU0NTFfc3BkaWZfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3Qgc25kX2FsaSAqY29kZWMgPSBrY29udHJvbC0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGludCBjaGFuZ2UgPSAwLCBlbmFibGUgPSAwOwpAQCAtMTkzOSwxOCArMTkxMSw2IEBACiAJQUxJNTQ1MV9TUERJRihTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsQ0FQVFVSRSxTV0lUQ0gpLCAwLCAyKQogfTsKIAotc3RhdGljIHZvaWQgc25kX2FsaV9taXhlcl9mcmVlX2FjOTdfYnVzKHN0cnVjdCBzbmRfYWM5N19idXMgKmJ1cykKLXsKLQlzdHJ1Y3Qgc25kX2FsaSAqY29kZWMgPSBidXMtPnByaXZhdGVfZGF0YTsKLQljb2RlYy0+YWM5N19idXMgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBzbmRfYWxpX21peGVyX2ZyZWVfYWM5NyhzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCi17Ci0Jc3RydWN0IHNuZF9hbGkgKmNvZGVjID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOwotCWNvZGVjLT5hYzk3W2FjOTctPm51bV0gPSBOVUxMOwotfQotCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfYWxpX21peGVyKHN0cnVjdCBzbmRfYWxpICogY29kZWMpCiB7CiAJc3RydWN0IHNuZF9hYzk3X3RlbXBsYXRlIGFjOTc7CkBAIC0xOTYxLDE5ICsxOTIxLDIwIEBACiAJCS5yZWFkID0gc25kX2FsaV9jb2RlY19yZWFkLAogCX07CiAKLQlpZiAoKGVyciA9IHNuZF9hYzk3X2J1cyhjb2RlYy0+Y2FyZCwgMCwgJm9wcywgY29kZWMsICZjb2RlYy0+YWM5N19idXMpKSA8IDApCisJZXJyID0gc25kX2FjOTdfYnVzKGNvZGVjLT5jYXJkLCAwLCAmb3BzLCBjb2RlYywgJmNvZGVjLT5hYzk3X2J1cyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JY29kZWMtPmFjOTdfYnVzLT5wcml2YXRlX2ZyZWUgPSBzbmRfYWxpX21peGVyX2ZyZWVfYWM5N19idXM7CiAKIAltZW1zZXQoJmFjOTcsIDAsIHNpemVvZihhYzk3KSk7CiAJYWM5Ny5wcml2YXRlX2RhdGEgPSBjb2RlYzsKLQlhYzk3LnByaXZhdGVfZnJlZSA9IHNuZF9hbGlfbWl4ZXJfZnJlZV9hYzk3OwogCi0JZm9yICggaSA9IDAgOyBpIDwgY29kZWMtPm51bV9vZl9jb2RlY3MgOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPm51bV9vZl9jb2RlY3M7IGkrKykgewogCQlhYzk3Lm51bSA9IGk7Ci0JCWlmICgoZXJyID0gc25kX2FjOTdfbWl4ZXIoY29kZWMtPmFjOTdfYnVzLCAmYWM5NywgJmNvZGVjLT5hYzk3W2ldKSkgPCAwKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGkgbWl4ZXIgJWQgY3JlYXRpbmcgZXJyb3IuXG4iLCBpKTsKLQkJCWlmKGkgPT0gMCkKKwkJZXJyID0gc25kX2FjOTdfbWl4ZXIoY29kZWMtPmFjOTdfYnVzLCAmYWM5NywgJmNvZGVjLT5hYzk3W2ldKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQkgICAiYWxpIG1peGVyICVkIGNyZWF0aW5nIGVycm9yLlxuIiwgaSk7CisJCQlpZiAoaSA9PSAwKQogCQkJCXJldHVybiBlcnI7CiAJCQljb2RlYy0+bnVtX29mX2NvZGVjcyA9IDE7CiAJCQlicmVhazsKQEAgLTE5ODEsOSArMTk0MiwxMSBAQAogCX0KIAogCWlmIChjb2RlYy0+c3BkaWZfc3VwcG9ydCkgewotCQlmb3IoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShzbmRfYWxpNTQ1MV9taXhlcl9zcGRpZik7IGlkeCsrKSB7Ci0JCQllcnI9c25kX2N0bF9hZGQoY29kZWMtPmNhcmQsIHNuZF9jdGxfbmV3MSgmc25kX2FsaTU0NTFfbWl4ZXJfc3BkaWZbaWR4XSwgY29kZWMpKTsKLQkJCWlmIChlcnIgPCAwKSByZXR1cm4gZXJyOworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoc25kX2FsaTU0NTFfbWl4ZXJfc3BkaWYpOyBpZHgrKykgeworCQkJZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsCisJCQkJCSAgc25kX2N0bF9uZXcxKCZzbmRfYWxpNTQ1MV9taXhlcl9zcGRpZltpZHhdLCBjb2RlYykpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KIAlyZXR1cm4gMDsKQEAgLTE5OTgsMTEgKzE5NjEsMTEgQEAKIAlpbnQgaSwgajsKIAogCWltID0gY2hpcC0+aW1hZ2U7Ci0JaWYgKCEgaW0pCisJaWYgKCFpbSkKIAkJcmV0dXJuIDA7CiAKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7Ci0JZm9yKGkgPSAwIDsgaSA8IGNoaXAtPm51bV9vZl9jb2RlY3MgOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX29mX2NvZGVjczsgaSsrKSB7CiAJCXNuZF9wY21fc3VzcGVuZF9hbGwoY2hpcC0+cGNtW2ldKTsKIAkJc25kX2FjOTdfc3VzcGVuZChjaGlwLT5hYzk3W2ldKTsKIAl9CkBAIC0yMDEwLDEwICsxOTczLDEwIEBACiAJc3Bpbl9sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCQogCWltLT5yZWdzW0FMSV9NSVNDSU5UID4+IDJdID0gaW5sKEFMSV9SRUcoY2hpcCwgQUxJX01JU0NJTlQpKTsKLQkvLyBpbS0+cmVnc1tBTElfU1RBUlQgPj4gMl0gPSBpbmwoQUxJX1JFRyhjaGlwLCBBTElfU1RBUlQpKTsKKwkvKiBpbS0+cmVnc1tBTElfU1RBUlQgPj4gMl0gPSBpbmwoQUxJX1JFRyhjaGlwLCBBTElfU1RBUlQpKTsgKi8KIAlpbS0+cmVnc1tBTElfU1RPUCA+PiAyXSA9IGlubChBTElfUkVHKGNoaXAsIEFMSV9TVE9QKSk7CiAJCi0JLy8gZGlzYWJsZSBhbGwgSVJRIGJpdHMKKwkvKiBkaXNhYmxlIGFsbCBJUlEgYml0cyAqLwogCW91dGwoMCwgQUxJX1JFRyhjaGlwLCBBTElfTUlTQ0lOVCkpOwogCQogCWZvciAoaSA9IDA7IGkgPCBBTElfR0xPQkFMX1JFR1M7IGkrKykgewkKQEAgLTIwMjgsNyArMTk5MSw3IEBACiAJCQlpbS0+Y2hhbm5lbF9yZWdzW2ldW2pdID0gaW5sKEFMSV9SRUcoY2hpcCwgaio0ICsgMHhlMCkpOwogCX0KIAotCS8vIHN0b3AgYWxsIEhXIGNoYW5uZWwKKwkvKiBzdG9wIGFsbCBIVyBjaGFubmVsICovCiAJb3V0bCgweGZmZmZmZmZmLCBBTElfUkVHKGNoaXAsIEFMSV9TVE9QKSk7CiAKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPnJlZ19sb2NrKTsKQEAgLTIwNDcsNyArMjAxMCw3IEBACiAJaW50IGksIGo7CiAKIAlpbSA9IGNoaXAtPmltYWdlOwotCWlmICghIGltKQorCWlmICghaW0pCiAJCXJldHVybiAwOwogCiAJcGNpX3NldF9wb3dlcl9zdGF0ZShwY2ksIFBDSV9EMCk7CkBAIC0yMDY5LDE5ICsyMDMyLDIwIEBACiAJfQogCQogCWZvciAoaSA9IDA7IGkgPCBBTElfR0xPQkFMX1JFR1M7IGkrKykgewkKLQkJaWYgKChpKjQgPT0gQUxJX01JU0NJTlQpIHx8IChpKjQgPT0gQUxJX1NUT1ApIHx8IChpKjQgPT0gQUxJX1NUQVJUKSkKKwkJaWYgKChpKjQgPT0gQUxJX01JU0NJTlQpIHx8IChpKjQgPT0gQUxJX1NUT1ApIHx8CisJCSAgICAoaSo0ID09IEFMSV9TVEFSVCkpCiAJCQljb250aW51ZTsKIAkJb3V0bChpbS0+cmVnc1tpXSwgQUxJX1JFRyhjaGlwLCBpKjQpKTsKIAl9CiAJCi0JLy8gc3RhcnQgSFcgY2hhbm5lbAorCS8qIHN0YXJ0IEhXIGNoYW5uZWwgKi8KIAlvdXRsKGltLT5yZWdzW0FMSV9TVEFSVCA+PiAyXSwgQUxJX1JFRyhjaGlwLCBBTElfU1RBUlQpKTsKLQkvLyByZXN0b3JlIElSUSBlbmFibGUgYml0cworCS8qIHJlc3RvcmUgSVJRIGVuYWJsZSBiaXRzICovCiAJb3V0bChpbS0+cmVnc1tBTElfTUlTQ0lOVCA+PiAyXSwgQUxJX1JFRyhjaGlwLCBBTElfTUlTQ0lOVCkpOwogCQogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+cmVnX2xvY2spOwogCi0JZm9yKGkgPSAwIDsgaSA8IGNoaXAtPm51bV9vZl9jb2RlY3MgOyBpKyspCisJZm9yIChpID0gMCA7IGkgPCBjaGlwLT5udW1fb2ZfY29kZWNzOyBpKyspCiAJCXNuZF9hYzk3X3Jlc3VtZShjaGlwLT5hYzk3W2ldKTsKIAkKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EMCk7CkBAIC0yMTEzLDcgKzIwNzcsNyBAQAogewogCXVuc2lnbmVkIGludCBsZWdhY3k7CiAJdW5zaWduZWQgY2hhciB0ZW1wOwotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKIAogCXNuZF9hbGlfcHJpbnRrKCJjaGlwIGluaXRpYWxpemluZyAuLi4gXG4iKTsKIApAQCAtMjE0Niw3ICsyMTEwLDggQEAKIAlvdXRiKDB4MTAsIAkgQUxJX1JFRyhjb2RlYywgQUxJX01QVVIyKSk7CiAKIAljb2RlYy0+YWM5N19leHRfaWQgPSBzbmRfYWxpX2NvZGVjX3BlZWsoY29kZWMsIDAsIEFDOTdfRVhURU5ERURfSUQpOwotCWNvZGVjLT5hYzk3X2V4dF9zdGF0dXMgPSBzbmRfYWxpX2NvZGVjX3BlZWsoY29kZWMsIDAsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwljb2RlYy0+YWM5N19leHRfc3RhdHVzID0gc25kX2FsaV9jb2RlY19wZWVrKGNvZGVjLCAwLAorCQkJCQkJICAgIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKIAlpZiAoY29kZWMtPnNwZGlmX3N1cHBvcnQpIHsKIAkJc25kX2FsaV9lbmFibGVfc3BkaWZfb3V0KGNvZGVjKTsKIAkJY29kZWMtPnNwZGlmX21hc2sgPSAweDAwMDAwMDAyOwpAQCAtMjE1OCw4ICsyMTIzLDkgQEAKIAlpZiAoaW5sKEFMSV9SRUcoY29kZWMsIEFMSV9TQ1RSTCkpICYgQUxJX1NDVFJMX0NPREVDMl9SRUFEWSkgewogCQljb2RlYy0+bnVtX29mX2NvZGVjcysrOwogCQlvdXRsKGlubChBTElfUkVHKGNvZGVjLCBBTElfU0NUUkwpKSB8Ci0JCQkoQUxJX1NDVFJMX0xJTkVfSU4yfEFMSV9TQ1RSTF9HUElPX0lOMnxBTElfU0NUUkxfTElORV9PVVRfRU4pLAotCQkJQUxJX1JFRyhjb2RlYywgQUxJX1NDVFJMKSk7CisJCSAgICAgKEFMSV9TQ1RSTF9MSU5FX0lOMiB8IEFMSV9TQ1RSTF9HUElPX0lOMiB8CisJCSAgICAgIEFMSV9TQ1RSTF9MSU5FX09VVF9FTiksCisJCSAgICAgQUxJX1JFRyhjb2RlYywgQUxJX1NDVFJMKSk7CiAJfQogCiAJc25kX2FsaV9wcmludGsoImNoaXAgaW5pdGlhbGl6ZSBzdWNjZWVkLlxuIik7CkBAIC0yMTY4LDE4ICsyMTM0LDE5IEBACiB9CiAKIC8qIHByb2MgZm9yIHJlZ2lzdGVyIGR1bXAgKi8KLXN0YXRpYyB2b2lkIHNuZF9hbGlfcHJvY19yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZikKK3N0YXRpYyB2b2lkIHNuZF9hbGlfcHJvY19yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCisJCQkgICAgICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWYpCiB7CiAJc3RydWN0IHNuZF9hbGkgKmNvZGVjID0gZW50cnktPnByaXZhdGVfZGF0YTsKIAlpbnQgaTsKLQlmb3IoaSA9IDAgOyBpIDwgMjU2IDsgaSs9IDQpCisJZm9yIChpID0gMDsgaSA8IDI1NiA7IGkrPSA0KQogCQlzbmRfaXByaW50ZihidWYsICIlMDJ4OiAlMDh4XG4iLCBpLCBpbmwoQUxJX1JFRyhjb2RlYywgaSkpKTsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0IHNuZF9hbGlfcHJvY19pbml0KHN0cnVjdCBzbmRfYWxpICpjb2RlYykKIHsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwotCWlmKCFzbmRfY2FyZF9wcm9jX25ldyhjb2RlYy0+Y2FyZCwgImFsaTU0NTEiLCAmZW50cnkpKQorCWlmICghc25kX2NhcmRfcHJvY19uZXcoY29kZWMtPmNhcmQsICJhbGk1NDUxIiwgJmVudHJ5KSkKIAkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjb2RlYywgc25kX2FsaV9wcm9jX3JlYWQpOwogfQogCkBAIC0yMTg4LDcgKzIxNTUsOCBAQAogCWludCBlcnI7CiAKIAlzbmRfYWxpX3ByaW50aygicmVzb3VjZXMgYWxsb2NhdGlvbiAuLi5cbiIpOwotCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhjb2RlYy0+cGNpLCAiQUxJIDU0NTEiKSkgPCAwKQorCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMoY29kZWMtPnBjaSwgIkFMSSA1NDUxIik7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY29kZWMtPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoY29kZWMtPnBjaSwgMCk7CiAKQEAgLTIyMDEsOSArMjE2OSw5IEBACiAJc25kX2FsaV9wcmludGsoInJlc291Y2VzIGFsbG9jYXRlZC5cbiIpOwogCXJldHVybiAwOwogfQotc3RhdGljIGludCBzbmRfYWxpX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpIAorc3RhdGljIGludCBzbmRfYWxpX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCiB7Ci0Jc3RydWN0IHNuZF9hbGkgKmNvZGVjPWRldmljZS0+ZGV2aWNlX2RhdGE7CisJc3RydWN0IHNuZF9hbGkgKmNvZGVjID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKIAlzbmRfYWxpX2ZyZWUoY29kZWMpOwogCXJldHVybiAwOwogfQpAQCAtMjIyNiwxNyArMjE5NCwyMCBAQAogCXNuZF9hbGlfcHJpbnRrKCJjcmVhdGluZyAuLi5cbiIpOwogCiAJLyogZW5hYmxlIFBDSSBkZXZpY2UgKi8KLQlpZiAoKGVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSkpIDwgMCkKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwY2kpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCS8qIGNoZWNrLCBpZiB3ZSBjYW4gcmVzdHJpY3QgUENJIERNQSB0cmFuc2ZlcnMgdG8gMzEgYml0cyAqLwogCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaSwgRE1BXzMxQklUX01BU0spIDwgMCB8fAogCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGNpLCBETUFfMzFCSVRfTUFTSykgPCAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDMxYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJc25kX3ByaW50ayhLRVJOX0VSUiAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgIgorCQkJICAgIjMxYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBjaSk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JaWYgKChjb2RlYyA9IGt6YWxsb2Moc2l6ZW9mKCpjb2RlYyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJY29kZWMgPSBremFsbG9jKHNpemVvZigqY29kZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvZGVjKSB7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0yMjkzLDIxICsyMjY0LDIyIEBACiAKIAkvKiBNMTUzMzogc291dGhicmlkZ2UgKi8KIAljb2RlYy0+cGNpX20xNTMzID0gcGNpX2dldF9kZXZpY2UoMHgxMGI5LCAweDE1MzMsIE5VTEwpOwotCWlmICghIGNvZGVjLT5wY2lfbTE1MzMpIHsKKwlpZiAoIWNvZGVjLT5wY2lfbTE1MzMpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiYWxpNTQ1MTogY2Fubm90IGZpbmQgQUxpIDE1MzMgY2hpcC5cbiIpOwogCQlzbmRfYWxpX2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJLyogTTcxMDE6IHBvd2VyIG1hbmFnZW1lbnQgKi8KIAljb2RlYy0+cGNpX203MTAxID0gcGNpX2dldF9kZXZpY2UoMHgxMGI5LCAweDcxMDEsIE5VTEwpOwotCWlmICghIGNvZGVjLT5wY2lfbTcxMDEgJiYgY29kZWMtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikgeworCWlmICghY29kZWMtPnBjaV9tNzEwMSAmJiBjb2RlYy0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKSB7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImFsaTU0NTE6IGNhbm5vdCBmaW5kIEFMaSA3MTAxIGNoaXAuXG4iKTsKIAkJc25kX2FsaV9mcmVlKGNvZGVjKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJc25kX2FsaV9wcmludGsoInNuZF9kZXZpY2VfbmV3IGlzIGNhbGxlZC5cbiIpOwotCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBjb2RlYywgJm9wcykpIDwgMCkgeworCWVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY29kZWMsICZvcHMpOworCWlmIChlcnIgPCAwKSB7CiAJCXNuZF9hbGlfZnJlZShjb2RlYyk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMjMxNSwxOCArMjI4NywxOCBAQAogCXNuZF9jYXJkX3NldF9kZXYoY2FyZCwgJnBjaS0+ZGV2KTsKIAogCS8qIGluaXRpYWxpc2Ugc3ludGggdm9pY2VzKi8KLQlmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKysgKSB7CisJZm9yIChpID0gMDsgaSA8IEFMSV9DSEFOTkVMUzsgaSsrKQogCQljb2RlYy0+c3ludGgudm9pY2VzW2ldLm51bWJlciA9IGk7Ci0JfQogCi0JaWYgKChlcnIgPSBzbmRfYWxpX2NoaXBfaW5pdChjb2RlYykpIDwgMCkgeworCWVyciA9IHNuZF9hbGlfY2hpcF9pbml0KGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhbGkgY3JlYXRlOiBjaGlwIGluaXQgZXJyb3IuXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKICNpZmRlZiBDT05GSUdfUE0KIAljb2RlYy0+aW1hZ2UgPSBrbWFsbG9jKHNpemVvZigqY29kZWMtPmltYWdlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEgY29kZWMtPmltYWdlKQorCWlmICghY29kZWMtPmltYWdlKQogCQlzbmRfcHJpbnRrKEtFUk5fV0FSTklORyAiY2FuJ3QgYWxsb2NhdGUgYXBtIGJ1ZmZlclxuIik7CiAjZW5kaWYKIApAQCAtMjM0OCwyNiArMjMyMCwyMyBAQAogCXNuZF9hbGlfcHJpbnRrKCJwcm9iZSAuLi5cbiIpOwogCiAJY2FyZCA9IHNuZF9jYXJkX25ldyhpbmRleCwgaWQsIFRISVNfTU9EVUxFLCAwKTsKLQlpZiAoY2FyZCA9PSBOVUxMKQorCWlmICghY2FyZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoKGVyciA9IHNuZF9hbGlfY3JlYXRlKGNhcmQsIHBjaSwgcGNtX2NoYW5uZWxzLCBzcGRpZiwgJmNvZGVjKSkgPCAwKSB7Ci0JCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWVyciA9IHNuZF9hbGlfY3JlYXRlKGNhcmQsIHBjaSwgcGNtX2NoYW5uZWxzLCBzcGRpZiwgJmNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKIAljYXJkLT5wcml2YXRlX2RhdGEgPSBjb2RlYzsKIAogCXNuZF9hbGlfcHJpbnRrKCJtaXhlciBidWlsZGluZyAuLi5cbiIpOwotCWlmICgoZXJyID0gc25kX2FsaV9taXhlcihjb2RlYykpIDwgMCkgewotCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwotCQlyZXR1cm4gZXJyOwotCX0KKwllcnIgPSBzbmRfYWxpX21peGVyKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKIAkKIAlzbmRfYWxpX3ByaW50aygicGNtIGJ1aWxkaW5nIC4uLlxuIik7Ci0JaWYgKChlcnIgPSBzbmRfYWxpX2J1aWxkX3BjbXMoY29kZWMpKSA8IDApIHsKLQkJc25kX2NhcmRfZnJlZShjYXJkKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJZXJyID0gc25kX2FsaV9idWlsZF9wY21zKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKIAogCXNuZF9hbGlfcHJvY19pbml0KGNvZGVjKTsKIApAQCAtMjM3OCwxMiArMjM0NywxNiBAQAogCQljYXJkLT5zaG9ydG5hbWUsIGNvZGVjLT5wb3J0LCBjb2RlYy0+aXJxKTsKIAogCXNuZF9hbGlfcHJpbnRrKCJyZWdpc3RlciBjYXJkLlxuIik7Ci0JaWYgKChlcnIgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKSkgPCAwKSB7Ci0JCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNhcmQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCiAJcGNpX3NldF9kcnZkYXRhKHBjaSwgY2FyZCk7CiAJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlzbmRfY2FyZF9mcmVlKGNhcmQpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzbmRfYWxpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfc2IuaCBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3NiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNGQ4ZmMuLjAwMDAwMDAKLS0tIGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfc2IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICAgYXU4OHgwX3NiLmgKLSAqCi0gKiAgV2VkIE9jdCAyOSAyMjoxMDo0MiAyMDAzCi0gKiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIENISVBfQVU4ODIwCi0vKiBBVTg4MjAgc3RhcnRpbmcgQCA2NEtpQiBvZmZzZXQgKi8KLSNkZWZpbmUgU0JFTVVfQkFTRSAweDEwMDAwCi0jZWxzZQotLyogQVU4ODEwPyBhbmQgQVU4ODMwIHN0YXJ0aW5nIEAgMTY0S2lCIG9mZnNldCAqLwotI2RlZmluZSBTQkVNVV9CQVNFIDB4MjkwMDAKLSNlbmRpZgotCi0jZGVmaW5lIEZNX0FfU1RBVFVTCQkJKFNCRU1VX0JBU0UgKyAweDAwKQkvKiByZWFkICovCi0jZGVmaW5lIEZNX0FfQUREUkVTUwkJKFNCRU1VX0JBU0UgKyAweDAwKQkvKiB3cml0ZSAqLwotI2RlZmluZSBGTV9BX0RBVEEJCQkoU0JFTVVfQkFTRSArIDB4MDQpCi0jZGVmaW5lIEZNX0JfU1RBVFVTCQkJKFNCRU1VX0JBU0UgKyAweDA4KQotI2RlZmluZSBGTV9CX0FERFJFU1MJCShTQkVNVV9CQVNFICsgMHgwOCkKLSNkZWZpbmUgRk1fQl9EQVRBCQkJKFNCRU1VX0JBU0UgKyAweDBDKQotI2RlZmluZSBTQl9NSVhFUl9BRERSCQkoU0JFTVVfQkFTRSArIDB4MTApCi0jZGVmaW5lIFNCX01JWEVSX0RBVEEJCShTQkVNVV9CQVNFICsgMHgxNCkKLSNkZWZpbmUgU0JfUkVTRVQJCQkoU0JFTVVfQkFTRSArIDB4MTgpCi0jZGVmaW5lIFNCX1JFU0VUX0FMSUFTCQkoU0JFTVVfQkFTRSArIDB4MUMpCi0jZGVmaW5lIEZNX1NUQVRVUzIJCQkoU0JFTVVfQkFTRSArIDB4MjApCi0jZGVmaW5lIEZNX0FERFIyCQkJKFNCRU1VX0JBU0UgKyAweDIwKQotI2RlZmluZSBGTV9EQVRBMgkJCShTQkVNVV9CQVNFICsgMHgyNCkKLSNkZWZpbmUgU0JfRFNQX1JFQUQJCQkoU0JFTVVfQkFTRSArIDB4MjgpCi0jZGVmaW5lIFNCX0RTUF9XUklURQkJKFNCRU1VX0JBU0UgKyAweDMwKQotI2RlZmluZSBTQl9EU1BfV1JJVEVfU1RBVFVTCShTQkVNVV9CQVNFICsgMHgzMCkJLyogYml0IDcgKi8KLSNkZWZpbmUgU0JfRFNQX1JFQURfU1RBVFVTCShTQkVNVV9CQVNFICsgMHgzOCkJLyogYml0IDcgKi8KLSNkZWZpbmUgU0JfTEFDUgkJCQkoU0JFTVVfQkFTRSArIDB4NDApCS8qID8gKi8KLSNkZWZpbmUgU0JfTEFEQ1IJCQkoU0JFTVVfQkFTRSArIDB4NDQpCS8qID8gKi8KLSNkZWZpbmUgU0JfTEFNUgkJCQkoU0JFTVVfQkFTRSArIDB4NDgpCS8qID8gKi8KLSNkZWZpbmUgU0JfTEFSUgkJCQkoU0JFTVVfQkFTRSArIDB4NEMpCS8qID8gKi8KLSNkZWZpbmUgU0JfVkVSU0lPTgkJCShTQkVNVV9CQVNFICsgMHg1MCkKLSNkZWZpbmUgU0JfQ1RSTFNUQVQJCQkoU0JFTVVfQkFTRSArIDB4NTQpCi0jZGVmaW5lIFNCX1RJTUVSU1RBVAkJKFNCRU1VX0JBU0UgKyAweDU4KQotI2RlZmluZSBGTV9SQU0JCQkJKFNCRU1VX0JBU0UgKyAweDEwMCkJLyogMHg0MCBVTE9ORyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguYyBiL3NvdW5kL3BjaS9henQzMzI4LmMKaW5kZXggNDNlZGQyOC4uMzZkMzY2NiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F6dDMzMjguYworKysgYi9zb3VuZC9wY2kvYXp0MzMyOC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqICBhenQzMzI4LmMgLSBkcml2ZXIgZm9yIEF6dGVjaCBBWkYzMzI4IGJhc2VkIHNvdW5kY2FyZHMgKGUuZy4gUENJMTY4KS4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDUgYnkgQW5kcmVhcyBNb2hyIDxhbmRpIEFUIGxpc2FzLmRlPgorICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwNSwgMjAwNiwgMjAwNyBieSBBbmRyZWFzIE1vaHIgPGFuZGkgQVQgbGlzYXMuZGU+CiAgKgogICogIEZyYW1ld29yayBib3Jyb3dlZCBmcm9tIEJhcnQgSGFydGdlcnMncyBhbHM0MDAwLmMuCiAgKiAgRHJpdmVyIGRldmVsb3BlZCBvbiBQQ0kxNjggQVAoVykgdmVyc2lvbiAoUENJIHJldi4gMTAsIHN1YnN5c3RlbSBJRCAxODAxKSwKQEAgLTUyLDYgKzUyLDkgQEAKICAqICAtIGZ1bGwgZHVwbGV4IDE2Yml0IHBsYXliYWNrL3JlY29yZCBhdCBpbmRlcGVuZGVudCBzYW1wbGluZyByYXRlCiAgKiAgLSBNUFU0MDEgKCsgbGVnYWN5IGFkZHJlc3Mgc3VwcG9ydCkgRklYTUU6IGhvdyB0byBlbmFibGUgbGVnYWN5IGFkZHI/PwogICogIC0gZ2FtZSBwb3J0IChsZWdhY3kgYWRkcmVzcyBzdXBwb3J0KQorICogIC0gYnVpbHRpbiAzRCBlbmhhbmNlbWVudCAoc2FpZCB0byBiZSBZQU1BSEEgWW1lcnNpb24pCisgKiAgLSBidWlsdGluIERpcmVjdElucHV0IHN1cHBvcnQsIGhlbHBzIHJlZHVjZSBDUFUgb3ZlcmhlYWQgKGludGVycnVwdC1kcml2ZW4KKyAqICAgIGZlYXR1cmVzIHN1cHBvcnRlZCkKICAqICAtIGJ1aWx0LWluIEdlbmVyYWwgRGlyZWN0WCB0aW1lciBoYXZpbmcgYSAyMCBiaXRzIGNvdW50ZXIKICAqICAgIHdpdGggMXVzIHJlc29sdXRpb24gKHNlZSBiZWxvdyEpCiAgKiAgLSBJMlMgc2VyaWFsIHBvcnQgZm9yIGV4dGVybmFsIERBQwpAQCAtOTQsNiArOTcsMTAgQEAKICAqIAogICogQlVHUwogICogIC0gZnVsbC1kdXBsZXggbWlnaHQgKnN0aWxsKiBiZSBwcm9ibGVtYXRpYywgbm90IGZ1bGx5IHRlc3RlZCByZWNlbnRseQorICogIC0gKG5vbi1idWcpICJCYXNzL1RyZWJsZSBvciAzRCBzZXR0aW5ncyBkb24ndCB3b3JrIiAtIHRoZXkgZG8gZ2V0IGV2YWx1YXRlZAorICogICAgaWYgeW91IHNldCBQQ00gb3V0cHV0IHN3aXRjaCB0byAicHJlIDNEIiBpbnN0ZWFkIG9mICJwb3N0IDNEIi4KKyAqICAgIElmIHRoaXMgY2FuJ3QgYmUgc2V0LCB0aGVuIGdldCBhIG1peGVyIGFwcGxpY2F0aW9uIHRoYXQgSXNuJ3QgU3R1cGlkICh0bSkKKyAqICAgIChlLmcuIGttaXgsIGdhbWl4KSAtIHVuZm9ydHVuYXRlbHkgc2V2ZXJhbCBhcmUhIQogICogCiAgKiBUT0RPCiAgKiAgLSB0ZXN0IE1QVTQwMSBNSURJIHBsYXliYWNrIGV0Yy4KQEAgLTYyMiw3ICs2MjksNyBAQAogCXJldHVybiAobnJlZyAhPSBvcmVnKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hemYzMzI4X21peGVyX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfYXpmMzMyOF9taXhlcl9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJQVpGMzMyOF9NSVhFUl9TV0lUQ0goIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCBJRFhfTUlYRVJfUExBWV9NQVNURVIsIDE1LCAxKSwKIAlBWkYzMzI4X01JWEVSX1ZPTF9TVEVSRU8oIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLCBJRFhfTUlYRVJfUExBWV9NQVNURVIsIDB4MWYsIDEpLAogCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJXYXZlIFBsYXliYWNrIFN3aXRjaCIsIElEWF9NSVhFUl9XQVZFT1VULCAxNSwgMSksCkBAIC02NTIsNyArNjU5LDcgQEAKIAlBWkYzMzI4X01JWEVSX1ZPTF9NT05PKCJNb2RlbSBDYXB0dXJlIFZvbHVtZSIsIElEWF9NSVhFUl9NT0RFTUlOLCAweDFmLCAxKSwKIAlBWkYzMzI4X01JWEVSX0VOVU0oIk1pYyBTZWxlY3QiLCBJRFhfTUlYRVJfQURWQ1RMMiwgMiwgOCksCiAJQVpGMzMyOF9NSVhFUl9FTlVNKCJNb25vIE91dHB1dCBTZWxlY3QiLCBJRFhfTUlYRVJfQURWQ1RMMiwgMiwgOSksCi0JQVpGMzMyOF9NSVhFUl9FTlVNKCJQQ00iLCBJRFhfTUlYRVJfQURWQ1RMMiwgMiwgMTUpLCAvKiBQQ00gT3V0IFBhdGgsIHBsYWNlIGluIGZyb250IHNpbmNlIGl0IGNvbnRyb2xzICpib3RoKiAzRCBhbmQgQmFzcy9UcmVibGUhICovCisJQVpGMzMyOF9NSVhFUl9FTlVNKCJQQ00gT3V0cHV0IFJvdXRlIiwgSURYX01JWEVSX0FEVkNUTDIsIDIsIDE1KSwgLyogUENNIE91dCBQYXRoLCBwbGFjZSBpbiBmcm9udCBzaW5jZSBpdCBjb250cm9scyAqYm90aCogM0QgYW5kIEJhc3MvVHJlYmxlISAqLwogCUFaRjMzMjhfTUlYRVJfVk9MX1NQRUNJQUwoIlRvbmUgQ29udHJvbCAtIFRyZWJsZSIsIElEWF9NSVhFUl9CQVNTVFJFQkxFLCAweDA3LCAxLCAwKSwKIAlBWkYzMzI4X01JWEVSX1ZPTF9TUEVDSUFMKCJUb25lIENvbnRyb2wgLSBCYXNzIiwgSURYX01JWEVSX0JBU1NUUkVCTEUsIDB4MDcsIDksIDApLAogCUFaRjMzMjhfTUlYRVJfU1dJVENIKCIzRCBDb250cm9sIC0gU3dpdGNoIiwgSURYX01JWEVSX0FEVkNUTDIsIDEzLCAwKSwKQEAgLTY3OCw3ICs2ODUsNyBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgY29uc3QgdTE2IF9fZGV2aW5pdGRhdGEgc25kX2F6ZjMzMjhfaW5pdF92YWx1ZXNbXVsyXSA9IHsKK3N0YXRpYyB1MTYgX19kZXZpbml0ZGF0YSBzbmRfYXpmMzMyOF9pbml0X3ZhbHVlc1tdWzJdID0gewogICAgICAgICB7IElEWF9NSVhFUl9QTEFZX01BU1RFUiwJTUlYRVJfTVVURV9NQVNLfDB4MWYxZiB9LAogICAgICAgICB7IElEWF9NSVhFUl9NT0RFTU9VVCwJCU1JWEVSX01VVEVfTUFTS3wweDFmMWYgfSwKIAl7IElEWF9NSVhFUl9CQVNTVFJFQkxFLAkJMHgwMDAwIH0sCkBAIC0xMzY5LDcgKzEzNzYsNiBAQAogCXN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAogCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwotCiAJY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtID0gTlVMTDsKIAlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIAlyZXR1cm4gMDsKQEAgLTE2NjAsMTAgKzE2NjYsMTAgQEAKIH0KICNlbmRpZgogCisjaWYgREVCVUdfTUlTQwogc3RhdGljIHZvaWQKIHNuZF9hemYzMzI4X2RlYnVnX3Nob3dfcG9ydHMoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwKQogewotI2lmIERFQlVHX01JU0MKIAl1MTYgdG1wOwogCiAJc25kX2F6ZjMzMjhfZGJnbWlzYygiY29kZWNfcG9ydCAweCVseCwgaW8yX3BvcnQgMHglbHgsIG1wdV9wb3J0IDB4JWx4LCBzeW50aF9wb3J0IDB4JWx4LCBtaXhlcl9wb3J0IDB4JWx4LCBpcnEgJWRcbiIsIGNoaXAtPmNvZGVjX3BvcnQsIGNoaXAtPmlvMl9wb3J0LCBjaGlwLT5tcHVfcG9ydCwgY2hpcC0+c3ludGhfcG9ydCwgY2hpcC0+bWl4ZXJfcG9ydCwgY2hpcC0+aXJxKTsKQEAgLTE2NzMsMTAgKzE2NzksMTYgQEAKIAlmb3IgKHRtcD0wOyB0bXAgPD0gMHgwMTsgdG1wICs9IDEpCiAJCXNuZF9hemYzMzI4X2RiZ21pc2MoIjB4JTAyeDogb3BsIDB4JTA0eCwgbXB1MzAwIDB4JTA0eCwgbXB1MzEwIDB4JTA0eCwgbXB1MzIwIDB4JTA0eCwgbXB1MzMwIDB4JTA0eFxuIiwgdG1wLCBpbmIoMHgzODggKyB0bXApLCBpbmIoMHgzMDAgKyB0bXApLCBpbmIoMHgzMTAgKyB0bXApLCBpbmIoMHgzMjAgKyB0bXApLCBpbmIoMHgzMzAgKyB0bXApKTsKIAotCWZvciAodG1wID0gMDsgdG1wIDw9IDB4NkU7IHRtcCArPSAyKQotCQlzbmRfYXpmMzMyOF9kYmdtaXNjKCIweCUwMng6IDB4JTA0eFxuIiwgdG1wLCBzbmRfYXpmMzMyOF9jb2RlY19pbmIoY2hpcCwgdG1wKSk7Ci0jZW5kaWYKKwlmb3IgKHRtcCA9IDA7IHRtcCA8IEFaRl9JT19TSVpFX0NPREVDOyB0bXAgKz0gMikKKwkJc25kX2F6ZjMzMjhfZGJnbWlzYygiY29kZWMgMHglMDJ4OiAweCUwNHhcbiIsIHRtcCwgc25kX2F6ZjMzMjhfY29kZWNfaW53KGNoaXAsIHRtcCkpOworCisJZm9yICh0bXAgPSAwOyB0bXAgPCBBWkZfSU9fU0laRV9NSVhFUjsgdG1wICs9IDIpCisJCXNuZF9hemYzMzI4X2RiZ21pc2MoIm1peGVyIDB4JTAyeDogMHglMDR4XG4iLCB0bXAsIHNuZF9hemYzMzI4X21peGVyX2ludyhjaGlwLCB0bXApKTsKIH0KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK3NuZF9hemYzMzI4X2RlYnVnX3Nob3dfcG9ydHMoY29uc3Qgc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwKSB7fQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19kZXZpbml0CiBzbmRfYXpmMzMyOF9jcmVhdGUoc3RydWN0IHNuZF9jYXJkICpjYXJkLApAQCAtMTg0Miw4ICsxODU0LDggQEAKIAogI2lmZGVmIE1PRFVMRQogCXByaW50aygKLSJhenQzMzI4OiBTb3VuZCBkcml2ZXIgZm9yIEF6dGVjaCBBWkYzMzI4LWJhc2VkIHNvdW5kY2FyZHMgc3VjaCBhcyBQQ0kxNjhcbiIKLSJhenQzMzI4OiAoaGFyZHdhcmUgd2FzIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkIC0gWkVSTyBzdXBwb3J0IGZyb20gQXp0ZWNoKS5cbiIKKyJhenQzMzI4OiBTb3VuZCBkcml2ZXIgZm9yIEF6dGVjaCBBWkYzMzI4LWJhc2VkIHNvdW5kY2FyZHMgc3VjaCBhcyBQQ0kxNjguXG4iCisiYXp0MzMyODogSGFyZHdhcmUgd2FzIGNvbXBsZXRlbHkgdW5kb2N1bWVudGVkLCB1bmZvcnR1bmF0ZWx5LlxuIgogImF6dDMzMjg6IEZlZWwgZnJlZSB0byBjb250YWN0IGFuZGkgQVQgbGlzYXMuZGUgZm9yIGJ1ZyByZXBvcnRzIGV0Yy4hXG4iCiAiYXp0MzMyODogVXNlci1zY2FsYWJsZSBzZXF1ZW5jZXIgdGltZXIgc2V0IHRvICVkSHogKDEwMjQwMDBIeiAvICVkKS5cbiIsCiAJMTAyNDAwMCAvIHNlcXRpbWVyX3NjYWxpbmcsIHNlcXRpbWVyX3NjYWxpbmcpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguaCBiL3NvdW5kL3BjaS9henQzMzI4LmgKaW5kZXggYjRmM2UzYy4uNjc5ZmE5OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F6dDMzMjguaAorKysgYi9zb3VuZC9wY2kvYXp0MzMyOC5oCkBAIC0xMDYsOCArMTA2LDggQEAKICAgI2RlZmluZSBJUlFfUkVDT1JESU5HCQkJMHgwMDAyCiAgICNkZWZpbmUgSVJRX01QVTQwMQkJCTB4MDAxMAogICAjZGVmaW5lIElSUV9USU1FUgkJCTB4MDAyMCAvKiBEaXJlY3RYIHRpbWVyICovCi0gICNkZWZpbmUgSVJRX1VOS05PV04xCQkJMHgwMDQwIC8qIHByb2JhYmx5IHVudXNlZCAqLwotICAjZGVmaW5lIElSUV9VTktOT1dOMgkJCTB4MDA4MCAvKiBwcm9iYWJseSB1bnVzZWQgKi8KKyAgI2RlZmluZSBJUlFfVU5LTk9XTjEJCQkweDAwNDAgLyogcHJvYmFibHkgdW51c2VkLCBvciBwb3NzaWJseSBJMlMgcG9ydD8gb3IgZ2FtZXBvcnQgSVJRPyAqLworICAjZGVmaW5lIElSUV9VTktOT1dOMgkJCTB4MDA4MCAvKiBwcm9iYWJseSB1bnVzZWQsIG9yIHBvc3NpYmx5IEkyUyBwb3J0PyBvciBnYW1lcG9ydCBJUlE/ICovCiAjZGVmaW5lIElEWF9JT182NkgJCTB4NjYgICAgLyogd3JpdGluZyAweGZmZmYgcmV0dXJucyAweDAwMDAgKi8KICNkZWZpbmUgSURYX0lPX1NPTUVfVkFMVUUJMHg2OAkvKiB0aGlzIGlzIHNldCB0byBlLmcuIDB4M2ZmIG9yIDB4MzAwLCBhbmQgd3JpdGFibGU7IG1heWJlIHNvbWUgYnVmZmVyIGxpbWl0LCBidXQgSSBjb3VsZG4ndCBmaW5kIG91dCBtb3JlLCBQVToweDAwZmYgKi8KICNkZWZpbmUgSURYX0lPXzZBSAkJMHg2QQkvKiB0aGlzIFdPUkQgY2FuIGJlIHNldCB0byBoYXZlIGJpdHMgMHgwMDI4IGFjdGl2YXRlZCAoRklYTUU6IGNvcnJlY3Q/Pyk7IGFjdHVhbGx5IGluaGliaXRzIFBDTSBwbGF5YmFjayEhISBtYXliZSBwb3dlciBtYW5hZ2VtZW50Pz8gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9idDg3eC5jIGIvc291bmQvcGNpL2J0ODd4LmMKaW5kZXggZTliMDI5ZS4uNjUyM2JhMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2J0ODd4LmMKKysrIGIvc291bmQvcGNpL2J0ODd4LmMKQEAgLTc4MSw2ICs3ODEsOCBAQAogCUJUX0RFVklDRShQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NzksIDB4MDA3MCwgMHgxM2ViLCAzMjAwMCksCiAJLyogVmlld2Nhc3QgT3NwcmV5IDIwMCAqLwogCUJUX0RFVklDRShQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NzgsIDB4MDA3MCwgMHhmZjAxLCA0NDEwMCksCisJLyogQVRJIFRWLVdvbmRlciAqLworCUJUX0RFVklDRShQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NzgsIDB4MTAwMiwgMHgwMDAxLCAzMjAwMCksCiAJLyogTGVhZHRlayBXaW5mYXN0IHR2IDIwMDB4cCBkZWx1eCAqLwogCUJUX0RFVklDRShQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NzgsIDB4MTA3ZCwgMHg2NjA2LCAzMjAwMCksCiAJLyogVm9vZG9vIFRWIDIwMCAqLwpAQCAtODMzLDcgKzgzNSw3IEBACiAJICAgICAgICAgICBwY2ktPmRldmljZSwgcGNpLT5zdWJzeXN0ZW1fdmVuZG9yLCBwY2ktPnN1YnN5c3RlbV9kZXZpY2UpOwogCXNuZF9wcmludGsoS0VSTl9ERUJVRyAicGxlYXNlIG1haWwgaWQsIGJvYXJkIG5hbWUsIGFuZCwgIgogCQkgICAiaWYgaXQgd29ya3MsIHRoZSBjb3JyZWN0IGRpZ2l0YWxfcmF0ZSBvcHRpb24gdG8gIgotCQkgICAiPGFsc2EtZGV2ZWxAbGlzdHMuc2YubmV0PlxuIik7CisJCSAgICI8YWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnPlxuIik7CiAJcmV0dXJuIDMyMDAwOyAvKiBkZWZhdWx0IHJhdGUgKi8KIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCmluZGV4IGVhNjcxMmIuLjQ4ZjNmMTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKQEAgLTc3NSw3ICs3NzUsNiBAQAogCXN0cnVjdCBzbmRfY2EwMTA2X3BjbSAqZXBjbTsKIAlpbnQgY2hhbm5lbDsKIAlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAgICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKIAl1MzIgYmFzaWMgPSAwOwogCXUzMiBleHRlbmRlZCA9IDA7CkBAIC03OTAsOCArNzg5LDcgQEAKIAkJcnVubmluZz0wOwogCQlicmVhazsKIAl9Ci0gICAgICAgIHNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLSAgICAgICAgICAgICAgICBzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKyAgICAgICAgc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKIAkJcnVudGltZSA9IHMtPnJ1bnRpbWU7CiAJCWVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJCWNoYW5uZWwgPSBlcGNtLT5jaGFubmVsX2lkOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwppbmRleCAyYWU1MzliLi5iZWYxZjZkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwpAQCAtMzEwNyw3ICszMTA3LDcgQEAKIAlzbmRfcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogc25kLWNzNDZ4eDogbmV2ZXIgcmVhZCBJU1YzICYgSVNWNCBmcm9tIEFDJzk3XG4iKTsKIAlzbmRfcHJpbnRrKEtFUk5fRVJSICIgICAgICAgVHJ5IHJlbG9hZGluZyB0aGUgQUxTQSBkcml2ZXIsIGlmIHlvdSBmaW5kIHNvbWV0aGluZ1xuIik7CiAgICAgICAgIHNuZF9wcmludGsoS0VSTl9FUlIgIiAgICAgICBicm9rZW4gb3Igbm90IHdvcmtpbmcgb24geW91ciBzb3VuZGNhcmQgdXBvblxuIik7Ci0Jc25kX3ByaW50ayhLRVJOX0VSUiAiICAgICAgIHRoaXMgbWVzc2FnZSBwbGVhc2UgcmVwb3J0IHRvIGFsc2EtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0XG4iKTsKKwlzbmRfcHJpbnRrKEtFUk5fRVJSICIgICAgICAgdGhpcyBtZXNzYWdlIHBsZWFzZSByZXBvcnQgdG8gYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnXG4iKTsKIAogCXJldHVybiAtRUlPOwogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M0Nnh4L2ltZ3MvY3djZW1iODAuaCBiL3NvdW5kL3BjaS9jczQ2eHgvaW1ncy9jd2NlbWI4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjRjNmZmLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvaW1ncy9jd2NlbWI4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYwNyArMCwwIEBACi0vKiBnZW5lcmF0ZWQgZnJvbSBjd2NlbWI4MC5vc3AgRE8gTk9UIE1PRElGWSAqLwotCi0jaWZuZGVmIF9fSEVBREVSX2N3Y2VtYjgwX0hfXwotI2RlZmluZSBfX0hFQURFUl9jd2NlbWI4MF9IX18KLQotc3RhdGljIHN0cnVjdCBkc3Bfc3ltYm9sX2VudHJ5IGN3Y2VtYjgwX3N5bWJvbHNbXSA9IHsKLSAgeyAweDAwMDAsICJCRUdJTkFERFJFU1MiLDB4MDAgfSwKLSAgeyAweDgwMDAsICJFWEVDQ0hJTEQiLDB4MDMgfSwKLSAgeyAweDgwMDEsICJFWEVDQ0hJTERfOTgiLDB4MDMgfSwKLSAgeyAweDgwMDMsICJFWEVDQ0hJTERfUFVTSDFJTkQiLDB4MDMgfSwKLSAgeyAweDgwMDgsICJFWEVDU0lCTElORyIsMHgwMyB9LAotICB7IDB4ODAwYSwgIkVYRUNTSUJMSU5HXzI5OCIsMHgwMyB9LAotICB7IDB4ODAwYiwgIkVYRUNTSUJMSU5HXzJJTkQxIiwweDAzIH0sCi0gIHsgMHg4MDEwLCAiVElNSU5HTUFTVEVSIiwweDAzIH0sCi0gIHsgMHg4MDRmLCAiUzE2X0NPREVDSU5QVVRUQVNLIiwweDAzIH0sCi0gIHsgMHg4MDVlLCAiUENNU0VSSUFMSU5QVVRUQVNLIiwweDAzIH0sCi0gIHsgMHg4MDZkLCAiUzE2X01JWF9UT19PU1RSRUFNIiwweDAzIH0sCi0gIHsgMHg4MDlhLCAiUzE2X01JWCIsMHgwMyB9LAotICB7IDB4ODBiYiwgIlMxNl9VUFNSQyIsMHgwMyB9LAotICB7IDB4ODEzYiwgIk1JWDNfRVhQIiwweDAzIH0sCi0gIHsgMHg4MTY0LCAiREVDSU1BVEVCWVBPVzIiLDB4MDMgfSwKLSAgeyAweDgxOTcsICJWQVJJREVDSU1BVEUiLDB4MDMgfSwKLSAgeyAweDgxZjIsICJfM0RJTlBVVFRBU0siLDB4MDMgfSwKLSAgeyAweDgyMGEsICJfM0RQUkxHQ0lOUFRBU0siLDB4MDMgfSwKLSAgeyAweDgyMjcsICJfM0RTVEVSRU9JTlBVVFRBU0siLDB4MDMgfSwKLSAgeyAweDgyNDIsICJfM0RPVVRQVVRUQVNLIiwweDAzIH0sCi0gIHsgMHg4MmM0LCAiSFJURl9NT1JQSF9UQVNLIiwweDAzIH0sCi0gIHsgMHg4MmM2LCAiV0FJVDREQVRBIiwweDAzIH0sCi0gIHsgMHg4MmZhLCAiUFJPTE9HSUMiLDB4MDMgfSwKLSAgeyAweDg0OTYsICJERUNPUlJFTEFUT1IiLDB4MDMgfSwKLSAgeyAweDg0YTQsICJTVEVSRU8yTU9OTyIsMHgwMyB9LAotICB7IDB4MDA3MCwgIlNQT1NDQiIsMHgwMiB9LAotICB7IDB4MDEwNSwgIlRBU0tUUkVFVEhSRUFEIiwweDAzIH0sCi0gIHsgMHgwMTM2LCAiVEFTS1RSRUVIRUFERVJDT0RFIiwweDAzIH0sCi0gIHsgMHgwMTNmLCAiRkdUQVNLVFJFRUhFQURFUkNPREUiLDB4MDMgfSwKLSAgeyAweDAxNjMsICJOVUxMQUxHT1JJVEhNIiwweDAzIH0sCi0gIHsgMHgwMTY3LCAiSEZHRVhFQ0NISUxEIiwweDAzIH0sCi0gIHsgMHgwMTY4LCAiSEZHRVhFQ0NISUxEXzk4IiwweDAzIH0sCi0gIHsgMHgwMTZhLCAiSEZHRVhFQ0NISUxEX1BVU0gxSU5EIiwweDAzIH0sCi0gIHsgMHgwMTZkLCAiSEZHRVhFQ1NJQkxJTkciLDB4MDMgfSwKLSAgeyAweDAxNmYsICJIRkdFWEVDU0lCTElOR18yOTgiLDB4MDMgfSwKLSAgeyAweDAxNzAsICJIRkdFWEVDU0lCTElOR18ySU5EMSIsMHgwMyB9LAotICB7IDB4MDE3MywgIlMxNl9DT0RFQ09VVFBVVFRBU0siLDB4MDMgfSwKLSAgeyAweDAxOGUsICIjQ09ERV9FTkQiLDB4MDAgfSwKLX07IC8qIGN3Y2VtYjgwIHN5bWJvbHMgKi8KLQotc3RhdGljIHUzMiBjd2NlbWI4MF9jb2RlW10gPSB7Ci0vKiBCRUdJTkFERFJFU1MgKi8KLS8qIDAwMDAgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLS8qIDAwMDIgKi8gMHgwMDAwMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLS8qIDAwMDQgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLS8qIDAwMDYgKi8gMHgwMDAwOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLS8qIDAwMDggKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLS8qIDAwMEEgKi8gMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLS8qIDAwMEMgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLS8qIDAwMEUgKi8gMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLS8qIDAwMTAgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLS8qIDAwMTIgKi8gMHgwMDAyMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLS8qIDAwMTQgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLS8qIDAwMTYgKi8gMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLS8qIDAwMTggKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLS8qIDAwMUEgKi8gMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLS8qIDAwMUMgKi8gMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKLS8qIDAwMUUgKi8gMHgwMDAzOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKLS8qIDAwMjAgKi8gMHgwMDBmZTE5ZSwweDAwMDAxMDAzLDB4MDAwOWM3MzAsMHgwMDAwMTAwMywKLS8qIDAwMjIgKi8gMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKLS8qIDAwMjQgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLS8qIDAwMjYgKi8gMHgwMDAwOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLS8qIDAwMjggKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLS8qIDAwMkEgKi8gMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLS8qIDAwMkMgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLS8qIDAwMkUgKi8gMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLS8qIDAwMzAgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLS8qIDAwMzIgKi8gMHgwMDAyMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLS8qIDAwMzQgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLS8qIDAwMzYgKi8gMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLS8qIDAwMzggKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLS8qIDAwM0EgKi8gMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLS8qIDAwM0MgKi8gMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKLS8qIDAwM0UgKi8gMHgwMDAzOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKLS8qIDAwNDAgKi8gMHgwMDAwYTczMCwweDAwMDAxMDA4LDB4MDAwZTI3MzAsMHgwMDAwMTAwMiwKLS8qIDAwNDIgKi8gMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKLS8qIDAwNDQgKi8gMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKLS8qIDAwNDYgKi8gMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKLS8qIDAwNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwZjYxOWMsMHgwMDAwMTAwMywKLS8qIDAwNEEgKi8gMHgwMDA3ZjgwMSwweDAwMGMwMDAwLDB4MDAwMDAwMzcsMHgwMDAwMTAwMCwKLS8qIDAwNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNEUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNTAgKi8gMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNTIgKi8gMHgwMDAwMzczYywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNTQgKi8gMHgwMDBlZTE5YywweDAwMDAxMDAzLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKLS8qIDAwNTYgKi8gMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNUEgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDI3M2MsMHgwMDAwMTAwMCwKLS8qIDAwNUMgKi8gMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwZTY3OWUsMHgwMDAwMTAwMywKLS8qIDAwNUUgKi8gMHgwMDAwNzcwNSwweDAwMDAxNDAwLDB4MDAwYWM3MWUsMHgwMDAwMTAwMywKLS8qIDAwNjAgKi8gMHgwMDA4N2ZjMSwweDAwMGMzYmUwLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKLS8qIDAwNjIgKi8gMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNjYgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE3MzAsMHgwMDAwMTAwMywKLS8qIDAwNjggKi8gMHgwMDAwMDAzMywweDAwMDAxMDAwLDB4MDAwN2Y4MDEsMHgwMDBjMDAwMCwKLS8qIDAwNkEgKi8gMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNkUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKLS8qIDAwNzAgKi8gMHgwMDAwMDAzMiwweDAwMDAxMDAwLDB4MDAwMDI3M2QsMHgwMDAwMTAwMCwKLS8qIDAwNzIgKi8gMHgwMDA0YTczMCwweDAwMDAxMDAzLDB4MDAwMDBmNDEsMHgwMDA5NzE0MCwKLS8qIDAwNzQgKi8gMHgwMDAwYTg0MSwweDAwMDliMjQwLDB4MDAwMGEwYzEsMHgwMDA5ZjA0MCwKLS8qIDAwNzYgKi8gMHgwMDAxYzY0MSwweDAwMDkzNTQwLDB4MDAwMWNlYzEsMHgwMDA5YjVjMCwKLS8qIDAwNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMWJmMDUsMHgwMDAzZmM0MCwKLS8qIDAwN0EgKi8gMHgwMDAwMjcyNSwweDAwMGFhNDAwLDB4MDAwMTM3MDUsMHgwMDA5M2EwMCwKLS8qIDAwN0MgKi8gMHgwMDAwMDAyZSwweDAwMDlkNmMwLDB4MDAwMzg2MzAsMHgwMDAwMTAwNCwKLS8qIDAwN0UgKi8gMHgwMDA0ZWYwYSwweDAwMGViNzg1LDB4MDAwM2ZjOGEsMHgwMDAwMDAwMCwKLS8qIDAwODAgKi8gMHgwMDAwMDAwMCwweDAwMGM3MGUwLDB4MDAwN2QxODIsMHgwMDAyYzY0MCwKLS8qIDAwODIgKi8gMHgwMDAwMDYzMCwweDAwMDAxMDA0LDB4MDAwNzk5YjgsMHgwMDAyYzZjMCwKLS8qIDAwODQgKi8gMHgwMDAzMTcwNSwweDAwMDkyMjQwLDB4MDAwMzlmMDUsMHgwMDA5MzJjMCwKLS8qIDAwODYgKi8gMHgwMDAzNTIwYSwweDAwMDAwMDAwLDB4MDAwNDA3MzEsMHgwMDAwMTAwYiwKLS8qIDAwODggKi8gMHgwMDAxMDcwNSwweDAwMGIyMGMwLDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKLS8qIDAwOEEgKi8gMHgwMDAzMjEwOCwweDAwMGM2MGM0LDB4MDAwNjUyMDgsMHgwMDBjMjkxNywKLS8qIDAwOEMgKi8gMHgwMDA0MDZiMCwweDAwMDAxMDA3LDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwKLS8qIDAwOEUgKi8gMHgwMDAyODE4ZSwweDAwMGMwMDAwLDB4MDAwNDQxMGEsMHgwMDAwMDAwMCwKLS8qIDAwOTAgKi8gMHgwMDA0MDYzMCwweDAwMDAxMDA3LDB4MDAwMjk3MDUsMHgwMDBjMDAwMCwKLS8qIDAwOTIgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDAzZmM0MCwKLS8qIDAwOTQgKi8gMHgwMDAwMzdjMSwweDAwMDkxYjQwLDB4MDAwMDNmYzEsMHgwMDA5MTFjMCwKLS8qIDAwOTYgKi8gMHgwMDAwMzdjMSwweDAwMDk1N2MwLDB4MDAwMDNmYzEsMHgwMDA5NTFjMCwKLS8qIDAwOTggKi8gMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDA5OTFjMCwKLS8qIDAwOUEgKi8gMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDA5ZDFjMCwKLS8qIDAwOUMgKi8gMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMWNjYzEsMHgwMDA5MTVjMCwKLS8qIDAwOUUgKi8gMHgwMDAxYzQ0MSwweDAwMDlkODAwLDB4MDAwOWNkYzEsMHgwMDA5MTI0MCwKLS8qIDAwQTAgKi8gMHgwMDAxYzU0MSwweDAwMDkxZDAwLDB4MDAwOWNmYzEsMHgwMDA5NTI0MCwKLS8qIDAwQTIgKi8gMHgwMDAxYzc0MSwweDAwMDk1YzgwLDB4MDAwZThjYTksMHgwMDA5OTI0MCwKLS8qIDAwQTQgKi8gMHgwMDBlODVhZCwweDAwMDk1NjQwLDB4MDAwNjljYTksMHgwMDA5OWQ4MCwKLS8qIDAwQTYgKi8gMHgwMDBlOTUyZCwweDAwMDk5NjQwLDB4MDAwZWFjYTksMHgwMDA5ZDZjMCwKLS8qIDAwQTggKi8gMHgwMDBlYTVhZCwweDAwMDkxYTQwLDB4MDAwNmJjYTksMHgwMDA5ZGU4MCwKLS8qIDAwQUEgKi8gMHgwMDBlYjUyZCwweDAwMDk1YTQwLDB4MDAwZWNjYTksMHgwMDA5OWFjMCwKLS8qIDAwQUMgKi8gMHgwMDBlYzVhZCwweDAwMDlkYTQwLDB4MDAwZWRjYTksMHgwMDA5ZDMwMCwKLS8qIDAwQUUgKi8gMHgwMDBhNmUwYSwweDAwMDAxMDAwLDB4MDAwZWQ1MmQsMHgwMDA5MWU0MCwKLS8qIDAwQjAgKi8gMHgwMDBlZWNhOSwweDAwMDk1ZWMwLDB4MDAwZWU1YWQsMHgwMDA5OWU0MCwKLS8qIDAwQjIgKi8gMHgwMDA2ZmNhOSwweDAwMDAyNTAwLDB4MDAwZmIyMDgsMHgwMDBjNTlhMCwKLS8qIDAwQjQgKi8gMHgwMDBlZjUyZCwweDAwMDlkZTQwLDB4MDAwNjhjYTksMHgwMDA5MTJjMSwKLS8qIDAwQjYgKi8gMHgwMDA2ODNhZCwweDAwMDk1MjQxLDB4MDAwMjBmMDUsMHgwMDA5OTFjMSwKLS8qIDAwQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwODZmODgsMHgwMDAwMTAwMCwKLS8qIDAwQkEgKi8gMHgwMDA5Y2Y4MSwweDAwMGI1MzQwLDB4MDAwOWM3MDEsMHgwMDBiOTJjMCwKLS8qIDAwQkMgKi8gMHgwMDA5ZGU4MSwweDAwMGJkMzAwLDB4MDAwOWQ2MDEsMHgwMDBiMTcwMCwKLS8qIDAwQkUgKi8gMHgwMDAxZmQ4MSwweDAwMGI5ZDgwLDB4MDAwOWY1MDEsMHgwMDBiNTdjMCwKLS8qIDAwQzAgKi8gMHgwMDBhMGY4MSwweDAwMGJkNzQwLDB4MDAwMjA3MDEsMHgwMDBiNWM4MCwKLS8qIDAwQzIgKi8gMHgwMDBhMTY4MSwweDAwMGI5N2MwLDB4MDAwMjE2MDEsMHgwMDAwMjUwMCwKLS8qIDAwQzQgKi8gMHgwMDBhMDcwMSwweDAwMGI5YjQwLDB4MDAwYTBmODEsMHgwMDBiMWJjMCwKLS8qIDAwQzYgKi8gMHgwMDAyMTY4MSwweDAwMDAyZDAwLDB4MDAwMjBmODEsMHgwMDBiZDgwMCwKLS8qIDAwQzggKi8gMHgwMDBhMDcwMSwweDAwMGI1YmMwLDB4MDAwMjE2MDEsMHgwMDAwMzUwMCwKLS8qIDAwQ0EgKi8gMHgwMDBhMGY4MSwweDAwMGI1ZjQwLDB4MDAwYTA3MDEsMHgwMDBiZGJjMCwKLS8qIDAwQ0MgKi8gMHgwMDAyMTY4MSwweDAwMDAzZDAwLDB4MDAwMjBmODEsMHgwMDBiMWQwMCwKLS8qIDAwQ0UgKi8gMHgwMDBhMDcwMSwweDAwMGIxZmMwLDB4MDAwMjE2MDEsMHgwMDAyMDUwMCwKLS8qIDAwRDAgKi8gMHgwMDAyMGY4MSwweDAwMGIxMzQxLDB4MDAwYTA3MDEsMHgwMDBiOWZjMCwKLS8qIDAwRDIgKi8gMHgwMDAyMTY4MSwweDAwMDIwZDAwLDB4MDAwMjBmODEsMHgwMDBiZGU4MCwKLS8qIDAwRDQgKi8gMHgwMDBhMDcwMSwweDAwMGJkZmMwLDB4MDAwMjE2MDEsMHgwMDAyMTUwMCwKLS8qIDAwRDYgKi8gMHgwMDAyMGY4MSwweDAwMGI5MzQxLDB4MDAwMjA3MDEsMHgwMDBiNTNjMSwKLS8qIDAwRDggKi8gMHgwMDAyMTY4MSwweDAwMDIxZDAwLDB4MDAwYTBmODEsMHgwMDBkMDM4MCwKLS8qIDAwREEgKi8gMHgwMDAwYjYwMSwweDAwMGIxNWMwLDB4MDAwMDdiMDEsMHgwMDAwMDAwMCwKLS8qIDAwREMgKi8gMHgwMDAwN2I4MSwweDAwMGJkMWMwLDB4MDAwMDdiMDEsMHgwMDAwMDAwMCwKLS8qIDAwREUgKi8gMHgwMDAwN2I4MSwweDAwMGI5MWMwLDB4MDAwMDdiMDEsMHgwMDBiNTdjMCwKLS8qIDAwRTAgKi8gMHgwMDAwN2I4MSwweDAwMGI1MWMwLDB4MDAwMDdiMDEsMHgwMDBiMWI0MCwKLS8qIDAwRTIgKi8gMHgwMDAwN2I4MSwweDAwMGIxMWMwLDB4MDAwODdiMDEsMHgwMDBjM2RjMCwKLS8qIDAwRTQgKi8gMHgwMDA3ZTQ4OCwweDAwMGQ3ZTQ1LDB4MDAwMDAwMDAsMHgwMDBkN2E0NCwKLS8qIDAwRTYgKi8gMHgwMDA3ZTQ4YSwweDAwMDAwMDAwLDB4MDAwMTFmMDUsMHgwMDA4NDA4MCwKLS8qIDAwRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDE3MDUsMHgwMDBiMzU0MCwKLS8qIDAwRUEgKi8gMHgwMDAwOGEwMSwweDAwMGJmMDQwLDB4MDAwMDcwODEsMHgwMDBiYjVjMCwKLS8qIDAwRUMgKi8gMHgwMDA1NTQ4OCwweDAwMDAwMDAwLDB4MDAwMGQ0ODIsMHgwMDAzZmM0MCwKLS8qIDAwRUUgKi8gMHgwMDAzZmM4OCwweDAwMDAwMDAwLDB4MDAwMWU0MDEsMHgwMDBiM2EwMCwKLS8qIDAwRjAgKi8gMHgwMDAxZWM4MSwweDAwMGJkNmMwLDB4MDAwNGVmMDgsMHgwMDBlYjc4NCwKLS8qIDAwRjIgKi8gMHgwMDBjODZiMCwweDAwMDAxMDA3LDB4MDAwMDgyODEsMHgwMDBiYjI0MCwKLS8qIDAwRjQgKi8gMHgwMDAwYjgwMSwweDAwMGI3MTQwLDB4MDAwMDc4ODgsMHgwMDAwMDAwMCwKLS8qIDAwRjYgKi8gMHgwMDAwMDczYywweDAwMDAxMDAwLDB4MDAwN2YxODgsMHgwMDBjMDAwMCwKLS8qIDAwRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwNTUyODgsMHgwMDBjNTU1YywKLS8qIDAwRkEgKi8gMHgwMDA1NTI4YSwweDAwMGMwMDAwLDB4MDAwOWZhODgsMHgwMDBjNWQwMCwKLS8qIDAwRkMgKi8gMHgwMDAwZmE4OCwweDAwMDAwMDAwLDB4MDAwMDAwMzIsMHgwMDAwMTAwMCwKLS8qIDAwRkUgKi8gMHgwMDAwMDczZCwweDAwMDAxMDAwLDB4MDAwN2YxODgsMHgwMDBjMDAwMCwKLS8qIDAxMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwOGMwMWMsMHgwMDAwMTAwMywKLS8qIDAxMDIgKi8gMHgwMDAwMjcwNSwweDAwMDAxMDA4LDB4MDAwOGIyMDEsMHgwMDBjMTM5MiwKLS8qIDAxMDQgKi8gMHgwMDAwYmEwMSwweDAwMDAwMDAwLAotLyogVEFTS1RSRUVUSFJFQUQgKi8KLS8qIDAxMDUgKi8gMHgwMDAwODczMSwweDAwMDAxNDAwLDB4MDAwNGMxMDgsMHgwMDBmZTBjNCwKLS8qIDAxMDcgKi8gMHgwMDA1NzQ4OCwweDAwMDAwMDAwLDB4MDAwYTYzODgsMHgwMDAwMTAwMSwKLS8qIDAxMDkgKi8gMHgwMDA4YjMzNCwweDAwMGJjMTQxLDB4MDAwMzAyMGUsMHgwMDAwMDAwMCwKLS8qIDAxMEIgKi8gMHgwMDA4ODZiMCwweDAwMDAxMDA4LDB4MDAwMDM2MjUsMHgwMDBjNWRmYSwKLS8qIDAxMEQgKi8gMHgwMDBhNjM4YSwweDAwMDAxMDAxLDB4MDAwODAyMGUsMHgwMDAwMTAwMiwKLS8qIDAxMEYgKi8gMHgwMDA4YTZiMCwweDAwMDAxMDA4LDB4MDAwN2YzMDEsMHgwMDAwMDAwMCwKLS8qIDAxMTEgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDI3MjUsMHgwMDBhOGM0MCwKLS8qIDAxMTMgKi8gMHgwMDAwMDBhZSwweDAwMDAwMDAwLDB4MDAwZDg2MzAsMHgwMDAwMTAwOCwKLS8qIDAxMTUgKi8gMHgwMDAwMDAwMCwweDAwMGM3NGUwLDB4MDAwN2QxODIsMHgwMDAyZDY0MCwKLS8qIDAxMTcgKi8gMHgwMDBhODYzMCwweDAwMDAxMDA4LDB4MDAwNzk5YjgsMHgwMDAyZDZjMCwKLS8qIDAxMTkgKi8gMHgwMDAwNzQ4YSwweDAwMGMzZWM1LDB4MDAwNzQyMGEsMHgwMDBjMDAwMCwKLS8qIDAxMUIgKi8gMHgwMDA2MjIwOCwweDAwMGM0MTE3LDB4MDAwNzA2MzAsMHgwMDAwMTAwOSwKLS8qIDAxMUQgKi8gMHgwMDAwMDAwMCwweDAwMGMwMDAwLDB4MDAwMTAyMmUsMHgwMDAwMDAwMCwKLS8qIDAxMUYgKi8gMHgwMDAzYTYzMCwweDAwMDAxMDA5LDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKLS8qIDAxMjEgKi8gMHgwMDAwMDAzNiwweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMjMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMjUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMmE3MzAsMHgwMDAwMTAwOCwKLS8qIDAxMjcgKi8gMHgwMDA3ZjgwMSwweDAwMGMwMDAwLDB4MDAwMDAwMzcsMHgwMDAwMTAwMCwKLS8qIDAxMjkgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMkIgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMkQgKi8gMHgwMDAyYTczMCwweDAwMDAxMDA4LDB4MDAwMDAwMzMsMHgwMDAwMTAwMCwKLS8qIDAxMkYgKi8gMHgwMDAyYTcwNSwweDAwMDAxMDA4LDB4MDAwMDdhMDEsMHgwMDBjMDAwMCwKLS8qIDAxMzEgKi8gMHgwMDBlNjI4OCwweDAwMGQ1NTBhLDB4MDAwNjQyOGEsMHgwMDAwMDAwMCwKLS8qIDAxMzMgKi8gMHgwMDA2MDczMCwweDAwMDAxMDBhLDB4MDAwMDAwMDAsMHgwMDBjMDAwMCwKLS8qIDAxMzUgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogVEFTS1RSRUVIRUFERVJDT0RFICovCi0vKiAwMTM2ICovIDB4MDAwN2FhYjAsMHgwMDAzNDg4MCwweDAwMDc4ZmIwLDB4MDAwMDEwMGIsCi0vKiAwMTM4ICovIDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDMzYjk0LDB4MDAwODExNDAsCi0vKiAwMTNBICovIDB4MDAwMTgzYWUsMHgwMDAwMDAwMCwweDAwMDc4NmIwLDB4MDAwMDEwMGIsCi0vKiAwMTNDICovIDB4MDAwMjJmMDUsMHgwMDBjMzU0NSwweDAwMDBlYjhhLDB4MDAwMDAwMDAsCi0vKiAwMTNFICovIDB4MDAwNDI3MzEsMHgwMDAwMTAwMywKLS8qIEZHVEFTS1RSRUVIRUFERVJDT0RFICovCi0vKiAwMTNGICovIDB4MDAwN2FhYjAsMHgwMDAzNDg4MCwweDAwMDQ4ZmIwLDB4MDAwMDEwMGEsCi0vKiAwMTQxICovIDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDMzYjk0LDB4MDAwODExNDAsCi0vKiAwMTQzICovIDB4MDAwMTgzYWUsMHgwMDAwMDAwMCwweDAwMDgwNmIwLDB4MDAwMDEwMGIsCi0vKiAwMTQ1ICovIDB4MDAwMjJmMDUsMHgwMDAwMDAwMCwweDAwMDA3NDAxLDB4MDAwOTExNDAsCi0vKiAwMTQ3ICovIDB4MDAwNDhmMDUsMHgwMDA5NTFjMCwweDAwMDQyNzMxLDB4MDAwMDEwMDMsCi0vKiAwMTQ5ICovIDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwweDAwMGYxOWIwLDB4MDAwYmJjNDcsCi0vKiAwMTRCICovIDB4MDAwODAwMDAsMHgwMDBiZmZjNywweDAwMGZlMTllLDB4MDAwMDEwMDMsCi0vKiAwMTREICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDhlMTljLDB4MDAwMDEwMDMsCi0vKiAwMTRGICovIDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwweDAwMDAwZjQxLDB4MDAwOTcxNDAsCi0vKiAwMTUxICovIDB4MDAwMGE4NDEsMHgwMDA5YjI0MCwweDAwMDBhMGMxLDB4MDAwOWYwNDAsCi0vKiAwMTUzICovIDB4MDAwMWM2NDEsMHgwMDA5MzU0MCwweDAwMDFjZWMxLDB4MDAwOWI1YzAsCi0vKiAwMTU1ICovIDB4MDAwMDAwMDAsMHgwMDBmZGM0NCwweDAwMDU1MjA4LDB4MDAwMDAwMDAsCi0vKiAwMTU3ICovIDB4MDAwMTA3MDUsMHgwMDBhMjg4MCwweDAwMDBhMjNhLDB4MDAwOTNhMDAsCi0vKiAwMTU5ICovIDB4MDAwM2ZjOGEsMHgwMDBkZjZjNSwweDAwMDRlZjBhLDB4MDAwYzAwMDAsCi0vKiAwMTVCICovIDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwweDAwMDY1MzA4LDB4MDAwYzI5OTcsCi0vKiAwMTVEICovIDB4MDAwZDg2YjAsMHgwMDAwMTAwYSwweDAwMDQ0MTBhLDB4MDAwZDQwYzcsCi0vKiAwMTVGICovIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDgwNzMwLDB4MDAwMDEwMDQsCi0vKiAwMTYxICovIDB4MDAwNTZmMGEsMHgwMDBlYTEwNSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCi0vKiBOVUxMQUxHT1JJVEhNICovCi0vKiAwMTYzICovIDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwweDAwMGYxOWIwLDB4MDAwYmJjNDcsCi0vKiAwMTY1ICovIDB4MDAwODAwMDAsMHgwMDBiZmZjNywweDAwMDAyNzNkLDB4MDAwMDEwMDAsCi0vKiBIRkdFWEVDQ0hJTEQgKi8KLS8qIDAxNjcgKi8gMHgwMDAwMDAwMCwweDAwMGViYTQ0LAotLyogSEZHRVhFQ0NISUxEXzk4ICovCi0vKiAwMTY4ICovIDB4MDAwNDhmMDUsMHgwMDAwZjQ0MCwweDAwMDA3NDAxLDB4MDAwMGY3YzAsCi0vKiBIRkdFWEVDQ0hJTERfUFVTSDFJTkQgKi8KLS8qIDAxNkEgKi8gMHgwMDAwMDczNCwweDAwMDAxMDAwLDB4MDAwMTA3MDUsMHgwMDBhNjg4MCwKLS8qIDAxNkMgKi8gMHgwMDAwNmE4OCwweDAwMGM3NWM0LAotLyogSEZHRVhFQ1NJQkxJTkcgKi8KLS8qIDAxNkQgKi8gMHgwMDAwMDAwMCwweDAwMGU1MDg0LDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKLS8qIEhGR0VYRUNTSUJMSU5HXzI5OCAqLwotLyogMDE2RiAqLyAweDAwMDg3NDAxLDB4MDAwZTQ3ODIsCi0vKiBIRkdFWEVDU0lCTElOR18ySU5EMSAqLwotLyogMDE3MCAqLyAweDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAotLyogMDE3MiAqLyAweDAwMDA2YTg4LDB4MDAwYzc1YzQsCi0vKiBTMTZfQ09ERUNPVVRQVVRUQVNLICovCi0vKiAwMTczICovIDB4MDAwN2MxMDgsMHgwMDBjMDAwMCwweDAwMDdlNzIxLDB4MDAwYmVkNDAsCi0vKiAwMTc1ICovIDB4MDAwMDVmMjUsMHgwMDBiYWRjMCwweDAwMDNiYTk3LDB4MDAwYmViODAsCi0vKiAwMTc3ICovIDB4MDAwNjU1OTAsMHgwMDBiMmUwMCwweDAwMDMzMjE3LDB4MDAwMDNlYzAsCi0vKiAwMTc5ICovIDB4MDAwNjU1OTAsMHgwMDBiOGU0MCwweDAwMDNlZDgwLDB4MDAwNDkxYzAsCi0vKiAwMTdCICovIDB4MDAwNzNmYjAsMHgwMDA3NGM4MCwweDAwMDI4M2EwLDB4MDAwMDEwMGMsCi0vKiAwMTdEICovIDB4MDAwZWUzODgsMHgwMDA0Mjk3MCwweDAwMDA4MzAxLDB4MDAwMjFlZjIsCi0vKiAwMTdGICovIDB4MDAwYjhmMTQsMHgwMDAwMDAwZiwweDAwMGM0ZDhkLDB4MDAwMDAwMWIsCi0vKiAwMTgxICovIDB4MDAwZDZkYzIsMHgwMDBlMDZjNiwweDAwMDAzMmFjLDB4MDAwYzM5MTYsCi0vKiAwMTgzICovIDB4MDAwNGVkYzIsMHgwMDA3NGM4MCwweDAwMDc4ODk4LDB4MDAwMDEwMDAsCi0vKiAwMTg1ICovIDB4MDAwMzg4OTQsMHgwMDAwMDAzMiwweDAwMGM0ZDhkLDB4MDAwOTJlMWIsCi0vKiAwMTg3ICovIDB4MDAwZDZkYzIsMHgwMDBlMDZjNiwweDAwMDRlZGMyLDB4MDAwYzE5NTYsCi0vKiAwMTg5ICovIDB4MDAwMDcyMmMsMHgwMDAzNGEwMCwweDAwMDQxNzA1LDB4MDAwOWVkNDAsCi0vKiAwMThCICovIDB4MDAwNTg3MzAsMHgwMDAwMTQwMCwweDAwMGQ3NDg4LDB4MDAwYzNhMDAsCi0vKiAwMThEICovIDB4MDAwNDhmMDUsMHgwMDAwMDAwMAotfTsKLS8qICNDT0RFX0VORCAqLwotCi1zdGF0aWMgdTMyIGN3Y2VtYjgwX3BhcmFtZXRlcltdID0gewotLyogMDAwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDAwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDAwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDE2MywweDAwMDAwMDAwLAotLyogMDAwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDAxMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDAxNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDAxOCAqLyAweDAwMDAwMDAwLDB4MDAyMDAwNDAsMHgwMDAwODAxMCwweDAwMDAwMDAwLAotLyogMDAxQyAqLyAweDAwMDAwMDAwLDB4ODAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDYwMDAwLAotLyogMDAyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDAyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDAyOCAqLyAweDAwMDAwMDAwLDB4MDA5MDAwODAsMHgwMDAwMDE3MywweDAwMDAwMDAwLAotLyogMDAyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMTAsMHgwMDgwMDAwMCwweDAwOTAwMDAwLAotLyogMDAzMCAqLyAweGYyYzAwMDBmLDB4MDAwMDAyMDAsMHgwMDAwMDAwMCwweDAwMDEwNjAwLAotLyogMDAzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDAzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDE2MywweDMzMDMwMGMyLAotLyogMDAzQyAqLyAweDA2MDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwODAwMCwweDgwMDA4MDAwLAotLyogMDA0MCAqLyAweDNmYzAwMDBmLDB4MDAwMDAzMDEsMHgwMDAxMDQwMCwweDAwMDAwMDAwLAotLyogMDA0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA0OCAqLyAweDAwMDAwMDAwLDB4MDBiMDAwMDAsMHgwMGQwODA2ZCwweDMzMDQ4MGMzLAotLyogMDA0QyAqLyAweDA0ODAwMDAwLDB4MDAwMDAwMDEsMHgwMDgwMDAwMSwweDAwMDBmZmZmLAotLyogMDA1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA3MCAqLyAweDA2NmEwNjAwLDB4MDYzNTAwNzAsMHgwMDAwOTI5ZCwweDkyOWQ5MjlkLAotLyogMDA3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDczNWEsMHgwMDAwMDYwMCwweDAwMDAwMDAwLAotLyogMDA3OCAqLyAweDkyOWQ3MzVhLDB4MDAwMDAwMDAsMHgwMDAxMDAwMCwweDczNWE3MzVhLAotLyogMDA3QyAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDA4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwODA0ZiwweDAwMDAwMGMzLAotLyogMDA4QyAqLyAweDA1MDAwMDAwLDB4MDBhMDAwMTAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLAotLyogMDA5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDcwMCwweDAwMDAwMDAwLAotLyogMDA5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDA5OCAqLyAweDAwMDAwMDgwLDB4MDBhMDAwMDAsMHgwMDAwODA5YSwweDAwMDAwMGMyLAotLyogMDA5QyAqLyAweDA3NDAwMDAwLDB4MDAwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAotLyogMDBBMCAqLyAweDAwYzgwMDI4LDB4MDAwMDU1NTUsMHgwMDAwMDAwMCwweDAwMDEwN2EwLAotLyogMDBBNCAqLyAweDAwYzgwMDI4LDB4MDAwMDAwYzIsMHgwNjgwMDAwMCwweDAwMDAwMDAwLAotLyogMDBBOCAqLyAweDA2ZTAwMDgwLDB4MDAzMDAwMDAsMHgwMDAwODBiYiwweDAwMDAwMGM5LAotLyogMDBBQyAqLyAweDA3YTAwMDAwLDB4MDQwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAotLyogMDBCMCAqLyAweDAwYzgwMDI4LDB4MDAwMDU1NTUsMHgwMDAwMDAwMCwweDAwMDAwNzgwLAotLyogMDBCNCAqLyAweDAwYzgwMDI4LDB4MDAwMDAwYzUsMHhmZjgwMDAwMCwweDAwMDAwMDAwLAotLyogMDBCOCAqLyAweDAwNjQwMDgwLDB4MDBjMDAwMDAsMHgwMDAwODE5NywweDAwMDAwMGM5LAotLyogMDBCQyAqLyAweDA3ODAwMDAwLDB4MDQwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAotLyogMDBDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwODA1ZSwweDAwMDAwMGMxLAotLyogMDBDQyAqLyAweDAwMDAwMDAwLDB4MDA4MDAwMDAsMHg4MDAwODAwMCwweDgwMDA4MDAwLAotLyogMDBEMCAqLyAweDAwMDIwMDAwLDB4MDAwMGZmZmYsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBEOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBEQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDBGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDExMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDExNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDExOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDExQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEyOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEzMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDEzQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE0MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE0OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE0QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE5OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDE5QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFBMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFBNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFBOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFBQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFCMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFCNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFCOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFCQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFDQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFEMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFEOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFEQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDFGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIxMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIxNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIxOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIxQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIyOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIzMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDIzQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI0MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI0OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI0QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI5OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDI5QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJBMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJBNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJBOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJBQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJCMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJCNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJCOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJCQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJDQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJEMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJEOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJEQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDJGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMxMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMxNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMxOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMxQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMyOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMzMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDMzQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM0MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM0OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM0QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM5OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDM5QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNBMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNBNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNBOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNBQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNCMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNCNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNCOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNCQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNDQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNEMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNEOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNEQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDNGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQxMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQxNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQxOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQxQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQyOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQzMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQzQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ0MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ0OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ0QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ5OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDQ5QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRBMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRBNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRBOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRBQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRCMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRCNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRCOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRCQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRDQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDREMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDREOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDREQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDRGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUwMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUwNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUwOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUwQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUxMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUxNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUxOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUxQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUyMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUyNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUyOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUyQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUzMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUzNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUzOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDUzQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU0MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU0NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU0OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU0QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU1MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU1NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU1OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU1QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU2MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU2NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU2OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU5OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDU5QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVBMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVBNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVBOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVBQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVCMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVCNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVCOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVCQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVDMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVDNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVDOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVDQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVEMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVENCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVEOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVEQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVFMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVFNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVFOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVFQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVGMCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVGNCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVGOCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDVGQyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDYwMCAqLyAweDkyOWQwNjAwLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQwMDAwLAotLyogMDYwNCAqLyAweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotLyogMDYwOCAqLyAweDkyOWQ5MjlkLDB4MDAxMDA2MzUsMHgwNjBiMDEzZiwweDAwMDAwMDA0LAotLyogMDYwQyAqLyAweDAwMDAwMDAxLDB4MDA3YTAwMDIsMHgwMDAwMDAwMCwweDA2NmUwNjEwLAotLyogMDYxMCAqLyAweDAxMDU5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotLyogMDYxNCAqLyAweDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwweGE0MzFhYzc1LAotLyogMDYxOCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDYxQyAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDYyMCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDYyNCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDYyOCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDYyQyAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDYzMCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweDczNWEwMDUxLAotLyogMDYzNCAqLyAweDAwMDAwMDAwLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotLyogMDYzOCAqLyAweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotLyogMDYzQyAqLyAweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHgwMDAwMDAwMCwweDA2NDAwMTM2LAotLyogMDY0MCAqLyAweDAwMDAyNzBmLDB4MDAwMTAwMDAsMHgwMDdhMDAwMCwweDAwMDAwMDAwLAotLyogMDY0NCAqLyAweDA2OGUwNjQ1LDB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAotLyogMDY0OCAqLyAweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHhhNDMxYWM3NSwweDAwMDE3MzVhLAotLyogMDY0QyAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDY1MCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDY1NCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDY1OCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDY1QyAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDY2MCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDY2NCAqLyAweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAotLyogMDY2OCAqLyAweDczNWEwMTAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY2QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY3MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY3NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY3OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY3QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY4MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY4NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY4OCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY4QyAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY5MCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAotLyogMDY5NCAqLyAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMAotfTsgLyogI1BBUkFNRVRFUl9FTkQgKi8KLQotc3RhdGljIHUzMiBjd2NlbWI4MF9zYW1wbGVbXSA9IHsKLS8qIDAwMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAwRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAxRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAyRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDAzRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA0RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA1RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA2RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA3RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA4RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5MzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5M0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5NzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5N0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5ODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5ODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5ODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5OEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5OTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5OTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5OTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5OUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5QzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5Q0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5REMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDA5RkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBBRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBCRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDNzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBDRkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEMzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEM0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBENzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEN0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEODAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEODQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEODggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEOEMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEOTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEOTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEOTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEOUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQzAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQzQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQzggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEQ0MgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERDAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERDQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERDggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBEREMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERTAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERTQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERTggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERUMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERjAgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERjQgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERjggKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKLS8qIDBERkMgKi8gMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMDAwNAotfTsgLyogI1NBTVBMRV9FTkQgKi8KLQotCi1zdGF0aWMgc3RydWN0IGRzcF9zZWdtZW50X2Rlc2MgY3djZW1iODBfc2VnbWVudHNbXSA9IHsKLSAgeyBTRUdUWVBFX1NQX1BST0dSQU0sIDB4MDAwMDAwMDAsIDB4MDAwMDAzMWMsIGN3Y2VtYjgwX2NvZGUgfSwKLSAgeyBTRUdUWVBFX1NQX1BBUkFNRVRFUiwgMHgwMDAwMDAwMCwgMHgwMDAwMDY5NywgY3djZW1iODBfcGFyYW1ldGVyIH0sCi0gIHsgU0VHVFlQRV9TUF9TQU1QTEUsIDB4MDAwMDAwMDAsIDB4MDAwMDBlMDAsIGN3Y2VtYjgwX3NhbXBsZSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBkc3BfbW9kdWxlX2Rlc2MgY3djZW1iODBfbW9kdWxlID0gewotICAiY3djZW1iODAiLAotICB7Ci0gICAgMzgsCi0gICAgY3djZW1iODBfc3ltYm9scwotICB9LAotICAzLAotICBjd2NlbWI4MF9zZWdtZW50cywKLX07Ci0KLSNlbmRpZiAvKiBfX0hFQURFUl9jd2NlbWI4MF9IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZGFybGEyMC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTIwLmMKaW5kZXggOGU3ZmUwMy4uODcwNzhkMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTIwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTIwLmMKQEAgLTU2LDYgKzU2LDggQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSAiZWNob2F1ZGlvLmgiCiAKK01PRFVMRV9GSVJNV0FSRSgiZWEvZGFybGEyMF9kc3AuZnciKTsKKwogI2RlZmluZSBGV19EQVJMQTIwX0RTUAkwCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgY2FyZF9md1tdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9kYXJsYTI0LmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYwppbmRleCBhMTNjNjIzLi40MmI0OGY5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2RhcmxhMjQuYwpAQCAtNjAsNiArNjAsOCBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlICJlY2hvYXVkaW8uaCIKIAorTU9EVUxFX0ZJUk1XQVJFKCJlYS9kYXJsYTI0X2RzcC5mdyIpOworCiAjZGVmaW5lIEZXX0RBUkxBMjRfRFNQCTAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSBjYXJkX2Z3W10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG8zZy5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvM2cuYwppbmRleCA4ZmIxNTgyLi44ZGJiN2FjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG8zZy5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNobzNnLmMKQEAgLTY4LDYgKzY4LDEwIEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgImVjaG9hdWRpby5oIgogCitNT0RVTEVfRklSTVdBUkUoImVhL2xvYWRlcl9kc3AuZnciKTsKK01PRFVMRV9GSVJNV0FSRSgiZWEvZWNobzNnX2RzcC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJlYS8zZ19hc2ljLmZ3Iik7CisKICNkZWZpbmUgRldfMzYxX0xPQURFUgkwCiAjZGVmaW5lIEZXX0VDSE8zR19EU1AJMQogI2RlZmluZSBGV18zR19BU0lDCTIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCmluZGV4IGU0MTNkYTAuLmYyN2I2YTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYwpAQCAtNzA1LDExICs3MDUsOSBAQAogCXN0cnVjdCBhdWRpb3BpcGUgKnBpcGUgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJaW50IGksIGVycjsKIAl1MzIgY2hhbm5lbG1hc2sgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7CiAKLQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7Ci0JCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBEU1BfTUFYUElQRVM7IGkrKykgewogCQkJaWYgKHMgPT0gY2hpcC0+c3Vic3RyZWFtW2ldKSB7CiAJCQkJY2hhbm5lbG1hc2sgfD0gMSA8PCBpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fM2cuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvXzNnLmMKaW5kZXggOWY0MzllYS4uNTJhOTMzMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW9fM2cuYworKysgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpb18zZy5jCkBAIC0yMzMsOCArMjMzLDggQEAKIAogCWNoaXAtPmFzaWNfY29kZSA9ICZjYXJkX2Z3W0ZXXzNHX0FTSUNdOwogCi0JLyogTm93IGdpdmUgdGhlIG5ldyBBU0lDIGEgbGl0dGxlIHRpbWUgdG8gc2V0IHVwICovCi0JbWRlbGF5KDIpOworCS8qIE5vdyBnaXZlIHRoZSBuZXcgQVNJQyBzb21lIHRpbWUgdG8gc2V0IHVwICovCisJbXNsZWVwKDEwMDApOwogCS8qIFNlZSBpZiBpdCB3b3JrZWQgKi8KIAlib3hfdHlwZSA9IGNoZWNrX2FzaWNfc3RhdHVzKGNoaXApOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyMC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjAuYwppbmRleCBhZjRkMzIwLi5mZWUyZDQ4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyMC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTIwLmMKQEAgLTYwLDYgKzYwLDggQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSAiZWNob2F1ZGlvLmgiCiAKK01PRFVMRV9GSVJNV0FSRSgiZWEvZ2luYTIwX2RzcC5mdyIpOworCiAjZGVmaW5lIEZXX0dJTkEyMF9EU1AJMAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpcm13YXJlIGNhcmRfZndbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTI0LmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2dpbmEyNC5jCmluZGV4IDlmZjQ1NGEuLmQ1ZWFlNDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZ2luYTI0LmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9naW5hMjQuYwpAQCAtNjYsNiArNjYsMTIgQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSAiZWNob2F1ZGlvLmgiCiAKK01PRFVMRV9GSVJNV0FSRSgiZWEvbG9hZGVyX2RzcC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJlYS9naW5hMjRfMzAxX2RzcC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJlYS9naW5hMjRfMzYxX2RzcC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJlYS9naW5hMjRfMzAxX2FzaWMuZnciKTsKK01PRFVMRV9GSVJNV0FSRSgiZWEvZ2luYTI0XzM2MV9hc2ljLmZ3Iik7CisKICNkZWZpbmUgRldfMzYxX0xPQURFUgkJMAogI2RlZmluZSBGV19HSU5BMjRfMzAxX0RTUAkxCiAjZGVmaW5lIEZXX0dJTkEyNF8zNjFfRFNQCTIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnby5jCmluZGV4IDM3ZWI3MjYuLjQwZjYwMWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ28uYwpAQCAtNTgsNiArNTgsOSBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlICJlY2hvYXVkaW8uaCIKIAorTU9EVUxFX0ZJUk1XQVJFKCJlYS9sb2FkZXJfZHNwLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoImVhL2luZGlnb19kc3AuZnciKTsKKwogI2RlZmluZSBGV18zNjFfTE9BREVSCTAKICNkZWZpbmUgRldfSU5ESUdPX0RTUAkxCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGouYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvZGouYwppbmRleCBkYzhiOTE4Li43NzFjNTM4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2RqLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29kai5jCkBAIC01OCw2ICs1OCw5IEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgImVjaG9hdWRpby5oIgogCitNT0RVTEVfRklSTVdBUkUoImVhL2xvYWRlcl9kc3AuZnciKTsKK01PRFVMRV9GSVJNV0FSRSgiZWEvaW5kaWdvX2RqX2RzcC5mdyIpOworCiAjZGVmaW5lIEZXXzM2MV9MT0FERVIJCTAKICNkZWZpbmUgRldfSU5ESUdPX0RKX0RTUAkxCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW8uYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vaW5kaWdvaW8uYwppbmRleCBlYWRmMzI2Li40OWM1NTBkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2luZGlnb2lvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9pbmRpZ29pby5jCkBAIC01OSw2ICs1OSw5IEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgImVjaG9hdWRpby5oIgogCitNT0RVTEVfRklSTVdBUkUoImVhL2xvYWRlcl9kc3AuZnciKTsKK01PRFVMRV9GSVJNV0FSRSgiZWEvaW5kaWdvX2lvX2RzcC5mdyIpOworCiAjZGVmaW5lIEZXXzM2MV9MT0FERVIJCTAKICNkZWZpbmUgRldfSU5ESUdPX0lPX0RTUAkxCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyMC5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKaW5kZXggNmNlZGU0OS4uOGY1NDgzYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9sYXlsYTIwLmMKQEAgLTY2LDYgKzY2LDkgQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSAiZWNob2F1ZGlvLmgiCiAKK01PRFVMRV9GSVJNV0FSRSgiZWEvbGF5bGEyMF9kc3AuZnciKTsKK01PRFVMRV9GSVJNV0FSRSgiZWEvbGF5bGEyMF9hc2ljLmZ3Iik7CisKICNkZWZpbmUgRldfTEFZTEEyMF9EU1AJMAogI2RlZmluZSBGV19MQVlMQTIwX0FTSUMJMQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZWNob2F1ZGlvL2xheWxhMjQuYyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNC5jCmluZGV4IDQ0ZjczNTQuLjA1MjQ2NjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNC5jCisrKyBiL3NvdW5kL3BjaS9lY2hvYXVkaW8vbGF5bGEyNC5jCkBAIC02OCw2ICs2OCwxMiBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlICJlY2hvYXVkaW8uaCIKIAorTU9EVUxFX0ZJUk1XQVJFKCJlYS9sb2FkZXJfZHNwLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoImVhL2xheWxhMjRfZHNwLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoImVhL2xheWxhMjRfMV9hc2ljLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoImVhL2xheWxhMjRfMkFfYXNpYy5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJlYS9sYXlsYTI0XzJTX2FzaWMuZnciKTsKKwogI2RlZmluZSBGV18zNjFfTE9BREVSCQkwCiAjZGVmaW5lIEZXX0xBWUxBMjRfRFNQCQkxCiAjZGVmaW5lIEZXX0xBWUxBMjRfMV9BU0lDCTIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL21pYS5jCmluZGV4IGRjMTcyZDAuLjg5M2M3YzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbWlhLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9taWEuYwpAQCAtNjYsNiArNjYsOSBAQAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlICJlY2hvYXVkaW8uaCIKIAorTU9EVUxFX0ZJUk1XQVJFKCJlYS9sb2FkZXJfZHNwLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoImVhL21pYV9kc3AuZnciKTsKKwogI2RlZmluZSBGV18zNjFfTE9BREVSCTAKICNkZWZpbmUgRldfTUlBX0RTUAkxCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vbW9uYS5jIGIvc291bmQvcGNpL2VjaG9hdWRpby9tb25hLmMKaW5kZXggYzg1NmVkNS4uM2E1ZDViMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VjaG9hdWRpby9tb25hLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9tb25hLmMKQEAgLTY0LDYgKzY0LDE1IEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgImVjaG9hdWRpby5oIgogCitNT0RVTEVfRklSTVdBUkUoImVhL2xvYWRlcl9kc3AuZnciKTsKK01PRFVMRV9GSVJNV0FSRSgiZWEvbW9uYV8zMDFfZHNwLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoImVhL21vbmFfMzYxX2RzcC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJlYS9tb25hXzMwMV8xX2FzaWNfNDguZnciKTsKK01PRFVMRV9GSVJNV0FSRSgiZWEvbW9uYV8zMDFfMV9hc2ljXzk2LmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoImVhL21vbmFfMzYxXzFfYXNpY180OC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJlYS9tb25hXzM2MV8xX2FzaWNfOTYuZnciKTsKK01PRFVMRV9GSVJNV0FSRSgiZWEvbW9uYV8yX2FzaWMuZnciKTsKKwogI2RlZmluZSBGV18zNjFfTE9BREVSCQkwCiAjZGVmaW5lIEZXX01PTkFfMzAxX0RTUAkJMQogI2RlZmluZSBGV19NT05BXzM2MV9EU1AJCTIKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKaW5kZXggODBhYTU4NS4uZGJjODA1YyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKQEAgLTQ5LDYgKzQ5LDEzIEBACiAjaW5jbHVkZSAicDE3di5oIgogCiAKKyNkZWZpbmUgSEFOQV9GSUxFTkFNRSAiZW11L2hhbmEuZnciCisjZGVmaW5lIERPQ0tfRklMRU5BTUUgImVtdS9hdWRpb19kb2NrLmZ3IgorCitNT0RVTEVfRklSTVdBUkUoSEFOQV9GSUxFTkFNRSk7CitNT0RVTEVfRklSTVdBUkUoRE9DS19GSUxFTkFNRSk7CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEVNVTEwSzEgaW5pdCAvIGRvbmUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNjkzLDggKzcwMCw2IEBACiAJaW50IHRtcCx0bXAyOwogCWludCByZWc7CiAJaW50IGVycjsKLQljb25zdCBjaGFyICpoYW5hX2ZpbGVuYW1lID0gImVtdS9oYW5hLmZ3IjsKLQljb25zdCBjaGFyICpkb2NrX2ZpbGVuYW1lID0gImVtdS9hdWRpb19kb2NrLmZ3IjsKIAogCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBTcGVjaWFsIGNvbmZpZy5cbiIpOwogCS8qIEFDOTcgMi4xLCBBbnkgMTZNZWcgb2YgNEdpZyBhZGRyZXNzLCBBdXRvLU11dGUsIEVNVTMyIFNsYXZlLApAQCAtNzM1LDggKzc0MCw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlzbmRfcHJpbnRrKEtFUk5fSU5GTyAiZW11MTAxMDogRU1VX0hBTkFfSUQ9MHgleFxuIixyZWcpOwotCWlmICgoZXJyID0gc25kX2VtdTEwMTBfbG9hZF9maXJtd2FyZShlbXUsIGhhbmFfZmlsZW5hbWUpKSAhPSAwKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEhhbmEgRmlybXdhcmUgZmlsZSAlcyBmYWlsZWRcbiIsIGhhbmFfZmlsZW5hbWUpOworCWlmICgoZXJyID0gc25kX2VtdTEwMTBfbG9hZF9maXJtd2FyZShlbXUsIEhBTkFfRklMRU5BTUUpKSAhPSAwKSB7CisJCXNuZF9wcmludGsoS0VSTl9JTkZPICJlbXUxMDEwOiBMb2FkaW5nIEhhbmEgRmlybXdhcmUgZmlsZSAlcyBmYWlsZWRcbiIsIEhBTkFfRklMRU5BTUUpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtOTM4LDcgKzk0Myw3IEBACiAJCS8qIFJldHVybiB0byBBdWRpbyBEb2NrIHByb2dyYW1taW5nIG1vZGUgKi8KIAkJc25kX3ByaW50ayhLRVJOX0lORk8gImVtdTEwMTA6IExvYWRpbmcgQXVkaW8gRG9jayBGaXJtd2FyZVxuIik7CiAJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCAgRU1VX0hBTkFfRlBHQV9DT05GSUcsIEVNVV9IQU5BX0ZQR0FfQ09ORklHX0FVRElPRE9DSyApOwotCQlpZiAoKGVyciA9IHNuZF9lbXUxMDEwX2xvYWRfZmlybXdhcmUoZW11LCBkb2NrX2ZpbGVuYW1lKSkgIT0gMCkgeworCQlpZiAoKGVyciA9IHNuZF9lbXUxMDEwX2xvYWRfZmlybXdhcmUoZW11LCBET0NLX0ZJTEVOQU1FKSkgIT0gMCkgewogCQkJcmV0dXJuIGVycjsKIAkJfQogCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgIEVNVV9IQU5BX0ZQR0FfQ09ORklHLCAwICk7CkBAIC0xMjE2LDYgKzEyMjEsMTUgQEAKIAkgLnNwaV9kYWMgPSAxLAogCSAuaTJjX2FkYyA9IDEsCiAJIC5zcGs3MSA9IDF9ICwKKwl7LnZlbmRvciA9IDB4MTEwMiwgLmRldmljZSA9IDB4MDAwOCwgLnN1YnN5c3RlbSA9IDB4NDIwMTExMDIsCisJIC5kcml2ZXIgPSAiQXVkaWd5MiIsIC5uYW1lID0gIkUtbXUgMTAxMCBOb3RlYm9vayBbTUFFTTg5NTBdIiwgCisJIC5pZCA9ICJFTVUxMDEwIiwKKwkgLmVtdTEwazJfY2hpcCA9IDEsCisJIC5jYTAxMDhfY2hpcCA9IDEsCisJIC5jYV9jYXJkYnVzX2NoaXAgPSAxLAorCSAuc3BpX2RhYyA9IDEsCisJIC5pMmNfYWRjID0gMSwKKwkgLnNwazcxID0gMX0gLAogCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDA4LCAKIAkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiQXVkaWd5IDIgVmFsdWUgW1Vua25vd25dIiwgCiAJIC5pZCA9ICJBdWRpZ3kyIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYwppbmRleCA0NjVmOGQ1Li43ZWUxOWM2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvcDE2di5jCkBAIC00MzMsNyArNDMzLDYgQEAKIAlzdHJ1Y3Qgc25kX2VtdTEwazFfcGNtICplcGNtOwogCWludCBjaGFubmVsOwogCWludCByZXN1bHQgPSAwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKICAgICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzOwogCXUzMiBiYXNpYyA9IDA7CiAJdTMyIGludGUgPSAwOwpAQCAtNDQ4LDggKzQ0Nyw3IEBACiAJCXJ1bm5pbmcgPSAwOwogCQlicmVhazsKIAl9Ci0gICAgICAgIHNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLSAgICAgICAgICAgICAgICBzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKyAgICAgICAgc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKIAkJcnVudGltZSA9IHMtPnJ1bnRpbWU7CiAJCWVwY20gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJCWNoYW5uZWwgPSBzdWJzdHJlYW0tPnBjbS0+ZGV2aWNlLWVtdS0+cDE2dl9kZXZpY2Vfb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VuczEzNzAuYyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKaW5kZXggNDI1YjE2Ny4uNmEwZGRjZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VuczEzNzAuYworKysgYi9zb3VuZC9wY2kvZW5zMTM3MC5jCkBAIC03OTgsMTAgKzc5OCw4IEBACiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgogCXsKIAkJdW5zaWduZWQgaW50IHdoYXQgPSAwOwotCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKLQkJc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgewotCQkJcyA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7CisJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CiAJCQlpZiAocyA9PSBlbnNvbmlxLT5wbGF5YmFjazFfc3Vic3RyZWFtKSB7CiAJCQkJd2hhdCB8PSBFU19QMV9QQVVTRTsKIAkJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOwpAQCAtODI0LDEwICs4MjIsOCBAQAogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKIAl7CiAJCXVuc2lnbmVkIGludCB3aGF0ID0gMDsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7Ci0JCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLQkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQkJaWYgKHMgPT0gZW5zb25pcS0+cGxheWJhY2sxX3N1YnN0cmVhbSkgewogCQkJCXdoYXQgfD0gRVNfREFDMV9FTjsKIAkJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTk2OC5jIGIvc291bmQvcGNpL2VzMTk2OC5jCmluZGV4IGRjODRjMTguLjJmYWYwMDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lczE5NjguYworKysgYi9zb3VuZC9wY2kvZXMxOTY4LmMKQEAgLTE1NTQsMTAgKzE1NTQsNyBAQAogCXJ1bnRpbWUtPmh3ID0gc25kX2VzMTk2OF9wbGF5YmFjazsKIAlydW50aW1lLT5ody5idWZmZXJfYnl0ZXNfbWF4ID0gcnVudGltZS0+aHcucGVyaW9kX2J5dGVzX21heCA9CiAJCWNhbGNfYXZhaWxhYmxlX21lbW9yeV9zaXplKGNoaXApOwotI2lmIDAKLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLAotCQkJCSAgIDEwMjQpOwotI2VuZGlmCisKIAlzcGluX2xvY2tfaXJxKCZjaGlwLT5zdWJzdHJlYW1fbG9jayk7CiAJbGlzdF9hZGQoJmVzLT5saXN0LCAmY2hpcC0+c3Vic3RyZWFtX2xpc3QpOwogCXNwaW5fdW5sb2NrX2lycSgmY2hpcC0+c3Vic3RyZWFtX2xvY2spOwpAQCAtMTYxMywxMCArMTYxMCw4IEBACiAJcnVudGltZS0+aHcgPSBzbmRfZXMxOTY4X2NhcHR1cmU7CiAJcnVudGltZS0+aHcuYnVmZmVyX2J5dGVzX21heCA9IHJ1bnRpbWUtPmh3LnBlcmlvZF9ieXRlc19tYXggPQogCQljYWxjX2F2YWlsYWJsZV9tZW1vcnlfc2l6ZShjaGlwKSAtIDEwMjQ7IC8qIGtlZXAgTUlYQlVGIHNpemUgKi8KLSNpZiAwCi0Jc25kX3BjbV9od19jb25zdHJhaW50X3N0ZXAocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKLQkJCQkgICAxMDI0KTsKLSNlbmRpZgorCXNuZF9wY21faHdfY29uc3RyYWludF9wb3cyKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMpOworCiAJc3Bpbl9sb2NrX2lycSgmY2hpcC0+c3Vic3RyZWFtX2xvY2spOwogCWxpc3RfYWRkKCZlcy0+bGlzdCwgJmNoaXAtPnN1YnN0cmVhbV9saXN0KTsKIAlzcGluX3VubG9ja19pcnEoJmNoaXAtPnN1YnN0cmVhbV9sb2NrKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCmluZGV4IDYwZDdiMDUuLmIyNDg0YmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKKysrIGIvc291bmQvcGNpL2hkYS9NYWtlZmlsZQpAQCAtMSw1ICsxLDggQEAKIHNuZC1oZGEtaW50ZWwtb2JqcyA6PSBoZGFfaW50ZWwubwotc25kLWhkYS1jb2RlYy1vYmpzIDo9IGhkYV9jb2RlYy5vIFwKKyMgc2luY2Ugc25kLWhkYS1pbnRlbCBpcyB0aGUgb25seSBkcml2ZXIgdXNpbmcgaGRhLWNvZGVjLAorIyBtZXJnZSBpdCBpbnRvIGEgc2luZ2xlIG1vZHVsZSBhbHRob3VnaCBpdCB3YXMgb3JpZ2luYWxseQorIyBkZXNpZ25lZCB0byBiZSBpbmRpdmlkdWFsIG1vZHVsZXMKK3NuZC1oZGEtaW50ZWwtb2JqcyArPSBoZGFfY29kZWMubyBcCiAJaGRhX2dlbmVyaWMubyBcCiAJcGF0Y2hfcmVhbHRlay5vIFwKIAlwYXRjaF9jbWVkaWEubyBcCkBAIC0xMCw3ICsxMyw3IEBACiAJcGF0Y2hfY29uZXhhbnQubyBcCiAJcGF0Y2hfdmlhLm8KIGlmZGVmIENPTkZJR19QUk9DX0ZTCi1zbmQtaGRhLWNvZGVjLW9ianMgKz0gaGRhX3Byb2Mubworc25kLWhkYS1pbnRlbC1vYmpzICs9IGhkYV9wcm9jLm8KIGVuZGlmCiAKLW9iai0kKENPTkZJR19TTkRfSERBX0lOVEVMKSArPSBzbmQtaGRhLWludGVsLm8gc25kLWhkYS1jb2RlYy5vCitvYmotJChDT05GSUdfU05EX0hEQV9JTlRFTCkgKz0gc25kLWhkYS1pbnRlbC5vCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwppbmRleCA4ZjM0ZmI0Li4xNDY0OWQ1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgImhkYV9jb2RlYy5oIgpAQCAtMzQsMTEgKzMzLDYgQEAKICNpbmNsdWRlICJoZGFfbG9jYWwuaCIKIAogCi1NT0RVTEVfQVVUSE9SKCJUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlVuaXZlcnNhbCBpbnRlcmZhY2UgZm9yIEhpZ2ggRGVmaW5pdGlvbiBBdWRpbyBDb2RlYyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0KIC8qCiAgKiB2ZW5kb3IgLyBwcmVzZXQgdGFibGUKICAqLwpAQCAtNzcsMTIgKzcxLDEzIEBACiAgKgogICogUmV0dXJucyB0aGUgb2J0YWluZWQgcmVzcG9uc2UgdmFsdWUsIG9yIC0xIGZvciBhbiBlcnJvci4KICAqLwotdW5zaWduZWQgaW50IHNuZF9oZGFfY29kZWNfcmVhZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpcmVjdCwKK3Vuc2lnbmVkIGludCBzbmRfaGRhX2NvZGVjX3JlYWQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkJaW50IGRpcmVjdCwKIAkJCQl1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcm0pCiB7CiAJdW5zaWduZWQgaW50IHJlczsKIAltdXRleF9sb2NrKCZjb2RlYy0+YnVzLT5jbWRfbXV0ZXgpOwotCWlmICghIGNvZGVjLT5idXMtPm9wcy5jb21tYW5kKGNvZGVjLCBuaWQsIGRpcmVjdCwgdmVyYiwgcGFybSkpCisJaWYgKCFjb2RlYy0+YnVzLT5vcHMuY29tbWFuZChjb2RlYywgbmlkLCBkaXJlY3QsIHZlcmIsIHBhcm0pKQogCQlyZXMgPSBjb2RlYy0+YnVzLT5vcHMuZ2V0X3Jlc3BvbnNlKGNvZGVjKTsKIAllbHNlCiAJCXJlcyA9ICh1bnNpZ25lZCBpbnQpLTE7CkBAIC05MCw4ICs4NSw2IEBACiAJcmV0dXJuIHJlczsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfaGRhX2NvZGVjX3JlYWQpOwotCiAvKioKICAqIHNuZF9oZGFfY29kZWNfd3JpdGUgLSBzZW5kIGEgc2luZ2xlIGNvbW1hbmQgd2l0aG91dCB3YWl0aW5nIGZvciByZXNwb25zZQogICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCkBAIC0xMTQsOCArMTA3LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1FWFBPUlRfU1lNQk9MKHNuZF9oZGFfY29kZWNfd3JpdGUpOwotCiAvKioKICAqIHNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUgLSBzZXF1ZW5jZSB3cml0ZXMKICAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYwpAQCAtMTMwLDggKzEyMSw2IEBACiAJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNlcS0+bmlkLCAwLCBzZXEtPnZlcmIsIHNlcS0+cGFyYW0pOwogfQogCi1FWFBPUlRfU1lNQk9MKHNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUpOwotCiAvKioKICAqIHNuZF9oZGFfZ2V0X3N1Yl9ub2RlcyAtIGdldCB0aGUgcmFuZ2Ugb2Ygc3ViIG5vZGVzCiAgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKQEAgLTE0MSw3ICsxMzAsOCBAQAogICogUGFyc2UgdGhlIE5JRCBhbmQgc3RvcmUgdGhlIHN0YXJ0IE5JRCBvZiBpdHMgc3ViLW5vZGVzLgogICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1Yi1ub2Rlcy4KICAqLwotaW50IHNuZF9oZGFfZ2V0X3N1Yl9ub2RlcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaGRhX25pZF90ICpzdGFydF9pZCkKK2ludCBzbmRfaGRhX2dldF9zdWJfbm9kZXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgIGhkYV9uaWRfdCAqc3RhcnRfaWQpCiB7CiAJdW5zaWduZWQgaW50IHBhcm07CiAKQEAgLTE1MCw4ICsxNDAsNiBAQAogCXJldHVybiAoaW50KShwYXJtICYgMHg3ZmZmKTsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfaGRhX2dldF9zdWJfbm9kZXMpOwotCiAvKioKICAqIHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zIC0gZ2V0IGNvbm5lY3Rpb24gbGlzdAogICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCkBAIC0xODcsMTIgKzE3NSwxMyBAQAogCWNvbm5fbGVuID0gcGFybSAmIEFDX0NMSVNUX0xFTkdUSDsKIAltYXNrID0gKDEgPDwgKHNoaWZ0LTEpKSAtIDE7CiAKLQlpZiAoISBjb25uX2xlbikKKwlpZiAoIWNvbm5fbGVuKQogCQlyZXR1cm4gMDsgLyogbm8gY29ubmVjdGlvbiAqLwogCiAJaWYgKGNvbm5fbGVuID09IDEpIHsKIAkJLyogc2luZ2xlIGNvbm5lY3Rpb24gKi8KLQkJcGFybSA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9DT05ORUNUX0xJU1QsIDApOworCQlwYXJtID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJCSAgQUNfVkVSQl9HRVRfQ09OTkVDVF9MSVNULCAwKTsKIAkJY29ubl9saXN0WzBdID0gcGFybSAmIG1hc2s7CiAJCXJldHVybiAxOwogCX0KQEAgLTIwNywxOCArMTk2LDIxIEBACiAJCWlmIChpICUgbnVtX2VsZW1zID09IDApCiAJCQlwYXJtID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCiAJCQkJCQkgIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfTElTVCwgaSk7Ci0JCXJhbmdlX3ZhbCA9ICEhIChwYXJtICYgKDEgPDwgKHNoaWZ0LTEpKSk7IC8qIHJhbmdlcyAqLworCQlyYW5nZV92YWwgPSAhIShwYXJtICYgKDEgPDwgKHNoaWZ0LTEpKSk7IC8qIHJhbmdlcyAqLwogCQl2YWwgPSBwYXJtICYgbWFzazsKIAkJcGFybSA+Pj0gc2hpZnQ7CiAJCWlmIChyYW5nZV92YWwpIHsKIAkJCS8qIHJhbmdlcyBiZXR3ZWVuIHRoZSBwcmV2aW91cyBhbmQgdGhpcyBvbmUgKi8KLQkJCWlmICghIHByZXZfbmlkIHx8IHByZXZfbmlkID49IHZhbCkgewotCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6IGludmFsaWQgZGVwX3JhbmdlX3ZhbCAleDoleFxuIiwgcHJldl9uaWQsIHZhbCk7CisJCQlpZiAoIXByZXZfbmlkIHx8IHByZXZfbmlkID49IHZhbCkgeworCQkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICJoZGFfY29kZWM6ICIKKwkJCQkJICAgImludmFsaWQgZGVwX3JhbmdlX3ZhbCAleDoleFxuIiwKKwkJCQkJICAgcHJldl9uaWQsIHZhbCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlmb3IgKG4gPSBwcmV2X25pZCArIDE7IG4gPD0gdmFsOyBuKyspIHsKIAkJCQlpZiAoY29ubnMgPj0gbWF4X2Nvbm5zKSB7Ci0JCQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIlRvbyBtYW55IGNvbm5lY3Rpb25zXG4iKTsKKwkJCQkJc25kX3ByaW50ayhLRVJOX0VSUgorCQkJCQkJICAgIlRvbyBtYW55IGNvbm5lY3Rpb25zXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQogCQkJCWNvbm5fbGlzdFtjb25ucysrXSA9IG47CkBAIC0yNTMsNyArMjQ1LDggQEAKIAlzdHJ1Y3QgaGRhX2J1c191bnNvbGljaXRlZCAqdW5zb2w7CiAJdW5zaWduZWQgaW50IHdwOwogCi0JaWYgKCh1bnNvbCA9IGJ1cy0+dW5zb2wpID09IE5VTEwpCisJdW5zb2wgPSBidXMtPnVuc29sOworCWlmICghdW5zb2wpCiAJCXJldHVybiAwOwogCiAJd3AgPSAodW5zb2wtPndwICsgMSkgJSBIREFfVU5TT0xfUVVFVUVfU0laRTsKQEAgLTI2OCw4ICsyNjEsNiBAQAogCXJldHVybiAwOwogfQogCi1FWFBPUlRfU1lNQk9MKHNuZF9oZGFfcXVldWVfdW5zb2xfZXZlbnQpOwotCiAvKgogICogcHJvY2VzcyBxdWV1ZXVkIHVuc29saWNpdGVkIGV2ZW50cwogICovCkBAIC0yODcsNyArMjc4LDcgQEAKIAkJcnAgPDw9IDE7CiAJCXJlcyA9IHVuc29sLT5xdWV1ZVtycF07CiAJCWNhZGRyID0gdW5zb2wtPnF1ZXVlW3JwICsgMV07Ci0JCWlmICghIChjYWRkciAmICgxIDw8IDQpKSkgLyogbm8gdW5zb2xpY2l0ZWQgZXZlbnQ/ICovCisJCWlmICghKGNhZGRyICYgKDEgPDwgNCkpKSAvKiBubyB1bnNvbGljaXRlZCBldmVudD8gKi8KIAkJCWNvbnRpbnVlOwogCQljb2RlYyA9IGJ1cy0+Y2FkZHJfdGJsW2NhZGRyICYgMHgwZl07CiAJCWlmIChjb2RlYyAmJiBjb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50KQpAQCAtMjk4LDcgKzI4OSw3IEBACiAvKgogICogaW5pdGlhbGl6ZSB1bnNvbGljaXRlZCBxdWV1ZQogICovCi1zdGF0aWMgaW50IGluaXRfdW5zb2xfcXVldWUoc3RydWN0IGhkYV9idXMgKmJ1cykKK3N0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfdW5zb2xfcXVldWUoc3RydWN0IGhkYV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgaGRhX2J1c191bnNvbGljaXRlZCAqdW5zb2w7CiAKQEAgLTMwNiw4ICsyOTcsOSBAQAogCQlyZXR1cm4gMDsKIAogCXVuc29sID0ga3phbGxvYyhzaXplb2YoKnVuc29sKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEgdW5zb2wpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW4ndCBhbGxvY2F0ZSB1bnNvbGljaXRlZCBxdWV1ZVxuIik7CisJaWYgKCF1bnNvbCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6ICIKKwkJCSAgICJjYW4ndCBhbGxvY2F0ZSB1bnNvbGljaXRlZCBxdWV1ZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlJTklUX1dPUksoJnVuc29sLT53b3JrLCBwcm9jZXNzX3Vuc29sX2V2ZW50cyk7CkBAIC0zMjMsMTYgKzMxNSwxNSBAQAogCiBzdGF0aWMgaW50IHNuZF9oZGFfYnVzX2ZyZWUoc3RydWN0IGhkYV9idXMgKmJ1cykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgKm47CiAKLQlpZiAoISBidXMpCisJaWYgKCFidXMpCiAJCXJldHVybiAwOwogCWlmIChidXMtPnVuc29sKSB7CiAJCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAJCWtmcmVlKGJ1cy0+dW5zb2wpOwogCX0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJmJ1cy0+Y29kZWNfbGlzdCkgewotCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhkYV9jb2RlYywgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvZGVjLCBuLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7CiAJCXNuZF9oZGFfY29kZWNfZnJlZShjb2RlYyk7CiAJfQogCWlmIChidXMtPm9wcy5wcml2YXRlX2ZyZWUpCkBAIC0zNTUsOCArMzQ2LDkgQEAKICAqCiAgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgogICovCi1pbnQgc25kX2hkYV9idXNfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgY29uc3Qgc3RydWN0IGhkYV9idXNfdGVtcGxhdGUgKnRlbXAsCi0JCSAgICBzdHJ1Y3QgaGRhX2J1cyAqKmJ1c3ApCitpbnQgX19kZXZpbml0IHNuZF9oZGFfYnVzX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgaGRhX2J1c190ZW1wbGF0ZSAqdGVtcCwKKwkJCSAgICAgIHN0cnVjdCBoZGFfYnVzICoqYnVzcCkKIHsKIAlzdHJ1Y3QgaGRhX2J1cyAqYnVzOwogCWludCBlcnI7CkBAIC0zODUsNyArMzc3LDggQEAKIAltdXRleF9pbml0KCZidXMtPmNtZF9tdXRleCk7CiAJSU5JVF9MSVNUX0hFQUQoJmJ1cy0+Y29kZWNfbGlzdCk7CiAKLQlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9CVVMsIGJ1cywgJmRldl9vcHMpKSA8IDApIHsKKwllcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfQlVTLCBidXMsICZkZXZfb3BzKTsKKwlpZiAoZXJyIDwgMCkgewogCQlzbmRfaGRhX2J1c19mcmVlKGJ1cyk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMzk0LDIyICszODcsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfaGRhX2J1c19uZXcpOwotCiAvKgogICogZmluZCBhIG1hdGNoaW5nIGNvZGVjIHByZXNldAogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgKmZpbmRfY29kZWNfcHJlc2V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQorc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IF9fZGV2aW5pdCAqCitmaW5kX2NvZGVjX3ByZXNldChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAljb25zdCBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCAqKnRibCwgKnByZXNldDsKIAorCWlmIChjb2RlYy0+YnVzLT5tb2RlbG5hbWUgJiYgIXN0cmNtcChjb2RlYy0+YnVzLT5tb2RlbG5hbWUsICJnZW5lcmljIikpCisJCXJldHVybiBOVUxMOyAvKiB1c2UgdGhlIGdlbmVyaWMgcGFyc2VyICovCisKIAlmb3IgKHRibCA9IGhkYV9wcmVzZXRfdGFibGVzOyAqdGJsOyB0YmwrKykgewogCQlmb3IgKHByZXNldCA9ICp0Ymw7IHByZXNldC0+aWQ7IHByZXNldCsrKSB7CiAJCQl1MzIgbWFzayA9IHByZXNldC0+bWFzazsKLQkJCWlmICghIG1hc2spCisJCQlpZiAoIW1hc2spCiAJCQkJbWFzayA9IH4wOwogCQkJaWYgKHByZXNldC0+aWQgPT0gKGNvZGVjLT52ZW5kb3JfaWQgJiBtYXNrKSAmJgotCQkJICAgICghIHByZXNldC0+cmV2IHx8CisJCQkgICAgKCFwcmVzZXQtPnJldiB8fAogCQkJICAgICBwcmVzZXQtPnJldiA9PSBjb2RlYy0+cmV2aXNpb25faWQpKQogCQkJCXJldHVybiBwcmVzZXQ7CiAJCX0KQEAgLTQzNCwyNyArNDI5LDMwIEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAoISB2ZW5kb3IpIHsKKwlpZiAoIXZlbmRvcikgewogCQlzcHJpbnRmKHRtcCwgIkdlbmVyaWMgJTA0eCIsIHZlbmRvcl9pZCk7CiAJCXZlbmRvciA9IHRtcDsKIAl9CiAJaWYgKGNvZGVjLT5wcmVzZXQgJiYgY29kZWMtPnByZXNldC0+bmFtZSkKIAkJc25wcmludGYobmFtZSwgbmFtZWxlbiwgIiVzICVzIiwgdmVuZG9yLCBjb2RlYy0+cHJlc2V0LT5uYW1lKTsKIAllbHNlCi0JCXNucHJpbnRmKG5hbWUsIG5hbWVsZW4sICIlcyBJRCAleCIsIHZlbmRvciwgY29kZWMtPnZlbmRvcl9pZCAmIDB4ZmZmZik7CisJCXNucHJpbnRmKG5hbWUsIG5hbWVsZW4sICIlcyBJRCAleCIsIHZlbmRvciwKKwkJCSBjb2RlYy0+dmVuZG9yX2lkICYgMHhmZmZmKTsKIH0KIAogLyoKICAqIGxvb2sgZm9yIGFuIEFGRyBhbmQgTUZHIG5vZGVzCiAgKi8KLXN0YXRpYyB2b2lkIHNldHVwX2ZnX25vZGVzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQorc3RhdGljIHZvaWQgX19kZXZpbml0IHNldHVwX2ZnX25vZGVzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCWludCBpLCB0b3RhbF9ub2RlczsKIAloZGFfbmlkX3QgbmlkOwogCiAJdG90YWxfbm9kZXMgPSBzbmRfaGRhX2dldF9zdWJfbm9kZXMoY29kZWMsIEFDX05PREVfUk9PVCwgJm5pZCk7CiAJZm9yIChpID0gMDsgaSA8IHRvdGFsX25vZGVzOyBpKyssIG5pZCsrKSB7Ci0JCXN3aXRjaCgoc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9GVU5DVElPTl9UWVBFKSAmIDB4ZmYpKSB7CisJCXVuc2lnbmVkIGludCBmdW5jOworCQlmdW5jID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9GVU5DVElPTl9UWVBFKTsKKwkJc3dpdGNoIChmdW5jICYgMHhmZikgewogCQljYXNlIEFDX0dSUF9BVURJT19GVU5DVElPTjoKIAkJCWNvZGVjLT5hZmcgPSBuaWQ7CiAJCQlicmVhazsKQEAgLTQ3OCw3ICs0NzYsNyBAQAogCWNvZGVjLT5udW1fbm9kZXMgPSBzbmRfaGRhX2dldF9zdWJfbm9kZXMoY29kZWMsIGZnX25vZGUsCiAJCQkJCQkgJmNvZGVjLT5zdGFydF9uaWQpOwogCWNvZGVjLT53Y2FwcyA9IGttYWxsb2MoY29kZWMtPm51bV9ub2RlcyAqIDQsIEdGUF9LRVJORUwpOwotCWlmICghIGNvZGVjLT53Y2FwcykKKwlpZiAoIWNvZGVjLT53Y2FwcykKIAkJcmV0dXJuIC1FTk9NRU07CiAJbmlkID0gY29kZWMtPnN0YXJ0X25pZDsKIAlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPm51bV9ub2RlczsgaSsrLCBuaWQrKykKQEAgLTQ5Myw3ICs0OTEsNyBAQAogICovCiBzdGF0aWMgdm9pZCBzbmRfaGRhX2NvZGVjX2ZyZWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0JaWYgKCEgY29kZWMpCisJaWYgKCFjb2RlYykKIAkJcmV0dXJuOwogCWxpc3RfZGVsKCZjb2RlYy0+bGlzdCk7CiAJY29kZWMtPmJ1cy0+Y2FkZHJfdGJsW2NvZGVjLT5hZGRyXSA9IE5VTEw7CkBAIC01MTQsOCArNTEyLDggQEAKICAqCiAgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgogICovCi1pbnQgc25kX2hkYV9jb2RlY19uZXcoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGNvZGVjX2FkZHIsCi0JCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCitpbnQgX19kZXZpbml0IHNuZF9oZGFfY29kZWNfbmV3KHN0cnVjdCBoZGFfYnVzICpidXMsIHVuc2lnbmVkIGludCBjb2RlY19hZGRyLAorCQkJCXN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7CiAJY2hhciBjb21wb25lbnRbMTNdOwpAQCAtNTI1LDcgKzUyMyw4IEBACiAJc25kX2Fzc2VydChjb2RlY19hZGRyIDw9IEhEQV9NQVhfQ09ERUNfQUREUkVTUywgcmV0dXJuIC1FSU5WQUwpOwogCiAJaWYgKGJ1cy0+Y2FkZHJfdGJsW2NvZGVjX2FkZHJdKSB7Ci0JCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogYWRkcmVzcyAweCV4IGlzIGFscmVhZHkgb2NjdXBpZWRcbiIsIGNvZGVjX2FkZHIpOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJoZGFfY29kZWM6ICIKKwkJCSAgICJhZGRyZXNzIDB4JXggaXMgYWxyZWFkeSBvY2N1cGllZFxuIiwgY29kZWNfYWRkcik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC01NDMsMTggKzU0MiwyMSBAQAogCWxpc3RfYWRkX3RhaWwoJmNvZGVjLT5saXN0LCAmYnVzLT5jb2RlY19saXN0KTsKIAlidXMtPmNhZGRyX3RibFtjb2RlY19hZGRyXSA9IGNvZGVjOwogCi0JY29kZWMtPnZlbmRvcl9pZCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgQUNfTk9ERV9ST09ULCBBQ19QQVJfVkVORE9SX0lEKTsKKwljb2RlYy0+dmVuZG9yX2lkID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBBQ19OT0RFX1JPT1QsCisJCQkJCSAgICAgIEFDX1BBUl9WRU5ET1JfSUQpOwogCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IC0xKQogCQkvKiByZWFkIGFnYWluLCBob3BlZnVsbHkgdGhlIGFjY2VzcyBtZXRob2Qgd2FzIGNvcnJlY3RlZAogCQkgKiBpbiB0aGUgbGFzdCByZWFkLi4uCiAJCSAqLwogCQljb2RlYy0+dmVuZG9yX2lkID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBBQ19OT0RFX1JPT1QsCiAJCQkJCQkgICAgICBBQ19QQVJfVkVORE9SX0lEKTsKLQljb2RlYy0+c3Vic3lzdGVtX2lkID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBBQ19OT0RFX1JPT1QsIEFDX1BBUl9TVUJTWVNURU1fSUQpOwotCWNvZGVjLT5yZXZpc2lvbl9pZCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgQUNfTk9ERV9ST09ULCBBQ19QQVJfUkVWX0lEKTsKKwljb2RlYy0+c3Vic3lzdGVtX2lkID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBBQ19OT0RFX1JPT1QsCisJCQkJCQkgQUNfUEFSX1NVQlNZU1RFTV9JRCk7CisJY29kZWMtPnJldmlzaW9uX2lkID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBBQ19OT0RFX1JPT1QsCisJCQkJCQlBQ19QQVJfUkVWX0lEKTsKIAogCXNldHVwX2ZnX25vZGVzKGNvZGVjKTsKLQlpZiAoISBjb2RlYy0+YWZnICYmICEgY29kZWMtPm1mZykgeworCWlmICghY29kZWMtPmFmZyAmJiAhY29kZWMtPm1mZykgewogCQlzbmRfcHJpbnRkZCgiaGRhX2NvZGVjOiBubyBBRkcgb3IgTUZHIG5vZGUgZm91bmRcbiIpOwogCQlzbmRfaGRhX2NvZGVjX2ZyZWUoY29kZWMpOwogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTU2NiwxNSArNTY4LDE2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWlmICghIGNvZGVjLT5zdWJzeXN0ZW1faWQpIHsKKwlpZiAoIWNvZGVjLT5zdWJzeXN0ZW1faWQpIHsKIAkJaGRhX25pZF90IG5pZCA9IGNvZGVjLT5hZmcgPyBjb2RlYy0+YWZnIDogY29kZWMtPm1mZzsKLQkJY29kZWMtPnN1YnN5c3RlbV9pZCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAotCQkJCQkJCSBBQ19WRVJCX0dFVF9TVUJTWVNURU1fSUQsCi0JCQkJCQkJIDApOworCQljb2RlYy0+c3Vic3lzdGVtX2lkID0KKwkJCXNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLAorCQkJCQkgICBBQ19WRVJCX0dFVF9TVUJTWVNURU1fSUQsIDApOwogCX0KIAogCWNvZGVjLT5wcmVzZXQgPSBmaW5kX2NvZGVjX3ByZXNldChjb2RlYyk7Ci0JaWYgKCEgKmJ1cy0+Y2FyZC0+bWl4ZXJuYW1lKQorCS8qIGF1ZGlvIGNvZGVjIHNob3VsZCBvdmVycmlkZSB0aGUgbWl4ZXIgbmFtZSAqLworCWlmIChjb2RlYy0+YWZnIHx8ICEqYnVzLT5jYXJkLT5taXhlcm5hbWUpCiAJCXNuZF9oZGFfZ2V0X2NvZGVjX25hbWUoY29kZWMsIGJ1cy0+Y2FyZC0+bWl4ZXJuYW1lLAogCQkJCSAgICAgICBzaXplb2YoYnVzLT5jYXJkLT5taXhlcm5hbWUpKTsKIApAQCAtNjAwLDggKzYwMyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0woc25kX2hkYV9jb2RlY19uZXcpOwotCiAvKioKICAqIHNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtIC0gc2V0IHVwIHRoZSBjb2RlYyBmb3Igc3RyZWFtaW5nCiAgKiBAY29kZWM6IHRoZSBDT0RFQyB0byBzZXQgdXAKQEAgLTYxMCwxMyArNjExLDE1IEBACiAgKiBAY2hhbm5lbF9pZDogY2hhbm5lbCBpZCB0byBwYXNzLCB6ZXJvIGJhc2VkLgogICogQGZvcm1hdDogc3RyZWFtIGZvcm1hdC4KICAqLwotdm9pZCBzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgdTMyIHN0cmVhbV90YWcsCit2b2lkIHNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJCXUzMiBzdHJlYW1fdGFnLAogCQkJCWludCBjaGFubmVsX2lkLCBpbnQgZm9ybWF0KQogewotCWlmICghIG5pZCkKKwlpZiAoIW5pZCkKIAkJcmV0dXJuOwogCi0Jc25kX3ByaW50ZGQoImhkYV9jb2RlY19zZXR1cF9zdHJlYW06IE5JRD0weCV4LCBzdHJlYW09MHgleCwgY2hhbm5lbD0lZCwgZm9ybWF0PTB4JXhcbiIsCisJc25kX3ByaW50ZGQoImhkYV9jb2RlY19zZXR1cF9zdHJlYW06ICIKKwkJICAgICJOSUQ9MHgleCwgc3RyZWFtPTB4JXgsIGNoYW5uZWw9JWQsIGZvcm1hdD0weCV4XG4iLAogCQkgICAgbmlkLCBzdHJlYW1fdGFnLCBjaGFubmVsX2lkLCBmb3JtYXQpOwogCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQ0hBTk5FTF9TVFJFQU1JRCwKIAkJCSAgICAoc3RyZWFtX3RhZyA8PCA0KSB8IGNoYW5uZWxfaWQpOwpAQCAtNjI0LDggKzYyNyw2IEBACiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9TVFJFQU1fRk9STUFULCBmb3JtYXQpOwogfQogCi1FWFBPUlRfU1lNQk9MKHNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKTsKLQogLyoKICAqIGFtcCBhY2Nlc3MgZnVuY3Rpb25zCiAgKi8KQEAgLTYzNiw3ICs2MzcsNyBAQAogI2RlZmluZSBJTkZPX0FNUF9WT0woY2gpCSgxIDw8ICgxICsgKGNoKSkpCiAKIC8qIGluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUgKi8KLXN0YXRpYyB2b2lkIGluaXRfYW1wX2hhc2goc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaW5pdF9hbXBfaGFzaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAltZW1zZXQoY29kZWMtPmFtcF9oYXNoLCAweGZmLCBzaXplb2YoY29kZWMtPmFtcF9oYXNoKSk7CiAJY29kZWMtPm51bV9hbXBfZW50cmllcyA9IDA7CkBAIC02NjIsMTUgKzY2MywxOCBAQAogCWlmIChjb2RlYy0+bnVtX2FtcF9lbnRyaWVzID49IGNvZGVjLT5hbXBfaW5mb19zaXplKSB7CiAJCS8qIHJlYWxsb2NhdGUgdGhlIGFycmF5ICovCiAJCWludCBuZXdfc2l6ZSA9IGNvZGVjLT5hbXBfaW5mb19zaXplICsgNjQ7Ci0JCXN0cnVjdCBoZGFfYW1wX2luZm8gKm5ld19pbmZvID0ga2NhbGxvYyhuZXdfc2l6ZSwgc2l6ZW9mKHN0cnVjdCBoZGFfYW1wX2luZm8pLAotCQkJCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoISBuZXdfaW5mbykgewotCQkJc25kX3ByaW50ayhLRVJOX0VSUiAiaGRhX2NvZGVjOiBjYW4ndCBtYWxsb2MgYW1wX2luZm9cbiIpOworCQlzdHJ1Y3QgaGRhX2FtcF9pbmZvICpuZXdfaW5mbzsKKwkJbmV3X2luZm8gPSBrY2FsbG9jKG5ld19zaXplLCBzaXplb2Yoc3RydWN0IGhkYV9hbXBfaW5mbyksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3X2luZm8pIHsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImhkYV9jb2RlYzogIgorCQkJCSAgICJjYW4ndCBtYWxsb2MgYW1wX2luZm9cbiIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJaWYgKGNvZGVjLT5hbXBfaW5mbykgewogCQkJbWVtY3B5KG5ld19pbmZvLCBjb2RlYy0+YW1wX2luZm8sCi0JCQkgICAgICAgY29kZWMtPmFtcF9pbmZvX3NpemUgKiBzaXplb2Yoc3RydWN0IGhkYV9hbXBfaW5mbykpOworCQkJICAgICAgIGNvZGVjLT5hbXBfaW5mb19zaXplICoKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGhkYV9hbXBfaW5mbykpOwogCQkJa2ZyZWUoY29kZWMtPmFtcF9pbmZvKTsKIAkJfQogCQljb2RlYy0+YW1wX2luZm9fc2l6ZSA9IG5ld19zaXplOwpAQCAtNjkxLDE1ICs2OTUsMTggQEAKICAqLwogc3RhdGljIHUzMiBxdWVyeV9hbXBfY2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpcmVjdGlvbikKIHsKLQlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvID0gZ2V0X2FsbG9jX2FtcF9oYXNoKGNvZGVjLCBIREFfSEFTSF9LRVkobmlkLCBkaXJlY3Rpb24sIDApKTsKKwlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvOwogCi0JaWYgKCEgaW5mbykKKwlpbmZvID0gZ2V0X2FsbG9jX2FtcF9oYXNoKGNvZGVjLCBIREFfSEFTSF9LRVkobmlkLCBkaXJlY3Rpb24sIDApKTsKKwlpZiAoIWluZm8pCiAJCXJldHVybiAwOwotCWlmICghIChpbmZvLT5zdGF0dXMgJiBJTkZPX0FNUF9DQVBTKSkgewotCQlpZiAoISAoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9BTVBfT1ZSRCkpCisJaWYgKCEoaW5mby0+c3RhdHVzICYgSU5GT19BTVBfQ0FQUykpIHsKKwkJaWYgKCEoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9BTVBfT1ZSRCkpCiAJCQluaWQgPSBjb2RlYy0+YWZnOwotCQlpbmZvLT5hbXBfY2FwcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBkaXJlY3Rpb24gPT0gSERBX09VVFBVVCA/Ci0JCQkJCQkgICAgQUNfUEFSX0FNUF9PVVRfQ0FQIDogQUNfUEFSX0FNUF9JTl9DQVApOworCQlpbmZvLT5hbXBfY2FwcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLAorCQkJCQkJICAgIGRpcmVjdGlvbiA9PSBIREFfT1VUUFVUID8KKwkJCQkJCSAgICBBQ19QQVJfQU1QX09VVF9DQVAgOgorCQkJCQkJICAgIEFDX1BBUl9BTVBfSU5fQ0FQKTsKIAkJaW5mby0+c3RhdHVzIHw9IElORk9fQU1QX0NBUFM7CiAJfQogCXJldHVybiBpbmZvLT5hbXBfY2FwczsKQEAgLTcwOSw4ICs3MTYsOSBAQAogICogcmVhZCB0aGUgY3VycmVudCB2b2x1bWUgdG8gaW5mbwogICogaWYgdGhlIGNhY2hlIGV4aXN0cywgcmVhZCB0aGUgY2FjaGUgdmFsdWUuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X3ZvbF9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvLAotCQkJIGhkYV9uaWRfdCBuaWQsIGludCBjaCwgaW50IGRpcmVjdGlvbiwgaW50IGluZGV4KQorc3RhdGljIHVuc2lnbmVkIGludCBnZXRfdm9sX211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJIHN0cnVjdCBoZGFfYW1wX2luZm8gKmluZm8sIGhkYV9uaWRfdCBuaWQsCisJCQkJIGludCBjaCwgaW50IGRpcmVjdGlvbiwgaW50IGluZGV4KQogewogCXUzMiB2YWwsIHBhcm07CiAKQEAgLTcyMCw3ICs3MjgsOCBAQAogCXBhcm0gPSBjaCA/IEFDX0FNUF9HRVRfUklHSFQgOiBBQ19BTVBfR0VUX0xFRlQ7CiAJcGFybSB8PSBkaXJlY3Rpb24gPT0gSERBX09VVFBVVCA/IEFDX0FNUF9HRVRfT1VUUFVUIDogQUNfQU1QX0dFVF9JTlBVVDsKIAlwYXJtIHw9IGluZGV4OwotCXZhbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9BTVBfR0FJTl9NVVRFLCBwYXJtKTsKKwl2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKKwkJCQkgQUNfVkVSQl9HRVRfQU1QX0dBSU5fTVVURSwgcGFybSk7CiAJaW5mby0+dm9sW2NoXSA9IHZhbCAmIDB4ZmY7CiAJaW5mby0+c3RhdHVzIHw9IElORk9fQU1QX1ZPTChjaCk7CiAJcmV0dXJuIGluZm8tPnZvbFtjaF07CkBAIC03MzAsNyArNzM5LDggQEAKICAqIHdyaXRlIHRoZSBjdXJyZW50IHZvbHVtZSBpbiBpbmZvIHRvIHRoZSBoL3cgYW5kIHVwZGF0ZSB0aGUgY2FjaGUKICAqLwogc3RhdGljIHZvaWQgcHV0X3ZvbF9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvLAotCQkJIGhkYV9uaWRfdCBuaWQsIGludCBjaCwgaW50IGRpcmVjdGlvbiwgaW50IGluZGV4LCBpbnQgdmFsKQorCQkJIGhkYV9uaWRfdCBuaWQsIGludCBjaCwgaW50IGRpcmVjdGlvbiwgaW50IGluZGV4LAorCQkJIGludCB2YWwpCiB7CiAJdTMyIHBhcm07CiAKQEAgLTc0OCw4ICs3NTgsOSBAQAogaW50IHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBjaCwKIAkJCSAgIGludCBkaXJlY3Rpb24sIGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvID0gZ2V0X2FsbG9jX2FtcF9oYXNoKGNvZGVjLCBIREFfSEFTSF9LRVkobmlkLCBkaXJlY3Rpb24sIGluZGV4KSk7Ci0JaWYgKCEgaW5mbykKKwlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvOworCWluZm8gPSBnZXRfYWxsb2NfYW1wX2hhc2goY29kZWMsIEhEQV9IQVNIX0tFWShuaWQsIGRpcmVjdGlvbiwgaW5kZXgpKTsKKwlpZiAoIWluZm8pCiAJCXJldHVybiAwOwogCXJldHVybiBnZXRfdm9sX211dGUoY29kZWMsIGluZm8sIG5pZCwgY2gsIGRpcmVjdGlvbiwgaW5kZXgpOwogfQpAQCAtNzYwLDEzICs3NzEsMTQgQEAKIGludCBzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBjaCwKIAkJCSAgICAgaW50IGRpcmVjdGlvbiwgaW50IGlkeCwgaW50IG1hc2ssIGludCB2YWwpCiB7Ci0Jc3RydWN0IGhkYV9hbXBfaW5mbyAqaW5mbyA9IGdldF9hbGxvY19hbXBfaGFzaChjb2RlYywgSERBX0hBU0hfS0VZKG5pZCwgZGlyZWN0aW9uLCBpZHgpKTsKKwlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvOwogCi0JaWYgKCEgaW5mbykKKwlpbmZvID0gZ2V0X2FsbG9jX2FtcF9oYXNoKGNvZGVjLCBIREFfSEFTSF9LRVkobmlkLCBkaXJlY3Rpb24sIGlkeCkpOworCWlmICghaW5mbykKIAkJcmV0dXJuIDA7CiAJdmFsICY9IG1hc2s7CiAJdmFsIHw9IGdldF92b2xfbXV0ZShjb2RlYywgaW5mbywgbmlkLCBjaCwgZGlyZWN0aW9uLCBpZHgpICYgfm1hc2s7Ci0JaWYgKGluZm8tPnZvbFtjaF0gPT0gdmFsICYmICEgY29kZWMtPmluX3Jlc3VtZSkKKwlpZiAoaW5mby0+dm9sW2NoXSA9PSB2YWwgJiYgIWNvZGVjLT5pbl9yZXN1bWUpCiAJCXJldHVybiAwOwogCXB1dF92b2xfbXV0ZShjb2RlYywgaW5mbywgbmlkLCBjaCwgZGlyZWN0aW9uLCBpZHgsIHZhbCk7CiAJcmV0dXJuIDE7CkBAIC03ODMsNyArNzk1LDggQEAKICNkZWZpbmUgZ2V0X2FtcF9pbmRleChrYykJKCgoa2MpLT5wcml2YXRlX3ZhbHVlID4+IDE5KSAmIDB4ZikKIAogLyogdm9sdW1lICovCi1pbnQgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCitpbnQgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXUxNiBuaWQgPSBnZXRfYW1wX25pZChrY29udHJvbCk7CkBAIC03OTIsOSArODA1LDExIEBACiAJdTMyIGNhcHM7CiAKIAljYXBzID0gcXVlcnlfYW1wX2NhcHMoY29kZWMsIG5pZCwgZGlyKTsKLQljYXBzID0gKGNhcHMgJiBBQ19BTVBDQVBfTlVNX1NURVBTKSA+PiBBQ19BTVBDQVBfTlVNX1NURVBTX1NISUZUOyAvKiBudW0gc3RlcHMgKi8KLQlpZiAoISBjYXBzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImhkYV9jb2RlYzogbnVtX3N0ZXBzID0gMCBmb3IgTklEPTB4JXhcbiIsIG5pZCk7CisJLyogbnVtIHN0ZXBzICovCisJY2FwcyA9IChjYXBzICYgQUNfQU1QQ0FQX05VTV9TVEVQUykgPj4gQUNfQU1QQ0FQX05VTV9TVEVQU19TSElGVDsKKwlpZiAoIWNhcHMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaGRhX2NvZGVjOiAiCisJCSAgICAgICAibnVtX3N0ZXBzID0gMCBmb3IgTklEPTB4JXhcbiIsIG5pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKQEAgLTgwNCw3ICs4MTksOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitpbnQgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJaGRhX25pZF90IG5pZCA9IGdldF9hbXBfbmlkKGtjb250cm9sKTsKQEAgLTgyMCw3ICs4MzYsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitpbnQgc25kX2hkYV9taXhlcl9hbXBfdm9sdW1lX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJaGRhX25pZF90IG5pZCA9IGdldF9hbXBfbmlkKGtjb250cm9sKTsKQEAgLTg1Miw3ICs4NjksOCBAQAogCWlmIChzaXplIDwgNCAqIHNpemVvZih1bnNpZ25lZCBpbnQpKQogCQlyZXR1cm4gLUVOT01FTTsKIAljYXBzID0gcXVlcnlfYW1wX2NhcHMoY29kZWMsIG5pZCwgZGlyKTsKLQl2YWwyID0gKCgoY2FwcyAmIEFDX0FNUENBUF9TVEVQX1NJWkUpID4+IEFDX0FNUENBUF9TVEVQX1NJWkVfU0hJRlQpICsgMSkgKiAyNTsKKwl2YWwyID0gKGNhcHMgJiBBQ19BTVBDQVBfU1RFUF9TSVpFKSA+PiBBQ19BTVBDQVBfU1RFUF9TSVpFX1NISUZUOworCXZhbDIgPSAodmFsMiArIDEpICogMjU7CiAJdmFsMSA9IC0oKGNhcHMgJiBBQ19BTVBDQVBfT0ZGU0VUKSA+PiBBQ19BTVBDQVBfT0ZGU0VUX1NISUZUKTsKIAl2YWwxID0gKChpbnQpdmFsMSkgKiAoKGludCl2YWwyKTsKIAlpZiAocHV0X3VzZXIoU05EUlZfQ1RMX1RMVlRfREJfU0NBTEUsIF90bHYpKQpAQCAtODY3LDcgKzg4NSw4IEBACiB9CiAKIC8qIHN3aXRjaCAqLwotaW50IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoraW50IHNuZF9oZGFfbWl4ZXJfYW1wX3N3aXRjaF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAlpbnQgY2hzID0gZ2V0X2FtcF9jaGFubmVscyhrY29udHJvbCk7CiAKQEAgLTg3OCw3ICs4OTcsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitpbnQgc25kX2hkYV9taXhlcl9hbXBfc3dpdGNoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJaGRhX25pZF90IG5pZCA9IGdldF9hbXBfbmlkKGtjb250cm9sKTsKQEAgLTg4OCwxMyArOTA4LDE2IEBACiAJbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwogCiAJaWYgKGNocyAmIDEpCi0JCSp2YWxwKysgPSAoc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgbmlkLCAwLCBkaXIsIGlkeCkgJiAweDgwKSA/IDAgOiAxOworCQkqdmFscCsrID0gKHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIG5pZCwgMCwgZGlyLCBpZHgpICYKKwkJCSAgIDB4ODApID8gMCA6IDE7CiAJaWYgKGNocyAmIDIpCi0JCSp2YWxwID0gKHNuZF9oZGFfY29kZWNfYW1wX3JlYWQoY29kZWMsIG5pZCwgMSwgZGlyLCBpZHgpICYgMHg4MCkgPyAwIDogMTsKKwkJKnZhbHAgPSAoc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgbmlkLCAxLCBkaXIsIGlkeCkgJgorCQkJIDB4ODApID8gMCA6IDE7CiAJcmV0dXJuIDA7CiB9CiAKLWludCBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK2ludCBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAloZGFfbmlkX3QgbmlkID0gZ2V0X2FtcF9uaWQoa2NvbnRyb2wpOwpAQCAtOTI1LDcgKzk0OCw4IEBACiAjZGVmaW5lIEFNUF9WQUxfSURYX1NISUZUCTE5CiAjZGVmaW5lIEFNUF9WQUxfSURYX01BU0sJKDB4MGY8PDE5KQogCi1pbnQgc25kX2hkYV9taXhlcl9iaW5kX3N3aXRjaF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoraW50IHNuZF9oZGFfbWl4ZXJfYmluZF9zd2l0Y2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJdW5zaWduZWQgbG9uZyBwdmFsOwpAQCAtOTQwLDcgKzk2NCw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IHNuZF9oZGFfbWl4ZXJfYmluZF9zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK2ludCBzbmRfaGRhX21peGVyX2JpbmRfc3dpdGNoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXVuc2lnbmVkIGxvbmcgcHZhbDsKQEAgLTk1MCw3ICs5NzUsOCBAQAogCXB2YWwgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKIAlpbmRpY2VzID0gKHB2YWwgJiBBTVBfVkFMX0lEWF9NQVNLKSA+PiBBTVBfVkFMX0lEWF9TSElGVDsKIAlmb3IgKGkgPSAwOyBpIDwgaW5kaWNlczsgaSsrKSB7Ci0JCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gKHB2YWwgJiB+QU1QX1ZBTF9JRFhfTUFTSykgfCAoaSA8PCBBTVBfVkFMX0lEWF9TSElGVCk7CisJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID0gKHB2YWwgJiB+QU1QX1ZBTF9JRFhfTUFTSykgfAorCQkJKGkgPDwgQU1QX1ZBTF9JRFhfU0hJRlQpOwogCQllcnIgPSBzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfcHV0KGtjb250cm9sLCB1Y29udHJvbCk7CiAJCWlmIChlcnIgPCAwKQogCQkJYnJlYWs7CkBAIC05NjUsMTQgKzk5MSwxNiBAQAogICogU1BESUYgb3V0IGNvbnRyb2xzCiAgKi8KIAotc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX21hc2tfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3N0YXRpYyBpbnQgc25kX2hkYV9zcGRpZl9tYXNrX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OwogCXVpbmZvLT5jb3VudCA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2hkYV9zcGRpZl9jbWFza19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX2NtYXNrX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCB8CiAJCQkJCSAgIElFQzk1OF9BRVMwX05PTkFVRElPIHwKQEAgLTk4Myw3ICsxMDExLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX3BtYXNrX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfcG1hc2tfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMIHwKIAkJCQkJICAgSUVDOTU4X0FFUzBfTk9OQVVESU8gfApAQCAtOTkxLDcgKzEwMjAsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfZGVmYXVsdF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQorc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX2RlZmF1bHRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKQEAgLTEwMTEsMTkgKzEwNDEsMjEgQEAKIAl1bnNpZ25lZCBzaG9ydCB2YWwgPSAwOwogCiAJaWYgKHNiaXRzICYgSUVDOTU4X0FFUzBfUFJPRkVTU0lPTkFMKQotCQl2YWwgfD0gMSA8PCA2OworCQl2YWwgfD0gQUNfRElHMV9QUk9GRVNTSU9OQUw7CiAJaWYgKHNiaXRzICYgSUVDOTU4X0FFUzBfTk9OQVVESU8pCi0JCXZhbCB8PSAxIDw8IDU7CisJCXZhbCB8PSBBQ19ESUcxX05PTkFVRElPOwogCWlmIChzYml0cyAmIElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTCkgewotCQlpZiAoKHNiaXRzICYgSUVDOTU4X0FFUzBfUFJPX0VNUEhBU0lTKSA9PSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfNTAxNSkKLQkJCXZhbCB8PSAxIDw8IDM7CisJCWlmICgoc2JpdHMgJiBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVMpID09CisJCSAgICBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfNTAxNSkKKwkJCXZhbCB8PSBBQ19ESUcxX0VNUEhBU0lTOwogCX0gZWxzZSB7Ci0JCWlmICgoc2JpdHMgJiBJRUM5NThfQUVTMF9DT05fRU1QSEFTSVMpID09IElFQzk1OF9BRVMwX0NPTl9FTVBIQVNJU181MDE1KQotCQkJdmFsIHw9IDEgPDwgMzsKLQkJaWYgKCEgKHNiaXRzICYgSUVDOTU4X0FFUzBfQ09OX05PVF9DT1BZUklHSFQpKQotCQkJdmFsIHw9IDEgPDwgNDsKKwkJaWYgKChzYml0cyAmIElFQzk1OF9BRVMwX0NPTl9FTVBIQVNJUykgPT0KKwkJICAgIElFQzk1OF9BRVMwX0NPTl9FTVBIQVNJU181MDE1KQorCQkJdmFsIHw9IEFDX0RJRzFfRU1QSEFTSVM7CisJCWlmICghKHNiaXRzICYgSUVDOTU4X0FFUzBfQ09OX05PVF9DT1BZUklHSFQpKQorCQkJdmFsIHw9IEFDX0RJRzFfQ09QWVJJR0hUOwogCQlpZiAoc2JpdHMgJiAoSUVDOTU4X0FFUzFfQ09OX09SSUdJTkFMIDw8IDgpKQotCQkJdmFsIHw9IDEgPDwgNzsKKwkJCXZhbCB8PSBBQ19ESUcxX0xFVkVMOwogCQl2YWwgfD0gc2JpdHMgJiAoSUVDOTU4X0FFUzFfQ09OX0NBVEVHT1JZIDw8IDgpOwogCX0KIAlyZXR1cm4gdmFsOwpAQCAtMTAzNSwyNiArMTA2NywyNyBAQAogewogCXVuc2lnbmVkIGludCBzYml0cyA9IDA7CiAKLQlpZiAodmFsICYgKDEgPDwgNSkpCisJaWYgKHZhbCAmIEFDX0RJRzFfTk9OQVVESU8pCiAJCXNiaXRzIHw9IElFQzk1OF9BRVMwX05PTkFVRElPOwotCWlmICh2YWwgJiAoMSA8PCA2KSkKKwlpZiAodmFsICYgQUNfRElHMV9QUk9GRVNTSU9OQUwpCiAJCXNiaXRzIHw9IElFQzk1OF9BRVMwX1BST0ZFU1NJT05BTDsKIAlpZiAoc2JpdHMgJiBJRUM5NThfQUVTMF9QUk9GRVNTSU9OQUwpIHsKLQkJaWYgKHNiaXRzICYgKDEgPDwgMykpCisJCWlmIChzYml0cyAmIEFDX0RJRzFfRU1QSEFTSVMpCiAJCQlzYml0cyB8PSBJRUM5NThfQUVTMF9QUk9fRU1QSEFTSVNfNTAxNTsKIAl9IGVsc2UgewotCQlpZiAodmFsICYgKDEgPDwgMykpCisJCWlmICh2YWwgJiBBQ19ESUcxX0VNUEhBU0lTKQogCQkJc2JpdHMgfD0gSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTXzUwMTU7Ci0JCWlmICghICh2YWwgJiAoMSA8PCA0KSkpCisJCWlmICghKHZhbCAmIEFDX0RJRzFfQ09QWVJJR0hUKSkKIAkJCXNiaXRzIHw9IElFQzk1OF9BRVMwX0NPTl9OT1RfQ09QWVJJR0hUOwotCQlpZiAodmFsICYgKDEgPDwgNykpCisJCWlmICh2YWwgJiBBQ19ESUcxX0xFVkVMKQogCQkJc2JpdHMgfD0gKElFQzk1OF9BRVMxX0NPTl9PUklHSU5BTCA8PCA4KTsKIAkJc2JpdHMgfD0gdmFsICYgKDB4N2YgPDwgOCk7CiAJfQogCXJldHVybiBzYml0czsKIH0KIAotc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX2RlZmF1bHRfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgc25kX2hkYV9zcGRpZl9kZWZhdWx0X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKQEAgLTEwNzIsMTUgKzExMDUsMTggQEAKIAljb2RlYy0+c3BkaWZfY3RscyA9IHZhbDsKIAogCWlmIChjaGFuZ2UgfHwgY29kZWMtPmluX3Jlc3VtZSkgewotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCB2YWwgJiAweGZmKTsKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMiwgdmFsID4+IDgpOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLAorCQkJCSAgICB2YWwgJiAweGZmKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMiwKKwkJCQkgICAgdmFsID4+IDgpOwogCX0KIAogCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfb3V0X3N3aXRjaF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQorc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX291dF9zd2l0Y2hfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7CiAJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CiAJdWluZm8tPmNvdW50ID0gMTsKQEAgLTEwODksMTUgKzExMjUsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzbmRfaGRhX3NwZGlmX291dF9zd2l0Y2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgc25kX2hkYV9zcGRpZl9vdXRfc3dpdGNoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNvZGVjLT5zcGRpZl9jdGxzICYgMTsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGNvZGVjLT5zcGRpZl9jdGxzICYgQUNfRElHMV9FTkFCTEU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2hkYV9zcGRpZl9vdXRfc3dpdGNoX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfb3V0X3N3aXRjaF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKQEAgLTExMDUsMTYgKzExNDMsMjEgQEAKIAlpbnQgY2hhbmdlOwogCiAJbXV0ZXhfbG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKLQl2YWwgPSBjb2RlYy0+c3BkaWZfY3RscyAmIH4xOworCXZhbCA9IGNvZGVjLT5zcGRpZl9jdGxzICYgfkFDX0RJRzFfRU5BQkxFOwogCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKLQkJdmFsIHw9IDE7CisJCXZhbCB8PSBBQ19ESUcxX0VOQUJMRTsKIAljaGFuZ2UgPSBjb2RlYy0+c3BkaWZfY3RscyAhPSB2YWw7CiAJaWYgKGNoYW5nZSB8fCBjb2RlYy0+aW5fcmVzdW1lKSB7CiAJCWNvZGVjLT5zcGRpZl9jdGxzID0gdmFsOwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCB2YWwgJiAweGZmKTsKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAotCQkJCSAgICBBQ19BTVBfU0VUX1JJR0hUIHwgQUNfQU1QX1NFVF9MRUZUIHwKLQkJCQkgICAgQUNfQU1QX1NFVF9PVVRQVVQgfCAoKHZhbCAmIDEpID8gMCA6IDB4ODApKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwKKwkJCQkgICAgdmFsICYgMHhmZik7CisJCS8qIHVubXV0ZSBhbXAgc3dpdGNoIChpZiBhbnkpICovCisJCWlmICgoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9PVVRfQU1QKSAmJgorCQkgICAgKHZhbCAmIEFDX0RJRzFfRU5BQkxFKSkKKwkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKKwkJCQkJICAgIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJCQkJCSAgICBBQ19BTVBfU0VUX1JJR0hUIHwgQUNfQU1QX1NFVF9MRUZUIHwKKwkJCQkJICAgIEFDX0FNUF9TRVRfT1VUUFVUKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOwogCXJldHVybiBjaGFuZ2U7CkBAIC0xMTYyLDcgKzEyMDUsOCBAQAogICoKICAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KLWludCBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKK2ludCBfX2RldmluaXQgc25kX2hkYV9jcmVhdGVfc3BkaWZfb3V0X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSAgICBoZGFfbmlkX3QgbmlkKQogewogCWludCBlcnI7CiAJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKQEAgLTExNzEsMTAgKzEyMTUsMTIgQEAKIAlmb3IgKGRpZ19taXggPSBkaWdfbWl4ZXM7IGRpZ19taXgtPm5hbWU7IGRpZ19taXgrKykgewogCQlrY3RsID0gc25kX2N0bF9uZXcxKGRpZ19taXgsIGNvZGVjKTsKIAkJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IG5pZDsKLQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+YnVzLT5jYXJkLCBrY3RsKSkgPCAwKQorCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+YnVzLT5jYXJkLCBrY3RsKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KLQljb2RlYy0+c3BkaWZfY3RscyA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlQsIDApOworCWNvZGVjLT5zcGRpZl9jdGxzID0KKwkJc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfR0VUX0RJR0lfQ09OVkVSVCwgMCk7CiAJY29kZWMtPnNwZGlmX3N0YXR1cyA9IGNvbnZlcnRfdG9fc3BkaWZfc3RhdHVzKGNvZGVjLT5zcGRpZl9jdGxzKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExODUsNyArMTIzMSw4IEBACiAKICNkZWZpbmUgc25kX2hkYV9zcGRpZl9pbl9zd2l0Y2hfaW5mbwlzbmRfaGRhX3NwZGlmX291dF9zd2l0Y2hfaW5mbwogCi1zdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfaW5fc3dpdGNoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfaW5fc3dpdGNoX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAKQEAgLTExOTMsNyArMTI0MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2hkYV9zcGRpZl9pbl9zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3N0YXRpYyBpbnQgc25kX2hkYV9zcGRpZl9pbl9zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CkBAIC0xMjA0LDEzICsxMjUyLDE1IEBACiAJY2hhbmdlID0gY29kZWMtPnNwZGlmX2luX2VuYWJsZSAhPSB2YWw7CiAJaWYgKGNoYW5nZSB8fCBjb2RlYy0+aW5fcmVzdW1lKSB7CiAJCWNvZGVjLT5zcGRpZl9pbl9lbmFibGUgPSB2YWw7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIHZhbCk7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsCisJCQkJICAgIHZhbCk7CiAJfQogCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfaW5fc3RhdHVzX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfaW5fc3RhdHVzX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwpAQCAtMTI1NCw3ICsxMzA0LDggQEAKICAqCiAgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgogICovCi1pbnQgc25kX2hkYV9jcmVhdGVfc3BkaWZfaW5fY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKK2ludCBfX2RldmluaXQgc25kX2hkYV9jcmVhdGVfc3BkaWZfaW5fY3RscyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgaGRhX25pZF90IG5pZCkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CkBAIC0xMjYzLDEwICsxMzE0LDEzIEBACiAJZm9yIChkaWdfbWl4ID0gZGlnX2luX2N0bHM7IGRpZ19taXgtPm5hbWU7IGRpZ19taXgrKykgewogCQlrY3RsID0gc25kX2N0bF9uZXcxKGRpZ19taXgsIGNvZGVjKTsKIAkJa2N0bC0+cHJpdmF0ZV92YWx1ZSA9IG5pZDsKLQkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+YnVzLT5jYXJkLCBrY3RsKSkgPCAwKQorCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+YnVzLT5jYXJkLCBrY3RsKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KLQljb2RlYy0+c3BkaWZfaW5fZW5hYmxlID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfR0VUX0RJR0lfQ09OVkVSVCwgMCkgJiAxOworCWNvZGVjLT5zcGRpZl9pbl9lbmFibGUgPQorCQlzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9HRVRfRElHSV9DT05WRVJULCAwKSAmCisJCUFDX0RJRzFfRU5BQkxFOwogCXJldHVybiAwOwogfQogCkBAIC0xMzA0LDE1ICsxMzU4LDE0IEBACiAgKgogICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KLWludCBzbmRfaGRhX2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBoZGFfYnVzICpidXMpCitpbnQgX19kZXZpbml0IHNuZF9oZGFfYnVpbGRfY29udHJvbHMoc3RydWN0IGhkYV9idXMgKmJ1cykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwogCiAJLyogYnVpbGQgY29udHJvbHMgKi8KLQlsaXN0X2Zvcl9lYWNoKHAsICZidXMtPmNvZGVjX2xpc3QpIHsKLQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoZGFfY29kZWMsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZidXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKIAkJaW50IGVycjsKLQkJaWYgKCEgY29kZWMtPnBhdGNoX29wcy5idWlsZF9jb250cm9scykKKwkJaWYgKCFjb2RlYy0+cGF0Y2hfb3BzLmJ1aWxkX2NvbnRyb2xzKQogCQkJY29udGludWU7CiAJCWVyciA9IGNvZGVjLT5wYXRjaF9vcHMuYnVpbGRfY29udHJvbHMoY29kZWMpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTEzMjAsMTMgKzEzNzMsMTIgQEAKIAl9CiAKIAkvKiBpbml0aWFsaXplICovCi0JbGlzdF9mb3JfZWFjaChwLCAmYnVzLT5jb2RlY19saXN0KSB7Ci0JCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGRhX2NvZGVjLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7CiAJCWludCBlcnI7CiAJCWhkYV9zZXRfcG93ZXJfc3RhdGUoY29kZWMsCiAJCQkJICAgIGNvZGVjLT5hZmcgPyBjb2RlYy0+YWZnIDogY29kZWMtPm1mZywKIAkJCQkgICAgQUNfUFdSU1RfRDApOwotCQlpZiAoISBjb2RlYy0+cGF0Y2hfb3BzLmluaXQpCisJCWlmICghY29kZWMtPnBhdGNoX29wcy5pbml0KQogCQkJY29udGludWU7CiAJCWVyciA9IGNvZGVjLT5wYXRjaF9vcHMuaW5pdChjb2RlYyk7CiAJCWlmIChlcnIgPCAwKQpAQCAtMTMzNSw4ICsxMzg3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfaGRhX2J1aWxkX2NvbnRyb2xzKTsKLQogLyoKICAqIHN0cmVhbSBmb3JtYXRzCiAgKi8KQEAgLTEzNjEsNiArMTQxMSwxMSBAQAogCXsgOTYwMDAsIFNORFJWX1BDTV9SQVRFXzk2MDAwLCAweDA4MDAgfSwgLyogMiB4IDQ4ICovCiAJeyAxNzY0MDAsIFNORFJWX1BDTV9SQVRFXzE3NjQwMCwgMHg1ODAwIH0sLyogNCB4IDQ0ICovCiAJeyAxOTIwMDAsIFNORFJWX1BDTV9SQVRFXzE5MjAwMCwgMHgxODAwIH0sIC8qIDQgeCA0OCAqLworI2RlZmluZSBBQ19QQVJfUENNX1JBVEVfQklUUwkxMQorCS8qIHVwIHRvIGJpdHMgMTAsIDM4NGtIWiBpc24ndCBzdXBwb3J0ZWQgcHJvcGVybHkgKi8KKworCS8qIG5vdCBhdXRvZGV0ZWN0ZWQgdmFsdWUgKi8KKwl7IDk2MDAsIFNORFJWX1BDTV9SQVRFX0tOT1QsIDB4MDQwMCB9LCAvKiAxLzUgeCA0OCAqLwogCiAJeyAwIH0gLyogdGVybWluYXRvciAqLwogfTsKQEAgLTEzODksNyArMTQ0NCw3IEBACiAJCQl2YWwgPSByYXRlX2JpdHNbaV0uaGRhX2ZtdDsKIAkJCWJyZWFrOwogCQl9Ci0JaWYgKCEgcmF0ZV9iaXRzW2ldLmh6KSB7CisJaWYgKCFyYXRlX2JpdHNbaV0uaHopIHsKIAkJc25kX3ByaW50ZGQoImludmFsaWQgcmF0ZSAlZFxuIiwgcmF0ZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTE0MTQsMTUgKzE0NjksMTQgQEAKIAkJCXZhbCB8PSAweDIwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlzbmRfcHJpbnRkZCgiaW52YWxpZCBmb3JtYXQgd2lkdGggJWRcbiIsIHNuZF9wY21fZm9ybWF0X3dpZHRoKGZvcm1hdCkpOworCQlzbmRfcHJpbnRkZCgiaW52YWxpZCBmb3JtYXQgd2lkdGggJWRcbiIsCisJCQkgICAgc25kX3BjbV9mb3JtYXRfd2lkdGgoZm9ybWF0KSk7CiAJCXJldHVybiAwOwogCX0KIAogCXJldHVybiB2YWw7CiB9CiAKLUVYUE9SVF9TWU1CT0woc25kX2hkYV9jYWxjX3N0cmVhbV9mb3JtYXQpOwotCiAvKioKICAqIHNuZF9oZGFfcXVlcnlfc3VwcG9ydGVkX3BjbSAtIHF1ZXJ5IHRoZSBzdXBwb3J0ZWQgUENNIHJhdGVzIGFuZCBmb3JtYXRzCiAgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKQEAgLTE0NDksMTIgKzE1MDMsMTIgQEAKIAkJaWYgKHZhbCA9PSAtMSkKIAkJCXJldHVybiAtRUlPOwogCX0KLQlpZiAoISB2YWwpCisJaWYgKCF2YWwpCiAJCXZhbCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgY29kZWMtPmFmZywgQUNfUEFSX1BDTSk7CiAKIAlpZiAocmF0ZXNwKSB7CiAJCXUzMiByYXRlcyA9IDA7Ci0JCWZvciAoaSA9IDA7IHJhdGVfYml0c1tpXS5oejsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBQ19QQVJfUENNX1JBVEVfQklUUzsgaSsrKSB7CiAJCQlpZiAodmFsICYgKDEgPDwgaSkpCiAJCQkJcmF0ZXMgfD0gcmF0ZV9iaXRzW2ldLmFsc2FfYml0czsKIAkJfQpAQCAtMTQ3MCw4ICsxNTI0LDkgQEAKIAkJc3RyZWFtcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfU1RSRUFNKTsKIAkJaWYgKHN0cmVhbXMgPT0gLTEpCiAJCQlyZXR1cm4gLUVJTzsKLQkJaWYgKCEgc3RyZWFtcykgewotCQkJc3RyZWFtcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgY29kZWMtPmFmZywgQUNfUEFSX1NUUkVBTSk7CisJCWlmICghc3RyZWFtcykgeworCQkJc3RyZWFtcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgY29kZWMtPmFmZywKKwkJCQkJCSAgICAgQUNfUEFSX1NUUkVBTSk7CiAJCQlpZiAoc3RyZWFtcyA9PSAtMSkKIAkJCQlyZXR1cm4gLUVJTzsKIAkJfQpAQCAtMTQ5NSw3ICsxNTUwLDggQEAKIAkJCQkJYnBzID0gMjQ7CiAJCQkJZWxzZSBpZiAodmFsICYgQUNfU1VQUENNX0JJVFNfMjApCiAJCQkJCWJwcyA9IDIwOwotCQkJfSBlbHNlIGlmICh2YWwgJiAoQUNfU1VQUENNX0JJVFNfMjB8QUNfU1VQUENNX0JJVFNfMjR8QUNfU1VQUENNX0JJVFNfMzIpKSB7CisJCQl9IGVsc2UgaWYgKHZhbCAmIChBQ19TVVBQQ01fQklUU18yMHxBQ19TVVBQQ01fQklUU18yNHwKKwkJCQkJICBBQ19TVVBQQ01fQklUU18zMikpIHsKIAkJCQlmb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFOwogCQkJCWlmICh2YWwgJiBBQ19TVVBQQ01fQklUU18zMikKIAkJCQkJYnBzID0gMzI7CkBAIC0xNTA1LDEwICsxNTYxLDEyIEBACiAJCQkJCWJwcyA9IDIwOwogCQkJfQogCQl9Ci0JCWVsc2UgaWYgKHN0cmVhbXMgPT0gQUNfU1VQRk1UX0ZMT0FUMzIpIHsgLyogc2hvdWxkIGJlIGV4Y2x1c2l2ZSAqLworCQllbHNlIGlmIChzdHJlYW1zID09IEFDX1NVUEZNVF9GTE9BVDMyKSB7CisJCQkvKiBzaG91bGQgYmUgZXhjbHVzaXZlICovCiAJCQlmb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfRkxPQVRfTEU7CiAJCQlicHMgPSAzMjsKLQkJfSBlbHNlIGlmIChzdHJlYW1zID09IEFDX1NVUEZNVF9BQzMpIHsgLyogc2hvdWxkIGJlIGV4Y2x1c2l2ZSAqLworCQl9IGVsc2UgaWYgKHN0cmVhbXMgPT0gQUNfU1VQRk1UX0FDMykgeworCQkJLyogc2hvdWxkIGJlIGV4Y2x1c2l2ZSAqLwogCQkJLyogdGVtcG9yYXJ5IGhhY2s6IHdlIGhhdmUgc3RpbGwgbm8gcHJvcGVyIHN1cHBvcnQKIAkJCSAqIGZvciB0aGUgZGlyZWN0IEFDMyBzdHJlYW0uLi4KIAkJCSAqLwpAQCAtMTUyNSw3ICsxNTgzLDggQEAKIH0KIAogLyoqCi0gKiBzbmRfaGRhX2lzX3N1cHBvcnRlZF9mb3JtYXQgLSBjaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIHN1cHBvcnRzIHRoZSBmb3JtYXQgdmFsCisgKiBzbmRfaGRhX2lzX3N1cHBvcnRlZF9mb3JtYXQgLSBjaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBub2RlIHN1cHBvcnRzCisgKiB0aGUgZm9ybWF0IHZhbAogICoKICAqIFJldHVybnMgMSBpZiBzdXBwb3J0ZWQsIDAgaWYgbm90LgogICovCkBAIC0xNTQxLDUwICsxNjAwLDUwIEBACiAJCWlmICh2YWwgPT0gLTEpCiAJCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKCEgdmFsKSB7CisJaWYgKCF2YWwpIHsKIAkJdmFsID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCBBQ19QQVJfUENNKTsKIAkJaWYgKHZhbCA9PSAtMSkKIAkJCXJldHVybiAwOwogCX0KIAogCXJhdGUgPSBmb3JtYXQgJiAweGZmMDA7Ci0JZm9yIChpID0gMDsgcmF0ZV9iaXRzW2ldLmh6OyBpKyspCisJZm9yIChpID0gMDsgaSA8IEFDX1BBUl9QQ01fUkFURV9CSVRTOyBpKyspCiAJCWlmIChyYXRlX2JpdHNbaV0uaGRhX2ZtdCA9PSByYXRlKSB7CiAJCQlpZiAodmFsICYgKDEgPDwgaSkpCiAJCQkJYnJlYWs7CiAJCQlyZXR1cm4gMDsKIAkJfQotCWlmICghIHJhdGVfYml0c1tpXS5oeikKKwlpZiAoaSA+PSBBQ19QQVJfUENNX1JBVEVfQklUUykKIAkJcmV0dXJuIDA7CiAKIAlzdHJlYW0gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX1NUUkVBTSk7CiAJaWYgKHN0cmVhbSA9PSAtMSkKIAkJcmV0dXJuIDA7Ci0JaWYgKCEgc3RyZWFtICYmIG5pZCAhPSBjb2RlYy0+YWZnKQorCWlmICghc3RyZWFtICYmIG5pZCAhPSBjb2RlYy0+YWZnKQogCQlzdHJlYW0gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIEFDX1BBUl9TVFJFQU0pOwotCWlmICghIHN0cmVhbSB8fCBzdHJlYW0gPT0gLTEpCisJaWYgKCFzdHJlYW0gfHwgc3RyZWFtID09IC0xKQogCQlyZXR1cm4gMDsKIAogCWlmIChzdHJlYW0gJiBBQ19TVVBGTVRfUENNKSB7CiAJCXN3aXRjaCAoZm9ybWF0ICYgMHhmMCkgewogCQljYXNlIDB4MDA6Ci0JCQlpZiAoISAodmFsICYgQUNfU1VQUENNX0JJVFNfOCkpCisJCQlpZiAoISh2YWwgJiBBQ19TVVBQQ01fQklUU184KSkKIAkJCQlyZXR1cm4gMDsKIAkJCWJyZWFrOwogCQljYXNlIDB4MTA6Ci0JCQlpZiAoISAodmFsICYgQUNfU1VQUENNX0JJVFNfMTYpKQorCQkJaWYgKCEodmFsICYgQUNfU1VQUENNX0JJVFNfMTYpKQogCQkJCXJldHVybiAwOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgyMDoKLQkJCWlmICghICh2YWwgJiBBQ19TVVBQQ01fQklUU18yMCkpCisJCQlpZiAoISh2YWwgJiBBQ19TVVBQQ01fQklUU18yMCkpCiAJCQkJcmV0dXJuIDA7CiAJCQlicmVhazsKIAkJY2FzZSAweDMwOgotCQkJaWYgKCEgKHZhbCAmIEFDX1NVUFBDTV9CSVRTXzI0KSkKKwkJCWlmICghKHZhbCAmIEFDX1NVUFBDTV9CSVRTXzI0KSkKIAkJCQlyZXR1cm4gMDsKIAkJCWJyZWFrOwogCQljYXNlIDB4NDA6Ci0JCQlpZiAoISAodmFsICYgQUNfU1VQUENNX0JJVFNfMzIpKQorCQkJaWYgKCEodmFsICYgQUNfU1VQUENNX0JJVFNfMzIpKQogCQkJCXJldHVybiAwOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CkBAIC0xNjI1LDE1ICsxNjg0LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3BjbV9kZWZhdWx0X3ZhbHVlcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9wY21fc3RyZWFtICppbmZvKQorc3RhdGljIGludCBfX2RldmluaXQgc2V0X3BjbV9kZWZhdWx0X3ZhbHVlcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaW5mbykKIHsKLQlpZiAoaW5mby0+bmlkKSB7Ci0JCS8qIHF1ZXJ5IHN1cHBvcnQgUENNIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIE5JRCAqLwotCQlpZiAoISBpbmZvLT5yYXRlcyB8fCAhIGluZm8tPmZvcm1hdHMpCi0JCQlzbmRfaGRhX3F1ZXJ5X3N1cHBvcnRlZF9wY20oY29kZWMsIGluZm8tPm5pZCwKLQkJCQkJCSAgICBpbmZvLT5yYXRlcyA/IE5VTEwgOiAmaW5mby0+cmF0ZXMsCi0JCQkJCQkgICAgaW5mby0+Zm9ybWF0cyA/IE5VTEwgOiAmaW5mby0+Zm9ybWF0cywKLQkJCQkJCSAgICBpbmZvLT5tYXhicHMgPyBOVUxMIDogJmluZm8tPm1heGJwcyk7CisJLyogcXVlcnkgc3VwcG9ydCBQQ00gaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2l2ZW4gTklEICovCisJaWYgKGluZm8tPm5pZCAmJiAoIWluZm8tPnJhdGVzIHx8ICFpbmZvLT5mb3JtYXRzKSkgeworCQlzbmRfaGRhX3F1ZXJ5X3N1cHBvcnRlZF9wY20oY29kZWMsIGluZm8tPm5pZCwKKwkJCQlpbmZvLT5yYXRlcyA/IE5VTEwgOiAmaW5mby0+cmF0ZXMsCisJCQkJaW5mby0+Zm9ybWF0cyA/IE5VTEwgOiAmaW5mby0+Zm9ybWF0cywKKwkJCQlpbmZvLT5tYXhicHMgPyBOVUxMIDogJmluZm8tPm1heGJwcyk7CiAJfQogCWlmIChpbmZvLT5vcHMub3BlbiA9PSBOVUxMKQogCQlpbmZvLT5vcHMub3BlbiA9IGhkYV9wY21fZGVmYXVsdF9vcGVuX2Nsb3NlOwpAQCAtMTY3NiwxNSArMTczNSwxNCBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWxsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KLWludCBzbmRfaGRhX2J1aWxkX3BjbXMoc3RydWN0IGhkYV9idXMgKmJ1cykKK2ludCBfX2RldmluaXQgc25kX2hkYV9idWlsZF9wY21zKHN0cnVjdCBoZGFfYnVzICpidXMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKIAotCWxpc3RfZm9yX2VhY2gocCwgJmJ1cy0+Y29kZWNfbGlzdCkgewotCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhkYV9jb2RlYywgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgewogCQl1bnNpZ25lZCBpbnQgcGNtLCBzOwogCQlpbnQgZXJyOwotCQlpZiAoISBjb2RlYy0+cGF0Y2hfb3BzLmJ1aWxkX3BjbXMpCisJCWlmICghY29kZWMtPnBhdGNoX29wcy5idWlsZF9wY21zKQogCQkJY29udGludWU7CiAJCWVyciA9IGNvZGVjLT5wYXRjaF9vcHMuYnVpbGRfcGNtcyhjb2RlYyk7CiAJCWlmIChlcnIgPCAwKQpAQCAtMTY5Myw3ICsxNzUxLDcgQEAKIAkJCWZvciAocyA9IDA7IHMgPCAyOyBzKyspIHsKIAkJCQlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmluZm87CiAJCQkJaW5mbyA9ICZjb2RlYy0+cGNtX2luZm9bcGNtXS5zdHJlYW1bc107Ci0JCQkJaWYgKCEgaW5mby0+c3Vic3RyZWFtcykKKwkJCQlpZiAoIWluZm8tPnN1YnN0cmVhbXMpCiAJCQkJCWNvbnRpbnVlOwogCQkJCWVyciA9IHNldF9wY21fZGVmYXVsdF92YWx1ZXMoY29kZWMsIGluZm8pOwogCQkJCWlmIChlcnIgPCAwKQpAQCAtMTcwNCw4ICsxNzYyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfaGRhX2J1aWxkX3BjbXMpOwotCiAvKioKICAqIHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnIC0gY29tcGFyZSB0aGUgY3VycmVudCBjb2RlYyB3aXRoIHRoZSBjb25maWcgdGFibGUKICAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYwpAQCAtMTcxOSw5ICsxNzc1LDkgQEAKICAqCiAgKiBJZiBubyBlbnRyaWVzIGFyZSBtYXRjaGluZywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KICAqLwotaW50IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJICAgICAgIGludCBudW1fY29uZmlncywgY29uc3QgY2hhciAqKm1vZGVscywKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayAqdGJsKQoraW50IF9fZGV2aW5pdCBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJIGludCBudW1fY29uZmlncywgY29uc3QgY2hhciAqKm1vZGVscywKKwkJCQkJIGNvbnN0IHN0cnVjdCBzbmRfcGNpX3F1aXJrICp0YmwpCiB7CiAJaWYgKGNvZGVjLT5idXMtPm1vZGVsbmFtZSAmJiBtb2RlbHMpIHsKIAkJaW50IGk7CkBAIC0xNzcxLDI0ICsxODI3LDI2IEBACiAgKgogICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KICAqLwotaW50IHNuZF9oZGFfYWRkX25ld19jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa25ldykKK2ludCBfX2RldmluaXQgc25kX2hkYV9hZGRfbmV3X2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtuZXcpCiB7CiAJaW50IGVycjsKIAogCWZvciAoOyBrbmV3LT5uYW1lOyBrbmV3KyspIHsKIAkJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAkJa2N0bCA9IHNuZF9jdGxfbmV3MShrbmV3LCBjb2RlYyk7Ci0JCWlmICghIGtjdGwpCisJCWlmICgha2N0bCkKIAkJCXJldHVybiAtRU5PTUVNOwogCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+YnVzLT5jYXJkLCBrY3RsKTsKIAkJaWYgKGVyciA8IDApIHsKLQkJCWlmICghIGNvZGVjLT5hZGRyKQorCQkJaWYgKCFjb2RlYy0+YWRkcikKIAkJCQlyZXR1cm4gZXJyOwogCQkJa2N0bCA9IHNuZF9jdGxfbmV3MShrbmV3LCBjb2RlYyk7Ci0JCQlpZiAoISBrY3RsKQorCQkJaWYgKCFrY3RsKQogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJa2N0bC0+aWQuZGV2aWNlID0gY29kZWMtPmFkZHI7Ci0JCQlpZiAoKGVyciA9IHNuZF9jdGxfYWRkKGNvZGVjLT5idXMtPmNhcmQsIGtjdGwpKSA8IDApCisJCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+YnVzLT5jYXJkLCBrY3RsKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0xNzk5LDggKzE4NTcsMTAgQEAKIC8qCiAgKiBDaGFubmVsIG1vZGUgaGVscGVyCiAgKi8KLWludCBzbmRfaGRhX2NoX21vZGVfaW5mbyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbywKLQkJCSBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSAqY2htb2RlLCBpbnQgbnVtX2NobW9kZXMpCitpbnQgc25kX2hkYV9jaF9tb2RlX2luZm8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbywKKwkJCSBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSAqY2htb2RlLAorCQkJIGludCBudW1fY2htb2RlcykKIHsKIAl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKIAl1aW5mby0+Y291bnQgPSAxOwpAQCAtMTgxMiw4ICsxODcyLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBzbmRfaGRhX2NoX21vZGVfZ2V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCwKLQkJCWNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlICpjaG1vZGUsIGludCBudW1fY2htb2RlcywKK2ludCBzbmRfaGRhX2NoX21vZGVfZ2V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wsCisJCQljb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSAqY2htb2RlLAorCQkJaW50IG51bV9jaG1vZGVzLAogCQkJaW50IG1heF9jaGFubmVscykKIHsKIAlpbnQgaTsKQEAgLTE4MjcsMTUgKzE4ODksMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHNuZF9oZGFfY2hfbW9kZV9wdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sLAotCQkJY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgKmNobW9kZSwgaW50IG51bV9jaG1vZGVzLAoraW50IHNuZF9oZGFfY2hfbW9kZV9wdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCwKKwkJCWNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlICpjaG1vZGUsCisJCQlpbnQgbnVtX2NobW9kZXMsCiAJCQlpbnQgKm1heF9jaGFubmVsc3ApCiB7CiAJdW5zaWduZWQgaW50IG1vZGU7CiAKIAltb2RlID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKIAlzbmRfYXNzZXJ0KG1vZGUgPCBudW1fY2htb2RlcywgcmV0dXJuIC1FSU5WQUwpOwotCWlmICgqbWF4X2NoYW5uZWxzcCA9PSBjaG1vZGVbbW9kZV0uY2hhbm5lbHMgJiYgISBjb2RlYy0+aW5fcmVzdW1lKQorCWlmICgqbWF4X2NoYW5uZWxzcCA9PSBjaG1vZGVbbW9kZV0uY2hhbm5lbHMgJiYgIWNvZGVjLT5pbl9yZXN1bWUpCiAJCXJldHVybiAwOwogCS8qIGNoYW5nZSB0aGUgY3VycmVudCBjaGFubmVsIHNldHRpbmcgKi8KIAkqbWF4X2NoYW5uZWxzcCA9IGNobW9kZVttb2RlXS5jaGFubmVsczsKQEAgLTE4NDcsNyArMTkxMSw4IEBACiAvKgogICogaW5wdXQgTVVYIGhlbHBlcgogICovCi1pbnQgc25kX2hkYV9pbnB1dF9tdXhfaW5mbyhjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK2ludCBzbmRfaGRhX2lucHV0X211eF9pbmZvKGNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4LAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKIAl1bnNpZ25lZCBpbnQgaW5kZXg7CiAKQEAgLTE4NjEsOCArMTkyNiwxMCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc25kX2hkYV9pbnB1dF9tdXhfcHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCwKLQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wsIGhkYV9uaWRfdCBuaWQsCitpbnQgc25kX2hkYV9pbnB1dF9tdXhfcHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJICBjb25zdCBzdHJ1Y3QgaGRhX2lucHV0X211eCAqaW11eCwKKwkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wsCisJCQkgIGhkYV9uaWRfdCBuaWQsCiAJCQkgIHVuc2lnbmVkIGludCAqY3VyX3ZhbCkKIHsKIAl1bnNpZ25lZCBpbnQgaWR4OwpAQCAtMTg3MCw3ICsxOTM3LDcgQEAKIAlpZHggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwogCWlmIChpZHggPj0gaW11eC0+bnVtX2l0ZW1zKQogCQlpZHggPSBpbXV4LT5udW1faXRlbXMgLSAxOwotCWlmICgqY3VyX3ZhbCA9PSBpZHggJiYgISBjb2RlYy0+aW5fcmVzdW1lKQorCWlmICgqY3VyX3ZhbCA9PSBpZHggJiYgIWNvZGVjLT5pbl9yZXN1bWUpCiAJCXJldHVybiAwOwogCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCiAJCQkgICAgaW11eC0+aXRlbXNbaWR4XS5pbmRleCk7CkBAIC0xODgzLDI1ICsxOTUwLDUzIEBACiAgKiBNdWx0aS1jaGFubmVsIC8gZGlnaXRhbC1vdXQgUENNIGhlbHBlciBmdW5jdGlvbnMKICAqLwogCisvKiBzZXR1cCBTUERJRiBvdXRwdXQgc3RyZWFtICovCitzdGF0aWMgdm9pZCBzZXR1cF9kaWdfb3V0X3N0cmVhbShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCQkgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsIHVuc2lnbmVkIGludCBmb3JtYXQpCit7CisJLyogdHVybiBvZmYgU1BESUYgb25jZTsgb3RoZXJ3aXNlIHRoZSBJRUM5NTggYml0cyB3b24ndCBiZSB1cGRhdGVkICovCisJaWYgKGNvZGVjLT5zcGRpZl9jdGxzICYgQUNfRElHMV9FTkFCTEUpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsCisJCQkJICAgIGNvZGVjLT5zcGRpZl9jdGxzICYgfkFDX0RJRzFfRU5BQkxFICYgMHhmZik7CisJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG5pZCwgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKwkvKiB0dXJuIG9uIGFnYWluIChpZiBuZWVkZWQpICovCisJaWYgKGNvZGVjLT5zcGRpZl9jdGxzICYgQUNfRElHMV9FTkFCTEUpCisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsCisJCQkJICAgIGNvZGVjLT5zcGRpZl9jdGxzICYgMHhmZik7Cit9CisKIC8qCiAgKiBvcGVuIHRoZSBkaWdpdGFsIG91dCBpbiB0aGUgZXhjbHVzaXZlIG1vZGUKICAqLwotaW50IHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19vcGVuKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCkKK2ludCBzbmRfaGRhX211bHRpX291dF9kaWdfb3BlbihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCkKIHsKIAltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOwotCWlmIChtb3V0LT5kaWdfb3V0X3VzZWQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOwotCQlyZXR1cm4gLUVCVVNZOyAvKiBhbHJlYWR5IGJlaW5nIHVzZWQgKi8KLQl9CisJaWYgKG1vdXQtPmRpZ19vdXRfdXNlZCA9PSBIREFfRElHX0FOQUxPR19EVVApCisJCS8qIGFscmVhZHkgb3BlbmVkIGFzIGFuYWxvZyBkdXA7IHJlc2V0IGl0IG9uY2UgKi8KKwkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLCAwLCAwLCAwKTsKIAltb3V0LT5kaWdfb3V0X3VzZWQgPSBIREFfRElHX0VYQ0xVU0lWRTsKIAltdXRleF91bmxvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CiAKK2ludCBzbmRfaGRhX211bHRpX291dF9kaWdfcHJlcGFyZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgIHN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0LAorCQkJCSAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCSAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJbXV0ZXhfbG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKKwlzZXR1cF9kaWdfb3V0X3N0cmVhbShjb2RlYywgbW91dC0+ZGlnX291dF9uaWQsIHN0cmVhbV90YWcsIGZvcm1hdCk7CisJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOworCXJldHVybiAwOworfQorCiAvKgogICogcmVsZWFzZSB0aGUgZGlnaXRhbCBvdXQKICAqLwotaW50IHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19jbG9zZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9tdWx0aV9vdXQgKm1vdXQpCitpbnQgc25kX2hkYV9tdWx0aV9vdXRfZGlnX2Nsb3NlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCXN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0KQogewogCW11dGV4X2xvY2soJmNvZGVjLT5zcGRpZl9tdXRleCk7CiAJbW91dC0+ZGlnX291dF91c2VkID0gMDsKQEAgLTE5MTIsNyArMjAwNyw4IEBACiAvKgogICogc2V0IHVwIG1vcmUgcmVzdHJpY3Rpb25zIGZvciBhbmFsb2cgb3V0CiAgKi8KLWludCBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfb3BlbihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9tdWx0aV9vdXQgKm1vdXQsCitpbnQgc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX29wZW4oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICBzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCwKIAkJCQkgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN1YnN0cmVhbS0+cnVudGltZS0+aHcuY2hhbm5lbHNfbWF4ID0gbW91dC0+bWF4X2NoYW5uZWxzOwpAQCAtMTkyNCw3ICsyMDIwLDggQEAKICAqIHNldCB1cCB0aGUgaS9vIGZvciBhbmFsb2cgb3V0CiAgKiB3aGVuIHRoZSBkaWdpdGFsIG91dCBpcyBhdmFpbGFibGUsIGNvcHkgdGhlIGZyb250IG91dCB0byBkaWdpdGFsIG91dCwgdG9vLgogICovCi1pbnQgc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX3ByZXBhcmUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0LAoraW50IHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19wcmVwYXJlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgc3RydWN0IGhkYV9tdWx0aV9vdXQgKm1vdXQsCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKIAkJCQkgICAgIHVuc2lnbmVkIGludCBmb3JtYXQsCiAJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTE5MzYsMjQgKzIwMzMsMjcgQEAKIAltdXRleF9sb2NrKCZjb2RlYy0+c3BkaWZfbXV0ZXgpOwogCWlmIChtb3V0LT5kaWdfb3V0X25pZCAmJiBtb3V0LT5kaWdfb3V0X3VzZWQgIT0gSERBX0RJR19FWENMVVNJVkUpIHsKIAkJaWYgKGNocyA9PSAyICYmCi0JCSAgICBzbmRfaGRhX2lzX3N1cHBvcnRlZF9mb3JtYXQoY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLCBmb3JtYXQpICYmCi0JCSAgICAhIChjb2RlYy0+c3BkaWZfc3RhdHVzICYgSUVDOTU4X0FFUzBfTk9OQVVESU8pKSB7CisJCSAgICBzbmRfaGRhX2lzX3N1cHBvcnRlZF9mb3JtYXQoY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLAorCQkJCQkJZm9ybWF0KSAmJgorCQkgICAgIShjb2RlYy0+c3BkaWZfc3RhdHVzICYgSUVDOTU4X0FFUzBfTk9OQVVESU8pKSB7CiAJCQltb3V0LT5kaWdfb3V0X3VzZWQgPSBIREFfRElHX0FOQUxPR19EVVA7Ci0JCQkvKiBzZXR1cCBkaWdpdGFsIHJlY2VpdmVyICovCi0JCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbW91dC0+ZGlnX291dF9uaWQsCi0JCQkJCQkgICBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCQkJc2V0dXBfZGlnX291dF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLAorCQkJCQkgICAgIHN0cmVhbV90YWcsIGZvcm1hdCk7CiAJCX0gZWxzZSB7CiAJCQltb3V0LT5kaWdfb3V0X3VzZWQgPSAwOwotCQkJc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG1vdXQtPmRpZ19vdXRfbmlkLCAwLCAwLCAwKTsKKwkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBtb3V0LT5kaWdfb3V0X25pZCwKKwkJCQkJCSAgIDAsIDAsIDApOwogCQl9CiAJfQogCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKIAogCS8qIGZyb250ICovCi0Jc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0oY29kZWMsIG5pZHNbSERBX0ZST05UXSwgc3RyZWFtX3RhZywgMCwgZm9ybWF0KTsKKwlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkc1tIREFfRlJPTlRdLCBzdHJlYW1fdGFnLAorCQkJCSAgIDAsIGZvcm1hdCk7CiAJaWYgKG1vdXQtPmhwX25pZCAmJiBtb3V0LT5ocF9uaWQgIT0gbmlkc1tIREFfRlJPTlRdKQogCQkvKiBoZWFkcGhvbmUgb3V0IHdpbGwganVzdCBkZWNvZGUgZnJvbnQgbGVmdC9yaWdodCAoc3RlcmVvKSAqLwotCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbW91dC0+aHBfbmlkLCBzdHJlYW1fdGFnLCAwLCBmb3JtYXQpOworCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbW91dC0+aHBfbmlkLCBzdHJlYW1fdGFnLAorCQkJCQkgICAwLCBmb3JtYXQpOwogCS8qIGV4dHJhIG91dHB1dHMgY29waWVkIGZyb20gZnJvbnQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtb3V0LT5leHRyYV9vdXRfbmlkKTsgaSsrKQogCQlpZiAobW91dC0+ZXh0cmFfb3V0X25pZFtpXSkKQEAgLTE5NjQsMTEgKzIwNjQsMTEgQEAKIAkvKiBzdXJyb3VuZHMgKi8KIAlmb3IgKGkgPSAxOyBpIDwgbW91dC0+bnVtX2RhY3M7IGkrKykgewogCQlpZiAoY2hzID49IChpICsgMSkgKiAyKSAvKiBpbmRlcGVuZGVudCBvdXQgKi8KLQkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuaWRzW2ldLCBzdHJlYW1fdGFnLCBpICogMiwKLQkJCQkJCSAgIGZvcm1hdCk7CisJCQlzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbShjb2RlYywgbmlkc1tpXSwgc3RyZWFtX3RhZywKKwkJCQkJCSAgIGkgKiAyLCBmb3JtYXQpOwogCQllbHNlIC8qIGNvcHkgZnJvbnQgKi8KLQkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuaWRzW2ldLCBzdHJlYW1fdGFnLCAwLAotCQkJCQkJICAgZm9ybWF0KTsKKwkJCXNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKGNvZGVjLCBuaWRzW2ldLCBzdHJlYW1fdGFnLAorCQkJCQkJICAgMCwgZm9ybWF0KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTc2LDcgKzIwNzYsOCBAQAogLyoKICAqIGNsZWFuIHVwIHRoZSBzZXR0aW5nIGZvciBhbmFsb2cgb3V0CiAgKi8KLWludCBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfY2xlYW51cChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9tdWx0aV9vdXQgKm1vdXQpCitpbnQgc25kX2hkYV9tdWx0aV9vdXRfYW5hbG9nX2NsZWFudXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICBzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCkKIHsKIAloZGFfbmlkX3QgKm5pZHMgPSBtb3V0LT5kYWNfbmlkczsKIAlpbnQgaTsKQEAgLTIwMDMsNyArMjEwNCw3IEBACiAgKiBIZWxwZXIgZm9yIGF1dG9tYXRpYyBwaW5nIGNvbmZpZ3VyYXRpb24KICAqLwogCi1zdGF0aWMgaW50IGlzX2luX25pZF9saXN0KGhkYV9uaWRfdCBuaWQsIGhkYV9uaWRfdCAqbGlzdCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzX2luX25pZF9saXN0KGhkYV9uaWRfdCBuaWQsIGhkYV9uaWRfdCAqbGlzdCkKIHsKIAlmb3IgKDsgKmxpc3Q7IGxpc3QrKykKIAkJaWYgKCpsaXN0ID09IG5pZCkKQEAgLTIwMTEsNiArMjExMiwzMiBAQAogCXJldHVybiAwOwogfQogCisKKy8qCisgKiBTb3J0IGFuIGFzc29jaWF0ZWQgZ3JvdXAgb2YgcGlucyBhY2NvcmRpbmcgdG8gdGhlaXIgc2VxdWVuY2UgbnVtYmVycy4KKyAqLworc3RhdGljIHZvaWQgc29ydF9waW5zX2J5X3NlcXVlbmNlKGhkYV9uaWRfdCAqIHBpbnMsIHNob3J0ICogc2VxdWVuY2VzLAorCQkJCSAgaW50IG51bV9waW5zKQoreworCWludCBpLCBqOworCXNob3J0IHNlcTsKKwloZGFfbmlkX3QgbmlkOworCQorCWZvciAoaSA9IDA7IGkgPCBudW1fcGluczsgaSsrKSB7CisJCWZvciAoaiA9IGkgKyAxOyBqIDwgbnVtX3BpbnM7IGorKykgeworCQkJaWYgKHNlcXVlbmNlc1tpXSA+IHNlcXVlbmNlc1tqXSkgeworCQkJCXNlcSA9IHNlcXVlbmNlc1tpXTsKKwkJCQlzZXF1ZW5jZXNbaV0gPSBzZXF1ZW5jZXNbal07CisJCQkJc2VxdWVuY2VzW2pdID0gc2VxOworCQkJCW5pZCA9IHBpbnNbaV07CisJCQkJcGluc1tpXSA9IHBpbnNbal07CisJCQkJcGluc1tqXSA9IG5pZDsKKwkJCX0KKwkJfQorCX0KK30KKworCiAvKgogICogUGFyc2UgYWxsIHBpbiB3aWRnZXRzIGFuZCBzdG9yZSB0aGUgdXNlZnVsIHBpbiBuaWRzIHRvIGNmZwogICoKQEAgLTIwMjgsMjIgKzIxNTUsMjcgQEAKICAqIFRoZSBkaWdpdGFsIGlucHV0L291dHB1dCBwaW5zIGFyZSBhc3NpZ25lZCB0byBkaWdfaW5fcGluIGFuZCBkaWdfb3V0X3BpbiwKICAqIHJlc3BlY3RpdmVseS4KICAqLwotaW50IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZywKLQkJCQkgaGRhX25pZF90ICppZ25vcmVfbmlkcykKK2ludCBfX2RldmluaXQgc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnLAorCQkJCQkgICBoZGFfbmlkX3QgKmlnbm9yZV9uaWRzKQogewogCWhkYV9uaWRfdCBuaWQsIG5pZF9zdGFydDsKLQlpbnQgaSwgaiwgbm9kZXM7Ci0Jc2hvcnQgc2VxLCBhc3NvY19saW5lX291dCwgc2VxdWVuY2VzW0FSUkFZX1NJWkUoY2ZnLT5saW5lX291dF9waW5zKV07CisJaW50IG5vZGVzOworCXNob3J0IHNlcSwgYXNzb2NfbGluZV9vdXQsIGFzc29jX3NwZWFrZXI7CisJc2hvcnQgc2VxdWVuY2VzX2xpbmVfb3V0W0FSUkFZX1NJWkUoY2ZnLT5saW5lX291dF9waW5zKV07CisJc2hvcnQgc2VxdWVuY2VzX3NwZWFrZXJbQVJSQVlfU0laRShjZmctPnNwZWFrZXJfcGlucyldOwogCiAJbWVtc2V0KGNmZywgMCwgc2l6ZW9mKCpjZmcpKTsKIAotCW1lbXNldChzZXF1ZW5jZXMsIDAsIHNpemVvZihzZXF1ZW5jZXMpKTsKLQlhc3NvY19saW5lX291dCA9IDA7CisJbWVtc2V0KHNlcXVlbmNlc19saW5lX291dCwgMCwgc2l6ZW9mKHNlcXVlbmNlc19saW5lX291dCkpOworCW1lbXNldChzZXF1ZW5jZXNfc3BlYWtlciwgMCwgc2l6ZW9mKHNlcXVlbmNlc19zcGVha2VyKSk7CisJYXNzb2NfbGluZV9vdXQgPSBhc3NvY19zcGVha2VyID0gMDsKIAogCW5vZGVzID0gc25kX2hkYV9nZXRfc3ViX25vZGVzKGNvZGVjLCBjb2RlYy0+YWZnLCAmbmlkX3N0YXJ0KTsKIAlmb3IgKG5pZCA9IG5pZF9zdGFydDsgbmlkIDwgbm9kZXMgKyBuaWRfc3RhcnQ7IG5pZCsrKSB7CiAJCXVuc2lnbmVkIGludCB3aWRfY2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgbmlkKTsKLQkJdW5zaWduZWQgaW50IHdpZF90eXBlID0gKHdpZF9jYXBzICYgQUNfV0NBUF9UWVBFKSA+PiBBQ19XQ0FQX1RZUEVfU0hJRlQ7CisJCXVuc2lnbmVkIGludCB3aWRfdHlwZSA9CisJCQkod2lkX2NhcHMgJiBBQ19XQ0FQX1RZUEUpID4+IEFDX1dDQVBfVFlQRV9TSElGVDsKIAkJdW5zaWduZWQgaW50IGRlZl9jb25mOwogCQlzaG9ydCBhc3NvYywgbG9jOwogCkBAIC0yMDU0LDcgKzIxODYsOCBAQAogCQlpZiAoaWdub3JlX25pZHMgJiYgaXNfaW5fbmlkX2xpc3QobmlkLCBpZ25vcmVfbmlkcykpCiAJCQljb250aW51ZTsKIAotCQlkZWZfY29uZiA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9DT05GSUdfREVGQVVMVCwgMCk7CisJCWRlZl9jb25mID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCisJCQkJCSAgICAgIEFDX1ZFUkJfR0VUX0NPTkZJR19ERUZBVUxULCAwKTsKIAkJaWYgKGdldF9kZWZjZmdfY29ubmVjdChkZWZfY29uZikgPT0gQUNfSkFDS19QT1JUX05PTkUpCiAJCQljb250aW51ZTsKIAkJbG9jID0gZ2V0X2RlZmNmZ19sb2NhdGlvbihkZWZfY29uZik7CkBAIC0yMDYyLDIyICsyMTk1LDMxIEBACiAJCWNhc2UgQUNfSkFDS19MSU5FX09VVDoKIAkJCXNlcSA9IGdldF9kZWZjZmdfc2VxdWVuY2UoZGVmX2NvbmYpOwogCQkJYXNzb2MgPSBnZXRfZGVmY2ZnX2Fzc29jaWF0aW9uKGRlZl9jb25mKTsKLQkJCWlmICghIGFzc29jKQorCQkJaWYgKCFhc3NvYykKIAkJCQljb250aW51ZTsKLQkJCWlmICghIGFzc29jX2xpbmVfb3V0KQorCQkJaWYgKCFhc3NvY19saW5lX291dCkKIAkJCQlhc3NvY19saW5lX291dCA9IGFzc29jOwogCQkJZWxzZSBpZiAoYXNzb2NfbGluZV9vdXQgIT0gYXNzb2MpCiAJCQkJY29udGludWU7CiAJCQlpZiAoY2ZnLT5saW5lX291dHMgPj0gQVJSQVlfU0laRShjZmctPmxpbmVfb3V0X3BpbnMpKQogCQkJCWNvbnRpbnVlOwogCQkJY2ZnLT5saW5lX291dF9waW5zW2NmZy0+bGluZV9vdXRzXSA9IG5pZDsKLQkJCXNlcXVlbmNlc1tjZmctPmxpbmVfb3V0c10gPSBzZXE7CisJCQlzZXF1ZW5jZXNfbGluZV9vdXRbY2ZnLT5saW5lX291dHNdID0gc2VxOwogCQkJY2ZnLT5saW5lX291dHMrKzsKIAkJCWJyZWFrOwogCQljYXNlIEFDX0pBQ0tfU1BFQUtFUjoKKwkJCXNlcSA9IGdldF9kZWZjZmdfc2VxdWVuY2UoZGVmX2NvbmYpOworCQkJYXNzb2MgPSBnZXRfZGVmY2ZnX2Fzc29jaWF0aW9uKGRlZl9jb25mKTsKKwkJCWlmICghIGFzc29jKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEgYXNzb2Nfc3BlYWtlcikKKwkJCQlhc3NvY19zcGVha2VyID0gYXNzb2M7CisJCQllbHNlIGlmIChhc3NvY19zcGVha2VyICE9IGFzc29jKQorCQkJCWNvbnRpbnVlOwogCQkJaWYgKGNmZy0+c3BlYWtlcl9vdXRzID49IEFSUkFZX1NJWkUoY2ZnLT5zcGVha2VyX3BpbnMpKQogCQkJCWNvbnRpbnVlOwogCQkJY2ZnLT5zcGVha2VyX3BpbnNbY2ZnLT5zcGVha2VyX291dHNdID0gbmlkOworCQkJc2VxdWVuY2VzX3NwZWFrZXJbY2ZnLT5zcGVha2VyX291dHNdID0gc2VxOwogCQkJY2ZnLT5zcGVha2VyX291dHMrKzsKIAkJCWJyZWFrOwogCQljYXNlIEFDX0pBQ0tfSFBfT1VUOgpAQCAtMjEyMywzNCArMjI2NSw0NSBAQAogCX0KIAogCS8qIHNvcnQgYnkgc2VxdWVuY2UgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5saW5lX291dHM7IGkrKykKLQkJZm9yIChqID0gaSArIDE7IGogPCBjZmctPmxpbmVfb3V0czsgaisrKQotCQkJaWYgKHNlcXVlbmNlc1tpXSA+IHNlcXVlbmNlc1tqXSkgewotCQkJCXNlcSA9IHNlcXVlbmNlc1tpXTsKLQkJCQlzZXF1ZW5jZXNbaV0gPSBzZXF1ZW5jZXNbal07Ci0JCQkJc2VxdWVuY2VzW2pdID0gc2VxOwotCQkJCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKLQkJCQljZmctPmxpbmVfb3V0X3BpbnNbaV0gPSBjZmctPmxpbmVfb3V0X3BpbnNbal07Ci0JCQkJY2ZnLT5saW5lX291dF9waW5zW2pdID0gbmlkOwotCQkJfQorCXNvcnRfcGluc19ieV9zZXF1ZW5jZShjZmctPmxpbmVfb3V0X3BpbnMsIHNlcXVlbmNlc19saW5lX291dCwKKwkJCSAgICAgIGNmZy0+bGluZV9vdXRzKTsKKwlzb3J0X3BpbnNfYnlfc2VxdWVuY2UoY2ZnLT5zcGVha2VyX3BpbnMsIHNlcXVlbmNlc19zcGVha2VyLAorCQkJICAgICAgY2ZnLT5zcGVha2VyX291dHMpOworCQorCS8qCisJICogRklYLVVQOiBpZiBubyBsaW5lLW91dHMgYXJlIGRldGVjdGVkLCB0cnkgdG8gdXNlIHNwZWFrZXIgb3IgSFAgcGluCisJICogYXMgYSBwcmltYXJ5IG91dHB1dAorCSAqLworCWlmICghY2ZnLT5saW5lX291dHMpIHsKKwkJaWYgKGNmZy0+c3BlYWtlcl9vdXRzKSB7CisJCQljZmctPmxpbmVfb3V0cyA9IGNmZy0+c3BlYWtlcl9vdXRzOworCQkJbWVtY3B5KGNmZy0+bGluZV9vdXRfcGlucywgY2ZnLT5zcGVha2VyX3BpbnMsCisJCQkgICAgICAgc2l6ZW9mKGNmZy0+c3BlYWtlcl9waW5zKSk7CisJCQljZmctPnNwZWFrZXJfb3V0cyA9IDA7CisJCQltZW1zZXQoY2ZnLT5zcGVha2VyX3BpbnMsIDAsIHNpemVvZihjZmctPnNwZWFrZXJfcGlucykpOworCQkJY2ZnLT5saW5lX291dF90eXBlID0gQVVUT19QSU5fU1BFQUtFUl9PVVQ7CisJCX0gZWxzZSBpZiAoY2ZnLT5ocF9vdXRzKSB7CisJCQljZmctPmxpbmVfb3V0cyA9IGNmZy0+aHBfb3V0czsKKwkJCW1lbWNweShjZmctPmxpbmVfb3V0X3BpbnMsIGNmZy0+aHBfcGlucywKKwkJCSAgICAgICBzaXplb2YoY2ZnLT5ocF9waW5zKSk7CisJCQljZmctPmhwX291dHMgPSAwOworCQkJbWVtc2V0KGNmZy0+aHBfcGlucywgMCwgc2l6ZW9mKGNmZy0+aHBfcGlucykpOworCQkJY2ZnLT5saW5lX291dF90eXBlID0gQVVUT19QSU5fSFBfT1VUOworCQl9CisJfQogCiAJLyogUmVvcmRlciB0aGUgc3Vycm91bmQgY2hhbm5lbHMKIAkgKiBBTFNBIHNlcXVlbmNlIGlzIGZyb250L3N1cnIvY2xmZS9zaWRlCiAJICogSERBIHNlcXVlbmNlIGlzOgogCSAqICAgIDQtY2g6IGZyb250L3N1cnIgID0+ICBPSyBhcyBpdCBpcwogCSAqICAgIDYtY2g6IGZyb250L2NsZmUvc3VycgotCSAqICAgIDgtY2g6IGZyb250L2NsZmUvc2lkZS9zdXJyCisJICogICAgOC1jaDogZnJvbnQvY2xmZS9yZWFyL3NpZGV8ZmMKIAkgKi8KIAlzd2l0Y2ggKGNmZy0+bGluZV9vdXRzKSB7CiAJY2FzZSAzOgotCQluaWQgPSBjZmctPmxpbmVfb3V0X3BpbnNbMV07Ci0JCWNmZy0+bGluZV9vdXRfcGluc1sxXSA9IGNmZy0+bGluZV9vdXRfcGluc1syXTsKLQkJY2ZnLT5saW5lX291dF9waW5zWzJdID0gbmlkOwotCQlicmVhazsKIAljYXNlIDQ6CiAJCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1sxXTsKLQkJY2ZnLT5saW5lX291dF9waW5zWzFdID0gY2ZnLT5saW5lX291dF9waW5zWzNdOwotCQljZmctPmxpbmVfb3V0X3BpbnNbM10gPSBjZmctPmxpbmVfb3V0X3BpbnNbMl07CisJCWNmZy0+bGluZV9vdXRfcGluc1sxXSA9IGNmZy0+bGluZV9vdXRfcGluc1syXTsKIAkJY2ZnLT5saW5lX291dF9waW5zWzJdID0gbmlkOwogCQlicmVhazsKIAl9CkBAIC0yMTc5LDI2ICsyMzMyLDYgQEAKIAkJICAgY2ZnLT5pbnB1dF9waW5zW0FVVE9fUElOX0NEXSwKIAkJICAgY2ZnLT5pbnB1dF9waW5zW0FVVE9fUElOX0FVWF0pOwogCi0JLyoKLQkgKiBGSVgtVVA6IGlmIG5vIGxpbmUtb3V0cyBhcmUgZGV0ZWN0ZWQsIHRyeSB0byB1c2Ugc3BlYWtlciBvciBIUCBwaW4KLQkgKiBhcyBhIHByaW1hcnkgb3V0cHV0Ci0JICovCi0JaWYgKCEgY2ZnLT5saW5lX291dHMpIHsKLQkJaWYgKGNmZy0+c3BlYWtlcl9vdXRzKSB7Ci0JCQljZmctPmxpbmVfb3V0cyA9IGNmZy0+c3BlYWtlcl9vdXRzOwotCQkJbWVtY3B5KGNmZy0+bGluZV9vdXRfcGlucywgY2ZnLT5zcGVha2VyX3BpbnMsCi0JCQkgICAgICAgc2l6ZW9mKGNmZy0+c3BlYWtlcl9waW5zKSk7Ci0JCQljZmctPnNwZWFrZXJfb3V0cyA9IDA7Ci0JCQltZW1zZXQoY2ZnLT5zcGVha2VyX3BpbnMsIDAsIHNpemVvZihjZmctPnNwZWFrZXJfcGlucykpOwotCQl9IGVsc2UgaWYgKGNmZy0+aHBfb3V0cykgewotCQkJY2ZnLT5saW5lX291dHMgPSBjZmctPmhwX291dHM7Ci0JCQltZW1jcHkoY2ZnLT5saW5lX291dF9waW5zLCBjZmctPmhwX3BpbnMsCi0JCQkgICAgICAgc2l6ZW9mKGNmZy0+aHBfcGlucykpOwotCQkJY2ZnLT5ocF9vdXRzID0gMDsKLQkJCW1lbXNldChjZmctPmhwX3BpbnMsIDAsIHNpemVvZihjZmctPmhwX3BpbnMpKTsKLQkJfQotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC0yMjIyLDExICsyMzU1LDEwIEBACiAgKi8KIGludCBzbmRfaGRhX3N1c3BlbmQoc3RydWN0IGhkYV9idXMgKmJ1cywgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7CiAKIAkvKiBGSVhNRTogc2hvdWxkIGhhbmRsZSBwb3dlciB3aWRnZXQgY2FwYWJpbGl0aWVzICovCi0JbGlzdF9mb3JfZWFjaChwLCAmYnVzLT5jb2RlY19saXN0KSB7Ci0JCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGRhX2NvZGVjLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7CiAJCWlmIChjb2RlYy0+cGF0Y2hfb3BzLnN1c3BlbmQpCiAJCQljb2RlYy0+cGF0Y2hfb3BzLnN1c3BlbmQoY29kZWMsIHN0YXRlKTsKIAkJaGRhX3NldF9wb3dlcl9zdGF0ZShjb2RlYywKQEAgLTIyMzYsOCArMjM2OCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0woc25kX2hkYV9zdXNwZW5kKTsKLQogLyoqCiAgKiBzbmRfaGRhX3Jlc3VtZSAtIHJlc3VtZSB0aGUgY29kZWNzCiAgKiBAYnVzOiB0aGUgSERBIGJ1cwpAQCAtMjI0NywxMCArMjM3Nyw5IEBACiAgKi8KIGludCBzbmRfaGRhX3Jlc3VtZShzdHJ1Y3QgaGRhX2J1cyAqYnVzKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZidXMtPmNvZGVjX2xpc3QpIHsKLQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoZGFfY29kZWMsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZidXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKIAkJaGRhX3NldF9wb3dlcl9zdGF0ZShjb2RlYywKIAkJCQkgICAgY29kZWMtPmFmZyA/IGNvZGVjLT5hZmcgOiBjb2RlYy0+bWZnLAogCQkJCSAgICBBQ19QV1JTVF9EMCk7CkBAIC0yMjYwLDggKzIzODksNiBAQAogCXJldHVybiAwOwogfQogCi1FWFBPUlRfU1lNQk9MKHNuZF9oZGFfcmVzdW1lKTsKLQogLyoqCiAgKiBzbmRfaGRhX3Jlc3VtZV9jdGxzIC0gcmVzdW1lIGNvbnRyb2xzIGluIHRoZSBuZXcgY29udHJvbCBsaXN0CiAgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKQEAgLTIyNzYsNyArMjQwMyw3IEBACiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsOwogCiAJdmFsID0ga21hbGxvYyhzaXplb2YoKnZhbCksIEdGUF9LRVJORUwpOwotCWlmICghIHZhbCkKKwlpZiAoIXZhbCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJY29kZWMtPmluX3Jlc3VtZSA9IDE7CiAJZm9yICg7IGtuZXctPm5hbWU7IGtuZXcrKykgewpAQCAtMjMyMCwxOSArMjQ0NywzIEBACiAJcmV0dXJuIHNuZF9oZGFfcmVzdW1lX2N0bHMoY29kZWMsIGRpZ19pbl9jdGxzKTsKIH0KICNlbmRpZgotCi0vKgotICogIElOSVQgcGFydAotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGFsc2FfaGRhX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFsc2FfaGRhX2V4aXQodm9pZCkKLXsKLX0KLQotbW9kdWxlX2luaXQoYWxzYV9oZGFfaW5pdCkKLW1vZHVsZV9leGl0KGFsc2FfaGRhX2V4aXQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaAppbmRleCBjMTJiYzRlLi41NmMyNmU3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKQEAgLTIzMyw3ICsyMzMsNyBAQAogICovCiAKIC8qIEFtcCBnYWluL211dGUgKi8KLSNkZWZpbmUgQUNfQU1QX01VVEUJCQkoMTw8OCkKKyNkZWZpbmUgQUNfQU1QX01VVEUJCQkoMTw8NykKICNkZWZpbmUgQUNfQU1QX0dBSU4JCQkoMHg3ZikKICNkZWZpbmUgQUNfQU1QX0dFVF9JTkRFWAkJKDB4Zjw8MCkKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jCmluZGV4IDFlNWZmMGMuLjAwMDI4N2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAl9Ci0JbWVtY3B5KG5vZGUtPmNvbm5fbGlzdCwgY29ubl9saXN0LCBuY29ubnMpOworCW1lbWNweShub2RlLT5jb25uX2xpc3QsIGNvbm5fbGlzdCwgbmNvbm5zICogc2l6ZW9mKGhkYV9uaWRfdCkpOwogCW5vZGUtPm5jb25ucyA9IG5jb25uczsKIAlub2RlLT53aWRfY2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgbmlkKTsKIAlub2RlLT50eXBlID0gKG5vZGUtPndpZF9jYXBzICYgQUNfV0NBUF9UWVBFKSA+PiBBQ19XQ0FQX1RZUEVfU0hJRlQ7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwppbmRleCAxNjcyY2FjLi4yZmEyODFjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKQEAgLTg4LDYgKzg4LDggQEAKIAkJCSAie0FUSSwgU0I2MDB9LCIKIAkJCSAie0FUSSwgUlM2MDB9LCIKIAkJCSAie0FUSSwgUlM2OTB9LCIKKwkJCSAie0FUSSwgUlM3ODB9LCIKKwkJCSAie0FUSSwgUjYwMH0sIgogCQkJICJ7VklBLCBWVDgyNTF9LCIKIAkJCSAie1ZJQSwgVlQ4MjM3QX0sIgogCQkJICJ7U2lTLCBTSVM5NjZ9LCIKQEAgLTE5OCw2ICsyMDAsNyBAQAogI2RlZmluZSBSSVJCX0lOVF9NQVNLCQkweDA1CiAKIC8qIFNUQVRFU1RTIGludCBtYXNrOiBTRDIsU0QxLFNEMCAqLworI2RlZmluZSBBWlhfTUFYX0NPREVDUwkJMwogI2RlZmluZSBTVEFURVNUU19JTlRfTUFTSwkweDA3CiAKIC8qIFNEX0NUTCBiaXRzICovCkBAIC05NzgsNyArOTgxLDcgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGF6eF9jb2RlY19jcmVhdGUoc3RydWN0IGF6eCAqY2hpcCwgY29uc3QgY2hhciAqbW9kZWwpCiB7CiAJc3RydWN0IGhkYV9idXNfdGVtcGxhdGUgYnVzX3RlbXA7Ci0JaW50IGMsIGNvZGVjcywgZXJyOworCWludCBjLCBjb2RlY3MsIGF1ZGlvX2NvZGVjcywgZXJyOwogCiAJbWVtc2V0KCZidXNfdGVtcCwgMCwgc2l6ZW9mKGJ1c190ZW1wKSk7CiAJYnVzX3RlbXAucHJpdmF0ZV9kYXRhID0gY2hpcDsKQEAgLTk5MCwxNiArOTkzLDMwIEBACiAJaWYgKChlcnIgPSBzbmRfaGRhX2J1c19uZXcoY2hpcC0+Y2FyZCwgJmJ1c190ZW1wLCAmY2hpcC0+YnVzKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JY29kZWNzID0gMDsKLQlmb3IgKGMgPSAwOyBjIDwgYXp4X21heF9jb2RlY3NbY2hpcC0+ZHJpdmVyX3R5cGVdOyBjKyspIHsKKwljb2RlY3MgPSBhdWRpb19jb2RlY3MgPSAwOworCWZvciAoYyA9IDA7IGMgPCBBWlhfTUFYX0NPREVDUzsgYysrKSB7CiAJCWlmICgoY2hpcC0+Y29kZWNfbWFzayAmICgxIDw8IGMpKSAmIHByb2JlX21hc2spIHsKLQkJCWVyciA9IHNuZF9oZGFfY29kZWNfbmV3KGNoaXAtPmJ1cywgYywgTlVMTCk7CisJCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKKwkJCWVyciA9IHNuZF9oZGFfY29kZWNfbmV3KGNoaXAtPmJ1cywgYywgJmNvZGVjKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCWNvbnRpbnVlOwogCQkJY29kZWNzKys7CisJCQlpZiAoY29kZWMtPmFmZykKKwkJCQlhdWRpb19jb2RlY3MrKzsKIAkJfQogCX0KLQlpZiAoISBjb2RlY3MpIHsKKwlpZiAoIWF1ZGlvX2NvZGVjcykgeworCQkvKiBwcm9iZSBhZGRpdGlvbmFsIHNsb3RzIGlmIG5vIGNvZGVjIGlzIGZvdW5kICovCisJCWZvciAoOyBjIDwgYXp4X21heF9jb2RlY3NbY2hpcC0+ZHJpdmVyX3R5cGVdOyBjKyspIHsKKwkJCWlmICgoY2hpcC0+Y29kZWNfbWFzayAmICgxIDw8IGMpKSAmIHByb2JlX21hc2spIHsKKwkJCQllcnIgPSBzbmRfaGRhX2NvZGVjX25ldyhjaGlwLT5idXMsIGMsIE5VTEwpOworCQkJCWlmIChlcnIgPCAwKQorCQkJCQljb250aW51ZTsKKwkJCQljb2RlY3MrKzsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWNvZGVjcykgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSIFNGWCAibm8gY29kZWNzIGluaXRpYWxpemVkXG4iKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CkBAIC0xNTE4LDcgKzE1MzUsNyBAQAogLyoKICAqIHdoaXRlL2JsYWNrLWxpc3RpbmcgZm9yIHBvc2l0aW9uX2ZpeAogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgcG9zaXRpb25fZml4X2xpc3RbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIHBvc2l0aW9uX2ZpeF9saXN0W10gX19kZXZpbml0ZGF0YSA9IHsKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwMWNjLCAiRGVsbCBEODIwIiwgUE9TX0ZJWF9OT05FKSwKIAl7fQogfTsKQEAgLTE3NTgsNiArMTc3NSw4IEBACiAJeyAweDEwMDIsIDB4NDM4MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVEkgfSwgLyogQVRJIFNCNjAwICovCiAJeyAweDEwMDIsIDB4NzkzYiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVElIRE1JIH0sIC8qIEFUSSBSUzYwMCBIRE1JICovCiAJeyAweDEwMDIsIDB4NzkxOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVElIRE1JIH0sIC8qIEFUSSBSUzY5MCBIRE1JICovCisJeyAweDEwMDIsIDB4OTYwYywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVElIRE1JIH0sIC8qIEFUSSBSUzc4MCBIRE1JICovCisJeyAweDEwMDIsIDB4YWEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQVpYX0RSSVZFUl9BVElIRE1JIH0sIC8qIEFUSSBSNjAwIEhETUkgKi8KIAl7IDB4MTEwNiwgMHgzMjg4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBWlhfRFJJVkVSX1ZJQSB9LCAvKiBWSUEgVlQ4MjUxL1ZUODIzN0EgKi8KIAl7IDB4MTAzOSwgMHg3NTAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBWlhfRFJJVkVSX1NJUyB9LCAvKiBTSVM5NjYgKi8KIAl7IDB4MTBiOSwgMHg1NDYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBWlhfRFJJVkVSX1VMSSB9LCAvKiBVTEkgTTU0NjEgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCmluZGV4IDM5NzE4ZDYuLmJlMTJiODggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaApAQCAtMTQ4LDYgKzE0OCwxMSBAQAogCiBpbnQgc25kX2hkYV9tdWx0aV9vdXRfZGlnX29wZW4oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0KTsKIGludCBzbmRfaGRhX211bHRpX291dF9kaWdfY2xvc2Uoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0KTsKK2ludCBzbmRfaGRhX211bHRpX291dF9kaWdfcHJlcGFyZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgIHN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0LAorCQkJCSAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCSAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOwogaW50IHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19vcGVuKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgaGRhX211bHRpX291dCAqbW91dCwKIAkJCQkgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIGludCBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfcHJlcGFyZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9tdWx0aV9vdXQgKm1vdXQsCkBAIC0yMTcsNiArMjIyLDEyIEBACiAJQVVUT19QSU5fTEFTVAogfTsKIAorZW51bSB7CisJQVVUT19QSU5fTElORV9PVVQsCisJQVVUT19QSU5fU1BFQUtFUl9PVVQsCisJQVVUT19QSU5fSFBfT1VUCit9OworCiBleHRlcm4gY29uc3QgY2hhciAqYXV0b19waW5fY2ZnX2xhYmVsc1tBVVRPX1BJTl9MQVNUXTsKIAogc3RydWN0IGF1dG9fcGluX2NmZyB7CkBAIC0yMjUsNiArMjM2LDcgQEAKIAlpbnQgc3BlYWtlcl9vdXRzOwogCWhkYV9uaWRfdCBzcGVha2VyX3BpbnNbNV07CiAJaW50IGhwX291dHM7CisJaW50IGxpbmVfb3V0X3R5cGU7CS8qIEFVVE9fUElOX1hYWF9PVVQgKi8KIAloZGFfbmlkX3QgaHBfcGluc1s1XTsKIAloZGFfbmlkX3QgaW5wdXRfcGluc1tBVVRPX1BJTl9MQVNUXTsKIAloZGFfbmlkX3QgZGlnX291dF9waW47CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwppbmRleCBmOTRmMWYyMi4uMGUxYTg3OSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCkBAIC0xOTIsNiArMTkyLDE3IEBACiAJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19jbG9zZShjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKIH0KIAorc3RhdGljIGludCBhZDE5OHhfZGlnX3BsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJCSAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCQkJICAgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQkJICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGFkMTk4eF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19wcmVwYXJlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsIHN0cmVhbV90YWcsCisJCQkJCSAgICAgZm9ybWF0LCBzdWJzdHJlYW0pOworfQorCiAvKgogICogQW5hbG9nIGNhcHR1cmUKICAqLwpAQCAtMjUwLDcgKzI2MSw4IEBACiAJLm5pZCA9IDAsIC8qIGZpbGwgbGF0ZXIgKi8KIAkub3BzID0gewogCQkub3BlbiA9IGFkMTk4eF9kaWdfcGxheWJhY2tfcGNtX29wZW4sCi0JCS5jbG9zZSA9IGFkMTk4eF9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlCisJCS5jbG9zZSA9IGFkMTk4eF9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlLAorCQkucHJlcGFyZSA9IGFkMTk4eF9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUKIAl9LAogfTsKIApAQCAtNzM5LDQxICs3NTEsMzUgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCi0vKiBhZGRpdGlvbmFsIHZlcmJzIGZvciAzLXN0YWNrIG1vZGVsICovCi1zdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFkMTk4NmFfM3N0X2luaXRfdmVyYnNbXSA9IHsKLSAJLyogTWljIGFuZCBsaW5lLWluIHNlbGVjdG9ycyAqLwotCXsweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgyfSwKLQl7MHgxMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MX0sCi0gCXsgfSAvKiBlbmQgKi8KLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWQxOTg2YV9jaDJfaW5pdFtdID0gewogCS8qIFN1cnJvdW5kIG91dCAtPiBMaW5lIEluICovCi0JeyAweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQl7IDB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJeyAweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAorIAkvKiBMaW5lLWluIHNlbGVjdG9ycyAqLworCXsgMHgxMCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MSB9LAogCS8qIENMRkUgLT4gTWljIGluICovCi0JeyAweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKLQl7IDB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjA4MH0sCisJeyAweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODAgfSwKKwkvKiBNaWMgc2VsZWN0b3IsIG1peCBDL0xGRSAoYmFja21pYykgYW5kIE1pYyAoZnJvbnRtaWMpICovCisJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHg0IH0sCiAJeyB9IC8qIGVuZCAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhZDE5ODZhX2NoNF9pbml0W10gPSB7CiAJLyogU3Vycm91bmQgb3V0IC0+IFN1cnJvdW5kICovCi0JeyAweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQl7IDB4MWMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisJeyAweDFjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAgfSwKIAkvKiBDTEZFIC0+IE1pYyBpbiAqLwotCXsgMHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCi0JeyAweDFkLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODB9LAorCXsgMHgxZCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwIH0sCisJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHg0IH0sCiAJeyB9IC8qIGVuZCAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhZDE5ODZhX2NoNl9pbml0W10gPSB7CiAJLyogU3Vycm91bmQgb3V0IC0+IFN1cnJvdW5kIG91dCAqLwotCXsgMHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCi0JeyAweDFjLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAorCXsgMHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDEwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwIH0sCiAJLyogQ0xGRSAtPiBDTEZFICovCi0JeyAweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKLQl7IDB4MWQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCisJeyAweDFkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAgfSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC04MjgsNiArODM0LDcgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjk3LCAiQVNVUyBaNjJGIiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTJiMywgIkFTVVMgVjFqIiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTMwMiwgIkFTVVMgVzNqIiwgQUQxOTg2QV9MQVBUT1BfRUFQRCksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTQ0NywgIkFTVVMgQThKIiwgQUQxOTg2QV8zU1RBQ0spLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxN2YsICJBU1VTIFA1IiwgQUQxOTg2QV8zU1RBQ0spLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxOGYsICJBU1VTIFA1IiwgQUQxOTg2QV9MQVBUT1ApLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxYjMsICJBU1VTIFA1IiwgQUQxOTg2QV8zU1RBQ0spLApAQCAtODgyLDkgKzg4OSw4IEBACiAJY2FzZSBBRDE5ODZBXzNTVEFDSzoKIAkJc3BlYy0+bnVtX21peGVycyA9IDI7CiAJCXNwZWMtPm1peGVyc1sxXSA9IGFkMTk4NmFfM3N0X21peGVyczsKLQkJc3BlYy0+bnVtX2luaXRfdmVyYnMgPSAzOwotCQlzcGVjLT5pbml0X3ZlcmJzWzFdID0gYWQxOTg2YV8zc3RfaW5pdF92ZXJiczsKLQkJc3BlYy0+aW5pdF92ZXJic1syXSA9IGFkMTk4NmFfY2gyX2luaXQ7CisJCXNwZWMtPm51bV9pbml0X3ZlcmJzID0gMjsKKwkJc3BlYy0+aW5pdF92ZXJic1sxXSA9IGFkMTk4NmFfY2gyX2luaXQ7CiAJCXNwZWMtPmNoYW5uZWxfbW9kZSA9IGFkMTk4NmFfbW9kZXM7CiAJCXNwZWMtPm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFkMTk4NmFfbW9kZXMpOwogCQlzcGVjLT5uZWVkX2RhY19maXggPSAxOwpAQCAtMTg5Miw4ICsxODk4LDkgQEAKIAogCXNlbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgwMiwgMCwgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUwsIDApOwogCWlmIChzZWwgPiAwKSB7Ci0JCXNlbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgwYiwgMCwgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUwsIDApOwotCQlpZiAoc2VsIDw9IDMpCisJCXNlbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgwYiwgMCwKKwkJCQkJIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfU0VMLCAwKTsKKwkJaWYgKHNlbCA8IDMpCiAJCQlzZWwrKzsKIAkJZWxzZQogCQkJc2VsID0gMDsKQEAgLTE5MDYsMjMgKzE5MTMsMjcgQEAKIAkJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXVuc2lnbmVkIGludCBzZWw7CisJdW5zaWduZWQgaW50IHZhbCwgc2VsOwogCWludCBjaGFuZ2U7CiAKKwl2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwogCXNlbCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgwMiwgMCwgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUwsIDApOwotCWlmICghIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pIHsKKwlpZiAoIXZhbCkgewogCQljaGFuZ2UgPSBzZWwgIT0gMDsKLQkJaWYgKGNoYW5nZSkKLQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MDIsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwKTsKKwkJaWYgKGNoYW5nZSB8fCBjb2RlYy0+aW5fcmVzdW1lKQorCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwMiwgMCwKKwkJCQkJICAgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAwKTsKIAl9IGVsc2UgewogCQljaGFuZ2UgPSBzZWwgPT0gMDsKLQkJaWYgKGNoYW5nZSkKLQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MDIsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAxKTsKLQkJc2VsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDBiLCAwLCBBQ19WRVJCX0dFVF9DT05ORUNUX1NFTCwgMCkgKyAxOwotCQljaGFuZ2UgfD0gc2VsID09IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07Ci0JCWlmIChjaGFuZ2UpCi0JCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDAyLCAwLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKLQkJCQkJICAgIHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gLSAxKTsKKwkJaWYgKGNoYW5nZSB8fCBjb2RlYy0+aW5fcmVzdW1lKQorCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwMiwgMCwKKwkJCQkJICAgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAxKTsKKwkJc2VsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDBiLCAwLAorCQkJCQkgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUwsIDApICsgMTsKKwkJY2hhbmdlIHw9IHNlbCAhPSB2YWw7CisJCWlmIChjaGFuZ2UgfHwgY29kZWMtPmluX3Jlc3VtZSkKKwkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MGIsIDAsCisJCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgdmFsIC0gMSk7CiAJfQogCXJldHVybiBjaGFuZ2U7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2F0aWhkbWkuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYXRpaGRtaS5jCmluZGV4IDgzMTQ2OWQuLmY4ZWI0YzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYXRpaGRtaS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYXRpaGRtaS5jCkBAIC05NCw2ICs5NCwxNyBAQAogCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfY2xvc2UoY29kZWMsICZzcGVjLT5tdWx0aW91dCk7CiB9CiAKK3N0YXRpYyBpbnQgYXRpaGRtaV9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCQkgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGF0aWhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfcHJlcGFyZShjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdHJlYW1fdGFnLAorCQkJCQkgICAgIGZvcm1hdCwgc3Vic3RyZWFtKTsKK30KKwogc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBhdGloZG1pX3BjbV9kaWdpdGFsX3BsYXliYWNrID0gewogCS5zdWJzdHJlYW1zID0gMSwKIAkuY2hhbm5lbHNfbWluID0gMiwKQEAgLTEwMSw3ICsxMTIsOCBAQAogCS5uaWQgPSAweDIsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyBhbmQgc2V0dXAgc3RyZWFtcyAqLwogCS5vcHMgPSB7CiAJCS5vcGVuID0gYXRpaGRtaV9kaWdfcGxheWJhY2tfcGNtX29wZW4sCi0JCS5jbG9zZSA9IGF0aWhkbWlfZGlnX3BsYXliYWNrX3BjbV9jbG9zZQorCQkuY2xvc2UgPSBhdGloZG1pX2RpZ19wbGF5YmFja19wY21fY2xvc2UsCisJCS5wcmVwYXJlID0gYXRpaGRtaV9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUKIAl9LAogfTsKIApAQCAtMTYwLDYgKzE3Miw3IEBACiAgKi8KIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X2F0aWhkbWlbXSA9IHsKIAl7IC5pZCA9IDB4MTAwMjc5M2MsIC5uYW1lID0gIkFUSSBSUzYwMCBIRE1JIiwgLnBhdGNoID0gcGF0Y2hfYXRpaGRtaSB9LAotCXsgLmlkID0gMHgxMDAyNzkxYSwgLm5hbWUgPSAiQVRJIFJTNjkwIEhETUkiLCAucGF0Y2ggPSBwYXRjaF9hdGloZG1pIH0sCisJeyAuaWQgPSAweDEwMDI3OTFhLCAubmFtZSA9ICJBVEkgUlM2OTAvNzgwIEhETUkiLCAucGF0Y2ggPSBwYXRjaF9hdGloZG1pIH0sCisJeyAuaWQgPSAweDEwMDJhYTAxLCAubmFtZSA9ICJBVEkgUjYwMCBIRE1JIiwgLnBhdGNoID0gcGF0Y2hfYXRpaGRtaSB9LAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYwppbmRleCA1YjlkM2EzLi4zYzcyMmU2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKQEAgLTQ5Nyw2ICs0OTcsMTcgQEAKIAlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX2Nsb3NlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOwogfQogCitzdGF0aWMgaW50IGNtaTk4ODBfZGlnX3BsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCisJCQkJCSAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgIHVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJCQkgICAgdW5zaWduZWQgaW50IGZvcm1hdCwKKwkJCQkJICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBjbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfcHJlcGFyZShjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdHJlYW1fdGFnLAorCQkJCQkgICAgIGZvcm1hdCwgc3Vic3RyZWFtKTsKK30KKwogLyoKICAqIEFuYWxvZyBjYXB0dXJlCiAgKi8KQEAgLTU1Niw3ICs1NjcsOCBAQAogCS8qIE5JRCBpcyBzZXQgaW4gY21pOTg4MF9idWlsZF9wY21zICovCiAJLm9wcyA9IHsKIAkJLm9wZW4gPSBjbWk5ODgwX2RpZ19wbGF5YmFja19wY21fb3BlbiwKLQkJLmNsb3NlID0gY21pOTg4MF9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlCisJCS5jbG9zZSA9IGNtaTk4ODBfZGlnX3BsYXliYWNrX3BjbV9jbG9zZSwKKwkJLnByZXBhcmUgPSBjbWk5ODgwX2RpZ19wbGF5YmFja19wY21fcHJlcGFyZQogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKaW5kZXggNDZlOTNjNi4uYTVhNGIyYmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTEzNiw2ICsxMzYsMTggQEAKIAlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX2Nsb3NlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOwogfQogCitzdGF0aWMgaW50IGNvbmV4YW50X2RpZ19wbGF5YmFja19wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCQkgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCSB1bnNpZ25lZCBpbnQgc3RyZWFtX3RhZywKKwkJCQkJIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCQkJCSBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfcHJlcGFyZShjb2RlYywgJnNwZWMtPm11bHRpb3V0LAorCQkJCQkgICAgIHN0cmVhbV90YWcsCisJCQkJCSAgICAgZm9ybWF0LCBzdWJzdHJlYW0pOworfQorCiAvKgogICogQW5hbG9nIGNhcHR1cmUKICAqLwpAQCAtMTk0LDcgKzIwNiw4IEBACiAJLm5pZCA9IDAsIC8qIGZpbGwgbGF0ZXIgKi8KIAkub3BzID0gewogCQkub3BlbiA9IGNvbmV4YW50X2RpZ19wbGF5YmFja19wY21fb3BlbiwKLQkJLmNsb3NlID0gY29uZXhhbnRfZGlnX3BsYXliYWNrX3BjbV9jbG9zZQorCQkuY2xvc2UgPSBjb25leGFudF9kaWdfcGxheWJhY2tfcGNtX2Nsb3NlLAorCQkucHJlcGFyZSA9IGNvbmV4YW50X2RpZ19wbGF5YmFja19wY21fcHJlcGFyZQogCX0sCiB9OwogCkBAIC00NTIsMTE1ICs0NjUsNiBAQAogCSAgLnB1dCA9IGNvbmV4YW50X2NoX21vZGVfcHV0LCBcCiAJICAucHJpdmF0ZV92YWx1ZSA9IG5pZCB8IChkaXI8PDE2KSB9CiAKLXN0YXRpYyBpbnQgY3h0X2dwaW9fZGF0YV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKLXsKLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKLQl1aW5mby0+Y291bnQgPSAxOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7Ci0JdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKLQlyZXR1cm4gMDsKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi1zdGF0aWMgaW50IGN4dF9ncGlvX2RhdGFfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7Ci0JdW5zaWduZWQgY2hhciBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0JbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwotCXVuc2lnbmVkIGludCB2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJICAgICAgQUNfVkVSQl9HRVRfR1BJT19EQVRBLCAweDAwKTsKLQotCSp2YWxwID0gKHZhbCAmIG1hc2spICE9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3h0X2dwaW9fZGF0YV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4ZmZmZjsKLQl1bnNpZ25lZCBjaGFyIG1hc2sgPSAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPj4gMTYpICYgMHhmZjsKLQlsb25nIHZhbCA9ICp1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZTsKLQl1bnNpZ25lZCBpbnQgZ3Bpb19kYXRhID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCi0JCQkJCQkgICAgQUNfVkVSQl9HRVRfR1BJT19EQVRBLAotCQkJCQkJICAgIDB4MDApOwotCXVuc2lnbmVkIGludCBvbGRfZGF0YSA9IGdwaW9fZGF0YTsKLQotCS8qIFNldC91bnNldCB0aGUgbWFza2VkIEdQSU8gYml0KHMpIGFzIG5lZWRlZCAqLwotCWlmICh2YWwgPT0gMCkKLQkJZ3Bpb19kYXRhICY9IH5tYXNrOwotCWVsc2UKLQkJZ3Bpb19kYXRhIHw9IG1hc2s7Ci0JaWYgKGdwaW9fZGF0YSA9PSBvbGRfZGF0YSAmJiAhY29kZWMtPmluX3Jlc3VtZSkKLQkJcmV0dXJuIDA7Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIGdwaW9fZGF0YSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLSNkZWZpbmUgQ1hUX0dQSU9fREFUQV9TV0lUQ0goeG5hbWUsIG5pZCwgbWFzaykgXAotCXsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsIC5pbmRleCA9IDAsICBcCi0JICAuaW5mbyA9IGN4dF9ncGlvX2RhdGFfaW5mbywgXAotCSAgLmdldCA9IGN4dF9ncGlvX2RhdGFfZ2V0LCBcCi0JICAucHV0ID0gY3h0X2dwaW9fZGF0YV9wdXQsIFwKLQkgIC5wcml2YXRlX3ZhbHVlID0gbmlkIHwgKG1hc2s8PDE2KSB9Ci0jaWYgMAotc3RhdGljIGludCBjeHRfc3BkaWZfY3RybF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCi17Ci0JdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47Ci0JdWluZm8tPmNvdW50ID0gMTsKLQl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOwotCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7Ci0JcmV0dXJuIDA7Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotc3RhdGljIGludCBjeHRfc3BkaWZfY3RybF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQloZGFfbmlkX3QgbmlkID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgJiAweGZmZmY7Ci0JdW5zaWduZWQgY2hhciBtYXNrID0gKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2KSAmIDB4ZmY7Ci0JbG9uZyAqdmFscCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwotCXVuc2lnbmVkIGludCB2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJICAgICAgQUNfVkVSQl9HRVRfRElHSV9DT05WRVJULCAweDAwKTsKLQotCSp2YWxwID0gKHZhbCAmIG1hc2spICE9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY3h0X3NwZGlmX2N0cmxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JaGRhX25pZF90IG5pZCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlICYgMHhmZmZmOwotCXVuc2lnbmVkIGNoYXIgbWFzayA9IChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSA+PiAxNikgJiAweGZmOwotCWxvbmcgdmFsID0gKnVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlOwotCXVuc2lnbmVkIGludCBjdHJsX2RhdGEgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJCSAgICBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlQsCi0JCQkJCQkgICAgMHgwMCk7Ci0JdW5zaWduZWQgaW50IG9sZF9kYXRhID0gY3RybF9kYXRhOwotCi0JLyogU2V0L3Vuc2V0IHRoZSBtYXNrZWQgY29udHJvbCBiaXQocykgYXMgbmVlZGVkICovCi0JaWYgKHZhbCA9PSAwKQotCQljdHJsX2RhdGEgJj0gfm1hc2s7Ci0JZWxzZQotCQljdHJsX2RhdGEgfD0gbWFzazsKLQlpZiAoY3RybF9kYXRhID09IG9sZF9kYXRhICYmICFjb2RlYy0+aW5fcmVzdW1lKQotCQlyZXR1cm4gMDsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLAotCQkJICAgIGN0cmxfZGF0YSk7Ci0JcmV0dXJuIDE7Ci19Ci0KLSNkZWZpbmUgQ1hUX1NQRElGX0NUUkxfU1dJVENIKHhuYW1lLCBuaWQsIG1hc2spIFwKLQl7IC5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAuaW5kZXggPSAwLCAgXAotCSAgLmluZm8gPSBjeHRfc3BkaWZfY3RybF9pbmZvLCBcCi0JICAuZ2V0ID0gY3h0X3NwZGlmX2N0cmxfZ2V0LCBcCi0JICAucHV0ID0gY3h0X3NwZGlmX2N0cmxfcHV0LCBcCi0JICAucHJpdmF0ZV92YWx1ZSA9IG5pZCB8IChtYXNrPDwxNikgfQotI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX1NORF9ERUJVRyAqLwogCiAvKiBDb25leGFudCA1MDQ1IHNwZWNpZmljICovCkBAIC01OTksNiArNTAzLDcgQEAKIAliaXRzID0gKCFzcGVjLT5ocF9wcmVzZW50ICYmIHNwZWMtPmN1cl9lYXBkKSA/IDAgOiAweDgwOwogCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMCwgMCwgSERBX09VVFBVVCwgMCwgMHg4MCwgYml0cyk7CiAJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDEwLCAxLCBIREFfT1VUUFVULCAwLCAweDgwLCBiaXRzKTsKKwogCWJpdHMgPSBzcGVjLT5jdXJfZWFwZCA/IDAgOiAweDgwOwogCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMSwgMCwgSERBX09VVFBVVCwgMCwgMHg4MCwgYml0cyk7CiAJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDExLCAxLCBIREFfT1VUUFVULCAwLCAweDgwLCBiaXRzKTsKQEAgLTYyNCw2ICs1MjksMjkgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCisvKiB0b2dnbGUgaW5wdXQgb2YgYnVpbHQtaW4gYW5kIG1pYyBqYWNrIGFwcHJvcHJpYXRlbHkgKi8KK3N0YXRpYyB2b2lkIGN4dDUwNDVfaHBfYXV0b21pYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdGF0aWMgc3RydWN0IGhkYV92ZXJiIG1pY19qYWNrX29uW10gPSB7CisJCXsweDE0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODB9LAorCQl7MHgxMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkJe30KKwl9OworCXN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgbWljX2phY2tfb2ZmW10gPSB7CisJCXsweDEyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwODB9LAorCQl7MHgxNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDAwfSwKKwkJe30KKwl9OworCXVuc2lnbmVkIGludCBwcmVzZW50OworCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxMiwgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCWlmIChwcmVzZW50KQorCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBtaWNfamFja19vbik7CisJZWxzZQorCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBtaWNfamFja19vZmYpOworfQorCiAKIC8qIG11dGUgaW50ZXJuYWwgc3BlYWtlciBpZiBIUCBpcyBwbHVnZ2VkICovCiBzdGF0aWMgdm9pZCBjeHQ1MDQ1X2hwX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNjM0LDcgKzU2Miw3IEBACiAJc3BlYy0+aHBfcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxMSwgMCwKIAkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOwogCi0JYml0cyA9IChzcGVjLT5ocF9wcmVzZW50IHx8ICFzcGVjLT5jdXJfZWFwZCkgPyAweDgwIDogMDsKKwliaXRzID0gKHNwZWMtPmhwX3ByZXNlbnQgfHwgIXNwZWMtPmN1cl9lYXBkKSA/IDB4ODAgOiAwOyAKIAlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTAsIDAsIEhEQV9PVVRQVVQsIDAsIDB4ODAsIGJpdHMpOwogCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxMCwgMSwgSERBX09VVFBVVCwgMCwgMHg4MCwgYml0cyk7CiB9CkBAIC02NDgsNiArNTc2LDEwIEBACiAJY2FzZSBDT05FWEFOVF9IUF9FVkVOVDoKIAkJY3h0NTA0NV9ocF9hdXRvbXV0ZShjb2RlYyk7CiAJCWJyZWFrOworCWNhc2UgQ09ORVhBTlRfTUlDX0VWRU5UOgorCQljeHQ1MDQ1X2hwX2F1dG9taWMoY29kZWMpOworCQlicmVhazsKKwogCX0KIH0KIApAQCAtNjU5LDEyICs1OTEsMTAgQEAKIAkJLmdldCA9IGNvbmV4YW50X211eF9lbnVtX2dldCwKIAkJLnB1dCA9IGNvbmV4YW50X211eF9lbnVtX3B1dAogCX0sCi0JSERBX0NPREVDX1ZPTFVNRSgiSW50IE1pYyBWb2x1bWUiLCAweDE3LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJJbnQgTWljIFN3aXRjaCIsIDB4MTcsIDB4MDEsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiRXh0IE1pYyBWb2x1bWUiLCAweDE3LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJFeHQgTWljIFN3aXRjaCIsIDB4MTcsIDB4MDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDFhLCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgxYSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkludCBNaWMgVm9sdW1lIiwgMHgxYSwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSW50IE1pYyBTd2l0Y2giLCAweDFhLCAweDAxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkV4dCBNaWMgVm9sdW1lIiwgMHgxYSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRXh0IE1pYyBTd2l0Y2giLCAweDFhLCAweDAyLCBIREFfSU5QVVQpLAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLApAQCAtNjg4LDcgKzYxOCw3IEBACiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGN4dDUwNDVfaW5pdF92ZXJic1tdID0gewogCS8qIExpbmUgaW4sIE1pYyAqLwogCXsweDEyLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAotCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTnxBQ19QSU5DVExfVlJFRl81MCB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTnxBQ19QSU5DVExfVlJFRl84MCB9LAogCS8qIEhQLCBBbXAgICovCiAJezB4MTEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQIH0sCiAJezB4MTcsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MDF9LApAQCAtNzAxLDE4ICs2MzEsMjkgQEAKIAl7MHgxNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKIAkgQUNfQU1QX1NFVF9PVVRQVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgwNH0sCiAJLyogUmVjb3JkIHNlbGVjdG9yOiBJbnQgbWljICovCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MH0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MX0sCiAJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCiAJIEFDX0FNUF9TRVRfSU5QVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgxN30sCiAJLyogU1BESUYgcm91dGU6IFBDTSAqLwogCXsgMHgxMywgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MCB9LAotCS8qIHBpbiBzZW5zaW5nIG9uIEhQIGFuZCBNaWMgamFja3MgKi8KLQl7MHgxMSwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IENPTkVYQU5UX0hQX0VWRU5UfSwKIAkvKiBFQVBEICovCiAJezB4MTAsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAweDIgfSwgLyogZGVmYXVsdCBvbiAqLyAKIAl7IH0gLyogZW5kICovCiB9OwogCisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA0NV9ocF9zZW5zZV9pbml0X3ZlcmJzW10gPSB7CisJLyogcGluIHNlbnNpbmcgb24gSFAgamFjayAqLworCXsweDExLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQ09ORVhBTlRfSFBfRVZFTlR9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA0NV9taWNfc2Vuc2VfaW5pdF92ZXJic1tdID0geworCS8qIHBpbiBzZW5zaW5nIG9uIEhQIGphY2sgKi8KKwl7MHgxMiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IENPTkVYQU5UX01JQ19FVkVOVH0sCisJeyB9IC8qIGVuZCAqLworfTsKKwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIC8qIFRlc3QgY29uZmlndXJhdGlvbiBmb3IgZGVidWdnaW5nLCBtb2RlbGxlZCBhZnRlciB0aGUgQUxDMjYwIHRlc3QKICAqIGNvbmZpZ3VyYXRpb24uCkBAIC03MzMsNiArNjc0LDEwIEBACiAJLyogT3V0cHV0IGNvbnRyb2xzICovCiAJSERBX0NPREVDX1ZPTFVNRSgiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDEwLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTm9kZSAxMSBQbGF5YmFjayBWb2x1bWUiLCAweDExLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJOb2RlIDExIFBsYXliYWNrIFN3aXRjaCIsIDB4MTEsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTm9kZSAxMiBQbGF5YmFjayBWb2x1bWUiLCAweDEyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJOb2RlIDEyIFBsYXliYWNrIFN3aXRjaCIsIDB4MTIsIDB4MCwgSERBX09VVFBVVCksCiAJCiAJLyogTW9kZXMgZm9yIHJldGFza2luZyBwaW4gd2lkZ2V0cyAqLwogCUNYVF9QSU5fTU9ERSgiSFAtT1VUIHBpbiBtb2RlIiwgMHgxMSwgQ1hUX1BJTl9ESVJfSU5PVVQpLApAQCAtNzQyLDI1ICs2ODcsMTcgQEAKIAlDWFRfRUFQRF9TV0lUQ0goIkV4dGVybmFsIEFtcGxpZmllciIsIDB4MTAsIDB4MCksCiAKIAkvKiBMb29wYmFjayBtaXhlciBjb250cm9scyAqLwotCUhEQV9DT0RFQ19WT0xVTUUoIk1JQzEgUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgwMSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTUlDMSBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDAxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkxJTkUgbG9vcGJhY2sgUGxheWJhY2sgVm9sdW1lIiwgMHgxNywgMHgwMiwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiTElORSBsb29wYmFjayBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDAyLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkhQLU9VVCBsb29wYmFjayBQbGF5YmFjayBWb2x1bWUiLCAweDE3LCAweDAzLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJIUC1PVVQgbG9vcGJhY2sgUGxheWJhY2sgU3dpdGNoIiwgMHgxNywgMHgwMywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDE3LCAweDA0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDE3LCAweDA0LCBIREFfSU5QVVQpLAogCi0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZS0xIFZvbHVtZSIsIDB4MTcsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZS0xIFN3aXRjaCIsIDB4MTcsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlLTIgVm9sdW1lIiwgMHgxNywgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlLTIgU3dpdGNoIiwgMHgxNywgMHgxLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUtMyBWb2x1bWUiLCAweDE3LCAweDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX01VVEUoIkNhcHR1cmUtMyBTd2l0Y2giLCAweDE3LCAweDIsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZS00IFZvbHVtZSIsIDB4MTcsIDB4MywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZS00IFN3aXRjaCIsIDB4MTcsIDB4MywgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlLTUgVm9sdW1lIiwgMHgxNywgMHg0LCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlLTUgU3dpdGNoIiwgMHgxNywgMHg0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1peGVyLTEgVm9sdW1lIiwgMHgxNywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaXhlci0xIFN3aXRjaCIsIDB4MTcsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaXhlci0yIFZvbHVtZSIsIDB4MTcsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWl4ZXItMiBTd2l0Y2giLCAweDE3LCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWl4ZXItMyBWb2x1bWUiLCAweDE3LCAweDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1peGVyLTMgU3dpdGNoIiwgMHgxNywgMHgyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1peGVyLTQgVm9sdW1lIiwgMHgxNywgMHgzLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaXhlci00IFN3aXRjaCIsIDB4MTcsIDB4MywgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaXhlci01IFZvbHVtZSIsIDB4MTcsIDB4NCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWl4ZXItNSBTd2l0Y2giLCAweDE3LCAweDQsIEhEQV9JTlBVVCksCiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKQEAgLTc2OCwxNCArNzA1LDE3IEBACiAJCS5nZXQgPSBjb25leGFudF9tdXhfZW51bV9nZXQsCiAJCS5wdXQgPSBjb25leGFudF9tdXhfZW51bV9wdXQsCiAJfSwKLQogCXsgfSAvKiBlbmQgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgY3h0NTA0NV90ZXN0X2luaXRfdmVyYnNbXSA9IHsKKwkvKiBTZXQgY29ubmVjdGlvbnMgKi8KKwl7IDB4MTAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAgfSwKKwl7IDB4MTEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAgfSwKKwl7IDB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAgfSwKIAkvKiBFbmFibGUgcmV0YXNraW5nIHBpbnMgYXMgb3V0cHV0LCBpbml0aWFsbHkgd2l0aG91dCBwb3dlciBhbXAgKi8KIAl7MHgxMiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKLQl7MHgxMSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDExLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAogCiAJLyogRGlzYWJsZSBkaWdpdGFsIChTUERJRikgcGlucyBpbml0aWFsbHksIGJ1dCB1c2VycyBjYW4gZW5hYmxlCiAJICogdGhlbSB2aWEgYSBtaXhlciBzd2l0Y2guICBJbiB0aGUgY2FzZSBvZiBTUERJRi1vdXQsIHRoaXMgaW5pdHZlcmIKQEAgLTgwNCw2ICs3NDQsNyBAQAogCSAqIHBpbikKIAkgKi8KIAl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE3LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCiAKIAkvKiBNdXRlIGFsbCBpbnB1dHMgdG8gbWl4ZXIgd2lkZ2V0IChldmVuIHVuY29ubmVjdGVkIG9uZXMpICovCiAJezB4MTcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwgLyogTWl4ZXIgcGluICovCkBAIC04MjcsNyArNzY4LDggQEAKIAogCiBlbnVtIHsKLQlDWFQ1MDQ1X0xBUFRPUCwJLyogTGFwdG9wcyB3LyBFQVBEIHN1cHBvcnQgKi8KKwlDWFQ1MDQ1X0xBUFRPUCwJIC8qIExhcHRvcHMgdy8gRUFQRCBzdXBwb3J0ICovCisJQ1hUNTA0NV9GVUpJVFNVLCAvKiBMYXB0b3BzIHcvIEVBUEQgc3VwcG9ydCAqLyAKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJQ1hUNTA0NV9URVNULAogI2VuZGlmCkBAIC04MzYsNiArNzc4LDcgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmN4dDUwNDVfbW9kZWxzW0NYVDUwNDVfTU9ERUxTXSA9IHsKIAlbQ1hUNTA0NV9MQVBUT1BdCT0gImxhcHRvcCIsCisJW0NYVDUwNDVfRlVKSVRTVV0JPSAiZnVqaXRzdSIsCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwogCVtDWFQ1MDQ1X1RFU1RdCQk9ICJ0ZXN0IiwKICNlbmRpZgpAQCAtODQ0LDcgKzc4NywxMSBAQAogc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGN4dDUwNDVfY2ZnX3RibFtdID0gewogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwYjcsICJIUCBEVjYwMDBaIiwgQ1hUNTA0NV9MQVBUT1ApLAogCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwYmIsICJIUCBEVjgwMDAiLCBDWFQ1MDQ1X0xBUFRPUCksCi0JU05EX1BDSV9RVUlSSygweDE3MzQsIDB4MTBhZCwgIkZ1aml0c3UgU2kxNTIwIiwgQ1hUNTA0NV9MQVBUT1ApLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDMwYjIsICJIUCBEViBTZXJpZXMiLCBDWFQ1MDQ1X0xBUFRPUCksCisJU05EX1BDSV9RVUlSSygweDEwM2MsIDB4MzBiNSwgIkhQIERWMjEyMCIsIENYVDUwNDVfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAzYywgMHgzMGNkLCAiSFAgRFYgU2VyaWVzIiwgQ1hUNTA0NV9MQVBUT1ApLAorCVNORF9QQ0lfUVVJUksoMHgxNzM0LCAweDEwYWQsICJGdWppdHN1IFNpMTUyMCIsIENYVDUwNDVfRlVKSVRTVSksCisJU05EX1BDSV9RVUlSSygweDgwODYsIDB4MjExMSwgIkNvbmV4YW50IFJlZmVyZW5jZSBib2FyZCIsIENYVDUwNDVfTEFQVE9QKSwKIAl7fQogfTsKIApAQCAtODc3LDE2ICs4MjQsMjMgQEAKIAogCiAJY29kZWMtPnBhdGNoX29wcyA9IGNvbmV4YW50X3BhdGNoX29wczsKLQljb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50ID0gY3h0NTA0NV9ocF91bnNvbF9ldmVudDsKIAogCWJvYXJkX2NvbmZpZyA9IHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnKGNvZGVjLCBDWFQ1MDQ1X01PREVMUywKIAkJCQkJCSAgY3h0NTA0NV9tb2RlbHMsCiAJCQkJCQkgIGN4dDUwNDVfY2ZnX3RibCk7CiAJc3dpdGNoIChib2FyZF9jb25maWcpIHsKIAljYXNlIENYVDUwNDVfTEFQVE9QOgorCQljb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50ID0gY3h0NTA0NV9ocF91bnNvbF9ldmVudDsKIAkJc3BlYy0+aW5wdXRfbXV4ID0gJmN4dDUwNDVfY2FwdHVyZV9zb3VyY2U7CiAJCXNwZWMtPm51bV9pbml0X3ZlcmJzID0gMjsKLQkJc3BlYy0+aW5pdF92ZXJic1sxXSA9IGN4dDUwNDVfaW5pdF92ZXJiczsKKwkJc3BlYy0+aW5pdF92ZXJic1sxXSA9IGN4dDUwNDVfaHBfc2Vuc2VfaW5pdF92ZXJiczsKKwkJc3BlYy0+bWl4ZXJzWzBdID0gY3h0NTA0NV9taXhlcnM7CisJCWNvZGVjLT5wYXRjaF9vcHMuaW5pdCA9IGN4dDUwNDVfaW5pdDsKKwkJYnJlYWs7CisJY2FzZSBDWFQ1MDQ1X0ZVSklUU1U6CisJCXNwZWMtPmlucHV0X211eCA9ICZjeHQ1MDQ1X2NhcHR1cmVfc291cmNlOworCQlzcGVjLT5udW1faW5pdF92ZXJicyA9IDI7CisJCXNwZWMtPmluaXRfdmVyYnNbMV0gPSBjeHQ1MDQ1X21pY19zZW5zZV9pbml0X3ZlcmJzOwogCQlzcGVjLT5taXhlcnNbMF0gPSBjeHQ1MDQ1X21peGVyczsKIAkJY29kZWMtPnBhdGNoX29wcy5pbml0ID0gY3h0NTA0NV9pbml0OwogCQlicmVhazsKQEAgLTkxMywxMCArODY3LDkgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBjeHQ1MDQ3X2NhcHR1cmVfc291cmNlID0gewotCS5udW1faXRlbXMgPSAyLAorCS5udW1faXRlbXMgPSAxLAogCS5pdGVtcyA9IHsKLQkJeyAiRXh0TWljIiwgMHgwIH0sCi0JCXsgIkludE1pYyIsIDB4MSB9LAorCQl7ICJNaWMiLCAweDIgfSwKIAl9CiB9OwogCkBAIC0xMDA5LDcgKzk2Miw3IEBACiAJfTsKIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKIAotCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MDgsIDAsCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNSwgMCwKIAkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOwogCWlmIChwcmVzZW50KQogCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBtaWNfamFja19vbik7CkBAIC0xMDMzLDM3ICs5ODYsMjAgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGN4dDUwNDdfbWl4ZXJzW10gPSB7Ci0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAotCQkuaW5mbyA9IGNvbmV4YW50X211eF9lbnVtX2luZm8sCi0JCS5nZXQgPSBjb25leGFudF9tdXhfZW51bV9nZXQsCi0JCS5wdXQgPSBjb25leGFudF9tdXhfZW51bV9wdXQKLQl9LAogCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCeXBhc3MgQ2FwdHVyZSBWb2x1bWUiLCAweDE5LCAweDAyLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgQnlwYXNzIENhcHR1cmUgU3dpdGNoIiwgMHgxOSwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgR2FpbiBWb2x1bWUiLCAweDFhLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgR2FpbiBTd2l0Y2giLCAweDFhLCAweDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgxMiwgMHgwMywgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDEyLCAweDAzLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIlBDTSBWb2x1bWUiLCAweDEwLCAweDAwLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiUENNIFN3aXRjaCIsIDB4MTAsIDB4MDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19WT0xVTUUoIlBDTS0yIFZvbHVtZSIsIDB4MWMsIDB4MDAsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJQQ00tMiBTd2l0Y2giLCAweDFjLCAweDAwLCBIREFfT1VUUFVUKSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwKLQkJLmluZm8gPSBzbmRfaGRhX21peGVyX2FtcF92b2x1bWVfaW5mbywKLQkJLmdldCA9IHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9nZXQsCi0JCS5wdXQgPSBjeHQ1MDQ3X2hwX21hc3Rlcl92b2xfcHV0LAotCQkucHJpdmF0ZV92YWx1ZSA9IEhEQV9DT01QT1NFX0FNUF9WQUwoMHgxMywgMywgMCwgSERBX09VVFBVVCksCi0JfSwKLQl7Ci0JCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKLQkJLmluZm8gPSBjeHRfZWFwZF9pbmZvLAotCQkuZ2V0ID0gY3h0X2VhcGRfZ2V0LAotCQkucHV0ID0gY3h0NTA0N19ocF9tYXN0ZXJfc3dfcHV0LAotCQkucHJpdmF0ZV92YWx1ZSA9IDB4MTMsCi0JfSwKKwlIREFfQ09ERUNfVk9MVU1FKCJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MWQsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MWQsIDB4MDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAweDEzLCAweDAwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MTMsIDB4MDAsIEhEQV9PVVRQVVQpLAogCiAJe30KIH07CkBAIC0xMTMzLDE4ICsxMDY5LDE5IEBACiAJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOIH0sCiAJezB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfEFDX1BJTkNUTF9WUkVGXzUwIH0sCiAJezB4MTcsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0lOfEFDX1BJTkNUTF9WUkVGXzUwIH0sCi0JLyogSFAsIEFtcCwgU3BlYWtlciAgKi8KLQl7MHgxMywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCi0JezB4MUEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MDB9LAorCS8qIEhQLCBTcGVha2VyICAqLworCXsweDEzLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCB9LAorCXsweDEzLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwweDF9LAorCXsweDFkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwweDB9LAorCS8qIFJlY29yZCBzZWxlY3RvcjogTWljICovCisJezB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MDN9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCSBBQ19BTVBfU0VUX0lOUFVUfEFDX0FNUF9TRVRfUklHSFR8QUNfQU1QX1NFVF9MRUZUfDB4MTd9LAorCXsweDFBLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwweDAyfSwKIAl7MHgxQSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKIAkgQUNfQU1QX1NFVF9PVVRQVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgwMH0sCiAJezB4MUEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCiAJIEFDX0FNUF9TRVRfT1VUUFVUfEFDX0FNUF9TRVRfUklHSFR8QUNfQU1QX1NFVF9MRUZUfDB4MDN9LAotCXsweDFkLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwweDB9LAotCS8qIFJlY29yZCBzZWxlY3RvcjogRnJvbnQgbWljICovCi0JezB4MTIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLDB4MDN9LAotCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAotCSBBQ19BTVBfU0VUX0lOUFVUfEFDX0FNUF9TRVRfUklHSFR8QUNfQU1QX1NFVF9MRUZUfDB4MTd9LAogCS8qIFNQRElGIHJvdXRlOiBQQ00gKi8KIAl7IDB4MTgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAgfSwKIAkvKiBFbmFibGUgdW5zb2xpY2l0ZWQgZXZlbnRzICovCkBAIC0xMTYxLDggKzEwOTgsNiBAQAogCXsweDE1LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQ09ORVhBTlRfTUlDX0VWRU5UfSwKIAkvKiBTcGVha2VyIHJvdXRpbmcgKi8KIAl7MHgxZCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsMHgxfSwKLQkvKiBDaGFuZ2UgZGVmYXVsdCB0byBFeHRNaWMgZm9yIHJlY29yZGluZyAqLwotCXsweDFhLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwweDJ9LAogCXt9CiB9OwogCkBAIC0xMTcyLDcgKzExMDcsNiBAQAogCXsweDEzLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQ09ORVhBTlRfSFBfRVZFTlR9LAogCS8qIFJlY29yZCBzZWxlY3RvcjogRXh0IE1pYyAqLwogCXsweDEyLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwweDAzfSwKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsMHgwMn0sCiAJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCiAJIEFDX0FNUF9TRVRfSU5QVVR8QUNfQU1QX1NFVF9SSUdIVHxBQ19BTVBfU0VUX0xFRlR8MHgxN30sCiAJLyogU3BlYWtlciByb3V0aW5nICovCkBAIC0xMjQyLDE0ICsxMTc2LDYgQEAKIAkJLmdldCA9IGNvbmV4YW50X211eF9lbnVtX2dldCwKIAkJLnB1dCA9IGNvbmV4YW50X211eF9lbnVtX3B1dCwKIAl9LAotICAgICAgIC8qIENvbnRyb2xzIGZvciBHUElPIHBpbnMsIGFzc3VtaW5nIHRoZXkgZXhpc3QgYW5kIGFyZSBjb25maWd1cmVkCi0JKiBhcyBvdXRwdXRzCi0JKi8KLQlDWFRfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMCIsIDB4MDEsIDB4MDEpLAotCUNYVF9HUElPX0RBVEFfU1dJVENIKCJHUElPIHBpbiAxIiwgMHgwMSwgMHgwMiksCi0JQ1hUX0dQSU9fREFUQV9TV0lUQ0goIkdQSU8gcGluIDIiLCAweDAxLCAweDA0KSwKLQlDWFRfR1BJT19EQVRBX1NXSVRDSCgiR1BJTyBwaW4gMyIsIDB4MDEsIDB4MDgpLAotCiAJeyB9IC8qIGVuZCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCBmYmEzY2IxLi5hNGVkZTI3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtNzQsNiArNzQsOCBAQAogCUFMQzI2MF9IUF8zMDEzLAogCUFMQzI2MF9GVUpJVFNVX1M3MDJYLAogCUFMQzI2MF9BQ0VSLAorCUFMQzI2MF9XSUxMLAorCUFMQzI2MF9SRVBMQUNFUl82NzJWLAogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlBTEMyNjBfVEVTVCwKICNlbmRpZgpAQCAtMTE1LDE1ICsxMTcsMjggQEAKIAlBTEM4NjFWRF8zU1QsCiAJQUxDODYxVkRfM1NUX0RJRywKIAlBTEM4NjFWRF82U1RfRElHLAorCUFMQzg2MVZEX0xFTk9WTywKIAlBTEM4NjFWRF9BVVRPLAogCUFMQzg2MVZEX01PREVMX0xBU1QsCiB9OwogCisvKiBBTEM2NjIgbW9kZWxzICovCitlbnVtIHsKKwlBTEM2NjJfM1NUXzJjaF9ESUcsCisJQUxDNjYyXzNTVF82Y2hfRElHLAorCUFMQzY2Ml8zU1RfNmNoLAorCUFMQzY2Ml81U1RfRElHLAorCUFMQzY2Ml9MRU5PVk9fMTAxRSwKKwlBTEM2NjJfQVVUTywKKwlBTEM2NjJfTU9ERUxfTEFTVCwKK307CisKIC8qIEFMQzg4MiBtb2RlbHMgKi8KIGVudW0gewogCUFMQzg4Ml8zU1RfRElHLAogCUFMQzg4Ml82U1RfRElHLAogCUFMQzg4Ml9BUklNQSwKKwlBTEM4ODJfVzJKQywKIAlBTEM4ODJfQVVUTywKIAlBTEM4ODVfTUFDUFJPLAogCUFMQzg4Ml9NT0RFTF9MQVNULApAQCAtMTQxLDYgKzE1Niw3IEBACiAJQUxDODgzX0FDRVIsCiAJQUxDODgzX01FRElPTiwKIAlBTEM4ODNfTEFQVE9QX0VBUEQsCisJQUxDODgzX0xFTk9WT18xMDFFXzJjaCwKIAlBTEM4ODNfQVVUTywKIAlBTEM4ODNfTU9ERUxfTEFTVCwKIH07CkBAIC0xNjMsNyArMTc5LDcgQEAKIAlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKnN0cmVhbV9hbmFsb2dfcGxheWJhY2s7CiAJc3RydWN0IGhkYV9wY21fc3RyZWFtICpzdHJlYW1fYW5hbG9nX2NhcHR1cmU7CiAKLQljaGFyICpzdHJlYW1fbmFtZV9kaWdpdGFsOwkvKiBkaWdpdGFsIFBDTSBzdHJlYW0gKi8gCisJY2hhciAqc3RyZWFtX25hbWVfZGlnaXRhbDsJLyogZGlnaXRhbCBQQ00gc3RyZWFtICovCiAJc3RydWN0IGhkYV9wY21fc3RyZWFtICpzdHJlYW1fZGlnaXRhbF9wbGF5YmFjazsKIAlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKnN0cmVhbV9kaWdpdGFsX2NhcHR1cmU7CiAKQEAgLTQwMSw3ICs0MTcsNyBAQAogCQkJCQkJIEFDX1ZFUkJfR0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKIAkJCQkJCSAweDAwKTsKIAotCWlmICh2YWwgPCBhbGNfcGluX21vZGVfbWluKGRpcikgfHwgdmFsID4gYWxjX3Bpbl9tb2RlX21heChkaXIpKSAKKwlpZiAodmFsIDwgYWxjX3Bpbl9tb2RlX21pbihkaXIpIHx8IHZhbCA+IGFsY19waW5fbW9kZV9tYXgoZGlyKSkKIAkJdmFsID0gYWxjX3Bpbl9tb2RlX21pbihkaXIpOwogCiAJY2hhbmdlID0gcGluY3RsICE9IGFsY19waW5fbW9kZV92YWx1ZXNbdmFsXTsKQEAgLTQ2MCw3ICs0NzYsOCBAQAogCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKIAlyZXR1cm4gMDsKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCiBzdGF0aWMgaW50IGFsY19ncGlvX2RhdGFfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKQEAgLTUyMCw3ICs1MzcsOCBAQAogCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CiAJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKIAlyZXR1cm4gMDsKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfQorCiBzdGF0aWMgaW50IGFsY19zcGRpZl9jdHJsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewpAQCAtNTkyLDcgKzYxMCw3IEBACiAJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gcHJlc2V0LT5ocF9uaWQ7CiAJCiAJc3BlYy0+bnVtX211eF9kZWZzID0gcHJlc2V0LT5udW1fbXV4X2RlZnM7Ci0JaWYgKCEgc3BlYy0+bnVtX211eF9kZWZzKQorCWlmICghc3BlYy0+bnVtX211eF9kZWZzKQogCQlzcGVjLT5udW1fbXV4X2RlZnMgPSAxOwogCXNwZWMtPmlucHV0X211eCA9IHByZXNldC0+aW5wdXRfbXV4OwogCkBAIC02MDQsNiArNjIyLDkwIEBACiAJc3BlYy0+aW5pdF9ob29rID0gcHJlc2V0LT5pbml0X2hvb2s7CiB9CiAKKy8qIEVuYWJsZSBHUElPIG1hc2sgYW5kIHNldCBvdXRwdXQgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjX2dwaW8xX2luaXRfdmVyYnNbXSA9IHsKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19NQVNLLCAweDAxfSwKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDF9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDF9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGNfZ3BpbzJfaW5pdF92ZXJic1tdID0geworCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MDJ9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwMn0sCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMn0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsY19ncGlvM19pbml0X3ZlcmJzW10gPSB7CisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwM30sCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDAzfSwKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAweDAzfSwKKwl7IH0KK307CisKKy8qIDMyLWJpdCBzdWJzeXN0ZW0gSUQgZm9yIEJJT1MgbG9hZGluZyBpbiBIRCBBdWRpbyBjb2RlYy4KKyAqCTMxIH4gMTYgOglNYW51ZmFjdHVyZSBJRAorICoJMTUgfiA4CToJU0tVIElECisgKgk3ICB+IDAJOglBc3NlbWJseSBJRAorICoJcG9ydC1BIC0tPiBwaW4gMzkvNDEsIHBvcnQtRSAtLT4gcGluIDE0LzE1LCBwb3J0LUQgLS0+IHBpbiAzNS8zNgorICovCitzdGF0aWMgdm9pZCBhbGNfc3Vic3lzdGVtX2lkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcG9ydGEsIHVuc2lnbmVkIGludCBwb3J0ZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IHBvcnRkKQoreworCXVuc2lnbmVkIGludCBhc3MsIHRtcDsKKworCWFzcyA9IGNvZGVjLT5zdWJzeXN0ZW1faWQ7CisJaWYgKCEoYXNzICYgMSkpCisJCXJldHVybjsKKworCS8qIE92ZXJyaWRlICovCisJdG1wID0gKGFzcyAmIDB4MzgpID4+IDM7CS8qIGV4dGVybmFsIEFtcCBjb250cm9sICovCisJc3dpdGNoICh0bXApIHsKKwljYXNlIDE6CisJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGFsY19ncGlvMV9pbml0X3ZlcmJzKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKGNvZGVjLCBhbGNfZ3BpbzJfaW5pdF92ZXJicyk7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgYWxjX2dwaW8zX2luaXRfdmVyYnMpOworCQlicmVhazsKKwljYXNlIDU6CisJCXN3aXRjaCAoY29kZWMtPnZlbmRvcl9pZCkgeworCQljYXNlIDB4MTBlYzA4NjI6CisJCWNhc2UgMHgxMGVjMDY2MDoKKwkJY2FzZSAweDEwZWMwNjYyOgkKKwkJY2FzZSAweDEwZWMwMjY3OgorCQljYXNlIDB4MTBlYzAyNjg6CisJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDE0LCAwLAorCQkJCQkgICAgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDIpOworCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxNSwgMCwKKwkJCQkJICAgIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAyKTsKKwkJCXJldHVybjsKKwkJfQorCWNhc2UgNjoKKwkJaWYgKGFzcyAmIDQpIHsJLyogYml0IDIgOiAwID0gRGVza3RvcCwgMSA9IExhcHRvcCAqLworCQkJaGRhX25pZF90IHBvcnQgPSAwOworCQkJdG1wID0gKGFzcyAmIDB4MTgwMCkgPj4gMTE7CisJCQlzd2l0Y2ggKHRtcCkgeworCQkJY2FzZSAwOiBwb3J0ID0gcG9ydGE7IGJyZWFrOworCQkJY2FzZSAxOiBwb3J0ID0gcG9ydGU7IGJyZWFrOworCQkJY2FzZSAyOiBwb3J0ID0gcG9ydGQ7IGJyZWFrOworCQkJfQorCQkJaWYgKHBvcnQpCisJCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgcG9ydCwgMCwKKwkJCQkJCSAgICBBQ19WRVJCX1NFVF9FQVBEX0JUTEVOQUJMRSwKKwkJCQkJCSAgICAyKTsKKwkJfQorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDFhLCAwLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCA3KTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgxYSwgMCwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLAorCQkJCSAgICAodG1wID09IDUgPyAweDMwNDAgOiAweDMwNTApKTsKKwkJYnJlYWs7CisJfQorfQorCiAvKgogICogQUxDODgwIDMtc3RhY2sgbW9kZWwKICAqCkBAIC04MDEsNyArOTAzLDcgQEAKIHN0YXRpYyBoZGFfbmlkX3QgYWxjODgwXzZzdF9kYWNfbmlkc1s0XSA9IHsKIAkvKiBmcm9udCwgcmVhciwgY2xmZSwgcmVhcl9zdXJyICovCiAJMHgwMiwgMHgwMywgMHgwNCwgMHgwNQotfTsJCit9OwogCiBzdGF0aWMgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjODgwXzZzdGFja19jYXB0dXJlX3NvdXJjZSA9IHsKIAkubnVtX2l0ZW1zID0gNCwKQEAgLTE0MDksMjUgKzE1MTEsNDMgQEAKIH07CiAKIC8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KLXN0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQorc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfaHBfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAgCXVuc2lnbmVkIGludCBwcmVzZW50OworCXVuc2lnbmVkIGNoYXIgYml0czsKIAogIAlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE0LCAwLAogCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJYml0cyA9IHByZXNlbnQgPyAweDgwIDogMDsKIAlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTUsIDAsIEhEQV9PVVRQVVQsIDAsCi0JCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJCQkJIDB4ODAsIGJpdHMpOwogCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNSwgMSwgSERBX09VVFBVVCwgMCwKLQkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKKwkJCQkgMHg4MCwgYml0cyk7CiAJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE2LCAwLCBIREFfT1VUUFVULCAwLAotCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCQkJCSAweDgwLCBiaXRzKTsKIAlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTYsIDEsIEhEQV9PVVRQVVQsIDAsCi0JCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJCQkJIDB4ODAsIGJpdHMpOworfQorCisvKiBhdXRvLXRvZ2dsZSBmcm9udCBtaWMgKi8KK3N0YXRpYyB2b2lkIGFsYzg4MF91bml3aWxsX21pY19hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKyAJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgY2hhciBiaXRzOwogCiAJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxOCwgMCwKIAkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MGIsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCi0JCQkgICAgMHg3MDAwIHwgKDB4MDEgPDwgOCkgfCAocHJlc2VudCA/IDB4ODAgOiAwKSk7CisJYml0cyA9IHByZXNlbnQgPyAweDgwIDogMDsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MGIsIDAsIEhEQV9JTlBVVCwgMSwKKwkJCQkgMHg4MCwgYml0cyk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDBiLCAxLCBIREFfSU5QVVQsIDEsCisJCQkJIDB4ODAsIGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBhbGM4ODBfdW5pd2lsbF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlhbGM4ODBfdW5pd2lsbF9ocF9hdXRvbXV0ZShjb2RlYyk7CisJYWxjODgwX3VuaXdpbGxfbWljX2F1dG9tdXRlKGNvZGVjKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC0xNDM2LDIyICsxNTU2LDI4IEBACiAJLyogTG9va3MgbGlrZSB0aGUgdW5zb2wgZXZlbnQgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHN0YW5kYXJkCiAJICogZGVmaW5pdGlvbi4gIDRiaXQgdGFnIGlzIHBsYWNlZCBhdCAyOCBiaXQhCiAJICovCi0JaWYgKChyZXMgPj4gMjgpID09IEFMQzg4MF9IUF9FVkVOVCB8fAotCSAgICAocmVzID4+IDI4KSA9PSBBTEM4ODBfTUlDX0VWRU5UKQotCQlhbGM4ODBfdW5pd2lsbF9hdXRvbXV0ZShjb2RlYyk7CisJc3dpdGNoIChyZXMgPj4gMjgpIHsKKwljYXNlIEFMQzg4MF9IUF9FVkVOVDoKKwkJYWxjODgwX3VuaXdpbGxfaHBfYXV0b211dGUoY29kZWMpOworCQlicmVhazsKKwljYXNlIEFMQzg4MF9NSUNfRVZFTlQ6CisJCWFsYzg4MF91bml3aWxsX21pY19hdXRvbXV0ZShjb2RlYyk7CisJCWJyZWFrOworCX0KIH0KIAogc3RhdGljIHZvaWQgYWxjODgwX3VuaXdpbGxfcDUzX2hwX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CiAKICAJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNCwgMCwKIAkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOwotCisJYml0cyA9IHByZXNlbnQgPyAweDgwIDogMDsKIAlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTUsIDAsIEhEQV9JTlBVVCwgMCwKLQkJCQkgMHg4MCwgcHJlc2VudCA/IDB4ODAgOiAwKTsKKwkJCQkgMHg4MCwgYml0cyk7CiAJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE1LCAxLCBIREFfSU5QVVQsIDAsCi0JCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJCQkJIDB4ODAsIGJpdHMpOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODBfdW5pd2lsbF9wNTNfZGN2b2xfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCkBAIC0xNDgwLDcgKzE2MDYsNyBAQAogCSAqLwogCWlmICgocmVzID4+IDI4KSA9PSBBTEM4ODBfSFBfRVZFTlQpCiAJCWFsYzg4MF91bml3aWxsX3A1M19ocF9hdXRvbXV0ZShjb2RlYyk7Ci0JaWYgKChyZXMgPj4gMjgpID09IEFMQzg4MF9EQ1ZPTF9FVkVOVCkgCisJaWYgKChyZXMgPj4gMjgpID09IEFMQzg4MF9EQ1ZPTF9FVkVOVCkKIAkJYWxjODgwX3VuaXdpbGxfcDUzX2Rjdm9sX2F1dG9tdXRlKGNvZGVjKTsKIH0KIApAQCAtMTU0NywyMiArMTY3Myw4IEBACiB9OwogCiAvKiBFbmFibGUgR1BJTyBtYXNrIGFuZCBzZXQgb3V0cHV0ICovCi1zdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzW10gPSB7Ci0JezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwMX0sCi0JezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDAxfSwKLQl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAweDAxfSwKLQotCXsgfQotfTsKLQotLyogRW5hYmxlIEdQSU8gbWFzayBhbmQgc2V0IG91dHB1dCAqLwotc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODBfZ3BpbzJfaW5pdF92ZXJic1tdID0gewotCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MDJ9LAotCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwMn0sCi0JezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMn0sCi0KLQl7IH0KLX07CisjZGVmaW5lIGFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzCWFsY19ncGlvMV9pbml0X3ZlcmJzCisjZGVmaW5lIGFsYzg4MF9ncGlvMl9pbml0X3ZlcmJzCWFsY19ncGlvMl9pbml0X3ZlcmJzCiAKIC8qIENsZXZvIG01MjBnIGluaXQgKi8KIHN0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjODgwX3Bpbl9jbGV2b19pbml0X3ZlcmJzW10gPSB7CkBAIC0xNzM0LDEzICsxODQ2LDE1IEBACiBzdGF0aWMgdm9pZCBhbGM4ODBfbGdfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgY2hhciBiaXRzOwogCiAJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxYiwgMCwKIAkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCWJpdHMgPSBwcmVzZW50ID8gMHg4MCA6IDA7CiAJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE3LCAwLCBIREFfT1VUUFVULCAwLAotCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCQkJCSAweDgwLCBiaXRzKTsKIAlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTcsIDEsIEhEQV9PVVRQVVQsIDAsCi0JCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJCQkJIDB4ODAsIGJpdHMpOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODBfbGdfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCkBAIC0xODEwLDEzICsxOTI0LDE1IEBACiBzdGF0aWMgdm9pZCBhbGM4ODBfbGdfbHdfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgY2hhciBiaXRzOwogCiAJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxYiwgMCwKIAkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCWJpdHMgPSBwcmVzZW50ID8gMHg4MCA6IDA7CiAJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE0LCAwLCBIREFfT1VUUFVULCAwLAotCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCQkJCSAweDgwLCBiaXRzKTsKIAlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTQsIDEsIEhEQV9PVVRQVVQsIDAsCi0JCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7CisJCQkJIDB4ODAsIGJpdHMpOwogfQogCiBzdGF0aWMgdm9pZCBhbGM4ODBfbGdfbHdfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZXMpCkBAIC0xOTE2LDYgKzIwMzIsMTcgQEAKIAlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX29wZW4oY29kZWMsICZzcGVjLT5tdWx0aW91dCk7CiB9CiAKK3N0YXRpYyBpbnQgYWxjODgwX2RpZ19wbGF5YmFja19wY21fcHJlcGFyZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCQkgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJCSAgIHVuc2lnbmVkIGludCBmb3JtYXQsCisJCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXJldHVybiBzbmRfaGRhX211bHRpX291dF9kaWdfcHJlcGFyZShjb2RlYywgJnNwZWMtPm11bHRpb3V0LAorCQkJCQkgICAgIHN0cmVhbV90YWcsIGZvcm1hdCwgc3Vic3RyZWFtKTsKK30KKwogc3RhdGljIGludCBhbGM4ODBfZGlnX3BsYXliYWNrX3BjbV9jbG9zZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAogCQkJCQkgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJCSBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTE5ODQsNyArMjExMSw4IEBACiAJLyogTklEIGlzIHNldCBpbiBhbGNfYnVpbGRfcGNtcyAqLwogCS5vcHMgPSB7CiAJCS5vcGVuID0gYWxjODgwX2RpZ19wbGF5YmFja19wY21fb3BlbiwKLQkJLmNsb3NlID0gYWxjODgwX2RpZ19wbGF5YmFja19wY21fY2xvc2UKKwkJLmNsb3NlID0gYWxjODgwX2RpZ19wbGF5YmFja19wY21fY2xvc2UsCisJCS5wcmVwYXJlID0gYWxjODgwX2RpZ19wbGF5YmFja19wY21fcHJlcGFyZQogCX0sCiB9OwogCkBAIC0yMDc1LDcgKzIyMDMsNyBAQAogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXVuc2lnbmVkIGludCBpOwogCi0JaWYgKCEgc3BlYykKKwlpZiAoIXNwZWMpCiAJCXJldHVybjsKIAogCWlmIChzcGVjLT5rY3RsX2FsbG9jKSB7CkBAIC0yNDc3LDcgKzI2MDUsOCBAQAogc3RhdGljIHN0cnVjdCBhbGNfY29uZmlnX3ByZXNldCBhbGM4ODBfcHJlc2V0c1tdID0gewogCVtBTEM4ODBfM1NUXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjODgwX3RocmVlX3N0YWNrX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsIGFsYzg4MF9waW5fM3N0YWNrX2luaXRfdmVyYnMgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfcGluXzNzdGFja19pbml0X3ZlcmJzIH0sCiAJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2RhY19uaWRzKSwKIAkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAogCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3RocmVlc3RhY2tfbW9kZXMpLApAQCAtMjQ4Nyw3ICsyNjE2LDggQEAKIAl9LAogCVtBTEM4ODBfM1NUX0RJR10gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzg4MF90aHJlZV9zdGFja19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLCBhbGM4ODBfcGluXzNzdGFja19pbml0X3ZlcmJzIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl8zc3RhY2tfaW5pdF92ZXJicyB9LAogCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4MF9kYWNfbmlkcywKIAkJLmRpZ19vdXRfbmlkID0gQUxDODgwX0RJR09VVF9OSUQsCkBAIC0yNTA5LDggKzI2MzksMTAgQEAKIAkJLmlucHV0X211eCA9ICZhbGM4ODBfY2FwdHVyZV9zb3VyY2UsCiAJfSwKIAlbQUxDODgwXzVTVF0gPSB7Ci0JCS5taXhlcnMgPSB7IGFsYzg4MF90aHJlZV9zdGFja19taXhlciwgYWxjODgwX2ZpdmVfc3RhY2tfbWl4ZXJ9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLCBhbGM4ODBfcGluXzVzdGFja19pbml0X3ZlcmJzIH0sCisJCS5taXhlcnMgPSB7IGFsYzg4MF90aHJlZV9zdGFja19taXhlciwKKwkJCSAgICBhbGM4ODBfZml2ZV9zdGFja19taXhlcn0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl81c3RhY2tfaW5pdF92ZXJicyB9LAogCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4MF9kYWNfbmlkcywKIAkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF9maXZlc3RhY2tfbW9kZXMpLApAQCAtMjUxOCw4ICsyNjUwLDEwIEBACiAJCS5pbnB1dF9tdXggPSAmYWxjODgwX2NhcHR1cmVfc291cmNlLAogCX0sCiAJW0FMQzg4MF81U1RfRElHXSA9IHsKLQkJLm1peGVycyA9IHsgYWxjODgwX3RocmVlX3N0YWNrX21peGVyLCBhbGM4ODBfZml2ZV9zdGFja19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLCBhbGM4ODBfcGluXzVzdGFja19pbml0X3ZlcmJzIH0sCisJCS5taXhlcnMgPSB7IGFsYzg4MF90aHJlZV9zdGFja19taXhlciwKKwkJCSAgICBhbGM4ODBfZml2ZV9zdGFja19taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9waW5fNXN0YWNrX2luaXRfdmVyYnMgfSwKIAkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfZGFjX25pZHMpLAogCQkuZGFjX25pZHMgPSBhbGM4ODBfZGFjX25pZHMsCiAJCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELApAQCAtMjUyOSw3ICsyNjYzLDggQEAKIAl9LAogCVtBTEM4ODBfNlNUXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjODgwX3NpeF9zdGFja19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLCBhbGM4ODBfcGluXzZzdGFja19pbml0X3ZlcmJzIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl82c3RhY2tfaW5pdF92ZXJicyB9LAogCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF82c3RfZGFjX25pZHMpLAogCQkuZGFjX25pZHMgPSBhbGM4ODBfNnN0X2RhY19uaWRzLAogCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgwX3NpeHN0YWNrX21vZGVzKSwKQEAgLTI1MzgsNyArMjY3Myw4IEBACiAJfSwKIAlbQUxDODgwXzZTVF9ESUddID0gewogCQkubWl4ZXJzID0geyBhbGM4ODBfc2l4X3N0YWNrX21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsIGFsYzg4MF9waW5fNnN0YWNrX2luaXRfdmVyYnMgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfcGluXzZzdGFja19pbml0X3ZlcmJzIH0sCiAJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwXzZzdF9kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4MF82c3RfZGFjX25pZHMsCiAJCS5kaWdfb3V0X25pZCA9IEFMQzg4MF9ESUdPVVRfTklELApAQCAtMjU0OCw3ICsyNjg0LDggQEAKIAl9LAogCVtBTEM4ODBfVzgxMF0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzg4MF93ODEwX2Jhc2VfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywgYWxjODgwX3Bpbl93ODEwX2luaXRfdmVyYnMsCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl93ODEwX2luaXRfdmVyYnMsCiAJCQkJYWxjODgwX2dwaW8yX2luaXRfdmVyYnMgfSwKIAkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfdzgxMF9kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4MF93ODEwX2RhY19uaWRzLApAQCAtMjU1OSw3ICsyNjk2LDggQEAKIAl9LAogCVtBTEM4ODBfWjcxVl0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzg4MF96NzF2X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsIGFsYzg4MF9waW5fejcxdl9pbml0X3ZlcmJzIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl96NzF2X2luaXRfdmVyYnMgfSwKIAkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfejcxdl9kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4MF96NzF2X2RhY19uaWRzLAogCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKQEAgLTI1NzAsNyArMjcwOCw4IEBACiAJfSwKIAlbQUxDODgwX0YxNzM0XSA9IHsKIAkJLm1peGVycyA9IHsgYWxjODgwX2YxNzM0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsIGFsYzg4MF9waW5fZjE3MzRfaW5pdF92ZXJicyB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9waW5fZjE3MzRfaW5pdF92ZXJicyB9LAogCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9mMTczNF9kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4MF9mMTczNF9kYWNfbmlkcywKIAkJLmhwX25pZCA9IDB4MDIsCkBAIC0yNTgwLDcgKzI3MTksOCBAQAogCX0sCiAJW0FMQzg4MF9BU1VTXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjODgwX2FzdXNfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywgYWxjODgwX3Bpbl9hc3VzX2luaXRfdmVyYnMsCisJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCisJCQkJYWxjODgwX3Bpbl9hc3VzX2luaXRfdmVyYnMsCiAJCQkJYWxjODgwX2dwaW8xX2luaXRfdmVyYnMgfSwKIAkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4MF9hc3VzX2RhY19uaWRzLApAQCAtMjU5MSw3ICsyNzMxLDggQEAKIAl9LAogCVtBTEM4ODBfQVNVU19ESUddID0gewogCQkubWl4ZXJzID0geyBhbGM4ODBfYXN1c19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLCBhbGM4ODBfcGluX2FzdXNfaW5pdF92ZXJicywKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfcGluX2FzdXNfaW5pdF92ZXJicywKIAkJCQlhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicyB9LAogCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4MF9hc3VzX2RhY19uaWRzKSwKIAkJLmRhY19uaWRzID0gYWxjODgwX2FzdXNfZGFjX25pZHMsCkBAIC0yNjAzLDcgKzI3NDQsOCBAQAogCX0sCiAJW0FMQzg4MF9BU1VTX0RJRzJdID0gewogCQkubWl4ZXJzID0geyBhbGM4ODBfYXN1c19taXhlciB9LAotCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLCBhbGM4ODBfcGluX2FzdXNfaW5pdF92ZXJicywKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4ODBfcGluX2FzdXNfaW5pdF92ZXJicywKIAkJCQlhbGM4ODBfZ3BpbzJfaW5pdF92ZXJicyB9LCAvKiB1c2UgR1BJTzIgKi8KIAkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGM4ODBfYXN1c19kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4MF9hc3VzX2RhY19uaWRzLApAQCAtMjYxNSw3ICsyNzU3LDggQEAKIAl9LAogCVtBTEM4ODBfQVNVU19XMVZdID0gewogCQkubWl4ZXJzID0geyBhbGM4ODBfYXN1c19taXhlciwgYWxjODgwX2FzdXNfdzF2X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsIGFsYzg4MF9waW5fYXN1c19pbml0X3ZlcmJzLAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgwX3ZvbHVtZV9pbml0X3ZlcmJzLAorCQkJCWFsYzg4MF9waW5fYXN1c19pbml0X3ZlcmJzLAogCQkJCWFsYzg4MF9ncGlvMV9pbml0X3ZlcmJzIH0sCiAJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgwX2FzdXNfZGFjX25pZHMpLAogCQkuZGFjX25pZHMgPSBhbGM4ODBfYXN1c19kYWNfbmlkcywKQEAgLTI2NjQsNyArMjgwNyw3IEBACiAJCS5pbml0X2hvb2sgPSBhbGM4ODBfdW5pd2lsbF9wNTNfaHBfYXV0b211dGUsCiAJfSwKIAlbQUxDODgwX0ZVSklUU1VdID0gewotCQkubWl4ZXJzID0geyBhbGM4ODBfZnVqaXRzdV9taXhlciwgCisJCS5taXhlcnMgPSB7IGFsYzg4MF9mdWppdHN1X21peGVyLAogCQkJICAgIGFsYzg4MF9wY2JlZXBfbWl4ZXIsIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGM4ODBfdm9sdW1lX2luaXRfdmVyYnMsCiAJCQkJYWxjODgwX3VuaXdpbGxfcDUzX2luaXRfdmVyYnMsCkBAIC0yNzA3LDcgKzI4NTAsNyBAQAogCQkubWl4ZXJzID0geyBhbGM4ODBfbGdfbHdfbWl4ZXIgfSwKIAkJLmluaXRfdmVyYnMgPSB7IGFsYzg4MF92b2x1bWVfaW5pdF92ZXJicywKIAkJCQlhbGM4ODBfbGdfbHdfaW5pdF92ZXJicyB9LAotCQkubnVtX2RhY3MgPSAxLCAKKwkJLm51bV9kYWNzID0gMSwKIAkJLmRhY19uaWRzID0gYWxjODgwX2RhY19uaWRzLAogCQkuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRCwKIAkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF8yX2phY2tfbW9kZXMpLApAQCAtMjc0OSwxOCArMjg5MiwyMSBAQAogfTsKIAogLyogYWRkIGR5bmFtaWMgY29udHJvbHMgKi8KLXN0YXRpYyBpbnQgYWRkX2NvbnRyb2woc3RydWN0IGFsY19zcGVjICpzcGVjLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWwpCitzdGF0aWMgaW50IGFkZF9jb250cm9sKHN0cnVjdCBhbGNfc3BlYyAqc3BlYywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqa25ldzsKIAogCWlmIChzcGVjLT5udW1fa2N0bF91c2VkID49IHNwZWMtPm51bV9rY3RsX2FsbG9jKSB7CiAJCWludCBudW0gPSBzcGVjLT5udW1fa2N0bF9hbGxvYyArIE5VTV9DT05UUk9MX0FMTE9DOwogCi0JCWtuZXcgPSBrY2FsbG9jKG51bSArIDEsIHNpemVvZigqa25ldyksIEdGUF9LRVJORUwpOyAvKiBhcnJheSArIHRlcm1pbmF0b3IgKi8KLQkJaWYgKCEga25ldykKKwkJLyogYXJyYXkgKyB0ZXJtaW5hdG9yICovCisJCWtuZXcgPSBrY2FsbG9jKG51bSArIDEsIHNpemVvZigqa25ldyksIEdGUF9LRVJORUwpOworCQlpZiAoIWtuZXcpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJaWYgKHNwZWMtPmtjdGxfYWxsb2MpIHsKLQkJCW1lbWNweShrbmV3LCBzcGVjLT5rY3RsX2FsbG9jLCBzaXplb2YoKmtuZXcpICogc3BlYy0+bnVtX2tjdGxfYWxsb2MpOworCQkJbWVtY3B5KGtuZXcsIHNwZWMtPmtjdGxfYWxsb2MsCisJCQkgICAgICAgc2l6ZW9mKCprbmV3KSAqIHNwZWMtPm51bV9rY3RsX2FsbG9jKTsKIAkJCWtmcmVlKHNwZWMtPmtjdGxfYWxsb2MpOwogCQl9CiAJCXNwZWMtPmtjdGxfYWxsb2MgPSBrbmV3OwpAQCAtMjc3MCw3ICsyOTE2LDcgQEAKIAlrbmV3ID0gJnNwZWMtPmtjdGxfYWxsb2Nbc3BlYy0+bnVtX2tjdGxfdXNlZF07CiAJKmtuZXcgPSBhbGM4ODBfY29udHJvbF90ZW1wbGF0ZXNbdHlwZV07CiAJa25ldy0+bmFtZSA9IGtzdHJkdXAobmFtZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEga25ldy0+bmFtZSkKKwlpZiAoIWtuZXctPm5hbWUpCiAJCXJldHVybiAtRU5PTUVNOwogCWtuZXctPnByaXZhdGVfdmFsdWUgPSB2YWw7CiAJc3BlYy0+bnVtX2tjdGxfdXNlZCsrOwpAQCAtMjc5MCw3ICsyOTM2LDggQEAKICNkZWZpbmUgQUxDODgwX1BJTl9DRF9OSUQJCTB4MWMKIAogLyogZmlsbCBpbiB0aGUgZGFjX25pZHMgdGFibGUgZnJvbSB0aGUgcGFyc2VkIHBpbiBjb25maWd1cmF0aW9uICovCi1zdGF0aWMgaW50IGFsYzg4MF9hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IGFsY19zcGVjICpzcGVjLCBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCitzdGF0aWMgaW50IGFsYzg4MF9hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IGFsY19zcGVjICpzcGVjLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQogewogCWhkYV9uaWRfdCBuaWQ7CiAJaW50IGFzc2lnbmVkWzRdOwpAQCAtMjgxNSw4ICsyOTYyLDkgQEAKIAkJCWNvbnRpbnVlOwogCQkvKiBzZWFyY2ggZm9yIGFuIGVtcHR5IGNoYW5uZWwgKi8KIAkJZm9yIChqID0gMDsgaiA8IGNmZy0+bGluZV9vdXRzOyBqKyspIHsKLQkJCWlmICghIGFzc2lnbmVkW2pdKSB7Ci0JCQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSBhbGM4ODBfaWR4X3RvX2RhYyhqKTsKKwkJCWlmICghYXNzaWduZWRbal0pIHsKKwkJCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9CisJCQkJCWFsYzg4MF9pZHhfdG9fZGFjKGopOwogCQkJCWFzc2lnbmVkW2pdID0gMTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTI4MzEsMzYgKzI5NzksNTQgQEAKIAkJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCiB7CiAJY2hhciBuYW1lWzMyXTsKLQlzdGF0aWMgY29uc3QgY2hhciAqY2huYW1lWzRdID0geyAiRnJvbnQiLCAiU3Vycm91bmQiLCBOVUxMIC8qQ0xGRSovLCAiU2lkZSIgfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqY2huYW1lWzRdID0geworCQkiRnJvbnQiLCAiU3Vycm91bmQiLCBOVUxMIC8qQ0xGRSovLCAiU2lkZSIKKwl9OwogCWhkYV9uaWRfdCBuaWQ7CiAJaW50IGksIGVycjsKIAogCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7Ci0JCWlmICghIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKQorCQlpZiAoIXNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldKQogCQkJY29udGludWU7CiAJCW5pZCA9IGFsYzg4MF9pZHhfdG9fbWl4ZXIoYWxjODgwX2RhY190b19pZHgoc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0pKTsKIAkJaWYgKGkgPT0gMikgewogCQkJLyogQ2VudGVyL0xGRSAqLwotCQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsICJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwKLQkJCQkJICAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAxLCAwLCBIREFfT1VUUFVUKSkpIDwgMCkKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwKKwkJCQkJICAiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDEsIDAsCisJCQkJCQkJICAgICAgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKLQkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCAiTEZFIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkJCSAgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMiwgMCwgSERBX09VVFBVVCkpKSA8IDApCisJCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsCisJCQkJCSAgIkxGRSBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAyLCAwLAorCQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7Ci0JCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLCAiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMSwgMiwgSERBX0lOUFVUKSkpIDwgMCkKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAorCQkJCQkgICJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMSwgMiwKKwkJCQkJCQkgICAgICBIREFfSU5QVVQpKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7Ci0JCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLCAiTEZFIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMiwgMiwgSERBX0lOUFVUKSkpIDwgMCkKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAorCQkJCQkgICJMRkUgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMiwgMiwKKwkJCQkJCQkgICAgICBIREFfSU5QVVQpKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSB7CiAJCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBjaG5hbWVbaV0pOwotCQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCi0JCQkJCSAgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCkpKSA8IDApCisJCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsCisJCQkJCQkJICAgICAgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpXSk7Ci0JCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLCBuYW1lLAotCQkJCQkgICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDIsIEhEQV9JTlBVVCkpKSA8IDApCisJCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwgbmFtZSwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMiwKKwkJCQkJCQkgICAgICBIREFfSU5QVVQpKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0yODc1LDUxICszMDQxLDU3IEBACiAJaW50IGVycjsKIAljaGFyIG5hbWVbMzJdOwogCi0JaWYgKCEgcGluKQorCWlmICghcGluKQogCQlyZXR1cm4gMDsKIAogCWlmIChhbGM4ODBfaXNfZml4ZWRfcGluKHBpbikpIHsKIAkJbmlkID0gYWxjODgwX2lkeF90b19kYWMoYWxjODgwX2ZpeGVkX3Bpbl9pZHgocGluKSk7CiAJCS8qIHNwZWNpZnkgdGhlIERBQyBhcyB0aGUgZXh0cmEgb3V0cHV0ICovCi0JCWlmICghIHNwZWMtPm11bHRpb3V0LmhwX25pZCkKKwkJaWYgKCFzcGVjLT5tdWx0aW91dC5ocF9uaWQpCiAJCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSBuaWQ7CiAJCWVsc2UKIAkJCXNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0gPSBuaWQ7CiAJCS8qIGNvbnRyb2wgSFAgdm9sdW1lL3N3aXRjaCBvbiB0aGUgb3V0cHV0IG1peGVyIGFtcCAqLwogCQluaWQgPSBhbGM4ODBfaWR4X3RvX21peGVyKGFsYzg4MF9maXhlZF9waW5faWR4KHBpbikpOwogCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBwZngpOwotCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgbmFtZSwKLQkJCQkgICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9PVVRQVVQpKSkgPCAwKQorCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCkpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIHBmeCk7Ci0JCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsIG5hbWUsCi0JCQkJICAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAyLCBIREFfSU5QVVQpKSkgPCAwKQorCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwgbmFtZSwKKwkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAyLCBIREFfSU5QVVQpKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0gZWxzZSBpZiAoYWxjODgwX2lzX211bHRpX3BpbihwaW4pKSB7CiAJCS8qIHNldCBtYW51YWwgY29ubmVjdGlvbiAqLwogCQkvKiB3ZSBoYXZlIG9ubHkgYSBzd2l0Y2ggb24gSFAtb3V0IFBJTiAqLwogCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOwotCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIG5hbWUsCi0JCQkJICAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSkpIDwgMCkKKwkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKKwkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIC8qIGNyZWF0ZSBpbnB1dCBwbGF5YmFjay9jYXB0dXJlIGNvbnRyb2xzIGZvciB0aGUgZ2l2ZW4gcGluICovCi1zdGF0aWMgaW50IG5ld19hbmFsb2dfaW5wdXQoc3RydWN0IGFsY19zcGVjICpzcGVjLCBoZGFfbmlkX3QgcGluLCBjb25zdCBjaGFyICpjdGxuYW1lLAorc3RhdGljIGludCBuZXdfYW5hbG9nX2lucHV0KHN0cnVjdCBhbGNfc3BlYyAqc3BlYywgaGRhX25pZF90IHBpbiwKKwkJCSAgICBjb25zdCBjaGFyICpjdGxuYW1lLAogCQkJICAgIGludCBpZHgsIGhkYV9uaWRfdCBtaXhfbmlkKQogewogCWNoYXIgbmFtZVszMl07CiAJaW50IGVycjsKIAogCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIGN0bG5hbWUpOwotCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBuYW1lLAotCQkJICAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobWl4X25pZCwgMywgaWR4LCBIREFfSU5QVVQpKSkgPCAwKQorCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgbmFtZSwKKwkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChtaXhfbmlkLCAzLCBpZHgsIEhEQV9JTlBVVCkpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGN0bG5hbWUpOwotCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgbmFtZSwKLQkJCSAgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG1peF9uaWQsIDMsIGlkeCwgSERBX0lOUFVUKSkpIDwgMCkKKwllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAorCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG1peF9uaWQsIDMsIGlkeCwgSERBX0lOUFVUKSk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIDA7CiB9CkBAIC0yOTM5LDggKzMxMTEsMTAgQEAKIAkJCQkJICAgICAgIGlkeCwgMHgwYik7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwotCQkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9IGF1dG9fcGluX2NmZ19sYWJlbHNbaV07Ci0JCQlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmluZGV4ID0gYWxjODgwX2lucHV0X3Bpbl9pZHgoY2ZnLT5pbnB1dF9waW5zW2ldKTsKKwkJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10ubGFiZWwgPQorCQkJCWF1dG9fcGluX2NmZ19sYWJlbHNbaV07CisJCQlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmluZGV4ID0KKwkJCQlhbGM4ODBfaW5wdXRfcGluX2lkeChjZmctPmlucHV0X3BpbnNbaV0pOwogCQkJaW11eC0+bnVtX2l0ZW1zKys7CiAJCX0KIAl9CkBAIC0yOTUyLDggKzMxMjYsMTAgQEAKIAkJCQkJICAgICAgaW50IGRhY19pZHgpCiB7CiAJLyogc2V0IGFzIG91dHB1dCAqLwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBwaW5fdHlwZSk7Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkgICAgcGluX3R5cGUpOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCSAgICBBTVBfT1VUX1VOTVVURSk7CiAJLyogbmVlZCB0aGUgbWFudWFsIGNvbm5lY3Rpb24/ICovCiAJaWYgKGFsYzg4MF9pc19tdWx0aV9waW4obmlkKSkgewogCQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKQEAgLTI5NjQsMTQgKzMxNDAsMjQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgZ2V0X3Bpbl90eXBlKGludCBsaW5lX291dF90eXBlKQoreworCWlmIChsaW5lX291dF90eXBlID09IEFVVE9fUElOX0hQX09VVCkKKwkJcmV0dXJuIFBJTl9IUDsKKwllbHNlCisJCXJldHVybiBQSU5fT1VUOworfQorCiBzdGF0aWMgdm9pZCBhbGM4ODBfYXV0b19pbml0X211bHRpX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgaTsKLQorCQorCWFsY19zdWJzeXN0ZW1faWQoY29kZWMsIDB4MTUsIDB4MWIsIDB4MTQpOwogCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0czsgaSsrKSB7CiAJCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV07Ci0JCWFsYzg4MF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgbmlkLCBQSU5fT1VULCBpKTsKKwkJaW50IHBpbl90eXBlID0gZ2V0X3Bpbl90eXBlKHNwZWMtPmF1dG9jZmcubGluZV9vdXRfdHlwZSk7CisJCWFsYzg4MF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgbmlkLCBwaW5fdHlwZSwgaSk7CiAJfQogfQogCkBAIC0yOTk2LDM3ICszMTgyLDUyIEBACiAJZm9yIChpID0gMDsgaSA8IEFVVE9fUElOX0xBU1Q7IGkrKykgewogCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5pbnB1dF9waW5zW2ldOwogCQlpZiAoYWxjODgwX2lzX2lucHV0X3BpbihuaWQpKSB7Ci0JCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKLQkJCQkJICAgIGkgPD0gQVVUT19QSU5fRlJPTlRfTUlDID8gUElOX1ZSRUY4MCA6IFBJTl9JTik7CisJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCisJCQkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCisJCQkJCSAgICBpIDw9IEFVVE9fUElOX0ZST05UX01JQyA/CisJCQkJCSAgICBQSU5fVlJFRjgwIDogUElOX0lOKTsKIAkJCWlmIChuaWQgIT0gQUxDODgwX1BJTl9DRF9OSUQpCi0JCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKKwkJCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAogCQkJCQkJICAgIEFNUF9PVVRfTVVURSk7CiAJCX0KIAl9CiB9CiAKIC8qIHBhcnNlIHRoZSBCSU9TIGNvbmZpZ3VyYXRpb24gYW5kIHNldCB1cCB0aGUgYWxjX3NwZWMgKi8KLS8qIHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgdGhlIHByb3BlciBjb25maWcgaXMgbm90IGZvdW5kLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgKi8KKy8qIHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgdGhlIHByb3BlciBjb25maWcgaXMgbm90IGZvdW5kLAorICogb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KIHN0YXRpYyBpbnQgYWxjODgwX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBlcnI7CiAJc3RhdGljIGhkYV9uaWRfdCBhbGM4ODBfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKIAotCWlmICgoZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsCi0JCQkJCQlhbGM4ODBfaWdub3JlKSkgPCAwKQorCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAorCQkJCQkgICBhbGM4ODBfaWdub3JlKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlpZiAoISBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cykKKwlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzKQogCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KIAotCWlmICgoZXJyID0gYWxjODgwX2F1dG9fZmlsbF9kYWNfbmlkcyhzcGVjLCAmc3BlYy0+YXV0b2NmZykpIDwgMCB8fAotCSAgICAoZXJyID0gYWxjODgwX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKSkgPCAwIHx8Ci0JICAgIChlcnIgPSBhbGM4ODBfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHNwZWMsCi0JCQkJCQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwKLQkJCQkJCSJTcGVha2VyIikpIDwgMCB8fAotCSAgICAoZXJyID0gYWxjODgwX2F1dG9fY3JlYXRlX2V4dHJhX291dChzcGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0sCi0JCQkJCQkiSGVhZHBob25lIikpIDwgMCB8fAotCSAgICAoZXJyID0gYWxjODgwX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKSkgPCAwKQorCWVyciA9IGFsYzg4MF9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGFsYzg4MF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gYWxjODgwX2F1dG9fY3JlYXRlX2V4dHJhX291dChzcGVjLAorCQkJCQkgICBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwKKwkJCQkJICAgIlNwZWFrZXIiKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBhbGM4ODBfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHNwZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKKwkJCQkJICAgIkhlYWRwaG9uZSIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGFsYzg4MF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKIAlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7CkBAIC0zMDg2LDcgKzMyODcsNyBAQAogCQlpZiAoZXJyIDwgMCkgewogCQkJYWxjX2ZyZWUoY29kZWMpOwogCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIGlmICghIGVycikgeworCQl9IGVsc2UgaWYgKCFlcnIpIHsKIAkJCXByaW50ayhLRVJOX0lORk8KIAkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgogCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyAzLXN0YWNrIG1vZGUuLi5cbiIpOwpAQCAtMzEwNSwxNCArMzMwNiwxNiBAQAogCXNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrID0gJmFsYzg4MF9wY21fZGlnaXRhbF9wbGF5YmFjazsKIAlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJmFsYzg4MF9wY21fZGlnaXRhbF9jYXB0dXJlOwogCi0JaWYgKCEgc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CisJaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKIAkJLyogY2hlY2sgd2hldGhlciBOSUQgMHgwNyBpcyB2YWxpZCAqLwogCQl1bnNpZ25lZCBpbnQgd2NhcCA9IGdldF93Y2Fwcyhjb2RlYywgYWxjODgwX2FkY19uaWRzWzBdKTsKLQkJd2NhcCA9ICh3Y2FwICYgQUNfV0NBUF9UWVBFKSA+PiBBQ19XQ0FQX1RZUEVfU0hJRlQ7IC8qIGdldCB0eXBlICovCisJCS8qIGdldCB0eXBlICovCisJCXdjYXAgPSAod2NhcCAmIEFDX1dDQVBfVFlQRSkgPj4gQUNfV0NBUF9UWVBFX1NISUZUOwogCQlpZiAod2NhcCAhPSBBQ19XSURfQVVEX0lOKSB7CiAJCQlzcGVjLT5hZGNfbmlkcyA9IGFsYzg4MF9hZGNfbmlkc19hbHQ7CiAJCQlzcGVjLT5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4MF9hZGNfbmlkc19hbHQpOwotCQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gYWxjODgwX2NhcHR1cmVfYWx0X21peGVyOworCQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0KKwkJCQlhbGM4ODBfY2FwdHVyZV9hbHRfbWl4ZXI7CiAJCQlzcGVjLT5udW1fbWl4ZXJzKys7CiAJCX0gZWxzZSB7CiAJCQlzcGVjLT5hZGNfbmlkcyA9IGFsYzg4MF9hZGNfbmlkczsKQEAgLTMyNTQsNyArMzQ1Nyw3IEBACiAJSERBX0NPREVDX1ZPTFVNRV9NT05PKCJNb25vIFBsYXliYWNrIFZvbHVtZSIsIDB4MGEsIDEsIDB4MCwgSERBX09VVFBVVCksCiAJSERBX0JJTkRfTVVURV9NT05PKCJNb25vIFBsYXliYWNrIFN3aXRjaCIsIDB4MGEsIDEsIDIsIEhEQV9JTlBVVCksCiAJeyB9IC8qIGVuZCAqLwotfTsJCit9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjMjYwX2lucHV0X21peGVyW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwNCwgSERBX0lOUFVUKSwKQEAgLTMzNDksNiArMzU1Miw0MiBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKKy8qIFBhY2thcmQgYmVsbCBWNzkwMCAgQUxDMjYwIHBpbiB1c2FnZTogSFAgPSAweDBmLCBNaWMgamFjayA9IDB4MTIsCisgKiBMaW5lIEluIGphY2sgPSAweDE0LCBDRCBhdWRpbyA9ICAweDE2LCBwYyBiZWVwID0gMHgxNy4KKyAqLworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF93aWxsX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDB4MiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUFMQ19QSU5fTU9ERSgiTWljIEphY2sgTW9kZSIsIDB4MTIsIEFMQ19QSU5fRElSX0lOKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwMiwgSERBX0lOUFVUKSwKKwlBTENfUElOX01PREUoIkxpbmUgSmFjayBNb2RlIiwgMHgxNCwgQUxDX1BJTl9ESVJfSU5PVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQmVlcCBQbGF5YmFjayBWb2x1bWUiLCAweDA3LCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJCZWVwIFBsYXliYWNrIFN3aXRjaCIsIDB4MDcsIDB4MDUsIEhEQV9JTlBVVCksCisJeyB9IC8qIGVuZCAqLworfTsKKworLyogUmVwbGFjZXIgNjcyViBBTEMyNjAgcGluIHVzYWdlOiBNaWMgamFjayA9IDB4MTIsCisgKiBMaW5lIEluIGphY2sgPSAweDE0LCBBVEFQSSBNaWMgPSAweDEzLCBzcGVha2VyID0gMHgwZi4KKyAqLworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9yZXBsYWNlcl82NzJ2X21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsIDB4MDgsIDB4MiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgwLCBIREFfSU5QVVQpLAorCUFMQ19QSU5fTU9ERSgiTWljIEphY2sgTW9kZSIsIDB4MTIsIEFMQ19QSU5fRElSX0lOKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJBVEFQSSBNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJBVEFUSSBNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwNywgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwNywgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDA3LCAweDAyLCBIREFfSU5QVVQpLAorCUFMQ19QSU5fTU9ERSgiTGluZSBKYWNrIE1vZGUiLCAweDE0LCBBTENfUElOX0RJUl9JTk9VVCksCisJeyB9IC8qIGVuZCAqLworfTsKKwogLyogY2FwdHVyZSBtaXhlciBlbGVtZW50cyAqLwogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzI2MF9jYXB0dXJlX21peGVyW10gPSB7CiAJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA0LCAweDAsIEhEQV9JTlBVVCksCkBAIC0zNDM0LDcgKzM2NzMsOSBAQAogCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJLyogdW5tdXRlIExJTkUtMiBvdXQgcGluICovCiAJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKLQkvKiBBbXAgSW5kZXhlczogQ0QgPSAweDA0LCBMaW5lIEluIDEgPSAweDAyLCBNaWMgMSA9IDB4MDAgJiBMaW5lIEluIDIgPSAweDAzICovCisJLyogQW1wIEluZGV4ZXM6IENEID0gMHgwNCwgTGluZSBJbiAxID0gMHgwMiwgTWljIDEgPSAweDAwICYKKwkgKiBMaW5lIEluIDIgPSAweDAzCisJICovCiAJLyogbXV0ZSBDRCAqLwogCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDQpfSwKIAkvKiBtdXRlIExpbmUgSW4gKi8KQEAgLTM0ODIsNyArMzcyMyw5IEBACiAJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwMH0sCiAJLyogbXV0ZSBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodCAobm8gZ2FpbiBvbiB0aGlzIGFtcCkgKi8KIAl7MHgxMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHgwMDAwfSwKLQkvKiBBbXAgSW5kZXhlczogQ0QgPSAweDA0LCBMaW5lIEluIDEgPSAweDAyLCBNaWMgMSA9IDB4MDAgJiBMaW5lIEluIDIgPSAweDAzICovCisJLyogQW1wIEluZGV4ZXM6IENEID0gMHgwNCwgTGluZSBJbiAxID0gMHgwMiwgTWljIDEgPSAweDAwICYKKwkgKiBMaW5lIEluIDIgPSAweDAzCisJICovCiAJLyogdW5tdXRlIENEICovCiAJezB4MDcsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwNCA8PCA4KSl9LAogCS8qIHVubXV0ZSBMaW5lIEluICovCkBAIC0zNTMwLDcgKzM3NzMsOSBAQAogCXsweDA5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMDB9LAogCS8qIG11dGUgcGluIHdpZGdldCBhbXAgbGVmdCBhbmQgcmlnaHQgKG5vIGdhaW4gb24gdGhpcyBhbXApICovCiAJezB4MTAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4MDAwMH0sCi0JLyogQW1wIEluZGV4ZXM6IENEID0gMHgwNCwgTGluZSBJbiAxID0gMHgwMiwgTWljIDEgPSAweDAwICYgTGluZSBJbiAyID0gMHgwMyAqLworCS8qIEFtcCBJbmRleGVzOiBDRCA9IDB4MDQsIExpbmUgSW4gMSA9IDB4MDIsIE1pYyAxID0gMHgwMCAmCisJICogTGluZSBJbiAyID0gMHgwMworCSAqLwogCS8qIHVubXV0ZSBDRCAqLwogCXsweDA3LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDAwIHwgKDB4MDQgPDwgOCkpfSwKIAkvKiB1bm11dGUgTGluZSBJbiAqLwpAQCAtMzY4MCw3ICszOTI1LDkgQEAKIAl7MHgwYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMSl9LAogCXsweDBhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1pFUk99LAogCi0JLyogVW5tdXRlIExpbmUtb3V0IHBpbiB3aWRnZXQgYW1wIGxlZnQgYW5kIHJpZ2h0IChubyBlcXVpdiBtaXhlciBjdHJsKSAqLworCS8qIFVubXV0ZSBMaW5lLW91dCBwaW4gd2lkZ2V0IGFtcCBsZWZ0IGFuZCByaWdodAorCSAqIChubyBlcXVpdiBtaXhlciBjdHJsKQorCSAqLwogCXsweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCiAJLyogVW5tdXRlIG1vbm8gcGluIHdpZGdldCBhbXAgb3V0cHV0IChubyBlcXVpdiBtaXhlciBjdHJsKSAqLwogCXsweDExLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCkBAIC0zNzE5LDYgKzM5NjYsNTUgQEAKIAl7IH0KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjMjYwX3dpbGxfdmVyYnNbXSA9IHsKKwl7MHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSFB9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MGQsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwKKwl7MHgwZiwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDB4MDJ9LAorCXsweDFhLCBBQ19WRVJCX1NFVF9DT0VGX0lOREVYLCAweDA3fSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfUFJPQ19DT0VGLCAweDMwNDB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9yZXBsYWNlcl82NzJ2X3ZlcmJzW10gPSB7CisJezB4MGYsIEFDX1ZFUkJfU0VUX0VBUERfQlRMRU5BQkxFLCAweDAyfSwKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwN30sCisJezB4MWEsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHgzMDUwfSwKKworCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4MDF9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwMX0sCisJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMH0sCisKKwl7MHgwZiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCisJe30KK307CisKKy8qIHRvZ2dsZSBzcGVha2VyLW91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIGhwLWphY2sgc3RhdGUgKi8KK3N0YXRpYyB2b2lkIGFsYzI2MF9yZXBsYWNlcl82NzJ2X2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworICAgICAgICB1bnNpZ25lZCBpbnQgcHJlc2VudDsKKworCS8qIHNwZWFrZXIgLS0+IEdQSU8gRGF0YSAwLCBocCBvciBzcGRpZiAtLT4gR1BJTyBkYXRhIDEgKi8KKyAgICAgICAgcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgwZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwlpZiAocHJlc2VudCkgeworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDAxLCAwLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDEpOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDBmLCAwLAorCQkJCSAgICBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9IUCk7CisJfSBlbHNlIHsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwMSwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCAwKTsKKwkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwZiwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFsYzI2MF9yZXBsYWNlcl82NzJ2X3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlcykKK3sKKyAgICAgICAgaWYgKChyZXMgPj4gMjYpID09IEFMQzg4MF9IUF9FVkVOVCkKKyAgICAgICAgICAgICAgICBhbGMyNjBfcmVwbGFjZXJfNjcydl9hdXRvbXV0ZShjb2RlYyk7Cit9CisKIC8qIFRlc3QgY29uZmlndXJhdGlvbiBmb3IgZGVidWdnaW5nLCBtb2RlbGxlZCBhZnRlciB0aGUgQUxDODgwIHRlc3QKICAqIGNvbmZpZ3VyYXRpb24uCiAgKi8KQEAgLTM5NDYsMTAgKzQyNDIsMTIgQEAKIAkJcmV0dXJuIDA7IC8qIE4vQSAqLwogCQogCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIHBmeCk7Ci0JaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIG5hbWUsIHZvbF92YWwpKSA8IDApCisJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCBuYW1lLCB2b2xfdmFsKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcyBQbGF5YmFjayBTd2l0Y2giLCBwZngpOwotCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgbmFtZSwgc3dfdmFsKSkgPCAwKQorCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIG5hbWUsIHN3X3ZhbCk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIDE7CiB9CkBAIC0zOTg1LDcgKzQyODMsNyBAQAogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQotCXJldHVybiAwOwkKKwlyZXR1cm4gMDsKIH0KIAogLyogY3JlYXRlIHBsYXliYWNrL2NhcHR1cmUgY29udHJvbHMgZm9yIGlucHV0IHBpbnMgKi8KQEAgLTM5OTksMjAgKzQyOTcsMjQgQEAKIAkJaWYgKGNmZy0+aW5wdXRfcGluc1tpXSA+PSAweDEyKSB7CiAJCQlpZHggPSBjZmctPmlucHV0X3BpbnNbaV0gLSAweDEyOwogCQkJZXJyID0gbmV3X2FuYWxvZ19pbnB1dChzcGVjLCBjZmctPmlucHV0X3BpbnNbaV0sCi0JCQkJCSAgICAgICBhdXRvX3Bpbl9jZmdfbGFiZWxzW2ldLCBpZHgsIDB4MDcpOworCQkJCQkgICAgICAgYXV0b19waW5fY2ZnX2xhYmVsc1tpXSwgaWR4LAorCQkJCQkgICAgICAgMHgwNyk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwotCQkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9IGF1dG9fcGluX2NmZ19sYWJlbHNbaV07CisJCQlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmxhYmVsID0KKwkJCQlhdXRvX3Bpbl9jZmdfbGFiZWxzW2ldOwogCQkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5pbmRleCA9IGlkeDsKIAkJCWltdXgtPm51bV9pdGVtcysrOwogCQl9Ci0JCWlmICgoY2ZnLT5pbnB1dF9waW5zW2ldID49IDB4MGYpICYmIChjZmctPmlucHV0X3BpbnNbaV0gPD0gMHgxMCkpeworCQlpZiAoY2ZnLT5pbnB1dF9waW5zW2ldID49IDB4MGYgJiYgY2ZnLT5pbnB1dF9waW5zW2ldIDw9IDB4MTApewogCQkJaWR4ID0gY2ZnLT5pbnB1dF9waW5zW2ldIC0gMHgwOTsKIAkJCWVyciA9IG5ld19hbmFsb2dfaW5wdXQoc3BlYywgY2ZnLT5pbnB1dF9waW5zW2ldLAotCQkJCQkgICAgICAgYXV0b19waW5fY2ZnX2xhYmVsc1tpXSwgaWR4LCAweDA3KTsKKwkJCQkJICAgICAgIGF1dG9fcGluX2NmZ19sYWJlbHNbaV0sIGlkeCwKKwkJCQkJICAgICAgIDB4MDcpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKLQkJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10ubGFiZWwgPSBhdXRvX3Bpbl9jZmdfbGFiZWxzW2ldOworCQkJaW11eC0+aXRlbXNbaW11eC0+bnVtX2l0ZW1zXS5sYWJlbCA9CisJCQkJYXV0b19waW5fY2ZnX2xhYmVsc1tpXTsKIAkJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10uaW5kZXggPSBpZHg7CiAJCQlpbXV4LT5udW1faXRlbXMrKzsKIAkJfQpAQCAtNDAyNSwxNCArNDMyNywxNSBAQAogCQkJCQkgICAgICBpbnQgc2VsX2lkeCkKIHsKIAkvKiBzZXQgYXMgb3V0cHV0ICovCi0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIHBpbl90eXBlKTsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCSAgICBwaW5fdHlwZSk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJICAgIEFNUF9PVVRfVU5NVVRFKTsKIAkvKiBuZWVkIHRoZSBtYW51YWwgY29ubmVjdGlvbj8gKi8KIAlpZiAobmlkID49IDB4MTIpIHsKIAkJaW50IGlkeCA9IG5pZCAtIDB4MTI7CiAJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGlkeCArIDB4MGIsIDAsCiAJCQkJICAgIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBzZWxfaWR4KTsKLQkJCQkgICAgCiAJfQogfQogCkBAIC00MDQxLDkgKzQzNDQsMTIgQEAKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAloZGFfbmlkX3QgbmlkOwogCi0JbmlkID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdOwkKLQlpZiAobmlkKQotCQlhbGMyNjBfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgUElOX09VVCwgMCk7CisJYWxjX3N1YnN5c3RlbV9pZChjb2RlYywgMHgxMCwgMHgxNSwgMHgwZik7CisJbmlkID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zWzBdOworCWlmIChuaWQpIHsKKwkJaW50IHBpbl90eXBlID0gZ2V0X3Bpbl90eXBlKHNwZWMtPmF1dG9jZmcubGluZV9vdXRfdHlwZSk7CisJCWFsYzI2MF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgbmlkLCBwaW5fdHlwZSwgMCk7CisJfQogCQogCW5pZCA9IHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdOwogCWlmIChuaWQpCkBAIC00MDUxLDggKzQzNTcsOCBAQAogCiAJbmlkID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOwogCWlmIChuaWQpCi0JCWFsYzI2MF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgbmlkLCBQSU5fT1VULCAwKTsKLX0JCisJCWFsYzI2MF9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgbmlkLCBQSU5fSFAsIDApOworfQogCiAjZGVmaW5lIEFMQzI2MF9QSU5fQ0RfTklECQkweDE2CiBzdGF0aWMgdm9pZCBhbGMyNjBfYXV0b19pbml0X2FuYWxvZ19pbnB1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTQwNjMsMTAgKzQzNjksMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVVUT19QSU5fTEFTVDsgaSsrKSB7CiAJCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmlucHV0X3BpbnNbaV07CiAJCWlmIChuaWQgPj0gMHgxMikgewotCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCi0JCQkJCSAgICBpIDw9IEFVVE9fUElOX0ZST05UX01JQyA/IFBJTl9WUkVGODAgOiBQSU5fSU4pOworCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCQkgICAgaSA8PSBBVVRPX1BJTl9GUk9OVF9NSUMgPworCQkJCQkgICAgUElOX1ZSRUY4MCA6IFBJTl9JTik7CiAJCQlpZiAobmlkICE9IEFMQzI2MF9QSU5fQ0RfTklEKQotCQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCisJCQkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKIAkJCQkJCSAgICBBTVBfT1VUX01VVEUpOwogCQl9CiAJfQpAQCAtNDA4Niw4ICs0Mzk1LDggQEAKIAkKIAkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKIAkgKiBtaXhlciB3aWRnZXQKLQkgKiBOb3RlOiBQQVNEIG1vdGhlcmJvYXJkcyB1c2VzIHRoZSBMaW5lIEluIDIgYXMgdGhlIGlucHV0IGZvciBmcm9udCBwYW5lbAotCSAqIG1pYyAobWljIDIpCisJICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IKKwkgKiBmcm9udCBwYW5lbCBtaWMgKG1pYyAyKQogCSAqLwogCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KIAl7MHgwNywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCkBAIC00MTIyLDE0ICs0NDMxLDE3IEBACiAJaW50IGVycjsKIAlzdGF0aWMgaGRhX25pZF90IGFsYzI2MF9pZ25vcmVbXSA9IHsgMHgxNywgMCB9OwogCi0JaWYgKChlcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywKLQkJCQkJCWFsYzI2MF9pZ25vcmUpKSA8IDApCisJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsCisJCQkJCSAgIGFsYzI2MF9pZ25vcmUpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWlmICgoZXJyID0gYWxjMjYwX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKSkgPCAwKQorCWVyciA9IGFsYzI2MF9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JaWYgKCEgc3BlYy0+a2N0bF9hbGxvYykKKwlpZiAoIXNwZWMtPmtjdGxfYWxsb2MpCiAJCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIEJJT1MgcGluIGNvbmZpZyAqLwotCWlmICgoZXJyID0gYWxjMjYwX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKSkgPCAwKQorCWVyciA9IGFsYzI2MF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKIAlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSAyOwpAQCAtNDE3Nyw2ICs0NDg5LDggQEAKIAlbQUxDMjYwX0hQXzMwMTNdCT0gImhwLTMwMTMiLAogCVtBTEMyNjBfRlVKSVRTVV9TNzAyWF0JPSAiZnVqaXRzdSIsCiAJW0FMQzI2MF9BQ0VSXQkJPSAiYWNlciIsCisJW0FMQzI2MF9XSUxMXQkJPSAid2lsbCIsCisJW0FMQzI2MF9SRVBMQUNFUl82NzJWXQk9ICJyZXBsYWNlciIsCiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwogCVtBTEMyNjBfVEVTVF0JCT0gInRlc3QiLAogI2VuZGlmCkBAIC00MjAwLDYgKzQ1MTQsOCBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxY2QsICJTb255IFZBSU8iLCBBTEMyNjBfQkFTSUMpLAogCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDEzMjYsICJGdWppdHN1IFM3MDJYIiwgQUxDMjYwX0ZVSklUU1VfUzcwMlgpLAogCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA3MjksICJDVEwgVTU1M1ciLCBBTEMyNjBfQkFTSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxNjMxLCAweGMwMTcsICJQQiBWNzkwMCIsIEFMQzI2MF9XSUxMKSwKKwlTTkRfUENJX1FVSVJLKDB4MTYxZiwgMHgyMDU3LCAiUmVwbGFjZXIgNjcyViIsIEFMQzI2MF9SRVBMQUNFUl82NzJWKSwKIAl7fQogfTsKIApAQCAtNDI3MCw2ICs0NTg2LDM0IEBACiAJCS5udW1fbXV4X2RlZnMgPSBBUlJBWV9TSVpFKGFsYzI2MF9hY2VyX2NhcHR1cmVfc291cmNlcyksCiAJCS5pbnB1dF9tdXggPSBhbGMyNjBfYWNlcl9jYXB0dXJlX3NvdXJjZXMsCiAJfSwKKwlbQUxDMjYwX1dJTExdID0geworCQkubWl4ZXJzID0geyBhbGMyNjBfd2lsbF9taXhlciwKKwkJCSAgICBhbGMyNjBfY2FwdHVyZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYwX2luaXRfdmVyYnMsIGFsYzI2MF93aWxsX3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYwX2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGMyNjBfYWRjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzI2MF9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDMjYwX1JFUExBQ0VSXzY3MlZdID0geworCQkubWl4ZXJzID0geyBhbGMyNjBfcmVwbGFjZXJfNjcydl9taXhlciwKKwkJCSAgICBhbGMyNjBfY2FwdHVyZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYwX2luaXRfdmVyYnMsIGFsYzI2MF9yZXBsYWNlcl82NzJ2X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjMjYwX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjMjYwX2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjBfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGMyNjBfYWRjX25pZHMsCisJCS5kaWdfb3V0X25pZCA9IEFMQzI2MF9ESUdPVVRfTklELAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjMjYwX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzI2MF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGMyNjBfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzI2MF9yZXBsYWNlcl82NzJ2X3Vuc29sX2V2ZW50LAorCQkuaW5pdF9ob29rID0gYWxjMjYwX3JlcGxhY2VyXzY3MnZfYXV0b211dGUsCisJfSwKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJW0FMQzI2MF9URVNUXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjMjYwX3Rlc3RfbWl4ZXIsCkBAIC00MzEzLDcgKzQ2NTcsNyBAQAogCQlpZiAoZXJyIDwgMCkgewogCQkJYWxjX2ZyZWUoY29kZWMpOwogCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIGlmICghIGVycikgeworCQl9IGVsc2UgaWYgKCFlcnIpIHsKIAkJCXByaW50ayhLRVJOX0lORk8KIAkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgogCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBiYXNlIG1vZGUuLi5cbiIpOwpAQCAtNDM4Miw3ICs0NzI2LDggQEAKICNkZWZpbmUgYWxjODgyX211eF9lbnVtX2luZm8gYWxjX211eF9lbnVtX2luZm8KICNkZWZpbmUgYWxjODgyX211eF9lbnVtX2dldCBhbGNfbXV4X2VudW1fZ2V0CiAKLXN0YXRpYyBpbnQgYWxjODgyX211eF9lbnVtX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCitzdGF0aWMgaW50IGFsYzg4Ml9tdXhfZW51bV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CkBAIC00Mzk2LDcgKzQ3NDEsNyBAQAogCWlkeCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CiAJaWYgKGlkeCA+PSBpbXV4LT5udW1faXRlbXMpCiAJCWlkeCA9IGltdXgtPm51bV9pdGVtcyAtIDE7Ci0JaWYgKCpjdXJfdmFsID09IGlkeCAmJiAhIGNvZGVjLT5pbl9yZXN1bWUpCisJaWYgKCpjdXJfdmFsID09IGlkeCAmJiAhY29kZWMtPmluX3Jlc3VtZSkKIAkJcmV0dXJuIDA7CiAJZm9yIChpID0gMDsgaSA8IGltdXgtPm51bV9pdGVtczsgaSsrKSB7CiAJCXVuc2lnbmVkIGludCB2ID0gKGkgPT0gaWR4KSA/IDB4NzAwMCA6IDB4NzA4MDsKQEAgLTQ0NjQsNiArNDgwOSwyMSBAQAogCXsgfSAvKiBlbmQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODJfdzJqY19taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwYywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIEJvb3N0IiwgMHgxOCwgMCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKwl7IH0gLyogZW5kICovCit9OworCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgyX2NobW9kZV9taXhlcltdID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCkBAIC00NTU5LDcgKzQ5MTksNyBAQAogCS8qIGNoYW5nZSB0byBFQVBEIG1vZGUgKi8KIAl7MHgyMCwgQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCwgMHgwN30sCiAJezB4MjAsIEFDX1ZFUkJfU0VUX1BST0NfQ09FRiwgMHgzMDYwfSwKLQl7IH0gCisJeyB9CiB9OwogCiAvKiBNYWMgUHJvIHRlc3QgKi8KQEAgLTQ2MjQsNiArNDk4NCw3IEBACiAKIAl7IH0KIH07CisKIHN0YXRpYyB2b2lkIGFsYzg4Ml9ncGlvX211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBwaW4sIGludCBtdXRlZCkKIHsKIAl1bnNpZ25lZCBpbnQgZ3Bpb3N0YXRlLCBncGlvbWFzaywgZ3Bpb2RpcjsKQEAgLTQ2NzIsOCArNTAzMyw4IEBACiAKIAkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKIAkgKiBtaXhlciB3aWRnZXQKLQkgKiBOb3RlOiBQQVNEIG1vdGhlcmJvYXJkcyB1c2VzIHRoZSBMaW5lIEluIDIgYXMgdGhlIGlucHV0IGZvciBmcm9udCBwYW5lbAotCSAqIG1pYyAobWljIDIpCisJICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IKKwkgKiBmcm9udCBwYW5lbCBtaWMgKG1pYyAyKQogCSAqLwogCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KIAl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCkBAIC00NzgyLDYgKzUxNDMsNyBAQAogCVtBTEM4ODJfM1NUX0RJR10JPSAiM3N0YWNrLWRpZyIsCiAJW0FMQzg4Ml82U1RfRElHXQk9ICI2c3RhY2stZGlnIiwKIAlbQUxDODgyX0FSSU1BXQkJPSAiYXJpbWEiLAorCVtBTEM4ODJfVzJKQ10JCT0gIncyamMiLAogCVtBTEM4ODVfTUFDUFJPXQkJPSAibWFjcHJvIiwKIAlbQUxDODgyX0FVVE9dCQk9ICJhdXRvIiwKIH07CkBAIC00NzkyLDYgKzUxNTQsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDY2NjgsICJNU0kiLCBBTEM4ODJfNlNUX0RJRyksCiAJU05EX1BDSV9RVUlSSygweDE2MWYsIDB4MjA1NCwgIkFyaW1hIFc4MjAiLCBBTEM4ODJfQVJJTUEpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxZDgsICJBc3VzIFA1V0QiLCBBTEM4ODJfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTk3MSwgIkFzdXMgVzJKQyIsIEFMQzg4Ml9XMkpDKSwKIAl7fQogfTsKIApAQCAtNDgyOCw2ICs1MTkxLDE4IEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGM4ODJfc2l4c3RhY2tfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjODgyX2NhcHR1cmVfc291cmNlLAogCX0sCisJW0FMQzg4Ml9XMkpDXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODgyX3cyamNfbWl4ZXIsIGFsYzg4Ml9jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg4Ml9pbml0X3ZlcmJzLCBhbGM4ODJfZWFwZF92ZXJicywKKwkJCQlhbGM4ODBfZ3BpbzFfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKKwkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4MF90aHJlZXN0YWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4MF90aHJlZXN0YWNrX21vZGVzLAorCQkubmVlZF9kYWNfZml4ID0gMSwKKwkJLmlucHV0X211eCA9ICZhbGM4ODJfY2FwdHVyZV9zb3VyY2UsCisJCS5kaWdfb3V0X25pZCA9IEFMQzg4Ml9ESUdPVVRfTklELAorCX0sCiAJW0FMQzg4NV9NQUNQUk9dID0gewogCQkubWl4ZXJzID0geyBhbGM4ODJfbWFjcHJvX21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGM4ODJfbWFjcHJvX2luaXRfdmVyYnMgfSwKQEAgLTQ4NTEsMTUgKzUyMjYsMTcgQEAKIHsKIAkvKiBzZXQgYXMgb3V0cHV0ICovCiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGlkeDsgCi0JCisJaW50IGlkeDsKKwogCWlmIChzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tkYWNfaWR4XSA9PSAweDI1KQogCQlpZHggPSA0OwogCWVsc2UKIAkJaWR4ID0gc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbZGFjX2lkeF0gLSAyOwogCi0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIHBpbl90eXBlKTsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKKwkJCSAgICBwaW5fdHlwZSk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJICAgIEFNUF9PVVRfVU5NVVRFKTsKIAlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCBpZHgpOwogCiB9CkBAIC00ODY5LDEwICs1MjQ2LDEzIEBACiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGk7CiAKKwlhbGNfc3Vic3lzdGVtX2lkKGNvZGVjLCAweDE1LCAweDFiLCAweDE0KTsKIAlmb3IgKGkgPSAwOyBpIDw9IEhEQV9TSURFOyBpKyspIHsKLQkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1tpXTsJCisJCWhkYV9uaWRfdCBuaWQgPSBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3BpbnNbaV07CisJCWludCBwaW5fdHlwZSA9IGdldF9waW5fdHlwZShzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0X3R5cGUpOwogCQlpZiAobmlkKQotCQkJYWxjODgyX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBuaWQsIFBJTl9PVVQsIGkpOworCQkJYWxjODgyX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBuaWQsIHBpbl90eXBlLAorCQkJCQkJCSAgaSk7CiAJfQogfQogCkBAIC00ODgzLDcgKzUyNjMsOCBAQAogCiAJcGluID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOwogCWlmIChwaW4pIC8qIGNvbm5lY3QgdG8gZnJvbnQgKi8KLQkJYWxjODgyX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9IUCwgMCk7IC8qIHVzZSBkYWMgMCAqLworCQkvKiB1c2UgZGFjIDAgKi8KKwkJYWxjODgyX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9IUCwgMCk7CiB9CiAKICNkZWZpbmUgYWxjODgyX2lzX2lucHV0X3BpbihuaWQpCWFsYzg4MF9pc19pbnB1dF9waW4obmlkKQpAQCAtNDg5NywxMCArNTI3OCwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBBVVRPX1BJTl9MQVNUOyBpKyspIHsKIAkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmF1dG9jZmcuaW5wdXRfcGluc1tpXTsKIAkJaWYgKGFsYzg4Ml9pc19pbnB1dF9waW4obmlkKSkgewotCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsCi0JCQkJCSAgICBpIDw9IEFVVE9fUElOX0ZST05UX01JQyA/IFBJTl9WUkVGODAgOiBQSU5fSU4pOworCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCQkgICAgaSA8PSBBVVRPX1BJTl9GUk9OVF9NSUMgPworCQkJCQkgICAgUElOX1ZSRUY4MCA6IFBJTl9JTik7CiAJCQlpZiAobmlkICE9IEFMQzg4Ml9QSU5fQ0RfTklEKQotCQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKKwkJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCisJCQkJCQkgICAgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwKIAkJCQkJCSAgICBBTVBfT1VUX01VVEUpOwogCQl9CiAJfQpAQCAtNDk2Miw3ICs1MzQ2LDcgQEAKIAkJaWYgKGVyciA8IDApIHsKIAkJCWFsY19mcmVlKGNvZGVjKTsKIAkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSBpZiAoISBlcnIpIHsKKwkJfSBlbHNlIGlmICghZXJyKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKIAkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKQEAgLTQ5ODYsMTQgKzUzNzAsMTYgQEAKIAlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZhbGM4ODJfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CiAJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9ICZhbGM4ODJfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKIAotCWlmICghIHNwZWMtPmFkY19uaWRzICYmIHNwZWMtPmlucHV0X211eCkgeworCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CiAJCS8qIGNoZWNrIHdoZXRoZXIgTklEIDB4MDcgaXMgdmFsaWQgKi8KIAkJdW5zaWduZWQgaW50IHdjYXAgPSBnZXRfd2NhcHMoY29kZWMsIDB4MDcpOwotCQl3Y2FwID0gKHdjYXAgJiBBQ19XQ0FQX1RZUEUpID4+IEFDX1dDQVBfVFlQRV9TSElGVDsgLyogZ2V0IHR5cGUgKi8KKwkJLyogZ2V0IHR5cGUgKi8KKwkJd2NhcCA9ICh3Y2FwICYgQUNfV0NBUF9UWVBFKSA+PiBBQ19XQ0FQX1RZUEVfU0hJRlQ7CiAJCWlmICh3Y2FwICE9IEFDX1dJRF9BVURfSU4pIHsKIAkJCXNwZWMtPmFkY19uaWRzID0gYWxjODgyX2FkY19uaWRzX2FsdDsKIAkJCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODgyX2FkY19uaWRzX2FsdCk7Ci0JCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPSBhbGM4ODJfY2FwdHVyZV9hbHRfbWl4ZXI7CisJCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVyc10gPQorCQkJCWFsYzg4Ml9jYXB0dXJlX2FsdF9taXhlcjsKIAkJCXNwZWMtPm51bV9taXhlcnMrKzsKIAkJfSBlbHNlIHsKIAkJCXNwZWMtPmFkY19uaWRzID0gYWxjODgyX2FkY19uaWRzOwpAQCAtNTAzMyw2ICs1NDE5LDcgQEAKIAkvKiBBREMxLTIgKi8KIAkweDA4LCAweDA5LAogfTsKKwogLyogaW5wdXQgTVVYICovCiAvKiBGSVhNRTogc2hvdWxkIGJlIGEgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLwogCkBAIC01MDQ1LDYgKzU0MzIsMTUgQEAKIAkJeyAiQ0QiLCAweDQgfSwKIAl9LAogfTsKKworc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFsYzg4M19sZW5vdm9fMTAxZV9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMiwKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJfSwKK307CisKICNkZWZpbmUgYWxjODgzX211eF9lbnVtX2luZm8gYWxjX211eF9lbnVtX2luZm8KICNkZWZpbmUgYWxjODgzX211eF9lbnVtX2dldCBhbGNfbXV4X2VudW1fZ2V0CiAKQEAgLTUwNjMsNyArNTQ1OSw3IEBACiAJaWR4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKIAlpZiAoaWR4ID49IGltdXgtPm51bV9pdGVtcykKIAkJaWR4ID0gaW11eC0+bnVtX2l0ZW1zIC0gMTsKLQlpZiAoKmN1cl92YWwgPT0gaWR4ICYmICEgY29kZWMtPmluX3Jlc3VtZSkKKwlpZiAoKmN1cl92YWwgPT0gaWR4ICYmICFjb2RlYy0+aW5fcmVzdW1lKQogCQlyZXR1cm4gMDsKIAlmb3IgKGkgPSAwOyBpIDwgaW11eC0+bnVtX2l0ZW1zOyBpKyspIHsKIAkJdW5zaWduZWQgaW50IHYgPSAoaSA9PSBpZHgpID8gMHg3MDAwIDogMHg3MDgwOwpAQCAtNTA3Myw2ICs1NDY5LDcgQEAKIAkqY3VyX3ZhbCA9IGlkeDsKIAlyZXR1cm4gMTsKIH0KKwogLyoKICAqIDJjaCBtb2RlCiAgKi8KQEAgLTUzMjUsNyArNTcyMiw3IEBACiAJCS5wdXQgPSBhbGM4ODNfbXV4X2VudW1fcHV0LAogCX0sCiAJeyB9IC8qIGVuZCAqLwotfTsJCit9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODgzX3RhZ3JhXzJjaF9taXhlcltdID0gewogCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MGMsIDB4MCwgSERBX09VVFBVVCksCkBAIC01MzUwLDcgKzU3NDcsMzAgQEAKIAkJLnB1dCA9IGFsYzg4M19tdXhfZW51bV9wdXQsCiAJfSwKIAl7IH0gLyogZW5kICovCi19OwkKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfbGVub3ZvXzEwMWVfMmNoX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwYywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDBjLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoImlTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGQsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiaVNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwZCwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDE4LCAwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgxLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gYWxjODgzX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGM4ODNfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjODgzX211eF9lbnVtX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4ODNfY2htb2RlX21peGVyW10gPSB7CiAJewpAQCAtNTQ1MiwyNSArNTg3MiwzNSBAQAogCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sIC8qIEhQICovCiAKIAl7MHgxNCwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBTEM4ODBfSFBfRVZFTlQgfCBBQ19VU1JTUF9FTn0sCi0JezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwM30sIAotCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwM30sIAotCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDN9LCAKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19NQVNLLCAweDAzfSwKKwl7MHgwMSwgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDN9LAorCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDN9LAogCiAJeyB9IC8qIGVuZCAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4ODNfbGVub3ZvXzEwMWVfdmVyYnNbXSA9IHsKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9GUk9OVF9FVkVOVHxBQ19VU1JTUF9FTn0sCisgICAgICAgIHsweDFiLCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFMQzg4MF9IUF9FVkVOVHxBQ19VU1JTUF9FTn0sCisJeyB9IC8qIGVuZCAqLworfTsKKwogLyogdG9nZ2xlIHNwZWFrZXItb3V0cHV0IGFjY29yZGluZyB0byB0aGUgaHAtamFjayBzdGF0ZSAqLwogc3RhdGljIHZvaWQgYWxjODgzX3RhZ3JhX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogIAl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CiAKICAJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNCwgMCwKIAkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCWJpdHMgPSBwcmVzZW50ID8gMHg4MCA6IDA7CiAJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDFiLCAwLCBIREFfT1VUUFVULCAwLAotCQkJCSAweDgwLCBwcmVzZW50ID8gMHg4MCA6IDApOworCQkJCSAweDgwLCBiaXRzKTsKIAlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MWIsIDEsIEhEQV9PVVRQVVQsIDAsCi0JCQkJIDB4ODAsIHByZXNlbnQgPyAweDgwIDogMCk7Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMSwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCBwcmVzZW50ID8gMSA6IDMpOworCQkJCSAweDgwLCBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAxLCAwLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsCisJCQkgICAgcHJlc2VudCA/IDEgOiAzKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjODgzX3RhZ3JhX3Vuc29sX2V2ZW50KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVzKQpAQCAtNTQ3OSw2ICs1OTA5LDQ3IEBACiAJCWFsYzg4M190YWdyYV9hdXRvbXV0ZShjb2RlYyk7CiB9CiAKK3N0YXRpYyB2b2lkIGFsYzg4M19sZW5vdm9fMTAxZV9pc3BlYWtlcl9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKyAJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgY2hhciBiaXRzOworCisgCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTQsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwliaXRzID0gcHJlc2VudCA/IDB4ODAgOiAwOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNSwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgYml0cyk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE1LCAxLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBiaXRzKTsKK30KKworc3RhdGljIHZvaWQgYWxjODgzX2xlbm92b18xMDFlX2FsbF9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKyAJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgY2hhciBiaXRzOworCisgCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MWIsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwliaXRzID0gcHJlc2VudCA/IDB4ODAgOiAwOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNSwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgYml0cyk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE1LCAxLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTQsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIGJpdHMpOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNCwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg4M19sZW5vdm9fMTAxZV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0hQX0VWRU5UKQorCQlhbGM4ODNfbGVub3ZvXzEwMWVfYWxsX2F1dG9tdXRlKGNvZGVjKTsKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0ZST05UX0VWRU5UKQorCQlhbGM4ODNfbGVub3ZvXzEwMWVfaXNwZWFrZXJfYXV0b211dGUoY29kZWMpOworfQorCiAvKgogICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwogICovCkBAIC01NDkzLDggKzU5NjQsOCBAQAogCiAJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCiAJICogbWl4ZXIgd2lkZ2V0Ci0JICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IgZnJvbnQgcGFuZWwKLQkgKiBtaWMgKG1pYyAyKQorCSAqIE5vdGU6IFBBU0QgbW90aGVyYm9hcmRzIHVzZXMgdGhlIExpbmUgSW4gMiBhcyB0aGUgaW5wdXQgZm9yCisJICogZnJvbnQgcGFuZWwgbWljIChtaWMgMikKIAkgKi8KIAkvKiBBbXAgSW5kaWNlczogTWljMSA9IDAsIE1pYzIgPSAxLCBMaW5lMSA9IDIsIExpbmUyID0gMywgQ0QgPSA0ICovCiAJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LApAQCAtNTUzMCwxMyArNjAwMSwxMyBAQAogCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCiAJezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCS8vezB4MjMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAorCS8qIHsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwgKi8KIAl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCiAJLyogSW5wdXQgbWl4ZXIyICovCiAJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKIAl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JLy97MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCisJLyogezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LCAqLwogCXsweDIzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDQpfSwKIAogCXsgfQpAQCAtNTU4NCw2ICs2MDU1LDcgQEAKIAlbQUxDODgzX0FDRVJdCQk9ICJhY2VyIiwKIAlbQUxDODgzX01FRElPTl0JCT0gIm1lZGlvbiIsCiAJW0FMQzg4M19MQVBUT1BfRUFQRF0JPSAibGFwdG9wLWVhcGQiLAorCVtBTEM4ODNfTEVOT1ZPXzEwMUVfMmNoXSA9ICJsZW5vdm8tMTAxZSIsCiAJW0FMQzg4M19BVVRPXQkJPSAiYXV0byIsCiB9OwogCkBAIC01NTkyLDYgKzYwNjQsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDhlLCAweDUzNGQsIE5VTEwsIEFMQzg4M18zU1RfNmNoKSwKIAlTTkRfUENJX1FVSVJLKDB4MTU1OCwgMCwgIkNsZXZvIGxhcHRvcCIsIEFMQzg4M19MQVBUT1BfRUFQRCksCiAJU05EX1BDSV9RVUlSSygweDEwNWIsIDB4NjY2OCwgIkZveGNvbm4iLCBBTEM4ODNfNlNUX0RJRyksCisJU05EX1BDSV9RVUlSSygweDE0NTgsIDB4YTAwMiwgIk1TSSIsIEFMQzg4M182U1RfRElHKSwKIAlTTkRfUENJX1FVSVJLKDB4MTQ2MiwgMHg2NjY4LCAiTVNJIiwgQUxDODgzXzZTVF9ESUcpLAogCVNORF9QQ0lfUVVJUksoMHgxNDYyLCAweDcxODcsICJNU0kiLCBBTEM4ODNfNlNUX0RJRyksCiAJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4NzI4MCwgIk1TSSIsIEFMQzg4M182U1RfRElHKSwKQEAgLTU2MDksNiArNjA4Miw3IEBACiAJU05EX1BDSV9RVUlSSygweDE2MWYsIDB4MjA1NCwgIk1lZGlvbiBsYXB0b3AiLCBBTEM4ODNfTUVESU9OKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA3MSwgMHg4MjU4LCAiRXZlc2hhbSBWb3lhZWdlciIsIEFMQzg4M19MQVBUT1BfRUFQRCksCiAJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDYwMSwgIkQxMDJHR0MiLCBBTEM4ODNfM1NUXzZjaCksCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MTAxZSwgImxlbm92byAxMDFlIiwgQUxDODgzX0xFTk9WT18xMDFFXzJjaCksCiAJe30KIH07CiAKQEAgLTU2MzksNyArNjExMyw3IEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzZjaF9tb2RlcywKIAkJLm5lZWRfZGFjX2ZpeCA9IDEsCiAJCS5pbnB1dF9tdXggPSAmYWxjODgzX2NhcHR1cmVfc291cmNlLAotCX0sCQorCX0sCiAJW0FMQzg4M18zU1RfNmNoXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjODgzXzNTVF82Y2hfbWl4ZXIsIGFsYzg4M19jaG1vZGVfbWl4ZXIgfSwKIAkJLmluaXRfdmVyYnMgPSB7IGFsYzg4M19pbml0X3ZlcmJzIH0sCkBAIC01NjUxLDcgKzYxMjUsNyBAQAogCQkuY2hhbm5lbF9tb2RlID0gYWxjODgzXzNTVF82Y2hfbW9kZXMsCiAJCS5uZWVkX2RhY19maXggPSAxLAogCQkuaW5wdXRfbXV4ID0gJmFsYzg4M19jYXB0dXJlX3NvdXJjZSwKLQl9LAkKKwl9LAogCVtBTEM4ODNfNlNUX0RJR10gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzg4M19iYXNlX21peGVyLCBhbGM4ODNfY2htb2RlX21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGM4ODNfaW5pdF92ZXJicyB9LApAQCAtNTc0OSw2ICs2MjIzLDE5IEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKIAkJLmlucHV0X211eCA9ICZhbGM4ODNfY2FwdHVyZV9zb3VyY2UsCiAJfSwKKwlbQUxDODgzX0xFTk9WT18xMDFFXzJjaF0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzg4M19sZW5vdm9fMTAxZV8yY2hfbWl4ZXJ9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjODgzX2luaXRfdmVyYnMsIGFsYzg4M19sZW5vdm9fMTAxZV92ZXJic30sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgzX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjODgzX2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM4ODNfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODNfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM4ODNfM1NUXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM4ODNfbGVub3ZvXzEwMWVfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg4M19sZW5vdm9fMTAxZV91bnNvbF9ldmVudCwKKwkJLmluaXRfaG9vayA9IGFsYzg4M19sZW5vdm9fMTAxZV9hbGxfYXV0b211dGUsCisJfSwKIH07CiAKIApAQCAtNTc2MSw4ICs2MjQ4LDggQEAKIHsKIAkvKiBzZXQgYXMgb3V0cHV0ICovCiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGlkeDsgCi0JCisJaW50IGlkeDsKKwogCWlmIChzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tkYWNfaWR4XSA9PSAweDI1KQogCQlpZHggPSA0OwogCWVsc2UKQEAgLTU3ODEsMTAgKzYyNjgsMTMgQEAKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgaTsKIAorCWFsY19zdWJzeXN0ZW1faWQoY29kZWMsIDB4MTUsIDB4MWIsIDB4MTQpOwogCWZvciAoaSA9IDA7IGkgPD0gSERBX1NJREU7IGkrKykgewotCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zW2ldOwkKKwkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmF1dG9jZmcubGluZV9vdXRfcGluc1tpXTsKKwkJaW50IHBpbl90eXBlID0gZ2V0X3Bpbl90eXBlKHNwZWMtPmF1dG9jZmcubGluZV9vdXRfdHlwZSk7CiAJCWlmIChuaWQpCi0JCQlhbGM4ODNfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgUElOX09VVCwgaSk7CisJCQlhbGM4ODNfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgcGluX3R5cGUsCisJCQkJCQkJICBpKTsKIAl9CiB9CiAKQEAgLTU4MzMsOCArNjMyMyw4IEBACiAJZWxzZSBpZiAoZXJyID4gMCkKIAkJLyogaGFjayAtIG92ZXJyaWRlIHRoZSBpbml0IHZlcmJzICovCiAJCXNwZWMtPmluaXRfdmVyYnNbMF0gPSBhbGM4ODNfYXV0b19pbml0X3ZlcmJzOwotICAgICAgICAgICAgICAgIHNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IGFsYzg4M19jYXB0dXJlX21peGVyOwotCQlzcGVjLT5udW1fbWl4ZXJzKys7CisJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnNdID0gYWxjODgzX2NhcHR1cmVfbWl4ZXI7CisJc3BlYy0+bnVtX21peGVycysrOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTU4NzIsNyArNjM2Miw3IEBACiAJCWlmIChlcnIgPCAwKSB7CiAJCQlhbGNfZnJlZShjb2RlYyk7CiAJCQlyZXR1cm4gZXJyOwotCQl9IGVsc2UgaWYgKCEgZXJyKSB7CisJCX0gZWxzZSBpZiAoIWVycikgewogCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJICAgICAgICJoZGFfY29kZWM6IENhbm5vdCBzZXQgdXAgY29uZmlndXJhdGlvbiAiCiAJCQkgICAgICAgImZyb20gQklPUy4gIFVzaW5nIGJhc2UgbW9kZS4uLlxuIik7CkBAIC01ODkxLDcgKzYzODEsNyBAQAogCXNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrID0gJmFsYzg4M19wY21fZGlnaXRhbF9wbGF5YmFjazsKIAlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJmFsYzg4M19wY21fZGlnaXRhbF9jYXB0dXJlOwogCi0JaWYgKCEgc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CisJaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKIAkJc3BlYy0+YWRjX25pZHMgPSBhbGM4ODNfYWRjX25pZHM7CiAJCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODgzX2FkY19uaWRzKTsKIAl9CkBAIC02MDI4LDggKzY1MTgsOCBAQAogCiAJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCiAJICogbWl4ZXIgd2lkZ2V0Ci0JICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IgZnJvbnQgcGFuZWwKLQkgKiBtaWMgKG1pYyAyKQorCSAqIE5vdGU6IFBBU0QgbW90aGVyYm9hcmRzIHVzZXMgdGhlIExpbmUgSW4gMiBhcyB0aGUgaW5wdXQgZm9yCisJICogZnJvbnQgcGFuZWwgbWljIChtaWMgMikKIAkgKi8KIAkvKiBBbXAgSW5kaWNlczogTWljMSA9IDAsIE1pYzIgPSAxLCBMaW5lMSA9IDIsIExpbmUyID0gMywgQ0QgPSA0ICovCiAJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LApAQCAtNjA4Niw3ICs2NTc2LDcgQEAKIAl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzAwMCB8ICgweDAwIDw8IDgpKX0sCiAJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwODAgfCAoMHgwMyA8PCA4KSl9LAogCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDIgPDwgOCkpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgKDB4NzA4MCB8ICgweDA0IDw8IDgpKX0sCQorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAoMHg3MDgwIHwgKDB4MDQgPDwgOCkpfSwKIAogCXsgfQogfTsKQEAgLTYxMTMsNyArNjYwMyw3IEBACiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJdW5zaWduZWQgaW50IG11dGU7CiAKLQlpZiAoZm9yY2UgfHwgISBzcGVjLT5zZW5zZV91cGRhdGVkKSB7CisJaWYgKGZvcmNlIHx8ICFzcGVjLT5zZW5zZV91cGRhdGVkKSB7CiAJCXVuc2lnbmVkIGludCBwcmVzZW50OwogCQkvKiBuZWVkIHRvIGV4ZWN1dGUgYW5kIHN5bmMgYXQgZmlyc3QgKi8KIAkJc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE1LCAwLCBBQ19WRVJCX1NFVF9QSU5fU0VOU0UsIDApOwpAQCAtNjE1Myw3ICs2NjQzLDcgQEAKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAl1bnNpZ25lZCBpbnQgbXV0ZTsKIAotCWlmIChmb3JjZSB8fCAhIHNwZWMtPnNlbnNlX3VwZGF0ZWQpIHsKKwlpZiAoZm9yY2UgfHwgIXNwZWMtPnNlbnNlX3VwZGF0ZWQpIHsKIAkJdW5zaWduZWQgaW50IHByZXNlbnQ7CiAJCS8qIG5lZWQgdG8gZXhlY3V0ZSBhbmQgc3luYyBhdCBmaXJzdCAqLwogCQlzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MWIsIDAsIEFDX1ZFUkJfU0VUX1BJTl9TRU5TRSwgMCk7CkBAIC02MjI2LDcgKzY3MTYsNyBAQAogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCXVuc2lnbmVkIGludCBtdXRlOwogCi0JaWYgKGZvcmNlIHx8ICEgc3BlYy0+c2Vuc2VfdXBkYXRlZCkgeworCWlmIChmb3JjZSB8fCAhc3BlYy0+c2Vuc2VfdXBkYXRlZCkgewogCQl1bnNpZ25lZCBpbnQgcHJlc2VudDsKIAkJLyogbmVlZCB0byBleGVjdXRlIGFuZCBzeW5jIGF0IGZpcnN0ICovCiAJCXNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNCwgMCwgQUNfVkVSQl9TRVRfUElOX1NFTlNFLCAwKTsKQEAgLTYzMzEsNyArNjgyMSw4IEBACiB9OwogCiAvKiBhZGQgcGxheWJhY2sgY29udHJvbHMgZnJvbSB0aGUgcGFyc2VkIERBQyB0YWJsZSAqLwotc3RhdGljIGludCBhbGMyNjJfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3RydWN0IGFsY19zcGVjICpzcGVjLCBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCitzdGF0aWMgaW50IGFsYzI2Ml9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQogewogCWhkYV9uaWRfdCBuaWQ7CiAJaW50IGVycjsKQEAgLTYzNDIsMjYgKzY4MzMsMzkgQEAKIAogCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1swXTsKIAlpZiAobmlkKSB7Ci0JCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLCAiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwKLQkJCQkgICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBjLCAzLCAwLCBIREFfT1VUUFVUKSkpIDwgMCkKKwkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLAorCQkJCSAgIkZyb250IFBsYXliYWNrIFZvbHVtZSIsCisJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MGMsIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsICJGcm9udCBQbGF5YmFjayBTd2l0Y2giLAotCQkJCSAgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCkpKSA8IDApCisJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsCisJCQkJICAiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAwLCBIREFfT1VUUFVUKSk7CisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKIAluaWQgPSBjZmctPnNwZWFrZXJfcGluc1swXTsKIAlpZiAobmlkKSB7CiAJCWlmIChuaWQgPT0gMHgxNikgewotCQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsICJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkJCSAgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKDB4MGUsIDIsIDAsIEhEQV9PVVRQVVQpKSkgPCAwKQorCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLAorCQkJCQkgICJTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBlLCAyLCAwLAorCQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7Ci0JCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsICJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCSAgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMiwgMCwgSERBX09VVFBVVCkpKSA8IDApCisJCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLAorCQkJCQkgICJTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDIsIDAsCisJCQkJCQkJICAgICAgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJfSBlbHNlIHsKLQkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQkJICAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAwLCBIREFfT1VUUFVUKSkpIDwgMCkKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsCisJCQkJCSAgIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwKKwkJCQkJCQkgICAgICBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtNjM2OSwyMyArNjg3MywzMyBAQAogCWlmIChuaWQpIHsKIAkJLyogc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gMjsgKi8KIAkJaWYgKG5pZCA9PSAweDE2KSB7Ci0JCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAotCQkJCQkgICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBlLCAyLCAwLCBIREFfT1VUUFVUKSkpIDwgMCkKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwKKwkJCQkJICAiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTCgweDBlLCAyLCAwLAorCQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7Ci0JCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsICJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQkJICAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAyLCAwLCBIREFfT1VUUFVUKSkpIDwgMCkKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsCisJCQkJCSAgIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLAorCQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAyLCAwLAorCQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsICJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQkJICAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAwLCBIREFfT1VUUFVUKSkpIDwgMCkKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsCisJCQkJCSAgIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLAorCQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAwLAorCQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0KIAl9Ci0JcmV0dXJuIDA7CQorCXJldHVybiAwOwogfQogCiAvKiBpZGVudGljYWwgd2l0aCBBTEM4ODAgKi8KLSNkZWZpbmUgYWxjMjYyX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzIGFsYzg4MF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscworI2RlZmluZSBhbGMyNjJfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMgXAorCWFsYzg4MF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscwogCiAvKgogICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwpAQCAtNjQwMyw4ICs2OTE3LDggQEAKIAogCS8qIFVubXV0ZSBpbnB1dCBhbXBzIChDRCwgTGluZSBJbiwgTWljIDEgJiBNaWMgMikgb2YgdGhlIGFuYWxvZy1sb29wYmFjawogCSAqIG1peGVyIHdpZGdldAotCSAqIE5vdGU6IFBBU0QgbW90aGVyYm9hcmRzIHVzZXMgdGhlIExpbmUgSW4gMiBhcyB0aGUgaW5wdXQgZm9yIGZyb250IHBhbmVsCi0JICogbWljIChtaWMgMikKKwkgKiBOb3RlOiBQQVNEIG1vdGhlcmJvYXJkcyB1c2VzIHRoZSBMaW5lIEluIDIgYXMgdGhlIGlucHV0IGZvcgorCSAqIGZyb250IHBhbmVsIG1pYyAobWljIDIpCiAJICovCiAJLyogQW1wIEluZGljZXM6IE1pYzEgPSAwLCBNaWMyID0gMSwgTGluZTEgPSAyLCBMaW5lMiA9IDMsIENEID0gNCAqLwogCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKQEAgLTY0NjQsOCArNjk3OCw4IEBACiAKIAkvKiBVbm11dGUgaW5wdXQgYW1wcyAoQ0QsIExpbmUgSW4sIE1pYyAxICYgTWljIDIpIG9mIHRoZSBhbmFsb2ctbG9vcGJhY2sKIAkgKiBtaXhlciB3aWRnZXQKLQkgKiBOb3RlOiBQQVNEIG1vdGhlcmJvYXJkcyB1c2VzIHRoZSBMaW5lIEluIDIgYXMgdGhlIGlucHV0IGZvciBmcm9udCBwYW5lbAotCSAqIG1pYyAobWljIDIpCisJICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IKKwkgKiBmcm9udCBwYW5lbCBtaWMgKG1pYyAyKQogCSAqLwogCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KIAl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCkBAIC02NjQ3LDEzICs3MTYxLDE3IEBACiAJaW50IGVycjsKIAlzdGF0aWMgaGRhX25pZF90IGFsYzI2Ml9pZ25vcmVbXSA9IHsgMHgxZCwgMCB9OwogCi0JaWYgKChlcnIgPSBzbmRfaGRhX3BhcnNlX3Bpbl9kZWZfY29uZmlnKGNvZGVjLCAmc3BlYy0+YXV0b2NmZywKLQkJCQkJCWFsYzI2Ml9pZ25vcmUpKSA8IDApCisJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsCisJCQkJCSAgIGFsYzI2Ml9pZ25vcmUpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCWlmICghIHNwZWMtPmF1dG9jZmcubGluZV9vdXRzKQorCWlmICghc3BlYy0+YXV0b2NmZy5saW5lX291dHMpCiAJCXJldHVybiAwOyAvKiBjYW4ndCBmaW5kIHZhbGlkIEJJT1MgcGluIGNvbmZpZyAqLwotCWlmICgoZXJyID0gYWxjMjYyX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKSkgPCAwIHx8Ci0JICAgIChlcnIgPSBhbGMyNjJfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpKSA8IDApCisJZXJyID0gYWxjMjYyX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBhbGMyNjJfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgKiAyOwpAQCAtNjc3Nyw3ICs3Mjk1LDcgQEAKIAkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCiAJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjMjYyX0hQX2NhcHR1cmVfc291cmNlLAotCX0sCQorCX0sCiAJW0FMQzI2Ml9IUF9CUENfRDcwMDBfV0ZdID0gewogCQkubWl4ZXJzID0geyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X2luaXRfdmVyYnMgfSwKQEAgLTY3ODcsNyArNzMwNSw3IEBACiAJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAogCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAogCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9IUF9jYXB0dXJlX3NvdXJjZSwKLQl9LAkKKwl9LAogCVtBTEMyNjJfSFBfQlBDX0Q3MDAwX1dMXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjMjYyX0hQX0JQQ19XaWxkV2VzdF9taXhlciwKIAkJCSAgICBhbGMyNjJfSFBfQlBDX1dpbGRXZXN0X29wdGlvbl9taXhlciB9LApAQCAtNjc5OCw3ICs3MzE2LDcgQEAKIAkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzI2Ml9tb2RlcyksCiAJCS5jaGFubmVsX21vZGUgPSBhbGMyNjJfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjMjYyX0hQX2NhcHR1cmVfc291cmNlLAotCX0sCQorCX0sCiAJW0FMQzI2Ml9CRU5RX0VEOF0gPSB7CiAJCS5taXhlcnMgPSB7IGFsYzI2Ml9iYXNlX21peGVyIH0sCiAJCS5pbml0X3ZlcmJzID0geyBhbGMyNjJfaW5pdF92ZXJicywgYWxjMjYyX0VBUERfdmVyYnMgfSwKQEAgLTY4MDgsNyArNzMyNiw3IEBACiAJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGMyNjJfbW9kZXMpLAogCQkuY2hhbm5lbF9tb2RlID0gYWxjMjYyX21vZGVzLAogCQkuaW5wdXRfbXV4ID0gJmFsYzI2Ml9jYXB0dXJlX3NvdXJjZSwKLQl9LAkJCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgcGF0Y2hfYWxjMjYyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNjgyMyw3ICs3MzQxLDkgQEAKIAogCWNvZGVjLT5zcGVjID0gc3BlYzsKICNpZiAwCi0JLyogcHNob3UgMDcvMTEvMDUgIHNldCBhIHplcm8gUENNIHNhbXBsZSB0byBEQUMgd2hlbiBGSUZPIGlzIHVuZGVyLXJ1biAqLworCS8qIHBzaG91IDA3LzExLzA1ICBzZXQgYSB6ZXJvIFBDTSBzYW1wbGUgdG8gREFDIHdoZW4gRklGTyBpcworCSAqIHVuZGVyLXJ1bgorCSAqLwogCXsKIAlpbnQgdG1wOwogCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MWEsIDAsIEFDX1ZFUkJfU0VUX0NPRUZfSU5ERVgsIDcpOwpAQCAtNjg0OSw3ICs3MzY5LDcgQEAKIAkJaWYgKGVyciA8IDApIHsKIAkJCWFsY19mcmVlKGNvZGVjKTsKIAkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSBpZiAoISBlcnIpIHsKKwkJfSBlbHNlIGlmICghZXJyKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKIAkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKQEAgLTY4NjgsMTUgKzczODgsMTcgQEAKIAlzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjayA9ICZhbGMyNjJfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CiAJc3BlYy0+c3RyZWFtX2RpZ2l0YWxfY2FwdHVyZSA9ICZhbGMyNjJfcGNtX2RpZ2l0YWxfY2FwdHVyZTsKIAotCWlmICghIHNwZWMtPmFkY19uaWRzICYmIHNwZWMtPmlucHV0X211eCkgeworCWlmICghc3BlYy0+YWRjX25pZHMgJiYgc3BlYy0+aW5wdXRfbXV4KSB7CiAJCS8qIGNoZWNrIHdoZXRoZXIgTklEIDB4MDcgaXMgdmFsaWQgKi8KIAkJdW5zaWduZWQgaW50IHdjYXAgPSBnZXRfd2NhcHMoY29kZWMsIDB4MDcpOwogCi0JCXdjYXAgPSAod2NhcCAmIEFDX1dDQVBfVFlQRSkgPj4gQUNfV0NBUF9UWVBFX1NISUZUOyAvKiBnZXQgdHlwZSAqLworCQkvKiBnZXQgdHlwZSAqLworCQl3Y2FwID0gKHdjYXAgJiBBQ19XQ0FQX1RZUEUpID4+IEFDX1dDQVBfVFlQRV9TSElGVDsKIAkJaWYgKHdjYXAgIT0gQUNfV0lEX0FVRF9JTikgewogCQkJc3BlYy0+YWRjX25pZHMgPSBhbGMyNjJfYWRjX25pZHNfYWx0OwogCQkJc3BlYy0+bnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGMyNjJfYWRjX25pZHNfYWx0KTsKLQkJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IGFsYzI2Ml9jYXB0dXJlX2FsdF9taXhlcjsKKwkJCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9CisJCQkJYWxjMjYyX2NhcHR1cmVfYWx0X21peGVyOwogCQkJc3BlYy0+bnVtX21peGVycysrOwogCQl9IGVsc2UgewogCQkJc3BlYy0+YWRjX25pZHMgPSBhbGMyNjJfYWRjX25pZHM7CkBAIC02OTA0LDcgKzc0MjYsOSBAQAogc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfdGhyZWVzdGFja19jaDJfaW5pdFtdID0gewogCS8qIHNldCBwaW4gd2lkZ2V0IDFBaCAobGluZSBpbikgZm9yIGlucHV0ICovCiAJeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiBzZXQgcGluIHdpZGdldCAxOGggKG1pYzEvMikgZm9yIGlucHV0LCBmb3IgbWljIGFsc28gZW5hYmxlIHRoZSB2cmVmICovCisJLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxLzIpIGZvciBpbnB1dCwgZm9yIG1pYyBhbHNvIGVuYWJsZQorCSAqIHRoZSB2cmVmCisJICovCiAJeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKIAogCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjIH0sCkBAIC02OTYxLDcgKzc0ODUsOSBAQAogc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4NjFfYXN1c19jaDJfaW5pdFtdID0gewogCS8qIHNldCBwaW4gd2lkZ2V0IDFBaCAobGluZSBpbikgZm9yIGlucHV0ICovCiAJeyAweDBjLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjAgfSwKLQkvKiBzZXQgcGluIHdpZGdldCAxOGggKG1pYzEvMikgZm9yIGlucHV0LCBmb3IgbWljIGFsc28gZW5hYmxlIHRoZSB2cmVmICovCisJLyogc2V0IHBpbiB3aWRnZXQgMThoIChtaWMxLzIpIGZvciBpbnB1dCwgZm9yIG1pYyBhbHNvIGVuYWJsZQorCSAqIHRoZSB2cmVmCisJICovCiAJeyAweDBkLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKIAogCXsgMHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjIH0sCkBAIC03MDE2LDcgKzc1NDIsNyBAQAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MDEsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwMywgSERBX0lOUFVUKSwKLSAKKwogICAgICAgICAvKiBDYXB0dXJlIG1peGVyIGNvbnRyb2wgKi8KIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCkBAIC03MDUwLDcgKzc1NzYsNyBAQAogCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTAsIDB4MDEsIEhEQV9PVVRQVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwMywgSERBX0lOUFVUKSwKLSAKKwogCS8qIENhcHR1cmUgbWl4ZXIgY29udHJvbCAqLwogCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAogCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKQEAgLTcwOTIsNyArNzYxOCw3IEBACiAJfSwKIAogCXsgfSAvKiBlbmQgKi8KLX07CQorfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzg2MV91bml3aWxsX20zMV9taXhlcltdID0gewogICAgICAgICAvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwpAQCAtNzExMyw3ICs3NjM5LDcgQEAKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAxLCBIREFfT1VUUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWEsIDB4MDMsIEhEQV9JTlBVVCksCi0gCisKIAkvKiBDYXB0dXJlIG1peGVyIGNvbnRyb2wgKi8KIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCkBAIC03MTM0LDcgKzc2NjAsNyBAQAogICAgICAgICAgICAgICAgIC5wcml2YXRlX3ZhbHVlID0gQVJSQVlfU0laRShhbGM4NjFfdW5pd2lsbF9tMzFfbW9kZXMpLAogCX0sCiAJeyB9IC8qIGVuZCAqLwotfTsJCQkKK307CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM4NjFfYXN1c19taXhlcltdID0gewogICAgICAgICAvKiBvdXRwdXQgbWl4ZXIgY29udHJvbCAqLwpAQCAtNzE1NCw4ICs3NjgwLDggQEAKIAlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxNSwgMHgwMSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTUsIDB4MDEsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDEwLCAweDAxLCBIREFfT1VUUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWEsIDB4MDMsIEhEQV9PVVRQVVQpLCAvKiB3YXMgSERBX0lOUFVUICh3aHk/KSAqLwotIAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYSwgMHgwMywgSERBX09VVFBVVCksCisKIAkvKiBDYXB0dXJlIG1peGVyIGNvbnRyb2wgKi8KIAlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDgsIDB4MCwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCkBAIC03MjM5LDcgKzc3NjUsNyBAQAogCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCiAJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGMgICAgICAgICAgfSwgLy9PdXRwdXQgMH4xMiBzdGVwCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwY30sIC8qIE91dHB1dCAwfjEyIHN0ZXAgKi8KIAogCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCkBAIC03MjQ5LDcgKzc3NzUsOCBAQAogCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKIAl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwgLy8gaHAgdXNlZCBEQUMgMyAoRnJvbnQpCisJLyogaHAgdXNlZCBEQUMgMyAoRnJvbnQpICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAogICAgICAgICB7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCiAKIAl7IH0KQEAgLTczMDAsNyArNzgyNyw3IEBACiAJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKIAl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwYyAgICAgICAgICB9LCAvL091dHB1dCAwfjEyIHN0ZXAKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgMHhiMDBjfSwgLyogT3V0cHV0IDB+MTIgc3RlcCAqLwogCiAJezB4MTYsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKQEAgLTczMTAsNyArNzgzNyw4IEBACiAJezB4MTgsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAogCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LCAvLyBocCB1c2VkIERBQyAzIChGcm9udCkKKwkvKiBocCB1c2VkIERBQyAzIChGcm9udCkgKi8KKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCiAgICAgICAgIHsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKIAl7IH0KIH07CkBAIC03MzI5LDcgKzc4NTcsOCBAQAogCXsgMHgwYiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDQwIH0sCiAJeyAweDBiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAogCS8qIHBvcnQtRSBmb3IgSFAgb3V0IChmcm9udCBwYW5lbCkgKi8KLQl7IDB4MGYsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgyNCB9LCAvLyB0aGlzIGhhcyB0byBiZSBzZXQgdG8gVlJFRjgwCisJLyogdGhpcyBoYXMgdG8gYmUgc2V0IHRvIFZSRUY4MCAqLworCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sCiAJLyogcm91dGUgZnJvbnQgUENNIHRvIEhQICovCiAJeyAweDBmLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMCB9LAogCS8qIHBvcnQtRiBmb3IgbWljLWluIChmcm9udCBwYW5lbCkgd2l0aCB2cmVmICovCkBAIC03MzYwLDcgKzc4ODksNyBAQAogCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCiAJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAotCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCAweGIwMGMgICAgICAgICAgfSwgLy9PdXRwdXQgMH4xMiBzdGVwCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwY30sIC8qIE91dHB1dCAwfjEyIHN0ZXAgKi8KIAogCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCkBAIC03MzcwLDcgKzc4OTksOCBAQAogCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKIAl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwgLy8gaHAgdXNlZCBEQUMgMyAoRnJvbnQpCisJLyogaHAgdXNlZCBEQUMgMyAoRnJvbnQpICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAogICAgICAgICB7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCiAJeyB9CiB9OwpAQCAtNzM3OSw3ICs3OTA5LDkgQEAKIAkvKgogCSAqIFVubXV0ZSBBREMwIGFuZCBzZXQgdGhlIGRlZmF1bHQgaW5wdXQgdG8gbWljLWluCiAJICovCi0JLyogcG9ydC1BIGZvciBzdXJyb3VuZCAocmVhciBwYW5lbCkgfCBhY2NvcmRpbmcgdG8gY29kZWMjMCB0aGlzIGlzIHRoZSBIUCBqYWNrKi8KKwkvKiBwb3J0LUEgZm9yIHN1cnJvdW5kIChyZWFyIHBhbmVsKQorCSAqIGFjY29yZGluZyB0byBjb2RlYyMwIHRoaXMgaXMgdGhlIEhQIGphY2sKKwkgKi8KIAl7IDB4MGUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHhjMCB9LCAvKiB3YXMgMHgwMCAqLwogCS8qIHJvdXRlIGZyb250IFBDTSB0byBIUCAqLwogCXsgMHgwZSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDEgfSwKQEAgLTczOTEsNyArNzkyMyw4IEBACiAJeyAweDBiLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4NDAgfSwKIAl7IDB4MGIsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCiAJLyogcG9ydC1FIGZvciBIUCBvdXQgKGZyb250IHBhbmVsKSAqLwotCXsgMHgwZiwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweDI0IH0sIC8qIHRoaXMgaGFzIHRvIGJlIHNldCB0byBWUkVGODAgKi8KKwkvKiB0aGlzIGhhcyB0byBiZSBzZXQgdG8gVlJFRjgwICovCisJeyAweDBmLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MjQgfSwKIAkvKiByb3V0ZSBmcm9udCBQQ00gdG8gSFAgKi8KIAl7IDB4MGYsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwIH0sCiAJLyogcG9ydC1GIGZvciBtaWMtaW4gKGZyb250IHBhbmVsKSB3aXRoIHZyZWYgKi8KQEAgLTc0MjEsNyArNzk1NCw3IEBACiAJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAogCXsweDE1LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKIAl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCi0JezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwYyAgICAgICAgICB9LCAvKiBPdXRwdXQgMH4xMiBzdGVwICovCisJezB4MTUsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIDB4YjAwY30sIC8qIE91dHB1dCAwfjEyIHN0ZXAgKi8KIAogCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKIAl7MHgxNiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCkBAIC03NDMxLDcgKzc5NjQsOCBAQAogCXsweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKIAl7MHgxOSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAJezB4MTksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAotCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwgLyogaHAgdXNlZCBEQUMgMyAoRnJvbnQpICovCisJLyogaHAgdXNlZCBEQUMgMyAoRnJvbnQpICovCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAogCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKIAl7IH0KIH07CkBAIC03NDUwLDcgKzc5ODQsNyBAQAogCS8qCiAJICogVW5tdXRlIEFEQzAgYW5kIHNldCB0aGUgZGVmYXVsdCBpbnB1dCB0byBtaWMtaW4KIAkgKi8KLS8vCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogezB4MDgsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAwfSwgKi8KIAl7MHgwOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCiAJCiAJLyogVW5tdXRlIERBQzB+MyAmIHNwZGlmIG91dCovCkBAIC03NDgzLDIxICs4MDE3LDIxIEBACiAKIAl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX01VVEUoMCl9LAogCXsweDFhLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgxKX0sCi0JezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAkKLQl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCQkKKwl7MHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMyl9LAogCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSgwKX0sCiAJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDEpfSwKLQl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCQotCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwJCisJezB4MWIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKIAotCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCS8vIHNldCBNaWMgMQorCXsweDA4LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCS8qIHNldCBNaWMgMSAqLwogCiAJeyB9CiB9OwogCiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MV90b3NoaWJhX2luaXRfdmVyYnNbXSA9IHsKIAl7MHgwZiwgQUNfVkVSQl9TRVRfVU5TT0xJQ0lURURfRU5BQkxFLCBBQ19VU1JTUF9FTiB8IEFMQzg4MF9IUF9FVkVOVH0sCi0gICAgICAgIAorCiAJeyB9CiB9OwogCkBAIC03NTIxLDkgKzgwNTUsNiBAQAogc3RhdGljIHZvaWQgYWxjODYxX3Rvc2hpYmFfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCByZXMpCiB7Ci0JLyogTG9va3MgbGlrZSB0aGUgdW5zb2wgZXZlbnQgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHN0YW5kYXJkCi0JICogZGVmaW5pdGlvbi4gIDZiaXQgdGFnIGlzIHBsYWNlZCBhdCAyNiBiaXQhCi0JICovCiAJaWYgKChyZXMgPj4gMjYpID09IEFMQzg4MF9IUF9FVkVOVCkKIAkJYWxjODYxX3Rvc2hpYmFfYXV0b211dGUoY29kZWMpOwogfQpAQCAtNzU2OCw3ICs4MDk5LDggQEAKIH07CiAKIC8qIGZpbGwgaW4gdGhlIGRhY19uaWRzIHRhYmxlIGZyb20gdGhlIHBhcnNlZCBwaW4gY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGludCBhbGM4NjFfYXV0b19maWxsX2RhY19uaWRzKHN0cnVjdCBhbGNfc3BlYyAqc3BlYywgY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQorc3RhdGljIGludCBhbGM4NjFfYXV0b19maWxsX2RhY19uaWRzKHN0cnVjdCBhbGNfc3BlYyAqc3BlYywKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKIHsKIAlpbnQgaTsKIAloZGFfbmlkX3QgbmlkOwpAQCAtNzU5MSwyOSArODEyMyw0MCBAQAogCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKIHsKIAljaGFyIG5hbWVbMzJdOwotCXN0YXRpYyBjb25zdCBjaGFyICpjaG5hbWVbNF0gPSB7ICJGcm9udCIsICJTdXJyb3VuZCIsIE5VTEwgLypDTEZFKi8sICJTaWRlIiB9OworCXN0YXRpYyBjb25zdCBjaGFyICpjaG5hbWVbNF0gPSB7CisJCSJGcm9udCIsICJTdXJyb3VuZCIsIE5VTEwgLypDTEZFKi8sICJTaWRlIgorCX07CiAJaGRhX25pZF90IG5pZDsKIAlpbnQgaSwgaWR4LCBlcnI7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5saW5lX291dHM7IGkrKykgewogCQluaWQgPSBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXTsKLQkJaWYgKCEgbmlkKQorCQlpZiAoIW5pZCkKIAkJCWNvbnRpbnVlOwogCQlpZiAobmlkID09IDB4MDUpIHsKIAkJCS8qIENlbnRlci9MRkUgKi8KLQkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsICJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQkJICAgICAgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAxLCAwLCBIREFfT1VUUFVUKSkpIDwgMCkKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAorCQkJCQkgICJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMSwgMCwKKwkJCQkJCQkgICAgICBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwotCQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwgIkxGRSBQbGF5YmFjayBTd2l0Y2giLAotCQkJCQkgICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDIsIDAsIEhEQV9PVVRQVVQpKSkgPCAwKQorCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsCisJCQkJCSAgIkxGRSBQbGF5YmFjayBTd2l0Y2giLAorCQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAyLCAwLAorCQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSB7Ci0JCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoYWxjODYxX2RhY19uaWRzKSAtIDE7IGlkeCsrKQorCQkJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcykgLSAxOworCQkJICAgICBpZHgrKykKIAkJCQlpZiAobmlkID09IGFsYzg2MV9kYWNfbmlkc1tpZHhdKQogCQkJCQlicmVhazsKIAkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIGNobmFtZVtpZHhdKTsKLQkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsIG5hbWUsCi0JCQkJCSAgICAgICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCkpKSA8IDApCisJCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwgbmFtZSwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwKKwkJCQkJCQkgICAgICBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQpAQCAtNzYyNSwxMyArODE2OCwxNSBAQAogCWludCBlcnI7CiAJaGRhX25pZF90IG5pZDsKIAotCWlmICghIHBpbikKKwlpZiAoIXBpbikKIAkJcmV0dXJuIDA7CiAKIAlpZiAoKHBpbiA+PSAweDBiICYmIHBpbiA8PSAweDEwKSB8fCBwaW4gPT0gMHgxZiB8fCBwaW4gPT0gMHgyMCkgewogCQluaWQgPSAweDAzOwotCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsICJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKLQkJCQkgICAgICAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9PVVRQVVQpKSkgPCAwKQorCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLAorCQkJCSAgIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLAorCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCQlzcGVjLT5tdWx0aW91dC5ocF9uaWQgPSBuaWQ7CiAJfQpAQCAtNzYzOSwzMiArODE4NCwzMyBAQAogfQogCiAvKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLwotc3RhdGljIGludCBhbGM4NjFfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3RydWN0IGFsY19zcGVjICpzcGVjLCBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCitzdGF0aWMgaW50IGFsYzg2MV9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMsCisJCQkJCQljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCiB7CiAJc3RydWN0IGhkYV9pbnB1dF9tdXggKmltdXggPSAmc3BlYy0+cHJpdmF0ZV9pbXV4OwogCWludCBpLCBlcnIsIGlkeCwgaWR4MTsKIAogCWZvciAoaSA9IDA7IGkgPCBBVVRPX1BJTl9MQVNUOyBpKyspIHsKLQkJc3dpdGNoKGNmZy0+aW5wdXRfcGluc1tpXSkgeworCQlzd2l0Y2ggKGNmZy0+aW5wdXRfcGluc1tpXSkgewogCQljYXNlIDB4MGM6CiAJCQlpZHgxID0gMTsKLQkJCWlkeCA9IDI7CS8vIExpbmUgSW4KKwkJCWlkeCA9IDI7CS8qIExpbmUgSW4gKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MGY6CiAJCQlpZHgxID0gMjsKLQkJCWlkeCA9IDI7CS8vIExpbmUgSW4KKwkJCWlkeCA9IDI7CS8qIExpbmUgSW4gKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MGQ6CiAJCQlpZHgxID0gMDsKLQkJCWlkeCA9IDE7CS8vIE1pYyBJbiAKKwkJCWlkeCA9IDE7CS8qIE1pYyBJbiAqLwogCQkJYnJlYWs7Ci0JCWNhc2UgMHgxMDoJCisJCWNhc2UgMHgxMDoKIAkJCWlkeDEgPSAzOwotCQkJaWR4ID0gMTsJLy8gTWljIEluIAorCQkJaWR4ID0gMTsJLyogTWljIEluICovCiAJCQlicmVhazsKIAkJY2FzZSAweDExOgogCQkJaWR4MSA9IDQ7Ci0JCQlpZHggPSAwOwkvLyBDRAorCQkJaWR4ID0gMDsJLyogQ0QgKi8KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJY29udGludWU7CkBAIC03Njc3LDcgKzgyMjMsNyBAQAogCiAJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10ubGFiZWwgPSBhdXRvX3Bpbl9jZmdfbGFiZWxzW2ldOwogCQlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmluZGV4ID0gaWR4MTsKLQkJaW11eC0+bnVtX2l0ZW1zKys7CQorCQlpbXV4LT5udW1faXRlbXMrKzsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC03NzAyLDEzICs4MjQ4LDE2IEBACiAJeyB9IC8qIGVuZCAqLwogfTsKIAotc3RhdGljIHZvaWQgYWxjODYxX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorc3RhdGljIHZvaWQgYWxjODYxX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgICAgICBoZGFfbmlkX3QgbmlkLAogCQkJCQkgICAgICBpbnQgcGluX3R5cGUsIGludCBkYWNfaWR4KQogewogCS8qIHNldCBhcyBvdXRwdXQgKi8KIAotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBwaW5fdHlwZSk7Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgZGFjX2lkeCwgMCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUpOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJICAgIHBpbl90eXBlKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBkYWNfaWR4LCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJICAgIEFNUF9PVVRfVU5NVVRFKTsKIAogfQogCkBAIC03NzE3LDEwICs4MjY2LDEzIEBACiAJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAJaW50IGk7CiAKKwlhbGNfc3Vic3lzdGVtX2lkKGNvZGVjLCAweDBlLCAweDBmLCAweDBiKTsKIAlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+YXV0b2NmZy5saW5lX291dHM7IGkrKykgewogCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zW2ldOworCQlpbnQgcGluX3R5cGUgPSBnZXRfcGluX3R5cGUoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlKTsKIAkJaWYgKG5pZCkKLQkJCWFsYzg2MV9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgbmlkLCBQSU5fT1VULCBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSk7CisJCQlhbGM4NjFfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIG5pZCwgcGluX3R5cGUsCisJCQkJCQkJICBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSk7CiAJfQogfQogCkBAIC03NzMxLDcgKzgyODMsOCBAQAogCiAJcGluID0gc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdOwogCWlmIChwaW4pIC8qIGNvbm5lY3QgdG8gZnJvbnQgKi8KLQkJYWxjODYxX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBwaW4sIFBJTl9IUCwgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF0pOworCQlhbGM4NjFfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX0hQLAorCQkJCQkJICBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFsYzg2MV9hdXRvX2luaXRfYW5hbG9nX2lucHV0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtNzc0MSwzMSArODI5NCw0MyBAQAogCiAJZm9yIChpID0gMDsgaSA8IEFVVE9fUElOX0xBU1Q7IGkrKykgewogCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5pbnB1dF9waW5zW2ldOwotCQlpZiAoKG5pZD49MHgwYykgJiYgKG5pZCA8PTB4MTEpKSB7Ci0JCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwKLQkJCQkJICAgIGkgPD0gQVVUT19QSU5fRlJPTlRfTUlDID8gUElOX1ZSRUY4MCA6IFBJTl9JTik7CisJCWlmIChuaWQgPj0gMHgwYyAmJiBuaWQgPD0gMHgxMSkgeworCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCQkgICAgaSA8PSBBVVRPX1BJTl9GUk9OVF9NSUMgPworCQkJCQkgICAgUElOX1ZSRUY4MCA6IFBJTl9JTik7CiAJCX0KIAl9CiB9CiAKIC8qIHBhcnNlIHRoZSBCSU9TIGNvbmZpZ3VyYXRpb24gYW5kIHNldCB1cCB0aGUgYWxjX3NwZWMgKi8KLS8qIHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgdGhlIHByb3BlciBjb25maWcgaXMgbm90IGZvdW5kLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgKi8KKy8qIHJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgdGhlIHByb3BlciBjb25maWcgaXMgbm90IGZvdW5kLAorICogb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKi8KIHN0YXRpYyBpbnQgYWxjODYxX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWludCBlcnI7CiAJc3RhdGljIGhkYV9uaWRfdCBhbGM4NjFfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKIAotCWlmICgoZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsCi0JCQkJCQlhbGM4NjFfaWdub3JlKSkgPCAwKQorCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAorCQkJCQkgICBhbGM4NjFfaWdub3JlKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlpZiAoISBzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cykKKwlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzKQogCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KIAotCWlmICgoZXJyID0gYWxjODYxX2F1dG9fZmlsbF9kYWNfbmlkcyhzcGVjLCAmc3BlYy0+YXV0b2NmZykpIDwgMCB8fAotCSAgICAoZXJyID0gYWxjODYxX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKSkgPCAwIHx8Ci0JICAgIChlcnIgPSBhbGM4NjFfYXV0b19jcmVhdGVfaHBfY3RscyhzcGVjLCBzcGVjLT5hdXRvY2ZnLmhwX3BpbnNbMF0pKSA8IDAgfHwKLQkgICAgKGVyciA9IGFsYzg2MV9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZykpIDwgMCkKKwllcnIgPSBhbGM4NjFfYXV0b19maWxsX2RhY19uaWRzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBhbGM4NjFfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGFsYzg2MV9hdXRvX2NyZWF0ZV9ocF9jdGxzKHNwZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gYWxjODYxX2F1dG9fY3JlYXRlX2FuYWxvZ19pbnB1dF9jdGxzKHNwZWMsICZzcGVjLT5hdXRvY2ZnKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAogCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzICogMjsKQEAgLTc4MTcsMTIgKzgzODIsMTQgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMjA1LCAiQVNVUyBXN0oiLCBBTEM4NjFfM1NUKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM1LCAiQVNVUyBGMi8zIiwgQUxDODYxX0FTVVNfTEFQVE9QKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzM4LCAiQVNVUyBGMi8zIiwgQUxDODYxX0FTVVNfTEFQVE9QKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxM2Q3LCAiQVNVUyBBOXJwIiwgQUxDODYxX0FTVVNfTEFQVE9QKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHgxMzkzLCAiQVNVUyIsIEFMQzg2MV9BU1VTKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MWU3LCAiQVNVUyIsIEFMQzY2MF8zU1QpLAogCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMDAsICJUb3NoaWJhIiwgQUxDODYxX1RPU0hJQkEpLAogCVNORF9QQ0lfUVVJUksoMHgxMTc5LCAweGZmMTAsICJUb3NoaWJhIiwgQUxDODYxX1RPU0hJQkEpLAogCVNORF9QQ0lfUVVJUksoMHgxNTg0LCAweDkwNzIsICJVbml3aWxsIG0zMSIsIEFMQzg2MV9VTklXSUxMX00zMSksCiAJU05EX1BDSV9RVUlSSygweDE1ODQsIDB4MmIwMSwgIlVuaXdpbGwgWDQwQUl4IiwgQUxDODYxX1VOSVdJTExfTTMxKSwKKwlTTkRfUENJX1FVSVJLKDB4MTg0OSwgMHgwNjYwLCAiQXNyb2NrIDkzOVNMSTMyIiwgQUxDNjYwXzNTVCksCiAJU05EX1BDSV9RVUlSSygweDgwODYsIDB4ZDYwMCwgIkludGVsIiwgQUxDODYxXzNTVCksCiAJe30KIH07CkBAIC03ODkyLDcgKzg0NTksOCBAQAogCX0sCiAJW0FMQzg2MV9UT1NISUJBXSA9IHsKIAkJLm1peGVycyA9IHsgYWxjODYxX3Rvc2hpYmFfbWl4ZXIgfSwKLQkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV9iYXNlX2luaXRfdmVyYnMsIGFsYzg2MV90b3NoaWJhX2luaXRfdmVyYnMgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzg2MV9iYXNlX2luaXRfdmVyYnMsCisJCQkJYWxjODYxX3Rvc2hpYmFfaW5pdF92ZXJicyB9LAogCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg2MV9kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg2MV9kYWNfbmlkcywKIAkJLm51bV9jaGFubmVsX21vZGUgPSBBUlJBWV9TSVpFKGFsYzg4M18zU1RfMmNoX21vZGVzKSwKQEAgLTc5NDQsNyArODUxMiw3IEBACiAJaWYgKHNwZWMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQljb2RlYy0+c3BlYyA9IHNwZWM7CQorCWNvZGVjLT5zcGVjID0gc3BlYzsKIAogICAgICAgICBib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgQUxDODYxX01PREVMX0xBU1QsCiAJCQkJCQkgIGFsYzg2MV9tb2RlbHMsCkBAIC03OTYyLDcgKzg1MzAsNyBAQAogCQlpZiAoZXJyIDwgMCkgewogCQkJYWxjX2ZyZWUoY29kZWMpOwogCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIGlmICghIGVycikgeworCQl9IGVsc2UgaWYgKCFlcnIpIHsKIAkJCXByaW50ayhLRVJOX0lORk8KIAkJCSAgICAgICAiaGRhX2NvZGVjOiBDYW5ub3Qgc2V0IHVwIGNvbmZpZ3VyYXRpb24gIgogCQkJICAgICAgICJmcm9tIEJJT1MuICBVc2luZyBiYXNlIG1vZGUuLi5cbiIpOwpAQCAtODA0OSw3ICs4NjE3LDcgQEAKIAlpZHggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwogCWlmIChpZHggPj0gaW11eC0+bnVtX2l0ZW1zKQogCQlpZHggPSBpbXV4LT5udW1faXRlbXMgLSAxOwotCWlmICgqY3VyX3ZhbCA9PSBpZHggJiYgISBjb2RlYy0+aW5fcmVzdW1lKQorCWlmICgqY3VyX3ZhbCA9PSBpZHggJiYgIWNvZGVjLT5pbl9yZXN1bWUpCiAJCXJldHVybiAwOwogCWZvciAoaSA9IDA7IGkgPCBpbXV4LT5udW1faXRlbXM7IGkrKykgewogCQl1bnNpZ25lZCBpbnQgdiA9IChpID09IGlkeCkgPyAweDcwMDAgOiAweDcwODA7CkBAIC04MTkzLDYgKzg3NjEsMjcgQEAKIAl7IH0gLyogZW5kICovCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjODYxdmRfbGVub3ZvX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKKwkvKkhEQV9CSU5EX01VVEUoIkZyb250IFBsYXliYWNrIFN3aXRjaCIsIDB4MGMsIDIsIEhEQV9JTlBVVCksKi8KKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgxNCwgMHgwLCBIREFfT1VUUFVUKSwKKworCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBCb29zdCIsIDB4MTgsIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MCwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBCb29zdCIsIDB4MTksIDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKworCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNEIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDQsIEhEQV9JTlBVVCksCisKKwl7IH0gLyogZW5kICovCit9OworCiAvKgogICogZ2VuZXJpYyBpbml0aWFsaXphdGlvbiBvZiBBREMsIGlucHV0IG1peGVycyBhbmQgb3V0cHV0IG1peGVycwogICovCkBAIC04MjE0LDEwICs4ODAzLDEwIEBACiAJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNCl9LAogCiAJLyogQ2FwdHVyZSBtaXhlcjogdW5tdXRlIE1pYywgRi1NaWMsIExpbmUsIENEIGlucHV0cyAqLworCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAogCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDQpfSwKLQl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg1KX0sCi0JezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNil9LAotCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDgpfSwKIAogCS8qCiAJICogU2V0IHVwIG91dHB1dCBtaXhlcnMgKDB4MDIgLSAweDA1KQpAQCAtODMxOCw2ICs4OTA3LDY4IEBACiAJeyB9CiB9OwogCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzg2MXZkX2VhcGRfdmVyYnNbXSA9IHsKKwl7MHgxNCwgQUNfVkVSQl9TRVRfRUFQRF9CVExFTkFCTEUsIDJ9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVyYiBhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfdmVyYnNbXSA9IHsKKwl7MHgwYywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fTVVURSg1KX0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU4gfCBBTEM4ODBfSFBfRVZFTlR9LAorCXsweDE4LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOIHwgQUxDODgwX01JQ19FVkVOVH0sCQorCXt9Cit9OworCisvKiB0b2dnbGUgc3BlYWtlci1vdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSBocC1qYWNrIHN0YXRlICovCitzdGF0aWMgdm9pZCBhbGM4NjF2ZF9sZW5vdm9faHBfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgY2hhciBiaXRzOworCisJcHJlc2VudCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxYiwgMCwKKwkJCQkgICAgIEFDX1ZFUkJfR0VUX1BJTl9TRU5TRSwgMCkgJiAweDgwMDAwMDAwOworCWJpdHMgPSBwcmVzZW50ID8gMHg4MCA6IDA7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE0LCAwLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTQsIDEsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBhbGM4NjF2ZF9sZW5vdm9fbWljX2F1dG9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIGludCBwcmVzZW50OworCXVuc2lnbmVkIGNoYXIgYml0czsKKworCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MTgsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwliaXRzID0gcHJlc2VudCA/IDB4ODAgOiAwOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgwYiwgMCwgSERBX0lOUFVULCAxLAorCQkJCSAweDgwLCBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MGIsIDEsIEhEQV9JTlBVVCwgMSwKKwkJCQkgMHg4MCwgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzg2MXZkX2xlbm92b19hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlhbGM4NjF2ZF9sZW5vdm9faHBfYXV0b211dGUoY29kZWMpOworCWFsYzg2MXZkX2xlbm92b19taWNfYXV0b211dGUoY29kZWMpOworfQorCitzdGF0aWMgdm9pZCBhbGM4NjF2ZF9sZW5vdm9fdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCXVuc2lnbmVkIGludCByZXMpCit7CisJc3dpdGNoIChyZXMgPj4gMjYpIHsKKwljYXNlIEFMQzg4MF9IUF9FVkVOVDoKKwkJYWxjODYxdmRfbGVub3ZvX2hwX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJY2FzZSBBTEM4ODBfTUlDX0VWRU5UOgorCQlhbGM4NjF2ZF9sZW5vdm9fbWljX2F1dG9tdXRlKGNvZGVjKTsKKwkJYnJlYWs7CisJfQorfQorCiAvKiBwY20gY29uZmlndXJhdGlvbjogaWRlbnRpYWNhbCB3aXRoIEFMQzg4MCAqLwogI2RlZmluZSBhbGM4NjF2ZF9wY21fYW5hbG9nX3BsYXliYWNrCWFsYzg4MF9wY21fYW5hbG9nX3BsYXliYWNrCiAjZGVmaW5lIGFsYzg2MXZkX3BjbV9hbmFsb2dfY2FwdHVyZQlhbGM4ODBfcGNtX2FuYWxvZ19jYXB0dXJlCkBAIC04MzMyLDE1ICs4OTgzLDE4IEBACiAJW0FMQzg2MVZEXzNTVF0JCT0gIjNzdGFjayIsCiAJW0FMQzg2MVZEXzNTVF9ESUddCT0gIjNzdGFjay1kaWdvdXQiLAogCVtBTEM4NjFWRF82U1RfRElHXQk9ICI2c3RhY2stZGlnb3V0IiwKKwlbQUxDODYxVkRfTEVOT1ZPXQk9ICJsZW5vdm8iLAogCVtBTEM4NjFWRF9BVVRPXQkJPSAiYXV0byIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjODYxdmRfY2ZnX3RibFtdID0geworCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEyZTIsICJBc3VzIHozNW0iLCBBTEM2NjBWRF8zU1QpLAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDEzMzksICJBc3VzIEcxIiwgQUxDNjYwVkRfM1NUKSwKIAlTTkRfUENJX1FVSVJLKDB4MTBkZSwgMHgwM2YwLCAiUmVhbHRlayBBTEM2NjAgZGVtbyIsIEFMQzY2MFZEXzNTVCksCiAJU05EX1BDSV9RVUlSSygweDEwMTksIDB4YTg4ZCwgIlJlYWx0ZWsgQUxDNjYwIGRlbW8iLCBBTEM2NjBWRF8zU1QpLAogCi0JU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MzgwMiwgIkxlbm92byAzMDAwIEMyMDAiLCBBTEM4NjFWRF8zU1QpLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDM4MDIsICJMZW5vdm8gMzAwMCBDMjAwIiwgQUxDODYxVkRfTEVOT1ZPKSwKKwlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMDY2LCAiTGVub3ZvIiwgQUxDODYxVkRfTEVOT1ZPKSwKIAl7fQogfTsKIApAQCAtODM4OSw2ICs5MDQzLDIyIEBACiAJCS5jaGFubmVsX21vZGUgPSBhbGM4NjF2ZF82c3RhY2tfbW9kZXMsCiAJCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCiAJfSwKKwlbQUxDODYxVkRfTEVOT1ZPXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjODYxdmRfbGVub3ZvX21peGVyIH0sCisJCS5pbml0X3ZlcmJzID0geyBhbGM4NjF2ZF92b2x1bWVfaW5pdF92ZXJicywKKwkJCQlhbGM4NjF2ZF8zc3RhY2tfaW5pdF92ZXJicywKKwkJCQlhbGM4NjF2ZF9lYXBkX3ZlcmJzLAorCQkJCWFsYzg2MXZkX2xlbm92b191bnNvbF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2MHZkX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYwdmRfZGFjX25pZHMsCisJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg2MXZkX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjODYxdmRfYWRjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4NjF2ZF8zc3RhY2tfMmNoX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzg2MXZkXzNzdGFja18yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjODYxdmRfY2FwdHVyZV9zb3VyY2UsCisJCS51bnNvbF9ldmVudCA9IGFsYzg2MXZkX2xlbm92b191bnNvbF9ldmVudCwKKwkJLmluaXRfaG9vayA9IGFsYzg2MXZkX2xlbm92b19hdXRvbXV0ZSwKKwl9LAogfTsKIAogLyoKQEAgLTg0MDksMTEgKzkwNzksMTMgQEAKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgaTsKIAorCWFsY19zdWJzeXN0ZW1faWQoY29kZWMsIDB4MTUsIDB4MWIsIDB4MTQpOwogCWZvciAoaSA9IDA7IGkgPD0gSERBX1NJREU7IGkrKykgewogCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zW2ldOworCQlpbnQgcGluX3R5cGUgPSBnZXRfcGluX3R5cGUoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlKTsKIAkJaWYgKG5pZCkKIAkJCWFsYzg2MXZkX2F1dG9fc2V0X291dHB1dF9hbmRfdW5tdXRlKGNvZGVjLCBuaWQsCi0JCQkJCQkJCVBJTl9PVVQsIGkpOworCQkJCQkJCSAgICBwaW5fdHlwZSwgaSk7CiAJfQogfQogCkBAIC04NDY2LDcgKzkxMzgsNyBAQAogCWludCBpLCBlcnI7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5saW5lX291dHM7IGkrKykgewotCQlpZiAoISBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSkKKwkJaWYgKCFzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSkKIAkJCWNvbnRpbnVlOwogCQluaWRfdiA9IGFsYzg2MXZkX2lkeF90b19taXhlcl92b2woCiAJCQkJYWxjODgwX2RhY190b19pZHgoCkBAIC04NDc3LDM2ICs5MTQ5LDQyIEBACiAKIAkJaWYgKGkgPT0gMikgewogCQkJLyogQ2VudGVyL0xGRSAqLwotCQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsCi0JCQkJCQkiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsCi0JCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAxLAotCQkJCQkJCTAsIEhEQV9PVVRQVVQpKSkgPCAwKQorCQkJZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9XSURHRVRfVk9MLAorCQkJCQkgICJDZW50ZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAxLCAwLAorCQkJCQkJCSAgICAgIEhEQV9PVVRQVVQpKTsKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7Ci0JCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwKLQkJCQkJCSJMRkUgUGxheWJhY2sgVm9sdW1lIiwKLQkJCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3YsIDIsCi0JCQkJCQkJMCwgSERBX09VVFBVVCkpKSA8IDApCisJCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsCisJCQkJCSAgIkxGRSBQbGF5YmFjayBWb2x1bWUiLAorCQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3YsIDIsIDAsCisJCQkJCQkJICAgICAgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKLQkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsCi0JCQkJCQkiQ2VudGVyIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAxLAotCQkJCQkJMiwgSERBX0lOUFVUKSkpIDwgMCkKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAorCQkJCQkgICJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAxLCAyLAorCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOworCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKLQkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsCi0JCQkJCQkiTEZFIFBsYXliYWNrIFN3aXRjaCIsCi0JCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAyLAotCQkJCQkJMiwgSERBX0lOUFVUKSkpIDwgMCkKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAorCQkJCQkgICJMRkUgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAyLCAyLAorCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOworCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJfSBlbHNlIHsKIAkJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFZvbHVtZSIsIGNobmFtZVtpXSk7Ci0JCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgbmFtZSwKLQkJCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwobmlkX3YsIDMsCi0JCQkJCQkJMCwgSERBX09VVFBVVCkpKSA8IDApCisJCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfdiwgMywgMCwKKwkJCQkJCQkgICAgICBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKIAkJCQlyZXR1cm4gZXJyOwogCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKLQkJCWlmICgoZXJyID0gYWRkX2NvbnRyb2woc3BlYywgQUxDX0NUTF9CSU5EX01VVEUsIG5hbWUsCi0JCQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAzLAotCQkJCQkJCTIsIEhEQV9JTlBVVCkpKSA8IDApCisJCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwgbmFtZSwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAzLCAyLAorCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOworCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTg1MjMsMTMgKzkyMDEsMTMgQEAKIAlpbnQgZXJyOwogCWNoYXIgbmFtZVszMl07CiAKLQlpZiAoISBwaW4pCisJaWYgKCFwaW4pCiAJCXJldHVybiAwOwogCiAJaWYgKGFsYzg4MF9pc19maXhlZF9waW4ocGluKSkgewogCQluaWRfdiA9IGFsYzg4MF9pZHhfdG9fZGFjKGFsYzg4MF9maXhlZF9waW5faWR4KHBpbikpOwogCQkvKiBzcGVjaWZ5IHRoZSBEQUMgYXMgdGhlIGV4dHJhIG91dHB1dCAqLwotCQlpZiAoISBzcGVjLT5tdWx0aW91dC5ocF9uaWQpCisJCWlmICghc3BlYy0+bXVsdGlvdXQuaHBfbmlkKQogCQkJc3BlYy0+bXVsdGlvdXQuaHBfbmlkID0gbmlkX3Y7CiAJCWVsc2UKIAkJCXNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0gPSBuaWRfdjsKQEAgLTg1NDAsMjIgKzkyMTgsMjIgQEAKIAkJCQlhbGM4ODBfZml4ZWRfcGluX2lkeChwaW4pKTsKIAogCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBwZngpOwotCQlpZiAoKGVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgbmFtZSwKLQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAzLCAwLAotCQkJCQkJCUhEQV9PVVRQVVQpKSkgPCAwKQorCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF92LCAzLCAwLCBIREFfT1VUUFVUKSk7CisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgcGZ4KTsKLQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwgbmFtZSwKLQkJCQlIREFfQ09NUE9TRV9BTVBfVkFMKG5pZF9zLCAzLCAyLAotCQkJCQkJCUhEQV9JTlBVVCkpKSA8IDApCisJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLCBuYW1lLAorCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWRfcywgMywgMiwgSERBX0lOUFVUKSk7CisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9IGVsc2UgaWYgKGFsYzg4MF9pc19tdWx0aV9waW4ocGluKSkgewogCQkvKiBzZXQgbWFudWFsIGNvbm5lY3Rpb24gKi8KIAkJLyogd2UgaGF2ZSBvbmx5IGEgc3dpdGNoIG9uIEhQLW91dCBQSU4gKi8KIAkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgcGZ4KTsKLQkJaWYgKChlcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAotCQkJCUhEQV9DT01QT1NFX0FNUF9WQUwocGluLCAzLCAwLAotCQkJCQkJCUhEQV9PVVRQVVQpKSkgPCAwKQorCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9NVVRFLCBuYW1lLAorCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChwaW4sIDMsIDAsIEhEQV9PVVRQVVQpKTsKKwkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KIAlyZXR1cm4gMDsKQEAgLTg1NzIsMjEgKzkyNTAsMzEgQEAKIAlpbnQgZXJyOwogCXN0YXRpYyBoZGFfbmlkX3QgYWxjODYxdmRfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKIAotCWlmICgoZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsCi0JCQkJCQlhbGM4NjF2ZF9pZ25vcmUpKSA8IDApCisJZXJyID0gc25kX2hkYV9wYXJzZV9waW5fZGVmX2NvbmZpZyhjb2RlYywgJnNwZWMtPmF1dG9jZmcsCisJCQkJCSAgIGFsYzg2MXZkX2lnbm9yZSk7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JaWYgKCEgc3BlYy0+YXV0b2NmZy5saW5lX291dHMpCisJaWYgKCFzcGVjLT5hdXRvY2ZnLmxpbmVfb3V0cykKIAkJcmV0dXJuIDA7IC8qIGNhbid0IGZpbmQgdmFsaWQgQklPUyBwaW4gY29uZmlnICovCiAKLQlpZiAoKGVyciA9IGFsYzg4MF9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpKSA8IDAgfHwKLQkJKGVyciA9IGFsYzg2MXZkX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHNwZWMsCi0JCQkmc3BlYy0+YXV0b2NmZykpIDwgMCB8fAotCQkoZXJyID0gYWxjODYxdmRfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHNwZWMsCi0JCQlzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwgIlNwZWFrZXIiKSkgPCAwIHx8Ci0JCShlcnIgPSBhbGM4NjF2ZF9hdXRvX2NyZWF0ZV9leHRyYV9vdXQoc3BlYywKLQkJCXNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwgIkhlYWRwaG9uZSIpKSA8IDAgfHwKLQkJKGVyciA9IGFsYzg4MF9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzcGVjLAotCQkJJnNwZWMtPmF1dG9jZmcpKSA8IDApCisJZXJyID0gYWxjODgwX2F1dG9fZmlsbF9kYWNfbmlkcyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gYWxjODYxdmRfYXV0b19jcmVhdGVfbXVsdGlfb3V0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGFsYzg2MXZkX2F1dG9fY3JlYXRlX2V4dHJhX291dChzcGVjLAorCQkJCQkgICAgIHNwZWMtPmF1dG9jZmcuc3BlYWtlcl9waW5zWzBdLAorCQkJCQkgICAgICJTcGVha2VyIik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gYWxjODYxdmRfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHNwZWMsCisJCQkJCSAgICAgc3BlYy0+YXV0b2NmZy5ocF9waW5zWzBdLAorCQkJCQkgICAgICJIZWFkcGhvbmUiKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBhbGM4ODBfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCiAJc3BlYy0+bXVsdGlvdXQubWF4X2NoYW5uZWxzID0gc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgKiAyOwpAQCAtODY0MSw3ICs5MzI5LDcgQEAKIAkJaWYgKGVyciA8IDApIHsKIAkJCWFsY19mcmVlKGNvZGVjKTsKIAkJCXJldHVybiBlcnI7Ci0JCX0gZWxzZSBpZiAoISBlcnIpIHsKKwkJfSBlbHNlIGlmICghZXJyKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPCiAJCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKIAkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKQEAgLTg2NzUsMTYgKzkzNjMsODc1IEBACiB9CiAKIC8qCisgKiBBTEM2NjIgc3VwcG9ydAorICoKKyAqIEFMQzY2MiBpcyBhbG1vc3QgaWRlbnRpY2FsIHdpdGggQUxDODgwIGJ1dCBoYXMgY2xlYW5lciBhbmQgbW9yZSBmbGV4aWJsZQorICogY29uZmlndXJhdGlvbi4gIEVhY2ggcGluIHdpZGdldCBjYW4gY2hvb3NlIGFueSBpbnB1dCBEQUNzIGFuZCBhIG1peGVyLgorICogRWFjaCBBREMgaXMgY29ubmVjdGVkIGZyb20gYSBtaXhlciBvZiBhbGwgaW5wdXRzLiAgVGhpcyBtYWtlcyBwb3NzaWJsZQorICogNi1jaGFubmVsIGluZGVwZW5kZW50IGNhcHR1cmVzLgorICoKKyAqIEluIGFkZGl0aW9uLCBhbiBpbmRlcGVuZGVudCBEQUMgZm9yIHRoZSBtdWx0aS1wbGF5YmFjayAobm90IHVzZWQgaW4gdGhpcworICogZHJpdmVyIHlldCkuCisgKi8KKyNkZWZpbmUgQUxDNjYyX0RJR09VVF9OSUQJMHgwNgorI2RlZmluZSBBTEM2NjJfRElHSU5fTklECTB4MGEKKworc3RhdGljIGhkYV9uaWRfdCBhbGM2NjJfZGFjX25pZHNbNF0gPSB7CisJLyogZnJvbnQsIHJlYXIsIGNsZmUsIHJlYXJfc3VyciAqLworCTB4MDIsIDB4MDMsIDB4MDQKK307CisKK3N0YXRpYyBoZGFfbmlkX3QgYWxjNjYyX2FkY19uaWRzWzFdID0geworCS8qIEFEQzEtMiAqLworCTB4MDksCit9OworLyogaW5wdXQgTVVYICovCisvKiBGSVhNRTogc2hvdWxkIGJlIGEgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLworCitzdGF0aWMgc3RydWN0IGhkYV9pbnB1dF9tdXggYWxjNjYyX2NhcHR1cmVfc291cmNlID0geworCS5udW1faXRlbXMgPSA0LAorCS5pdGVtcyA9IHsKKwkJeyAiTWljIiwgMHgwIH0sCisJCXsgIkZyb250IE1pYyIsIDB4MSB9LAorCQl7ICJMaW5lIiwgMHgyIH0sCisJCXsgIkNEIiwgMHg0IH0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX2lucHV0X211eCBhbGM2NjJfbGVub3ZvXzEwMWVfY2FwdHVyZV9zb3VyY2UgPSB7CisJLm51bV9pdGVtcyA9IDIsCisJLml0ZW1zID0geworCQl7ICJNaWMiLCAweDEgfSwKKwkJeyAiTGluZSIsIDB4MiB9LAorCX0sCit9OworI2RlZmluZSBhbGM2NjJfbXV4X2VudW1faW5mbyBhbGNfbXV4X2VudW1faW5mbworI2RlZmluZSBhbGM2NjJfbXV4X2VudW1fZ2V0IGFsY19tdXhfZW51bV9nZXQKKworc3RhdGljIGludCBhbGM2NjJfbXV4X2VudW1fcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWNvbnN0IHN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gc3BlYy0+aW5wdXRfbXV4OworCXVuc2lnbmVkIGludCBhZGNfaWR4ID0gc25kX2N0bF9nZXRfaW9mZmlkeChrY29udHJvbCwgJnVjb250cm9sLT5pZCk7CisJc3RhdGljIGhkYV9uaWRfdCBjYXB0dXJlX21peGVyc1szXSA9IHsgMHgyNCwgMHgyMywgMHgyMiB9OworCWhkYV9uaWRfdCBuaWQgPSBjYXB0dXJlX21peGVyc1thZGNfaWR4XTsKKwl1bnNpZ25lZCBpbnQgKmN1cl92YWwgPSAmc3BlYy0+Y3VyX211eFthZGNfaWR4XTsKKwl1bnNpZ25lZCBpbnQgaSwgaWR4OworCisJaWR4ID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlpZiAoaWR4ID49IGltdXgtPm51bV9pdGVtcykKKwkJaWR4ID0gaW11eC0+bnVtX2l0ZW1zIC0gMTsKKwlpZiAoKmN1cl92YWwgPT0gaWR4ICYmICFjb2RlYy0+aW5fcmVzdW1lKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaW11eC0+bnVtX2l0ZW1zOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHYgPSAoaSA9PSBpZHgpID8gMHg3MDAwIDogMHg3MDgwOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsCisJCQkJICAgIHYgfCAoaW11eC0+aXRlbXNbaV0uaW5kZXggPDwgOCkpOworCX0KKwkqY3VyX3ZhbCA9IGlkeDsKKwlyZXR1cm4gMTsKK30KKy8qCisgKiAyY2ggbW9kZQorICovCitzdGF0aWMgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgYWxjNjYyXzNTVF8yY2hfbW9kZXNbMV0gPSB7CisJeyAyLCBOVUxMIH0KK307CisKKy8qCisgKiAyY2ggbW9kZQorICovCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml8zU1RfY2gyX2luaXRbXSA9IHsKKwl7IDB4MTgsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX1ZSRUY4MCB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCisJeyAweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTiB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDZjaCBtb2RlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyXzNTVF9jaDZfaW5pdFtdID0geworCXsgMHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyAweDE4LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSB9LAorCXsgMHgxOCwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDIgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxYSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEUgfSwKKwl7IDB4MWEsIEFDX1ZFUkJfU0VUX0NPTk5FQ1RfU0VMLCAweDAxIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzY2Ml8zU1RfNmNoX21vZGVzWzJdID0geworCXsgMiwgYWxjNjYyXzNTVF9jaDJfaW5pdCB9LAorCXsgNiwgYWxjNjYyXzNTVF9jaDZfaW5pdCB9LAorfTsKKworLyoKKyAqIDJjaCBtb2RlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyX3NpeHN0YWNrX2NoNl9pbml0W10gPSB7CisJeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDAgfSwKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgMHgwMCB9LAorCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworLyoKKyAqIDZjaCBtb2RlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyX3NpeHN0YWNrX2NoOF9pbml0W10gPSB7CisJeyAweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVQgfSwKKwl7IDB4MTUsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXsgMHgxNCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUIH0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIGFsYzY2Ml81c3RhY2tfbW9kZXNbMl0gPSB7CisJeyAyLCBhbGM2NjJfc2l4c3RhY2tfY2g2X2luaXQgfSwKKwl7IDYsIGFsYzY2Ml9zaXhzdGFja19jaDhfaW5pdCB9LAorfTsKKworLyogUGluIGFzc2lnbm1lbnQ6IEZyb250PTB4MTQsIFJlYXI9MHgxNSwgQ0xGRT0weDE2LCBTaWRlPTB4MTcKKyAqICAgICAgICAgICAgICAgICBNaWM9MHgxOCwgRnJvbnQgTWljPTB4MTksIExpbmUtSW49MHgxYSwgSFA9MHgxYgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfYmFzZV9taXhlcltdID0geworCS8qIG91dHB1dCBtaXhlciBjb250cm9sICovCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAyLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwNCwgMSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDA0LCAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKworCS8qSW5wdXQgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkNEIFBsYXliYWNrIFZvbHVtZSIsIDB4YiwgMHg0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweGIsIDB4NCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4YiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4YiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHhiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4YiwgMHgwMSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4YiwgMHgwMSwgSERBX0lOUFVUKSwKKworCS8qIENhcHR1cmUgbWl4ZXIgY29udHJvbCAqLworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gYWxjX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGNfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjX211eF9lbnVtX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfM1NUXzJjaF9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IFBsYXliYWNrIFZvbHVtZSIsIDB4MDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiRnJvbnQgUGxheWJhY2sgU3dpdGNoIiwgMHgwMiwgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJMaW5lIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkxpbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJNaWMgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkZyb250IE1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkZyb250IE1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDEsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiUEMgU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA1LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQyBTcGVha2VyIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIkNhcHR1cmUgU3dpdGNoIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS8qIC5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwgKi8KKwkJLm5hbWUgPSAiSW5wdXQgU291cmNlIiwKKwkJLmNvdW50ID0gMSwKKwkJLmluZm8gPSBhbGM2NjJfbXV4X2VudW1faW5mbywKKwkJLmdldCA9IGFsYzY2Ml9tdXhfZW51bV9nZXQsCisJCS5wdXQgPSBhbGM2NjJfbXV4X2VudW1fcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGFsYzY2Ml8zU1RfNmNoX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlN1cnJvdW5kIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiU3Vycm91bmQgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkNlbnRlciBQbGF5YmFjayBWb2x1bWUiLCAweDA0LCAxLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUVfTU9OTygiTEZFIFBsYXliYWNrIFZvbHVtZSIsIDB4MDQsIDIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURV9NT05PKCJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwNCwgMSwgMiwgSERBX0lOUFVUKSwKKwlIREFfQklORF9NVVRFX01PTk8oIkxGRSBQbGF5YmFjayBTd2l0Y2giLCAweDA0LCAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwgMHgxYiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDRCBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDRCBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDA0LCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIkxpbmUgUGxheWJhY2sgVm9sdW1lIiwgMHgwYiwgMHgwMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIk1pYyBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIk1pYyBQbGF5YmFjayBTd2l0Y2giLCAweDBiLCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLworCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuY291bnQgPSAxLAorCQkuaW5mbyA9IGFsYzY2Ml9tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjNjYyX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsYzY2Ml9tdXhfZW51bV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2xlbm92b18xMDFlX21peGVyW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiRnJvbnQgUGxheWJhY2sgVm9sdW1lIiwgMHgwMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQklORF9NVVRFKCJGcm9udCBQbGF5YmFjayBTd2l0Y2giLCAweDAyLCAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoImlTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDMsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0JJTkRfTVVURSgiaVNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwMywgMiwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiSGVhZHBob25lIFBsYXliYWNrIFN3aXRjaCIsIDB4MWIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTGluZSBQbGF5YmFjayBWb2x1bWUiLCAweDBiLCAweDAyLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJMaW5lIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MDIsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiTWljIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLworCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAorCQkuY291bnQgPSAxLAorCQkuaW5mbyA9IGFsYzY2Ml9tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWxjNjYyX211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFsYzY2Ml9tdXhfZW51bV9wdXQsCisJfSwKKwl7IH0gLyogZW5kICovCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWxjNjYyX2NobW9kZV9taXhlcltdID0geworCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkNoYW5uZWwgTW9kZSIsCisJCS5pbmZvID0gYWxjX2NoX21vZGVfaW5mbywKKwkJLmdldCA9IGFsY19jaF9tb2RlX2dldCwKKwkJLnB1dCA9IGFsY19jaF9tb2RlX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyX2luaXRfdmVyYnNbXSA9IHsKKwkvKiBBREM6IG11dGUgYW1wIGxlZnQgYW5kIHJpZ2h0ICovCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9NVVRFKDApfSwKKwl7MHgwOSwgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsIDB4MDB9LAorCS8qIEZyb250IG1peGVyOiB1bm11dGUgaW5wdXQvb3V0cHV0IGFtcCBsZWZ0IGFuZCByaWdodCAodm9sdW1lID0gMCkgKi8KKworCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMil9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDMpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCisKKwl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDAzLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisJezB4MDQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKworCS8qIEZyb250IFBpbjogb3V0cHV0IDAgKDB4MGMpICovCisJezB4MTQsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVH0sCisJezB4MTQsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfVU5NVVRFfSwKKworCS8qIFJlYXIgUGluOiBvdXRwdXQgMSAoMHgwZCkgKi8KKwl7MHgxNSwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fT1VUfSwKKwl7MHgxNSwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCisJLyogQ0xGRSBQaW46IG91dHB1dCAyICgweDBlKSAqLworCXsweDE2LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9PVVR9LAorCXsweDE2LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURX0sCisKKwkvKiBNaWMgKHJlYXIpIHBpbjogaW5wdXQgdnJlZiBhdCA4MCUgKi8KKwl7MHgxOCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fVlJFRjgwfSwKKwl7MHgxOCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9NVVRFfSwKKwkvKiBGcm9udCBNaWMgcGluOiBpbnB1dCB2cmVmIGF0IDgwJSAqLworCXsweDE5LCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9WUkVGODB9LAorCXsweDE5LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX01VVEV9LAorCS8qIExpbmUgSW4gcGluOiBpbnB1dCAqLworCXsweDFhLCBBQ19WRVJCX1NFVF9QSU5fV0lER0VUX0NPTlRST0wsIFBJTl9JTn0sCisJezB4MWEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9PVVRfTVVURX0sCisJLyogTGluZS0yIEluOiBIZWFkcGhvbmUgb3V0cHV0IChvdXRwdXQgMCAtIDB4MGMpICovCisJezB4MWIsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX0hQfSwKKwl7MHgxYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9VTk1VVEV9LAorCXsweDFiLCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJLyogQ0QgcGluIHdpZGdldCBmb3IgaW5wdXQgKi8KKwl7MHgxYywgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCBQSU5fSU59LAorCisJLyogRklYTUU6IHVzZSBtYXRyaXgtdHlwZSBpbnB1dCBzb3VyY2Ugc2VsZWN0aW9uICovCisJLyogTWl4ZXIgZWxlbWVudHM6IDB4MTgsIDE5LCAxYSwgMWIsIDFjLCAxZCwgMTQsIDE1LCAxNiwgMTcsIDBiICovCisJLyogSW5wdXQgbWl4ZXIgKi8KKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzY2Ml9zdWVfaW5pdF92ZXJic1tdID0geworCXsweDE0LCBBQ19WRVJCX1NFVF9VTlNPTElDSVRFRF9FTkFCTEUsIEFDX1VTUlNQX0VOfEFMQzg4MF9GUk9OVF9FVkVOVH0sCisJezB4MWIsIEFDX1ZFUkJfU0VUX1VOU09MSUNJVEVEX0VOQUJMRSwgQUNfVVNSU1BfRU58QUxDODgwX0hQX0VWRU5UfSwKKyAgICAgICAge30KK307CisKKy8qCisgKiBnZW5lcmljIGluaXRpYWxpemF0aW9uIG9mIEFEQywgaW5wdXQgbWl4ZXJzIGFuZCBvdXRwdXQgbWl4ZXJzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYWxjNjYyX2F1dG9faW5pdF92ZXJic1tdID0geworCS8qCisJICogVW5tdXRlIEFEQyBhbmQgc2V0IHRoZSBkZWZhdWx0IGlucHV0IHRvIG1pYy1pbgorCSAqLworCXsweDA5LCBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgMHgwMH0sCisJezB4MDksIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCisJLyogVW5tdXRlIGlucHV0IGFtcHMgKENELCBMaW5lIEluLCBNaWMgMSAmIE1pYyAyKSBvZiB0aGUgYW5hbG9nLWxvb3BiYWNrCisJICogbWl4ZXIgd2lkZ2V0CisJICogTm90ZTogUEFTRCBtb3RoZXJib2FyZHMgdXNlcyB0aGUgTGluZSBJbiAyIGFzIHRoZSBpbnB1dCBmb3IgZnJvbnQKKwkgKiBwYW5lbCBtaWMgKG1pYyAyKQorCSAqLworCS8qIEFtcCBJbmRpY2VzOiBNaWMxID0gMCwgTWljMiA9IDEsIExpbmUxID0gMiwgTGluZTIgPSAzLCBDRCA9IDQgKi8KKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDBiLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDIpfSwKKwl7MHgwYiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sCisJezB4MGIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoNCl9LAorCisJLyoKKwkgKiBTZXQgdXAgb3V0cHV0IG1peGVycyAoMHgwYyAtIDB4MGYpCisJICovCisJLyogc2V0IHZvbD0wIHRvIG91dHB1dCBtaXhlcnMgKi8KKwl7MHgwMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKwl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX09VVF9aRVJPfSwKKworCS8qIHNldCB1cCBpbnB1dCBhbXBzIGZvciBhbmFsb2cgbG9vcGJhY2sgKi8KKwkvKiBBbXAgSW5kaWNlczogREFDID0gMCwgbWl4ZXIgPSAxICovCisJezB4MDIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDAyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgwMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCisJezB4MDMsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMSl9LAorCXsweDA0LCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKKwl7MHgwNCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgxKX0sCisKKworCS8qIEZJWE1FOiB1c2UgbWF0cml4LXR5cGUgaW5wdXQgc291cmNlIHNlbGVjdGlvbiAqLworCS8qIE1peGVyIGVsZW1lbnRzOiAweDE4LCAxOSwgMWEsIDFiLCAxYywgMWQsIDE0LCAxNSwgMTYsIDE3LCAwYiAqLworCS8qIElucHV0IG1peGVyICovCisJezB4MjIsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAorCXsweDIyLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDEpfSwKKwl7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgyKX0sCisJLyp7MHgyMiwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgzKX0sKi8KKwl7MHgyMywgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSg0KX0sCisKKwl7IH0KK307CisKKy8qIGNhcHR1cmUgbWl4ZXIgZWxlbWVudHMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhbGM2NjJfY2FwdHVyZV9taXhlcltdID0geworCUhEQV9DT0RFQ19WT0xVTUUoIkNhcHR1cmUgVm9sdW1lIiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MDksIDB4MCwgSERBX0lOUFVUKSwKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkvKiBUaGUgbXVsdGlwbGUgIkNhcHR1cmUgU291cmNlIiBjb250cm9scyBjb25mdXNlIGFsc2FtaXhlcgorCQkgKiBTbyBjYWxsIHNvbWV3aGF0IGRpZmZlcmVudC4uCisJCSAqIEZJWE1FOiB0aGUgY29udHJvbHMgYXBwZWFyIGluIHRoZSAicGxheWJhY2siIHZpZXchCisJCSAqLworCQkvKiAubmFtZSA9ICJDYXB0dXJlIFNvdXJjZSIsICovCisJCS5uYW1lID0gIklucHV0IFNvdXJjZSIsCisJCS5jb3VudCA9IDEsCisJCS5pbmZvID0gYWxjODgyX211eF9lbnVtX2luZm8sCisJCS5nZXQgPSBhbGM4ODJfbXV4X2VudW1fZ2V0LAorCQkucHV0ID0gYWxjODgyX211eF9lbnVtX3B1dCwKKwl9LAorCXsgfSAvKiBlbmQgKi8KK307CisKK3N0YXRpYyB2b2lkIGFsYzY2Ml9sZW5vdm9fMTAxZV9pc3BlYWtlcl9hdXRvbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcHJlc2VudDsKKwl1bnNpZ25lZCBjaGFyIGJpdHM7CisKKwlwcmVzZW50ID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDE0LCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfUElOX1NFTlNFLCAwKSAmIDB4ODAwMDAwMDA7CisJYml0cyA9IHByZXNlbnQgPyAweDgwIDogMDsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTUsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIGJpdHMpOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNSwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzY2Ml9sZW5vdm9fMTAxZV9hbGxfYXV0b211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdW5zaWduZWQgaW50IHByZXNlbnQ7CisJdW5zaWduZWQgY2hhciBiaXRzOworCisgCXByZXNlbnQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MWIsIDAsCisJCQkJICAgICBBQ19WRVJCX0dFVF9QSU5fU0VOU0UsIDApICYgMHg4MDAwMDAwMDsKKwliaXRzID0gcHJlc2VudCA/IDB4ODAgOiAwOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNSwgMCwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgYml0cyk7CisJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDE1LCAxLCBIREFfT1VUUFVULCAwLAorCQkJCSAweDgwLCBiaXRzKTsKKwlzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MTQsIDAsIEhEQV9PVVRQVVQsIDAsCisJCQkJIDB4ODAsIGJpdHMpOworCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgxNCwgMSwgSERBX09VVFBVVCwgMCwKKwkJCQkgMHg4MCwgYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzY2Ml9sZW5vdm9fMTAxZV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgdW5zaWduZWQgaW50IHJlcykKK3sKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0hQX0VWRU5UKQorCQlhbGM2NjJfbGVub3ZvXzEwMWVfYWxsX2F1dG9tdXRlKGNvZGVjKTsKKwlpZiAoKHJlcyA+PiAyNikgPT0gQUxDODgwX0ZST05UX0VWRU5UKQorCQlhbGM2NjJfbGVub3ZvXzEwMWVfaXNwZWFrZXJfYXV0b211dGUoY29kZWMpOworfQorCisKKy8qIHBjbSBjb25maWd1cmF0aW9uOiBpZGVudGlhY2FsIHdpdGggQUxDODgwICovCisjZGVmaW5lIGFsYzY2Ml9wY21fYW5hbG9nX3BsYXliYWNrCWFsYzg4MF9wY21fYW5hbG9nX3BsYXliYWNrCisjZGVmaW5lIGFsYzY2Ml9wY21fYW5hbG9nX2NhcHR1cmUJYWxjODgwX3BjbV9hbmFsb2dfY2FwdHVyZQorI2RlZmluZSBhbGM2NjJfcGNtX2RpZ2l0YWxfcGxheWJhY2sJYWxjODgwX3BjbV9kaWdpdGFsX3BsYXliYWNrCisjZGVmaW5lIGFsYzY2Ml9wY21fZGlnaXRhbF9jYXB0dXJlCWFsYzg4MF9wY21fZGlnaXRhbF9jYXB0dXJlCisKKy8qCisgKiBjb25maWd1cmF0aW9uIGFuZCBwcmVzZXQKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmFsYzY2Ml9tb2RlbHNbQUxDNjYyX01PREVMX0xBU1RdID0geworCVtBTEM2NjJfM1NUXzJjaF9ESUddCT0gIjNzdGFjay1kaWciLAorCVtBTEM2NjJfM1NUXzZjaF9ESUddCT0gIjNzdGFjay02Y2gtZGlnIiwKKwlbQUxDNjYyXzNTVF82Y2hdCT0gIjNzdGFjay02Y2giLAorCVtBTEM2NjJfNVNUX0RJR10JPSAiNnN0YWNrLWRpZyIsCisJW0FMQzY2Ml9MRU5PVk9fMTAxRV0JPSAibGVub3ZvLTEwMWUiLAorCVtBTEM2NjJfQVVUT10JCT0gImF1dG8iLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNpX3F1aXJrIGFsYzY2Ml9jZmdfdGJsW10gPSB7CisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MTAxZSwgIkxlbm92byIsIEFMQzY2Ml9MRU5PVk9fMTAxRSksCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWxjX2NvbmZpZ19wcmVzZXQgYWxjNjYyX3ByZXNldHNbXSA9IHsKKwlbQUxDNjYyXzNTVF8yY2hfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYyXzNTVF8yY2hfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjNjYyX2FkY19uaWRzLAorCQkuZGlnX2luX25pZCA9IEFMQzY2Ml9ESUdJTl9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzJjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzJjaF9tb2RlcywKKwkJLmlucHV0X211eCA9ICZhbGM2NjJfY2FwdHVyZV9zb3VyY2UsCisJfSwKKwlbQUxDNjYyXzNTVF82Y2hfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYyXzNTVF82Y2hfbWl4ZXIsIGFsYzY2Ml9jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjNjYyX2FkY19uaWRzLAorCQkuZGlnX2luX25pZCA9IEFMQzY2Ml9ESUdJTl9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzZjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzZjaF9tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5pbnB1dF9tdXggPSAmYWxjNjYyX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzY2Ml8zU1RfNmNoXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYyXzNTVF82Y2hfbWl4ZXIsIGFsYzY2Ml9jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkubnVtX2FkY19uaWRzID0gQVJSQVlfU0laRShhbGM2NjJfYWRjX25pZHMpLAorCQkuYWRjX25pZHMgPSBhbGM2NjJfYWRjX25pZHMsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfM1NUXzZjaF9tb2RlcyksCisJCS5jaGFubmVsX21vZGUgPSBhbGM2NjJfM1NUXzZjaF9tb2RlcywKKwkJLm5lZWRfZGFjX2ZpeCA9IDEsCisJCS5pbnB1dF9tdXggPSAmYWxjNjYyX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzY2Ml81U1RfRElHXSA9IHsKKwkJLm1peGVycyA9IHsgYWxjNjYyX2Jhc2VfbWl4ZXIsIGFsYzY2Ml9jaG1vZGVfbWl4ZXIgfSwKKwkJLmluaXRfdmVyYnMgPSB7IGFsYzY2Ml9pbml0X3ZlcmJzIH0sCisJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2RhY19uaWRzKSwKKwkJLmRhY19uaWRzID0gYWxjNjYyX2RhY19uaWRzLAorCQkuZGlnX291dF9uaWQgPSBBTEM2NjJfRElHT1VUX05JRCwKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjNjYyX2FkY19uaWRzLAorCQkuZGlnX2luX25pZCA9IEFMQzY2Ml9ESUdJTl9OSUQsCisJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM2NjJfNXN0YWNrX21vZGVzKSwKKwkJLmNoYW5uZWxfbW9kZSA9IGFsYzY2Ml81c3RhY2tfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjNjYyX2NhcHR1cmVfc291cmNlLAorCX0sCisJW0FMQzY2Ml9MRU5PVk9fMTAxRV0gPSB7CisJCS5taXhlcnMgPSB7IGFsYzY2Ml9sZW5vdm9fMTAxZV9taXhlciB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjNjYyX2luaXRfdmVyYnMsIGFsYzY2Ml9zdWVfaW5pdF92ZXJicyB9LAorCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzY2Ml9kYWNfbmlkcyksCisJCS5kYWNfbmlkcyA9IGFsYzY2Ml9kYWNfbmlkcywKKwkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2FkY19uaWRzKSwKKwkJLmFkY19uaWRzID0gYWxjNjYyX2FkY19uaWRzLAorCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjNjYyXzNTVF8yY2hfbW9kZXMpLAorCQkuY2hhbm5lbF9tb2RlID0gYWxjNjYyXzNTVF8yY2hfbW9kZXMsCisJCS5pbnB1dF9tdXggPSAmYWxjNjYyX2xlbm92b18xMDFlX2NhcHR1cmVfc291cmNlLAorCQkudW5zb2xfZXZlbnQgPSBhbGM2NjJfbGVub3ZvXzEwMWVfdW5zb2xfZXZlbnQsCisJCS5pbml0X2hvb2sgPSBhbGM2NjJfbGVub3ZvXzEwMWVfYWxsX2F1dG9tdXRlLAorCX0sCisKK307CisKKworLyoKKyAqIEJJT1MgYXV0byBjb25maWd1cmF0aW9uCisgKi8KKworLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZyb20gdGhlIHBhcnNlZCBEQUMgdGFibGUgKi8KK3N0YXRpYyBpbnQgYWxjNjYyX2F1dG9fY3JlYXRlX211bHRpX291dF9jdGxzKHN0cnVjdCBhbGNfc3BlYyAqc3BlYywKKwkJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCit7CisJY2hhciBuYW1lWzMyXTsKKwlzdGF0aWMgY29uc3QgY2hhciAqY2huYW1lWzRdID0geworCQkiRnJvbnQiLCAiU3Vycm91bmQiLCBOVUxMIC8qQ0xGRSovLCAiU2lkZSIKKwl9OworCWhkYV9uaWRfdCBuaWQ7CisJaW50IGksIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7CisJCWlmICghc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0pCisJCQljb250aW51ZTsKKwkJbmlkID0gYWxjODgwX2lkeF90b19kYWMoaSk7CisJCWlmIChpID09IDIpIHsKKwkJCS8qIENlbnRlci9MRkUgKi8KKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwKKwkJCQkJICAiQ2VudGVyIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDEsIDAsCisJCQkJCQkJICAgICAgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwKKwkJCQkJICAiTEZFIFBsYXliYWNrIFZvbHVtZSIsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDIsIDAsCisJCQkJCQkJICAgICAgSERBX09VVFBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLAorCQkJCQkgICJDZW50ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMSwgMiwKKwkJCQkJCQkgICAgICBIREFfSU5QVVQpKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX0JJTkRfTVVURSwKKwkJCQkJICAiTEZFIFBsYXliYWNrIFN3aXRjaCIsCisJCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDIsIDIsCisJCQkJCQkJICAgICAgSERBX0lOUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9IGVsc2UgeworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgVm9sdW1lIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX1ZPTCwgbmFtZSwKKwkJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwKKwkJCQkJCQkgICAgICBIREFfT1VUUFVUKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJc3ByaW50ZihuYW1lLCAiJXMgUGxheWJhY2sgU3dpdGNoIiwgY2huYW1lW2ldKTsKKwkJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLCBuYW1lLAorCQkJCQkgIEhEQV9DT01QT1NFX0FNUF9WQUwobmlkLCAzLCAyLAorCQkJCQkJCSAgICAgIEhEQV9JTlBVVCkpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogYWRkIHBsYXliYWNrIGNvbnRyb2xzIGZvciBzcGVha2VyIGFuZCBIUCBvdXRwdXRzICovCitzdGF0aWMgaW50IGFsYzY2Ml9hdXRvX2NyZWF0ZV9leHRyYV9vdXQoc3RydWN0IGFsY19zcGVjICpzcGVjLCBoZGFfbmlkX3QgcGluLAorCQkJCQljb25zdCBjaGFyICpwZngpCit7CisJaGRhX25pZF90IG5pZDsKKwlpbnQgZXJyOworCWNoYXIgbmFtZVszMl07CisKKwlpZiAoIXBpbikKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWxjODgwX2lzX2ZpeGVkX3BpbihwaW4pKSB7CisJCW5pZCA9IGFsYzg4MF9pZHhfdG9fZGFjKGFsYzg4MF9maXhlZF9waW5faWR4KHBpbikpOworICAgICAgICAgICAgICAgIC8qIHByaW50aygiREFDIG5pZD0leFxuIixuaWQpOyAqLworCQkvKiBzcGVjaWZ5IHRoZSBEQUMgYXMgdGhlIGV4dHJhIG91dHB1dCAqLworCQlpZiAoIXNwZWMtPm11bHRpb3V0LmhwX25pZCkKKwkJCXNwZWMtPm11bHRpb3V0LmhwX25pZCA9IG5pZDsKKwkJZWxzZQorCQkJc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZFswXSA9IG5pZDsKKwkJLyogY29udHJvbCBIUCB2b2x1bWUvc3dpdGNoIG9uIHRoZSBvdXRwdXQgbWl4ZXIgYW1wICovCisJCW5pZCA9IGFsYzg4MF9pZHhfdG9fZGFjKGFsYzg4MF9maXhlZF9waW5faWR4KHBpbikpOworCQlzcHJpbnRmKG5hbWUsICIlcyBQbGF5YmFjayBWb2x1bWUiLCBwZngpOworCQllcnIgPSBhZGRfY29udHJvbChzcGVjLCBBTENfQ1RMX1dJREdFVF9WT0wsIG5hbWUsCisJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMywgMCwgSERBX09VVFBVVCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIHBmeCk7CisJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfQklORF9NVVRFLCBuYW1lLAorCQkJCSAgSERBX0NPTVBPU0VfQU1QX1ZBTChuaWQsIDMsIDIsIEhEQV9JTlBVVCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIGlmIChhbGM4ODBfaXNfbXVsdGlfcGluKHBpbikpIHsKKwkJLyogc2V0IG1hbnVhbCBjb25uZWN0aW9uICovCisJCS8qIHdlIGhhdmUgb25seSBhIHN3aXRjaCBvbiBIUC1vdXQgUElOICovCisJCXNwcmludGYobmFtZSwgIiVzIFBsYXliYWNrIFN3aXRjaCIsIHBmeCk7CisJCWVyciA9IGFkZF9jb250cm9sKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIG5hbWUsCisJCQkJICBIREFfQ09NUE9TRV9BTVBfVkFMKHBpbiwgMywgMCwgSERBX09VVFBVVCkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCisvKiBjcmVhdGUgcGxheWJhY2svY2FwdHVyZSBjb250cm9scyBmb3IgaW5wdXQgcGlucyAqLworc3RhdGljIGludCBhbGM2NjJfYXV0b19jcmVhdGVfYW5hbG9nX2lucHV0X2N0bHMoc3RydWN0IGFsY19zcGVjICpzcGVjLAorCQkJCQkJY29uc3Qgc3RydWN0IGF1dG9fcGluX2NmZyAqY2ZnKQoreworCXN0cnVjdCBoZGFfaW5wdXRfbXV4ICppbXV4ID0gJnNwZWMtPnByaXZhdGVfaW11eDsKKwlpbnQgaSwgZXJyLCBpZHg7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVVUT19QSU5fTEFTVDsgaSsrKSB7CisJCWlmIChhbGM4ODBfaXNfaW5wdXRfcGluKGNmZy0+aW5wdXRfcGluc1tpXSkpIHsKKwkJCWlkeCA9IGFsYzg4MF9pbnB1dF9waW5faWR4KGNmZy0+aW5wdXRfcGluc1tpXSk7CisJCQllcnIgPSBuZXdfYW5hbG9nX2lucHV0KHNwZWMsIGNmZy0+aW5wdXRfcGluc1tpXSwKKwkJCQkJICAgICAgIGF1dG9fcGluX2NmZ19sYWJlbHNbaV0sCisJCQkJCSAgICAgICBpZHgsIDB4MGIpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWltdXgtPml0ZW1zW2ltdXgtPm51bV9pdGVtc10ubGFiZWwgPQorCQkJCWF1dG9fcGluX2NmZ19sYWJlbHNbaV07CisJCQlpbXV4LT5pdGVtc1tpbXV4LT5udW1faXRlbXNdLmluZGV4ID0KKwkJCQlhbGM4ODBfaW5wdXRfcGluX2lkeChjZmctPmlucHV0X3BpbnNbaV0pOworCQkJaW11eC0+bnVtX2l0ZW1zKys7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFsYzY2Ml9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkJICAgICAgaGRhX25pZF90IG5pZCwgaW50IHBpbl90eXBlLAorCQkJCQkgICAgICBpbnQgZGFjX2lkeCkKK3sKKwkvKiBzZXQgYXMgb3V0cHV0ICovCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgcGluX3R5cGUpOworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfT1VUX1VOTVVURSk7CisJLyogbmVlZCB0aGUgbWFudWFsIGNvbm5lY3Rpb24/ICovCisJaWYgKGFsYzg4MF9pc19tdWx0aV9waW4obmlkKSkgeworCQlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwkJaW50IGlkeCA9IGFsYzg4MF9tdWx0aV9waW5faWR4KG5pZCk7CisJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGFsYzg4MF9pZHhfdG9fc2VsZWN0b3IoaWR4KSwgMCwKKwkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCisJCQkJICAgIGFsYzg4MF9kYWNfdG9faWR4KHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2RhY19pZHhdKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbGM2NjJfYXV0b19pbml0X211bHRpX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gSERBX1NJREU7IGkrKykgeworCQloZGFfbmlkX3QgbmlkID0gc3BlYy0+YXV0b2NmZy5saW5lX291dF9waW5zW2ldOworCQlpbnQgcGluX3R5cGUgPSBnZXRfcGluX3R5cGUoc3BlYy0+YXV0b2NmZy5saW5lX291dF90eXBlKTsKKwkJaWYgKG5pZCkKKwkJCWFsYzY2Ml9hdXRvX3NldF9vdXRwdXRfYW5kX3VubXV0ZShjb2RlYywgbmlkLCBwaW5fdHlwZSwKKwkJCQkJCQkgIGkpOworCX0KK30KKworc3RhdGljIHZvaWQgYWxjNjYyX2F1dG9faW5pdF9ocF9vdXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IHBpbjsKKworCXBpbiA9IHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXTsKKwlpZiAocGluKSAvKiBjb25uZWN0IHRvIGZyb250ICovCisJCS8qIHVzZSBkYWMgMCAqLworCQlhbGM2NjJfYXV0b19zZXRfb3V0cHV0X2FuZF91bm11dGUoY29kZWMsIHBpbiwgUElOX0hQLCAwKTsKK30KKworI2RlZmluZSBhbGM2NjJfaXNfaW5wdXRfcGluKG5pZCkJYWxjODgwX2lzX2lucHV0X3BpbihuaWQpCisjZGVmaW5lIEFMQzY2Ml9QSU5fQ0RfTklECQlBTEM4ODBfUElOX0NEX05JRAorCitzdGF0aWMgdm9pZCBhbGM2NjJfYXV0b19pbml0X2FuYWxvZ19pbnB1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBVVRPX1BJTl9MQVNUOyBpKyspIHsKKwkJaGRhX25pZF90IG5pZCA9IHNwZWMtPmF1dG9jZmcuaW5wdXRfcGluc1tpXTsKKwkJaWYgKGFsYzY2Ml9pc19pbnB1dF9waW4obmlkKSkgeworCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJCQkgICAgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAorCQkJCQkgICAgKGkgPD0gQVVUT19QSU5fRlJPTlRfTUlDID8KKwkJCQkJICAgICBQSU5fVlJFRjgwIDogUElOX0lOKSk7CisJCQlpZiAobmlkICE9IEFMQzY2Ml9QSU5fQ0RfTklEKQorCQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKKwkJCQkJCSAgICBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLAorCQkJCQkJICAgIEFNUF9PVVRfTVVURSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgYWxjNjYyX3BhcnNlX2F1dG9fY29uZmlnKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBlcnI7CisJc3RhdGljIGhkYV9uaWRfdCBhbGM2NjJfaWdub3JlW10gPSB7IDB4MWQsIDAgfTsKKworCWVyciA9IHNuZF9oZGFfcGFyc2VfcGluX2RlZl9jb25maWcoY29kZWMsICZzcGVjLT5hdXRvY2ZnLAorCQkJCQkgICBhbGM2NjJfaWdub3JlKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoIXNwZWMtPmF1dG9jZmcubGluZV9vdXRzKQorCQlyZXR1cm4gMDsgLyogY2FuJ3QgZmluZCB2YWxpZCBCSU9TIHBpbiBjb25maWcgKi8KKworCWVyciA9IGFsYzg4MF9hdXRvX2ZpbGxfZGFjX25pZHMoc3BlYywgJnNwZWMtPmF1dG9jZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGFsYzY2Ml9hdXRvX2NyZWF0ZV9tdWx0aV9vdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gYWxjNjYyX2F1dG9fY3JlYXRlX2V4dHJhX291dChzcGVjLAorCQkJCQkgICBzcGVjLT5hdXRvY2ZnLnNwZWFrZXJfcGluc1swXSwKKwkJCQkJICAgIlNwZWFrZXIiKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBhbGM2NjJfYXV0b19jcmVhdGVfZXh0cmFfb3V0KHNwZWMsIHNwZWMtPmF1dG9jZmcuaHBfcGluc1swXSwKKwkJCQkJICAgIkhlYWRwaG9uZSIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGFsYzY2Ml9hdXRvX2NyZWF0ZV9hbmFsb2dfaW5wdXRfY3RscyhzcGVjLCAmc3BlYy0+YXV0b2NmZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlzcGVjLT5tdWx0aW91dC5tYXhfY2hhbm5lbHMgPSBzcGVjLT5tdWx0aW91dC5udW1fZGFjcyAqIDI7CisKKwlpZiAoc3BlYy0+YXV0b2NmZy5kaWdfb3V0X3BpbikKKwkJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSBBTEM4ODBfRElHT1VUX05JRDsKKworCWlmIChzcGVjLT5rY3RsX2FsbG9jKQorCQlzcGVjLT5taXhlcnNbc3BlYy0+bnVtX21peGVycysrXSA9IHNwZWMtPmtjdGxfYWxsb2M7CisKKwlzcGVjLT5udW1fbXV4X2RlZnMgPSAxOworCXNwZWMtPmlucHV0X211eCA9ICZzcGVjLT5wcml2YXRlX2ltdXg7CisJCisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZWxzZSBpZiAoZXJyID4gMCkKKwkJLyogaGFjayAtIG92ZXJyaWRlIHRoZSBpbml0IHZlcmJzICovCisJCXNwZWMtPmluaXRfdmVyYnNbMF0gPSBhbGM2NjJfYXV0b19pbml0X3ZlcmJzOworCXNwZWMtPm1peGVyc1tzcGVjLT5udW1fbWl4ZXJzXSA9IGFsYzY2Ml9jYXB0dXJlX21peGVyOworCXNwZWMtPm51bV9taXhlcnMrKzsKKwlyZXR1cm4gZXJyOworfQorCisvKiBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGZvciBhdXRvLWNvbmZpZ3VyYXRpb24gbW9kZWwgKi8KK3N0YXRpYyB2b2lkIGFsYzY2Ml9hdXRvX2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJYWxjNjYyX2F1dG9faW5pdF9tdWx0aV9vdXQoY29kZWMpOworCWFsYzY2Ml9hdXRvX2luaXRfaHBfb3V0KGNvZGVjKTsKKwlhbGM2NjJfYXV0b19pbml0X2FuYWxvZ19pbnB1dChjb2RlYyk7Cit9CisKK3N0YXRpYyBpbnQgcGF0Y2hfYWxjNjYyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBhbGNfc3BlYyAqc3BlYzsKKwlpbnQgZXJyLCBib2FyZF9jb25maWc7CisKKwlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNwZWMpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJYm9hcmRfY29uZmlnID0gc25kX2hkYV9jaGVja19ib2FyZF9jb25maWcoY29kZWMsIEFMQzY2Ml9NT0RFTF9MQVNULAorCQkJCQkJICBhbGM2NjJfbW9kZWxzLAorCQkJICAJICAgICAgICAgICAgICAgICAgYWxjNjYyX2NmZ190YmwpOworCWlmIChib2FyZF9jb25maWcgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gImhkYV9jb2RlYzogVW5rbm93biBtb2RlbCBmb3IgQUxDNjYyLCAiCisJCSAgICAgICAidHJ5aW5nIGF1dG8tcHJvYmUgZnJvbSBCSU9TLi4uXG4iKTsKKwkJYm9hcmRfY29uZmlnID0gQUxDNjYyX0FVVE87CisJfQorCisJaWYgKGJvYXJkX2NvbmZpZyA9PSBBTEM2NjJfQVVUTykgeworCQkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KKwkJZXJyID0gYWxjNjYyX3BhcnNlX2F1dG9fY29uZmlnKGNvZGVjKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWFsY19mcmVlKGNvZGVjKTsKKwkJCXJldHVybiBlcnI7CisJCX0gZWxzZSBpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgImhkYV9jb2RlYzogQ2Fubm90IHNldCB1cCBjb25maWd1cmF0aW9uICIKKwkJCSAgICAgICAiZnJvbSBCSU9TLiAgVXNpbmcgYmFzZSBtb2RlLi4uXG4iKTsKKwkJCWJvYXJkX2NvbmZpZyA9IEFMQzY2Ml8zU1RfMmNoX0RJRzsKKwkJfQorCX0KKworCWlmIChib2FyZF9jb25maWcgIT0gQUxDNjYyX0FVVE8pCisJCXNldHVwX3ByZXNldChzcGVjLCAmYWxjNjYyX3ByZXNldHNbYm9hcmRfY29uZmlnXSk7CisKKwlzcGVjLT5zdHJlYW1fbmFtZV9hbmFsb2cgPSAiQUxDNjYyIEFuYWxvZyI7CisJc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjayA9ICZhbGM2NjJfcGNtX2FuYWxvZ19wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUgPSAmYWxjNjYyX3BjbV9hbmFsb2dfY2FwdHVyZTsKKworCXNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwgPSAiQUxDNjYyIERpZ2l0YWwiOworCXNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrID0gJmFsYzY2Ml9wY21fZGlnaXRhbF9wbGF5YmFjazsKKwlzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlID0gJmFsYzY2Ml9wY21fZGlnaXRhbF9jYXB0dXJlOworCisJaWYgKCFzcGVjLT5hZGNfbmlkcyAmJiBzcGVjLT5pbnB1dF9tdXgpIHsKKwkJc3BlYy0+YWRjX25pZHMgPSBhbGM2NjJfYWRjX25pZHM7CisJCXNwZWMtPm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjNjYyX2FkY19uaWRzKTsKKwl9CisKKwljb2RlYy0+cGF0Y2hfb3BzID0gYWxjX3BhdGNoX29wczsKKwlpZiAoYm9hcmRfY29uZmlnID09IEFMQzY2Ml9BVVRPKQorCQlzcGVjLT5pbml0X2hvb2sgPSBhbGM2NjJfYXV0b19pbml0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBwYXRjaCBlbnRyaWVzCiAgKi8KIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X3JlYWx0ZWtbXSA9IHsKIAl7IC5pZCA9IDB4MTBlYzAyNjAsIC5uYW1lID0gIkFMQzI2MCIsIC5wYXRjaCA9IHBhdGNoX2FsYzI2MCB9LAogCXsgLmlkID0gMHgxMGVjMDI2MiwgLm5hbWUgPSAiQUxDMjYyIiwgLnBhdGNoID0gcGF0Y2hfYWxjMjYyIH0sCiAJeyAuaWQgPSAweDEwZWMwODYxLCAucmV2ID0gMHgxMDAzNDAsIC5uYW1lID0gIkFMQzY2MCIsCi0JCS5wYXRjaCA9IHBhdGNoX2FsYzg2MSB9LAorCSAgLnBhdGNoID0gcGF0Y2hfYWxjODYxIH0sCiAJeyAuaWQgPSAweDEwZWMwNjYwLCAubmFtZSA9ICJBTEM2NjAtVkQiLCAucGF0Y2ggPSBwYXRjaF9hbGM4NjF2ZCB9LAogCXsgLmlkID0gMHgxMGVjMDg2MSwgLm5hbWUgPSAiQUxDODYxIiwgLnBhdGNoID0gcGF0Y2hfYWxjODYxIH0sCiAJeyAuaWQgPSAweDEwZWMwODYyLCAubmFtZSA9ICJBTEM4NjEtVkQiLCAucGF0Y2ggPSBwYXRjaF9hbGM4NjF2ZCB9LAorCXsgLmlkID0gMHgxMGVjMDY2MiwgLnJldiA9IDB4MTAwMDAyLCAubmFtZSA9ICJBTEM2NjIgcmV2MiIsCisJICAucGF0Y2ggPSBwYXRjaF9hbGM4ODMgfSwKKwl7IC5pZCA9IDB4MTBlYzA2NjIsIC5yZXYgPSAweDEwMDEwMSwgLm5hbWUgPSAiQUxDNjYyIHJldjEiLAorCSAgLnBhdGNoID0gcGF0Y2hfYWxjNjYyIH0sCiAJeyAuaWQgPSAweDEwZWMwODgwLCAubmFtZSA9ICJBTEM4ODAiLCAucGF0Y2ggPSBwYXRjaF9hbGM4ODAgfSwKIAl7IC5pZCA9IDB4MTBlYzA4ODIsIC5uYW1lID0gIkFMQzg4MiIsIC5wYXRjaCA9IHBhdGNoX2FsYzg4MiB9LAogCXsgLmlkID0gMHgxMGVjMDg4MywgLm5hbWUgPSAiQUxDODgzIiwgLnBhdGNoID0gcGF0Y2hfYWxjODgzIH0sCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKaW5kZXggYzk0MjkxYi4uOTNhZTljMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYwpAQCAtNjIsNiArNjIsNyBAQAogCVNUQUNfTUFDQk9PSywKIAlTVEFDX01BQ0JPT0tfUFJPX1YxLAogCVNUQUNfTUFDQk9PS19QUk9fVjIsCisJU1RBQ19JTUFDX0lOVEVMLAogCVNUQUNfOTIyWF9NT0RFTFMKIH07CiAKQEAgLTE3NSw4ICsxNzYsOCBAQAogICAgICAgICAweDE5LCAweDFhCiB9OwogCi1zdGF0aWMgaGRhX25pZF90IHN0YWM5MjA1X2RtaWNfbmlkc1szXSA9IHsKLSAgICAgICAgMHgxNywgMHgxOCwgMAorc3RhdGljIGhkYV9uaWRfdCBzdGFjOTIwNV9kbWljX25pZHNbMl0gPSB7CisgICAgICAgIDB4MTcsIDB4MTgsCiB9OwogCiBzdGF0aWMgaGRhX25pZF90IHN0YWM5MjAwX3Bpbl9uaWRzWzhdID0gewpAQCAtNTI0LDEyICs1MjUsNiBAQAogCTB4MDJhMTkzMjAsIDB4NDAwMDAxMDAsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IG1hY2Jvb2tfcGluX2NvbmZpZ3NbMTBdID0gewotCTB4MDMyMWUyMzAsIDB4MDNhMWUwMjAsIDB4NDAwMDAwZmQsIDB4OTAxN2UxMTAsCi0JMHg0MDAwMDBmZSwgMHgwMzgxZTAyMSwgMHgxMzQ1ZTI0MCwgMHgxM2M1ZTIyZSwKLQkweDQwMDAwMGZjLCAweDQwMDAwMGZiLAotfTsKLQogc3RhdGljIHVuc2lnbmVkIGludCBtYWNib29rX3Byb192MV9waW5fY29uZmlnc1sxMF0gPSB7CiAJMHgwMzIxZTIzMCwgMHgwM2ExZTAyMCwgMHg5MDE3ZTExMCwgMHgwMTAxNDAxMCwKIAkweDAxYTE5MDIxLCAweDAzODFlMDIxLCAweDEzNDVlMjQwLCAweDEzYzVlMjJlLApAQCAtNTQyLDE0ICs1MzcsMjEgQEAKIAkweDQwMDAwMGZjLCAweDQwMDAwMGZiLAogfTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBpbWFjX2ludGVsX3Bpbl9jb25maWdzWzEwXSA9IHsKKwkweDAxMjFlMjMwLCAweDkwYTcwMTIwLCAweDkwMTdlMTEwLCAweDQwMDAwMGZlLAorCTB4NDAwMDAwZmQsIDB4MDE4MWUwMjEsIDB4MTE0NWUwNDAsIDB4NDAwMDAwZmEsCisJMHg0MDAwMDBmYywgMHg0MDAwMDBmYiwKK307CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgKnN0YWM5MjJ4X2JyZF90YmxbU1RBQ185MjJYX01PREVMU10gPSB7CiAJW1NUQUNfRDk0NV9SRUZdID0gcmVmOTIyeF9waW5fY29uZmlncywKIAlbU1RBQ19EOTQ1R1RQM10gPSBkOTQ1Z3RwM19waW5fY29uZmlncywKIAlbU1RBQ19EOTQ1R1RQNV0gPSBkOTQ1Z3RwNV9waW5fY29uZmlncywKLQlbU1RBQ19NQUNNSU5JXSA9IGQ5NDVndHA1X3Bpbl9jb25maWdzLAotCVtTVEFDX01BQ0JPT0tdID0gbWFjYm9va19waW5fY29uZmlncywKKwlbU1RBQ19NQUNNSU5JXSA9IG1hY2Jvb2tfcHJvX3YxX3Bpbl9jb25maWdzLAorCVtTVEFDX01BQ0JPT0tdID0gbWFjYm9va19wcm9fdjFfcGluX2NvbmZpZ3MsCiAJW1NUQUNfTUFDQk9PS19QUk9fVjFdID0gbWFjYm9va19wcm9fdjFfcGluX2NvbmZpZ3MsCiAJW1NUQUNfTUFDQk9PS19QUk9fVjJdID0gbWFjYm9va19wcm9fdjJfcGluX2NvbmZpZ3MsCisJW1NUQUNfSU1BQ19JTlRFTF0gPSBpbWFjX2ludGVsX3Bpbl9jb25maWdzLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnN0YWM5MjJ4X21vZGVsc1tTVEFDXzkyMlhfTU9ERUxTXSA9IHsKQEAgLTU2MCw2ICs1NjIsNyBAQAogCVtTVEFDX01BQ0JPT0tdCT0gIm1hY2Jvb2siLAogCVtTVEFDX01BQ0JPT0tfUFJPX1YxXQk9ICJtYWNib29rLXByby12MSIsCiAJW1NUQUNfTUFDQk9PS19QUk9fVjJdCT0gIm1hY2Jvb2stcHJvIiwKKwlbU1RBQ19JTUFDX0lOVEVMXSA9ICJpbWFjLWludGVsIiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBzdGFjOTIyeF9jZmdfdGJsW10gPSB7CkBAIC04MjAsNiArODIzLDE3IEBACiAJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19jbG9zZShjb2RlYywgJnNwZWMtPm11bHRpb3V0KTsKIH0KIAorc3RhdGljIGludCBzdGFjOTJ4eF9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCQkgdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCisJCQkJCSB1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCQkgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX3ByZXBhcmUoY29kZWMsICZzcGVjLT5tdWx0aW91dCwKKwkJCQkJICAgICBzdHJlYW1fdGFnLCBmb3JtYXQsIHN1YnN0cmVhbSk7Cit9CisKIAogLyoKICAqIEFuYWxvZyBjYXB0dXJlIGNhbGxiYWNrcwpAQCAtODU0LDcgKzg2OCw4IEBACiAJLyogTklEIGlzIHNldCBpbiBzdGFjOTJ4eF9idWlsZF9wY21zICovCiAJLm9wcyA9IHsKIAkJLm9wZW4gPSBzdGFjOTJ4eF9kaWdfcGxheWJhY2tfcGNtX29wZW4sCi0JCS5jbG9zZSA9IHN0YWM5Mnh4X2RpZ19wbGF5YmFja19wY21fY2xvc2UKKwkJLmNsb3NlID0gc3RhYzkyeHhfZGlnX3BsYXliYWNrX3BjbV9jbG9zZSwKKwkJLnByZXBhcmUgPSBzdGFjOTJ4eF9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUKIAl9LAogfTsKIApAQCAtMTA1NSwxMSArMTA3MCwyMyBAQAogc3RhdGljIGludCBzdGFjOTJ4eF9hZGRfZHluX291dF9waW5zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcpCiB7CiAJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwl1bnNpZ25lZCBpbnQgd2NhcHMsIHd0eXBlOworCWludCBpLCBudW1fZGFjcyA9IDA7CisJCisJLyogdXNlIHRoZSB3Y2FwcyBjYWNoZSB0byBjb3VudCBhbGwgREFDcyBhdmFpbGFibGUgZm9yIGxpbmUtb3V0cyAqLworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX25vZGVzOyBpKyspIHsKKwkJd2NhcHMgPSBjb2RlYy0+d2NhcHNbaV07CisJCXd0eXBlID0gKHdjYXBzICYgQUNfV0NBUF9UWVBFKSA+PiBBQ19XQ0FQX1RZUEVfU0hJRlQ7CisJCWlmICh3dHlwZSA9PSBBQ19XSURfQVVEX09VVCAmJiAhKHdjYXBzICYgQUNfV0NBUF9ESUdJVEFMKSkKKwkJCW51bV9kYWNzKys7CisJfQogCisJc25kX3ByaW50ZGQoIiVzOiB0b3RhbCBkYWMgY291bnQ9JWRcbiIsIF9fZnVuY19fLCBudW1fZGFjcyk7CisJCiAJc3dpdGNoIChjZmctPmxpbmVfb3V0cykgewogCWNhc2UgMzoKIAkJLyogYWRkIGxpbmUtaW4gYXMgc2lkZSAqLwotCQlpZiAoY2ZnLT5pbnB1dF9waW5zW0FVVE9fUElOX0xJTkVdKSB7CisJCWlmIChjZmctPmlucHV0X3BpbnNbQVVUT19QSU5fTElORV0gJiYgbnVtX2RhY3MgPiAzKSB7CiAJCQljZmctPmxpbmVfb3V0X3BpbnNbM10gPSBjZmctPmlucHV0X3BpbnNbQVVUT19QSU5fTElORV07CiAJCQlzcGVjLT5saW5lX3N3aXRjaCA9IDE7CiAJCQljZmctPmxpbmVfb3V0cysrOwpAQCAtMTA2NywxMiArMTA5NCwxMiBAQAogCQlicmVhazsKIAljYXNlIDI6CiAJCS8qIGFkZCBsaW5lLWluIGFzIGNsZmUgYW5kIG1pYyBhcyBzaWRlICovCi0JCWlmIChjZmctPmlucHV0X3BpbnNbQVVUT19QSU5fTElORV0pIHsKKwkJaWYgKGNmZy0+aW5wdXRfcGluc1tBVVRPX1BJTl9MSU5FXSAmJiBudW1fZGFjcyA+IDIpIHsKIAkJCWNmZy0+bGluZV9vdXRfcGluc1syXSA9IGNmZy0+aW5wdXRfcGluc1tBVVRPX1BJTl9MSU5FXTsKIAkJCXNwZWMtPmxpbmVfc3dpdGNoID0gMTsKIAkJCWNmZy0+bGluZV9vdXRzKys7CiAJCX0KLQkJaWYgKGNmZy0+aW5wdXRfcGluc1tBVVRPX1BJTl9NSUNdKSB7CisJCWlmIChjZmctPmlucHV0X3BpbnNbQVVUT19QSU5fTUlDXSAmJiBudW1fZGFjcyA+IDMpIHsKIAkJCWNmZy0+bGluZV9vdXRfcGluc1szXSA9IGNmZy0+aW5wdXRfcGluc1tBVVRPX1BJTl9NSUNdOwogCQkJc3BlYy0+bWljX3N3aXRjaCA9IDE7CiAJCQljZmctPmxpbmVfb3V0cysrOwpAQCAtMTA4MCwxMiArMTEwNywxMiBAQAogCQlicmVhazsKIAljYXNlIDE6CiAJCS8qIGFkZCBsaW5lLWluIGFzIHN1cnIgYW5kIG1pYyBhcyBjbGZlICovCi0JCWlmIChjZmctPmlucHV0X3BpbnNbQVVUT19QSU5fTElORV0pIHsKKwkJaWYgKGNmZy0+aW5wdXRfcGluc1tBVVRPX1BJTl9MSU5FXSAmJiBudW1fZGFjcyA+IDEpIHsKIAkJCWNmZy0+bGluZV9vdXRfcGluc1sxXSA9IGNmZy0+aW5wdXRfcGluc1tBVVRPX1BJTl9MSU5FXTsKIAkJCXNwZWMtPmxpbmVfc3dpdGNoID0gMTsKIAkJCWNmZy0+bGluZV9vdXRzKys7CiAJCX0KLQkJaWYgKGNmZy0+aW5wdXRfcGluc1tBVVRPX1BJTl9NSUNdKSB7CisJCWlmIChjZmctPmlucHV0X3BpbnNbQVVUT19QSU5fTUlDXSAmJiBudW1fZGFjcyA+IDIpIHsKIAkJCWNmZy0+bGluZV9vdXRfcGluc1syXSA9IGNmZy0+aW5wdXRfcGluc1tBVVRPX1BJTl9NSUNdOwogCQkJc3BlYy0+bWljX3N3aXRjaCA9IDE7CiAJCQljZmctPmxpbmVfb3V0cysrOwpAQCAtMTA5NiwzMyArMTEyMyw3NiBAQAogCXJldHVybiAwOwogfQogCisKK3N0YXRpYyBpbnQgaXNfaW5fZGFjX25pZHMoc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBuaWQpCit7CisJaW50IGk7CisJCisJZm9yIChpID0gMDsgaSA8IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzOyBpKyspIHsKKwkJaWYgKHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID09IG5pZCkKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCiAvKgotICogWFhYIFRoZSBsaW5lX291dCBwaW4gd2lkZ2V0IGNvbm5lY3Rpb24gbGlzdCBtYXkgbm90IGJlIHNldCB0byB0aGUKLSAqIGRlc2lyZWQgREFDIG5pZC4gVGhpcyBpcyB0aGUgY2FzZSBvbiA5Mjd4IHdoZXJlIHBvcnRzIEEgYW5kIEIgY2FuCi0gKiBiZSByb3V0ZWQgdG8gc2V2ZXJhbCBEQUNzLgotICoKLSAqIFRoaXMgcmVxdWlyZXMgYW4gYW5hbHlzaXMgb2YgdGhlIGxpbmUtb3V0L2hwIHBpbiBjb25maWd1cmF0aW9uCi0gKiB0byBwcm92aWRlIGEgYmVzdCBmaXQgZm9yIHBpbi9EQUMgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgcm91dGFibGUuCi0gKiBGb3Igbm93LCA5Mjd4IERBQzQgaXMgbm90IHN1cHBvcnRlZCBhbmQgOTI3eCBEQUMxIG91dHB1dCB0byBwb3J0cwotICogQSBhbmQgQiBpcyBub3Qgc3VwcG9ydGVkLgorICogRmlsbCBpbiB0aGUgZGFjX25pZHMgdGFibGUgZnJvbSB0aGUgcGFyc2VkIHBpbiBjb25maWd1cmF0aW9uCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2hlbiBldmVyeSBwaW4gaW4gbGluZV9vdXRfcGluc1tdCisgKiBjb250YWlucyBhdGxlYXN0IG9uZSBEQUMgaW4gaXRzIGNvbm5lY3Rpb24gbGlzdC4gU29tZSA5Mnh4CisgKiBjb2RlY3MgYXJlIG5vdCBjb25uZWN0ZWQgZGlyZWN0bHkgdG8gYSBEQUMsIHN1Y2ggYXMgdGhlIDkyMDAKKyAqIGFuZCA5MjAyLzkyNXguIEZvciB0aG9zZSwgZGFjX25pZHNbXSBtdXN0IGJlIGhhcmQtY29kZWQuCiAgKi8KLS8qIGZpbGwgaW4gdGhlIGRhY19uaWRzIHRhYmxlIGZyb20gdGhlIHBhcnNlZCBwaW4gY29uZmlndXJhdGlvbiAqLwogc3RhdGljIGludCBzdGFjOTJ4eF9hdXRvX2ZpbGxfZGFjX25pZHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZykKIHsKIAlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBuaWQ7Ci0JaW50IGk7Ci0KLQkvKiBjaGVjayB0aGUgcGlucyBoYXJkd2lyZWQgdG8gYXVkaW8gd2lkZ2V0ICovCisJaW50IGksIGosIGNvbm5fbGVuID0gMDsgCisJaGRhX25pZF90IG5pZCwgY29ubltIREFfTUFYX0NPTk5FQ1RJT05TXTsKKwl1bnNpZ25lZCBpbnQgd2NhcHMsIHd0eXBlOworCQogCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7CiAJCW5pZCA9IGNmZy0+bGluZV9vdXRfcGluc1tpXTsKLQkJc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbaV0gPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJQUNfVkVSQl9HRVRfQ09OTkVDVF9MSVNULCAwKSAmIDB4ZmY7CisJCWNvbm5fbGVuID0gc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIG5pZCwgY29ubiwKKwkJCQkJCSAgIEhEQV9NQVhfQ09OTkVDVElPTlMpOworCQlmb3IgKGogPSAwOyBqIDwgY29ubl9sZW47IGorKykgeworCQkJd2NhcHMgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIGNvbm5bal0sCisJCQkJCQkgICBBQ19QQVJfQVVESU9fV0lER0VUX0NBUCk7CisJCQl3dHlwZSA9ICh3Y2FwcyAmIEFDX1dDQVBfVFlQRSkgPj4gQUNfV0NBUF9UWVBFX1NISUZUOworCisJCQlpZiAod3R5cGUgIT0gQUNfV0lEX0FVRF9PVVQgfHwKKwkJCSAgICAod2NhcHMgJiBBQ19XQ0FQX0RJR0lUQUwpKQorCQkJCWNvbnRpbnVlOworCQkJLyogY29ubltqXSBpcyBhIERBQyByb3V0ZWQgdG8gdGhpcyBsaW5lLW91dCAqLworCQkJaWYgKCFpc19pbl9kYWNfbmlkcyhzcGVjLCBjb25uW2pdKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChqID09IGNvbm5fbGVuKSB7CisJCQkvKiBlcnJvciBvdXQsIG5vIGF2YWlsYWJsZSBEQUMgZm91bmQgKi8KKwkJCXNuZF9wcmludGsoS0VSTl9FUlIKKwkJCQkgICAiJXM6IE5vIGF2YWlsYWJsZSBEQUMgZm9yIHBpbiAweCV4XG4iLAorCQkJCSAgIF9fZnVuY19fLCBuaWQpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1tpXSA9IGNvbm5bal07CisJCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzKys7CisJCWlmIChjb25uX2xlbiA+IDEpIHsKKwkJCS8qIHNlbGVjdCB0aGlzIERBQyBpbiB0aGUgcGluJ3MgaW5wdXQgbXV4ICovCisJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCisJCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgaik7CisKKwkJfQogCX0KIAotCXNwZWMtPm11bHRpb3V0Lm51bV9kYWNzID0gY2ZnLT5saW5lX291dHM7Ci0KKwlzbmRfcHJpbnRkKCJkYWNfbmlkcz0lZCAoMHgleC8weCV4LzB4JXgvMHgleC8weCV4KVxuIiwKKwkJICAgc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MsCisJCSAgIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdLAorCQkgICBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1sxXSwKKwkJICAgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMl0sCisJCSAgIHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzNdLAorCQkgICBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1s0XSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExODksMTIgKzEyNTksOCBAQAogCiBzdGF0aWMgaW50IGNoZWNrX2luX2RhY19uaWRzKHN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjLCBoZGFfbmlkX3QgbmlkKQogewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzOyBpKyspIHsKLQkJaWYgKHNwZWMtPm11bHRpb3V0LmRhY19uaWRzW2ldID09IG5pZCkKLQkJCXJldHVybiAxOwotCX0KKwlpZiAoaXNfaW5fZGFjX25pZHMoc3BlYywgbmlkKSkKKwkJcmV0dXJuIDE7CiAJaWYgKHNwZWMtPm11bHRpb3V0LmhwX25pZCA9PSBuaWQpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwpAQCAtMTIzNiwxMiArMTMwMiwxMCBAQAogCQlhZGRfc3BlY19kYWNzKHNwZWMsIG5pZCk7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBjZmctPnNwZWFrZXJfb3V0czsgaSsrKSB7Ci0JCW5pZCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY2ZnLT5zcGVha2VyX3BpbnNbMF0sIDAsCisJCW5pZCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY2ZnLT5zcGVha2VyX3BpbnNbaV0sIDAsCiAJCQkJCSBBQ19WRVJCX0dFVF9DT05ORUNUX0xJU1QsIDApICYgMHhmZjsKIAkJaWYgKGNoZWNrX2luX2RhY19uaWRzKHNwZWMsIG5pZCkpCiAJCQluaWQgPSAwOwotCQlpZiAoY2hlY2tfaW5fZGFjX25pZHMoc3BlYywgbmlkKSkKLQkJCW5pZCA9IDA7CiAJCWlmICghIG5pZCkKIAkJCWNvbnRpbnVlOwogCQlhZGRfc3BlY19kYWNzKHNwZWMsIG5pZCk7CkBAIC0xMzU1LDcgKzE0MTksNyBAQAogCQlpbXV4LT5udW1faXRlbXMrKzsKIAl9CiAKLQlpZiAoaW11eC0+bnVtX2l0ZW1zID09IDEpIHsKKwlpZiAoaW11eC0+bnVtX2l0ZW1zKSB7CiAJCS8qCiAJCSAqIFNldCB0aGUgY3VycmVudCBpbnB1dCBmb3IgdGhlIG11eGVzLgogCQkgKiBUaGUgU1RBQzkyMjEgaGFzIHR3byBpbnB1dCBtdXhlcyB3aXRoIGlkZW50aWNhbCBzb3VyY2UKQEAgLTE2NzUsOCArMTczOSwxMiBAQAogewogCXVuc2lnbmVkIGludCBwaW5fY3RsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsCiAJCQkwLCBBQ19WRVJCX0dFVF9QSU5fV0lER0VUX0NPTlRST0wsIDB4MDApOwotCWlmIChmbGFnID09IEFDX1BJTkNUTF9PVVRfRU4gJiYgKHBpbl9jdGwgJiBBQ19QSU5DVExfSU5fRU4pKQotCQlyZXR1cm47CisKKwkvKiBpZiBzZXR0aW5nIHBpbiBkaXJlY3Rpb24gYml0cywgY2xlYXIgdGhlIGN1cnJlbnQKKwkgICBkaXJlY3Rpb24gYml0cyBmaXJzdCAqLworCWlmIChmbGFnICYgKEFDX1BJTkNUTF9JTl9FTiB8IEFDX1BJTkNUTF9PVVRfRU4pKQorCQlwaW5fY3RsICY9IH4oQUNfUElOQ1RMX0lOX0VOIHwgQUNfUElOQ1RMX09VVF9FTik7CisJCiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAogCQkJQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLAogCQkJcGluX2N0bCB8IGZsYWcpOwpAQCAtMTc1MSw2ICsxODE5LDcgQEAKIAogCXN0YWM5Mnh4X2luaXQoY29kZWMpOwogCXN0YWM5Mnh4X3NldF9jb25maWdfcmVncyhjb2RlYyk7CisJc25kX2hkYV9yZXN1bWVfY3Rscyhjb2RlYywgc3BlYy0+bWl4ZXIpOwogCWZvciAoaSA9IDA7IGkgPCBzcGVjLT5udW1fbWl4ZXJzOyBpKyspCiAJCXNuZF9oZGFfcmVzdW1lX2N0bHMoY29kZWMsIHNwZWMtPm1peGVyc1tpXSk7CiAJaWYgKHNwZWMtPm11bHRpb3V0LmRpZ19vdXRfbmlkKQpAQCAtMTkwNSwxMiArMTk3NCwxOCBAQAogCQkgKi8KIAkJcHJpbnRrKEtFUk5fSU5GTyAiaGRhX2NvZGVjOiBTVEFDOTIyeCwgQXBwbGUgc3Vic3lzX2lkPSV4XG4iLCBjb2RlYy0+c3Vic3lzdGVtX2lkKTsKIAkJc3dpdGNoIChjb2RlYy0+c3Vic3lzdGVtX2lkKSB7CisJCWNhc2UgMHgxMDZiMGEwMDogLyogTWFjQm9vayBGaXJzdCBnZW5lcmF0b2luICovCisJCQlzcGVjLT5ib2FyZF9jb25maWcgPSBTVEFDX01BQ0JPT0s7CisJCQlicmVhazsKIAkJY2FzZSAweDEwNmIwMjAwOiAvKiBNYWNCb29rIFBybyBmaXJzdCBnZW5lcmF0aW9uICovCiAJCQlzcGVjLT5ib2FyZF9jb25maWcgPSBTVEFDX01BQ0JPT0tfUFJPX1YxOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgxMDZiMWUwMDogLyogTWFjQm9vayBQcm8gc2Vjb25kIGdlbmVyYXRpb24gKi8KIAkJCXNwZWMtPmJvYXJkX2NvbmZpZyA9IFNUQUNfTUFDQk9PS19QUk9fVjI7CiAJCQlicmVhazsKKwkJY2FzZSAweDEwNmIwNzAwOiAvKiBJbnRlbC1iYXNlZCBpTWFjICovCisJCQlzcGVjLT5ib2FyZF9jb25maWcgPSBTVEFDX0lNQUNfSU5URUw7CisJCQlicmVhazsKIAkJfQogCX0KIApAQCAtMTkzMSw3ICsyMDA2LDcgQEAKIAogCXNwZWMtPmFkY19uaWRzID0gc3RhYzkyMnhfYWRjX25pZHM7CiAJc3BlYy0+bXV4X25pZHMgPSBzdGFjOTIyeF9tdXhfbmlkczsKLQlzcGVjLT5udW1fbXV4ZXMgPSAyOworCXNwZWMtPm51bV9tdXhlcyA9IEFSUkFZX1NJWkUoc3RhYzkyMnhfbXV4X25pZHMpOwogCXNwZWMtPm51bV9kbWljcyA9IDA7CiAKIAlzcGVjLT5pbml0ID0gc3RhYzkyMnhfY29yZV9pbml0OwpAQCAtMTk5Miw3ICsyMDY3LDcgQEAKIAljYXNlIFNUQUNfRDk2NV8zU1Q6CiAJCXNwZWMtPmFkY19uaWRzID0gc3RhYzkyN3hfYWRjX25pZHM7CiAJCXNwZWMtPm11eF9uaWRzID0gc3RhYzkyN3hfbXV4X25pZHM7Ci0JCXNwZWMtPm51bV9tdXhlcyA9IDM7CisJCXNwZWMtPm51bV9tdXhlcyA9IEFSUkFZX1NJWkUoc3RhYzkyN3hfbXV4X25pZHMpOwogCQlzcGVjLT5udW1fZG1pY3MgPSAwOwogCQlzcGVjLT5pbml0ID0gZDk2NV9jb3JlX2luaXQ7CiAJCXNwZWMtPm1peGVyID0gc3RhYzkyMjdfbWl4ZXI7CkBAIC0yMDAwLDcgKzIwNzUsNyBAQAogCWNhc2UgU1RBQ19EOTY1XzVTVDoKIAkJc3BlYy0+YWRjX25pZHMgPSBzdGFjOTI3eF9hZGNfbmlkczsKIAkJc3BlYy0+bXV4X25pZHMgPSBzdGFjOTI3eF9tdXhfbmlkczsKLQkJc3BlYy0+bnVtX211eGVzID0gMzsKKwkJc3BlYy0+bnVtX211eGVzID0gQVJSQVlfU0laRShzdGFjOTI3eF9tdXhfbmlkcyk7CiAJCXNwZWMtPm51bV9kbWljcyA9IDA7CiAJCXNwZWMtPmluaXQgPSBkOTY1X2NvcmVfaW5pdDsKIAkJc3BlYy0+bWl4ZXIgPSBzdGFjOTIyN19taXhlcjsKQEAgLTIwMDgsNyArMjA4Myw3IEBACiAJZGVmYXVsdDoKIAkJc3BlYy0+YWRjX25pZHMgPSBzdGFjOTI3eF9hZGNfbmlkczsKIAkJc3BlYy0+bXV4X25pZHMgPSBzdGFjOTI3eF9tdXhfbmlkczsKLQkJc3BlYy0+bnVtX211eGVzID0gMzsKKwkJc3BlYy0+bnVtX211eGVzID0gQVJSQVlfU0laRShzdGFjOTI3eF9tdXhfbmlkcyk7CiAJCXNwZWMtPm51bV9kbWljcyA9IDA7CiAJCXNwZWMtPmluaXQgPSBzdGFjOTI3eF9jb3JlX2luaXQ7CiAJCXNwZWMtPm1peGVyID0gc3RhYzkyN3hfbWl4ZXI7CkBAIC0yMDY3LDkgKzIxNDIsOSBAQAogCiAJc3BlYy0+YWRjX25pZHMgPSBzdGFjOTIwNV9hZGNfbmlkczsKIAlzcGVjLT5tdXhfbmlkcyA9IHN0YWM5MjA1X211eF9uaWRzOwotCXNwZWMtPm51bV9tdXhlcyA9IDI7CisJc3BlYy0+bnVtX211eGVzID0gQVJSQVlfU0laRShzdGFjOTIwNV9tdXhfbmlkcyk7CiAJc3BlYy0+ZG1pY19uaWRzID0gc3RhYzkyMDVfZG1pY19uaWRzOwotCXNwZWMtPm51bV9kbWljcyA9IDI7CisJc3BlYy0+bnVtX2RtaWNzID0gQVJSQVlfU0laRShzdGFjOTIwNV9kbWljX25pZHMpOwogCXNwZWMtPmRtdXhfbmlkID0gMHgxZDsKIAogCXNwZWMtPmluaXQgPSBzdGFjOTIwNV9jb3JlX2luaXQ7CkBAIC0yMjk0LDYgKzIzNjksNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxZTYsICJTb255IFZBSU8gRi9TIiwgQ1hEOTg3MlJEX1ZBSU8pLAogCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxZWYsICJTb255IFZBSU8gRi9TIiwgQ1hEOTg3MlJEX1ZBSU8pLAogCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgxZmQsICJTb255IFZBSU8gQVIiLCBDWEQ5ODcyQUtEX1ZBSU8pLAorCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDgyMDUsICJTb255IFZBSU8gQVIiLCBDWEQ5ODcyQUtEX1ZBSU8pLAogCXt9CiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYwppbmRleCAyYjExYWM4Li5iYTMyZDFlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKQEAgLTM3Nyw2ICszNzcsMTcgQEAKIAlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX2Nsb3NlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOwogfQogCitzdGF0aWMgaW50IHZpYV9kaWdfcGxheWJhY2tfcGNtX3ByZXBhcmUoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKKwkJCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJCXVuc2lnbmVkIGludCBzdHJlYW1fdGFnLAorCQkJCQl1bnNpZ25lZCBpbnQgZm9ybWF0LAorCQkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX3ByZXBhcmUoY29kZWMsICZzcGVjLT5tdWx0aW91dCwKKwkJCQkJICAgICBzdHJlYW1fdGFnLCBmb3JtYXQsIHN1YnN0cmVhbSk7Cit9CisKIC8qCiAgKiBBbmFsb2cgY2FwdHVyZQogICovCkBAIC00MzMsNyArNDQ0LDggQEAKIAkvKiBOSUQgaXMgc2V0IGluIHZpYV9idWlsZF9wY21zICovCiAJLm9wcyA9IHsKIAkJLm9wZW4gPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9vcGVuLAotCQkuY2xvc2UgPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9jbG9zZQorCQkuY2xvc2UgPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9jbG9zZSwKKwkJLnByZXBhcmUgPSB2aWFfZGlnX3BsYXliYWNrX3BjbV9wcmVwYXJlCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2FtcC5jIGIvc291bmQvcGNpL2ljZTE3MTIvYW1wLmMKaW5kZXggNmUyMmQzMi4uNDRiYmI2MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvYW1wLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYW1wLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAogCiAvKiBlbnRyeSBwb2ludCAqLwotY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X2FtcF9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfYW1wX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX0FWNzEwLAogCQkubmFtZSA9ICJDaGFpbnRlY2ggQVYtNzEwIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2FtcC5oIGIvc291bmQvcGNpL2ljZTE3MTIvYW1wLmgKaW5kZXggN2I2NjdiYS4uYTBmYzg5YiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvYW1wLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYW1wLmgKQEAgLTQyLDcgKzQyLDcgQEAKICNkZWZpbmUgV01fREFDX0NUUkwJMHgwMgogI2RlZmluZSBXTV9JTlRfQ1RSTAkweDAzCiAKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICBzbmRfdnQxNzI0X2FtcF9jYXJkc1tdOworZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjRfYW1wX2NhcmRzW107CiAKIAogI2VuZGlmIC8qIF9fU09VTkRfQU1QX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMKaW5kZXggNjk0MWQ4NS4uNjZiYWNkZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmMKQEAgLTE0MTEsNyArMTQxMSw3IEBACiAgKiBtaXhlcnMKICAqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYXVyZW9uX2RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYXVyZW9uX2RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCkBAIC0xNTI2LDcgKzE1MjYsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd21fY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogIAl7CiAgCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiUENNIFBsYXliYWNrIFN3aXRjaCIsCkBAIC0xNTkyLDcgKzE1OTIsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhYzk3X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhYzk3X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKICAJewogIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIkFDOTcgUGxheWJhY2sgU3dpdGNoIiwKQEAgLTE2OTcsNyArMTY5Nyw3IEBACiAgCX0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB1bml2ZXJzZV9hYzk3X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB1bml2ZXJzZV9hYzk3X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKICAJewogIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIkFDOTcgUGxheWJhY2sgU3dpdGNoIiwKQEAgLTE4MjksNyArMTgyOSw3IEBACiAKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjczg0MTVfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNzODQxNV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsQ0FQVFVSRSxTV0lUQ0gpLApAQCAtMjEwNyw3ICsyMTA3LDcgQEAKICAqIGhlbmNlIHRoZSBkcml2ZXIgbmVlZHMgdG8gc2V0cyB1cCBpdCBwcm9wZXJseS4KICAqLwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhdXJlb241MV9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXVyZW9uNTFfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKIAlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgwYSwJLyogY2xvY2sgNTEyLCBzcGRpZi1pbi9BREMsIDNEQUNzICovCiAJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4ODAsCS8qIEkyUyAqLwogCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweGZjLAkvKiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KQEAgLTIxMjMsNyArMjEyMyw3IEBACiAJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MDAsCiB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhdXJlb243MV9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXVyZW9uNzFfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKIAlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgwYiwJLyogY2xvY2sgNTEyLCBzcGRpZi1pbi9BREMsIDREQUNzICovCiAJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4ODAsCS8qIEkyUyAqLwogCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweGZjLAkvKiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KQEAgLTIxNDAsNyArMjE0MCw3IEBACiB9OwogI2RlZmluZSBwcm9kaWd5NzFfZWVwcm9tIGF1cmVvbjcxX2VlcHJvbQogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwcm9kaWd5NzFsdF9lZXByb21bXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHVuc2lnbmVkIGNoYXIgcHJvZGlneTcxbHRfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKIAlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHg0YiwJLyogY2xvY2sgMzg0LCBzcGRpZi1pbi9BREMsIDREQUNzICovCiAJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4ODAsCS8qIEkyUyAqLwogCVtJQ0VfRUVQMl9JMlNdICAgICAgICAgPSAweGZjLAkvKiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KQEAgLTIxNTgsNyArMjE1OCw3IEBACiAjZGVmaW5lIHByb2RpZ3k3MXh0X2VlcHJvbSBwcm9kaWd5NzFsdF9lZXByb20KIAogLyogZW50cnkgcG9pbnQgKi8KLWNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9hdXJlb25fY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X2F1cmVvbl9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuc3VidmVuZG9yID0gVlQxNzI0X1NVQkRFVklDRV9BVVJFT041MV9TS1ksCiAJCS5uYW1lID0gIlRlcnJhdGVjIEF1cmVvbiA1LjEtU2t5IiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5oIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmgKaW5kZXggNzllNThlOC4uYzI1M2I4ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvYXVyZW9uLmgKQEAgLTM4LDcgKzM4LDcgQEAKICNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVAkweDMyMzE1NDQxCS8qIFBST0RJR1kgNy4xIExUICovCiAjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfUFJPRElHWTcxWFQJMHgzNjMxNTQ0MQkvKiBQUk9ESUdZIDcuMSBYVCovCiAKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICBzbmRfdnQxNzI0X2F1cmVvbl9jYXJkc1tdOworZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjRfYXVyZW9uX2NhcmRzW107CiAKIC8qIEdQSU8gYml0cyAqLwogI2RlZmluZSBBVVJFT05fQ1M4NDE1X0NTCSgxIDw8IDIyKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmMKaW5kZXggM2VlYjM2Yy4uYWY2NTk4MCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5jCkBAIC00MTYsNyArNDE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhMTAxMGx0X3dvcmRjbG9ja19zdGF0dXMgX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGExMDEwbHRfd29yZGNsb2NrX3N0YXR1cyBfX2RldmluaXRkYXRhID0KIHsKIAkuYWNjZXNzID0JKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEKSwKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKQEAgLTQyOSw3ICs0MjksNyBAQAogICogaW5pdGlhbGl6ZSB0aGUgY2hpcHMgb24gTS1BdWRpbyBjYXJkcwogICovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2F1ZGlvcGhpbGUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2F1ZGlvcGhpbGUgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzQ1MjgsCiAJLm51bV9hZGNzID0gMiwKIAkubnVtX2RhY3MgPSAyLApAQCAtNDM4LDcgKzQzOCw3IEBACiAJfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2F1ZGlvcGhpbGVfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2F1ZGlvcGhpbGVfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDIsCiAJLmNpZiA9IDAsCiAJLmRhdGFfbWFzayA9IElDRTE3MTJfREVMVEFfQVBfRE9VVCwKQEAgLTQ1MCw3ICs0NTAsNyBAQAogCS5tYXNrX2ZsYWdzID0gMCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2RlbHRhNDEwIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9kZWx0YTQxMCBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDUyOSwKIAkubnVtX2FkY3MgPSAyLAogCS5udW1fZGFjcyA9IDgsCkBAIC00NTksNyArNDU5LDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZGVsdGE0MTBfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2RlbHRhNDEwX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAwLAogCS5jaWYgPSAwLAogCS5kYXRhX21hc2sgPSBJQ0UxNzEyX0RFTFRBX0FQX0RPVVQsCkBAIC00NzEsNyArNDcxLDcgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9kZWx0YTEwMTBsdCBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fZGVsdGExMDEwbHQgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzQ1MjQsCiAJLm51bV9hZGNzID0gOCwKIAkubnVtX2RhY3MgPSA4LApAQCAtNDgxLDcgKzQ4MSw3IEBACiAJfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2RlbHRhMTAxMGx0X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9kZWx0YTEwMTBsdF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMiwKIAkuY2lmID0gMCwgLyogdGhlIGRlZmF1bHQgbGV2ZWwgb2YgdGhlIENJRiBwaW4gZnJvbSBBSzQ1MjQgKi8KIAkuZGF0YV9tYXNrID0gSUNFMTcxMl9ERUxUQV8xMDEwTFRfRE9VVCwKQEAgLTQ5Myw3ICs0OTMsNyBAQAogCS5tYXNrX2ZsYWdzID0gMCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2RlbHRhNDQgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2RlbHRhNDQgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzQ1MjQsCiAJLm51bV9hZGNzID0gNCwKIAkubnVtX2RhY3MgPSA0LApAQCAtNTAzLDcgKzUwMyw3IEBACiAJfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2RlbHRhNDRfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2RlbHRhNDRfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDIsCiAJLmNpZiA9IDAsIC8qIHRoZSBkZWZhdWx0IGxldmVsIG9mIHRoZSBDSUYgcGluIGZyb20gQUs0NTI0ICovCiAJLmRhdGFfbWFzayA9IElDRTE3MTJfREVMVEFfQ09ERUNfU0VSSUFMX0RBVEEsCkBAIC01MTUsNyArNTE1LDcgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV92eDQ0MiBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fdng0NDIgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzQ1MjQsCiAJLm51bV9hZGNzID0gNCwKIAkubnVtX2RhY3MgPSA0LApAQCAtNTI1LDcgKzUyNSw3IEBACiAJfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Z4NDQyX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV92eDQ0Ml9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMiwKIAkuY2lmID0gMCwKIAkuZGF0YV9tYXNrID0gSUNFMTcxMl9WWDQ0Ml9ET1VULApAQCAtNjUwLDE1ICs2NTAsMTUgQEAKICAqIGFkZGl0aW9uYWwgY29udHJvbHMgZm9yIE0tQXVkaW8gY2FyZHMKICAqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGExMDEwX3dvcmRjbG9ja19zZWxlY3QgX19kZXZpbml0ZGF0YSA9CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGExMDEwX3dvcmRjbG9ja19zZWxlY3QgX19kZXZpbml0ZGF0YSA9CiBJQ0UxNzEyX0dQSU8oU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJXb3JkIENsb2NrIFN5bmMiLCAwLCBJQ0UxNzEyX0RFTFRBX1dPUkRfQ0xPQ0tfU0VMRUNULCAxLCAwKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YTEwMTBsdF93b3JkY2xvY2tfc2VsZWN0IF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhMTAxMGx0X3dvcmRjbG9ja19zZWxlY3QgX19kZXZpbml0ZGF0YSA9CiBJQ0UxNzEyX0dQSU8oU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJXb3JkIENsb2NrIFN5bmMiLCAwLCBJQ0UxNzEyX0RFTFRBXzEwMTBMVF9XT1JEQ0xPQ0ssIDAsIDApOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhMTAxMF93b3JkY2xvY2tfc3RhdHVzIF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhMTAxMF93b3JkY2xvY2tfc3RhdHVzIF9fZGV2aW5pdGRhdGEgPQogSUNFMTcxMl9HUElPKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiV29yZCBDbG9jayBTdGF0dXMiLCAwLCBJQ0UxNzEyX0RFTFRBX1dPUkRfQ0xPQ0tfU1RBVFVTLCAxLCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCB8IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGFkaW8yNDk2X3NwZGlmX2luX3NlbGVjdCBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9kZWx0YWRpbzI0OTZfc3BkaWZfaW5fc2VsZWN0IF9fZGV2aW5pdGRhdGEgPQogSUNFMTcxMl9HUElPKFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAiSUVDOTU4IElucHV0IE9wdGljYWwiLCAwLCBJQ0UxNzEyX0RFTFRBX1NQRElGX0lOUFVUX1NFTEVDVCwgMCwgMCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZGVsdGFfc3BkaWZfaW5fc3RhdHVzIF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2RlbHRhX3NwZGlmX2luX3N0YXR1cyBfX2RldmluaXRkYXRhID0KIElDRTE3MTJfR1BJTyhTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIkRlbHRhIElFQzk1OCBJbnB1dCBTdGF0dXMiLCAwLCBJQ0UxNzEyX0RFTFRBX1NQRElGX0lOX1NUQVQsIDEsIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFKTsKIAogCkBAIC03MzUsNyArNzM1LDcgQEAKIAogCiAvKiBlbnRyeSBwb2ludCAqLwotY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9kZWx0YV9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2RlbHRhX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBJQ0UxNzEyX1NVQkRFVklDRV9ERUxUQTEwMTAsCiAJCS5uYW1lID0gIk0gQXVkaW8gRGVsdGEgMTAxMCIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5oIGIvc291bmQvcGNpL2ljZTE3MTIvZGVsdGEuaAppbmRleCBlNDc4NjFjLi4yNjk3MTU2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9kZWx0YS5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2RlbHRhLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKICNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfTUVESUFTVEFUSU9OCTB4Njk0YzAxMDAKIAogLyogZW50cnkgcG9pbnQgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2RlbHRhX2NhcmRzW107CitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9kZWx0YV9jYXJkc1tdOwogCiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCmluZGV4IDliN2ZmMzAuLmIxMzUzODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCkBAIC0zMzIsNyArMzMyLDcgQEAKIAogLyoKICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fZXdzODhtdCBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fZXdzODhtdCBfX2RldmluaXRkYXRhID0gewogCS5udW1fYWRjcyA9IDgsCiAJLm51bV9kYWNzID0gOCwKIAkudHlwZSA9IFNORF9BSzQ1MjQsCkBAIC0zNDIsNyArMzQyLDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZXdzODhtdF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fZXdzODhtdF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMiwKIAkuY2lmID0gMSwgLyogQ0lGIGhpZ2ggKi8KIAkuZGF0YV9tYXNrID0gSUNFMTcxMl9FV1M4OF9TRVJJQUxfREFUQSwKQEAgLTM1NCw3ICszNTQsNyBAQAogCS5tYXNrX2ZsYWdzID0gMCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2V3eDI0OTYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2V3eDI0OTYgX19kZXZpbml0ZGF0YSA9IHsKIAkubnVtX2FkY3MgPSAyLAogCS5udW1fZGFjcyA9IDIsCiAJLnR5cGUgPSBTTkRfQUs0NTI0LApAQCAtMzYzLDcgKzM2Myw3IEBACiAJfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2V3eDI0OTZfcHJpdiBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX2V3eDI0OTZfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDIsCiAJLmNpZiA9IDEsIC8qIENJRiBoaWdoICovCiAJLmRhdGFfbWFzayA9IElDRTE3MTJfRVdTODhfU0VSSUFMX0RBVEEsCkBAIC0zNzUsNyArMzc1LDcgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV82ZmlyZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fNmZpcmUgX19kZXZpbml0ZGF0YSA9IHsKIAkubnVtX2FkY3MgPSA2LAogCS5udW1fZGFjcyA9IDYsCiAJLnR5cGUgPSBTTkRfQUs0NTI0LApAQCAtMzg0LDcgKzM4NCw3IEBACiAJfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttXzZmaXJlX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV82ZmlyZV9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMiwKIAkuY2lmID0gMSwgLyogQ0lGIGhpZ2ggKi8KIAkuZGF0YV9tYXNrID0gSUNFMTcxMl82RklSRV9TRVJJQUxfREFUQSwKQEAgLTU3OCw3ICs1NzgsNyBAQAogCXJldHVybiB2YWwgIT0gbnZhbDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2V3eDI0OTZfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2V3eDI0OTZfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIklucHV0IFNlbnNpdGl2aXR5IFN3aXRjaCIsCkBAIC02NzgsNyArNjc4LDcgQEAKIAlyZXR1cm4gbmRhdGEgIT0gZGF0YTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2V3czg4bXRfaW5wdXRfc2Vuc2UgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9ld3M4OG10X2lucHV0X3NlbnNlIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiSW5wdXQgU2Vuc2l0aXZpdHkgU3dpdGNoIiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX2V3eF9pb19zZW5zZV9pbmZvLApAQCAtNjg3LDcgKzY4Nyw3IEBACiAJLmNvdW50ID0gOCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9ld3M4OG10X291dHB1dF9zZW5zZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2V3czg4bXRfb3V0cHV0X3NlbnNlIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiT3V0cHV0IFNlbnNpdGl2aXR5IFN3aXRjaCIsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9ld3hfaW9fc2Vuc2VfaW5mbywKQEAgLTc2OSw3ICs3NjksNyBAQAogICAucHJpdmF0ZV92YWx1ZSA9IHhzaGlmdCB8ICh4aW52ZXJ0IDw8IDgpLFwKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX2V3czg4ZF9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfZXdzODhkX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIAlFV1M4OERfQ09OVFJPTChTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgIklFQzk1OCBJbnB1dCBPcHRpY2FsIiwgMCwgMSwgMCksIC8qIGludmVydGVkICovCiAJRVdTODhEX0NPTlRST0woU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJBREFUIE91dHB1dCBPcHRpY2FsIiwgMSwgMCwgMCksCiAJRVdTODhEX0NPTlRST0woU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsICJBREFUIEV4dGVybmFsIE1hc3RlciBDbG9jayIsIDIsIDAsIDApLApAQCAtOTA5LDcgKzkwOSw3IEBACiAgIC5wcml2YXRlX3ZhbHVlID0geHNoaWZ0IHwgKHhpbnZlcnQgPDwgOCksXAogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfNmZpcmVfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyXzZmaXJlX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkubmFtZSA9ICJBbmFsb2cgSW5wdXQgU2VsZWN0IiwKQEAgLTk4OSw3ICs5ODksNyBAQAogCiAKIC8qIGVudHJ5IHBvaW50ICovCi1jb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2V3c19jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2V3c19jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfRVdYMjQ5NiwKIAkJLm5hbWUgPSAiVGVycmFUZWMgRVdYMjQvOTYiLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvZXdzLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuaAppbmRleCBkZjQ0OWI0Li5hMTJhMGIwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuaApAQCAtNDAsNyArNDAsNyBAQAogI2RlZmluZSBJQ0UxNzEyX1NVQkRFVklDRV9QSEFTRTg4CTB4M2IxNTUxMTEKIAogLyogZW50cnkgcG9pbnQgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2V3c19jYXJkc1tdOworZXh0ZXJuIHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfZXdzX2NhcmRzW107CiAKIAogLyogVGVycmFUZWMgRVdYIDI0Lzk2IGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2hvb250ZWNoLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9ob29udGVjaC5jCmluZGV4IGRmOTczMTMuLjgyMDM1NjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2hvb250ZWNoLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guYwpAQCAtMjM5LDcgKzIzOSw3IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfaWNlMTcxMl92YWx1ZV9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCS8qIEhvb250ZWNoIFNURFNQMjQgd2l0aCBtb2RpZmllZCBoYXJkd2FyZSAqLwotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3N0ZHNwMjRfbXYgX19kZXZpbml0ZGF0YSA9IHsKKwlzdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9zdGRzcDI0X212IF9fZGV2aW5pdGRhdGEgPSB7CiAJCS5udW1fYWRjcyA9IDIsCiAJCS5udW1fZGFjcyA9IDIsCiAJCS50eXBlID0gU05EX0FLNDUyNCwKQEAgLTI0OCw3ICsyNDgsNyBAQAogCQl9CiAJfTsKIAotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9zdGRzcDI0X212X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKKwlzdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fc3Rkc3AyNF9tdl9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJCS5jYWRkciA9IDIsCiAJCS5jaWYgPSAxLCAvKiBDSUYgaGlnaCAqLwogCQkuZGF0YV9tYXNrID0gSUNFMTcxMl9TVERTUDI0X1NFUklBTF9EQVRBLApAQCAtMjk4LDcgKzI5OCw3IEBACiAKIAogLyogZW50cnkgcG9pbnQgKi8KLWNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX2ljZTE3MTJfaG9vbnRlY2hfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9ob29udGVjaF9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuc3VidmVuZG9yID0gSUNFMTcxMl9TVUJERVZJQ0VfU1REU1AyNCwKIAkJLm5hbWUgPSAiSG9vbnRlY2ggU291bmRUcmFjayBBdWRpbyBEU1AyNCIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ob29udGVjaC5oIGIvc291bmQvcGNpL2ljZTE3MTIvaG9vbnRlY2guaAppbmRleCBiNjJkNmU0Li4xZWU1MzhiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9ob29udGVjaC5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2hvb250ZWNoLmgKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgSUNFMTcxMl9TVUJERVZJQ0VfU1REU1AyNF9NRURJQTdfMQkweDE2MTQxMjE3CS8qIEhvb250ZWNoIFNUIEF1ZGlvIERTUDI0IE1lZGlhIDcuMSAqLwogI2RlZmluZSBJQ0UxNzEyX1NVQkRFVklDRV9FVkVOVF9FWjgJCTB4MDAwMTAwMDEJLyogQSBkdW1teSBpZCBmb3IgRVo4ICovCiAKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF9pY2UxNzEyX2hvb250ZWNoX2NhcmRzW107CitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfaWNlMTcxMl9ob29udGVjaF9jYXJkc1tdOwogCiAKIC8qIEhvb250ZWNoIFNvdW5kVHJhY2sgQXVkaW8gRFNQIDI0IEdQSU8gZGVmaW5pdGlvbnMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYwppbmRleCA4MzBhMWJiLi42NjMwYTBhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCkBAIC0yODcsNyArMjg3LDcgQEAKIAlyZXR1cm4gdmFsICE9IG52YWw7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9kaWdtaXhfcm91dGVfYWM5NyBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX21peGVyX2RpZ21peF9yb3V0ZV9hYzk3IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiRGlnaXRhbCBNaXhlciBUbyBBQzk3IiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX2RpZ21peF9yb3V0ZV9hYzk3X2luZm8sCkBAIC05NzcsMTEgKzk3Nyw5IEBACiAJewogCQl1bnNpZ25lZCBpbnQgd2hhdCA9IDA7CiAJCXVuc2lnbmVkIGludCBvbGQ7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzOwogCi0JCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLQkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQkJaWYgKHMgPT0gaWNlLT5wbGF5YmFja19wcm9fc3Vic3RyZWFtKSB7CiAJCQkJd2hhdCB8PSBJQ0UxNzEyX1BMQVlCQUNLX1NUQVJUOwogCQkJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7CkBAIC0xMzgwLDcgKzEzNzgsNyBAQAogCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfcGxheWJhY2ssIC0xNDQwMCwgMTUwLCAwKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX211bHRpX3BsYXliYWNrX2N0cmxzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9wbGF5YmFja19jdHJsc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiTXVsdGkgUGxheWJhY2sgU3dpdGNoIiwKQEAgLTE0MDQsNyArMTQwMiw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX2FuYWxvZ19zd2l0Y2ggX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX2FuYWxvZ19zd2l0Y2ggX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJIL1cgTXVsdGkgQ2FwdHVyZSBTd2l0Y2giLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX21peGVyX3N3aXRjaF9pbmZvLApAQCAtMTQxMyw3ICsxNDExLDcgQEAKIAkucHJpdmF0ZV92YWx1ZSA9IDEwLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX211bHRpX2NhcHR1cmVfc3BkaWZfc3dpdGNoIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9zcGRpZl9zd2l0Y2ggX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiTXVsdGkgIixDQVBUVVJFLFNXSVRDSCksCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fbWl4ZXJfc3dpdGNoX2luZm8sCkBAIC0xNDIzLDcgKzE0MjEsNyBAQAogCS5jb3VudCA9IDIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9hbmFsb2dfdm9sdW1lIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9hbmFsb2dfdm9sdW1lIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLmFjY2VzcyA9IChTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKIAkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKQEAgLTE0MzUsNyArMTQzMyw3IEBACiAJLnRsdiA9IHsgLnAgPSBkYl9zY2FsZV9wbGF5YmFjayB9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbXVsdGlfY2FwdHVyZV9zcGRpZl92b2x1bWUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9tdWx0aV9jYXB0dXJlX3NwZGlmX3ZvbHVtZSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCJNdWx0aSAiLENBUFRVUkUsVk9MVU1FKSwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19taXhlcl92b2x1bWVfaW5mbywKQEAgLTE2MjcsNyArMTYyNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9lZXByb20gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9lZXByb20gX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9DQVJELAogCS5uYW1lID0gIklDRTE3MTIgRUVQUk9NIiwKIAkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQsCkBAIC0xNjYzLDcgKzE2NjEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfc3BkaWZfZGVmYXVsdCBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9zcGRpZl9kZWZhdWx0IF9fZGV2aW5pdGRhdGEgPQogewogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLERFRkFVTFQpLApAQCAtMTcxNCw3ICsxNzEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3NwZGlmX21hc2tjIF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3NwZGlmX21hc2tjIF9fZGV2aW5pdGRhdGEgPQogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCkBAIC0xNzIzLDcgKzE3MjEsNyBAQAogCS5nZXQgPQkJc25kX2ljZTE3MTJfc3BkaWZfbWFza2NfZ2V0LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3NwZGlmX21hc2twIF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3NwZGlmX21hc2twIF9fZGV2aW5pdGRhdGEgPQogewogCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCkBAIC0xNzUwLDcgKzE3NDgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfc3BkaWZfc3RyZWFtIF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3NwZGlmX3N0cmVhbSBfX2RldmluaXRkYXRhID0KIHsKIAkuYWNjZXNzID0JKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAogCQkJIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSksCkBAIC0xODkxLDcgKzE4ODksNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2sgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2sgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBJbnRlcm5hbCBDbG9jayIsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9faW50ZXJuYWxfY2xvY2tfaW5mbywKQEAgLTE5NjIsNyArMTk2MCw3IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9ja19kZWZhdWx0IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfcHJvX2ludGVybmFsX2Nsb2NrX2RlZmF1bHQgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBJbnRlcm5hbCBDbG9jayBEZWZhdWx0IiwKIAkuaW5mbyA9IHNuZF9pY2UxNzEyX3Byb19pbnRlcm5hbF9jbG9ja19kZWZhdWx0X2luZm8sCkBAIC0yMDAxLDcgKzE5OTksNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9wcm9fcmF0ZV9sb2NraW5nIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfcHJvX3JhdGVfbG9ja2luZyBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIk11bHRpIFRyYWNrIFJhdGUgTG9ja2luZyIsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fcmF0ZV9sb2NraW5nX2luZm8sCkBAIC0yMDQwLDcgKzIwMzgsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9wcm9fcmF0ZV9yZXNldCBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX3Byb19yYXRlX3Jlc2V0IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgUmF0ZSBSZXNldCIsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fcmF0ZV9yZXNldF9pbmZvLApAQCAtMjIwNyw3ICsyMjA1LDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX2ljZTE3MTJfbWl4ZXJfcHJvX2FuYWxvZ19yb3V0ZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX21peGVyX3Byb19hbmFsb2dfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJIL1cgUGxheWJhY2sgUm91dGUiLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3JvdXRlX2luZm8sCkBAIC0yMjE1LDcgKzIyMTMsNyBAQAogCS5wdXQgPSBzbmRfaWNlMTcxMl9wcm9fcm91dGVfYW5hbG9nX3B1dCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fc3BkaWZfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fc3BkaWZfcm91dGUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxOT05FKSAiUm91dGUiLAogCS5pbmZvID0gc25kX2ljZTE3MTJfcHJvX3JvdXRlX2luZm8sCkBAIC0yMjU3LDcgKzIyNTUsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fdm9sdW1lX3JhdGUgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fdm9sdW1lX3JhdGUgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBWb2x1bWUgUmF0ZSIsCiAJLmluZm8gPSBzbmRfaWNlMTcxMl9wcm9fdm9sdW1lX3JhdGVfaW5mbywKQEAgLTIyOTAsNyArMjI4OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaWNlMTcxMl9taXhlcl9wcm9fcGVhayBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9pY2UxNzEyX21peGVyX3Byb19wZWFrIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSAiTXVsdGkgVHJhY2sgUGVhayIsCiAJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxFLApAQCAtMjMwNSw3ICsyMzAzLDcgQEAKIC8qCiAgKiBsaXN0IG9mIGF2YWlsYWJsZSBib2FyZHMKICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKmNhcmRfdGFibGVzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICpjYXJkX3RhYmxlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJc25kX2ljZTE3MTJfaG9vbnRlY2hfY2FyZHMsCiAJc25kX2ljZTE3MTJfZGVsdGFfY2FyZHMsCiAJc25kX2ljZTE3MTJfZXdzX2NhcmRzLApAQCAtMjMyOSw3ICsyMzI3LDcgQEAKIHsKIAlpbnQgZGV2ID0gMHhhMDsJCS8qIEVFUFJPTSBkZXZpY2UgYWRkcmVzcyAqLwogCXVuc2lnbmVkIGludCBpLCBzaXplOwotCWNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOworCXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKiBjb25zdCAqdGJsLCAqYzsKIAogCWlmICghIG1vZGVsbmFtZSB8fCAhICptb2RlbG5hbWUpIHsKIAkJaWNlLT5lZXByb20uc3VidmVuZG9yID0gMDsKQEAgLTI2NTgsNyArMjY1Niw3IEBACiAgKgogICovCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIG5vX21hdGNoZWQgX19kZXZpbml0ZGF0YTsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIG5vX21hdGNoZWQgX19kZXZpbml0ZGF0YTsKIAogc3RhdGljIGludCBfX2RldmluaXQgc25kX2ljZTE3MTJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKQEAgLTI2NjcsNyArMjY2NSw3IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlOwogCWludCBwY21fZGV2ID0gMCwgZXJyOwotCWNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKip0YmwsICpjOworCXN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gKiBjb25zdCAqdGJsLCAqYzsKIAogCWlmIChkZXYgPj0gU05EUlZfQ0FSRFMpCiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5oIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5oCmluZGV4IGMzZDlmZWEuLjZhYzQ4NmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmgKQEAgLTM5Nyw2ICszOTcsOSBAQAogCQkJc3RydWN0IGFrNDExNCAqYWs0MTE0OwogCQkJdW5zaWduZWQgaW50IGFuYWxvZzogMTsKIAkJfSBqdWxpOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGFrNDExNCAqYWs0MTE0OworCQl9IHByb2RpZ3kxOTI7CiAJfSBzcGVjOwogCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCmluZGV4IDExMjdlYmQuLmVlNjIwZGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKQEAgLTMzNywxMyArMzM3LDExIEBACiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJdW5zaWduZWQgY2hhciB3aGF0OwogCXVuc2lnbmVkIGNoYXIgb2xkOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7CiAKIAl3aGF0ID0gMDsKLQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7CisJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKIAkJY29uc3Qgc3RydWN0IHZ0MTcyNF9wY21fcmVnICpyZWc7Ci0JCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOwogCQlyZWcgPSBzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJCXdoYXQgfD0gcmVnLT5zdGFydDsKIAkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vic3RyZWFtKTsKQEAgLTEzMTgsNyArMTMxNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X2VlcHJvbSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfZWVwcm9tIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfQ0FSRCwKIAkubmFtZSA9ICJJQ0UxNzI0IEVFUFJPTSIsCiAJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELApAQCAtMTQzMSw3ICsxNDI5LDcgQEAKIAlyZXR1cm4gKHZhbCAhPSBvbGQpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9zcGRpZl9kZWZhdWx0IF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfc3BkaWZfZGVmYXVsdCBfX2RldmluaXRkYXRhID0KIHsKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCiAJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxERUZBVUxUKSwKQEAgLTE0NjMsNyArMTQ2MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX21hc2tjIF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfc3BkaWZfbWFza2MgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKQEAgLTE0NzIsNyArMTQ3MCw3IEBACiAJLmdldCA9CQlzbmRfdnQxNzI0X3NwZGlmX21hc2tjX2dldCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX21hc2twIF9fZGV2aW5pdGRhdGEgPQorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfc3BkaWZfbWFza3AgX19kZXZpbml0ZGF0YSA9CiB7CiAJLmFjY2VzcyA9CVNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAogCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKQEAgLTE1MTcsNyArMTUxNSw3IEBACiAJcmV0dXJuIG9sZCAhPSB2YWw7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX3N3aXRjaCBfX2RldmluaXRkYXRhID0KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3NwZGlmX3N3aXRjaCBfX2RldmluaXRkYXRhID0KIHsKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkvKiBGSVhNRTogdGhlIGZvbGxvd2luZyBjb25mbGljdCB3aXRoIElFQzk1OCBQbGF5YmFjayBSb3V0ZSAqLwpAQCAtMTY2OCw3ICsxNjY2LDEyIEBACiAJc3Bpbl9sb2NrX2lycSgmaWNlLT5yZWdfbG9jayk7CiAJb3ZhbCA9IGluYihJQ0VNVDE3MjQoaWNlLCBSQVRFKSk7CiAJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPT0gc3BkaWYpIHsKKwkJdW5zaWduZWQgY2hhciBpMnNfb3ZhbDsKIAkJb3V0YihvdmFsIHwgVlQxNzI0X1NQRElGX01BU1RFUiwgSUNFTVQxNzI0KGljZSwgUkFURSkpOworCQkvKiBzZXR0aW5nIDI1NmZzICovCisJCWkyc19vdmFsID0gaW5iKElDRU1UMTcyNChpY2UsIEkyU19GT1JNQVQpKTsKKwkJb3V0YihpMnNfb3ZhbCAmIH5WVDE3MjRfTVRfSTJTX01DTEtfMTI4WCwKKwkJICAgICBJQ0VNVDE3MjQoaWNlLCBJMlNfRk9STUFUKSk7CiAJfSBlbHNlIHsKIAkJcmF0ZSA9IHJhdGVzW3Vjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdICUgMTVdOwogCQlpZiAocmF0ZSA8PSBnZXRfbWF4X3JhdGUoaWNlKSkgewpAQCAtMTY5NSw3ICsxNjk4LDcgQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9wcm9faW50ZXJuYWxfY2xvY2sgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3Byb19pbnRlcm5hbF9jbG9jayBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIk11bHRpIFRyYWNrIEludGVybmFsIENsb2NrIiwKIAkuaW5mbyA9IHNuZF92dDE3MjRfcHJvX2ludGVybmFsX2Nsb2NrX2luZm8sCkBAIC0xNzM0LDcgKzE3MzcsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3Byb19yYXRlX2xvY2tpbmcgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3Byb19yYXRlX2xvY2tpbmcgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBSYXRlIExvY2tpbmciLAogCS5pbmZvID0gc25kX3Z0MTcyNF9wcm9fcmF0ZV9sb2NraW5nX2luZm8sCkBAIC0xNzczLDcgKzE3NzYsNyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X3Byb19yYXRlX3Jlc2V0IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9wcm9fcmF0ZV9yZXNldCBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIk11bHRpIFRyYWNrIFJhdGUgUmVzZXQiLAogCS5pbmZvID0gc25kX3Z0MTcyNF9wcm9fcmF0ZV9yZXNldF9pbmZvLApAQCAtMTg5Miw3ICsxODk1LDcgQEAKIAkJCSAgICAgZGlnaXRhbF9yb3V0ZV9zaGlmdChpZHgpKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfbWl4ZXJfcHJvX2FuYWxvZ19yb3V0ZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfbWl4ZXJfcHJvX2FuYWxvZ19yb3V0ZSBfX2RldmluaXRkYXRhID0gewogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCS5uYW1lID0gIkgvVyBQbGF5YmFjayBSb3V0ZSIsCiAJLmluZm8gPSBzbmRfdnQxNzI0X3Byb19yb3V0ZV9pbmZvLApAQCAtMTkwMCw3ICsxOTAzLDcgQEAKIAkucHV0ID0gc25kX3Z0MTcyNF9wcm9fcm91dGVfYW5hbG9nX3B1dCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfdnQxNzI0X21peGVyX3Byb19zcGRpZl9yb3V0ZSBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfbWl4ZXJfcHJvX3NwZGlmX3JvdXRlIF9fZGV2aW5pdGRhdGEgPSB7CiAJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJLm5hbWUgPSBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssTk9ORSkgIlJvdXRlIiwKIAkuaW5mbyA9IHNuZF92dDE3MjRfcHJvX3JvdXRlX2luZm8sCkBAIC0xOTM2LDcgKzE5MzksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc25kX3Z0MTcyNF9taXhlcl9wcm9fcGVhayBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF92dDE3MjRfbWl4ZXJfcHJvX3BlYWsgX19kZXZpbml0ZGF0YSA9IHsKIAkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkubmFtZSA9ICJNdWx0aSBUcmFjayBQZWFrIiwKIAkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQUQgfCBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEUsCkBAIC0xOTQ4LDkgKzE5NTEsOSBAQAogICoKICAqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBub19tYXRjaGVkIF9fZGV2aW5pdGRhdGE7CitzdGF0aWMgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBub19tYXRjaGVkIF9fZGV2aW5pdGRhdGE7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICpjYXJkX3RhYmxlc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqY2FyZF90YWJsZXNbXSBfX2RldmluaXRkYXRhID0gewogCXNuZF92dDE3MjRfcmV2b19jYXJkcywKIAlzbmRfdnQxNzI0X2FtcF9jYXJkcywgCiAJc25kX3Z0MTcyNF9hdXJlb25fY2FyZHMsCkBAIC0yMDA5LDcgKzIwMTIsNyBAQAogewogCWNvbnN0IGludCBkZXYgPSAweGEwOwkJLyogRUVQUk9NIGRldmljZSBhZGRyZXNzICovCiAJdW5zaWduZWQgaW50IGksIHNpemU7Ci0JY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqKnRibCwgKmM7CisJc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqIGNvbnN0ICp0YmwsICpjOwogCiAJaWYgKCEgbW9kZWxuYW1lIHx8ICEgKm1vZGVsbmFtZSkgewogCQlpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgPSAwOwpAQCAtMjMwOCw3ICsyMzExLDcgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJc3RydWN0IHNuZF9pY2UxNzEyICppY2U7CiAJaW50IHBjbV9kZXYgPSAwLCBlcnI7Ci0JY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqKnRibCwgKmM7CisJc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAqIGNvbnN0ICp0YmwsICpjOwogCiAJaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yMzQ3LDYgKzIzNTAsMTQgQEAKIAl9CiAJYyA9ICZub19tYXRjaGVkOwogIF9fZm91bmQ6CisgICAgICAgLyoKKyAgICAgICAgKiBWVDE3MjQgaGFzIHNlcGFyYXRlIERNQXMgZm9yIHRoZSBhbmFsb2cgYW5kIHRoZSBTUERJRiBzdHJlYW1zIHdoaWxlCisgICAgICAgICogSUNFMTcxMiBoYXMgb25seSBvbmUgZm9yIGJvdGggKG1peGVkIHVwKS4KKyAgICAgICAgKgorICAgICAgICAqIENvbmZ1c2luZ2x5IHRoZSBhbmFsb2cgUENNIGlzIG5hbWVkICJwcm9mZXNzaW9uYWwiIGhlcmUgYmVjYXVzZSBpdAorICAgICAgICAqIHdhcyBjYWxsZWQgc28gaW4gaWNlMTcxMiBkcml2ZXIsIGFuZCB2dDE3MjQgZHJpdmVyIGlzIGRlcml2ZWQgZnJvbQorICAgICAgICAqIGljZTE3MTIgZHJpdmVyLgorICAgICAgICAqLwogCiAJaWYgKChlcnIgPSBzbmRfdnQxNzI0X3BjbV9wcm9maShpY2UsIHBjbV9kZXYrKykpIDwgMCkgewogCQlzbmRfY2FyZF9mcmVlKGNhcmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5jCmluZGV4IGQ4ODE3MmYuLjNkOGU3NGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCXNuZF9ha200eHh4X3Jlc2V0KGFrLCAwKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fanVsaV9kYWMgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2p1bGlfZGFjIF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0MzU4LAogCS5udW1fZGFjcyA9IDIsCiAJLm9wcyA9IHsKQEAgLTEzOCw3ICsxMzgsMTYgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQganVsaV9hZGRfY29udHJvbHMoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCiB7Ci0JcmV0dXJuIHNuZF9pY2UxNzEyX2FrbTR4eHhfYnVpbGRfY29udHJvbHMoaWNlKTsKKwlpbnQgZXJyOworCWVyciA9IHNuZF9pY2UxNzEyX2FrbTR4eHhfYnVpbGRfY29udHJvbHMoaWNlKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkvKiBvbmx5IGNhcHR1cmUgU1BESUYgb3ZlciBBSzQxMTQgKi8KKwllcnIgPSBzbmRfYWs0MTE0X2J1aWxkKGljZS0+c3BlYy5qdWxpLmFrNDExNCwgTlVMTCwKKwkJCSAgICAgICBpY2UtPnBjbV9wcm8tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTYwLDEzICsxNjksNiBAQAogCWludCBlcnI7CiAJc3RydWN0IHNuZF9ha200eHh4ICphazsKIAotI2lmIDAKLQlmb3IgKGVyciA9IDA7IGVyciA8IDB4MjA7IGVycisrKQotCQlqdWxpX2FrNDExNF9yZWFkKGljZSwgZXJyKTsKLQlqdWxpX2FrNDExNF93cml0ZShpY2UsIDAsIDB4MGYpOwotCWp1bGlfYWs0MTE0X3JlYWQoaWNlLCAwKTsKLQlqdWxpX2FrNDExNF9yZWFkKGljZSwgMSk7Ci0jZW5kaWYKIAllcnIgPSBzbmRfYWs0MTE0X2NyZWF0ZShpY2UtPmNhcmQsCiAJCQkJanVsaV9hazQxMTRfcmVhZCwKIAkJCQlqdWxpX2FrNDExNF93cml0ZSwKQEAgLTIwNiw3ICsyMDgsNyBAQAogICogaGVuY2UgdGhlIGRyaXZlciBuZWVkcyB0byBzZXRzIHVwIGl0IHByb3Blcmx5LgogICovCiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGp1bGlfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGp1bGlfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKIAlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgyMCwJLyogY2xvY2sgNTEyLCBtcHU0MDEsIDF4QURDLCAxeERBQ3MgKi8KIAlbSUNFX0VFUDJfQUNMSU5LXSAgICAgID0gMHg4MCwJLyogSTJTICovCiAJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4ZjgsCS8qIHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLwpAQCAtMjIzLDcgKzIyNSw3IEBACiB9OwogCiAvKiBlbnRyeSBwb2ludCAqLwotY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X2p1bGlfY2FyZHNbXSBfX2RldmluaXRkYXRhID0geworc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X2p1bGlfY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IFZUMTcyNF9TVUJERVZJQ0VfSlVMSSwKIAkJLm5hbWUgPSAiRVNJIEp1bGlAIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2p1bGkuaAppbmRleCAxYjkyOTRmLi5kOWY4NTM0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9qdWxpLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvanVsaS5oCkBAIC01LDYgKzUsNiBAQAogCiAjZGVmaW5lIFZUMTcyNF9TVUJERVZJQ0VfSlVMSQkJMHgzMTMwNTM0NQkvKiBKdWxpQCAqLwogCi1leHRlcm4gY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9qdWxpX2NhcmRzW107CitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9qdWxpX2NhcmRzW107CiAKICNlbmRpZgkvKiBfX1NPVU5EX0pVTElfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmMKaW5kZXggMDc1MTcxOC4uNDBhOTA5OCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5jCkBAIC04OSwxMyArODksMTMgQEAKICNkZWZpbmUgV01fVk9MX01BWAkoc2l6ZW9mKHdtX3ZvbCkgLSAxKQogI2RlZmluZSBXTV9WT0xfTVVURQkweDgwMDAKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fcGhhc2UyMiBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fcGhhc2UyMiBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDUyNCwKIAkubnVtX2RhY3MgPSAyLAogCS5udW1fYWRjcyA9IDIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcGhhc2UyMl9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcGhhc2UyMl9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0JMiwKIAkuY2lmID0JCTEsCiAJLmRhdGFfbWFzayA9CTEgPDwgNCwKQEAgLTE1Miw3ICsxNTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwaGFzZTIyX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgdW5zaWduZWQgY2hhciBwaGFzZTIyX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJW0lDRV9FRVAyX1NZU0NPTkZdICAgICA9IDB4MDAsCS8qIDF4QURDLCAxeERBQ3MgKi8KIAlbSUNFX0VFUDJfQUNMSU5LXSAgICAgID0gMHg4MCwJLyogSTJTICovCiAJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4ZjgsCS8qIHZvbCwgOTZrLCAyNGJpdCAqLwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MDAsCiB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwaGFzZTI4X2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgdW5zaWduZWQgY2hhciBwaGFzZTI4X2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJW0lDRV9FRVAyX1NZU0NPTkZdICAgICA9IDB4MGIsCS8qIGNsb2NrIDUxMiwgc3BkaWYtaW4vQURDLCA0REFDcyAqLwogCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDgwLAkvKiBJMlMgKi8KIAlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHhmYywJLyogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCkBAIC03MDAsNyArNzAwLDcgQEAKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV93bV9kYWMsIC0xMjcwMCwgMTAwLCAxKTsKIHN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkYl9zY2FsZV93bV9wY20sIC02NDAwLCA1MCwgMSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwaGFzZTI4X2RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcGhhc2UyOF9kYWNfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLApAQCAtODE1LDcgKzgxNSw3IEBACiAJfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bV9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiUENNIFBsYXliYWNrIFN3aXRjaCIsCkBAIC04NzAsNyArODcwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3BoYXNlX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9waGFzZV9jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuc3VidmVuZG9yID0gVlQxNzI0X1NVQkRFVklDRV9QSEFTRTIyLAogCQkubmFtZSA9ICJUZXJyYXRlYyBQSEFTRSAyMiIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5oIGIvc291bmQvcGNpL2ljZTE3MTIvcGhhc2UuaAppbmRleCBhZDM3OWE5Li4xM2U4NDFiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9waGFzZS5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BoYXNlLmgKQEAgLTMxLDcgKzMxLDcgQEAKICNkZWZpbmUgVlQxNzI0X1NVQkRFVklDRV9QSEFTRTI4CTB4M2IxNTQ5MTEKIAogLyogZW50cnkgcG9pbnQgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfcGhhc2VfY2FyZHNbXTsKK2V4dGVybiBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjRfcGhhc2VfY2FyZHNbXTsKIAogLyogUEhBU0UyOCBHUElPIGJpdHMgKi8KICNkZWZpbmUgUEhBU0UyOF9TUElfTUlTTwkoMSA8PCAyMSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5jIGIvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmMKaW5kZXggOTU1MjQ5Ny4uMDFjNjk0NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmMKQEAgLTU3MSw3ICs1NzEsNyBAQAogICogbWl4ZXJzCiAgKi8KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHBvbnRpc19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcG9udGlzX2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAogCQkuYWNjZXNzID0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfApAQCAtODI2LDcgKzgyNiw3IEBACiAgKiBoZW5jZSB0aGUgZHJpdmVyIG5lZWRzIHRvIHNldHMgdXAgaXQgcHJvcGVybHkuCiAgKi8KIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcG9udGlzX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgdW5zaWduZWQgY2hhciBwb250aXNfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKIAlbSUNFX0VFUDJfU1lTQ09ORl0gICAgID0gMHgwOCwJLyogY2xvY2sgMjU2LCBtcHU0MDEsIHNwZGlmLWluL0FEQywgMURBQyAqLwogCVtJQ0VfRUVQMl9BQ0xJTktdICAgICAgPSAweDgwLAkvKiBJMlMgKi8KIAlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHhmOCwJLyogdm9sLCA5NmssIDI0Yml0LCAxOTJrICovCkBAIC04NDMsNyArODQzLDcgQEAKIH07CiAKIC8qIGVudHJ5IHBvaW50ICovCi1jb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjBfcG9udGlzX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyMF9wb250aXNfY2FyZHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLnN1YnZlbmRvciA9IFZUMTcyMF9TVUJERVZJQ0VfUE9OVElTX01TMzAwLAogCQkubmFtZSA9ICJQb250aXMgTVMzMDAiLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcG9udGlzLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9wb250aXMuaAppbmRleCAxYTQxODI1Li5kMGQxMzc4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9wb250aXMuaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9wb250aXMuaApAQCAtMjgsNiArMjgsNiBAQAogCiAjZGVmaW5lIFZUMTcyMF9TVUJERVZJQ0VfUE9OVElTX01TMzAwCTB4MDAwMjAwMDIJLyogYSBkdW1teSBpZCBmb3IgTVMzMDAgKi8KIAotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gIHNuZF92dDE3MjBfcG9udGlzX2NhcmRzW107CitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyMF9wb250aXNfY2FyZHNbXTsKIAogI2VuZGlmIC8qIF9fU09VTkRfUE9OVElTX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuYwppbmRleCAzMWNjNjZlLi5mMDNjMDJjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5jCkBAIC0yLDYgKzIsMzcgQEAKICAqICAgQUxTQSBkcml2ZXIgZm9yIElDRW5zZW1ibGUgVlQxNzI0IChFbnZ5MjRIVCkKICAqCiAgKiAgIExvd2xldmVsIGZ1bmN0aW9ucyBmb3IgQXVkaW9UcmFrIFByb2RpZ3kgMTkyIGNhcmRzCisgKiAgIFN1cHBvcnRlZCBJRUM5NTggaW5wdXQgZnJvbSBvcHRpb25hbCBNSS9PREkvTyBhZGQtb24gY2FyZC4KKyAqCisgKiAgIFNwZWNpZmljcyAoU1csIEhXKToKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAJKiA0OS41TUh6IGNyeXN0YWwKKyAqICAgCSogU1BESUYtT1VUIG9uIHRoZSBjYXJkOgorICogIAkgIC0gY29heCAodGhyb3VnaCBpc29sYXRpb24gdHJhbnNmb3JtZXIpL3Rvc2xpbmsgc3VwcGxpZWQgYnkKKyAqICAgICAgICAgIDc0SEMwNCBnYXRlcyAtIDMgaW4gcGFyYWxsZWwKKyAqICAgCSAgLSBvdXRwdXQgc3dpdGNoZWQgYmV0d2VlbiBvbi1ib2FyZCBDRCBkcml2ZSBkaWctb3V0IGNvbm5lY3RvcgorICogICAgICAgICAgYW5kIGljZTE3MjQgU1BEVFggcGluLCB1c2luZyA3NEhDMDIgTk9SIGdhdGVzLCBjb250cm9sbGVkCisgKiAgICAgICAgICBieSBHUElPMjAgKDAgPSBDRCBkaWctb3V0LCAxID0gU1BEVFgpCisgKiAgIAkqIFNQRFRYIGdvZXMgc3RyYWlnaHQgdG8gTUkvT0RJL08gY2FyZCdzIFNQRElGLU9VVCBjb2F4CisgKgorICogICAJKiBNSS9PREkvTyBjYXJkOiBBSzQxMTQgYmFzZWQsIHVzZWQgZm9yIGllYzk1OCBpbnB1dCBvbmx5CisgKiAgIAkJLSB0b3NsaW5rIGlucHV0IC0+IFJYMAorICogICAJCS0gY29heCBpbnB1dCAtPiBSWDEKKyAqICAgCQktIDR3aXJlIHByb3RvY29sOgorICogICAJCQlBSzQxMTQJCUlDRTE3MjQKKyAqICAgCQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAJCQlDRFRPIChwaW4gMzIpIC0tIEdQSU8xMSBwaW4gODYKKyAqIAkJCUNEVEkgKHBpbiAzMykgLS0gR1BJTzEwIHBpbiA3NworICogCQkJQ0NMSyAocGluIDM0KSAtLSBHUElPOSBwaW4gNzYKKyAqIAkJCUNTTiAgKHBpbiAzNSkgLS0gR1BJTzggcGluIDc1CisgKiAgIAkJLSBvdXRwdXQgZGF0YSBNb2RlIDcgKDI0Yml0LCBJMlMsIHNsYXZlKQorICoJCS0gYm90aCBNQ0tPMSBhbmQgTUNLTzIgb2YgYWs0MTE0IGFyZSBmZWQgdG8gRlBHQSwgd2hpY2gKKyAqCQkgIG91dHB1dHMgbWFzdGVyIGNsb2NrIHRvIFNQTUNMS0lOIG9mIGljZTE3MjQuCisgKgkJICBFeHBlcmltZW50YWxseSBJIGZvdW5kIG91dCB0aGF0IG9ubHkgYSBjb21iaW5hdGlvbiBvZgorICoJCSAgT0NLUzA9MSwgT0NLUzE9MSAoMTI4ZnMsIDY0ZnMgb3V0cHV0KSBhbmQgaWNlMTcyNCAtCisgKgkJICBWVDE3MjRfTVRfSTJTX01DTEtfMTI4WD0wICgyNTZmcyBpbnB1dCkgeWllbGRzIGNvcnJlY3QKKyAqCQkgIHNhbXBsaW5nIHJhdGUuIFRoYXQgbWVhbnMgdGhlIHRoZSBGUEdBIGRvdWJsZXMgdGhlCisgKgkJICBNQ0swMSByYXRlLgogICoKICAqCUNvcHlyaWdodCAoYykgMjAwMyBUYWthc2hpIEl3YWkgPHRpd2FpQHN1c2UuZGU+CiAgKiAgICAgIENvcHlyaWdodCAoYykgMjAwMyBEaW1pdHJvbWFub2xha2lzIEFwb3N0b2xvcyA8YXBvc3RvbEBjcy51dG9yb250by5jYT4KQEAgLTM1Niw2ICszODcsNDcgQEAKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgorc3RhdGljIGludCBzdGFjOTQ2MF9taWNfc3dfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbMl0gPSB7ICJMaW5lIEluIiwgIk1pYyIgfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAyOworCisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDE7CisJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHN0YWM5NDYwX21pY19zd19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciB2YWw7CisJCQorCXZhbCA9IHN0YWM5NDYwX2dldChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSk7CisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgPj4gNykgJiAweDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhYzk0NjBfbWljX3N3X3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBjaGFyIG5ldywgb2xkOworCWludCBjaGFuZ2U7CisJb2xkID0gc3RhYzk0NjBfZ2V0KGljZSwgU1RBQzk0NlhfR0VORVJBTF9QVVJQT1NFKTsKKwluZXcgPSAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCA3ICYgMHg4MCkgfCAob2xkICYgfjB4ODApOworCWNoYW5nZSA9IChuZXcgIT0gb2xkKTsKKwlpZiAoY2hhbmdlKQorCQlzdGFjOTQ2MF9wdXQoaWNlLCBTVEFDOTQ2WF9HRU5FUkFMX1BVUlBPU0UsIG5ldyk7CisJcmV0dXJuIGNoYW5nZTsKK30KIAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RhYywgLTE5MTI1LCA3NSwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYWRjLCAwLCAxNTAsIDApOwpAQCAtMzY0LDcgKzQzNiw3IEBACiAgKiBtaXhlcnMKICAqLwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RhY19jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCkBAIC00MDYsNyArNDc4LDcgQEAKIAl9LAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gIkFEQyBTd2l0Y2giLAorCQkubmFtZSA9ICJBREMgQ2FwdHVyZSBTd2l0Y2giLAogCQkuY291bnQgPSAxLAogCQkuaW5mbyA9IHN0YWM5NDYwX2FkY19tdXRlX2luZm8sCiAJCS5nZXQgPSBzdGFjOTQ2MF9hZGNfbXV0ZV9nZXQsCkBAIC00MTcsMTMgKzQ4OSwyMSBAQAogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKIAkJLmFjY2VzcyA9IChTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFIHwKIAkJCSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCksCi0JCS5uYW1lID0gIkFEQyBWb2x1bWUiLAorCQkubmFtZSA9ICJBREMgQ2FwdHVyZSBWb2x1bWUiLAogCQkuY291bnQgPSAxLAogCQkuaW5mbyA9IHN0YWM5NDYwX2FkY192b2xfaW5mbywKIAkJLmdldCA9IHN0YWM5NDYwX2FkY192b2xfZ2V0LAogCQkucHV0ID0gc3RhYzk0NjBfYWRjX3ZvbF9wdXQsCiAJCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfYWRjIH0KIAl9LAorCXsKKwkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5uYW1lID0gIkFuYWxvZyBDYXB0dXJlIElucHV0IiwKKwkJLmluZm8gPSBzdGFjOTQ2MF9taWNfc3dfaW5mbywKKwkJLmdldCA9IHN0YWM5NDYwX21pY19zd19nZXQsCisJCS5wdXQgPSBzdGFjOTQ2MF9taWNfc3dfcHV0LAorCisJfSwKICNpZiAwCiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKQEAgLTQ1NiwxOSArNTM2LDI2MSBAQAogI2VuZGlmCiB9OwogCisKKy8qIEFLNDExNCAtIElDRTE3MjQgY29ubmVjdGlvbnMgb24gUHJvZGlneTE5MiArIE1JL09ESS9PICovCisvKiBDRFRPIChwaW4gMzIpIC0tIEdQSU8xMSBwaW4gODYKKyAqIENEVEkgKHBpbiAzMykgLS0gR1BJTzEwIHBpbiA3NworICogQ0NMSyAocGluIDM0KSAtLSBHUElPOSBwaW4gNzYKKyAqIENTTiAgKHBpbiAzNSkgLS0gR1BJTzggcGluIDc1CisgKi8KKyNkZWZpbmUgQUs0MTE0X0FERFIJMHgwMCAvKiBDMS1DMDogQ2hpcCBBZGRyZXNzCisJCQkgICAgICAqIChBY2NvcmRpbmcgdG8gZGF0YXNoZWV0IGZpeGVkIHRvIOKAnDAw4oCdKQorCQkJICAgICAgKi8KKworLyoKKyAqIDR3aXJlIGFrNDExNCBwcm90b2NvbCAtIHdyaXRpbmcgZGF0YQorICovCitzdGF0aWMgdm9pZCB3cml0ZV9kYXRhKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCB1bnNpZ25lZCBpbnQgZ3BpbywKKwkJICAgICAgIHVuc2lnbmVkIGludCBkYXRhLCBpbnQgaWR4KQoreworCWZvciAoOyBpZHggPj0gMDsgaWR4LS0pIHsKKwkJLyogZHJvcCBjbG9jayAqLworCQlncGlvICY9IH5WVDE3MjRfUFJPRElHWTE5Ml9DQ0xLOworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgZ3Bpbyk7CisJCXVkZWxheSgxKTsKKwkJLyogc2V0IGRhdGEgKi8KKwkJaWYgKGRhdGEgJiAoMSA8PCBpZHgpKQorCQkJZ3BpbyB8PSBWVDE3MjRfUFJPRElHWTE5Ml9DRE9VVDsKKwkJZWxzZQorCQkJZ3BpbyAmPSB+VlQxNzI0X1BST0RJR1kxOTJfQ0RPVVQ7CisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCBncGlvKTsKKwkJdWRlbGF5KDEpOworCQkvKiByYWlzZSBjbG9jayAqLworCQlncGlvIHw9IFZUMTcyNF9QUk9ESUdZMTkyX0NDTEs7CisJCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCBncGlvKTsKKwkJdWRlbGF5KDEpOworCX0KK30KKworLyoKKyAqIDR3aXJlIGFrNDExNCBwcm90b2NvbCAtIHJlYWRpbmcgZGF0YQorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkX2RhdGEoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHVuc2lnbmVkIGludCBncGlvLAorCQkJICAgICAgIGludCBpZHgpCit7CisJdW5zaWduZWQgY2hhciBkYXRhID0gMDsKKworCWZvciAoOyBpZHggPj0gMDsgaWR4LS0pIHsKKwkJLyogZHJvcCBjbG9jayAqLworCQlncGlvICY9IH5WVDE3MjRfUFJPRElHWTE5Ml9DQ0xLOworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgZ3Bpbyk7CisJCXVkZWxheSgxKTsKKwkJLyogcmVhZCBkYXRhICovCisJCWlmIChzbmRfaWNlMTcxMl9ncGlvX3JlYWQoaWNlKSAmIFZUMTcyNF9QUk9ESUdZMTkyX0NESU4pCisJCQlkYXRhIHw9ICgxIDw8IGlkeCk7CisJCXVkZWxheSgxKTsKKwkJLyogcmFpc2UgY2xvY2sgKi8KKwkJZ3BpbyB8PSBWVDE3MjRfUFJPRElHWTE5Ml9DQ0xLOworCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgZ3Bpbyk7CisJCXVkZWxheSgxKTsKKwl9CisJcmV0dXJuIGRhdGE7Cit9CisvKgorICogNHdpcmUgYWs0MTE0IHByb3RvY29sIC0gc3RhcnRpbmcgc2VxdWVuY2UKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBwcm9kaWd5MTkyXzR3aXJlX3N0YXJ0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQoreworCXVuc2lnbmVkIGludCB0bXA7CisKKwlzbmRfaWNlMTcxMl9zYXZlX2dwaW9fc3RhdHVzKGljZSk7CisJdG1wID0gc25kX2ljZTE3MTJfZ3Bpb19yZWFkKGljZSk7CisKKwl0bXAgfD0gVlQxNzI0X1BST0RJR1kxOTJfQ0NMSzsgLyogaGlnaCBhdCBpbml0ICovCisJdG1wICY9IH5WVDE3MjRfUFJPRElHWTE5Ml9DUzsgLyogZHJvcCBjaGlwIHNlbGVjdCAqLworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxKTsKKwlyZXR1cm4gdG1wOworfQorCisvKgorICogNHdpcmUgYWs0MTE0IHByb3RvY29sIC0gZmluYWwgc2VxdWVuY2UKKyAqLworc3RhdGljIHZvaWQgcHJvZGlneTE5Ml80d2lyZV9maW5pc2goc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHVuc2lnbmVkIGludCB0bXApCit7CisJdG1wIHw9IFZUMTcyNF9QUk9ESUdZMTkyX0NTOyAvKiByYWlzZSBjaGlwIHNlbGVjdCAqLworCXNuZF9pY2UxNzEyX2dwaW9fd3JpdGUoaWNlLCB0bXApOworCXVkZWxheSgxKTsKKwlzbmRfaWNlMTcxMl9yZXN0b3JlX2dwaW9fc3RhdHVzKGljZSk7Cit9CisKKy8qCisgKiBXcml0ZSBkYXRhIHRvIGFkZHIgcmVnaXN0ZXIgb2YgYWs0MTE0CisgKi8KK3N0YXRpYyB2b2lkIHByb2RpZ3kxOTJfYWs0MTE0X3dyaXRlKHZvaWQgKnByaXZhdGVfZGF0YSwgdW5zaWduZWQgY2hhciBhZGRyLAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdG1wLCBhZGRyZGF0YTsKKwl0bXAgPSBwcm9kaWd5MTkyXzR3aXJlX3N0YXJ0KGljZSk7CisJYWRkcmRhdGEgPSAoQUs0MTE0X0FERFIgPDwgNikgfCAweDIwIHwgKGFkZHIgJiAweDFmKTsKKwlhZGRyZGF0YSA9IChhZGRyZGF0YSA8PCA4KSB8IGRhdGE7CisJd3JpdGVfZGF0YShpY2UsIHRtcCwgYWRkcmRhdGEsIDE1KTsKKwlwcm9kaWd5MTkyXzR3aXJlX2ZpbmlzaChpY2UsIHRtcCk7Cit9CisKKy8qCisgKiBSZWFkIGRhdGEgZnJvbSBhZGRyIHJlZ2lzdGVyIG9mIGFrNDExNAorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBwcm9kaWd5MTkyX2FrNDExNF9yZWFkKHZvaWQgKnByaXZhdGVfZGF0YSwKKwkJCQkJICAgIHVuc2lnbmVkIGNoYXIgYWRkcikKK3sKKwlzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSA9IHByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKworCXRtcCA9IHByb2RpZ3kxOTJfNHdpcmVfc3RhcnQoaWNlKTsKKwl3cml0ZV9kYXRhKGljZSwgdG1wLCAoQUs0MTE0X0FERFIgPDwgNikgfCAoYWRkciAmIDB4MWYpLCA3KTsKKwlkYXRhID0gcmVhZF9kYXRhKGljZSwgdG1wLCA3KTsKKwlwcm9kaWd5MTkyXzR3aXJlX2ZpbmlzaChpY2UsIHRtcCk7CisJcmV0dXJuIGRhdGE7Cit9CisKKworc3RhdGljIGludCBhazQxMTRfaW5wdXRfc3dfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkgICAgICAgCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY2hhciAqdGV4dHNbMl0gPSB7ICJUb3NsaW5rIiwgIkNvYXgiIH07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+PSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcykKKwkJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworICAgICAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFrNDExNF9pbnB1dF9zd19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJICAgICAgIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9pY2UxNzEyICppY2UgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgY2hhciB2YWw7CisJCQorCXZhbCA9IHByb2RpZ3kxOTJfYWs0MTE0X3JlYWQoaWNlLCBBSzQxMTRfUkVHX0lPMSk7CisJLyogQUs0MTE0X0lQUzAgYml0ID0gMCAtPiBSWDAgPSBUb3NsaW5rCisJICogQUs0MTE0X0lQUzAgYml0ID0gMSAtPiBSWDEgPSBDb2F4CisJICovCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgJiBBSzQxMTRfSVBTMCkgPyAxIDogMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhazQxMTRfaW5wdXRfc3dfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCSAgICAgICAJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGNoYXIgbmV3LCBvbGQsIGl0ZW12YWx1ZTsKKwlpbnQgY2hhbmdlOworCisJb2xkID0gcHJvZGlneTE5Ml9hazQxMTRfcmVhZChpY2UsIEFLNDExNF9SRUdfSU8xKTsKKwkvKiBBSzQxMTRfSVBTMCBjb3VsZCBiZSBhbnkgYml0ICovCisJaXRlbXZhbHVlID0gKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pID8gMHhmZiA6IDB4MDA7CisKKwluZXcgPSAoaXRlbXZhbHVlICYgQUs0MTE0X0lQUzApIHwgKG9sZCAmIH5BSzQxMTRfSVBTMCk7CisJY2hhbmdlID0gKG5ldyAhPSBvbGQpOworCWlmIChjaGFuZ2UpCisJCXByb2RpZ3kxOTJfYWs0MTE0X3dyaXRlKGljZSwgQUs0MTE0X1JFR19JTzEsIG5ldyk7CisJcmV0dXJuIGNoYW5nZTsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWs0MTE0X2NvbnRyb2xzW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9ICJNSU9ESU8gSUVDOTU4IENhcHR1cmUgSW5wdXQiLAorCQkuaW5mbyA9IGFrNDExNF9pbnB1dF9zd19pbmZvLAorCQkuZ2V0ID0gYWs0MTE0X2lucHV0X3N3X2dldCwKKwkJLnB1dCA9IGFrNDExNF9pbnB1dF9zd19wdXQsCisKKwl9Cit9OworCisKK3N0YXRpYyBpbnQgcHJvZGlneTE5Ml9hazQxMTRfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhazQxMTRfaW5pdF92YWxzW10gPSB7CisJCUFLNDExNF9SU1QgfCBBSzQxMTRfUFdOIHwgQUs0MTE0X09DS1MwIHwgQUs0MTE0X09DS1MxLAorCQkvKiBpY2UxNzI0IGV4cGVjdHMgSTJTIGFuZCBwcm92aWRlcyBjbG9jaywKKwkJICogREVNMCBkaXNhYmxlcyB0aGUgZGVlbXBoYXNpcyBmaWx0ZXIKKwkJICovCisJCUFLNDExNF9ESUZfSTI0STJTIHwgQUs0MTE0X0RFTTAgLAorCQlBSzQxMTRfVFgxRSwKKwkJQUs0MTE0X0VGSF8xMDI0IHwgQUs0MTE0X0RJVCwgLyogZGVmYXVsdCBpbnB1dCBSWDAgKi8KKwkJMCwKKwkJMAorCX07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWs0MTE0X2luaXRfdHhjc2JbXSA9IHsKKwkJMHg0MSwgMHgwMiwgMHgyYywgMHgwMCwgMHgwMAorCX07CisKKwlyZXR1cm4gc25kX2FrNDExNF9jcmVhdGUoaWNlLT5jYXJkLAorCQkJCSBwcm9kaWd5MTkyX2FrNDExNF9yZWFkLAorCQkJCSBwcm9kaWd5MTkyX2FrNDExNF93cml0ZSwKKwkJCQkgYWs0MTE0X2luaXRfdmFscywgYWs0MTE0X2luaXRfdHhjc2IsCisJCQkJIGljZSwgJmljZS0+c3BlYy5wcm9kaWd5MTkyLmFrNDExNCk7Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHByb2RpZ3kxOTJfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCXVuc2lnbmVkIGludCBpOwogCWludCBlcnI7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGFjX2NvbnRyb2xzKTsgaSsrKSB7Ci0JCWVyciA9IHNuZF9jdGxfYWRkKGljZS0+Y2FyZCwgc25kX2N0bF9uZXcxKCZzdGFjX2NvbnRyb2xzW2ldLCBpY2UpKTsKKwkJZXJyID0gc25kX2N0bF9hZGQoaWNlLT5jYXJkLAorCQkJCSAgc25kX2N0bF9uZXcxKCZzdGFjX2NvbnRyb2xzW2ldLCBpY2UpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlpZiAoaWNlLT5zcGVjLnByb2RpZ3kxOTIuYWs0MTE0KSB7CisJCS8qIGFrNDExNCBpcyBjb25uZWN0ZWQgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWs0MTE0X2NvbnRyb2xzKTsgaSsrKSB7CisJCQllcnIgPSBzbmRfY3RsX2FkZChpY2UtPmNhcmQsCisJCQkJCSAgc25kX2N0bF9uZXcxKCZhazQxMTRfY29udHJvbHNbaV0sCisJCQkJCQkgICAgICAgaWNlKSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWVyciA9IHNuZF9hazQxMTRfYnVpbGQoaWNlLT5zcGVjLnByb2RpZ3kxOTIuYWs0MTE0LAorCQkJCU5VTEwsIC8qIGFrNDExNCBpbiBNSU8vREkvTyBoYW5kbGVzIG5vIElFQzk1OCBvdXRwdXQgKi8KKwkJCQlpY2UtPnBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBjaGVjayBmb3IgcHJlc2VuY2Ugb2YgTUkvT0RJL08gYWRkLW9uIGNhcmQgd2l0aCBkaWdpdGFsIGlucHV0cworICovCitzdGF0aWMgaW50IHByb2RpZ3kxOTJfbWlvZGlvX2V4aXN0cyhzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3sKKworCXVuc2lnbmVkIGNoYXIgb3JpZ192YWx1ZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyIHRlc3RfZGF0YSA9IDB4ZDE7CS8qIHJhbmRvbSB2YWx1ZSAqLworCXVuc2lnbmVkIGNoYXIgYWRkciA9IEFLNDExNF9SRUdfSU5UMF9NQVNLOyAvKiByYW5kb20gU0FGRSBhZGRyZXNzICovCisJaW50IGV4aXN0cyA9IDA7CisKKwlvcmlnX3ZhbHVlID0gcHJvZGlneTE5Ml9hazQxMTRfcmVhZChpY2UsIGFkZHIpOworCXByb2RpZ3kxOTJfYWs0MTE0X3dyaXRlKGljZSwgYWRkciwgdGVzdF9kYXRhKTsKKwlpZiAocHJvZGlneTE5Ml9hazQxMTRfcmVhZChpY2UsIGFkZHIpID09IHRlc3RfZGF0YSkgeworCQkvKiBhazQxMTQgc2VlbXMgdG8gY29tbXVuaWNhdGUsIGFwcGFyZW50bHkgZXhpc3RzICovCisJCS8qIHdyaXRpbmcgYmFjayBvcmlnaW5hbCB2YWx1ZSAqLworCQlwcm9kaWd5MTkyX2FrNDExNF93cml0ZShpY2UsIGFkZHIsIG9yaWdfdmFsdWUpOworCQlleGlzdHMgPSAxOworCX0KKwlyZXR1cm4gZXhpc3RzOworfQogCiAvKgogICogaW5pdGlhbGl6ZSB0aGUgY2hpcApAQCAtNDg3LDE2ICs4MDksMzAgQEAKIAkJKHVuc2lnbmVkIHNob3J0KS0xCiAJfTsKIAljb25zdCB1bnNpZ25lZCBzaG9ydCAqcDsKKwlpbnQgZXJyID0gMDsKIAogCS8qIHByb2RpZ3kgMTkyICovCiAJaWNlLT5udW1fdG90YWxfZGFjcyA9IDY7CiAJaWNlLT5udW1fdG90YWxfYWRjcyA9IDI7CisJaWNlLT52dDE3MjAgPSAwOyAgLyogaWNlMTcyNCwgZS5nLiAyMyBHUElPcyAqLwogCQogCS8qIGluaXRpYWxpemUgY29kZWMgKi8KIAlwID0gc3RhY19pbml0c19wcm9kaWd5OwogCWZvciAoOyAqcCAhPSAodW5zaWduZWQgc2hvcnQpLTE7IHAgKz0gMikKIAkJc3RhYzk0NjBfcHV0KGljZSwgcFswXSwgcFsxXSk7CiAKKwkvKiBNSS9PREkvTyBhZGQgb24gY2FyZCB3aXRoIEFLNDExNCAqLworCWlmIChwcm9kaWd5MTkyX21pb2Rpb19leGlzdHMoaWNlKSkgeworCQllcnIgPSBwcm9kaWd5MTkyX2FrNDExNF9pbml0KGljZSk7CisJCS8qIGZyb20gdGhpcyBtb21lbnQgaWYgZXJyID0gMCB0aGVuCisJCSAqIGljZS0+c3BlYy5wcm9kaWd5MTkyLmFrNDExNCBzaG91bGQgbm90IGJlIG51bGwKKwkJICovCisJCXNuZF9wcmludGRkKCJBSzQxMTQgaW5pdGlhbGl6ZWQgd2l0aCBzdGF0dXMgJWRcbiIsIGVycik7CisJfSBlbHNlCisJCXNuZF9wcmludGRkKCJBSzQxMTQgbm90IGZvdW5kXG4iKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwogCXJldHVybiAwOwogfQogCkBAIC01MDYsMjUgKzg0MiwzMSBAQAogICogaGVuY2UgdGhlIGRyaXZlciBuZWVkcyB0byBzZXRzIHVwIGl0IHByb3Blcmx5LgogICovCiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHByb2RpZ3k3MV9lZXByb21bXSBfX2RldmluaXRkYXRhID0gewotCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDJiLAkvKiBjbG9jayA1MTIsIG1wdTQwMSwgc3BkaWYtaW4vQURDLCA0REFDcyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcHJvZGlneTcxX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJW0lDRV9FRVAyX1NZU0NPTkZdICAgICA9IDB4NmEsCS8qIDQ5TUh6IGNyeXN0YWwsIG1wdTQwMSwKKwkJCQkJICogc3BkaWYtaW4rIDEgc3RlcmVvIEFEQywKKwkJCQkJICogMyBzdGVyZW8gREFDcworCQkJCQkgKi8KIAlbSUNFX0VFUDJfQUNMSU5LXSAgICAgID0gMHg4MCwJLyogSTJTICovCiAJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4ZjgsCS8qIHZvbCwgOTZrLCAyNGJpdCwgMTkyayAqLwogCVtJQ0VfRUVQMl9TUERJRl0gICAgICAgPSAweGMzLAkvKiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCiAJW0lDRV9FRVAyX0dQSU9fRElSXSAgICA9IDB4ZmYsCi0JW0lDRV9FRVAyX0dQSU9fRElSMV0gICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMV0gICA9IH4oVlQxNzI0X1BST0RJR1kxOTJfQ0RJTiA+PiA4KSAsCiAJW0lDRV9FRVAyX0dQSU9fRElSMl0gICA9IDB4YmYsCiAJW0lDRV9FRVAyX0dQSU9fTUFTS10gICA9IDB4MDAsCiAJW0lDRV9FRVAyX0dQSU9fTUFTSzFdICA9IDB4MDAsCiAJW0lDRV9FRVAyX0dQSU9fTUFTSzJdICA9IDB4MDAsCiAJW0lDRV9FRVAyX0dQSU9fU1RBVEVdICA9IDB4MDAsCiAJW0lDRV9FRVAyX0dQSU9fU1RBVEUxXSA9IDB4MDAsCi0JW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MDAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSA9IDB4MTAsICAvKiBHUElPMjA6IDAgPSBDRCBkcml2ZSBkaWcuIGlucHV0CisJCQkJCSAqIHBhc3N0aHJvdWdoLAorCQkJCQkgKiAxID0gU1BESUYtT1VUIGZyb20gaWNlMTcyNAorCQkJCQkgKi8KIH07CiAKIAogLyogZW50cnkgcG9pbnQgKi8KLWNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9wcm9kaWd5MTkyX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9wcm9kaWd5MTkyX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1kxOTJWRSwKIAkJLm5hbWUgPSAiQXVkaW90cmFrIFByb2RpZ3kgMTkyIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL3Byb2RpZ3kxOTIuaAppbmRleCAyZmEyZTYyLi4xNmE1M2I0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9wcm9kaWd5MTkyLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvcHJvZGlneTE5Mi5oCkBAIC01LDcgKzUsMTUgQEAKICNkZWZpbmUgUFJPRElHWTE5Ml9TVEFDOTQ2MF9BRERSCTB4NTQKIAogI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1kxOTJWRQkgMHgzNDQ5NTM0NQkvKiBQUk9ESUdZIDE5MiBWRSAqLworLyoKKyAqICBBdWRpb1RyYWsgUHJvZGlneTE5MiBHUElPIGRlZmluaXRpb25zIGZvciBNSS9PREkvTyBjYXJkIHdpdGgKKyAqICBBSzQxMTQgKFNQRElGLUlOKQorICovCisjZGVmaW5lIFZUMTcyNF9QUk9ESUdZMTkyX0NTCSgxIDw8IDgpCS8qIEdQSU84LCBwaW4gNzUgKi8KKyNkZWZpbmUgVlQxNzI0X1BST0RJR1kxOTJfQ0NMSwkoMSA8PCA5KQkvKiBHUElPOSwgcGluIDc2ICovCisjZGVmaW5lIFZUMTcyNF9QUk9ESUdZMTkyX0NET1VUCSgxIDw8IDEwKQkvKiBHUElPMTAsIHBpbiA3NyAqLworI2RlZmluZSBWVDE3MjRfUFJPRElHWTE5Ml9DRElOCSgxIDw8IDExKQkvKiBHUElPMTEsIHBpbiA4NiAqLwogCi1leHRlcm4gY29uc3Qgc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9wcm9kaWd5MTkyX2NhcmRzW107CitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyAgc25kX3Z0MTcyNF9wcm9kaWd5MTkyX2NhcmRzW107CiAKICNlbmRpZgkvKiBfX1NPVU5EX1BST0RJR1kxOTJfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvcmV2by5jIGIvc291bmQvcGNpL2ljZTE3MTIvcmV2by5jCmluZGV4IDAyNWE3ZTguLjY5MGNlYjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3Jldm8uYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9yZXZvX2Zyb250IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9ha200eHh4IGFrbV9yZXZvX2Zyb250IF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0MzgxLAogCS5udW1fZGFjcyA9IDIsCiAJLm9wcyA9IHsKQEAgLTIyOCw3ICsyMjgsNyBAQAogCS5kYWNfaW5mbyA9IHJldm83MV9mcm9udCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9yZXZvX2Zyb250X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9yZXZvX2Zyb250X3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAxLAogCS5jaWYgPSAwLAogCS5kYXRhX21hc2sgPSBWVDE3MjRfUkVWT19DRE9VVCwKQEAgLTI0MCw3ICsyNDAsNyBAQAogCS5tYXNrX2ZsYWdzID0gMCwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3Jldm9fc3Vycm91bmQgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3Jldm9fc3Vycm91bmQgX19kZXZpbml0ZGF0YSA9IHsKIAkudHlwZSA9IFNORF9BSzQzNTUsCiAJLmlkeF9vZmZzZXQgPSAxLAogCS5udW1fZGFjcyA9IDYsCkBAIC0yNTAsNyArMjUwLDcgQEAKIAkuZGFjX2luZm8gPSByZXZvNzFfc3Vycm91bmQsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcmV2b19zdXJyb3VuZF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcmV2b19zdXJyb3VuZF9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMywKIAkuY2lmID0gMCwKIAkuZGF0YV9tYXNrID0gVlQxNzI0X1JFVk9fQ0RPVVQsCkBAIC0yNjIsNyArMjYyLDcgQEAKIAkubWFza19mbGFncyA9IDAsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9ha200eHh4IGFrbV9yZXZvNTEgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX3Jldm81MSBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNDM1OCwKIAkubnVtX2RhY3MgPSA2LAogCS5vcHMgPSB7CkBAIC0yNzEsNyArMjcxLDcgQEAKIAkuZGFjX2luZm8gPSByZXZvNTFfZGFjLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWs0eHh4X3ByaXZhdGUgYWttX3Jldm81MV9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcmV2bzUxX3ByaXYgX19kZXZpbml0ZGF0YSA9IHsKIAkuY2FkZHIgPSAyLAogCS5jaWYgPSAwLAogCS5kYXRhX21hc2sgPSBWVDE3MjRfUkVWT19DRE9VVCwKQEAgLTI4MywxMyArMjgzLDEzIEBACiAJLm1hc2tfZmxhZ3MgPSAwLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2bzUxX2FkYyBfX2RldmluaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBzbmRfYWttNHh4eCBha21fcmV2bzUxX2FkYyBfX2RldmluaXRkYXRhID0gewogCS50eXBlID0gU05EX0FLNTM2NSwKIAkubnVtX2FkY3MgPSAyLAogCS5hZGNfaW5mbyA9IHJldm81MV9hZGMsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcmV2bzUxX2FkY19wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fcmV2bzUxX2FkY19wcml2IF9fZGV2aW5pdGRhdGEgPSB7CiAJLmNhZGRyID0gMiwKIAkuY2lmID0gMCwKIAkuZGF0YV9tYXNrID0gVlQxNzI0X1JFVk9fQ0RPVVQsCkBAIC0zMjQsNyArMzI0LDcgQEAKIAlBS19EQUMoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAyKQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWttNHh4eCBha21fYXAxOTIgX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2FrbTR4eHggYWttX2FwMTkyIF9fZGV2aW5pdGRhdGEgPSB7CiAJLnR5cGUgPSBTTkRfQUs0MzU4LAogCS5udW1fZGFjcyA9IDIsCiAJLm9wcyA9IHsKQEAgLTMzMyw3ICszMzMsNyBAQAogCS5kYWNfaW5mbyA9IGFwMTkyX2RhYywKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2FrNHh4eF9wcml2YXRlIGFrbV9hcDE5Ml9wcml2IF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9hazR4eHhfcHJpdmF0ZSBha21fYXAxOTJfcHJpdiBfX2RldmluaXRkYXRhID0gewogCS5jYWRkciA9IDIsCiAJLmNpZiA9IDAsCiAJLmRhdGFfbWFzayA9IFZUMTcyNF9SRVZPX0NET1VULApAQCAtNDA1LDcgKzQwNSw3IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFwMTkyXzR3aXJlX3N0YXJ0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQorc3RhdGljIHVuc2lnbmVkIGludCBhcDE5Ml80d2lyZV9zdGFydChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCkBAIC00NTQsNyArNDU0LDcgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAotc3RhdGljIGludCBhcDE5Ml9hazQxMTRfaW5pdChzdHJ1Y3Qgc25kX2ljZTE3MTIgKmljZSkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFwMTkyX2FrNDExNF9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFrNDExNF9pbml0X3ZhbHNbXSA9IHsKIAkJQUs0MTE0X1JTVCB8IEFLNDExNF9QV04gfCBBSzQxMTRfT0NLUzAgfCBBSzQxMTRfT0NLUzEsCkBAIC01ODIsNyArNTgyLDcgQEAKIH0KIAogLyogZW50cnkgcG9pbnQgKi8KLWNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9yZXZvX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9yZXZvX2NhcmRzW10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSBWVDE3MjRfU1VCREVWSUNFX1JFVk9MVVRJT043MSwKIAkJLm5hbWUgPSAiTSBBdWRpbyBSZXZvbHV0aW9uLTcuMSIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmggYi9zb3VuZC9wY2kvaWNlMTcxMi9yZXZvLmgKaW5kZXggMmEyNDQ4OC4uYTNiYTQyNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvcmV2by5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Jldm8uaApAQCAtMzQsNyArMzQsNyBAQAogI2RlZmluZSBWVDE3MjRfU1VCREVWSUNFX0FVRElPUEhJTEUxOTIJMHgxMjE0MzIzNgogCiAvKiBlbnRyeSBwb2ludCAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfaWNlMTcxMl9jYXJkX2luZm8gc25kX3Z0MTcyNF9yZXZvX2NhcmRzW107CitleHRlcm4gc3RydWN0IHNuZF9pY2UxNzEyX2NhcmRfaW5mbyBzbmRfdnQxNzI0X3Jldm9fY2FyZHNbXTsKIAogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3Z0MTcyMF9tb2JvLmMKaW5kZXggNzJiMDYwZC4uMjM5NTI0MSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi92dDE3MjBfbW9iby5jCkBAIC01Niw3ICs1Niw3IEBACiAKIC8qIEVFUFJPTSBpbWFnZSAqLwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrOHg4MDBfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGs4eDgwMF9lZXByb21bXSBfX2RldmluaXRkYXRhID0gewogCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgPSAweDAxLAkvKiBjbG9jayAyNTYsIDFBREMsIDJEQUNzICovCiAJW0lDRV9FRVAyX0FDTElOS10gICAgICA9IDB4MDIsCS8qIEFDTElOSywgcGFja2VkICovCiAJW0lDRV9FRVAyX0kyU10gICAgICAgICA9IDB4MDAsCS8qIC0gKi8KQEAgLTcyLDcgKzcyLDcgQEAKIAlbSUNFX0VFUDJfR1BJT19TVEFURTJdID0gMHgwMCwJLyogLSAqLwogfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc24yNXBfZWVwcm9tW10gX19kZXZpbml0ZGF0YSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNuMjVwX2VlcHJvbVtdIF9fZGV2aW5pdGRhdGEgPSB7CiAJW0lDRV9FRVAyX1NZU0NPTkZdICAgICA9IDB4MDEsCS8qIGNsb2NrIDI1NiwgMUFEQywgMkRBQ3MgKi8KIAlbSUNFX0VFUDJfQUNMSU5LXSAgICAgID0gMHgwMiwJLyogQUNMSU5LLCBwYWNrZWQgKi8KIAlbSUNFX0VFUDJfSTJTXSAgICAgICAgID0gMHgwMCwJLyogLSAqLwpAQCAtOTAsNyArOTAsNyBAQAogCiAKIC8qIGVudHJ5IHBvaW50ICovCi1jb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjBfbW9ib19jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvIHNuZF92dDE3MjBfbW9ib19jYXJkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewogCQkuc3VidmVuZG9yID0gVlQxNzIwX1NVQkRFVklDRV9LOFg4MDAsCiAJCS5uYW1lID0gIkFsYmF0cm9uIEs4WDgwMCBQcm8gSUkiLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uaCBiL3NvdW5kL3BjaS9pY2UxNzEyL3Z0MTcyMF9tb2JvLmgKaW5kZXggNzBhZjNhZC4uMGIxYjBlZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvdnQxNzIwX21vYm8uaAorKysgYi9zb3VuZC9wY2kvaWNlMTcxMi92dDE3MjBfbW9iby5oCkBAIC0zNiw2ICszNiw2IEBACiAjZGVmaW5lIFZUMTcyMF9TVUJERVZJQ0VfOUNKUwkJMHgwZjI3MjMyNwogI2RlZmluZSBWVDE3MjBfU1VCREVWSUNFX1NOMjVQCQkweDk3MTIzNjUwCiAKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICBzbmRfdnQxNzIwX21vYm9fY2FyZHNbXTsKK2V4dGVybiBzdHJ1Y3Qgc25kX2ljZTE3MTJfY2FyZF9pbmZvICBzbmRfdnQxNzIwX21vYm9fY2FyZHNbXTsKIAogI2VuZGlmIC8qIF9fU09VTkRfVlQxNzIwX01PQk9fSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvd3RtLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi93dG0uYwppbmRleCA0YTcwNmIxLi4wNGU1MzVjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi93dG0uYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi93dG0uYwpAQCAtNDA5LDcgKzQwOSw3IEBACiAvKgogICogQ29udHJvbCB0YWJzCiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGFjOTY0MF9jb250cm9sc1tdIF9fZGV2aW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3RhYzk2NDBfY29udHJvbHNbXSBfX2RldmluaXRkYXRhID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCiAJCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ludGVsOHgwLmMgYi9zb3VuZC9wY2kvaW50ZWw4eDAuYwppbmRleCA3Y2YyZGNiLi4yMDJmNzIwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaW50ZWw4eDAuYworKysgYi9zb3VuZC9wY2kvaW50ZWw4eDAuYwpAQCAtMjQ5Myw2ICsyNDkzLDcgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisJc25kX2ludGVsOHgwX2NoaXBfaW5pdChjaGlwLCAwKTsKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pbnRlbDh4MF9pbnRlcnJ1cHQsCiAJCQlJUlFGX1NIQVJFRCwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgewogCQlwcmludGsoS0VSTl9FUlIgImludGVsOHgwOiB1bmFibGUgdG8gZ3JhYiBJUlEgJWQsICIKQEAgLTI1MDIsNyArMjUwMyw2IEBACiAJfQogCWNoaXAtPmlycSA9IHBjaS0+aXJxOwogCXN5bmNocm9uaXplX2lycShjaGlwLT5pcnEpOwotCXNuZF9pbnRlbDh4MF9jaGlwX2luaXQoY2hpcCwgMCk7CiAKIAkvKiByZS1pbml0aWFsaXplIG1peGVyIHN0dWZmICovCiAJaWYgKGNoaXAtPmRldmljZV90eXBlID09IERFVklDRV9JTlRFTF9JQ0g0ICYmICFzcGRpZl9hY2xpbmspIHsKQEAgLTI4NjIsMTYgKzI4NjIsNyBAQAogCQlJQ0hfUkVHX0FMSV9JTlRFUlJVUFRTUiA6IElDSF9SRUdfR0xPQl9TVEE7CiAJY2hpcC0+aW50X3N0YV9tYXNrID0gaW50X3N0YV9tYXNrczsKIAotCS8qIHJlcXVlc3QgaXJxIGFmdGVyIGluaXRpYWxpemFpbmcgaW50X3N0YV9tYXNrLCBldGMgKi8KLQlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9pbnRlbDh4MF9pbnRlcnJ1cHQsCi0JCQlJUlFGX1NIQVJFRCwgY2FyZC0+c2hvcnRuYW1lLCBjaGlwKSkgewotCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKLQkJc25kX2ludGVsOHgwX2ZyZWUoY2hpcCk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCWNoaXAtPmlycSA9IHBjaS0+aXJxOwogCXBjaV9zZXRfbWFzdGVyKHBjaSk7Ci0Jc3luY2hyb25pemVfaXJxKGNoaXAtPmlycSk7CiAKIAlzd2l0Y2goY2hpcC0+ZGV2aWNlX3R5cGUpIHsKIAljYXNlIERFVklDRV9JTlRFTF9JQ0g0OgpAQCAtMjkwMSw2ICsyODkyLDE1IEBACiAJCXJldHVybiBlcnI7CiAJfQogCisJLyogcmVxdWVzdCBpcnEgYWZ0ZXIgaW5pdGlhbGl6YWluZyBpbnRfc3RhX21hc2ssIGV0YyAqLworCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2ludGVsOHgwX2ludGVycnVwdCwKKwkJCUlSUUZfU0hBUkVELCBjYXJkLT5zaG9ydG5hbWUsIGNoaXApKSB7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgInVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwgcGNpLT5pcnEpOworCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJY2hpcC0+aXJxID0gcGNpLT5pcnE7CisKIAlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgY2hpcCwgJm9wcykpIDwgMCkgewogCQlzbmRfaW50ZWw4eDBfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jIGIvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMKaW5kZXggMjFkMDg5OWEuLjUzMzgyNDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCisrKyBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCkBAIC0yNjQsOSArMjY0LDcgQEAKICNkZWZpbmUgQ09NTUFORF9BQ0tfREVMQVkgICAxMyAgICAgICAgIC8vIG51bWJlciBvZiBSVEMgdGlja3MgdG8gd2FpdCBmb3IgYW4gYWNrbm93bGVkZ2VtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBmcm9tIHRoZSBjYXJkIGFmdGVyIHNlbmRpbmcgYSBjb21tYW5kLgogCi0jZGVmaW5lIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKLQotI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKyNpZmRlZiBDT05GSUdfU05EX0tPUkcxMjEyX0ZJUk1XQVJFX0lOX0tFUk5FTAogI2luY2x1ZGUgImtvcmcxMjEyLWZpcm13YXJlLmgiCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpcm13YXJlIHN0YXRpY19kc3BfY29kZSA9IHsKIAkuZGF0YSA9ICh1OCAqKWRzcENvZGUsCkBAIC00MTgsNiArNDE2LDkgQEAKIE1PRFVMRV9ERVNDUklQVElPTigia29yZzEyMTIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e0tPUkcsa29yZzEyMTJ9fSIpOworI2lmbmRlZiBDT05GSUdfU05EX0tPUkcxMjEyX0ZJUk1XQVJFX0lOX0tFUk5FTAorTU9EVUxFX0ZJUk1XQVJFKCJrb3JnL2sxMjEyLmRzcCIpOworI2VuZGlmCiAKIHN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7ICAgICAvKiBJbmRleCAwLU1BWCAqLwogc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkgICAvKiBJRCBmb3IgdGhpcyBjYXJkICovCkBAIC0yMzQyLDI2ICsyMzQzLDI1IEBACiAgICAgICAgIGtvcmcxMjEyLT5BZGF0VGltZUNvZGVQaHkgPSBrb3JnMTIxMi0+c2hhcmVkQnVmZmVyUGh5ICsKIAkJb2Zmc2V0b2Yoc3RydWN0IEtvcmdTaGFyZWRCdWZmZXIsIEFkYXRUaW1lQ29kZSk7CiAKKyNpZmRlZiBDT05GSUdfU05EX0tPUkcxMjEyX0ZJUk1XQVJFX0lOX0tFUk5FTAorCWRzcF9jb2RlID0gJnN0YXRpY19kc3BfY29kZTsKKyNlbHNlCiAJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZHNwX2NvZGUsICJrb3JnL2sxMjEyLmRzcCIsICZwY2ktPmRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJcmVsZWFzZV9maXJtd2FyZShkc3BfY29kZSk7Ci0jaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAotCQlkc3BfY29kZSA9ICZzdGF0aWNfZHNwX2NvZGU7Ci0jZWxzZQogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJmaXJtd2FyZSBub3QgYXZhaWxhYmxlXG4iKTsKIAkJc25kX2tvcmcxMjEyX2ZyZWUoa29yZzEyMTIpOwogCQlyZXR1cm4gZXJyOwotI2VuZGlmCiAJfQorI2VuZGlmCiAKIAlpZiAoc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIHNuZF9kbWFfcGNpX2RhdGEocGNpKSwKIAkJCQlkc3BfY29kZS0+c2l6ZSwgJmtvcmcxMjEyLT5kbWFfZHNwKSA8IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAia29yZzEyMTI6IGNhbm5vdCBhbGxvY2F0ZSBkc3AgY29kZSBtZW1vcnkgKCV6ZCBieXRlcylcbiIsIGRzcF9jb2RlLT5zaXplKTsKICAgICAgICAgICAgICAgICBzbmRfa29yZzEyMTJfZnJlZShrb3JnMTIxMik7Ci0jaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAotCQlpZiAoZHNwX2NvZGUgIT0gJnN0YXRpY19kc3BfY29kZSkKKyNpZm5kZWYgQ09ORklHX1NORF9LT1JHMTIxMl9GSVJNV0FSRV9JTl9LRVJORUwKKwkJcmVsZWFzZV9maXJtd2FyZShkc3BfY29kZSk7CiAjZW5kaWYKLQkJCXJlbGVhc2VfZmlybXdhcmUoZHNwX2NvZGUpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwogICAgICAgICB9CiAKQEAgLTIzNzEsMTAgKzIzNzEsOSBAQAogCiAJbWVtY3B5KGtvcmcxMjEyLT5kbWFfZHNwLmFyZWEsIGRzcF9jb2RlLT5kYXRhLCBkc3BfY29kZS0+c2l6ZSk7CiAKLSNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCi0JaWYgKGRzcF9jb2RlICE9ICZzdGF0aWNfZHNwX2NvZGUpCisjaWZuZGVmIENPTkZJR19TTkRfS09SRzEyMTJfRklSTVdBUkVfSU5fS0VSTkVMCisJcmVsZWFzZV9maXJtd2FyZShkc3BfY29kZSk7CiAjZW5kaWYKLQkJcmVsZWFzZV9maXJtd2FyZShkc3BfY29kZSk7CiAKIAlyYyA9IHNuZF9rb3JnMTIxMl9TZW5kMTIxMkNvbW1hbmQoa29yZzEyMTIsIEsxMjEyX0RCX1JlYm9vdENhcmQsIDAsIDAsIDAsIDApOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWFlc3RybzMuYyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCmluZGV4IDQ1MjY5MDQuLjhhNWZmMWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jCisrKyBiL3NvdW5kL3BjaS9tYWVzdHJvMy5jCkBAIC01OSw2ICs1OSwxMCBAQAogCQkie0VTUyxBbGxlZ3JvIFBDSX0sIgogCQkie0VTUyxBbGxlZ3JvLTEgUENJfSwiCiAJICAgICAgICAie0VTUyxDYW55b24zRC0yL0xFIFBDSX19Iik7CisjaWZuZGVmIENPTkZJR19TTkRfTUFFU1RSTzNfRklSTVdBUkVfSU5fS0VSTkVMCitNT0RVTEVfRklSTVdBUkUoImVzcy9tYWVzdHJvM19hc3NwX2tlcm5lbC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJlc3MvbWFlc3RybzNfYXNzcF9taW5pc3JjLmZ3Iik7CisjZW5kaWYKIAogc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KIHN0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLwpAQCAtMjEwMSw5ICsyMTA1LDcgQEAKIH0KIAogCi0jZGVmaW5lIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKLQotI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKKyNpZmRlZiBDT05GSUdfU05EX01BRVNUUk8zX0ZJUk1XQVJFX0lOX0tFUk5FTAogCiAvKgogICogRFNQIENvZGUgaW1hZ2VzCkBAIC0yMjQyLDcgKzIyNDQsNyBAQAogCS5zaXplID0gc2l6ZW9mIGFzc3BfbWluaXNyY19pbWFnZQogfTsKIAotI2VuZGlmIC8qIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwgKi8KKyNlbHNlIC8qIENPTkZJR19TTkRfTUFFU1RSTzNfRklSTVdBUkVfSU5fS0VSTkVMICovCiAKICNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfbTNfY29udmVydF9mcm9tX2xlKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpIHsgfQpAQCAtMjI1Nyw2ICsyMjU5LDggQEAKIH0KICNlbmRpZgogCisjZW5kaWYgLyogQ09ORklHX1NORF9NQUVTVFJPM19GSVJNV0FSRV9JTl9LRVJORUwgKi8KKwogCiAvKgogICogaW5pdGlhbGl6ZSBBU1NQCkBAIC0yNTUwLDE0ICsyNTU0LDEwIEBACiAJaWYgKGNoaXAtPmlvYmFzZSkKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhjaGlwLT5wY2kpOwogCi0jaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAotCWlmIChjaGlwLT5hc3NwX2tlcm5lbF9pbWFnZSAhPSAmYXNzcF9rZXJuZWwpCisjaWZuZGVmIENPTkZJR19TTkRfTUFFU1RSTzNfRklSTVdBUkVfSU5fS0VSTkVMCisJcmVsZWFzZV9maXJtd2FyZShjaGlwLT5hc3NwX2tlcm5lbF9pbWFnZSk7CisJcmVsZWFzZV9maXJtd2FyZShjaGlwLT5hc3NwX21pbmlzcmNfaW1hZ2UpOwogI2VuZGlmCi0JCXJlbGVhc2VfZmlybXdhcmUoY2hpcC0+YXNzcF9rZXJuZWxfaW1hZ2UpOwotI2lmZGVmIEZJUk1XQVJFX0lOX1RIRV9LRVJORUwKLQlpZiAoY2hpcC0+YXNzcF9taW5pc3JjX2ltYWdlICE9ICZhc3NwX21pbmlzcmMpCi0jZW5kaWYKLQkJcmVsZWFzZV9maXJtd2FyZShjaGlwLT5hc3NwX21pbmlzcmNfaW1hZ2UpOwogCiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7CiAJa2ZyZWUoY2hpcCk7CkBAIC0yNzQ3LDI5ICsyNzQ3LDI5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorI2lmZGVmIENPTkZJR19TTkRfTUFFU1RSTzNfRklSTVdBUkVfSU5fS0VSTkVMCisJY2hpcC0+YXNzcF9rZXJuZWxfaW1hZ2UgPSAmYXNzcF9rZXJuZWw7CisjZWxzZQogCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmNoaXAtPmFzc3Bfa2VybmVsX2ltYWdlLAogCQkJICAgICAgICJlc3MvbWFlc3RybzNfYXNzcF9rZXJuZWwuZnciLCAmcGNpLT5kZXYpOwogCWlmIChlcnIgPCAwKSB7Ci0jaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAotCQljaGlwLT5hc3NwX2tlcm5lbF9pbWFnZSA9ICZhc3NwX2tlcm5lbDsKLSNlbHNlCiAJCXNuZF9tM19mcmVlKGNoaXApOwogCQlyZXR1cm4gZXJyOwotI2VuZGlmCiAJfSBlbHNlCiAJCXNuZF9tM19jb252ZXJ0X2Zyb21fbGUoY2hpcC0+YXNzcF9rZXJuZWxfaW1hZ2UpOworI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfU05EX01BRVNUUk8zX0ZJUk1XQVJFX0lOX0tFUk5FTAorCWNoaXAtPmFzc3BfbWluaXNyY19pbWFnZSA9ICZhc3NwX21pbmlzcmM7CisjZWxzZQogCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmNoaXAtPmFzc3BfbWluaXNyY19pbWFnZSwKIAkJCSAgICAgICAiZXNzL21hZXN0cm8zX2Fzc3BfbWluaXNyYy5mdyIsICZwY2ktPmRldik7CiAJaWYgKGVyciA8IDApIHsKLSNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCi0JCWNoaXAtPmFzc3BfbWluaXNyY19pbWFnZSA9ICZhc3NwX21pbmlzcmM7Ci0jZWxzZQogCQlzbmRfbTNfZnJlZShjaGlwKTsKIAkJcmV0dXJuIGVycjsKLSNlbmRpZgogCX0gZWxzZQogCQlzbmRfbTNfY29udmVydF9mcm9tX2xlKGNoaXAtPmFzc3BfbWluaXNyY19pbWFnZSk7CisjZW5kaWYKIAogCWlmICgoZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksIGNhcmQtPmRyaXZlcikpIDwgMCkgewogCQlzbmRfbTNfZnJlZShjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2h3ZGVwLmMgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydF9od2RlcC5jCmluZGV4IGNhMDUwNzUuLjFkOTIzMmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0X2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL21peGFydC9taXhhcnRfaHdkZXAuYwpAQCAtNTY1LDYgKzU2NSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKK01PRFVMRV9GSVJNV0FSRSgibWl4YXJ0L21pWGFydDgueGx4Iik7CitNT0RVTEVfRklSTVdBUkUoIm1peGFydC9taVhhcnQ4LmVsZiIpOworTU9EVUxFX0ZJUk1XQVJFKCJtaXhhcnQvbWlYYXJ0OEFFUy54bHgiKTsKIAogI2Vsc2UgLyogb2xkIHN0eWxlIGZpcm13YXJlIGxvYWRpbmcgKi8KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3BjeGhyL3BjeGhyLmMgYi9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYwppbmRleCBkOTc0MTM0Li5mN2Y2YTY4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYworKysgYi9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYwpAQCAtNjM4LDIyICs2MzgsMjIgQEAKIHN0YXRpYyBpbnQgcGN4aHJfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnMsIGludCBjbWQpCiB7CiAJc3RydWN0IHBjeGhyX3N0cmVhbSAqc3RyZWFtOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7Ci0JaW50IGk7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CiAJCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVFxuIik7Ci0JCWkgPSAwOwotCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3VicykgewotCQkJcyA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7Ci0JCQlzdHJlYW0gPSBzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0JCQlzdHJlYW0tPnN0YXR1cyA9IFBDWEhSX1NUUkVBTV9TVEFUVVNfU0NIRURVTEVfUlVOOwotCQkJc25kX3BjbV90cmlnZ2VyX2RvbmUocywgc3Vicyk7Ci0JCQlpKys7Ci0JCX0KLQkJaWYgKGk9PTEpIHsKKwkJaWYgKHNuZF9wY21fc3RyZWFtX2xpbmtlZChzdWJzKSkgeworCQkJc3RydWN0IHNuZF9wY3hociAqY2hpcCA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vicyk7CisJCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnMpIHsKKwkJCQlzdHJlYW0gPSBzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJCQkJc3RyZWFtLT5zdGF0dXMgPQorCQkJCQlQQ1hIUl9TVFJFQU1fU1RBVFVTX1NDSEVEVUxFX1JVTjsKKwkJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzKTsKKwkJCX0KKwkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmNoaXAtPm1nci0+dHJpZ2dlcl90YXNrcSk7CisJCX0gZWxzZSB7CisJCQlzdHJlYW0gPSBzdWJzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJCQlzbmRfcHJpbnRkZCgiT25seSBvbmUgU3Vic3RyZWFtICVjICVkXG4iLAogCQkJCSAgICBzdHJlYW0tPnBpcGUtPmlzX2NhcHR1cmUgPyAnQycgOiAnUCcsCiAJCQkJICAgIHN0cmVhbS0+cGlwZS0+Zmlyc3RfYXVkaW8pOwpAQCAtNjY1LDE1ICs2NjUsMTEgQEAKIAkJCWlmIChwY3hocl9zZXRfc3RyZWFtX3N0YXRlKHN0cmVhbSkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlzdHJlYW0tPnN0YXR1cyA9IFBDWEhSX1NUUkVBTV9TVEFUVVNfUlVOTklORzsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBzbmRfcGN4aHIgKmNoaXAgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnMpOwotCQkJdGFza2xldF9oaV9zY2hlZHVsZSgmY2hpcC0+bWdyLT50cmlnZ2VyX3Rhc2txKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJCXNuZF9wcmludGRkKCJTTkRSVl9QQ01fVFJJR0dFUl9TVE9QXG4iKTsKLQkJc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnMpIHsKLQkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnMpIHsKIAkJCXN0cmVhbSA9IHMtPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKIAkJCXN0cmVhbS0+c3RhdHVzID0gUENYSFJfU1RSRUFNX1NUQVRVU19TQ0hFRFVMRV9TVE9QOwogCQkJaWYgKHBjeGhyX3NldF9zdHJlYW1fc3RhdGUoc3RyZWFtKSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9wY3hoci9wY3hocl9od2RlcC5jIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKaW5kZXggMzY5YzE5Zi4uZDU1ZDhiYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKKysrIGIvc291bmQvcGNpL3BjeGhyL3BjeGhyX2h3ZGVwLmMKQEAgLTM1Niw2ICszNTYsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorTU9EVUxFX0ZJUk1XQVJFKCJwY3hoci94aV8xXzg4Mi5kYXQiKTsKK01PRFVMRV9GSVJNV0FSRSgicGN4aHIveGNfMV84ODIuZGF0Iik7CitNT0RVTEVfRklSTVdBUkUoInBjeGhyL2UzMjFfNTEyLmU1NiIpOworTU9EVUxFX0ZJUk1XQVJFKCJwY3hoci9iMzIxXzUxMi5iNTYiKTsKK01PRFVMRV9GSVJNV0FSRSgicGN4aHIvZDMyMV81MTIuZDU2Iik7CisKICNlbHNlIC8qIG9sZCBzdHlsZSBmaXJtd2FyZSBsb2FkaW5nICovCiAKIC8qIHBjeGhyIGh3ZGVwIGludGVyZmFjZSBpZCBzdHJpbmcgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYyBiL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYwppbmRleCA5NTI2MjVkLi44ZTU0MTA0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKKysrIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCkBAIC0xMTcsNiArMTE3LDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigicmlwdGlkZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7Q29uZXhhbnQsUmlwdGlkZX19Iik7CitNT0RVTEVfRklSTVdBUkUoInJpcHRpZGUuaGV4Iik7CiAKIHN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CiBzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lMzIuYyBiL3NvdW5kL3BjaS9ybWUzMi5jCmluZGV4IDZiYjdhYzYuLjYxODY1M2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWUzMi5jCisrKyBiL3NvdW5kL3BjaS9ybWUzMi5jCkBAIC0xMDc4LDEyICsxMDc4LDEwIEBACiBzbmRfcm1lMzJfcGNtX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCiB7CiAJc3RydWN0IHJtZTMyICpybWUzMiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzOwogCiAJc3Bpbl9sb2NrKCZybWUzMi0+bG9jayk7Ci0Jc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgewotCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQlpZiAocyAhPSBybWUzMi0+cGxheWJhY2tfc3Vic3RyZWFtICYmCiAJCSAgICBzICE9IHJtZTMyLT5jYXB0dXJlX3N1YnN0cmVhbSkKIAkJCWNvbnRpbnVlOwpAQCAtMTExMCw4ICsxMTA4LDcgQEAKIAkKIAkvKiBwcmVmaWxsIHBsYXliYWNrIGJ1ZmZlciAqLwogCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RBUlQgJiYgcm1lMzItPmZ1bGxkdXBsZXhfbW9kZSkgewotCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7Ci0JCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwkJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKIAkJCWlmIChzID09IHJtZTMyLT5wbGF5YmFja19zdWJzdHJlYW0pIHsKIAkJCQlzLT5vcHMtPmFjayhzKTsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwppbmRleCA4OWIzYzdmLi4zYjNlZjY1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCkBAIC02MCw2ICs2MCwxMiBAQAogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7Uk1FIEhhbW1lcmZhbGwtRFNQfSwiCiAJICAgICAgICAie1JNRSBIRFNQLTk2NTJ9LCIKIAkJIntSTUUgSERTUC05NjMyfX0iKTsKKyNpZmRlZiBIRFNQX0ZXX0xPQURFUgorTU9EVUxFX0ZJUk1XQVJFKCJtdWx0aWZhY2VfZmlybXdhcmUuYmluIik7CitNT0RVTEVfRklSTVdBUkUoIm11bHRpZmFjZV9maXJtd2FyZV9yZXYxMS5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgiZGlnaWZhY2VfZmlybXdhcmUuYmluIik7CitNT0RVTEVfRklSTVdBUkUoImRpZ2lmYWNlX2Zpcm13YXJlX3JldjExLmJpbiIpOworI2VuZGlmCiAKICNkZWZpbmUgSERTUF9NQVhfQ0hBTk5FTFMgICAgICAgIDI2CiAjZGVmaW5lIEhEU1BfTUFYX0RTX0NIQU5ORUxTICAgICAxNApAQCAtMjc1LDYgKzI4MSwxMSBAQAogI2RlZmluZSBIRFNQX0ZyZXF1ZW5jeTEyOEtIeiAgIChIRFNQX1F1YWRTcGVlZHxIRFNQX0RvdWJsZVNwZWVkfEhEU1BfRnJlcXVlbmN5MCkKICNkZWZpbmUgSERTUF9GcmVxdWVuY3kxNzZfNEtIeiAoSERTUF9RdWFkU3BlZWR8SERTUF9Eb3VibGVTcGVlZHxIRFNQX0ZyZXF1ZW5jeTEpCiAjZGVmaW5lIEhEU1BfRnJlcXVlbmN5MTkyS0h6ICAgKEhEU1BfUXVhZFNwZWVkfEhEU1BfRG91YmxlU3BlZWR8SERTUF9GcmVxdWVuY3kxfEhEU1BfRnJlcXVlbmN5MCkKKy8qIFJNRSBzYXlzIG4gPSAxMDQ4NTc2MDAwMDAwMDAsIGJ1dCBpbiB0aGUgd2luZG93cyBNQURJIGRyaXZlciwgSSBzZWU6CisJcmV0dXJuIDEwNDg1NzYwMDAwMDAwMCAvIHJhdGU7IC8vIDEwMCBNSHoKKwlyZXR1cm4gMTEwMTAwNDgwMDAwMDAwIC8gcmF0ZTsgLy8gMTA1IE1IegorKi8KKyNkZWZpbmUgRERTX05VTUVSQVRPUiAxMDQ4NTc2MDAwMDAwMDBVTEw7ICAvKiAgPSAgMl4yMCAqIDEwXjggKi8KIAogI2RlZmluZSBoZHNwX2VuY29kZV9sYXRlbmN5KHgpICAgICAgICgoKHgpPDwxKSAmIEhEU1BfTGF0ZW5jeU1hc2spCiAjZGVmaW5lIGhkc3BfZGVjb2RlX2xhdGVuY3koeCkgICAgICAgKCgoeCkgJiBIRFNQX0xhdGVuY3lNYXNrKT4+MSkKQEAgLTEwMDEsMTEgKzEwMTIsNyBAQAogCWVsc2UgaWYgKHJhdGUgPj0gNTYwMDApCiAJCXJhdGUgLz0gMjsKIAotCS8qIFJNRSBzYXlzIG4gPSAxMDQ4NTc2MDAwMDAwMDAsIGJ1dCBpbiB0aGUgd2luZG93cyBNQURJIGRyaXZlciwgSSBzZWU6Ci0vLwlyZXR1cm4gMTA0ODU3NjAwMDAwMDAwIC8gcmF0ZTsgLy8gMTAwIE1IegotCXJldHVybiAxMTAxMDA0ODAwMDAwMDAgLyByYXRlOyAvLyAxMDUgTUh6Ci0gICAgICAgICovCSAgIAotCW4gPSAxMDQ4NTc2MDAwMDAwMDBVTEw7ICAvKiAgPSAgMl4yMCAqIDEwXjggKi8KKwluID0gRERTX05VTUVSQVRPUjsKIAlkaXY2NF8zMigmbiwgcmF0ZSwgJnIpOwogCS8qIG4gc2hvdWxkIGJlIGxlc3MgdGhhbiAyXjMyIGZvciBiZWluZyB3cml0dGVuIHRvIEZSRVEgcmVnaXN0ZXIgKi8KIAlzbmRfYXNzZXJ0KChuID4+IDMyKSA9PSAwKTsKQEAgLTMwODUsMTEgKzMwOTIsODMgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBIRFNQX0REU19PRkZTRVQoeG5hbWUsIHhpbmRleCkgXAoreyAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwgXAorICAubmFtZSA9IHhuYW1lLCBcCisgIC5pbmRleCA9IHhpbmRleCwgXAorICAuaW5mbyA9IHNuZF9oZHNwX2luZm9fZGRzX29mZnNldCwgXAorICAuZ2V0ID0gc25kX2hkc3BfZ2V0X2Rkc19vZmZzZXQsIFwKKyAgLnB1dCA9IHNuZF9oZHNwX3B1dF9kZHNfb2Zmc2V0IFwKK30KKworc3RhdGljIGludCBoZHNwX2Rkc19vZmZzZXQoc3RydWN0IGhkc3AgKmhkc3ApCit7CisJdTY0IG47CisJdTMyIHI7CisJdW5zaWduZWQgaW50IGRkc192YWx1ZSA9IGhkc3AtPmRkc192YWx1ZTsKKwlpbnQgc3lzdGVtX3NhbXBsZV9yYXRlID0gaGRzcC0+c3lzdGVtX3NhbXBsZV9yYXRlOworCisJbiA9IEREU19OVU1FUkFUT1I7CisJLyoKKwkgKiBkZHNfdmFsdWUgPSBuIC8gcmF0ZQorCSAqIHJhdGUgPSBuIC8gZGRzX3ZhbHVlCisJICovCisJZGl2NjRfMzIoJm4sIGRkc192YWx1ZSwgJnIpOworCWlmIChzeXN0ZW1fc2FtcGxlX3JhdGUgPj0gMTEyMDAwKQorCQluICo9IDQ7CisJZWxzZSBpZiAoc3lzdGVtX3NhbXBsZV9yYXRlID49IDU2MDAwKQorCQluICo9IDI7CisJcmV0dXJuICgoaW50KW4pIC0gc3lzdGVtX3NhbXBsZV9yYXRlOworfQorCitzdGF0aWMgaW50IGhkc3Bfc2V0X2Rkc19vZmZzZXQoc3RydWN0IGhkc3AgKmhkc3AsIGludCBvZmZzZXRfaHopCit7CisJaW50IHJhdGUgPSBoZHNwLT5zeXN0ZW1fc2FtcGxlX3JhdGUgKyBvZmZzZXRfaHo7CisJaGRzcF9zZXRfZGRzX3ZhbHVlKGhkc3AsIHJhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9oZHNwX2luZm9fZGRzX29mZnNldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IC01MDAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDUwMDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfZ2V0X2Rkc19vZmZzZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCQorCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBoZHNwX2Rkc19vZmZzZXQoaGRzcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BfcHV0X2Rkc19vZmZzZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBoZHNwICpoZHNwID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJaW50IHZhbDsKKwkKKwlpZiAoIXNuZF9oZHNwX3VzZV9pc19leGNsdXNpdmUoaGRzcCkpCisJCXJldHVybiAtRUJVU1k7CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlzcGluX2xvY2tfaXJxKCZoZHNwLT5sb2NrKTsKKwlpZiAodmFsICE9IGhkc3BfZGRzX29mZnNldChoZHNwKSkKKwkJY2hhbmdlID0gKGhkc3Bfc2V0X2Rkc19vZmZzZXQoaGRzcCwgdmFsKSA9PSAwKSA/IDEgOiAwOworCWVsc2UKKwkJY2hhbmdlID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmhkc3AtPmxvY2spOworCXJldHVybiBjaGFuZ2U7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfaGRzcF85NjMyX2NvbnRyb2xzW10gPSB7CiBIRFNQX0RBX0dBSU4oIkRBIEdhaW4iLCAwKSwKIEhEU1BfQURfR0FJTigiQUQgR2FpbiIsIDApLAogSERTUF9QSE9ORV9HQUlOKCJQaG9uZXMgR2FpbiIsIDApLAotSERTUF9YTFJfQlJFQUtPVVRfQ0FCTEUoIlhMUiBCcmVha291dCBDYWJsZSIsIDApCitIRFNQX1hMUl9CUkVBS09VVF9DQUJMRSgiWExSIEJyZWFrb3V0IENhYmxlIiwgMCksCitIRFNQX0REU19PRkZTRVQoIkREUyBTYW1wbGUgUmF0ZSBPZmZzZXQiLCAwKQogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9oZHNwX2NvbnRyb2xzW10gPSB7CkBAIC0zNzgwLDExICszODU5LDkgQEAKIAllbHNlCiAJCXJ1bnRpbWUtPnN0YXR1cy0+aHdfcHRyID0gMDsKIAlpZiAob3RoZXIpIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7CiAJCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKm9ydW50aW1lID0gb3RoZXItPnJ1bnRpbWU7Ci0JCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLQkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQkJaWYgKHMgPT0gb3RoZXIpIHsKIAkJCQlvcnVudGltZS0+c3RhdHVzLT5od19wdHIgPSBydW50aW1lLT5zdGF0dXMtPmh3X3B0cjsKIAkJCQlicmVhazsKQEAgLTM5MzMsMTAgKzQwMTAsOCBAQAogCQlvdGhlciA9IGhkc3AtPnBsYXliYWNrX3N1YnN0cmVhbTsKIAogCWlmIChvdGhlcikgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKLQkJc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgewotCQkJcyA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7CisJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CiAJCQlpZiAocyA9PSBvdGhlcikgewogCQkJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7CiAJCQkJaWYgKGNtZCA9PSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCmluZGV4IDZlOTU4NTcuLjE0MzE4NWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwpAQCAtOTEsOCArOTEsMTAgQEAKICNkZWZpbmUgSERTUE1fY29udHJvbFJlZ2lzdGVyCSAgICAgNjQKICNkZWZpbmUgSERTUE1faW50ZXJydXB0Q29uZmlybWF0aW9uICA5NgogI2RlZmluZSBIRFNQTV9jb250cm9sMlJlZwkgICAgIDI1NiAgLyogbm90IGluIHNwZWNzID8/Pz8/Pz8/ICovCisjZGVmaW5lIEhEU1BNX2ZyZXFSZWcgICAgICAgICAgICAgICAgMjU2ICAvKiBmb3IgQUVTMzIgKi8KICNkZWZpbmUgSERTUE1fbWlkaURhdGFPdXQwICAJICAgICAzNTIgIC8qIGp1c3QgYmVsaWV2ZSBpbiBvbGQgY29kZSAqLwogI2RlZmluZSBIRFNQTV9taWRpRGF0YU91dDEgIAkgICAgIDM1NgorI2RlZmluZSBIRFNQTV9lZXByb21fd3IJCSAgICAgMzg0ICAvKiBmb3IgQUVTMzIgKi8KIAogLyogRE1BIGVuYWJsZSBmb3IgNjQgY2hhbm5lbHMsIG9ubHkgQml0IDAgaXMgcmVsZXZhbnQgKi8KICNkZWZpbmUgSERTUE1fb3V0cHV0RW5hYmxlQmFzZSAgICAgICA1MTIgIC8qIDUxMi03NjcgIGlucHV0ICBETUEgKi8gCkBAIC0zODksOSArMzkxLDggQEAKICAgIHNpemUgaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLCBhbmQKICAgIGFsc28gdGhlIGxhdGVuY3kgdG8gdXNlLiAKICAgIGZvciBvbmUgZGlyZWN0aW9uICEhIQotICAgPT4gbmVlZCB0byBtdXBsdGlwbHkgYnkgMiEhCiAqLwotI2RlZmluZSBIRFNQTV9ETUFfQVJFQV9CWVRFUyAoMiAqIEhEU1BNX01BWF9DSEFOTkVMUyAqIEhEU1BNX0NIQU5ORUxfQlVGRkVSX0JZVEVTKQorI2RlZmluZSBIRFNQTV9ETUFfQVJFQV9CWVRFUyAoSERTUE1fTUFYX0NIQU5ORUxTICogSERTUE1fQ0hBTk5FTF9CVUZGRVJfQllURVMpCiAjZGVmaW5lIEhEU1BNX0RNQV9BUkVBX0tJTE9CWVRFUyAoSERTUE1fRE1BX0FSRUFfQllURVMvMTAyNCkKIAogLyogcmV2aXNpb25zID49IDIzMCBpbmRpY2F0ZSBBRVMzMiBjYXJkICovCkBAIC00ODQsMjggKzQ4NSw2IEBACiAgICA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMKIH07CiAKLXN0YXRpYyBjaGFyIGNoYW5uZWxfbWFwX21hZGlfZHNbSERTUE1fTUFYX0NIQU5ORUxTXSA9IHsKLSAgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNCwKLSAgMTYsIDE4LCAyMCwgMjIsIDI0LCAyNiwgMjgsIDMwLAotICAzMiwgMzQsIDM2LCAzOCwgNDAsIDQyLCA0NCwgNDYsCi0gIDQ4LCA1MCwgNTIsIDU0LCA1NiwgNTgsIDYwLCA2MiwKLSAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKLSAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCi19OwotCi1zdGF0aWMgY2hhciBjaGFubmVsX21hcF9tYWRpX3FzW0hEU1BNX01BWF9DSEFOTkVMU10gPSB7Ci0gIDAsICAgNCwgIDgsIDEyLCAxNiwgMjAsIDI0LCAgMjgsICAKLSAgMzIsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsICA2MAotICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsICAKLSAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgCi0gIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgCi0gIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQotfTsKLQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2hkc3BtX2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiAJewpAQCAtODE4LDYgKzc5NywyNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBoZHNwbV9zZXRfZGRzX3ZhbHVlKHN0cnVjdCBoZHNwbSAqaGRzcG0sIGludCByYXRlKQoreworCXU2NCBuOworCXUzMiByOworCQorCWlmIChyYXRlID49IDExMjAwMCkKKwkJcmF0ZSAvPSA0OworCWVsc2UgaWYgKHJhdGUgPj0gNTYwMDApCisJCXJhdGUgLz0gMjsKKworCS8qIFJNRSBzYXlzIG4gPSAxMDQ4NTc2MDAwMDAwMDAsIGJ1dCBpbiB0aGUgd2luZG93cyBNQURJIGRyaXZlciwgSSBzZWU6CisvLwlyZXR1cm4gMTA0ODU3NjAwMDAwMDAwIC8gcmF0ZTsgLy8gMTAwIE1IegorCXJldHVybiAxMTAxMDA0ODAwMDAwMDAgLyByYXRlOyAvLyAxMDUgTUh6CisgICAgICAgICovCSAgIAorCS8vbiA9IDEwNDg1NzYwMDAwMDAwMFVMTDsgIC8qICA9ICAyXjIwICogMTBeOCAqLworCW4gPSAxMTAxMDA0ODAwMDAwMDBVTEw7ICAgIC8qIFZhbHVlIGNoZWNrZWQgZm9yIEFFUzMyIGFuZCBNQURJICovCisJZGl2NjRfMzIoJm4sIHJhdGUsICZyKTsKKwkvKiBuIHNob3VsZCBiZSBsZXNzIHRoYW4gMl4zMiBmb3IgYmVpbmcgd3JpdHRlbiB0byBGUkVRIHJlZ2lzdGVyICovCisJc25kX2Fzc2VydCgobiA+PiAzMikgPT0gMCk7CisJaGRzcG1fd3JpdGUoaGRzcG0sIEhEU1BNX2ZyZXFSZWcsICh1MzIpbik7Cit9CiAKIC8qIGR1bW15IHNldCByYXRlIGxldHMgc2VlIHdoYXQgaGFwcGVucyAqLwogc3RhdGljIGludCBoZHNwbV9zZXRfcmF0ZShzdHJ1Y3QgaGRzcG0gKiBoZHNwbSwgaW50IHJhdGUsIGludCBjYWxsZWRfaW50ZXJuYWxseSkKQEAgLTk0MywxMiArOTQzLDE2IEBACiAJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gcmF0ZV9iaXRzOwogCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKIAotCWlmIChyYXRlID4gOTYwMDAgLyogNjQwMDAqLykKLQkJaGRzcG0tPmNoYW5uZWxfbWFwID0gY2hhbm5lbF9tYXBfbWFkaV9xczsKLQllbHNlIGlmIChyYXRlID4gNDgwMDApCi0JCWhkc3BtLT5jaGFubmVsX21hcCA9IGNoYW5uZWxfbWFwX21hZGlfZHM7Ci0JZWxzZSAKLQkJaGRzcG0tPmNoYW5uZWxfbWFwID0gY2hhbm5lbF9tYXBfbWFkaV9zczsKKwkvKiBGb3IgQUVTMzIsIG5lZWQgdG8gc2V0IEREUyB2YWx1ZSBpbiBGUkVRIHJlZ2lzdGVyCisJICAgRm9yIE1BREksIGFsc28gYXBwYXJlbnRseSAqLworCWhkc3BtX3NldF9kZHNfdmFsdWUoaGRzcG0sIHJhdGUpOworCQorCWlmIChoZHNwbS0+aXNfYWVzMzIgJiYgcmF0ZSAhPSBjdXJyZW50X3JhdGUpCisJCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9lZXByb21fd3IsIDApOworCQorCS8qIEZvciBBRVMzMiBhbmQgZm9yIE1BREkgKGF0IGxlYXN0IHJldiAyMDQpLCBjaGFubmVsX21hcCBuZWVkcyB0bworCSAqIGFsd2F5cyBiZSBjaGFubmVsX21hcF9tYWRpX3NzLCB3aGF0ZXZlciB0aGUgc2FtcGxlIHJhdGUgKi8KKwloZHNwbS0+Y2hhbm5lbF9tYXAgPSBjaGFubmVsX21hcF9tYWRpX3NzOwogCiAJaGRzcG0tPnN5c3RlbV9zYW1wbGVfcmF0ZSA9IHJhdGU7CiAKQEAgLTMxODQsOCArMzE4OCw4IEBACiAJCSAgICBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9taWRpU3RhdHVzSW4wKSAmIDB4RkYsCiAJCSAgICBoZHNwbV9yZWFkKGhkc3BtLCBIRFNQTV9taWRpU3RhdHVzSW4xKSAmIDB4RkYpOwogCXNuZF9pcHJpbnRmKGJ1ZmZlciwKLQkJICAgICJSZWdpc3RlcjogY3RybDE9MHgleCwgY3RybDI9MHgleCwgc3RhdHVzMT0weCV4LCBzdGF0dXMyPTB4JXgsIHRpbWVjb2RlPTB4JXhcbiIsCi0JCSAgICBoZHNwbS0+Y29udHJvbF9yZWdpc3RlciwgaGRzcG0tPmNvbnRyb2wyX3JlZ2lzdGVyLAorCQkgICAgIlJlZ2lzdGVyOiBjdHJsMT0weCV4LCBzdGF0dXMxPTB4JXgsIHN0YXR1czI9MHgleCwgdGltZWNvZGU9MHgleFxuIiwKKwkJICAgIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyLAogCQkgICAgc3RhdHVzLCBzdGF0dXMyLCB0aW1lY29kZSk7CiAKIAlzbmRfaXByaW50ZihidWZmZXIsICItLS0gU2V0dGluZ3MgLS0tXG4iKTsKQEAgLTMzNzcsMTMgKzMzODEsMTYgQEAKIAogCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sUmVnaXN0ZXIsIGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyKTsKIAorICAgICAgICBpZiAoIWhkc3BtLT5pc19hZXMzMikgeworCQkvKiBObyBjb250cm9sMiByZWdpc3RlciBmb3IgQUVTMzIgKi8KICNpZmRlZiBTTkRSVl9CSUdfRU5ESUFOCi0JaGRzcG0tPmNvbnRyb2wyX3JlZ2lzdGVyID0gSERTUE1fQklHRU5ESUFOX01PREU7CisJCWhkc3BtLT5jb250cm9sMl9yZWdpc3RlciA9IEhEU1BNX0JJR0VORElBTl9NT0RFOwogI2Vsc2UKLQloZHNwbS0+Y29udHJvbDJfcmVnaXN0ZXIgPSAwOworCQloZHNwbS0+Y29udHJvbDJfcmVnaXN0ZXIgPSAwOwogI2VuZGlmCiAKLQloZHNwbV93cml0ZShoZHNwbSwgSERTUE1fY29udHJvbDJSZWcsIGhkc3BtLT5jb250cm9sMl9yZWdpc3Rlcik7CisJCWhkc3BtX3dyaXRlKGhkc3BtLCBIRFNQTV9jb250cm9sMlJlZywgaGRzcG0tPmNvbnRyb2wyX3JlZ2lzdGVyKTsKKwl9CiAJaGRzcG1fY29tcHV0ZV9wZXJpb2Rfc2l6ZShoZHNwbSk7CiAKIAkvKiBzaWxlbmNlIGV2ZXJ5dGhpbmcgKi8KQEAgLTM1NzUsMTEgKzM1ODIsOSBAQAogCWVsc2UKIAkJcnVudGltZS0+c3RhdHVzLT5od19wdHIgPSAwOwogCWlmIChvdGhlcikgewotCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CiAJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKIAkJc3RydWN0IHNuZF9wY21fcnVudGltZSAqb3J1bnRpbWUgPSBvdGhlci0+cnVudGltZTsKLQkJc25kX3BjbV9ncm91cF9mb3JfZWFjaChwb3MsIHN1YnN0cmVhbSkgewotCQkJcyA9IHNuZF9wY21fZ3JvdXBfc3Vic3RyZWFtX2VudHJ5KHBvcyk7CisJCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CiAJCQlpZiAocyA9PSBvdGhlcikgewogCQkJCW9ydW50aW1lLT5zdGF0dXMtPmh3X3B0ciA9CiAJCQkJICAgIHJ1bnRpbWUtPnN0YXR1cy0+aHdfcHRyOwpAQCAtMzY1OCwxMSArMzY2MywxMCBAQAogCiAJLyogTWVtb3J5IGFsbG9jYXRpb24sIHRha2FzaGkncyBtZXRob2QsIGRvbnQga25vdyBpZiB3ZSBzaG91bGQgc3BpbmxvY2sgICovCiAJLyogbWFsbG9jIGFsbCBidWZmZXIgZXZlbiBpZiBub3QgZW5hYmxlZCB0byBnZXQgc3VyZSAqLwotCS8qIG1hbGxvYyBvbmx5IG5lZWRlZCBieXRlcyAqLworCS8qIFVwZGF0ZSBmb3IgTUFESSByZXYgMjA0OiB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZvciBhbGwgY2hhbm5lbHMsCisJICogb3RoZXJ3aXNlIGl0IGRvZXNuJ3Qgd29yayBhdCA5NmtIeiAqLwogCWVyciA9Ci0JICAgIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCi0JCQkJICAgICBIRFNQTV9DSEFOTkVMX0JVRkZFUl9CWVRFUyAqCi0JCQkJICAgICBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKSk7CisJICAgIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIEhEU1BNX0RNQV9BUkVBX0JZVEVTKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMzY5OCw2ICszNzAyLDEzIEBACiAJICAgInBsYXliYWNrIiA6ICJjYXB0dXJlIiwKIAkgICBzbmRfcGNtX3NnYnVmX2dldF9hZGRyKHNnYnVmLCAwKSk7CiAJICovCisJLyoKKwlzbmRfcHJpbnRkZCgic2V0X2h3cGFyYW1zOiAlcyAlZCBIeiwgJWQgY2hhbm5lbHMsIGJzID0gJWRcbiIsCisJCQlzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLID8KKwkJCSAgInBsYXliYWNrIiA6ICJjYXB0dXJlIiwKKwkJCXBhcmFtc19yYXRlKHBhcmFtcyksIHBhcmFtc19jaGFubmVscyhwYXJhbXMpLAorCQkJcGFyYW1zX2J1ZmZlcl9zaXplKHBhcmFtcykpOworCSovCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM3OTEsMTAgKzM4MDIsOCBAQAogCQlvdGhlciA9IGhkc3BtLT5wbGF5YmFja19zdWJzdHJlYW07CiAKIAlpZiAob3RoZXIpIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7Ci0JCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLQkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQkJaWYgKHMgPT0gb3RoZXIpIHsKIAkJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOwogCQkJCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RBUlQpCkBAIC0zOTA0LDE2ICszOTEzLDE2IEBACiAJc3RydWN0IHNuZF9pbnRlcnZhbCAqciA9CiAJICAgIGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOwogCi0JaWYgKHItPm1pbiA+IDQ4MDAwKSB7CisJaWYgKHItPm1pbiA+IDQ4MDAwICYmIHItPm1heCA8PSA5NjAwMCkgewogCQlzdHJ1Y3Qgc25kX2ludGVydmFsIHQgPSB7Ci0JCQkubWluID0gMSwKKwkJCS5taW4gPSBoZHNwbS0+ZHNfY2hhbm5lbHMsCiAJCQkubWF4ID0gaGRzcG0tPmRzX2NoYW5uZWxzLAogCQkJLmludGVnZXIgPSAxLAogCQl9OwogCQlyZXR1cm4gc25kX2ludGVydmFsX3JlZmluZShjLCAmdCk7CiAJfSBlbHNlIGlmIChyLT5tYXggPCA2NDAwMCkgewogCQlzdHJ1Y3Qgc25kX2ludGVydmFsIHQgPSB7Ci0JCQkubWluID0gMSwKKwkJCS5taW4gPSBoZHNwbS0+c3NfY2hhbm5lbHMsCiAJCQkubWF4ID0gaGRzcG0tPnNzX2NoYW5uZWxzLAogCQkJLmludGVnZXIgPSAxLAogCQl9OwpAQCAtMzkzMSwxNCArMzk0MCwxNCBAQAogCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnIgPQogCSAgICBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKIAotCWlmIChjLT5taW4gPD0gaGRzcG0tPnNzX2NoYW5uZWxzKSB7CisJaWYgKGMtPm1pbiA+PSBoZHNwbS0+c3NfY2hhbm5lbHMpIHsKIAkJc3RydWN0IHNuZF9pbnRlcnZhbCB0ID0gewogCQkJLm1pbiA9IDMyMDAwLAogCQkJLm1heCA9IDQ4MDAwLAogCQkJLmludGVnZXIgPSAxLAogCQl9OwogCQlyZXR1cm4gc25kX2ludGVydmFsX3JlZmluZShyLCAmdCk7Ci0JfSBlbHNlIGlmIChjLT5tYXggPiBoZHNwbS0+c3NfY2hhbm5lbHMpIHsKKwl9IGVsc2UgaWYgKGMtPm1heCA8PSBoZHNwbS0+ZHNfY2hhbm5lbHMpIHsKIAkJc3RydWN0IHNuZF9pbnRlcnZhbCB0ID0gewogCQkJLm1pbiA9IDY0MDAwLAogCQkJLm1heCA9IDk2MDAwLApAQCAtMzk1MCwxMyArMzk1OSwzOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNuZF9oZHNwbV9od19ydWxlX2NoYW5uZWxzKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3J1bGUgKnJ1bGUpCit7CisJdW5zaWduZWQgaW50IGxpc3RbM107CisJc3RydWN0IGhkc3BtICpoZHNwbSA9IHJ1bGUtPnByaXZhdGU7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqYyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQlsaXN0WzBdID0gaGRzcG0tPnFzX2NoYW5uZWxzOworCQlsaXN0WzFdID0gaGRzcG0tPmRzX2NoYW5uZWxzOworCQlsaXN0WzJdID0gaGRzcG0tPnNzX2NoYW5uZWxzOworCQlyZXR1cm4gc25kX2ludGVydmFsX2xpc3QoYywgMywgbGlzdCwgMCk7CisJfSBlbHNlIHsKKwkJbGlzdFswXSA9IGhkc3BtLT5kc19jaGFubmVsczsKKwkJbGlzdFsxXSA9IGhkc3BtLT5zc19jaGFubmVsczsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9saXN0KGMsIDIsIGxpc3QsIDApOworCX0KK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGhkc3BtX2FlczMyX3NhbXBsZV9yYXRlc1tdID0geyAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwLCAxMjgwMDAsIDE3NjQwMCwgMTkyMDAwIH07CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgaGRzcG1faHdfY29uc3RyYWludHNfYWVzMzJfc2FtcGxlX3JhdGVzID0geworCS5jb3VudCA9IEFSUkFZX1NJWkUoaGRzcG1fYWVzMzJfc2FtcGxlX3JhdGVzKSwKKwkubGlzdCA9IGhkc3BtX2FlczMyX3NhbXBsZV9yYXRlcywKKwkubWFzayA9IDAKK307CisKIHN0YXRpYyBpbnQgc25kX2hkc3BtX3BsYXliYWNrX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IGhkc3BtICpoZHNwbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCi0Jc25kX3ByaW50ZGQoIk9wZW4gZGV2aWNlIHN1YnN0cmVhbSAlZFxuIiwgc3Vic3RyZWFtLT5zdHJlYW0pOwotCiAJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOwogCiAJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOwpAQCAtMzk3NywxNCArNDAxMiwyMSBAQAogCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwKIAkJCQkgICAmaHdfY29uc3RyYWludHNfcGVyaW9kX3NpemVzKTsKIAotCXNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAotCQkJICAgIHNuZF9oZHNwbV9od19ydWxlX2NoYW5uZWxzX3JhdGUsIGhkc3BtLAotCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAtMSk7CisJaWYgKGhkc3BtLT5pc19hZXMzMikgeworCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkmaGRzcG1faHdfY29uc3RyYWludHNfYWVzMzJfc2FtcGxlX3JhdGVzKTsKKwl9IGVsc2UgeworCQlzbmRfcGNtX2h3X3J1bGVfYWRkKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywKKwkJCQkgICAgIHNuZF9oZHNwbV9od19ydWxlX2NoYW5uZWxzLCBoZHNwbSwKKwkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywgLTEpOworCQlzbmRfcGNtX2h3X3J1bGVfYWRkKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywKKwkJCQkgICAgc25kX2hkc3BtX2h3X3J1bGVfY2hhbm5lbHNfcmF0ZSwgaGRzcG0sCisJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAtMSk7CiAKLQlzbmRfcGNtX2h3X3J1bGVfYWRkKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAotCQkJICAgIHNuZF9oZHNwbV9od19ydWxlX3JhdGVfY2hhbm5lbHMsIGhkc3BtLAotCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywgLTEpOwotCisJCXNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkJICAgIHNuZF9oZHNwbV9od19ydWxlX3JhdGVfY2hhbm5lbHMsIGhkc3BtLAorCQkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsIC0xKTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwMjQsMTQgKzQwNjYsMjEgQEAKIAlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLAogCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwKIAkJCQkgICAmaHdfY29uc3RyYWludHNfcGVyaW9kX3NpemVzKTsKKwlpZiAoaGRzcG0tPmlzX2FlczMyKSB7CisJCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCSZoZHNwbV9od19jb25zdHJhaW50c19hZXMzMl9zYW1wbGVfcmF0ZXMpOworCX0gZWxzZSB7CisJCXNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAorCQkJCSAgICAgc25kX2hkc3BtX2h3X3J1bGVfY2hhbm5lbHMsIGhkc3BtLAorCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAtMSk7CisJCXNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAorCQkJCSAgICBzbmRfaGRzcG1faHdfcnVsZV9jaGFubmVsc19yYXRlLCBoZHNwbSwKKwkJCQkgICAgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsIC0xKTsKIAotCXNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAotCQkJICAgIHNuZF9oZHNwbV9od19ydWxlX2NoYW5uZWxzX3JhdGUsIGhkc3BtLAotCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAtMSk7Ci0KLQlzbmRfcGNtX2h3X3J1bGVfYWRkKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAotCQkJICAgIHNuZF9oZHNwbV9od19ydWxlX3JhdGVfY2hhbm5lbHMsIGhkc3BtLAotCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywgLTEpOworCQlzbmRfcGNtX2h3X3J1bGVfYWRkKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCSAgICBzbmRfaGRzcG1faHdfcnVsZV9yYXRlX2NoYW5uZWxzLCBoZHNwbSwKKwkJCQkgICAgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAtMSk7CisJfQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKaW5kZXggY2MzYmRlYy4uYmQ3ZGJkMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYwpAQCAtMTk5MiwxMSArMTk5Miw5IEBACiAJZWxzZQogCQlydW50aW1lLT5zdGF0dXMtPmh3X3B0ciA9IDA7CiAJaWYgKG90aGVyKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzOwogCQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpvcnVudGltZSA9IG90aGVyLT5ydW50aW1lOwotCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7Ci0JCQlzID0gc25kX3BjbV9ncm91cF9zdWJzdHJlYW1fZW50cnkocG9zKTsKKwkJc25kX3BjbV9ncm91cF9mb3JfZWFjaF9lbnRyeShzLCBzdWJzdHJlYW0pIHsKIAkJCWlmIChzID09IG90aGVyKSB7CiAJCQkJb3J1bnRpbWUtPnN0YXR1cy0+aHdfcHRyID0gcnVudGltZS0+c3RhdHVzLT5od19wdHI7CiAJCQkJYnJlYWs7CkBAIC0yMTQwLDEwICsyMTM4LDggQEAKIAkJb3RoZXIgPSBybWU5NjUyLT5wbGF5YmFja19zdWJzdHJlYW07CiAKIAlpZiAob3RoZXIpIHsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnM7Ci0JCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLQkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQkJaWYgKHMgPT0gb3RoZXIpIHsKIAkJCQlzbmRfcGNtX3RyaWdnZXJfZG9uZShzLCBzdWJzdHJlYW0pOwogCQkJCWlmIChjbWQgPT0gU05EUlZfUENNX1RSSUdHRVJfU1RBUlQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21haW4uYyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCmluZGV4IDNiZmYzMjEuLjdjYTYwNjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jCkBAIC0xNTQwLDcgKzE1NDAsNiBAQAogCQkJCSAgICAKIHsKIAlzdHJ1Y3Qgc25kX3RyaWRlbnQgKnRyaWRlbnQgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKIAl1bnNpZ25lZCBpbnQgd2hhdCwgd2hhdGksIGNhcHR1cmVfZmxhZywgc3BkaWZfZmxhZzsKIAlzdHJ1Y3Qgc25kX3RyaWRlbnRfdm9pY2UgKnZvaWNlLCAqZXZvaWNlOwpAQCAtMTU2Myw4ICsxNTYyLDcgQEAKIAl3aGF0ID0gd2hhdGkgPSBjYXB0dXJlX2ZsYWcgPSBzcGRpZl9mbGFnID0gMDsKIAlzcGluX2xvY2soJnRyaWRlbnQtPnJlZ19sb2NrKTsKIAl2YWwgPSBpbmwoVFJJRF9SRUcodHJpZGVudCwgVDREX1NUSU1FUikpICYgMHgwMGZmZmZmZjsKLQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoKHBvcywgc3Vic3RyZWFtKSB7Ci0JCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2hfZW50cnkocywgc3Vic3RyZWFtKSB7CiAJCWlmICgoc3RydWN0IHNuZF90cmlkZW50ICopIHNuZF9wY21fc3Vic3RyZWFtX2NoaXAocykgPT0gdHJpZGVudCkgewogCQkJdm9pY2UgPSBzLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CiAJCQlldm9pY2UgPSB2b2ljZS0+ZXh0cmE7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKaW5kZXggZmQxMjY3NC4uZWE4NjFiYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwpAQCAtMTk5OCw5ICsxOTk4LDcgQEAKIAl9CiB9CiAKLSNkZWZpbmUgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAotCi0jaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAorI2lmZGVmIENPTkZJR19TTkRfWU1GUENJX0ZJUk1XQVJFX0lOX0tFUk5FTAogCiAjaW5jbHVkZSAieW1mcGNpX2ltYWdlLmgiCiAKQEAgLTIwMTgsNiArMjAxNiwyNCBAQAogfTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1NORF9ZTUZQQ0lfRklSTVdBUkVfSU5fS0VSTkVMCitzdGF0aWMgaW50IHNuZF95bWZwY2lfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3Qgc25kX3ltZnBjaSAqY2hpcCkKK3sKKwljaGlwLT5kc3BfbWljcm9jb2RlID0gJnNuZF95bWZwY2lfZHNwX21pY3JvY29kZTsKKwlpZiAoY2hpcC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfWUFNQUhBXzcyNEYgfHwKKwkgICAgY2hpcC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0MEMgfHwKKwkgICAgY2hpcC0+ZGV2aWNlX2lkID09IFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0NCB8fAorCSAgICBjaGlwLT5kZXZpY2VfaWQgPT0gUENJX0RFVklDRV9JRF9ZQU1BSEFfNzU0KQorCQljaGlwLT5jb250cm9sbGVyX21pY3JvY29kZSA9CisJCQkmc25kX3ltZnBjaV9jb250cm9sbGVyXzFlX21pY3JvY29kZTsKKwllbHNlCisJCWNoaXAtPmNvbnRyb2xsZXJfbWljcm9jb2RlID0KKwkJCSZzbmRfeW1mcGNpX2NvbnRyb2xsZXJfbWljcm9jb2RlOworCXJldHVybiAwOworfQorCisjZWxzZSAvKiB1c2UgZndfbG9hZGVyICovCisKICNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfeW1mcGNpX2NvbnZlcnRfZnJvbV9sZShjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KSB7IH0KICNlbHNlCkBAIC0yMDQ2LDEzICsyMDYyLDggQEAKIAkJCWVyciA9IC1FSU5WQUw7CiAJCX0KIAl9Ci0JaWYgKGVyciA8IDApIHsKLSNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCi0JCWNoaXAtPmRzcF9taWNyb2NvZGUgPSAmc25kX3ltZnBjaV9kc3BfbWljcm9jb2RlOwotI2Vsc2UKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLSNlbmRpZgotCX0KIAlpc18xZSA9IGNoaXAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83MjRGIHx8CiAJCWNoaXAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NDBDIHx8CiAJCWNoaXAtPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NDQgfHwKQEAgLTIwNjksMTggKzIwODAsMTcgQEAKIAkJCWVyciA9IC1FSU5WQUw7CiAJCX0KIAl9Ci0JaWYgKGVyciA8IDApIHsKLSNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCi0JCWNoaXAtPmNvbnRyb2xsZXJfbWljcm9jb2RlID0KLQkJCWlzXzFlID8gJnNuZF95bWZwY2lfY29udHJvbGxlcl8xZV9taWNyb2NvZGUKLQkJCSAgICAgIDogJnNuZF95bWZwY2lfY29udHJvbGxlcl9taWNyb2NvZGU7Ci0jZWxzZQorCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotI2VuZGlmCi0JfQogCXJldHVybiAwOwogfQogCitNT0RVTEVfRklSTVdBUkUoInlhbWFoYS9kczFfZHNwLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoInlhbWFoYS9kczFfY3RybC5mdyIpOworTU9EVUxFX0ZJUk1XQVJFKCJ5YW1haGEvZHMxZV9jdHJsLmZ3Iik7CisKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBzbmRfeW1mcGNpX2Rvd25sb2FkX2ltYWdlKHN0cnVjdCBzbmRfeW1mcGNpICpjaGlwKQogewogCWludCBpOwpAQCAtMjI1OSwxNSArMjI2OSwxMCBAQAogCXBjaV93cml0ZV9jb25maWdfd29yZChjaGlwLT5wY2ksIDB4NDAsIGNoaXAtPm9sZF9sZWdhY3lfY3RybCk7CiAJCiAJcGNpX2Rpc2FibGVfZGV2aWNlKGNoaXAtPnBjaSk7Ci0jaWZkZWYgRklSTVdBUkVfSU5fVEhFX0tFUk5FTAotCWlmIChjaGlwLT5kc3BfbWljcm9jb2RlICE9ICZzbmRfeW1mcGNpX2RzcF9taWNyb2NvZGUpCisjaWZuZGVmIENPTkZJR19TTkRfWU1GUENJX0ZJUk1XQVJFX0lOX0tFUk5FTAorCXJlbGVhc2VfZmlybXdhcmUoY2hpcC0+ZHNwX21pY3JvY29kZSk7CisJcmVsZWFzZV9maXJtd2FyZShjaGlwLT5jb250cm9sbGVyX21pY3JvY29kZSk7CiAjZW5kaWYKLQkJcmVsZWFzZV9maXJtd2FyZShjaGlwLT5kc3BfbWljcm9jb2RlKTsKLSNpZmRlZiBGSVJNV0FSRV9JTl9USEVfS0VSTkVMCi0JaWYgKGNoaXAtPmNvbnRyb2xsZXJfbWljcm9jb2RlICE9ICZzbmRfeW1mcGNpX2NvbnRyb2xsZXJfbWljcm9jb2RlICYmCi0JICAgIGNoaXAtPmNvbnRyb2xsZXJfbWljcm9jb2RlICE9ICZzbmRfeW1mcGNpX2NvbnRyb2xsZXJfMWVfbWljcm9jb2RlKQotI2VuZGlmCi0JCXJlbGVhc2VfZmlybXdhcmUoY2hpcC0+Y29udHJvbGxlcl9taWNyb2NvZGUpOwogCWtmcmVlKGNoaXApOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNtY2lhL3Z4L3Z4cG9ja2V0LmMgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwppbmRleCAzNjNiY2I1Li5jNTdlMTI3IDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYworKysgYi9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAKIAkvKiBmaW5kIGFuIGVtcHR5IHNsb3QgZnJvbSB0aGUgY2FyZCBsaXN0ICovCiAJZm9yIChpID0gMDsgaSA8IFNORFJWX0NBUkRTOyBpKyspIHsKLQkJaWYgKCEgY2FyZF9hbGxvYyAmICgxIDw8IGkpKQorCQlpZiAoIShjYXJkX2FsbG9jICYgKDEgPDwgaSkpKQogCQkJYnJlYWs7CiAJfQogCWlmIChpID49IFNORFJWX0NBUkRTKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvS2NvbmZpZyBiL3NvdW5kL3NvYy9LY29uZmlnCmluZGV4IGRjY2FhNGIuLjEwY2ZmYzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9LY29uZmlnCkBAIC0yLDMxICsyLDMxIEBACiAjIFNvQyBhdWRpbyBjb25maWd1cmF0aW9uCiAjCiAKLW1lbnUgIlNvQyBhdWRpbyBzdXBwb3J0IgorbWVudSAiU3lzdGVtIG9uIENoaXAgYXVkaW8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNORCE9bgogCiBjb25maWcgU05EX1NPQ19BQzk3X0JVUwogCWJvb2wKIAogY29uZmlnIFNORF9TT0MKLQl0cmlzdGF0ZSAiU29DIGF1ZGlvIHN1cHBvcnQiCisJdHJpc3RhdGUgIkFMU0EgZm9yIFNvQyBhdWRpbyBzdXBwb3J0IgogCWRlcGVuZHMgb24gU05ECiAJc2VsZWN0IFNORF9QQ00KIAktLS1oZWxwLS0tCiAKLQkgIElmIHlvdSB3YW50IFNvQyBzdXBwb3J0LCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUgYW5kIGFsc28gdG8gdGhlCi0JICBzcGVjaWZpYyBkcml2ZXIgZm9yIHlvdXIgU29DIGJlbG93LiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gc2VsZWN0IHRoZQotCSAgc3BlY2lmaWMgY29kZWMocykgYXR0YWNoZWQgdG8gdGhlIFNvQworCSAgSWYgeW91IHdhbnQgQVNvQyBzdXBwb3J0LCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUgYW5kIGFsc28gdG8gdGhlCisJICBzcGVjaWZpYyBkcml2ZXIgZm9yIHlvdXIgU29DIHBsYXRmb3JtIGJlbG93LgorCSAgCisJICBBU29DIHByb3ZpZGVzIHBvd2VyIGVmZmljaWVudCBBTFNBIHN1cHBvcnQgZm9yIGVtYmVkZGVkIGJhdHRlcnkgcG93ZXJlZAorCSAgU29DIGJhc2VkIHN5c3RlbXMgbGlrZSBQREEncywgUGhvbmVzIGFuZCBQZXJzb25hbCBNZWRpYSBQbGF5ZXJzLgogCi0JICBUaGlzIFNvQyBhdWRpbyBzdXBwb3J0IGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIFRoaXMgQVNvQyBhdWRpbyBzdXBwb3J0IGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNuZC1zb2MtY29yZS4KIAogIyBBbGwgdGhlIHN1cHBvcnRlZCBTb2MncwotbWVudSAiU29DIFBsYXRmb3JtcyIKLWRlcGVuZHMgb24gU05EX1NPQwogc291cmNlICJzb3VuZC9zb2MvYXQ5MS9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvcHhhL0tjb25maWciCi1lbmRtZW51Citzb3VyY2UgInNvdW5kL3NvYy9zM2MyNHh4L0tjb25maWciCiAKICMgU3VwcG9ydGVkIGNvZGVjcwogc291cmNlICJzb3VuZC9zb2MvY29kZWNzL0tjb25maWciCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvTWFrZWZpbGUKaW5kZXggOThlNmY0OS4uMGFlMmU0OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKIHNuZC1zb2MtY29yZS1vYmpzIDo9IHNvYy1jb3JlLm8gc29jLWRhcG0ubwogCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gc25kLXNvYy1jb3JlLm8KLW9iai0kKENPTkZJR19TTkRfU09DKQkrPSBjb2RlY3MvIGF0OTEvIHB4YS8KK29iai0kKENPTkZJR19TTkRfU09DKQkrPSBjb2RlY3MvIGF0OTEvIHB4YS8gczNjMjR4eC8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdDkxL0tjb25maWcgYi9zb3VuZC9zb2MvYXQ5MS9LY29uZmlnCmluZGV4IGE1YjI1NTguLjVjYjkzZmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdDkxL0tjb25maWcKKysrIGIvc291bmQvc29jL2F0OTEvS2NvbmZpZwpAQCAtMSw1ICsxLDMgQEAKLW1lbnUgIlNvQyBBdWRpbyBmb3IgdGhlIEF0bWVsIEFUOTEiCi0KIGNvbmZpZyBTTkRfQVQ5MV9TT0MKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIGZvciB0aGUgQXRtZWwgQVQ5MSBTeXN0ZW0tb24tQ2hpcCIKIAlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSAmJiBTTkRfU09DCkBAIC04LDEzICs2LDEzIEBACiAJICB0aGUgQVQ5MSBTU0MgaW50ZXJmYWNlLiBZb3Ugd2lsbCBhbHNvIG5lZWQKIAkgIHRvIHNlbGVjdCB0aGUgYXVkaW8gaW50ZXJmYWNlcyB0byBzdXBwb3J0IGJlbG93LgogCi1jb25maWcgU05EX0FUOTFfU09DX0kyUworY29uZmlnIFNORF9BVDkxX1NPQ19TU0MKIAl0cmlzdGF0ZQogCiBjb25maWcgU05EX0FUOTFfU09DX0VUSV9CMV9XTTg3MzEKLQl0cmlzdGF0ZSAiU29DIEkyUyBBdWRpbyBzdXBwb3J0IGZvciBXTTg3MzEtYmFzZWQgRW5kcmVsaWEgRVRJLUIxIGJvYXJkcyIKKwl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFdNODczMS1iYXNlZCBFbmRyZWxpYSBFVEktQjEgYm9hcmRzIgogCWRlcGVuZHMgb24gU05EX0FUOTFfU09DICYmIChNQUNIX0VUSV9CMSB8fCBNQUNIX0VUSV9DMSkKLQlzZWxlY3QgU05EX0FUOTFfU09DX0kyUworCXNlbGVjdCBTTkRfQVQ5MV9TT0NfU1NDCiAJc2VsZWN0IFNORF9TT0NfV004NzMxCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBXTTg3MzEtYmFzZWQKQEAgLTI3LDUgKzI1LDMgQEAKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBydW4gd2l0aCB0aGUgQVQ5MSBTU0MgZ2VuZXJhdGluZyB0aGUgQkNMSwogCSAgYW5kIExSQyBzaWduYWxzIG9uIEVuZHJlbGlhIGJvYXJkcy4KLQotZW5kbWVudQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0OTEvTWFrZWZpbGUgYi9zb3VuZC9zb2MvYXQ5MS9NYWtlZmlsZQppbmRleCBiNzdiMDFhLi5mMjNkYTE3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXQ5MS9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvYXQ5MS9NYWtlZmlsZQpAQCAtMSw5ICsxLDkgQEAKICMgQVQ5MSBQbGF0Zm9ybSBTdXBwb3J0CiBzbmQtc29jLWF0OTEtb2JqcyA6PSBhdDkxLXBjbS5vCi1zbmQtc29jLWF0OTEtaTJzLW9ianMgOj0gYXQ5MS1pMnMubworc25kLXNvYy1hdDkxLXNzYy1vYmpzIDo9IGF0OTEtc3NjLm8KIAogb2JqLSQoQ09ORklHX1NORF9BVDkxX1NPQykgKz0gc25kLXNvYy1hdDkxLm8KLW9iai0kKENPTkZJR19TTkRfQVQ5MV9TT0NfSTJTKSArPSBzbmQtc29jLWF0OTEtaTJzLm8KK29iai0kKENPTkZJR19TTkRfQVQ5MV9TT0NfU1NDKSArPSBzbmQtc29jLWF0OTEtc3NjLm8KIAogIyBBVDkxIE1hY2hpbmUgU3VwcG9ydAogc25kLXNvYy1ldGktYjEtd204NzMxLW9ianMgOj0gZXRpX2IxX3dtODczMS5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXQ5MS9hdDkxLWkycy5jIGIvc291bmQvc29jL2F0OTEvYXQ5MS1zc2MuYwpzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvYXQ5MS9hdDkxLWkycy5jCnJlbmFtZSB0byBzb3VuZC9zb2MvYXQ5MS9hdDkxLXNzYy5jCmluZGV4IDlmYzBjMDMuLjNkNGUzMmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdDkxL2F0OTEtaTJzLmMKKysrIGIvc291bmQvc29jL2F0OTEvYXQ5MS1zc2MuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBhdDkxLWkycy5jICAtLSAgQUxTQSBTb0MgSTJTIEF1ZGlvIExheWVyIFBsYXRmb3JtIGRyaXZlcgorICogYXQ5MS1zc2MuYyAgLS0gIEFMU0EgU29DIEFUOTEgU1NDIEF1ZGlvIExheWVyIFBsYXRmb3JtIGRyaXZlcgogICoKICAqIEF1dGhvcjogRnJhbmsgTWFuZGFyaW5vIDxmbWFuZGFyaW5vQGVuZHJlbGlhLmNvbT4KICAqICAgICAgICAgRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYy4KQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KIApAQCAtMzMsMTAgKzM0LDEwIEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvYXQ5MV9zc2MuaD4KIAogI2luY2x1ZGUgImF0OTEtcGNtLmgiCi0jaW5jbHVkZSAiYXQ5MS1pMnMuaCIKKyNpbmNsdWRlICJhdDkxLXNzYy5oIgogCiAjaWYgMAotI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKEtFUk5fREVCVUcgImF0OTEtaTJzOiIgeCkKKyNkZWZpbmUJREJHKHguLi4pCXByaW50ayhLRVJOX0RFQlVHICJhdDkxLXNzYzoiIHgpCiAjZWxzZQogI2RlZmluZQlEQkcoeC4uLikKICNlbmRpZgpAQCAtOTIsMzMgKzkzLDMzIEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9wY21fZG1hX3BhcmFtcyBzc2NfZG1hX3BhcmFtc1tOVU1fU1NDX0RFVklDRVNdWzJdID0gewogCXt7Ci0JLm5hbWUJCT0gIlNTQzAvSTJTIFBDTSBTdGVyZW8gb3V0IiwKKwkubmFtZQkJPSAiU1NDMCBQQ00gb3V0IiwKIAkucGRjCQk9ICZwZGNfdHhfcmVnLAogCS5tYXNrCQk9ICZzc2NfdHhfbWFzaywKIAl9LAogCXsKLQkubmFtZQkJPSAiU1NDMC9JMlMgUENNIFN0ZXJlbyBpbiIsCisJLm5hbWUJCT0gIlNTQzAgUENNIGluIiwKIAkucGRjCQk9ICZwZGNfcnhfcmVnLAogCS5tYXNrCQk9ICZzc2NfcnhfbWFzaywKIAl9fSwKICNpZiBOVU1fU1NDX0RFVklDRVMgPT0gMwogCXt7Ci0JLm5hbWUJCT0gIlNTQzEvSTJTIFBDTSBTdGVyZW8gb3V0IiwKKwkubmFtZQkJPSAiU1NDMSBQQ00gb3V0IiwKIAkucGRjCQk9ICZwZGNfdHhfcmVnLAogCS5tYXNrCQk9ICZzc2NfdHhfbWFzaywKIAl9LAogCXsKLQkubmFtZQkJPSAiU1NDMS9JMlMgUENNIFN0ZXJlbyBpbiIsCisJLm5hbWUJCT0gIlNTQzEgUENNIGluIiwKIAkucGRjCQk9ICZwZGNfcnhfcmVnLAogCS5tYXNrCQk9ICZzc2NfcnhfbWFzaywKIAl9fSwKIAl7ewotCS5uYW1lCQk9ICJTU0MyL0kyUyBQQ00gU3RlcmVvIG91dCIsCisJLm5hbWUJCT0gIlNTQzIgUENNIG91dCIsCiAJLnBkYwkJPSAmcGRjX3R4X3JlZywKIAkubWFzawkJPSAmc3NjX3R4X21hc2ssCiAJfSwKIAl7Ci0JLm5hbWUJCT0gIlNTQzEvSTJTIFBDTSBTdGVyZW8gaW4iLAorCS5uYW1lCQk9ICJTU0MyIFBDTSBpbiIsCiAJLnBkYwkJPSAmcGRjX3J4X3JlZywKIAkubWFzawkJPSAmc3NjX3J4X21hc2ssCiAJfX0sCkBAIC0xNTEsMzMgKzE1MiwzMyBAQAogfSBzc2NfaW5mb1tOVU1fU1NDX0RFVklDRVNdID0gewogCXsKIAkubmFtZQkJPSAic3NjMCIsCi0JLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKHNzY19pbmZvWzBdLmxvY2spLAogCS5kaXJfbWFzawk9IDAsCiAJLmluaXRpYWxpemVkCT0gMCwKIAl9LAogI2lmIE5VTV9TU0NfREVWSUNFUyA9PSAzCiAJewogCS5uYW1lCQk9ICJzc2MxIiwKLQkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLmxvY2sJCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQoc3NjX2luZm9bMV0ubG9jayksCiAJLmRpcl9tYXNrCT0gMCwKIAkuaW5pdGlhbGl6ZWQJPSAwLAogCX0sCiAJewogCS5uYW1lCQk9ICJzc2MyIiwKLQkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLmxvY2sJCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQoc3NjX2luZm9bMl0ubG9jayksCiAJLmRpcl9tYXNrCT0gMCwKIAkuaW5pdGlhbGl6ZWQJPSAwLAogCX0sCiAjZW5kaWYKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXQ5MV9pMnNfc3lzY2xrOworc3RhdGljIHVuc2lnbmVkIGludCBhdDkxX3NzY19zeXNjbGs7CiAKIC8qCiAgKiBTU0MgaW50ZXJydXB0IGhhbmRsZXIuICBQYXNzZXMgUERDIGludGVycnVwdHMgdG8gdGhlIERNQQogICogaW50ZXJydXB0IGhhbmRsZXIgaW4gdGhlIFBDTSBkcml2ZXIuCiAgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBhdDkxX2kyc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorc3RhdGljIGlycXJldHVybl90IGF0OTFfc3NjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGF0OTFfc3NjX2luZm8gKnNzY19wID0gZGV2X2lkOwogCXN0cnVjdCBhdDkxX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zOwpAQCAtMjA5LDEzICsyMTAsMTMgQEAKIC8qCiAgKiBTdGFydHVwLiAgT25seSB0aGF0IG9uZSBzdWJzdHJlYW0gYWxsb3dlZCBpbiBlYWNoIGRpcmVjdGlvbi4KICAqLwotc3RhdGljIGludCBhdDkxX2kyc19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc3RhdGljIGludCBhdDkxX3NzY19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3AgPSAmc3NjX2luZm9bcnRkLT5kYWktPmNwdV9kYWktPmlkXTsKIAlpbnQgZGlyX21hc2s7CiAKLQlEQkcoImkyc19zdGFydHVwOiBTU0NfU1I9MHglMDhseFxuIiwKKwlEQkcoInNzY19zdGFydHVwOiBTU0NfU1I9MHglMDhseFxuIiwKIAkJCWF0OTFfc3NjX3JlYWQoc3NjX3AtPnNzYy5iYXNlICsgQVQ5MV9TU0NfU1IpKTsKIAlkaXJfbWFzayA9IHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPyAweDEgOiAweDI7CiAKQEAgLTIzNCw3ICsyMzUsNyBAQAogICogU2h1dGRvd24uICBDbGVhciBETUEgcGFyYW1ldGVycyBhbmQgc2h1dGRvd24gdGhlIFNTQyBpZiB0aGVyZQogICogYXJlIG5vIG90aGVyIHN1YnN0cmVhbXMgb3Blbi4KICAqLwotc3RhdGljIHZvaWQgYXQ5MV9pMnNfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCitzdGF0aWMgdm9pZCBhdDkxX3NzY19zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGF0OTFfc3NjX2luZm8gKnNzY19wID0gJnNzY19pbmZvW3J0ZC0+ZGFpLT5jcHVfZGFpLT5pZF07CkBAIC0yODEsNyArMjgyLDcgQEAKIC8qCiAgKiBSZWNvcmQgdGhlIFNTQyBzeXN0ZW0gY2xvY2sgcmF0ZS4KICAqLwotc3RhdGljIGludCBhdDkxX2kyc19zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAorc3RhdGljIGludCBhdDkxX3NzY19zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAogCQlpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKIHsKIAkvKgpAQCAtMjkxLDcgKzI5Miw3IEBACiAJICovCiAJc3dpdGNoIChjbGtfaWQpIHsKIAljYXNlIEFUOTFfU1lTQ0xLX01DSzoKLQkJYXQ5MV9pMnNfc3lzY2xrID0gZnJlcTsKKwkJYXQ5MV9zc2Nfc3lzY2xrID0gZnJlcTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMDMsMTQgKzMwNCwxMSBAQAogLyoKICAqIFJlY29yZCB0aGUgREFJIGZvcm1hdCBmb3IgdXNlIGluIGh3X3BhcmFtcygpLgogICovCi1zdGF0aWMgaW50IGF0OTFfaTJzX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWksCitzdGF0aWMgaW50IGF0OTFfc3NjX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWksCiAJCXVuc2lnbmVkIGludCBmbXQpCiB7CiAJc3RydWN0IGF0OTFfc3NjX2luZm8gKnNzY19wID0gJnNzY19pbmZvW2NwdV9kYWktPmlkXTsKIAotCWlmICgoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spICE9IFNORF9TT0NfREFJRk1UX0kyUykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlzc2NfcC0+ZGFpZm10ID0gZm10OwogCXJldHVybiAwOwogfQpAQCAtMzE4LDcgKzMxNiw3IEBACiAvKgogICogUmVjb3JkIFNTQyBjbG9jayBkaXZpZGVycyBmb3IgdXNlIGluIGh3X3BhcmFtcygpLgogICovCi1zdGF0aWMgaW50IGF0OTFfaTJzX3NldF9kYWlfY2xrZGl2KHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWksCitzdGF0aWMgaW50IGF0OTFfc3NjX3NldF9kYWlfY2xrZGl2KHN0cnVjdCBzbmRfc29jX2NwdV9kYWkgKmNwdV9kYWksCiAJaW50IGRpdl9pZCwgaW50IGRpdikKIHsKIAlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3AgPSAmc3NjX2luZm9bY3B1X2RhaS0+aWRdOwpAQCAtMzU1LDcgKzM1Myw3IEBACiAvKgogICogQ29uZmlndXJlIHRoZSBTU0MuCiAgKi8KLXN0YXRpYyBpbnQgYXQ5MV9pMnNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorc3RhdGljIGludCBhdDkxX3NzY19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwpAQCAtMzkxLDIwICszODksNTAgQEAKIAljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwogCiAJLyoKLQkgKiBUaGUgU1NDIG9ubHkgc3VwcG9ydHMgdXAgdG8gMTYtYml0IHNhbXBsZXMgaW4gSTJTIGZvcm1hdCwgZHVlCi0JICogdG8gdGhlIHNpemUgb2YgdGhlIEZyYW1lIE1vZGUgUmVnaXN0ZXIgRlNMRU4gZmllbGQuICBBbHNvLCBJMlMKLQkgKiBpbXBsaWVzIHNpZ25lZCBkYXRhLgorCSAqIERldGVybWluZSBzYW1wbGUgc2l6ZSBpbiBiaXRzIGFuZCB0aGUgUERDIGluY3JlbWVudC4KIAkgKi8KLQliaXRzID0gMTY7Ci0JZG1hX3BhcmFtcy0+cGRjX3hmZXJfc2l6ZSA9IDI7CisJc3dpdGNoKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TODoKKwkJYml0cyA9IDg7CisJCWRtYV9wYXJhbXMtPnBkY194ZmVyX3NpemUgPSAxOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFOgorCQliaXRzID0gMTY7CisJCWRtYV9wYXJhbXMtPnBkY194ZmVyX3NpemUgPSAyOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQliaXRzID0gMjQ7CisJCWRtYV9wYXJhbXMtPnBkY194ZmVyX3NpemUgPSA0OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzMyX0xFOgorCQliaXRzID0gMzI7CisJCWRtYV9wYXJhbXMtPnBkY194ZmVyX3NpemUgPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdDkxLXNzYzogdW5zdXBwb3J0ZWQgUENNIGZvcm1hdCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFRoZSBTU0Mgb25seSBzdXBwb3J0cyB1cCB0byAxNi1iaXQgc2FtcGxlcyBpbiBJMlMgZm9ybWF0LCBkdWUKKwkgKiB0byB0aGUgc2l6ZSBvZiB0aGUgRnJhbWUgTW9kZSBSZWdpc3RlciBGU0xFTiBmaWVsZC4KKwkgKi8KKwlpZiAoKHNzY19wLT5kYWlmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgPT0gU05EX1NPQ19EQUlGTVRfSTJTCisJCSYmIGJpdHMgPiAxNikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiYXQ5MS1zc2M6IHNhbXBsZSBzaXplICVkIGlzIHRvbyBsYXJnZSBmb3IgSTJTXG4iLCBiaXRzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyoKIAkgKiBDb21wdXRlIFNTQyByZWdpc3RlciBzZXR0aW5ncy4KIAkgKi8KLQlzd2l0Y2ggKHNzY19wLT5kYWlmbXQpIHsKLQljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJc3dpdGNoIChzc2NfcC0+ZGFpZm10CisJCSYgKFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLIHwgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spKSB7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCU19DRlM6CiAJCS8qCi0JCSAqIFNTQyBwcm92aWRlcyBCQ0xLIGFuZCBMUkMgY2xvY2tzLgorCQkgKiBJMlMgZm9ybWF0LCBTU0MgcHJvdmlkZXMgQkNMSyBhbmQgTFJDIGNsb2Nrcy4KIAkJICoKIAkJICogVGhlIFNTQyB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjbG9ja3MgYXJlIGdlbmVyYXRlZCBmcm9tIHRoZQogCQkgKiBNQ0sgZGl2aWRlciwgYW5kIHRoZSBCQ0xLIHNpZ25hbCBpcyBvdXRwdXQgb24gdGhlIFNTQyBUSyBsaW5lLgpAQCAtNDQxLDEwICs0NjksOSBAQAogCQkJfCAoKChiaXRzIC0gMSkJCQk8PCAgMCkgJiBBVDkxX1NTQ19EQVRBTEVOKTsKIAkJYnJlYWs7CiAKLQljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06Ci0KKwljYXNlIFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk06CiAJCS8qCi0JCSAqIENPREVDIHN1cHBsaWVzIEJDTEsgYW5kIExSQyBjbG9ja3MuCisJCSAqIEkyUyBmb3JtYXQsIENPREVDIHN1cHBsaWVzIEJDTEsgYW5kIExSQyBjbG9ja3MuCiAJCSAqCiAJCSAqIFRoZSBTU0MgdHJhbnNtaXQgY2xvY2sgaXMgb2J0YWluZWQgZnJvbSB0aGUgQkNMSyBzaWduYWwgb24KIAkJICogb24gdGhlIFRLIGxpbmUsIGFuZCB0aGUgU1NDIHJlY2VpdmUgY2xvY2sgaXMgZ2VuZXJhdGVkIGZyb20gdGhlCkBAIC00OTAsMTAgKzUxNyw1MSBAQAogCQkJfCAoKChiaXRzIC0gMSkJCQk8PCAgMCkgJiBBVDkxX1NTQ19EQVRBTEVOKTsKIAkJYnJlYWs7CiAKLQljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRk06Ci0JY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZTOgorCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0EgfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQkvKgorCQkgKiBEU1AvUENNIE1vZGUgQSBmb3JtYXQsIFNTQyBwcm92aWRlcyBCQ0xLIGFuZCBMUkMgY2xvY2tzLgorCQkgKgorCQkgKiBUaGUgU1NDIHRyYW5zbWl0IGFuZCByZWNlaXZlIGNsb2NrcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlCisJCSAqIE1DSyBkaXZpZGVyLCBhbmQgdGhlIEJDTEsgc2lnbmFsIGlzIG91dHB1dCBvbiB0aGUgU1NDIFRLIGxpbmUuCisJCSAqLworCQlyY21yID0JICAoKCBzc2NfcC0+cmNtcl9wZXJpb2QJCTw8IDI0KSAmIEFUOTFfU1NDX1BFUklPRCkKKwkJCXwgKCggMQkJCQk8PCAxNikgJiBBVDkxX1NTQ19TVFRETFkpCisJCQl8ICgoIEFUOTFfU1NDX1NUQVJUX1JJU0lOR19SRgkgICAgICkgJiBBVDkxX1NTQ19TVEFSVCkKKwkJCXwgKCggQVQ5MV9TU0NfQ0tfUklTSU5HCQkgICAgICkgJiBBVDkxX1NTQ19DS0kpCisJCQl8ICgoIEFUOTFfU1NDX0NLT19OT05FCQkgICAgICkgJiBBVDkxX1NTQ19DS08pCisJCQl8ICgoIEFUOTFfU1NDX0NLU19ESVYJCSAgICAgKSAmIEFUOTFfU1NDX0NLUyk7CisKKwkJcmZtciA9CSAgKCggQVQ5MV9TU0NfRlNFREdFX1BPU0lUSVZFCSAgICAgKSAmIEFUOTFfU1NDX0ZTRURHRSkKKwkJCXwgKCggQVQ5MV9TU0NfRlNPU19QT1NJVElWRQkgICAgICkgJiBBVDkxX1NTQ19GU09TKQorCQkJfCAoKCAwCQkJCTw8IDE2KSAmIEFUOTFfU1NDX0ZTTEVOKQorCQkJfCAoKChjaGFubmVscyAtIDEpCQk8PCAgOCkgJiBBVDkxX1NTQ19EQVROQikKKwkJCXwgKCggMQkJCQk8PCAgNykgJiBBVDkxX1NTQ19NU0JGKQorCQkJfCAoKCAwCQkJCTw8ICA1KSAmIEFUOTFfU1NDX0xPT1ApCisJCQl8ICgoKGJpdHMgLSAxKQkJCTw8ICAwKSAmIEFUOTFfU1NDX0RBVEFMRU4pOworCisJCXRjbXIgPQkgICgoIHNzY19wLT50Y21yX3BlcmlvZAkJPDwgMjQpICYgQVQ5MV9TU0NfUEVSSU9EKQorCQkJfCAoKCAxCQkJCTw8IDE2KSAmIEFUOTFfU1NDX1NUVERMWSkKKwkJCXwgKCggQVQ5MV9TU0NfU1RBUlRfUklTSU5HX1JGICAgICAgICApICYgQVQ5MV9TU0NfU1RBUlQpCisJCQl8ICgoIEFUOTFfU1NDX0NLX1JJU0lORwkJICAgICApICYgQVQ5MV9TU0NfQ0tJKQorCQkJfCAoKCBBVDkxX1NTQ19DS09fQ09OVElOVU9VUwkgICAgICkgJiBBVDkxX1NTQ19DS08pCisJCQl8ICgoIEFUOTFfU1NDX0NLU19ESVYJCSAgICAgKSAmIEFUOTFfU1NDX0NLUyk7CisKKwkJdGZtciA9CSAgKCggQVQ5MV9TU0NfRlNFREdFX1BPU0lUSVZFCSAgICAgKSAmIEFUOTFfU1NDX0ZTRURHRSkKKwkJCXwgKCggMAkJCQk8PCAyMykgJiBBVDkxX1NTQ19GU0RFTikKKwkJCXwgKCggQVQ5MV9TU0NfRlNPU19QT1NJVElWRQkgICAgICkgJiBBVDkxX1NTQ19GU09TKQorCQkJfCAoKCAwCQkJCTw8IDE2KSAmIEFUOTFfU1NDX0ZTTEVOKQorCQkJfCAoKChjaGFubmVscyAtIDEpCQk8PCAgOCkgJiBBVDkxX1NTQ19EQVROQikKKwkJCXwgKCggMQkJCQk8PCAgNykgJiBBVDkxX1NTQ19NU0JGKQorCQkJfCAoKCAwCQkJCTw8ICA1KSAmIEFUOTFfU1NDX0RBVERFRikKKwkJCXwgKCgoYml0cyAtIDEpCQkJPDwgIDApICYgQVQ5MV9TU0NfREFUQUxFTik7CisKKworCisJCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0EgfCBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgogCWRlZmF1bHQ6Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImF0OTEtaTJzOiB1bnN1cHBvcnRlZCBEQUkgZm9ybWF0IDB4JXguXG4iLAorCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdDkxLXNzYzogdW5zdXBwb3J0ZWQgREFJIGZvcm1hdCAweCV4LlxuIiwKIAkJCXNzY19wLT5kYWlmbXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CkBAIC01MTgsOSArNTg2LDkgQEAKIAkJYXQ5MV9zc2Nfd3JpdGUoc3NjX3AtPnNzYy5iYXNlICsgQVRNRUxfUERDX1ROUFIsIDApOwogCQlhdDkxX3NzY193cml0ZShzc2NfcC0+c3NjLmJhc2UgKyBBVE1FTF9QRENfVE5DUiwgMCk7CiAKLQkJaWYgKChyZXQgPSByZXF1ZXN0X2lycShzc2NfcC0+c3NjLnBpZCwgYXQ5MV9pMnNfaW50ZXJydXB0LAorCQlpZiAoKHJldCA9IHJlcXVlc3RfaXJxKHNzY19wLT5zc2MucGlkLCBhdDkxX3NzY19pbnRlcnJ1cHQsCiAJCQkJCTAsIHNzY19wLT5uYW1lLCBzc2NfcCkpIDwgMCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXQ5MS1pMnM6IHJlcXVlc3RfaXJxIGZhaWx1cmVcbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXQ5MS1zc2M6IHJlcXVlc3RfaXJxIGZhaWx1cmVcbiIpOwogCiAJCQlEQkcoIlN0b3BwaW5nIHBpZCAlZCBjbG9ja1xuIiwgc3NjX3AtPnNzYy5waWQpOwogCQkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9QTUNfUENFUiwgMTw8c3NjX3AtPnNzYy5waWQpOwpAQCAtNTQ2LDcgKzYxNCw3IEBACiB9CiAKIAotc3RhdGljIGludCBhdDkxX2kyc19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc3RhdGljIGludCBhdDkxX3NzY19wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3AgPSAmc3NjX2luZm9bcnRkLT5kYWktPmNwdV9kYWktPmlkXTsKQEAgLTU2Niw3ICs2MzQsNyBAQAogCiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgYXQ5MV9pMnNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorc3RhdGljIGludCBhdDkxX3NzY19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSkKIHsKIAlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3A7CkBAIC01OTQsNyArNjYyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdDkxX2kyc19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKK3N0YXRpYyBpbnQgYXQ5MV9zc2NfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSkKIHsKIAlzdHJ1Y3QgYXQ5MV9zc2NfaW5mbyAqc3NjX3A7CkBAIC02MjAsMTAyICs2ODgsMTA1IEBACiB9CiAKICNlbHNlCi0jZGVmaW5lIGF0OTFfaTJzX3N1c3BlbmQJTlVMTAotI2RlZmluZSBhdDkxX2kyc19yZXN1bWUJCU5VTEwKKyNkZWZpbmUgYXQ5MV9zc2Nfc3VzcGVuZAlOVUxMCisjZGVmaW5lIGF0OTFfc3NjX3Jlc3VtZQkJTlVMTAogI2VuZGlmCiAKLSNkZWZpbmUgQVQ5MV9JMlNfUkFURVMgKFNORFJWX1BDTV9SQVRFXzgwMDAgIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfFwKKyNkZWZpbmUgQVQ5MV9TU0NfUkFURVMgKFNORFJWX1BDTV9SQVRFXzgwMDAgIHwgU05EUlZfUENNX1JBVEVfMTEwMjUgfFwKIAkJCVNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfFwKIAkJCVNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfFwKIAkJCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfFwKIAkJCVNORFJWX1BDTV9SQVRFXzk2MDAwKQogCi1zdHJ1Y3Qgc25kX3NvY19jcHVfZGFpIGF0OTFfaTJzX2RhaVtOVU1fU1NDX0RFVklDRVNdID0gewotCXsJLm5hbWUgPSAiYXQ5MV9zc2MwL2kycyIsCisjZGVmaW5lIEFUOTFfU1NDX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzggICAgIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfFwKKwkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSkKKworc3RydWN0IHNuZF9zb2NfY3B1X2RhaSBhdDkxX3NzY19kYWlbTlVNX1NTQ19ERVZJQ0VTXSA9IHsKKwl7CS5uYW1lID0gImF0OTEtc3NjMCIsCiAJCS5pZCA9IDAsCi0JCS50eXBlID0gU05EX1NPQ19EQUlfSTJTLAotCQkuc3VzcGVuZCA9IGF0OTFfaTJzX3N1c3BlbmQsCi0JCS5yZXN1bWUgPSBhdDkxX2kyc19yZXN1bWUsCisJCS50eXBlID0gU05EX1NPQ19EQUlfUENNLAorCQkuc3VzcGVuZCA9IGF0OTFfc3NjX3N1c3BlbmQsCisJCS5yZXN1bWUgPSBhdDkxX3NzY19yZXN1bWUsCiAJCS5wbGF5YmFjayA9IHsKIAkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBBVDkxX0kyU19SQVRFUywKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkJCS5yYXRlcyA9IEFUOTFfU1NDX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBBVDkxX1NTQ19GT1JNQVRTLH0sCiAJCS5jYXB0dXJlID0gewogCQkJLmNoYW5uZWxzX21pbiA9IDEsCiAJCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IEFUOTFfSTJTX1JBVEVTLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCQkJLnJhdGVzID0gQVQ5MV9TU0NfUkFURVMsCisJCQkuZm9ybWF0cyA9IEFUOTFfU1NDX0ZPUk1BVFMsfSwKIAkJLm9wcyA9IHsKLQkJCS5zdGFydHVwID0gYXQ5MV9pMnNfc3RhcnR1cCwKLQkJCS5zaHV0ZG93biA9IGF0OTFfaTJzX3NodXRkb3duLAotCQkJLnByZXBhcmUgPSBhdDkxX2kyc19wcmVwYXJlLAotCQkJLmh3X3BhcmFtcyA9IGF0OTFfaTJzX2h3X3BhcmFtcyx9LAorCQkJLnN0YXJ0dXAgPSBhdDkxX3NzY19zdGFydHVwLAorCQkJLnNodXRkb3duID0gYXQ5MV9zc2Nfc2h1dGRvd24sCisJCQkucHJlcGFyZSA9IGF0OTFfc3NjX3ByZXBhcmUsCisJCQkuaHdfcGFyYW1zID0gYXQ5MV9zc2NfaHdfcGFyYW1zLH0sCiAJCS5kYWlfb3BzID0gewotCQkJLnNldF9zeXNjbGsgPSBhdDkxX2kyc19zZXRfZGFpX3N5c2NsaywKLQkJCS5zZXRfZm10ID0gYXQ5MV9pMnNfc2V0X2RhaV9mbXQsCi0JCQkuc2V0X2Nsa2RpdiA9IGF0OTFfaTJzX3NldF9kYWlfY2xrZGl2LH0sCisJCQkuc2V0X3N5c2NsayA9IGF0OTFfc3NjX3NldF9kYWlfc3lzY2xrLAorCQkJLnNldF9mbXQgPSBhdDkxX3NzY19zZXRfZGFpX2ZtdCwKKwkJCS5zZXRfY2xrZGl2ID0gYXQ5MV9zc2Nfc2V0X2RhaV9jbGtkaXYsfSwKIAkJLnByaXZhdGVfZGF0YSA9ICZzc2NfaW5mb1swXS5zc2MsCiAJfSwKICNpZiBOVU1fU1NDX0RFVklDRVMgPT0gMwotCXsJLm5hbWUgPSAiYXQ5MV9zc2MxL2kycyIsCisJewkubmFtZSA9ICJhdDkxLXNzYzEiLAogCQkuaWQgPSAxLAotCQkudHlwZSA9IFNORF9TT0NfREFJX0kyUywKLQkJLnN1c3BlbmQgPSBhdDkxX2kyc19zdXNwZW5kLAotCQkucmVzdW1lID0gYXQ5MV9pMnNfcmVzdW1lLAorCQkudHlwZSA9IFNORF9TT0NfREFJX1BDTSwKKwkJLnN1c3BlbmQgPSBhdDkxX3NzY19zdXNwZW5kLAorCQkucmVzdW1lID0gYXQ5MV9zc2NfcmVzdW1lLAogCQkucGxheWJhY2sgPSB7CiAJCQkuY2hhbm5lbHNfbWluID0gMSwKIAkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gQVQ5MV9JMlNfUkFURVMsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLH0sCisJCQkucmF0ZXMgPSBBVDkxX1NTQ19SQVRFUywKKwkJCS5mb3JtYXRzID0gQVQ5MV9TU0NfRk9STUFUUyx9LAogCQkuY2FwdHVyZSA9IHsKIAkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBBVDkxX0kyU19SQVRFUywKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkJCS5yYXRlcyA9IEFUOTFfU1NDX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBBVDkxX1NTQ19GT1JNQVRTLH0sCiAJCS5vcHMgPSB7Ci0JCQkuc3RhcnR1cCA9IGF0OTFfaTJzX3N0YXJ0dXAsCi0JCQkuc2h1dGRvd24gPSBhdDkxX2kyc19zaHV0ZG93biwKLQkJCS5wcmVwYXJlID0gYXQ5MV9pMnNfcHJlcGFyZSwKLQkJCS5od19wYXJhbXMgPSBhdDkxX2kyc19od19wYXJhbXMsfSwKKwkJCS5zdGFydHVwID0gYXQ5MV9zc2Nfc3RhcnR1cCwKKwkJCS5zaHV0ZG93biA9IGF0OTFfc3NjX3NodXRkb3duLAorCQkJLnByZXBhcmUgPSBhdDkxX3NzY19wcmVwYXJlLAorCQkJLmh3X3BhcmFtcyA9IGF0OTFfc3NjX2h3X3BhcmFtcyx9LAogCQkuZGFpX29wcyA9IHsKLQkJCS5zZXRfc3lzY2xrID0gYXQ5MV9pMnNfc2V0X2RhaV9zeXNjbGssCi0JCQkuc2V0X2ZtdCA9IGF0OTFfaTJzX3NldF9kYWlfZm10LAotCQkJLnNldF9jbGtkaXYgPSBhdDkxX2kyc19zZXRfZGFpX2Nsa2Rpdix9LAorCQkJLnNldF9zeXNjbGsgPSBhdDkxX3NzY19zZXRfZGFpX3N5c2NsaywKKwkJCS5zZXRfZm10ID0gYXQ5MV9zc2Nfc2V0X2RhaV9mbXQsCisJCQkuc2V0X2Nsa2RpdiA9IGF0OTFfc3NjX3NldF9kYWlfY2xrZGl2LH0sCiAJCS5wcml2YXRlX2RhdGEgPSAmc3NjX2luZm9bMV0uc3NjLAogCX0sCi0JewkubmFtZSA9ICJhdDkxX3NzYzIvaTJzIiwKKwl7CS5uYW1lID0gImF0OTEtc3NjMiIsCiAJCS5pZCA9IDIsCi0JCS50eXBlID0gU05EX1NPQ19EQUlfSTJTLAotCQkuc3VzcGVuZCA9IGF0OTFfaTJzX3N1c3BlbmQsCi0JCS5yZXN1bWUgPSBhdDkxX2kyc19yZXN1bWUsCisJCS50eXBlID0gU05EX1NPQ19EQUlfUENNLAorCQkuc3VzcGVuZCA9IGF0OTFfc3NjX3N1c3BlbmQsCisJCS5yZXN1bWUgPSBhdDkxX3NzY19yZXN1bWUsCiAJCS5wbGF5YmFjayA9IHsKIAkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBBVDkxX0kyU19SQVRFUywKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsfSwKKwkJCS5yYXRlcyA9IEFUOTFfU1NDX1JBVEVTLAorCQkJLmZvcm1hdHMgPSBBVDkxX1NTQ19GT1JNQVRTLH0sCiAJCS5jYXB0dXJlID0gewogCQkJLmNoYW5uZWxzX21pbiA9IDEsCiAJCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IEFUOTFfSTJTX1JBVEVTLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCQkJLnJhdGVzID0gQVQ5MV9TU0NfUkFURVMsCisJCQkuZm9ybWF0cyA9IEFUOTFfU1NDX0ZPUk1BVFMsfSwKIAkJLm9wcyA9IHsKLQkJCS5zdGFydHVwID0gYXQ5MV9pMnNfc3RhcnR1cCwKLQkJCS5zaHV0ZG93biA9IGF0OTFfaTJzX3NodXRkb3duLAotCQkJLnByZXBhcmUgPSBhdDkxX2kyc19wcmVwYXJlLAotCQkJLmh3X3BhcmFtcyA9IGF0OTFfaTJzX2h3X3BhcmFtcyx9LAorCQkJLnN0YXJ0dXAgPSBhdDkxX3NzY19zdGFydHVwLAorCQkJLnNodXRkb3duID0gYXQ5MV9zc2Nfc2h1dGRvd24sCisJCQkucHJlcGFyZSA9IGF0OTFfc3NjX3ByZXBhcmUsCisJCQkuaHdfcGFyYW1zID0gYXQ5MV9zc2NfaHdfcGFyYW1zLH0sCiAJCS5kYWlfb3BzID0gewotCQkJLnNldF9zeXNjbGsgPSBhdDkxX2kyc19zZXRfZGFpX3N5c2NsaywKLQkJCS5zZXRfZm10ID0gYXQ5MV9pMnNfc2V0X2RhaV9mbXQsCi0JCQkuc2V0X2Nsa2RpdiA9IGF0OTFfaTJzX3NldF9kYWlfY2xrZGl2LH0sCisJCQkuc2V0X3N5c2NsayA9IGF0OTFfc3NjX3NldF9kYWlfc3lzY2xrLAorCQkJLnNldF9mbXQgPSBhdDkxX3NzY19zZXRfZGFpX2ZtdCwKKwkJCS5zZXRfY2xrZGl2ID0gYXQ5MV9zc2Nfc2V0X2RhaV9jbGtkaXYsfSwKIAkJLnByaXZhdGVfZGF0YSA9ICZzc2NfaW5mb1syXS5zc2MsCiAJfSwKICNlbmRpZgogfTsKIAotRVhQT1JUX1NZTUJPTF9HUEwoYXQ5MV9pMnNfZGFpKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0OTFfc3NjX2RhaSk7CiAKIC8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwogTU9EVUxFX0FVVEhPUigiRnJhbmsgTWFuZGFyaW5vLCBmbWFuZGFyaW5vQGVuZHJlbGlhLmNvbSwgd3d3LmVuZHJlbGlhLmNvbSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBVDkxIEkyUyBBU29DIEludGVyZmFjZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBVDkxIFNTQyBBU29DIEludGVyZmFjZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0OTEvYXQ5MS1pMnMuaCBiL3NvdW5kL3NvYy9hdDkxL2F0OTEtc3NjLmgKc2ltaWxhcml0eSBpbmRleCA3MSUKcmVuYW1lIGZyb20gc291bmQvc29jL2F0OTEvYXQ5MS1pMnMuaApyZW5hbWUgdG8gc291bmQvc29jL2F0OTEvYXQ5MS1zc2MuaAppbmRleCBmOGE4NzViLi5iMTg4Zjk3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXQ5MS9hdDkxLWkycy5oCisrKyBiL3NvdW5kL3NvYy9hdDkxL2F0OTEtc3NjLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogYXQ5MS1pMnMuaCAtIEFMU0EgSTJTIGludGVyZmFjZSBmb3IgdGhlIEF0bWVsIEFUOTEgU29DCisgKiBhdDkxLXNzYy5oIC0gQUxTQSBTU0MgaW50ZXJmYWNlIGZvciB0aGUgQXRtZWwgQVQ5MSBTb0MKICAqCiAgKiBBdXRob3I6CUZyYW5rIE1hbmRhcmlubyA8Zm1hbmRhcmlub0BlbmRyZWxpYS5jb20+CiAgKgkJRW5kcmVsaWEgVGVjaG5vbG9naWVzIEluYy4KQEAgLTEwLDE4ICsxMCwxOCBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAotI2lmbmRlZiBfQVQ5MV9JMlNfSAotI2RlZmluZSBfQVQ5MV9JMlNfSAorI2lmbmRlZiBfQVQ5MV9TU0NfSAorI2RlZmluZSBfQVQ5MV9TU0NfSAogCi0vKiBJMlMgc3lzdGVtIGNsb2NrIGlkcyAqLworLyogU1NDIHN5c3RlbSBjbG9jayBpZHMgKi8KICNkZWZpbmUgQVQ5MV9TWVNDTEtfTUNLCQkwIC8qIFNTQyB1c2VzIEFUOTEgTUNLIGFzIHN5c3RlbSBjbG9jayAqLwogCi0vKiBJMlMgZGl2aWRlciBpZHMgKi8KKy8qIFNTQyBkaXZpZGVyIGlkcyAqLwogI2RlZmluZSBBVDkxU1NDX0NNUl9ESVYJCTAgLyogTUNLIGRpdmlkZXIgZm9yIEJDTEsgKi8KICNkZWZpbmUgQVQ5MVNTQ19UQ01SX1BFUklPRAkxIC8qIEJDTEsgZGl2aWRlciBmb3IgdHJhbnNtaXQgRlMgKi8KICNkZWZpbmUgQVQ5MVNTQ19SQ01SX1BFUklPRAkyIC8qIEJDTEsgZGl2aWRlciBmb3IgcmVjZWl2ZSBGUyAqLwogCi1leHRlcm4gc3RydWN0IHNuZF9zb2NfY3B1X2RhaSBhdDkxX2kyc19kYWlbXTsKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpIGF0OTFfc3NjX2RhaVtdOwogCi0jZW5kaWYgLyogX0FUOTFfSTJTX0ggKi8KKyNlbmRpZiAvKiBfQVQ5MV9TU0NfSCAqLwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXQ5MS9ldGlfYjFfd204NzMxLmMgYi9zb3VuZC9zb2MvYXQ5MS9ldGlfYjFfd204NzMxLmMKaW5kZXggODE3OWRmMy4uODIwYTY3NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0OTEvZXRpX2IxX3dtODczMS5jCisrKyBiL3NvdW5kL3NvYy9hdDkxL2V0aV9iMV93bTg3MzEuYwpAQCAtNDAsNyArNDAsNyBAQAogCiAjaW5jbHVkZSAiLi4vY29kZWNzL3dtODczMS5oIgogI2luY2x1ZGUgImF0OTEtcGNtLmgiCi0jaW5jbHVkZSAiYXQ5MS1pMnMuaCIKKyNpbmNsdWRlICJhdDkxLXNzYy5oIgogCiAjaWYgMAogI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKEtFUk5fSU5GTyAiZXRpX2IxX3dtODczMTogIiB4KQpAQCAtMjQ4LDE1ICsyNDgsMTUgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGV0aV9iMV9kYWkgPSB7CiAJLm5hbWUgPSAiV004NzMxIiwKLQkuc3RyZWFtX25hbWUgPSAiV004NzMxIiwKLQkuY3B1X2RhaSA9ICZhdDkxX2kyc19kYWlbMV0sCisJLnN0cmVhbV9uYW1lID0gIldNODczMSBQQ00iLAorCS5jcHVfZGFpID0gJmF0OTFfc3NjX2RhaVsxXSwKIAkuY29kZWNfZGFpID0gJndtODczMV9kYWksCiAJLmluaXQgPSBldGlfYjFfd204NzMxX2luaXQsCiAJLm9wcyA9ICZldGlfYjFfb3BzLAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX21hY2hpbmUgc25kX3NvY19tYWNoaW5lX2V0aV9iMSA9IHsKLQkubmFtZSA9ICJFVElfQjEiLAorCS5uYW1lID0gIkVUSV9CMV9XTTg3MzEiLAogCS5kYWlfbGluayA9ICZldGlfYjFfZGFpLAogCS5udW1fbGlua3MgPSAxLAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwppbmRleCBlYzJhMjc4Li5lNWZiNDM3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKKysrIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCkBAIC0xMCw2ICsxMCwxMCBAQAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBTTkRfU09DCiAKK2NvbmZpZyBTTkRfU09DX1dNODc1MworCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBTTkRfU09DCisKIGNvbmZpZyBTTkRfU09DX1dNOTcxMgogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBTTkRfU09DCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQppbmRleCAzMjQ5YTZlLi5lMzlhNzQ3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKQEAgLTEsOSArMSwxMSBAQAogc25kLXNvYy1hYzk3LW9ianMgOj0gYWM5Ny5vCiBzbmQtc29jLXdtODczMS1vYmpzIDo9IHdtODczMS5vCiBzbmQtc29jLXdtODc1MC1vYmpzIDo9IHdtODc1MC5vCitzbmQtc29jLXdtODc1My1vYmpzIDo9IHdtODc1My5vCiBzbmQtc29jLXdtOTcxMi1vYmpzIDo9IHdtOTcxMi5vCiAKIG9iai0kKENPTkZJR19TTkRfU09DX0FDOTdfQ09ERUMpCSs9IHNuZC1zb2MtYWM5Ny5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg3MzEpCSs9IHNuZC1zb2Mtd204NzMxLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODc1MCkJKz0gc25kLXNvYy13bTg3NTAubworb2JqLSQoQ09ORklHX1NORF9TT0NfV004NzUzKQkrPSBzbmQtc29jLXdtODc1My5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTk3MTIpCSs9IHNuZC1zb2Mtd205NzEyLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5jIGIvc291bmQvc29jL2NvZGVjcy9hYzk3LmMKaW5kZXggNTViYzU1ZS4uMGNkZWY5NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hYzk3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hYzk3LmMKQEAgLTYwLDYgKzYwLDcgQEAKIAkub3BzID0gewogCQkucHJlcGFyZSA9IGFjOTdfcHJlcGFyZSx9LAogfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGFjOTdfZGFpKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBhYzk3X3JlYWQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCXVuc2lnbmVkIGludCByZWcpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FjOTcuaCBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5oCmluZGV4IDkzMGRkZmMuLjJiZjZkNjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWM5Ny5oCkBAIC0xNCw1ICsxNCw2IEBACiAjZGVmaW5lIF9fTElOVVhfU05EX1NPQ19BQzk3X0gKIAogZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X2FjOTc7CitleHRlcm4gc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpIGFjOTdfZGFpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCmluZGV4IDcwNzNlOGUuLjI4Njg0ZWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYwpAQCAtODA4LDcgKzgwOCw3IEBACiAJY29kZWMtPmRhaSA9ICZ3bTg3NTBfZGFpOwogCWNvZGVjLT5udW1fZGFpID0gMTsKIAljb2RlYy0+cmVnX2NhY2hlX3NpemUgPSBzaXplb2Yod204NzUwX3JlZyk7Ci0JY29kZWMtPnJlZ19jYWNoZSA9IGttZW1kdXAod204NzUwX3JlZywgc2l6ZW9mKHdtODc1MF9yZWcpLCBHRlBfS1JFTkVMKTsKKwljb2RlYy0+cmVnX2NhY2hlID0ga21lbWR1cCh3bTg3NTBfcmVnLCBzaXplb2Yod204NzUwX3JlZyksIEdGUF9LRVJORUwpOwogCWlmIChjb2RlYy0+cmVnX2NhY2hlID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNlZDkzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYwpAQCAtMCwwICsxLDE4MTEgQEAKKy8qCisgKiB3bTg3NTMuYyAgLS0gIFdNODc1MyBBTFNBIFNvYyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAwMyBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICogQXV0aG9yOiBMaWFtIEdpcmR3b29kCisgKiAgICAgICAgIGxpYW0uZ2lyZHdvb2RAd29sZnNvbm1pY3JvLmNvbSBvciBsaW51eEB3b2xmc29ubWljcm8uY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogTm90ZXM6CisgKiAgVGhlIFdNODc1MyBpcyBhIGxvdyBwb3dlciwgaGlnaCBxdWFsaXR5IHN0ZXJlbyBjb2RlYyB3aXRoIGludGVncmF0ZWQgUENNCisgKiAgY29kZWMgZGVzaWduZWQgZm9yIHBvcnRhYmxlIGRpZ2l0YWwgdGVsZXBob255IGFwcGxpY2F0aW9ucy4KKyAqCisgKiBEdWFsIERBSTotCisgKgorICogVGhpcyBkcml2ZXIgc3VwcG9ydCAyIERBSSBQQ00ncy4gVGhpcyBtYWtlcyB0aGUgZGVmYXVsdCBQQ00gYXZhaWxhYmxlIGZvcgorICogSGlGaSBhdWRpbyAoZS5nLiBNUDMsIG9nZykgcGxheWJhY2svY2FwdHVyZSBhbmQgdGhlIG90aGVyIFBDTSBhdmFpbGFibGUgZm9yCisgKiB2b2ljZS4KKyAqCisgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSB2b2ljZSBQQ00gY2FuIGJlIGNvbm5lY3RlZCBkaXJlY3RseSB0byBhIEJsdWV0b290aAorICogY29kZWMgb3IgR1NNIG1vZGVtIGFuZCB0aHVzIGNhbm5vdCBiZSByZWFkIG9yIHdyaXR0ZW4gdG8sIGFsdGhvdWdoIGl0IGlzCisgKiBhdmFpbGFibGUgdG8gYmUgY29uZmlndXJlZCB3aXRoIHNuZF9od19wYXJhbXMoKSwgZXRjIGFuZCBrY29udHJvbHMgaW4gdGhlCisgKiBub3JtYWwgYWxzYSBtYW5uZXIuCisgKgorICogRmFzdCBEQUkgc3dpdGNoaW5nOi0KKyAqCisgKiBUaGUgZHJpdmVyIGNhbiBub3cgZmFzdCBzd2l0Y2ggYmV0d2VlbiB0aGUgREFJIGNvbmZpZ3VyYXRpb25zIHZpYSBhCisgKiBhbiBhbHNhIGtjb250cm9sLiBUaGlzIGFsbG93cyB0aGUgUENNIHRvIHJlbWFpbiBvcGVuLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy1kYXBtLmg+CisjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAid204NzUzLmgiCisKKyNkZWZpbmUgQVVESU9fTkFNRSAid204NzUzIgorI2RlZmluZSBXTTg3NTNfVkVSU0lPTiAiMC4xNiIKKworLyoKKyAqIERlYnVnCisgKi8KKworI2RlZmluZSBXTTg3NTNfREVCVUcgMAorCisjaWZkZWYgV004NzUzX0RFQlVHCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHIEFVRElPX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNlbHNlCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKyNkZWZpbmUgZXJyKGZvcm1hdCwgYXJnLi4uKSBcCisJcHJpbnRrKEtFUk5fRVJSIEFVRElPX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgXAorCXByaW50ayhLRVJOX0lORk8gQVVESU9fTkFNRSAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI2RlZmluZSB3YXJuKGZvcm1hdCwgYXJnLi4uKSBcCisJcHJpbnRrKEtFUk5fV0FSTklORyBBVURJT19OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisKK3N0YXRpYyBpbnQgY2Fwc19jaGFyZ2UgPSAyMDAwOworbW9kdWxlX3BhcmFtKGNhcHNfY2hhcmdlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjYXBzX2NoYXJnZSwgIldNODc1MyBjYXAgY2hhcmdlIHRpbWUgKG1zZWNzKSIpOworCitzdGF0aWMgdm9pZCB3bTg3NTNfc2V0X2RhaV9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwl1bnNpZ25lZCBpbnQgbW9kZSk7CisKKy8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLworc3RydWN0IHdtODc1M19wcml2IHsKKwl1bnNpZ25lZCBpbnQgc3lzY2xrOworCXVuc2lnbmVkIGludCBwY21jbGs7Cit9OworCisvKgorICogd204NzUzIHJlZ2lzdGVyIGNhY2hlCisgKiBXZSBjYW4ndCByZWFkIHRoZSBXTTg3NTMgcmVnaXN0ZXIgc3BhY2Ugd2hlbiB3ZQorICogYXJlIHVzaW5nIDIgd2lyZSBmb3IgZGV2aWNlIGNvbnRyb2wsIHNvIHdlIGNhY2hlIHRoZW0gaW5zdGVhZC4KKyAqLworc3RhdGljIGNvbnN0IHUxNiB3bTg3NTNfcmVnW10gPSB7CisJMHgwMDA4LCAweDAwMDAsIDB4MDAwYSwgMHgwMDBhLAorCTB4MDAzMywgMHgwMDAwLCAweDAwMDcsIDB4MDBmZiwKKwkweDAwZmYsIDB4MDAwZiwgMHgwMDBmLCAweDAwN2IsCisJMHgwMDAwLCAweDAwMzIsIDB4MDAwMCwgMHgwMGMzLAorCTB4MDBjMywgMHgwMGMwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDA1NSwKKwkweDAwMDUsIDB4MDA1MCwgMHgwMDU1LCAweDAwNTAsCisJMHgwMDU1LCAweDAwNTAsIDB4MDA1NSwgMHgwMDc5LAorCTB4MDA3OSwgMHgwMDc5LCAweDAwNzksIDB4MDA3OSwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDk3LCAweDAwOTcsIDB4MDAwMCwgMHgwMDA0LAorCTB4MDAwMCwgMHgwMDgzLCAweDAwMjQsIDB4MDFiYSwKKwkweDAwMDAsIDB4MDA4MywgMHgwMDI0LCAweDAxYmEsCisJMHgwMDAwLCAweDAwMDAKK307CisKKy8qCisgKiByZWFkIHdtODc1MyByZWdpc3RlciBjYWNoZQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB3bTg3NTNfcmVhZF9yZWdfY2FjaGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXVuc2lnbmVkIGludCByZWcpCit7CisJdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisJaWYgKHJlZyA8IDEgfHwgcmVnID4gKEFSUkFZX1NJWkUod204NzUzX3JlZykgKyAxKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBjYWNoZVtyZWcgLSAxXTsKK30KKworLyoKKyAqIHdyaXRlIHdtODc1MyByZWdpc3RlciBjYWNoZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgd204NzUzX3dyaXRlX3JlZ19jYWNoZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXUxNiAqY2FjaGUgPSBjb2RlYy0+cmVnX2NhY2hlOworCWlmIChyZWcgPCAxIHx8IHJlZyA+IDB4M2YpCisJCXJldHVybjsKKwljYWNoZVtyZWcgLSAxXSA9IHZhbHVlOworfQorCisvKgorICogd3JpdGUgdG8gdGhlIFdNODc1MyByZWdpc3RlciBzcGFjZQorICovCitzdGF0aWMgaW50IHdtODc1M193cml0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJdW5zaWduZWQgaW50IHZhbHVlKQoreworCXU4IGRhdGFbMl07CisKKwkvKiBkYXRhIGlzCisJICogICBEMTUuLkQ5IFdNODc1MyByZWdpc3RlciBvZmZzZXQKKwkgKiAgIEQ4Li4uRDAgcmVnaXN0ZXIgZGF0YQorCSAqLworCWRhdGFbMF0gPSAocmVnIDw8IDEpIHwgKCh2YWx1ZSA+PiA4KSAmIDB4MDAwMSk7CisJZGF0YVsxXSA9IHZhbHVlICYgMHgwMGZmOworCisJd204NzUzX3dyaXRlX3JlZ19jYWNoZSAoY29kZWMsIHJlZywgdmFsdWUpOworCWlmIChjb2RlYy0+aHdfd3JpdGUoY29kZWMtPmNvbnRyb2xfZGF0YSwgZGF0YSwgMikgPT0gMikKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTzsKK30KKworI2RlZmluZSB3bTg3NTNfcmVzZXQoYykgd204NzUzX3dyaXRlKGMsIFdNODc1M19SRVNFVCwgMCkKKworLyoKKyAqIFdNODc1MyBDb250cm9scworICovCitzdGF0aWMgY29uc3QgY2hhciAqd204NzUzX2Jhc2VbXSA9IHsiTGluZWFyIENvbnRyb2wiLCAiQWRhcHRpdmUgQm9vc3QifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfYmFzZV9maWx0ZXJbXSA9CisJeyIxMzBIeiBAIDQ4a0h6IiwgIjIwMEh6IEAgNDhrSHoiLCAiMTAwSHogQCAxNmtIeiIsICI0MDBIeiBAIDQ4a0h6IiwKKwkiMTAwSHogQCA4a0h6IiwgIjIwMEh6IEAgOGtIeiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1M190cmVibGVbXSA9IHsiOGtIeiIsICI0a0h6In07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUzX2FsY19mdW5jW10gPSB7Ik9mZiIsICJSaWdodCIsICJMZWZ0IiwgIlN0ZXJlbyJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1M19uZ190eXBlW10gPSB7IkNvbnN0YW50IFBHQSBHYWluIiwgIk11dGUgQURDIE91dHB1dCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1M18zZF9mdW5jW10gPSB7IkNhcHR1cmUiLCAiUGxheWJhY2sifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfM2RfdWNbXSA9IHsiMi4ya0h6IiwgIjEuNWtIeiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1M18zZF9sY1tdID0geyIyMDBIeiIsICI1MDBIeiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1M19kZWVtcFtdID0geyJOb25lIiwgIjMya0h6IiwgIjQ0LjFrSHoiLCAiNDhrSHoifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfbW9ub19taXhbXSA9IHsiU3RlcmVvIiwgIkxlZnQiLCAiUmlnaHQiLCAiTW9ubyJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1M19kYWNfcGhhc2VbXSA9IHsiTm9uIEludmVydGVkIiwgIkludmVydGVkIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUzX2xpbmVfbWl4W10gPSB7IkxpbmUgMSArIDIiLCAiTGluZSAxIC0gMiIsCisJIkxpbmUgMSIsICJMaW5lIDIifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfbW9ub19tdXhbXSA9IHsiTGluZSBNaXgiLCAiUnggTWl4In07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUzX3JpZ2h0X211eFtdID0geyJMaW5lIDIiLCAiUnggTWl4In07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUzX2xlZnRfbXV4W10gPSB7IkxpbmUgMSIsICJSeCBNaXgifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfcnhtc2VsW10gPSB7IlJYUCAtIFJYTiIsICJSWFAgKyBSWE4iLCAiUlhQIiwgIlJYTiJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKndtODc1M19zaWRldG9uZV9tdXhbXSA9IHsiTGVmdCBQR0EiLCAiTWljIDEiLCAiTWljIDIiLAorCSJSaWdodCBQR0EifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfbW9ubzJfc3JjW10gPSB7IkludmVydGVkIE1vbm8gMSIsICJMZWZ0IiwgIlJpZ2h0IiwKKwkiTGVmdCArIFJpZ2h0In07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUzX291dDNbXSA9IHsiVlJFRiIsICJST1VUMiIsICJMZWZ0ICsgUmlnaHQifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfb3V0NFtdID0geyJWUkVGIiwgIkNhcHR1cmUgU1QiLCAiTE9VVDIifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfcmFkY3NlbFtdID0geyJQR0EiLCAiTGluZSBvciBSWFAtUlhOIiwgIlNpZGV0b25lIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUzX2xhZGNzZWxbXSA9IHsiUEdBIiwgIkxpbmUgb3IgUlhQLVJYTiIsICJMaW5lIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUzX21vbm9fYWRjW10gPSB7IlN0ZXJlbyIsICJBbmFsb2d1ZSBNaXggTGVmdCIsCisJIkFuYWxvZ3VlIE1peCBSaWdodCIsICJEaWdpdGFsIE1vbm8gTWl4In07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUzX2FkY19ocFtdID0geyIzLjRIeiBAIDQ4a0h6IiwgIjgySHogQCAxNmsiLAorCSI4Mkh6IEAgOGtIeiIsICIxNzBIeiBAIDhrSHoifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfYWRjX2ZpbHRlcltdID0geyJIaUZpIiwgIlZvaWNlIn07CitzdGF0aWMgY29uc3QgY2hhciAqd204NzUzX21pY19zZWxbXSA9IHsiTWljIDEiLCAiTWljIDIiLCAiTWljIDMifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfZGFpX21vZGVbXSA9IHsiREFJIDAiLCAiREFJIDEiLCAiREFJIDIiLCAiREFJIDMifTsKK3N0YXRpYyBjb25zdCBjaGFyICp3bTg3NTNfZGF0X3NlbFtdID0geyJTdGVyZW8iLCAiTGVmdCBBREMiLCAiUmlnaHQgQURDIiwKKwkiQ2hhbm5lbCBTd2FwIn07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gd204NzUzX2VudW1bXSA9IHsKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTNfQkFTUywgNywgMiwgd204NzUzX2Jhc2UpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19CQVNTLCA0LCA2LCB3bTg3NTNfYmFzZV9maWx0ZXIpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19UUkVCTEUsIDYsIDIsIHdtODc1M190cmVibGUpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19BTEMxLCA3LCA0LCB3bTg3NTNfYWxjX2Z1bmMpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19OR0FURSwgMSwgMiwgd204NzUzX25nX3R5cGUpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M18zRCwgNywgMiwgd204NzUzXzNkX2Z1bmMpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M18zRCwgNiwgMiwgd204NzUzXzNkX3VjKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTNfM0QsIDUsIDIsIHdtODc1M18zZF9sYyksCitTT0NfRU5VTV9TSU5HTEUoV004NzUzX0RBQywgMSwgNCwgd204NzUzX2RlZW1wKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTNfREFDLCA0LCA0LCB3bTg3NTNfbW9ub19taXgpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19EQUMsIDYsIDIsIHdtODc1M19kYWNfcGhhc2UpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19JTkNUTDEsIDMsIDQsIHdtODc1M19saW5lX21peCksCitTT0NfRU5VTV9TSU5HTEUoV004NzUzX0lOQ1RMMSwgMiwgMiwgd204NzUzX21vbm9fbXV4KSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTNfSU5DVEwxLCAxLCAyLCB3bTg3NTNfcmlnaHRfbXV4KSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTNfSU5DVEwxLCAwLCAyLCB3bTg3NTNfbGVmdF9tdXgpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19JTkNUTDIsIDYsIDQsIHdtODc1M19yeG1zZWwpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19JTkNUTDIsIDQsIDQsIHdtODc1M19zaWRldG9uZV9tdXgpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19PVVRDVEwsIDcsIDQsIHdtODc1M19tb25vMl9zcmMpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19PVVRDVEwsIDAsIDMsIHdtODc1M19vdXQzKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTNfQURDVEwyLCA3LCAzLCB3bTg3NTNfb3V0NCksCitTT0NfRU5VTV9TSU5HTEUoV004NzUzX0FEQ0lOLCAyLCAzLCB3bTg3NTNfcmFkY3NlbCksCitTT0NfRU5VTV9TSU5HTEUoV004NzUzX0FEQ0lOLCAwLCAzLCB3bTg3NTNfbGFkY3NlbCksCitTT0NfRU5VTV9TSU5HTEUoV004NzUzX0FEQ0lOLCA0LCA0LCB3bTg3NTNfbW9ub19hZGMpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19BREMsIDIsIDQsIHdtODc1M19hZGNfaHApLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19BREMsIDQsIDIsIHdtODc1M19hZGNfZmlsdGVyKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTNfTUlDQklBUywgNiwgMywgd204NzUzX21pY19zZWwpLAorU09DX0VOVU1fU0lOR0xFKFdNODc1M19JT0NUTCwgMiwgNCwgd204NzUzX2RhaV9tb2RlKSwKK1NPQ19FTlVNX1NJTkdMRShXTTg3NTNfQURDLCA3LCA0LCB3bTg3NTNfZGF0X3NlbCksCit9OworCisKK3N0YXRpYyBpbnQgd204NzUzX2dldF9kYWkoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgbW9kZSA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0lPQ1RMKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKG1vZGUgJiAweGMpID4+IDI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzUzX3NldF9kYWkoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gIHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgbW9kZSA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0lPQ1RMKTsKKworCWlmICgoKG1vZGUgJjB4YykgPj4gMikgPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCisJCXJldHVybiAwOworCisJbW9kZSAmPSAweGZmZjM7CisJbW9kZSB8PSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPDwgMik7CisKKwl3bTg3NTNfd3JpdGUoY29kZWMsIFdNODc1M19JT0NUTCwgbW9kZSk7CisJd204NzUzX3NldF9kYWlfbW9kZShjb2RlYywgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX3NuZF9jb250cm9sc1tdID0geworU09DX0RPVUJMRV9SKCJQQ00gVm9sdW1lIiwgV004NzUzX0xEQUMsIFdNODc1M19SREFDLCAwLCAyNTUsIDApLAorCitTT0NfRE9VQkxFX1IoIkFEQyBDYXB0dXJlIFZvbHVtZSIsIFdNODc1M19MQURDLCBXTTg3NTNfUkFEQywgMCwgMjU1LCAwKSwKKworU09DX0RPVUJMRV9SKCJIZWFkcGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgV004NzUzX0xPVVQxViwgV004NzUzX1JPVVQxViwgMCwgMTI3LCAwKSwKK1NPQ19ET1VCTEVfUigiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NTNfTE9VVDJWLCBXTTg3NTNfUk9VVDJWLCAwLCAxMjcsIDApLAorCitTT0NfU0lOR0xFKCJNb25vIFBsYXliYWNrIFZvbHVtZSIsIFdNODc1M19NT1VUViwgMCwgMTI3LCAwKSwKKworU09DX0RPVUJMRV9SKCJCeXBhc3MgUGxheWJhY2sgVm9sdW1lIiwgV004NzUzX0xPVVRNMSwgV004NzUzX1JPVVRNMSwgNCwgNywgMSksCitTT0NfRE9VQkxFX1IoIlNpZGV0b25lIFBsYXliYWNrIFZvbHVtZSIsIFdNODc1M19MT1VUTTIsIFdNODc1M19ST1VUTTIsIDQsIDcsIDEpLAorU09DX0RPVUJMRV9SKCJWb2ljZSBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NTNfTE9VVE0yLCBXTTg3NTNfUk9VVE0yLCAwLCA3LCAxKSwKKworU09DX0RPVUJMRV9SKCJIZWFkcGhvbmUgUGxheWJhY2sgWkMgU3dpdGNoIiwgV004NzUzX0xPVVQxViwgV004NzUzX1JPVVQxViwgNywgMSwgMCksCitTT0NfRE9VQkxFX1IoIlNwZWFrZXIgUGxheWJhY2sgWkMgU3dpdGNoIiwgV004NzUzX0xPVVQyViwgV004NzUzX1JPVVQyViwgNywgMSwgMCksCisKK1NPQ19TSU5HTEUoIk1vbm8gQnlwYXNzIFBsYXliYWNrIFZvbHVtZSIsIFdNODc1M19NT1VUTTEsIDQsIDcsIDEpLAorU09DX1NJTkdMRSgiTW9ubyBTaWRldG9uZSBQbGF5YmFjayBWb2x1bWUiLCBXTTg3NTNfTU9VVE0yLCA0LCA3LCAxKSwKK1NPQ19TSU5HTEUoIk1vbm8gVm9pY2UgUGxheWJhY2sgVm9sdW1lIiwgV004NzUzX01PVVRNMiwgNCwgNywgMSksCitTT0NfU0lOR0xFKCJNb25vIFBsYXliYWNrIFpDIFN3aXRjaCIsIFdNODc1M19NT1VUViwgNywgMSwgMCksCisKK1NPQ19FTlVNKCJCYXNzIEJvb3N0Iiwgd204NzUzX2VudW1bMF0pLAorU09DX0VOVU0oIkJhc3MgRmlsdGVyIiwgd204NzUzX2VudW1bMV0pLAorU09DX1NJTkdMRSgiQmFzcyBWb2x1bWUiLCBXTTg3NTNfQkFTUywgMCwgMTUsIDEpLAorCitTT0NfU0lOR0xFKCJUcmVibGUgVm9sdW1lIiwgV004NzUzX1RSRUJMRSwgMCwgMTUsIDEpLAorU09DX0VOVU0oIlRyZWJsZSBDdXQtb2ZmIiwgd204NzUzX2VudW1bMl0pLAorCitTT0NfRE9VQkxFKCJTaWRldG9uZSBDYXB0dXJlIFZvbHVtZSIsIFdNODc1M19SRUNNSVgxLCAwLCA0LCA3LCAxKSwKK1NPQ19TSU5HTEUoIlZvaWNlIFNpZGV0b25lIENhcHR1cmUgVm9sdW1lIiwgV004NzUzX1JFQ01JWDIsIDAsIDcsIDEpLAorCitTT0NfRE9VQkxFX1IoIkNhcHR1cmUgVm9sdW1lIiwgV004NzUzX0xJTlZPTCwgV004NzUzX1JJTlZPTCwgMCwgNjMsIDApLAorU09DX0RPVUJMRV9SKCJDYXB0dXJlIFpDIFN3aXRjaCIsIFdNODc1M19MSU5WT0wsIFdNODc1M19SSU5WT0wsIDYsIDEsIDApLAorU09DX0RPVUJMRV9SKCJDYXB0dXJlIFN3aXRjaCIsIFdNODc1M19MSU5WT0wsIFdNODc1M19SSU5WT0wsIDcsIDEsIDEpLAorCitTT0NfRU5VTSgiQ2FwdHVyZSBGaWx0ZXIgU2VsZWN0Iiwgd204NzUzX2VudW1bMjNdKSwKK1NPQ19FTlVNKCJDYXB0dXJlIEZpbHRlciBDdXQtb2ZmIiwgd204NzUzX2VudW1bMjRdKSwKK1NPQ19TSU5HTEUoIkNhcHR1cmUgRmlsdGVyIFN3aXRjaCIsIFdNODc1M19BREMsIDAsIDEsIDEpLAorCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBUYXJnZXQgVm9sdW1lIiwgV004NzUzX0FMQzEsIDAsIDcsIDApLAorU09DX1NJTkdMRSgiQUxDIENhcHR1cmUgTWF4IFZvbHVtZSIsIFdNODc1M19BTEMxLCA0LCA3LCAwKSwKK1NPQ19FTlVNKCJBTEMgQ2FwdHVyZSBGdW5jdGlvbiIsIHdtODc1M19lbnVtWzNdKSwKK1NPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIFpDIFN3aXRjaCIsIFdNODc1M19BTEMyLCA4LCAxLCAwKSwKK1NPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIEhvbGQgVGltZSIsIFdNODc1M19BTEMyLCAwLCAxNSwgMSksCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBEZWNheSBUaW1lIiwgV004NzUzX0FMQzMsIDQsIDE1LCAxKSwKK1NPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIEF0dGFjayBUaW1lIiwgV004NzUzX0FMQzMsIDAsIDE1LCAwKSwKK1NPQ19TSU5HTEUoIkFMQyBDYXB0dXJlIE5HIFRocmVzaG9sZCIsIFdNODc1M19OR0FURSwgMywgMzEsIDApLAorU09DX0VOVU0oIkFMQyBDYXB0dXJlIE5HIFR5cGUiLCB3bTg3NTNfZW51bVs0XSksCitTT0NfU0lOR0xFKCJBTEMgQ2FwdHVyZSBORyBTd2l0Y2giLCBXTTg3NTNfTkdBVEUsIDAsIDEsIDApLAorCitTT0NfRU5VTSgiM0QgRnVuY3Rpb24iLCB3bTg3NTNfZW51bVs1XSksCitTT0NfRU5VTSgiM0QgVXBwZXIgQ3V0LW9mZiIsIHdtODc1M19lbnVtWzZdKSwKK1NPQ19FTlVNKCIzRCBMb3dlciBDdXQtb2ZmIiwgd204NzUzX2VudW1bN10pLAorU09DX1NJTkdMRSgiM0QgVm9sdW1lIiwgV004NzUzXzNELCAxLCAxNSwgMCksCitTT0NfU0lOR0xFKCIzRCBTd2l0Y2giLCBXTTg3NTNfM0QsIDAsIDEsIDApLAorCitTT0NfU0lOR0xFKCJDYXB0dXJlIDZkQiBBdHRlbnVhdGUiLCBXTTg3NTNfQURDVEwxLCAyLCAxLCAwKSwKK1NPQ19TSU5HTEUoIlBsYXliYWNrIDZkQiBBdHRlbnVhdGUiLCBXTTg3NTNfQURDVEwxLCAxLCAxLCAwKSwKKworU09DX0VOVU0oIkRlLWVtcGhhc2lzIiwgd204NzUzX2VudW1bOF0pLAorU09DX0VOVU0oIlBsYXliYWNrIE1vbm8gTWl4Iiwgd204NzUzX2VudW1bOV0pLAorU09DX0VOVU0oIlBsYXliYWNrIFBoYXNlIiwgd204NzUzX2VudW1bMTBdKSwKKworU09DX1NJTkdMRSgiTWljMiBDYXB0dXJlIFZvbHVtZSIsIFdNODc1M19JTkNUTDEsIDcsIDMsIDApLAorU09DX1NJTkdMRSgiTWljMSBDYXB0dXJlIFZvbHVtZSIsIFdNODc1M19JTkNUTDEsIDUsIDMsIDApLAorCitTT0NfRU5VTV9FWFQoIkRBSSBNb2RlIiwgd204NzUzX2VudW1bMjZdLCB3bTg3NTNfZ2V0X2RhaSwgd204NzUzX3NldF9kYWkpLAorCitTT0NfRU5VTSgiQURDIERhdGEgU2VsZWN0Iiwgd204NzUzX2VudW1bMjddKSwKK307CisKKy8qIGFkZCBub24gZGFwbSBjb250cm9scyAqLworc3RhdGljIGludCB3bTg3NTNfYWRkX2NvbnRyb2xzKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgZXJyLCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzUzX3NuZF9jb250cm9scyk7IGkrKykgeworCQllcnIgPSBzbmRfY3RsX2FkZChjb2RlYy0+Y2FyZCwKKwkJCQlzbmRfc29jX2NuZXcoJndtODc1M19zbmRfY29udHJvbHNbaV0sY29kZWMsIE5VTEwpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIF9EQVBNXyBDb250cm9scworICovCisKKy8qIExlZnQgTWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTNfbGVmdF9taXhlcl9jb250cm9sc1tdID0geworU09DX0RBUE1fU0lOR0xFKCJWb2ljZSBQbGF5YmFjayBTd2l0Y2giLCBXTTg3NTNfTE9VVE0yLCA4LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiU2lkZXRvbmUgUGxheWJhY2sgU3dpdGNoIiwgV004NzUzX0xPVVRNMiwgNywgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgV004NzUzX0xPVVRNMSwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkJ5cGFzcyBQbGF5YmFjayBTd2l0Y2giLCBXTTg3NTNfTE9VVE0xLCA3LCAxLCAwKSwKK307CisKKy8qIFJpZ2h0IG1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX3JpZ2h0X21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIlZvaWNlIFBsYXliYWNrIFN3aXRjaCIsIFdNODc1M19ST1VUTTIsIDgsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJTaWRldG9uZSBQbGF5YmFjayBTd2l0Y2giLCBXTTg3NTNfUk9VVE0yLCA3LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiUmlnaHQgUGxheWJhY2sgU3dpdGNoIiwgV004NzUzX1JPVVRNMSwgOCwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkJ5cGFzcyBQbGF5YmFjayBTd2l0Y2giLCBXTTg3NTNfUk9VVE0xLCA3LCAxLCAwKSwKK307CisKKy8qIE1vbm8gbWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTNfbW9ub19taXhlcl9jb250cm9sc1tdID0geworU09DX0RBUE1fU0lOR0xFKCJMZWZ0IFBsYXliYWNrIFN3aXRjaCIsIFdNODc1M19NT1VUTTEsIDgsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJSaWdodCBQbGF5YmFjayBTd2l0Y2giLCBXTTg3NTNfTU9VVE0yLCA4LCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiVm9pY2UgUGxheWJhY2sgU3dpdGNoIiwgV004NzUzX01PVVRNMiwgMywgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIlNpZGV0b25lIFBsYXliYWNrIFN3aXRjaCIsIFdNODc1M19NT1VUTTIsIDcsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJCeXBhc3MgUGxheWJhY2sgU3dpdGNoIiwgV004NzUzX01PVVRNMSwgNywgMSwgMCksCit9OworCisvKiBNb25vIDIgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX21vbm8yX2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204NzUzX2VudW1bMTddKTsKKworLyogT3V0IDMgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX291dDNfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTNfZW51bVsxOF0pOworCisvKiBPdXQgNCBNdXggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTNfb3V0NF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODc1M19lbnVtWzE5XSk7CisKKy8qIEFEQyBNb25vIE1peCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1M19hZGNfbW9ub19jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODc1M19lbnVtWzIyXSk7CisKKy8qIFJlY29yZCBtaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1M19yZWNvcmRfbWl4ZXJfY29udHJvbHNbXSA9IHsKK1NPQ19EQVBNX1NJTkdMRSgiVm9pY2UgQ2FwdHVyZSBTd2l0Y2giLCBXTTg3NTNfUkVDTUlYMiwgMywgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIkxlZnQgQ2FwdHVyZSBTd2l0Y2giLCBXTTg3NTNfUkVDTUlYMSwgMywgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIlJpZ2h0IENhcHR1cmUgU3dpdGNoIiwgV004NzUzX1JFQ01JWDEsIDcsIDEsIDApLAorfTsKKworLyogTGVmdCBBREMgbXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX2FkY19sZWZ0X2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204NzUzX2VudW1bMjFdKTsKKworLyogUmlnaHQgQURDIG11eCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1M19hZGNfcmlnaHRfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTNfZW51bVsyMF0pOworCisvKiBNSUMgbXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX21pY19tdXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTNfZW51bVsxNl0pOworCisvKiBBTEMgbWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB3bTg3NTNfYWxjX21peGVyX2NvbnRyb2xzW10gPSB7CitTT0NfREFQTV9TSU5HTEUoIkxpbmUgQ2FwdHVyZSBTd2l0Y2giLCBXTTg3NTNfSU5DVEwyLCAzLCAxLCAwKSwKK1NPQ19EQVBNX1NJTkdMRSgiTWljMiBDYXB0dXJlIFN3aXRjaCIsIFdNODc1M19JTkNUTDIsIDIsIDEsIDApLAorU09DX0RBUE1fU0lOR0xFKCJNaWMxIENhcHR1cmUgU3dpdGNoIiwgV004NzUzX0lOQ1RMMiwgMSwgMSwgMCksCitTT0NfREFQTV9TSU5HTEUoIlJ4IENhcHR1cmUgU3dpdGNoIiwgV004NzUzX0lOQ1RMMiwgMCwgMSwgMCksCit9OworCisvKiBMZWZ0IExpbmUgbXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX2xpbmVfbGVmdF9jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODc1M19lbnVtWzE0XSk7CisKKy8qIFJpZ2h0IExpbmUgbXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX2xpbmVfcmlnaHRfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTNfZW51bVsxM10pOworCisvKiBNb25vIExpbmUgbXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX2xpbmVfbW9ub19jb250cm9scyA9CitTT0NfREFQTV9FTlVNKCJSb3V0ZSIsIHdtODc1M19lbnVtWzEyXSk7CisKKy8qIExpbmUgbXV4IGFuZCBtaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODc1M19saW5lX211eF9taXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTNfZW51bVsxMV0pOworCisvKiBSeCBtdXggYW5kIG1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX3J4X211eF9taXhfY29udHJvbHMgPQorU09DX0RBUE1fRU5VTSgiUm91dGUiLCB3bTg3NTNfZW51bVsxNV0pOworCisvKiBNaWMgU2VsZWN0b3IgTXV4ICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgd204NzUzX21pY19zZWxfbXV4X2NvbnRyb2xzID0KK1NPQ19EQVBNX0VOVU0oIlJvdXRlIiwgd204NzUzX2VudW1bMjVdKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHdtODc1M19kYXBtX3dpZGdldHNbXSA9IHsKK1NORF9TT0NfREFQTV9NSUNCSUFTKCJNaWMgQmlhcyIsIFdNODc1M19QV1IxLCA1LCAwKSwKK1NORF9TT0NfREFQTV9NSVhFUigiTGVmdCBNaXhlciIsIFdNODc1M19QV1I0LCAwLCAwLAorCSZ3bTg3NTNfbGVmdF9taXhlcl9jb250cm9sc1swXSwgQVJSQVlfU0laRSh3bTg3NTNfbGVmdF9taXhlcl9jb250cm9scykpLAorU05EX1NPQ19EQVBNX1BHQSgiTGVmdCBPdXQgMSIsIFdNODc1M19QV1IzLCA4LCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIkxlZnQgT3V0IDIiLCBXTTg3NTNfUFdSMywgNiwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fREFDKCJMZWZ0IERBQyIsICJMZWZ0IEhpRmkgUGxheWJhY2siLCBXTTg3NTNfUFdSMSwgMywgMCksCitTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUMSIpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiTE9VVDIiKSwKK1NORF9TT0NfREFQTV9NSVhFUigiUmlnaHQgTWl4ZXIiLCBXTTg3NTNfUFdSNCwgMSwgMCwKKwkmd204NzUzX3JpZ2h0X21peGVyX2NvbnRyb2xzWzBdLCBBUlJBWV9TSVpFKHdtODc1M19yaWdodF9taXhlcl9jb250cm9scykpLAorU05EX1NPQ19EQVBNX1BHQSgiUmlnaHQgT3V0IDEiLCBXTTg3NTNfUFdSMywgNywgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJSaWdodCBPdXQgMiIsIFdNODc1M19QV1IzLCA1LCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9EQUMoIlJpZ2h0IERBQyIsICJSaWdodCBIaUZpIFBsYXliYWNrIiwgV004NzUzX1BXUjEsIDIsIDApLAorU05EX1NPQ19EQVBNX09VVFBVVCgiUk9VVDEiKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIlJPVVQyIiksCitTTkRfU09DX0RBUE1fTUlYRVIoIk1vbm8gTWl4ZXIiLCBXTTg3NTNfUFdSNCwgMiwgMCwKKwkmd204NzUzX21vbm9fbWl4ZXJfY29udHJvbHNbMF0sIEFSUkFZX1NJWkUod204NzUzX21vbm9fbWl4ZXJfY29udHJvbHMpKSwKK1NORF9TT0NfREFQTV9QR0EoIk1vbm8gT3V0IDEiLCBXTTg3NTNfUFdSMywgMiwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fUEdBKCJNb25vIE91dCAyIiwgV004NzUzX1BXUjMsIDEsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX0RBQygiVm9pY2UgREFDIiwgIlZvaWNlIFBsYXliYWNrIiwgV004NzUzX1BXUjEsIDQsIDApLAorU05EX1NPQ19EQVBNX09VVFBVVCgiTU9OTzEiKSwKK1NORF9TT0NfREFQTV9NVVgoIk1vbm8gMiBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZ3bTg3NTNfbW9ubzJfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX09VVFBVVCgiTU9OTzIiKSwKK1NORF9TT0NfREFQTV9NSVhFUigiT3V0MyBMZWZ0ICsgUmlnaHQiLCAtMSwgMCwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fTVVYKCJPdXQzIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgJndtODc1M19vdXQzX2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9QR0EoIk91dCAzIiwgV004NzUzX1BXUjMsIDQsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX09VVFBVVCgiT1VUMyIpLAorU05EX1NPQ19EQVBNX01VWCgiT3V0NCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsICZ3bTg3NTNfb3V0NF9jb250cm9scyksCitTTkRfU09DX0RBUE1fUEdBKCJPdXQgNCIsIFdNODc1M19QV1IzLCAzLCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIk9VVDQiKSwKK1NORF9TT0NfREFQTV9NSVhFUigiUGxheWJhY2sgTWl4ZXIiLCBXTTg3NTNfUFdSNCwgMywgMCwKKwkmd204NzUzX3JlY29yZF9taXhlcl9jb250cm9sc1swXSwKKwlBUlJBWV9TSVpFKHdtODc1M19yZWNvcmRfbWl4ZXJfY29udHJvbHMpKSwKK1NORF9TT0NfREFQTV9BREMoIkxlZnQgQURDIiwgIkxlZnQgQ2FwdHVyZSIsIFdNODc1M19QV1IyLCAzLCAwKSwKK1NORF9TT0NfREFQTV9BREMoIlJpZ2h0IEFEQyIsICJSaWdodCBDYXB0dXJlIiwgV004NzUzX1BXUjIsIDIsIDApLAorU05EX1NPQ19EQVBNX01VWCgiQ2FwdHVyZSBMZWZ0IE1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTg3NTNfYWRjX21vbm9fY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01VWCgiQ2FwdHVyZSBSaWdodCBNaXhlciIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkmd204NzUzX2FkY19tb25vX2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9NVVgoIkNhcHR1cmUgTGVmdCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJJndtODc1M19hZGNfbGVmdF9jb250cm9scyksCitTTkRfU09DX0RBUE1fTVVYKCJDYXB0dXJlIFJpZ2h0IE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkmd204NzUzX2FkY19yaWdodF9jb250cm9scyksCitTTkRfU09DX0RBUE1fTVVYKCJNaWMgU2lkZXRvbmUgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTg3NTNfbWljX211eF9jb250cm9scyksCitTTkRfU09DX0RBUE1fUEdBKCJMZWZ0IENhcHR1cmUgVm9sdW1lIiwgV004NzUzX1BXUjIsIDUsIDAsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiUmlnaHQgQ2FwdHVyZSBWb2x1bWUiLCBXTTg3NTNfUFdSMiwgNCwgMCwgTlVMTCwgMCksCitTTkRfU09DX0RBUE1fTUlYRVIoIkFMQyBNaXhlciIsIFdNODc1M19QV1IyLCA2LCAwLAorCSZ3bTg3NTNfYWxjX21peGVyX2NvbnRyb2xzWzBdLCBBUlJBWV9TSVpFKHdtODc1M19hbGNfbWl4ZXJfY29udHJvbHMpKSwKK1NORF9TT0NfREFQTV9NVVgoIkxpbmUgTGVmdCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJJndtODc1M19saW5lX2xlZnRfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01VWCgiTGluZSBSaWdodCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJJndtODc1M19saW5lX3JpZ2h0X2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9NVVgoIkxpbmUgTW9ubyBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJJndtODc1M19saW5lX21vbm9fY29udHJvbHMpLAorU05EX1NPQ19EQVBNX01VWCgiTGluZSBNaXhlciIsIFdNODc1M19QV1IyLCAwLCAwLAorCSZ3bTg3NTNfbGluZV9tdXhfbWl4X2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9NVVgoIlJ4IE1peGVyIiwgV004NzUzX1BXUjIsIDEsIDAsCisJJndtODc1M19yeF9tdXhfbWl4X2NvbnRyb2xzKSwKK1NORF9TT0NfREFQTV9QR0EoIk1pYyAxIFZvbHVtZSIsIFdNODc1M19QV1IyLCA4LCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9QR0EoIk1pYyAyIFZvbHVtZSIsIFdNODc1M19QV1IyLCA3LCAwLCBOVUxMLCAwKSwKK1NORF9TT0NfREFQTV9NVVgoIk1pYyBTZWxlY3Rpb24gTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCSZ3bTg3NTNfbWljX3NlbF9tdXhfY29udHJvbHMpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJMSU5FMSIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJMSU5FMiIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJSWFAiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiUlhOIiksCitTTkRfU09DX0RBUE1fSU5QVVQoIkFDSU4iKSwKK1NORF9TT0NfREFQTV9PVVRQVVQoIkFDT1AiKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTUlDMU4iKSwKK1NORF9TT0NfREFQTV9JTlBVVCgiTUlDMSIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMyTiIpLAorU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMyIiksCitTTkRfU09DX0RBUE1fVk1JRCgiVlJFRiIpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmF1ZGlvX21hcFtdWzNdID0geworCS8qIGxlZnQgbWl4ZXIgKi8KKwl7IkxlZnQgTWl4ZXIiLCAiTGVmdCBQbGF5YmFjayBTd2l0Y2giLCAiTGVmdCBEQUMifSwKKwl7IkxlZnQgTWl4ZXIiLCAiVm9pY2UgUGxheWJhY2sgU3dpdGNoIiwgIlZvaWNlIERBQyJ9LAorCXsiTGVmdCBNaXhlciIsICJTaWRldG9uZSBQbGF5YmFjayBTd2l0Y2giLCAiTWljIFNpZGV0b25lIE11eCJ9LAorCXsiTGVmdCBNaXhlciIsICJCeXBhc3MgUGxheWJhY2sgU3dpdGNoIiwgIkxpbmUgTGVmdCBNdXgifSwKKworCS8qIHJpZ2h0IG1peGVyICovCisJeyJSaWdodCBNaXhlciIsICJSaWdodCBQbGF5YmFjayBTd2l0Y2giLCAiUmlnaHQgREFDIn0sCisJeyJSaWdodCBNaXhlciIsICJWb2ljZSBQbGF5YmFjayBTd2l0Y2giLCAiVm9pY2UgREFDIn0sCisJeyJSaWdodCBNaXhlciIsICJTaWRldG9uZSBQbGF5YmFjayBTd2l0Y2giLCAiTWljIFNpZGV0b25lIE11eCJ9LAorCXsiUmlnaHQgTWl4ZXIiLCAiQnlwYXNzIFBsYXliYWNrIFN3aXRjaCIsICJMaW5lIFJpZ2h0IE11eCJ9LAorCisJLyogbW9ubyBtaXhlciAqLworCXsiTW9ubyBNaXhlciIsICJWb2ljZSBQbGF5YmFjayBTd2l0Y2giLCAiVm9pY2UgREFDIn0sCisJeyJNb25vIE1peGVyIiwgIkxlZnQgUGxheWJhY2sgU3dpdGNoIiwgIkxlZnQgREFDIn0sCisJeyJNb25vIE1peGVyIiwgIlJpZ2h0IFBsYXliYWNrIFN3aXRjaCIsICJSaWdodCBEQUMifSwKKwl7Ik1vbm8gTWl4ZXIiLCAiU2lkZXRvbmUgUGxheWJhY2sgU3dpdGNoIiwgIk1pYyBTaWRldG9uZSBNdXgifSwKKwl7Ik1vbm8gTWl4ZXIiLCAiQnlwYXNzIFBsYXliYWNrIFN3aXRjaCIsICJMaW5lIE1vbm8gTXV4In0sCisKKwkvKiBsZWZ0IG91dCAqLworCXsiTGVmdCBPdXQgMSIsIE5VTEwsICJMZWZ0IE1peGVyIn0sCisJeyJMZWZ0IE91dCAyIiwgTlVMTCwgIkxlZnQgTWl4ZXIifSwKKwl7IkxPVVQxIiwgTlVMTCwgIkxlZnQgT3V0IDEifSwKKwl7IkxPVVQyIiwgTlVMTCwgIkxlZnQgT3V0IDIifSwKKworCS8qIHJpZ2h0IG91dCAqLworCXsiUmlnaHQgT3V0IDEiLCBOVUxMLCAiUmlnaHQgTWl4ZXIifSwKKwl7IlJpZ2h0IE91dCAyIiwgTlVMTCwgIlJpZ2h0IE1peGVyIn0sCisJeyJST1VUMSIsIE5VTEwsICJSaWdodCBPdXQgMSJ9LAorCXsiUk9VVDIiLCBOVUxMLCAiUmlnaHQgT3V0IDIifSwKKworCS8qIG1vbm8gMSBvdXQgKi8KKwl7Ik1vbm8gT3V0IDEiLCBOVUxMLCAiTW9ubyBNaXhlciJ9LAorCXsiTU9OTzEiLCBOVUxMLCAiTW9ubyBPdXQgMSJ9LAorCisJLyogbW9ubyAyIG91dCAqLworCXsiTW9ubyAyIE11eCIsICJMZWZ0ICsgUmlnaHQiLCAiT3V0MyBMZWZ0ICsgUmlnaHQifSwKKwl7Ik1vbm8gMiBNdXgiLCAiSW52ZXJ0ZWQgTW9ubyAxIiwgIk1PTk8xIn0sCisJeyJNb25vIDIgTXV4IiwgIkxlZnQiLCAiTGVmdCBNaXhlciJ9LAorCXsiTW9ubyAyIE11eCIsICJSaWdodCIsICJSaWdodCBNaXhlciJ9LAorCXsiTW9ubyBPdXQgMiIsIE5VTEwsICJNb25vIDIgTXV4In0sCisJeyJNT05PMiIsIE5VTEwsICJNb25vIE91dCAyIn0sCisKKwkvKiBvdXQgMyAqLworCXsiT3V0MyBMZWZ0ICsgUmlnaHQiLCBOVUxMLCAiTGVmdCBNaXhlciJ9LAorCXsiT3V0MyBMZWZ0ICsgUmlnaHQiLCBOVUxMLCAiUmlnaHQgTWl4ZXIifSwKKwl7Ik91dDMgTXV4IiwgIlZSRUYiLCAiVlJFRiJ9LAorCXsiT3V0MyBNdXgiLCAiTGVmdCArIFJpZ2h0IiwgIk91dDMgTGVmdCArIFJpZ2h0In0sCisJeyJPdXQzIE11eCIsICJST1VUMiIsICJST1VUMiJ9LAorCXsiT3V0IDMiLCBOVUxMLCAiT3V0MyBNdXgifSwKKwl7Ik9VVDMiLCBOVUxMLCAiT3V0IDMifSwKKworCS8qIG91dCA0ICovCisJeyJPdXQ0IE11eCIsICJWUkVGIiwgIlZSRUYifSwKKwl7Ik91dDQgTXV4IiwgIkNhcHR1cmUgU1QiLCAiQ2FwdHVyZSBTVCBNaXhlciJ9LAorCXsiT3V0NCBNdXgiLCAiTE9VVDIiLCAiTE9VVDIifSwKKwl7Ik91dCA0IiwgTlVMTCwgIk91dDQgTXV4In0sCisJeyJPVVQ0IiwgTlVMTCwgIk91dCA0In0sCisKKwkvKiByZWNvcmQgbWl4ZXIgICovCisJeyJQbGF5YmFjayBNaXhlciIsICJMZWZ0IENhcHR1cmUgU3dpdGNoIiwgIkxlZnQgTWl4ZXIifSwKKwl7IlBsYXliYWNrIE1peGVyIiwgIlZvaWNlIENhcHR1cmUgU3dpdGNoIiwgIk1vbm8gTWl4ZXIifSwKKwl7IlBsYXliYWNrIE1peGVyIiwgIlJpZ2h0IENhcHR1cmUgU3dpdGNoIiwgIlJpZ2h0IE1peGVyIn0sCisKKwkvKiBNaWMvU2lkZVRvbmUgTXV4ICovCisJeyJNaWMgU2lkZXRvbmUgTXV4IiwgIkxlZnQgUEdBIiwgIkxlZnQgQ2FwdHVyZSBWb2x1bWUifSwKKwl7Ik1pYyBTaWRldG9uZSBNdXgiLCAiUmlnaHQgUEdBIiwgIlJpZ2h0IENhcHR1cmUgVm9sdW1lIn0sCisJeyJNaWMgU2lkZXRvbmUgTXV4IiwgIk1pYyAxIiwgIk1pYyAxIFZvbHVtZSJ9LAorCXsiTWljIFNpZGV0b25lIE11eCIsICJNaWMgMiIsICJNaWMgMiBWb2x1bWUifSwKKworCS8qIENhcHR1cmUgTGVmdCBNdXggKi8KKwl7IkNhcHR1cmUgTGVmdCBNdXgiLCAiUEdBIiwgIkxlZnQgQ2FwdHVyZSBWb2x1bWUifSwKKwl7IkNhcHR1cmUgTGVmdCBNdXgiLCAiTGluZSBvciBSWFAtUlhOIiwgIkxpbmUgTGVmdCBNdXgifSwKKwl7IkNhcHR1cmUgTGVmdCBNdXgiLCAiTGluZSIsICJMSU5FMSJ9LAorCisJLyogQ2FwdHVyZSBSaWdodCBNdXggKi8KKwl7IkNhcHR1cmUgUmlnaHQgTXV4IiwgIlBHQSIsICJSaWdodCBDYXB0dXJlIFZvbHVtZSJ9LAorCXsiQ2FwdHVyZSBSaWdodCBNdXgiLCAiTGluZSBvciBSWFAtUlhOIiwgIkxpbmUgUmlnaHQgTXV4In0sCisJeyJDYXB0dXJlIFJpZ2h0IE11eCIsICJTaWRldG9uZSIsICJDYXB0dXJlIFNUIE1peGVyIn0sCisKKwkvKiBNb25vIENhcHR1cmUgbWl4ZXItbXV4ICovCisJeyJDYXB0dXJlIFJpZ2h0IE1peGVyIiwgIlN0ZXJlbyIsICJDYXB0dXJlIFJpZ2h0IE11eCJ9LAorCXsiQ2FwdHVyZSBMZWZ0IE1peGVyIiwgIkFuYWxvZ3VlIE1peCBMZWZ0IiwgIkNhcHR1cmUgTGVmdCBNdXgifSwKKwl7IkNhcHR1cmUgTGVmdCBNaXhlciIsICJBbmFsb2d1ZSBNaXggTGVmdCIsICJDYXB0dXJlIFJpZ2h0IE11eCJ9LAorCXsiQ2FwdHVyZSBSaWdodCBNaXhlciIsICJBbmFsb2d1ZSBNaXggUmlnaHQiLCAiQ2FwdHVyZSBMZWZ0IE11eCJ9LAorCXsiQ2FwdHVyZSBSaWdodCBNaXhlciIsICJBbmFsb2d1ZSBNaXggUmlnaHQiLCAiQ2FwdHVyZSBSaWdodCBNdXgifSwKKwl7IkNhcHR1cmUgTGVmdCBNaXhlciIsICJEaWdpdGFsIE1vbm8gTWl4IiwgIkNhcHR1cmUgTGVmdCBNdXgifSwKKwl7IkNhcHR1cmUgTGVmdCBNaXhlciIsICJEaWdpdGFsIE1vbm8gTWl4IiwgIkNhcHR1cmUgUmlnaHQgTXV4In0sCisJeyJDYXB0dXJlIFJpZ2h0IE1peGVyIiwgIkRpZ2l0YWwgTW9ubyBNaXgiLCAiQ2FwdHVyZSBMZWZ0IE11eCJ9LAorCXsiQ2FwdHVyZSBSaWdodCBNaXhlciIsICJEaWdpdGFsIE1vbm8gTWl4IiwgIkNhcHR1cmUgUmlnaHQgTXV4In0sCisKKwkvKiBBREMgKi8KKwl7IkxlZnQgQURDIiwgTlVMTCwgIkNhcHR1cmUgTGVmdCBNaXhlciJ9LAorCXsiUmlnaHQgQURDIiwgTlVMTCwgIkNhcHR1cmUgUmlnaHQgTWl4ZXIifSwKKworCS8qIExlZnQgQ2FwdHVyZSBWb2x1bWUgKi8KKwl7IkxlZnQgQ2FwdHVyZSBWb2x1bWUiLCBOVUxMLCAiQUNJTiJ9LAorCisJLyogUmlnaHQgQ2FwdHVyZSBWb2x1bWUgKi8KKwl7IlJpZ2h0IENhcHR1cmUgVm9sdW1lIiwgTlVMTCwgIk1pYyAyIFZvbHVtZSJ9LAorCisJLyogQUxDIE1peGVyICovCisJeyJBTEMgTWl4ZXIiLCAiTGluZSBDYXB0dXJlIFN3aXRjaCIsICJMaW5lIE1peGVyIn0sCisJeyJBTEMgTWl4ZXIiLCAiTWljMiBDYXB0dXJlIFN3aXRjaCIsICJNaWMgMiBWb2x1bWUifSwKKwl7IkFMQyBNaXhlciIsICJNaWMxIENhcHR1cmUgU3dpdGNoIiwgIk1pYyAxIFZvbHVtZSJ9LAorCXsiQUxDIE1peGVyIiwgIlJ4IENhcHR1cmUgU3dpdGNoIiwgIlJ4IE1peGVyIn0sCisKKwkvKiBMaW5lIExlZnQgTXV4ICovCisJeyJMaW5lIExlZnQgTXV4IiwgIkxpbmUgMSIsICJMSU5FMSJ9LAorCXsiTGluZSBMZWZ0IE11eCIsICJSeCBNaXgiLCAiUnggTWl4ZXIifSwKKworCS8qIExpbmUgUmlnaHQgTXV4ICovCisJeyJMaW5lIFJpZ2h0IE11eCIsICJMaW5lIDIiLCAiTElORTIifSwKKwl7IkxpbmUgUmlnaHQgTXV4IiwgIlJ4IE1peCIsICJSeCBNaXhlciJ9LAorCisJLyogTGluZSBNb25vIE11eCAqLworCXsiTGluZSBNb25vIE11eCIsICJMaW5lIE1peCIsICJMaW5lIE1peGVyIn0sCisJeyJMaW5lIE1vbm8gTXV4IiwgIlJ4IE1peCIsICJSeCBNaXhlciJ9LAorCisJLyogTGluZSBNaXhlci9NdXggKi8KKwl7IkxpbmUgTWl4ZXIiLCAiTGluZSAxICsgMiIsICJMSU5FMSJ9LAorCXsiTGluZSBNaXhlciIsICJMaW5lIDEgLSAyIiwgIkxJTkUxIn0sCisJeyJMaW5lIE1peGVyIiwgIkxpbmUgMSArIDIiLCAiTElORTIifSwKKwl7IkxpbmUgTWl4ZXIiLCAiTGluZSAxIC0gMiIsICJMSU5FMiJ9LAorCXsiTGluZSBNaXhlciIsICJMaW5lIDEiLCAiTElORTEifSwKKwl7IkxpbmUgTWl4ZXIiLCAiTGluZSAyIiwgIkxJTkUyIn0sCisKKwkvKiBSeCBNaXhlci9NdXggKi8KKwl7IlJ4IE1peGVyIiwgIlJYUCAtIFJYTiIsICJSWFAifSwKKwl7IlJ4IE1peGVyIiwgIlJYUCArIFJYTiIsICJSWFAifSwKKwl7IlJ4IE1peGVyIiwgIlJYUCAtIFJYTiIsICJSWE4ifSwKKwl7IlJ4IE1peGVyIiwgIlJYUCArIFJYTiIsICJSWE4ifSwKKwl7IlJ4IE1peGVyIiwgIlJYUCIsICJSWFAifSwKKwl7IlJ4IE1peGVyIiwgIlJYTiIsICJSWE4ifSwKKworCS8qIE1pYyAxIFZvbHVtZSAqLworCXsiTWljIDEgVm9sdW1lIiwgTlVMTCwgIk1JQzFOIn0sCisJeyJNaWMgMSBWb2x1bWUiLCBOVUxMLCAiTWljIFNlbGVjdGlvbiBNdXgifSwKKworCS8qIE1pYyAyIFZvbHVtZSAqLworCXsiTWljIDIgVm9sdW1lIiwgTlVMTCwgIk1JQzJOIn0sCisJeyJNaWMgMiBWb2x1bWUiLCBOVUxMLCAiTUlDMiJ9LAorCisJLyogTWljIFNlbGVjdG9yIE11eCAqLworCXsiTWljIFNlbGVjdGlvbiBNdXgiLCAiTWljIDEiLCAiTUlDMSJ9LAorCXsiTWljIFNlbGVjdGlvbiBNdXgiLCAiTWljIDIiLCAiTUlDMk4ifSwKKwl7Ik1pYyBTZWxlY3Rpb24gTXV4IiwgIk1pYyAzIiwgIk1JQzIifSwKKworCS8qIEFDT1AgKi8KKwl7IkFDT1AiLCBOVUxMLCAiQUxDIE1peGVyIn0sCisKKwkvKiB0ZXJtaW5hdG9yICovCisJe05VTEwsIE5VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIGludCB3bTg3NTNfYWRkX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204NzUzX2RhcG1fd2lkZ2V0cyk7IGkrKykKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9sKGNvZGVjLCAmd204NzUzX2RhcG1fd2lkZ2V0c1tpXSk7CisKKwkvKiBzZXQgdXAgdGhlIFdNODc1MyBhdWRpbyBtYXAgKi8KKwlmb3IgKGkgPSAwOyBhdWRpb19tYXBbaV1bMF0gIT0gTlVMTDsgaSsrKSB7CisJCXNuZF9zb2NfZGFwbV9jb25uZWN0X2lucHV0KGNvZGVjLCBhdWRpb19tYXBbaV1bMF0sCisJCQlhdWRpb19tYXBbaV1bMV0sIGF1ZGlvX21hcFtpXVsyXSk7CisJfQorCisJc25kX3NvY19kYXBtX25ld193aWRnZXRzKGNvZGVjKTsKKwlyZXR1cm4gMDsKK30KKworLyogUExMIGRpdmlzb3JzICovCitzdHJ1Y3QgX3BsbF9kaXYgeworCXUzMiBkaXYyOjE7CisJdTMyIG46NDsKKwl1MzIgazoyNDsKK307CisKKy8qIFRoZSBzaXplIGluIGJpdHMgb2YgdGhlIHBsbCBkaXZpZGUgbXVsdGlwbGllZCBieSAxMAorICogdG8gYWxsb3cgcm91bmRpbmcgbGF0ZXIgKi8KKyNkZWZpbmUgRklYRURfUExMX1NJWkUgKCgxIDw8IDIyKSAqIDEwKQorCitzdGF0aWMgdm9pZCBwbGxfZmFjdG9ycyhzdHJ1Y3QgX3BsbF9kaXYgKnBsbF9kaXYsIHVuc2lnbmVkIGludCB0YXJnZXQsCisJdW5zaWduZWQgaW50IHNvdXJjZSkKK3sKKwl1NjQgS3BhcnQ7CisJdW5zaWduZWQgaW50IEssIE5kaXYsIE5tb2Q7CisKKwlOZGl2ID0gdGFyZ2V0IC8gc291cmNlOworCWlmIChOZGl2IDwgNikgeworCQlzb3VyY2UgPj49IDE7CisJCXBsbF9kaXYtPmRpdjIgPSAxOworCQlOZGl2ID0gdGFyZ2V0IC8gc291cmNlOworCX0gZWxzZQorCQlwbGxfZGl2LT5kaXYyID0gMDsKKworCWlmICgoTmRpdiA8IDYpIHx8IChOZGl2ID4gMTIpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiV004NzUzIE4gdmFsdWUgb3V0d2l0aCByZWNvbW1lbmRlZCByYW5nZSEgTiA9ICVkXG4iLE5kaXYpOworCisJcGxsX2Rpdi0+biA9IE5kaXY7CisJTm1vZCA9IHRhcmdldCAlIHNvdXJjZTsKKwlLcGFydCA9IEZJWEVEX1BMTF9TSVpFICogKGxvbmcgbG9uZylObW9kOworCisJZG9fZGl2KEtwYXJ0LCBzb3VyY2UpOworCisJSyA9IEtwYXJ0ICYgMHhGRkZGRkZGRjsKKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gcm91bmQgKi8KKwlpZiAoKEsgJSAxMCkgPj0gNSkKKwkJSyArPSA1OworCisJLyogTW92ZSBkb3duIHRvIHByb3BlciByYW5nZSBub3cgcm91bmRpbmcgaXMgZG9uZSAqLworCUsgLz0gMTA7CisKKwlwbGxfZGl2LT5rID0gSzsKK30KKworc3RhdGljIGludCB3bTg3NTNfc2V0X2RhaV9wbGwoc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWksCisJCWludCBwbGxfaWQsIHVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJdTE2IHJlZywgZW5hYmxlOworCWludCBvZmZzZXQ7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKworCWlmIChwbGxfaWQgPCBXTTg3NTNfUExMMSB8fCBwbGxfaWQgPiBXTTg3NTNfUExMMikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocGxsX2lkID09IFdNODc1M19QTEwxKSB7CisJCW9mZnNldCA9IDA7CisJCWVuYWJsZSA9IDB4MTA7CisJCXJlZyA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0NMT0NLKSAmIDB4ZmZlZjsKKwl9IGVsc2UgeworCQlvZmZzZXQgPSA0OworCQllbmFibGUgPSAweDg7CisJCXJlZyA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0NMT0NLKSAmIDB4ZmZmNzsKKwl9CisKKwlpZiAoIWZyZXFfaW4gfHwgIWZyZXFfb3V0KSB7CisJCS8qIGRpc2FibGUgUExMICAqLworCQl3bTg3NTNfd3JpdGUoY29kZWMsIFdNODc1M19QTEwxQ1RMMSArIG9mZnNldCwgMHgwMDI2KTsKKwkJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfQ0xPQ0ssIHJlZyk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXUxNiB2YWx1ZSA9IDA7CisJCXN0cnVjdCBfcGxsX2RpdiBwbGxfZGl2OworCisJCXBsbF9mYWN0b3JzKCZwbGxfZGl2LCBmcmVxX291dCAqIDgsIGZyZXFfaW4pOworCisJCS8qIHNldCB1cCBOIGFuZCBLIFBMTCBkaXZpc29yIHJhdGlvcyAqLworCQkvKiBiaXRzIDg6NSA9IFBMTF9OLCBiaXRzIDM6MCA9IFBMTF9LWzIxOjE4XSAqLworCQl2YWx1ZSA9IChwbGxfZGl2Lm4gPDwgNSkgKyAoKHBsbF9kaXYuayAmIDB4M2MwMDAwKSA+PiAxOCk7CisJCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX1BMTDFDVEwyICsgb2Zmc2V0LCB2YWx1ZSk7CisKKwkJLyogYml0cyA4OjAgPSBQTExfS1sxNzo5XSAqLworCQl2YWx1ZSA9IChwbGxfZGl2LmsgJiAweDAzZmUwMCkgPj4gOTsKKwkJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfUExMMUNUTDMgKyBvZmZzZXQsIHZhbHVlKTsKKworCQkvKiBiaXRzIDg6MCA9IFBMTF9LWzg6MF0gKi8KKwkJdmFsdWUgPSBwbGxfZGl2LmsgJiAweDAwMDFmZjsKKwkJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfUExMMUNUTDQgKyBvZmZzZXQsIHZhbHVlKTsKKworCQkvKiBzZXQgUExMIGFzIGlucHV0IGFuZCBlbmFibGUgKi8KKwkJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfUExMMUNUTDEgKyBvZmZzZXQsIDB4MDAyNyB8CisJCQkocGxsX2Rpdi5kaXYyIDw8IDMpKTsKKwkJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfQ0xPQ0ssIHJlZyB8IGVuYWJsZSk7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgX2NvZWZmX2RpdiB7CisJdTMyIG1jbGs7CisJdTMyIHJhdGU7CisJdTggc3I6NTsKKwl1OCB1c2I6MTsKK307CisKKy8qIGNvZGVjIGhpZmkgbWNsayAoYWZ0ZXIgUExMKSBjbG9jayBkaXZpZGVyIGNvZWZmaWNpZW50cyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBfY29lZmZfZGl2IGNvZWZmX2RpdltdID0geworCS8qIDhrICovCisJezEyMjg4MDAwLCA4MDAwLCAweDYsIDB4MH0sCisJezExMjg5NjAwLCA4MDAwLCAweDE2LCAweDB9LAorCXsxODQzMjAwMCwgODAwMCwgMHg3LCAweDB9LAorCXsxNjkzNDQwMCwgODAwMCwgMHgxNywgMHgwfSwKKwl7MTIwMDAwMDAsIDgwMDAsIDB4NiwgMHgxfSwKKworCS8qIDExLjAyNWsgKi8KKwl7MTEyODk2MDAsIDExMDI1LCAweDE4LCAweDB9LAorCXsxNjkzNDQwMCwgMTEwMjUsIDB4MTksIDB4MH0sCisJezEyMDAwMDAwLCAxMTAyNSwgMHgxOSwgMHgxfSwKKworCS8qIDE2ayAqLworCXsxMjI4ODAwMCwgMTYwMDAsIDB4YSwgMHgwfSwKKwl7MTg0MzIwMDAsIDE2MDAwLCAweGIsIDB4MH0sCisJezEyMDAwMDAwLCAxNjAwMCwgMHhhLCAweDF9LAorCisJLyogMjIuMDVrICovCisJezExMjg5NjAwLCAyMjA1MCwgMHgxYSwgMHgwfSwKKwl7MTY5MzQ0MDAsIDIyMDUwLCAweDFiLCAweDB9LAorCXsxMjAwMDAwMCwgMjIwNTAsIDB4MWIsIDB4MX0sCisKKwkvKiAzMmsgKi8KKwl7MTIyODgwMDAsIDMyMDAwLCAweGMsIDB4MH0sCisJezE4NDMyMDAwLCAzMjAwMCwgMHhkLCAweDB9LAorCXsxMjAwMDAwMCwgMzIwMDAsIDB4YSwgMHgxfSwKKworCS8qIDQ0LjFrICovCisJezExMjg5NjAwLCA0NDEwMCwgMHgxMCwgMHgwfSwKKwl7MTY5MzQ0MDAsIDQ0MTAwLCAweDExLCAweDB9LAorCXsxMjAwMDAwMCwgNDQxMDAsIDB4MTEsIDB4MX0sCisKKwkvKiA0OGsgKi8KKwl7MTIyODgwMDAsIDQ4MDAwLCAweDAsIDB4MH0sCisJezE4NDMyMDAwLCA0ODAwMCwgMHgxLCAweDB9LAorCXsxMjAwMDAwMCwgNDgwMDAsIDB4MCwgMHgxfSwKKworCS8qIDg4LjJrICovCisJezExMjg5NjAwLCA4ODIwMCwgMHgxZSwgMHgwfSwKKwl7MTY5MzQ0MDAsIDg4MjAwLCAweDFmLCAweDB9LAorCXsxMjAwMDAwMCwgODgyMDAsIDB4MWYsIDB4MX0sCisKKwkvKiA5NmsgKi8KKwl7MTIyODgwMDAsIDk2MDAwLCAweGUsIDB4MH0sCisJezE4NDMyMDAwLCA5NjAwMCwgMHhmLCAweDB9LAorCXsxMjAwMDAwMCwgOTYwMDAsIDB4ZSwgMHgxfSwKK307CisKK3N0YXRpYyBpbnQgZ2V0X2NvZWZmKGludCBtY2xrLCBpbnQgcmF0ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZWZmX2Rpdik7IGkrKykgeworCQlpZiAoY29lZmZfZGl2W2ldLnJhdGUgPT0gcmF0ZSAmJiBjb2VmZl9kaXZbaV0ubWNsayA9PSBtY2xrKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogQ2xvY2sgYWZ0ZXIgUExMIGFuZCBkaXZpZGVycworICovCitzdGF0aWMgaW50IHdtODc1M19zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJaW50IGNsa19pZCwgdW5zaWduZWQgaW50IGZyZXEsIGludCBkaXIpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgd204NzUzX3ByaXYgKndtODc1MyA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisKKwlzd2l0Y2ggKGZyZXEpIHsKKwljYXNlIDExMjg5NjAwOgorCWNhc2UgMTIwMDAwMDA6CisJY2FzZSAxMjI4ODAwMDoKKwljYXNlIDE2OTM0NDAwOgorCWNhc2UgMTg0MzIwMDA6CisJCWlmIChjbGtfaWQgPT0gV004NzUzX01DTEspIHsKKwkJCXdtODc1My0+c3lzY2xrID0gZnJlcTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGNsa19pZCA9PSBXTTg3NTNfUENNQ0xLKSB7CisJCQl3bTg3NTMtPnBjbWNsayA9IGZyZXE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBTZXQncyBBREMgYW5kIFZvaWNlIERBQyBmb3JtYXQuCisgKi8KK3N0YXRpYyBpbnQgd204NzUzX3ZkYWNfYWRjX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTE2IHZvaWNlID0gd204NzUzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTNfUENNKSAmIDB4MDFlYzsKKworCS8qIGludGVyZmFjZSBmb3JtYXQgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCXZvaWNlIHw9IDB4MDAwMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJdm9pY2UgfD0gMHgwMDAxOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCQl2b2ljZSB8PSAweDAwMDM7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCXZvaWNlIHw9IDB4MDAxMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfUENNLCB2b2ljZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgUENNIERBSSBiaXQgc2l6ZSBhbmQgc2FtcGxlIHJhdGUuCisgKi8KK3N0YXRpYyBpbnQgd204NzUzX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RldmljZSAqc29jZGV2ID0gcnRkLT5zb2NkZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc29jZGV2LT5jb2RlYzsKKwlzdHJ1Y3Qgd204NzUzX3ByaXYgKndtODc1MyA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJdTE2IHZvaWNlID0gd204NzUzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTNfUENNKSAmIDB4MDFmMzsKKwl1MTYgc3JhdGUgPSB3bTg3NTNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1M19TUkFURTEpICYgMHgwMTdmOworCisJLyogYml0IHNpemUgKi8KKwlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjBfM0xFOgorCQl2b2ljZSB8PSAweDAwMDQ7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEU6CisJCXZvaWNlIHw9IDB4MDAwODsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJdm9pY2UgfD0gMHgwMDBjOworCQlicmVhazsKKwl9CisKKwkvKiBzYW1wbGUgcmF0ZSAqLworCWlmIChwYXJhbXNfcmF0ZShwYXJhbXMpICogMzg0ID09IHdtODc1My0+cGNtY2xrKQorCQlzcmF0ZSB8PSAweDgwOworCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX1NSQVRFMSwgc3JhdGUpOworCisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfUENNLCB2b2ljZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQncyBQQ00gZGFpIGZtdCBhbmQgQkNMSy4KKyAqLworc3RhdGljIGludCB3bTg3NTNfcGNtX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTE2IHZvaWNlLCBpb2N0bDsKKworCXZvaWNlID0gd204NzUzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTNfUENNKSAmIDB4MDExZjsKKwlpb2N0bCA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0lPQ1RMKSAmIDB4MDE1ZDsKKworCS8qIHNldCBtYXN0ZXIvc2xhdmUgYXVkaW8gaW50ZXJmYWNlICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9NQVNURVJfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQlpb2N0bCB8PSAweDI7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZTOgorCQl2b2ljZSB8PSAweDAwNDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNsb2NrIGludmVyc2lvbiAqLworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfRk9STUFUX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9BOgorCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0I6CisJCS8qIGZyYW1lIGludmVyc2lvbiBub3QgdmFsaWQgZm9yIERTUCBtb2RlcyAqLworCQlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJCXZvaWNlIHw9IDB4MDA4MDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQl2b2ljZSAmPSB+MHgwMDEwOworCQlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0lOVl9NQVNLKSB7CisJCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9JRjoKKwkJCXZvaWNlIHw9IDB4MDA5MDsKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQkJdm9pY2UgfD0gMHgwMDgwOworCQkJYnJlYWs7CisJCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfSUY6CisJCQl2b2ljZSB8PSAweDAwMTA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX1BDTSwgdm9pY2UpOworCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX0lPQ1RMLCBpb2N0bCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204NzUzX3NldF9kYWlfY2xrZGl2KHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpLAorCQlpbnQgZGl2X2lkLCBpbnQgZGl2KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTE2IHJlZzsKKworCXN3aXRjaCAoZGl2X2lkKSB7CisJY2FzZSBXTTg3NTNfUENNRElWOgorCQlyZWcgPSB3bTg3NTNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1M19DTE9DSykgJiAweDAwM2Y7CisJCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX0NMT0NLLCByZWcgfCBkaXYpOworCQlicmVhazsKKwljYXNlIFdNODc1M19CQ0xLRElWOgorCQlyZWcgPSB3bTg3NTNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1M19TUkFURTIpICYgMHgwMWM3OworCQl3bTg3NTNfd3JpdGUoY29kZWMsIFdNODc1M19TUkFURTIsIHJlZyB8IGRpdik7CisJCWJyZWFrOworCWNhc2UgV004NzUzX1ZYQ0xLRElWOgorCQlyZWcgPSB3bTg3NTNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1M19TUkFURTIpICYgMHgwMDNmOworCQl3bTg3NTNfd3JpdGUoY29kZWMsIFdNODc1M19TUkFURTIsIHJlZyB8IGRpdik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCdzIEhpRmkgREFDIGZvcm1hdC4KKyAqLworc3RhdGljIGludCB3bTg3NTNfaGRhY19zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXUxNiBoaWZpID0gd204NzUzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTNfSElGSSkgJiAweDAxZTA7CisKKwkvKiBpbnRlcmZhY2UgZm9ybWF0ICovCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9GT1JNQVRfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCQloaWZpIHw9IDB4MDAwMjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJaGlmaSB8PSAweDAwMDE7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJCWhpZmkgfD0gMHgwMDAzOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQloaWZpIHw9IDB4MDAxMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfSElGSSwgaGlmaSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQncyBJMlMgREFJIGZvcm1hdC4KKyAqLworc3RhdGljIGludCB3bTg3NTNfaTJzX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqY29kZWNfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJdTE2IGlvY3RsLCBoaWZpOworCisJaGlmaSA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0hJRkkpICYgMHgwMTFmOworCWlvY3RsID0gd204NzUzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTNfSU9DVEwpICYgMHgwMGFlOworCisJLyogc2V0IG1hc3Rlci9zbGF2ZSBhdWRpbyBpbnRlcmZhY2UgKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWlvY3RsIHw9IDB4MTsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRlM6CisJCWhpZmkgfD0gMHgwMDQwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjbG9jayBpbnZlcnNpb24gKi8KKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQkvKiBmcmFtZSBpbnZlcnNpb24gbm90IHZhbGlkIGZvciBEU1AgbW9kZXMgKi8KKwkJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCQljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQkJYnJlYWs7CisJCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCQloaWZpIHw9IDB4MDA4MDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQloaWZpICY9IH4weDAwMTA7CisJCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9ORjoKKwkJCWJyZWFrOworCQljYXNlIFNORF9TT0NfREFJRk1UX0lCX0lGOgorCQkJaGlmaSB8PSAweDAwOTA7CisJCQlicmVhazsKKwkJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJCWhpZmkgfD0gMHgwMDgwOworCQkJYnJlYWs7CisJCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfSUY6CisJCQloaWZpIHw9IDB4MDAxMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfSElGSSwgaGlmaSk7CisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfSU9DVEwsIGlvY3RsKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCBQQ00gREFJIGJpdCBzaXplIGFuZCBzYW1wbGUgcmF0ZS4KKyAqLworc3RhdGljIGludCB3bTg3NTNfaTJzX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBydGQtPnNvY2RldjsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCB3bTg3NTNfcHJpdiAqd204NzUzID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1MTYgc3JhdGUgPSB3bTg3NTNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1M19TUkFURTEpICYgMHgwMWMwOworCXUxNiBoaWZpID0gd204NzUzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTNfSElGSSkgJiAweDAxZjM7CisJaW50IGNvZWZmOworCisJLyogaXMgZGlnaXRhbCBmaWx0ZXIgY29lZmZpY2llbnQgdmFsaWQgPyAqLworCWNvZWZmID0gZ2V0X2NvZWZmKHdtODc1My0+c3lzY2xrLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwlpZiAoY29lZmYgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAid204NzUzIGludmFsaWQgTUNMSyBvciByYXRlXG4iKTsKKwkJcmV0dXJuIGNvZWZmOworCX0KKwl3bTg3NTNfd3JpdGUoY29kZWMsIFdNODc1M19TUkFURTEsIHNyYXRlIHwgKGNvZWZmX2Rpdltjb2VmZl0uc3IgPDwgMSkgfAorCQljb2VmZl9kaXZbY29lZmZdLnVzYik7CisKKwkvKiBiaXQgc2l6ZSAqLworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyMF8zTEU6CisJCWhpZmkgfD0gMHgwMDA0OworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgorCQloaWZpIHw9IDB4MDAwODsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJaGlmaSB8PSAweDAwMGM7CisJCWJyZWFrOworCX0KKworCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX0hJRkksIGhpZmkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODc1M19tb2RlMXZfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpjb2RlY19kYWksCisJCXVuc2lnbmVkIGludCBmbXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKKwl1MTYgY2xvY2s7CisKKwkvKiBzZXQgY2xrIHNvdXJjZSBhcyBwY21jbGsgKi8KKwljbG9jayA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0NMT0NLKSAmIDB4ZmZmYjsKKwl3bTg3NTNfd3JpdGUoY29kZWMsIFdNODc1M19DTE9DSywgY2xvY2spOworCisJaWYgKHdtODc1M192ZGFjX2FkY19zZXRfZGFpX2ZtdChjb2RlY19kYWksIGZtdCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gd204NzUzX3BjbV9zZXRfZGFpX2ZtdChjb2RlY19kYWksIGZtdCk7Cit9CisKK3N0YXRpYyBpbnQgd204NzUzX21vZGUxaF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJdW5zaWduZWQgaW50IGZtdCkKK3sKKwlpZiAod204NzUzX2hkYWNfc2V0X2RhaV9mbXQoY29kZWNfZGFpLCBmbXQpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHdtODc1M19pMnNfc2V0X2RhaV9mbXQoY29kZWNfZGFpLCBmbXQpOworfQorCitzdGF0aWMgaW50IHdtODc1M19tb2RlMl9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXUxNiBjbG9jazsKKworCS8qIHNldCBjbGsgc291cmNlIGFzIHBjbWNsayAqLworCWNsb2NrID0gd204NzUzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTNfQ0xPQ0spICYgMHhmZmZiOworCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX0NMT0NLLCBjbG9jayk7CisKKwlpZiAod204NzUzX3ZkYWNfYWRjX3NldF9kYWlfZm10KGNvZGVjX2RhaSwgZm10KSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiB3bTg3NTNfaTJzX3NldF9kYWlfZm10KGNvZGVjX2RhaSwgZm10KTsKK30KKworc3RhdGljIGludCB3bTg3NTNfbW9kZTNfNF9zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgKmNvZGVjX2RhaSwKKwkJdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXUxNiBjbG9jazsKKworCS8qIHNldCBjbGsgc291cmNlIGFzIG1jbGsgKi8KKwljbG9jayA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0NMT0NLKSAmIDB4ZmZmYjsKKwl3bTg3NTNfd3JpdGUoY29kZWMsIFdNODc1M19DTE9DSywgY2xvY2sgfCAweDQpOworCisJaWYgKHdtODc1M19oZGFjX3NldF9kYWlfZm10KGNvZGVjX2RhaSwgZm10KSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICh3bTg3NTNfdmRhY19hZGNfc2V0X2RhaV9mbXQoY29kZWNfZGFpLCBmbXQpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHdtODc1M19pMnNfc2V0X2RhaV9mbXQoY29kZWNfZGFpLCBmbXQpOworfQorCitzdGF0aWMgaW50IHdtODc1M19tdXRlKHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSAqZGFpLCBpbnQgbXV0ZSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXUxNiBtdXRlX3JlZyA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0RBQykgJiAweGZmZjc7CisKKwkvKiB0aGUgZGlnaXRhbCBtdXRlIGNvdmVycyB0aGUgSGlGaSBhbmQgVm9pY2UgREFDJ3Mgb24gdGhlIFdNODc1My4KKwkgKiBtYWtlIHN1cmUgd2UgY2hlY2sgaWYgdGhleSBhcmUgbm90IGJvdGggYWN0aXZlIHdoZW4gd2UgbXV0ZSAqLworCWlmIChtdXRlICYmIGRhaS0+aWQgPT0gMSkgeworCQlpZiAoIXdtODc1M19kYWlbV004NzUzX0RBSV9WT0lDRV0ucGxheWJhY2suYWN0aXZlIHx8CisJCQkhd204NzUzX2RhaVtXTTg3NTNfREFJX0hJRkldLnBsYXliYWNrLmFjdGl2ZSkKKwkJCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX0RBQywgbXV0ZV9yZWcgfCAweDgpOworCX0gZWxzZSB7CisJCWlmIChtdXRlKQorCQkJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfREFDLCBtdXRlX3JlZyB8IDB4OCk7CisJCWVsc2UKKwkJCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX0RBQywgbXV0ZV9yZWcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdtODc1M19kYXBtX2V2ZW50KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGV2ZW50KQoreworCXUxNiBwd3JfcmVnID0gd204NzUzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTNfUFdSMSkgJiAweGZlM2U7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDA6IC8qIGZ1bGwgT24gKi8KKwkJLyogc2V0IHZtaWQgdG8gNTBrIGFuZCB1bm11dGUgZGFjICovCisJCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX1BXUjEsIHB3cl9yZWcgfCAweDAwYzApOworCQlicmVhazsKKwljYXNlIFNORFJWX0NUTF9QT1dFUl9EMTogLyogcGFydGlhbCBPbiAqLworCWNhc2UgU05EUlZfQ1RMX1BPV0VSX0QyOiAvKiBwYXJ0aWFsIE9uICovCisJCS8qIHNldCB2bWlkIHRvIDVrIGZvciBxdWljayBwb3dlciB1cCAqLworCQl3bTg3NTNfd3JpdGUoY29kZWMsIFdNODc1M19QV1IxLCBwd3JfcmVnIHwgMHgwMWMxKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9DVExfUE9XRVJfRDNob3Q6IC8qIE9mZiwgd2l0aCBwb3dlciAqLworCQkvKiBtdXRlIGRhYyBhbmQgc2V0IHZtaWQgdG8gNTAwaywgZW5hYmxlIFZSRUYgKi8KKwkJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfUFdSMSwgcHdyX3JlZyB8IDB4MDE0MSk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfQ1RMX1BPV0VSX0QzY29sZDogLyogT2ZmLCB3aXRob3V0IHBvd2VyICovCisJCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX1BXUjEsIDB4MDAwMSk7CisJCWJyZWFrOworCX0KKwljb2RlYy0+ZGFwbV9zdGF0ZSA9IGV2ZW50OworCXJldHVybiAwOworfQorCisjZGVmaW5lIFdNODc1M19SQVRFUyAoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHxcCisJCVNORFJWX1BDTV9SQVRFXzE2MDAwIHwgU05EUlZfUENNX1JBVEVfMjIwNTAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFwKKwkJU05EUlZfUENNX1JBVEVfNDgwMDAgfCBTTkRSVl9QQ01fUkFURV84ODIwMCB8IFNORFJWX1BDTV9SQVRFXzk2MDAwKQorCisjZGVmaW5lIFdNODc1M19GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8XAorCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFKQorCisvKgorICogVGhlIFdNODc1MyBzdXBwb3J0cyB1cHRvIDQgZGlmZmVyZW50IGFuZCBtdXR1YWxseSBleGNsdXNpdmUgREFJCisgKiBjb25maWd1cmF0aW9ucy4gVGhpcyBnaXZlcyAyIFBDTSdzIGF2YWlsYWJsZSBmb3IgdXNlLCBoaWZpIGFuZCB2b2ljZS4KKyAqIE5PVEU6IFRoZSBWb2ljZSBQQ00gY2Fubm90IHBsYXkgb3IgY2FwdHVyZSBhdWRpbyB0byB0aGUgQ1BVIGFzIGl0J3MgREFJCisgKiBpcyBjb25uZWN0ZWQgYmV0d2VlbiB0aGUgd204NzUzIGFuZCBhIEJUIGNvZGVjIG9yIEdTTSBtb2RlbS4KKyAqCisgKiAxLiBWb2ljZSBvdmVyIFBDTSBEQUkgLSBISUZJIERBQyBvdmVyIEhJRkkgREFJCisgKiAyLiBWb2ljZSBvdmVyIEhJRkkgREFJIC0gSElGSSBkaXNhYmxlZAorICogMy4gVm9pY2UgZGlzYWJsZWQgLSBISUZJIG92ZXIgSElGSQorICogNC4gVm9pY2UgZGlzYWJsZWQgLSBISUZJIG92ZXIgSElGSSwgdXNlcyB2b2ljZSBEQUkgTFJDIGZvciBjYXB0dXJlCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgd204NzUzX2FsbF9kYWlbXSA9IHsKKy8qIERBSSBIaUZpIG1vZGUgMSAqLworewkubmFtZSA9ICJXTTg3NTMgSGlGaSIsCisJLmlkID0gMSwKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJIaUZpIFBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBXTTg3NTNfUkFURVMsCisJCS5mb3JtYXRzID0gV004NzUzX0ZPUk1BVFMsfSwKKwkuY2FwdHVyZSA9IHsgLyogZHVtbXkgZm9yIGZhc3QgREFJIHN3aXRjaGluZyAqLworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzUzX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODc1M19GT1JNQVRTLH0sCisJLm9wcyA9IHsKKwkJLmh3X3BhcmFtcyA9IHdtODc1M19pMnNfaHdfcGFyYW1zLH0sCisJLmRhaV9vcHMgPSB7CisJCS5kaWdpdGFsX211dGUgPSB3bTg3NTNfbXV0ZSwKKwkJLnNldF9mbXQgPSB3bTg3NTNfbW9kZTFoX3NldF9kYWlfZm10LAorCQkuc2V0X2Nsa2RpdiA9IHdtODc1M19zZXRfZGFpX2Nsa2RpdiwKKwkJLnNldF9wbGwgPSB3bTg3NTNfc2V0X2RhaV9wbGwsCisJCS5zZXRfc3lzY2xrID0gd204NzUzX3NldF9kYWlfc3lzY2xrLAorCX0sCit9LAorLyogREFJIFZvaWNlIG1vZGUgMSAqLworewkubmFtZSA9ICJXTTg3NTMgVm9pY2UiLAorCS5pZCA9IDEsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDEsCisJCS5yYXRlcyA9IFdNODc1M19SQVRFUywKKwkJLmZvcm1hdHMgPSBXTTg3NTNfRk9STUFUUyx9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzUzX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODc1M19GT1JNQVRTLH0sCisJLm9wcyA9IHsKKwkJLmh3X3BhcmFtcyA9IHdtODc1M19wY21faHdfcGFyYW1zLH0sCisJLmRhaV9vcHMgPSB7CisJCS5kaWdpdGFsX211dGUgPSB3bTg3NTNfbXV0ZSwKKwkJLnNldF9mbXQgPSB3bTg3NTNfbW9kZTF2X3NldF9kYWlfZm10LAorCQkuc2V0X2Nsa2RpdiA9IHdtODc1M19zZXRfZGFpX2Nsa2RpdiwKKwkJLnNldF9wbGwgPSB3bTg3NTNfc2V0X2RhaV9wbGwsCisJCS5zZXRfc3lzY2xrID0gd204NzUzX3NldF9kYWlfc3lzY2xrLAorCX0sCit9LAorLyogREFJIEhpRmkgbW9kZSAyIC0gZHVtbXkgKi8KK3sJLm5hbWUgPSAiV004NzUzIEhpRmkiLAorCS5pZCA9IDIsCit9LAorLyogREFJIFZvaWNlIG1vZGUgMiAqLworewkubmFtZSA9ICJXTTg3NTMgVm9pY2UiLAorCS5pZCA9IDIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiVm9pY2UgUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDEsCisJCS5yYXRlcyA9IFdNODc1M19SQVRFUywKKwkJLmZvcm1hdHMgPSBXTTg3NTNfRk9STUFUUyx9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzUzX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODc1M19GT1JNQVRTLH0sCisJLm9wcyA9IHsKKwkJLmh3X3BhcmFtcyA9IHdtODc1M19wY21faHdfcGFyYW1zLH0sCisJLmRhaV9vcHMgPSB7CisJCS5kaWdpdGFsX211dGUgPSB3bTg3NTNfbXV0ZSwKKwkJLnNldF9mbXQgPSB3bTg3NTNfbW9kZTJfc2V0X2RhaV9mbXQsCisJCS5zZXRfY2xrZGl2ID0gd204NzUzX3NldF9kYWlfY2xrZGl2LAorCQkuc2V0X3BsbCA9IHdtODc1M19zZXRfZGFpX3BsbCwKKwkJLnNldF9zeXNjbGsgPSB3bTg3NTNfc2V0X2RhaV9zeXNjbGssCisJfSwKK30sCisvKiBEQUkgSGlGaSBtb2RlIDMgKi8KK3sJLm5hbWUgPSAiV004NzUzIEhpRmkiLAorCS5pZCA9IDMsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiSGlGaSBQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzUzX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODc1M19GT1JNQVRTLH0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBXTTg3NTNfUkFURVMsCisJCS5mb3JtYXRzID0gV004NzUzX0ZPUk1BVFMsfSwKKwkub3BzID0geworCQkuaHdfcGFyYW1zID0gd204NzUzX2kyc19od19wYXJhbXMsfSwKKwkuZGFpX29wcyA9IHsKKwkJLmRpZ2l0YWxfbXV0ZSA9IHdtODc1M19tdXRlLAorCQkuc2V0X2ZtdCA9IHdtODc1M19tb2RlM180X3NldF9kYWlfZm10LAorCQkuc2V0X2Nsa2RpdiA9IHdtODc1M19zZXRfZGFpX2Nsa2RpdiwKKwkJLnNldF9wbGwgPSB3bTg3NTNfc2V0X2RhaV9wbGwsCisJCS5zZXRfc3lzY2xrID0gd204NzUzX3NldF9kYWlfc3lzY2xrLAorCX0sCit9LAorLyogREFJIFZvaWNlIG1vZGUgMyAtIGR1bW15ICovCit7CS5uYW1lID0gIldNODc1MyBWb2ljZSIsCisJLmlkID0gMywKK30sCisvKiBEQUkgSGlGaSBtb2RlIDQgKi8KK3sJLm5hbWUgPSAiV004NzUzIEhpRmkiLAorCS5pZCA9IDQsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiSGlGaSBQbGF5YmFjayIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gV004NzUzX1JBVEVTLAorCQkuZm9ybWF0cyA9IFdNODc1M19GT1JNQVRTLH0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBXTTg3NTNfUkFURVMsCisJCS5mb3JtYXRzID0gV004NzUzX0ZPUk1BVFMsfSwKKwkub3BzID0geworCQkuaHdfcGFyYW1zID0gd204NzUzX2kyc19od19wYXJhbXMsfSwKKwkuZGFpX29wcyA9IHsKKwkJLmRpZ2l0YWxfbXV0ZSA9IHdtODc1M19tdXRlLAorCQkuc2V0X2ZtdCA9IHdtODc1M19tb2RlM180X3NldF9kYWlfZm10LAorCQkuc2V0X2Nsa2RpdiA9IHdtODc1M19zZXRfZGFpX2Nsa2RpdiwKKwkJLnNldF9wbGwgPSB3bTg3NTNfc2V0X2RhaV9wbGwsCisJCS5zZXRfc3lzY2xrID0gd204NzUzX3NldF9kYWlfc3lzY2xrLAorCX0sCit9LAorLyogREFJIFZvaWNlIG1vZGUgNCAtIGR1bW15ICovCit7CS5uYW1lID0gIldNODc1MyBWb2ljZSIsCisJLmlkID0gNCwKK30sCit9OworCitzdHJ1Y3Qgc25kX3NvY19jb2RlY19kYWkgd204NzUzX2RhaVsyXTsKK0VYUE9SVF9TWU1CT0xfR1BMKHdtODc1M19kYWkpOworCitzdGF0aWMgdm9pZCB3bTg3NTNfc2V0X2RhaV9tb2RlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IG1vZGUpCit7CisJaWYgKG1vZGUgPCA0KSB7CisJCWludCBwbGF5YmFja19hY3RpdmUsIGNhcHR1cmVfYWN0aXZlLCBjb2RlY19hY3RpdmUsIHBvcF93YWl0OworCQl2b2lkICpwcml2YXRlX2RhdGE7CisKKwkJcGxheWJhY2tfYWN0aXZlID0gd204NzUzX2RhaVswXS5wbGF5YmFjay5hY3RpdmU7CisJCWNhcHR1cmVfYWN0aXZlID0gd204NzUzX2RhaVswXS5jYXB0dXJlLmFjdGl2ZTsKKwkJY29kZWNfYWN0aXZlID0gd204NzUzX2RhaVswXS5hY3RpdmU7CisJCXByaXZhdGVfZGF0YSA9IHdtODc1M19kYWlbMF0ucHJpdmF0ZV9kYXRhOworCQlwb3Bfd2FpdCA9IHdtODc1M19kYWlbMF0ucG9wX3dhaXQ7CisJCXdtODc1M19kYWlbMF0gPSB3bTg3NTNfYWxsX2RhaVttb2RlIDw8IDFdOworCQl3bTg3NTNfZGFpWzBdLnBsYXliYWNrLmFjdGl2ZSA9IHBsYXliYWNrX2FjdGl2ZTsKKwkJd204NzUzX2RhaVswXS5jYXB0dXJlLmFjdGl2ZSA9IGNhcHR1cmVfYWN0aXZlOworCQl3bTg3NTNfZGFpWzBdLmFjdGl2ZSA9IGNvZGVjX2FjdGl2ZTsKKwkJd204NzUzX2RhaVswXS5wcml2YXRlX2RhdGEgPSBwcml2YXRlX2RhdGE7CisJCXdtODc1M19kYWlbMF0ucG9wX3dhaXQgPSBwb3Bfd2FpdDsKKworCQlwbGF5YmFja19hY3RpdmUgPSB3bTg3NTNfZGFpWzFdLnBsYXliYWNrLmFjdGl2ZTsKKwkJY2FwdHVyZV9hY3RpdmUgPSB3bTg3NTNfZGFpWzFdLmNhcHR1cmUuYWN0aXZlOworCQljb2RlY19hY3RpdmUgPSB3bTg3NTNfZGFpWzFdLmFjdGl2ZTsKKwkJcHJpdmF0ZV9kYXRhID0gd204NzUzX2RhaVsxXS5wcml2YXRlX2RhdGE7CisJCXBvcF93YWl0ID0gd204NzUzX2RhaVsxXS5wb3Bfd2FpdDsKKwkJd204NzUzX2RhaVsxXSA9IHdtODc1M19hbGxfZGFpWyhtb2RlIDw8IDEpICsgMV07CisJCXdtODc1M19kYWlbMV0ucGxheWJhY2suYWN0aXZlID0gcGxheWJhY2tfYWN0aXZlOworCQl3bTg3NTNfZGFpWzFdLmNhcHR1cmUuYWN0aXZlID0gY2FwdHVyZV9hY3RpdmU7CisJCXdtODc1M19kYWlbMV0uYWN0aXZlID0gY29kZWNfYWN0aXZlOworCQl3bTg3NTNfZGFpWzFdLnByaXZhdGVfZGF0YSA9IHByaXZhdGVfZGF0YTsKKwkJd204NzUzX2RhaVsxXS5wb3Bfd2FpdCA9IHBvcF93YWl0OworCX0KKwl3bTg3NTNfZGFpWzBdLmNvZGVjID0gY29kZWM7CisJd204NzUzX2RhaVsxXS5jb2RlYyA9IGNvZGVjOworfQorCitzdGF0aWMgdm9pZCB3bTg3NTNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbmRfc29jX2NvZGVjLCBkZWxheWVkX3dvcmsud29yayk7CisJd204NzUzX2RhcG1fZXZlbnQoY29kZWMsIGNvZGVjLT5kYXBtX3N0YXRlKTsKK30KKworc3RhdGljIGludCB3bTg3NTNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCisJLyogd2Ugb25seSBuZWVkIHRvIHN1c3BlbmQgaWYgd2UgYXJlIGEgdmFsaWQgY2FyZCAqLworCWlmKCFjb2RlYy0+Y2FyZCkKKwkJcmV0dXJuIDA7CisJCQorCXdtODc1M19kYXBtX2V2ZW50KGNvZGVjLCBTTkRSVl9DVExfUE9XRVJfRDNjb2xkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg3NTNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCWludCBpOworCXU4IGRhdGFbMl07CisJdTE2ICpjYWNoZSA9IGNvZGVjLT5yZWdfY2FjaGU7CisKKwkvKiB3ZSBvbmx5IG5lZWQgdG8gcmVzdW1lIGlmIHdlIGFyZSBhIHZhbGlkIGNhcmQgKi8KKwlpZighY29kZWMtPmNhcmQpCisJCXJldHVybiAwOworCisJLyogU3luYyByZWdfY2FjaGUgd2l0aCB0aGUgaGFyZHdhcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg3NTNfcmVnKTsgaSsrKSB7CisJCWlmIChpICsgMSA9PSBXTTg3NTNfUkVTRVQpCisJCQljb250aW51ZTsKKwkJZGF0YVswXSA9ICgoaSArIDEpIDw8IDEpIHwgKChjYWNoZVtpXSA+PiA4KSAmIDB4MDAwMSk7CisJCWRhdGFbMV0gPSBjYWNoZVtpXSAmIDB4MDBmZjsKKwkJY29kZWMtPmh3X3dyaXRlKGNvZGVjLT5jb250cm9sX2RhdGEsIGRhdGEsIDIpOworCX0KKworCXdtODc1M19kYXBtX2V2ZW50KGNvZGVjLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOworCisJLyogY2hhcmdlIHdtODc1MyBjYXBzICovCisJaWYgKGNvZGVjLT5zdXNwZW5kX2RhcG1fc3RhdGUgPT0gU05EUlZfQ1RMX1BPV0VSX0QwKSB7CisJCXdtODc1M19kYXBtX2V2ZW50KGNvZGVjLCBTTkRSVl9DVExfUE9XRVJfRDIpOworCQljb2RlYy0+ZGFwbV9zdGF0ZSA9IFNORFJWX0NUTF9QT1dFUl9EMDsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjb2RlYy0+ZGVsYXllZF93b3JrLAorCQkJbXNlY3NfdG9famlmZmllcyhjYXBzX2NoYXJnZSkpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogaW5pdGlhbGlzZSB0aGUgV004NzUzIGRyaXZlcgorICogcmVnaXN0ZXIgdGhlIG1peGVyIGFuZCBkc3AgaW50ZXJmYWNlcyB3aXRoIHRoZSBrZXJuZWwKKyAqLworc3RhdGljIGludCB3bTg3NTNfaW5pdChzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCWludCByZWcsIHJldCA9IDA7CisKKwljb2RlYy0+bmFtZSA9ICJXTTg3NTMiOworCWNvZGVjLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNvZGVjLT5yZWFkID0gd204NzUzX3JlYWRfcmVnX2NhY2hlOworCWNvZGVjLT53cml0ZSA9IHdtODc1M193cml0ZTsKKwljb2RlYy0+ZGFwbV9ldmVudCA9IHdtODc1M19kYXBtX2V2ZW50OworCWNvZGVjLT5kYWkgPSB3bTg3NTNfZGFpOworCWNvZGVjLT5udW1fZGFpID0gMjsKKwljb2RlYy0+cmVnX2NhY2hlX3NpemUgPSBzaXplb2Yod204NzUzX3JlZyk7CisJY29kZWMtPnJlZ19jYWNoZSA9IGttZW1kdXAod204NzUzX3JlZywgc2l6ZW9mKHdtODc1M19yZWcpLCBHRlBfS0VSTkVMKTsKKworCWlmIChjb2RlYy0+cmVnX2NhY2hlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJd204NzUzX3NldF9kYWlfbW9kZShjb2RlYywgMCk7CisKKwl3bTg3NTNfcmVzZXQoY29kZWMpOworCisJLyogcmVnaXN0ZXIgcGNtcyAqLworCXJldCA9IHNuZF9zb2NfbmV3X3BjbXMoc29jZGV2LCBTTkRSVl9ERUZBVUxUX0lEWDEsIFNORFJWX0RFRkFVTFRfU1RSMSk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ3bTg3NTM6IGZhaWxlZCB0byBjcmVhdGUgcGNtc1xuIik7CisJCWdvdG8gcGNtX2VycjsKKwl9CisKKwkvKiBjaGFyZ2Ugb3V0cHV0IGNhcHMgKi8KKwl3bTg3NTNfZGFwbV9ldmVudChjb2RlYywgU05EUlZfQ1RMX1BPV0VSX0QyKTsKKwljb2RlYy0+ZGFwbV9zdGF0ZSA9IFNORFJWX0NUTF9QT1dFUl9EM2hvdDsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmssCisJCW1zZWNzX3RvX2ppZmZpZXMoY2Fwc19jaGFyZ2UpKTsKKworCS8qIHNldCB0aGUgdXBkYXRlIGJpdHMgKi8KKwlyZWcgPSB3bTg3NTNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1M19MREFDKTsKKwl3bTg3NTNfd3JpdGUoY29kZWMsIFdNODc1M19MREFDLCByZWcgfCAweDAxMDApOworCXJlZyA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX1JEQUMpOworCXdtODc1M193cml0ZShjb2RlYywgV004NzUzX1JEQUMsIHJlZyB8IDB4MDEwMCk7CisJcmVnID0gd204NzUzX3JlYWRfcmVnX2NhY2hlKGNvZGVjLCBXTTg3NTNfTEFEQyk7CisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfTEFEQywgcmVnIHwgMHgwMTAwKTsKKwlyZWcgPSB3bTg3NTNfcmVhZF9yZWdfY2FjaGUoY29kZWMsIFdNODc1M19SQURDKTsKKwl3bTg3NTNfd3JpdGUoY29kZWMsIFdNODc1M19SQURDLCByZWcgfCAweDAxMDApOworCXJlZyA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0xPVVQxVik7CisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfTE9VVDFWLCByZWcgfCAweDAxMDApOworCXJlZyA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX1JPVVQxVik7CisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfUk9VVDFWLCByZWcgfCAweDAxMDApOworCXJlZyA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0xPVVQyVik7CisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfTE9VVDJWLCByZWcgfCAweDAxMDApOworCXJlZyA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX1JPVVQyVik7CisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfUk9VVDJWLCByZWcgfCAweDAxMDApOworCXJlZyA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX0xJTlZPTCk7CisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfTElOVk9MLCByZWcgfCAweDAxMDApOworCXJlZyA9IHdtODc1M19yZWFkX3JlZ19jYWNoZShjb2RlYywgV004NzUzX1JJTlZPTCk7CisJd204NzUzX3dyaXRlKGNvZGVjLCBXTTg3NTNfUklOVk9MLCByZWcgfCAweDAxMDApOworCisJd204NzUzX2FkZF9jb250cm9scyhjb2RlYyk7CisJd204NzUzX2FkZF93aWRnZXRzKGNvZGVjKTsKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoc29jZGV2KTsKKwlpZiAocmV0IDwgMCkgeworICAgICAgCXByaW50ayhLRVJOX0VSUiAid204NzUzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2FyZFxuIik7CisJCWdvdG8gY2FyZF9lcnI7CisgICAgfQorCXJldHVybiByZXQ7CisKK2NhcmRfZXJyOgorCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CisJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKK3BjbV9lcnI6CisJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7CisJcmV0dXJuIHJldDsKK30KKworLyogSWYgdGhlIGkyYyBsYXllciB3ZXJlbid0IHNvIGJyb2tlbiwgd2UgY291bGQgcGFzcyB0aGlzIGtpbmQgb2YgZGF0YQorICAgYXJvdW5kICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGV2aWNlICp3bTg3NTNfc29jZGV2OworCisjaWYgZGVmaW5lZCAoQ09ORklHX0kyQykgfHwgZGVmaW5lZCAoQ09ORklHX0kyQ19NT0RVTEUpCisKKy8qCisgKiBXTTg3NTMgMiB3aXJlIGFkZHJlc3MgaXMgZGV0ZXJtaW5lZCBieSBHUElPNQorICogc3RhdGUgZHVyaW5nIHBvd2VydXAuCisgKiAgICBsb3cgID0gMHgxYQorICogICAgaGlnaCA9IDB4MWIKKyAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMCwgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogTWFnaWMgZGVmaW5pdGlvbiBvZiBhbGwgb3RoZXIgdmFyaWFibGVzIGFuZCB0aGluZ3MgKi8KK0kyQ19DTElFTlRfSU5TTU9EOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204NzUzX2kyY19kcml2ZXI7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgY2xpZW50X3RlbXBsYXRlOworCitzdGF0aWMgaW50IHdtODc1M19jb2RlY19wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHdtODc1M19zb2NkZXY7CisJc3RydWN0IHdtODc1M19zZXR1cF9kYXRhICpzZXR1cCA9IHNvY2Rldi0+Y29kZWNfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzb2NkZXYtPmNvZGVjOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmM7CisJaW50IHJldDsKKworCWlmIChhZGRyICE9IHNldHVwLT5pMmNfYWRkcmVzcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7CisJY2xpZW50X3RlbXBsYXRlLmFkZHIgPSBhZGRyOworCisJaTJjID0gIGttZW1kdXAoJmNsaWVudF90ZW1wbGF0ZSwgc2l6ZW9mKGNsaWVudF90ZW1wbGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChpMmMgPT0gTlVMTCl7CisJCWtmcmVlKGNvZGVjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIGNvZGVjKTsKKwljb2RlYy0+Y29udHJvbF9kYXRhID0gaTJjOworCisJcmV0ID0gaTJjX2F0dGFjaF9jbGllbnQoaTJjKTsKKwlpZiAocmV0IDwgMCkgeworCQllcnIoImZhaWxlZCB0byBhdHRhY2ggY29kZWMgYXQgYWRkciAleFxuIiwgYWRkcik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IHdtODc1M19pbml0KHNvY2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGlzZSBXTTg3NTNcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnI6CisJa2ZyZWUoY29kZWMpOworCWtmcmVlKGkyYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bTg3NTNfaTJjX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoY29kZWMtPnJlZ19jYWNoZSk7CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTg3NTNfaTJjX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB3bTg3NTNfY29kZWNfcHJvYmUpOworfQorCisvKiBjb3JnaSBpMmMgY29kZWMgY29udHJvbCBsYXllciAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODc1M19pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIldNODc1MyBJMkMgQ29kZWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5pZCA9ICAgICAgICAgICAgIEkyQ19EUklWRVJJRF9XTTg3NTMsCisJLmF0dGFjaF9hZGFwdGVyID0gd204NzUzX2kyY19hdHRhY2gsCisJLmRldGFjaF9jbGllbnQgPSAgd204NzUzX2kyY19kZXRhY2gsCisJLmNvbW1hbmQgPSAgICAgICAgTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnRfdGVtcGxhdGUgPSB7CisJLm5hbWUgPSAgICJXTTg3NTMiLAorCS5kcml2ZXIgPSAmd204NzUzX2kyY19kcml2ZXIsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgd204NzUzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfZGV2aWNlICpzb2NkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgd204NzUzX3NldHVwX2RhdGEgKnNldHVwOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgd204NzUzX3ByaXYgKndtODc1MzsKKwlpbnQgcmV0ID0gMDsKKworCWluZm8oIldNODc1MyBBdWRpbyBDb2RlYyAlcyIsIFdNODc1M19WRVJTSU9OKTsKKworCXNldHVwID0gc29jZGV2LT5jb2RlY19kYXRhOworCWNvZGVjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zb2NfY29kZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY29kZWMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3bTg3NTMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd204NzUzX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAod204NzUzID09IE5VTEwpIHsKKwkJa2ZyZWUoY29kZWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljb2RlYy0+cHJpdmF0ZV9kYXRhID0gd204NzUzOworCXNvY2Rldi0+Y29kZWMgPSBjb2RlYzsKKwltdXRleF9pbml0KCZjb2RlYy0+bXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+ZGFwbV93aWRnZXRzKTsKKwlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmRhcG1fcGF0aHMpOworCXdtODc1M19zb2NkZXYgPSBzb2NkZXY7CisJSU5JVF9ERUxBWUVEX1dPUksoJmNvZGVjLT5kZWxheWVkX3dvcmssIHdtODc1M193b3JrKTsKKworI2lmIGRlZmluZWQgKENPTkZJR19JMkMpIHx8IGRlZmluZWQgKENPTkZJR19JMkNfTU9EVUxFKQorCWlmIChzZXR1cC0+aTJjX2FkZHJlc3MpIHsKKwkJbm9ybWFsX2kyY1swXSA9IHNldHVwLT5pMmNfYWRkcmVzczsKKwkJY29kZWMtPmh3X3dyaXRlID0gKGh3X3dyaXRlX3QpaTJjX21hc3Rlcl9zZW5kOworCQlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204NzUzX2kyY19kcml2ZXIpOworCQlpZiAocmV0ICE9IDApCisJCQlwcmludGsoS0VSTl9FUlIgImNhbid0IGFkZCBpMmMgZHJpdmVyIik7CisJfQorI2Vsc2UKKwkJLyogQWRkIG90aGVyIGludGVyZmFjZXMgaGVyZSAqLworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZm9yY2VzIGFueSBkZWxheWVkIHdvcmsgdG8gYmUgcXVldWVkIGFuZCBydW4uCisgKi8KK3N0YXRpYyBpbnQgcnVuX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaykKK3sKKwlpbnQgcmV0OworCisJLyogY2FuY2VsIGFueSB3b3JrIHdhaXRpbmcgdG8gYmUgcXVldWVkLiAqLworCXJldCA9IGNhbmNlbF9kZWxheWVkX3dvcmsoZHdvcmspOworCisJLyogaWYgdGhlcmUgd2FzIGFueSB3b3JrIHdhaXRpbmcgdGhlbiB3ZSBydW4gaXQgbm93IGFuZAorCSAqIHdhaXQgZm9yIGl0J3MgY29tcGxldGlvbiAqLworCWlmIChyZXQpIHsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKGR3b3JrLCAwKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogcG93ZXIgZG93biBjaGlwICovCitzdGF0aWMgaW50IHdtODc1M19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kZXZpY2UgKnNvY2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNvY2Rldi0+Y29kZWM7CisKKwlpZiAoY29kZWMtPmNvbnRyb2xfZGF0YSkKKwkJd204NzUzX2RhcG1fZXZlbnQoY29kZWMsIFNORFJWX0NUTF9QT1dFUl9EM2NvbGQpOworCXJ1bl9kZWxheWVkX3dvcmsoJmNvZGVjLT5kZWxheWVkX3dvcmspOworCXNuZF9zb2NfZnJlZV9wY21zKHNvY2Rldik7CisJc25kX3NvY19kYXBtX2ZyZWUoc29jZGV2KTsKKyNpZiBkZWZpbmVkIChDT05GSUdfSTJDKSB8fCBkZWZpbmVkIChDT05GSUdfSTJDX01PRFVMRSkKKwlpMmNfZGVsX2RyaXZlcigmd204NzUzX2kyY19kcml2ZXIpOworI2VuZGlmCisJa2ZyZWUoY29kZWMtPnByaXZhdGVfZGF0YSk7CisJa2ZyZWUoY29kZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtODc1MyA9IHsKKwkucHJvYmUgPSAJd204NzUzX3Byb2JlLAorCS5yZW1vdmUgPSAJd204NzUzX3JlbW92ZSwKKwkuc3VzcGVuZCA9IAl3bTg3NTNfc3VzcGVuZCwKKwkucmVzdW1lID0Jd204NzUzX3Jlc3VtZSwKK307CisKK0VYUE9SVF9TWU1CT0xfR1BMKHNvY19jb2RlY19kZXZfd204NzUzKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFdNODc1MyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmggYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTJhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogd204NzUzLmggIC0tICBhdWRpbyBkcml2ZXIgZm9yIFdNODc1MworICoKKyAqIENvcHlyaWdodCAyMDAzIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBBdXRob3I6IExpYW0gR2lyZHdvb2QKKyAqICAgICAgICAgbGlhbS5naXJkd29vZEB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfV004NzUzX0gKKyNkZWZpbmUgX1dNODc1M19ICisKKy8qIFdNODc1MyByZWdpc3RlciBzcGFjZSAqLworCisjZGVmaW5lIFdNODc1M19EQUMJCTB4MDEKKyNkZWZpbmUgV004NzUzX0FEQwkJMHgwMgorI2RlZmluZSBXTTg3NTNfUENNCQkweDAzCisjZGVmaW5lIFdNODc1M19ISUZJCQkweDA0CisjZGVmaW5lIFdNODc1M19JT0NUTAkJMHgwNQorI2RlZmluZSBXTTg3NTNfU1JBVEUxCQkweDA2CisjZGVmaW5lIFdNODc1M19TUkFURTIJCTB4MDcKKyNkZWZpbmUgV004NzUzX0xEQUMJCTB4MDgKKyNkZWZpbmUgV004NzUzX1JEQUMJCTB4MDkKKyNkZWZpbmUgV004NzUzX0JBU1MJCTB4MGEKKyNkZWZpbmUgV004NzUzX1RSRUJMRQkJMHgwYgorI2RlZmluZSBXTTg3NTNfQUxDMQkJMHgwYworI2RlZmluZSBXTTg3NTNfQUxDMgkJMHgwZAorI2RlZmluZSBXTTg3NTNfQUxDMwkJMHgwZQorI2RlZmluZSBXTTg3NTNfTkdBVEUJCTB4MGYKKyNkZWZpbmUgV004NzUzX0xBREMJCTB4MTAKKyNkZWZpbmUgV004NzUzX1JBREMJCTB4MTEKKyNkZWZpbmUgV004NzUzX0FEQ1RMMQkJMHgxMgorI2RlZmluZSBXTTg3NTNfM0QJCTB4MTMKKyNkZWZpbmUgV004NzUzX1BXUjEJCTB4MTQKKyNkZWZpbmUgV004NzUzX1BXUjIJCTB4MTUKKyNkZWZpbmUgV004NzUzX1BXUjMJCTB4MTYKKyNkZWZpbmUgV004NzUzX1BXUjQJCTB4MTcKKyNkZWZpbmUgV004NzUzX0lECQkweDE4CisjZGVmaW5lIFdNODc1M19JTlRQT0wJCTB4MTkKKyNkZWZpbmUgV004NzUzX0lOVEVOCQkweDFhCisjZGVmaW5lIFdNODc1M19HUElPMQkJMHgxYgorI2RlZmluZSBXTTg3NTNfR1BJTzIJCTB4MWMKKyNkZWZpbmUgV004NzUzX1JFU0VUCQkweDFmCisjZGVmaW5lIFdNODc1M19SRUNNSVgxCQkweDIwCisjZGVmaW5lIFdNODc1M19SRUNNSVgyCQkweDIxCisjZGVmaW5lIFdNODc1M19MT1VUTTEJCTB4MjIKKyNkZWZpbmUgV004NzUzX0xPVVRNMgkJMHgyMworI2RlZmluZSBXTTg3NTNfUk9VVE0xCQkweDI0CisjZGVmaW5lIFdNODc1M19ST1VUTTIJCTB4MjUKKyNkZWZpbmUgV004NzUzX01PVVRNMQkJMHgyNgorI2RlZmluZSBXTTg3NTNfTU9VVE0yCQkweDI3CisjZGVmaW5lIFdNODc1M19MT1VUMVYJCTB4MjgKKyNkZWZpbmUgV004NzUzX1JPVVQxVgkJMHgyOQorI2RlZmluZSBXTTg3NTNfTE9VVDJWCQkweDJhCisjZGVmaW5lIFdNODc1M19ST1VUMlYJCTB4MmIKKyNkZWZpbmUgV004NzUzX01PVVRWCQkweDJjCisjZGVmaW5lIFdNODc1M19PVVRDVEwJCTB4MmQKKyNkZWZpbmUgV004NzUzX0FEQ0lOCQkweDJlCisjZGVmaW5lIFdNODc1M19JTkNUTDEJCTB4MmYKKyNkZWZpbmUgV004NzUzX0lOQ1RMMgkJMHgzMAorI2RlZmluZSBXTTg3NTNfTElOVk9MCQkweDMxCisjZGVmaW5lIFdNODc1M19SSU5WT0wJCTB4MzIKKyNkZWZpbmUgV004NzUzX01JQ0JJQVMJCTB4MzMKKyNkZWZpbmUgV004NzUzX0NMT0NLCQkweDM0CisjZGVmaW5lIFdNODc1M19QTEwxQ1RMMQkJMHgzNQorI2RlZmluZSBXTTg3NTNfUExMMUNUTDIJCTB4MzYKKyNkZWZpbmUgV004NzUzX1BMTDFDVEwzCQkweDM3CisjZGVmaW5lIFdNODc1M19QTEwxQ1RMNAkJMHgzOAorI2RlZmluZSBXTTg3NTNfUExMMkNUTDEJCTB4MzkKKyNkZWZpbmUgV004NzUzX1BMTDJDVEwyCQkweDNhCisjZGVmaW5lIFdNODc1M19QTEwyQ1RMMwkJMHgzYgorI2RlZmluZSBXTTg3NTNfUExMMkNUTDQJCTB4M2MKKyNkZWZpbmUgV004NzUzX0JJQVNDVEwJCTB4M2QKKyNkZWZpbmUgV004NzUzX0FEQ1RMMgkJMHgzZgorCitzdHJ1Y3Qgd204NzUzX3NldHVwX2RhdGEgeworCXVuc2lnbmVkIHNob3J0IGkyY19hZGRyZXNzOworfTsKKworI2RlZmluZSBXTTg3NTNfUExMMQkJCTAKKyNkZWZpbmUgV004NzUzX1BMTDIJCQkxCisKKy8qIGNsb2NrIGlucHV0cyAqLworI2RlZmluZSBXTTg3NTNfTUNMSwkJMAorI2RlZmluZSBXTTg3NTNfUENNQ0xLCQkxCisKKy8qIGNsb2NrIGRpdmlkZXIgaWQncyAqLworI2RlZmluZSBXTTg3NTNfUENNRElWCQkwCisjZGVmaW5lIFdNODc1M19CQ0xLRElWCQkxCisjZGVmaW5lIFdNODc1M19WWENMS0RJVgkJMgorCisvKiBQQ00gY2xvY2sgZGl2aWRlcnMgKi8KKyNkZWZpbmUgV004NzUzX1BDTV9ESVZfMQkoMCA8PCA2KQorI2RlZmluZSBXTTg3NTNfUENNX0RJVl8zCSgyIDw8IDYpCisjZGVmaW5lIFdNODc1M19QQ01fRElWXzVfNQkoMyA8PCA2KQorI2RlZmluZSBXTTg3NTNfUENNX0RJVl8yCSg0IDw8IDYpCisjZGVmaW5lIFdNODc1M19QQ01fRElWXzQJKDUgPDwgNikKKyNkZWZpbmUgV004NzUzX1BDTV9ESVZfNgkoNiA8PCA2KQorI2RlZmluZSBXTTg3NTNfUENNX0RJVl84CSg3IDw8IDYpCisKKy8qIEJDTEsgY2xvY2sgZGl2aWRlcnMgKi8KKyNkZWZpbmUgV004NzUzX0JDTEtfRElWXzEJKDAgPDwgMykKKyNkZWZpbmUgV004NzUzX0JDTEtfRElWXzIJKDEgPDwgMykKKyNkZWZpbmUgV004NzUzX0JDTEtfRElWXzQJKDIgPDwgMykKKyNkZWZpbmUgV004NzUzX0JDTEtfRElWXzgJKDMgPDwgMykKKyNkZWZpbmUgV004NzUzX0JDTEtfRElWXzE2CSg0IDw8IDMpCisKKy8qIFZYQ0xLIGNsb2NrIGRpdmlkZXJzICovCisjZGVmaW5lIFdNODc1M19WWENMS19ESVZfMQkoMCA8PCA2KQorI2RlZmluZSBXTTg3NTNfVlhDTEtfRElWXzIJKDEgPDwgNikKKyNkZWZpbmUgV004NzUzX1ZYQ0xLX0RJVl80CSgyIDw8IDYpCisjZGVmaW5lIFdNODc1M19WWENMS19ESVZfOAkoMyA8PCA2KQorI2RlZmluZSBXTTg3NTNfVlhDTEtfRElWXzE2CSg0IDw8IDYpCisKKyNkZWZpbmUgV004NzUzX0RBSV9ISUZJCQkwCisjZGVmaW5lIFdNODc1M19EQUlfVk9JQ0UJCTEKKworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RhaSB3bTg3NTNfZGFpWzJdOworZXh0ZXJuIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RldmljZSBzb2NfY29kZWNfZGV2X3dtODc1MzsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jIGIvc291bmQvc29jL2NvZGVjcy93bTk3MTIuYwppbmRleCBlZTdhNjkxLi4yNjQ0MTNhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMKQEAgLTY3NiwxNCArNjc2LDEzIEBACiAJY29kZWMgPSBzb2NkZXYtPmNvZGVjOwogCW11dGV4X2luaXQoJmNvZGVjLT5tdXRleCk7CiAKLQljb2RlYy0+cmVnX2NhY2hlID0KLQkJa3phbGxvYyhzaXplb2YodTE2KSAqIEFSUkFZX1NJWkUod205NzEyX3JlZyksIEdGUF9LRVJORUwpOworCWNvZGVjLT5yZWdfY2FjaGUgPSBrbWVtZHVwKHdtOTcxMl9yZWcsIHNpemVvZih3bTk3MTJfcmVnKSwgR0ZQX0tFUk5FTCk7CisKIAlpZiAoY29kZWMtPnJlZ19jYWNoZSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gY2FjaGVfZXJyOwogCX0KLQltZW1jcHkoY29kZWMtPnJlZ19jYWNoZSwgd205NzEyX3JlZywgc2l6ZW9mKHUxNikgKiBBUlJBWV9TSVpFKHdtOTcxMl9yZWcpKTsKLQljb2RlYy0+cmVnX2NhY2hlX3NpemUgPSBzaXplb2YodTE2KSAqIEFSUkFZX1NJWkUod205NzEyX3JlZyk7CisJY29kZWMtPnJlZ19jYWNoZV9zaXplID0gc2l6ZW9mKHdtOTcxMl9yZWcpOwogCWNvZGVjLT5yZWdfY2FjaGVfc3RlcCA9IDI7CiAKIAljb2RlYy0+bmFtZSA9ICJXTTk3MTIiOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9LY29uZmlnIGIvc291bmQvc29jL3B4YS9LY29uZmlnCmluZGV4IGI5YWIzYjguLmE4M2UyMjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvcHhhL0tjb25maWcKQEAgLTEsNSArMSwzIEBACi1tZW51ICJTb0MgQXVkaW8gZm9yIHRoZSBJbnRlbCBQWEEyeHgiCi0KIGNvbmZpZyBTTkRfUFhBMlhYX1NPQwogCXRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIHRoZSBJbnRlbCBQWEEyeHggY2hpcCIKIAlkZXBlbmRzIG9uIEFSQ0hfUFhBICYmIFNORF9TT0MKQEAgLTU1LDUgKzUzLDMgQEAKIAloZWxwCiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFNoYXJwCiAJICBaYXVydXMgU0wtQzYwMDB4IG1vZGVscyAoVG9zYSkuCi0KLWVuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zM2MyNHh4L0tjb25maWcgYi9zb3VuZC9zb2MvczNjMjR4eC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NGEzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvczNjMjR4eC9LY29uZmlnCkBAIC0wLDAgKzEsMTAgQEAKK2NvbmZpZyBTTkRfUzNDMjRYWF9TT0MKKwl0cmlzdGF0ZSAiU29DIEF1ZGlvIGZvciB0aGUgU2Ftc3VuZyBTM0MyNFhYIGNoaXBzIgorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwICYmIFNORF9TT0MKKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb2RlY3MgYXR0YWNoZWQgdG8KKwkgIHRoZSBTM0MyNFhYIEFDOTcsIEkyUyBvciBTU1AgaW50ZXJmYWNlLiBZb3Ugd2lsbCBhbHNvIG5lZWQKKwkgIHRvIHNlbGVjdCB0aGUgYXVkaW8gaW50ZXJmYWNlcyB0byBzdXBwb3J0IGJlbG93LgorCitjb25maWcgU05EX1MzQzI0WFhfU09DX0kyUworCXRyaXN0YXRlCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9NYWtlZmlsZSBiL3NvdW5kL3NvYy9zM2MyNHh4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMGZmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvczNjMjR4eC9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMgUzNjMjRYWCBQbGF0Zm9ybSBTdXBwb3J0CitzbmQtc29jLXMzYzI0eHgtb2JqcyA6PSBzM2MyNHh4LXBjbS5vCitzbmQtc29jLXMzYzI0eHgtaTJzLW9ianMgOj0gczNjMjR4eC1pMnMubworCitvYmotJChDT05GSUdfU05EX1MzQzI0WFhfU09DKSArPSBzbmQtc29jLXMzYzI0eHgubworb2JqLSQoQ09ORklHX1NORF9TM0MyNFhYX1NPQ19JMlMpICs9IHNuZC1zb2MtczNjMjR4eC1pMnMubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eC1pMnMuYyBiL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHgtaTJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhMzE0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHgtaTJzLmMKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBzM2MyNHh4LWkycy5jICAtLSAgQUxTQSBTb2MgQXVkaW8gTGF5ZXIKKyAqCisgKiAoYykgMjAwNiBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgUExDLgorICogR3JhZW1lIEdyZWdvcnkgZ3JhZW1lLmdyZWdvcnlAd29sZnNvbm1pY3JvLmNvbSBvciBsaW51eEB3b2xmc29ubWljcm8uY29tCisgKgorICogKGMpIDIwMDQtMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCWh0dHA6Ly9hcm1saW51eC5zaW10ZWMuY28udWsvCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAxMXRoIERlYyAyMDA2ICAgTWVyZ2VkIHdpdGggU2ltdGVjIGRyaXZlcgorICogICAgMTB0aCBOb3YgMjAwNiAgIEluaXRpYWwgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWlpcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9hdWRpby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9kbWEuaD4KKworI2luY2x1ZGUgInMzYzI0eHgtcGNtLmgiCisjaW5jbHVkZSAiczNjMjR4eC1pMnMuaCIKKworI2RlZmluZSBTM0MyNFhYX0kyU19ERUJVRyAwCisjaWYgUzNDMjRYWF9JMlNfREVCVUcKKyNkZWZpbmUgREJHKHguLi4pIHByaW50ayhLRVJOX0RFQlVHIHgpCisjZWxzZQorI2RlZmluZSBEQkcoeC4uLikKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHMzYzI0MTBfZG1hX2NsaWVudCBzM2MyNHh4X2RtYV9jbGllbnRfb3V0ID0geworCS5uYW1lID0gIkkyUyBQQ00gU3RlcmVvIG91dCIKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50IHMzYzI0eHhfZG1hX2NsaWVudF9pbiA9IHsKKwkubmFtZSA9ICJJMlMgUENNIFN0ZXJlbyBpbiIKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF9wY21fZG1hX3BhcmFtcyBzM2MyNHh4X2kyc19wY21fc3RlcmVvX291dCA9IHsKKwkuY2xpZW50CQk9ICZzM2MyNHh4X2RtYV9jbGllbnRfb3V0LAorCS5jaGFubmVsCT0gRE1BQ0hfSTJTX09VVCwKKwkuZG1hX2FkZHIJPSBTM0MyNDEwX1BBX0lJUyArIFMzQzI0MTBfSUlTRklGTywKKwkuZG1hX3NpemUJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNHh4X3BjbV9kbWFfcGFyYW1zIHMzYzI0eHhfaTJzX3BjbV9zdGVyZW9faW4gPSB7CisJLmNsaWVudAkJPSAmczNjMjR4eF9kbWFfY2xpZW50X2luLAorCS5jaGFubmVsCT0gRE1BQ0hfSTJTX0lOLAorCS5kbWFfYWRkcgk9IFMzQzI0MTBfUEFfSUlTICsgUzNDMjQxMF9JSVNGSUZPLAorCS5kbWFfc2l6ZQk9IDIsCit9OworCitzdHJ1Y3QgczNjMjR4eF9pMnNfaW5mbyB7CisJdm9pZCBfX2lvbWVtCSpyZWdzOworCXN0cnVjdCBjbGsJKmlpc19jbGs7Cit9Oworc3RhdGljIHN0cnVjdCBzM2MyNHh4X2kyc19pbmZvIHMzYzI0eHhfaTJzOworCitzdGF0aWMgdm9pZCBzM2MyNHh4X3NuZF90eGN0cmwoaW50IG9uKQoreworCXUzMiBpaXNmY29uOworCXUzMiBpaXNjb247CisJdTMyIGlpc21vZDsKKworCURCRygiRW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlpc2Zjb24gPSByZWFkbChzM2MyNHh4X2kycy5yZWdzICsgUzNDMjQxMF9JSVNGQ09OKTsKKwlpaXNjb24gID0gcmVhZGwoczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTQ09OKTsKKwlpaXNtb2QgID0gcmVhZGwoczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTTU9EKTsKKworCURCRygicjogSUlTQ09OOiAlbHggSUlTTU9EOiAlbHggSUlTRkNPTjogJWx4XG4iLCBpaXNjb24sIGlpc21vZCwgaWlzZmNvbik7CisKKwlpZiAob24pIHsKKwkJaWlzZmNvbiB8PSBTM0MyNDEwX0lJU0ZDT05fVFhETUEgfCBTM0MyNDEwX0lJU0ZDT05fVFhFTkFCTEU7CisJCWlpc2NvbiAgfD0gUzNDMjQxMF9JSVNDT05fVFhETUFFTiB8IFMzQzI0MTBfSUlTQ09OX0lJU0VOOworCQlpaXNjb24gICY9IH5TM0MyNDEwX0lJU0NPTl9UWElETEU7CisJCWlpc21vZCAgfD0gUzNDMjQxMF9JSVNNT0RfVFhNT0RFOworCisJCXdyaXRlbChpaXNtb2QsICBzM2MyNHh4X2kycy5yZWdzICsgUzNDMjQxMF9JSVNNT0QpOworCQl3cml0ZWwoaWlzZmNvbiwgczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTRkNPTik7CisJCXdyaXRlbChpaXNjb24sICBzM2MyNHh4X2kycy5yZWdzICsgUzNDMjQxMF9JSVNDT04pOworCX0gZWxzZSB7CisJCS8qIG5vdGUsIHdlIGhhdmUgdG8gZGlzYWJsZSB0aGUgRklGT3Mgb3RoZXJ3aXNlIGJhZCB0aGluZ3MKKwkJICogc2VlbSB0byBoYXBwZW4gd2hlbiB0aGUgRE1BIHN0b3BzLiBBY2NvcmRpbmcgdG8gdGhlCisJCSAqIFNhbXN1bmcgc3VwcGxpZWQga2VybmVsLCB0aGlzIHNob3VsZCBhbGxvdyB0aGUgRE1BCisJCSAqIGVuZ2luZSBhbmQgRklGT3MgdG8gcmVzZXQuIElmIHRoaXMgaXNuJ3QgYWxsb3dlZCwgdGhlCisJCSAqIERNQSBlbmdpbmUgd2lsbCBzaW1wbHkgZnJlZXplIHJhbmRvbWx5LgorCQkgKi8KKworCQlpaXNmY29uICY9IH5TM0MyNDEwX0lJU0ZDT05fVFhFTkFCTEU7CisJCWlpc2Zjb24gJj0gflMzQzI0MTBfSUlTRkNPTl9UWERNQTsKKwkJaWlzY29uICB8PSAgUzNDMjQxMF9JSVNDT05fVFhJRExFOworCQlpaXNjb24gICY9IH5TM0MyNDEwX0lJU0NPTl9UWERNQUVOOworCQlpaXNtb2QgICY9IH5TM0MyNDEwX0lJU01PRF9UWE1PREU7CisKKwkJd3JpdGVsKGlpc2NvbiwgIHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU0NPTik7CisJCXdyaXRlbChpaXNmY29uLCBzM2MyNHh4X2kycy5yZWdzICsgUzNDMjQxMF9JSVNGQ09OKTsKKwkJd3JpdGVsKGlpc21vZCwgIHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU01PRCk7CisJfQorCisJREJHKCJ3OiBJSVNDT046ICVseCBJSVNNT0Q6ICVseCBJSVNGQ09OOiAlbHhcbiIsIGlpc2NvbiwgaWlzbW9kLCBpaXNmY29uKTsKK30KKworc3RhdGljIHZvaWQgczNjMjR4eF9zbmRfcnhjdHJsKGludCBvbikKK3sKKwl1MzIgaWlzZmNvbjsKKwl1MzIgaWlzY29uOworCXUzMiBpaXNtb2Q7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpaXNmY29uID0gcmVhZGwoczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTRkNPTik7CisJaWlzY29uICA9IHJlYWRsKHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU0NPTik7CisJaWlzbW9kICA9IHJlYWRsKHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU01PRCk7CisKKwlEQkcoInI6IElJU0NPTjogJWx4IElJU01PRDogJWx4IElJU0ZDT046ICVseFxuIiwgaWlzY29uLCBpaXNtb2QsIGlpc2Zjb24pOworCisJaWYgKG9uKSB7CisJCWlpc2Zjb24gfD0gUzNDMjQxMF9JSVNGQ09OX1JYRE1BIHwgUzNDMjQxMF9JSVNGQ09OX1JYRU5BQkxFOworCQlpaXNjb24gIHw9IFMzQzI0MTBfSUlTQ09OX1JYRE1BRU4gfCBTM0MyNDEwX0lJU0NPTl9JSVNFTjsKKwkJaWlzY29uICAmPSB+UzNDMjQxMF9JSVNDT05fUlhJRExFOworCQlpaXNtb2QgIHw9IFMzQzI0MTBfSUlTTU9EX1JYTU9ERTsKKworCQl3cml0ZWwoaWlzbW9kLCAgczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTTU9EKTsKKwkJd3JpdGVsKGlpc2Zjb24sIHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU0ZDT04pOworCQl3cml0ZWwoaWlzY29uLCAgczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTQ09OKTsKKwl9IGVsc2UgeworCQkvKiBub3RlLCB3ZSBoYXZlIHRvIGRpc2FibGUgdGhlIEZJRk9zIG90aGVyd2lzZSBiYWQgdGhpbmdzCisJCSAqIHNlZW0gdG8gaGFwcGVuIHdoZW4gdGhlIERNQSBzdG9wcy4gQWNjb3JkaW5nIHRvIHRoZQorCQkgKiBTYW1zdW5nIHN1cHBsaWVkIGtlcm5lbCwgdGhpcyBzaG91bGQgYWxsb3cgdGhlIERNQQorCQkgKiBlbmdpbmUgYW5kIEZJRk9zIHRvIHJlc2V0LiBJZiB0aGlzIGlzbid0IGFsbG93ZWQsIHRoZQorCQkgKiBETUEgZW5naW5lIHdpbGwgc2ltcGx5IGZyZWV6ZSByYW5kb21seS4KKwkJICovCisKKyAgICAgICAgaWlzZmNvbiAmPSB+UzNDMjQxMF9JSVNGQ09OX1JYRU5BQkxFOworICAgICAgICBpaXNmY29uICY9IH5TM0MyNDEwX0lJU0ZDT05fUlhETUE7CisgICAgICAgIGlpc2NvbiAgfD0gUzNDMjQxMF9JSVNDT05fUlhJRExFOworICAgICAgICBpaXNjb24gICY9IH5TM0MyNDEwX0lJU0NPTl9SWERNQUVOOworCQlpaXNtb2QgICY9IH5TM0MyNDEwX0lJU01PRF9SWE1PREU7CisKKwkJd3JpdGVsKGlpc2Zjb24sIHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU0ZDT04pOworCQl3cml0ZWwoaWlzY29uLCAgczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTQ09OKTsKKwkJd3JpdGVsKGlpc21vZCwgIHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU01PRCk7CisJfQorCisJREJHKCJ3OiBJSVNDT046ICVseCBJSVNNT0Q6ICVseCBJSVNGQ09OOiAlbHhcbiIsIGlpc2NvbiwgaWlzbW9kLCBpaXNmY29uKTsKK30KKworLyoKKyAqIFdhaXQgZm9yIHRoZSBMUiBzaWduYWwgdG8gYWxsb3cgc3luY2hyb25pc2F0aW9uIHRvIHRoZSBML1IgY2xvY2sKKyAqIGZyb20gdGhlIGNvZGVjLiBNYXkgb25seSBiZSBuZWVkZWQgZm9yIHNsYXZlIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgczNjMjR4eF9zbmRfbHJzeW5jKHZvaWQpCit7CisJdTMyIGlpc2NvbjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1KTsKKworCURCRygiRW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCXdoaWxlICgxKSB7CisJCWlpc2NvbiA9IHJlYWRsKHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU0NPTik7CisJCWlmIChpaXNjb24gJiBTM0MyNDEwX0lJU0NPTl9MUklOREVYKQorCQkJYnJlYWs7CisKKwkJaWYgKHRpbWVvdXQgPCBqaWZmaWVzKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIENQVSBpcyB0aGUgbWFzdGVyIG9yIHNsYXZlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHMzYzI0eHhfc25kX2lzX2Nsa21hc3Rlcih2b2lkKQoreworCURCRygiRW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCXJldHVybiAocmVhZGwoczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTTU9EKSAmIFMzQzI0MTBfSUlTTU9EX1NMQVZFKSA/IDA6MTsKK30KKworLyoKKyAqIFNldCBTM0MyNHh4IEkyUyBEQUkgZm9ybWF0CisgKi8KK3N0YXRpYyBpbnQgczNjMjR4eF9pMnNfc2V0X2ZtdChzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXUzMiBpaXNtb2Q7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpaXNtb2QgPSByZWFkbChzM2MyNHh4X2kycy5yZWdzICsgUzNDMjQxMF9JSVNNT0QpOworCURCRygiaHdfcGFyYW1zIHI6IElJU01PRDogJWx4IFxuIiwgaWlzbW9kKTsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWlpc21vZCB8PSBTM0MyNDEwX0lJU01PRF9TTEFWRTsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCWlpc21vZCB8PSBTM0MyNDEwX0lJU01PRF9NU0I7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSTJTOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3cml0ZWwoaWlzbW9kLCBzM2MyNHh4X2kycy5yZWdzICsgUzNDMjQxMF9JSVNNT0QpOworCURCRygiaHdfcGFyYW1zIHc6IElJU01PRDogJWx4IFxuIiwgaWlzbW9kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNHh4X2kyc19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXUzMiBpaXNtb2Q7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcnRkLT5kYWktPmNwdV9kYWktPmRtYV9kYXRhID0gJnMzYzI0eHhfaTJzX3BjbV9zdGVyZW9fb3V0OworCWVsc2UKKwkJcnRkLT5kYWktPmNwdV9kYWktPmRtYV9kYXRhID0gJnMzYzI0eHhfaTJzX3BjbV9zdGVyZW9faW47CisKKwkvKiBXb3JraW5nIGNvcGllcyBvZiByZWdpc3RlciAqLworCWlpc21vZCA9IHJlYWRsKHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU01PRCk7CisJREJHKCJod19wYXJhbXMgcjogSUlTTU9EOiAlbHhcbiIsIGlpc21vZCk7CisKKwlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgeworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TODoKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJaWlzbW9kIHw9IFMzQzI0MTBfSUlTTU9EXzE2QklUOworCQlicmVhazsKKwl9CisKKwl3cml0ZWwoaWlzbW9kLCBzM2MyNHh4X2kycy5yZWdzICsgUzNDMjQxMF9JSVNNT0QpOworCURCRygiaHdfcGFyYW1zIHc6IElJU01PRDogJWx4XG4iLCBpaXNtb2QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzYzI0eHhfaTJzX3RyaWdnZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjbWQpCit7CisJaW50IHJldCA9IDA7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlpZiAoIXMzYzI0eHhfc25kX2lzX2Nsa21hc3RlcigpKSB7CisJCQlyZXQgPSBzM2MyNHh4X3NuZF9scnN5bmMoKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBleGl0X2VycjsKKwkJfQorCisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQlzM2MyNHh4X3NuZF9yeGN0cmwoMSk7CisJCWVsc2UKKwkJCXMzYzI0eHhfc25kX3R4Y3RybCgxKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCisJCQlzM2MyNHh4X3NuZF9yeGN0cmwoMCk7CisJCWVsc2UKKwkJCXMzYzI0eHhfc25kX3R4Y3RybCgwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCitleGl0X2VycjoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU2V0IFMzQzI0eHggQ2xvY2sgc291cmNlCisgKi8KK3N0YXRpYyBpbnQgczNjMjR4eF9pMnNfc2V0X3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpICpjcHVfZGFpLAorCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXUzMiBpaXNtb2QgPSByZWFkbChzM2MyNHh4X2kycy5yZWdzICsgUzNDMjQxMF9JSVNNT0QpOworCisJREJHKCJFbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWlzbW9kICY9IH5TM0MyNDQwX0lJU01PRF9NUExMOworCisJc3dpdGNoIChjbGtfaWQpIHsKKwljYXNlIFMzQzI0WFhfQ0xLU1JDX1BDTEs6CisJCWJyZWFrOworCWNhc2UgUzNDMjRYWF9DTEtTUkNfTVBMTDoKKwkJaWlzbW9kIHw9IFMzQzI0NDBfSUlTTU9EX01QTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdyaXRlbChpaXNtb2QsIHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU01PRCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgUzNDMjR4eCBDbG9jayBkaXZpZGVycworICovCitzdGF0aWMgaW50IHMzYzI0eHhfaTJzX3NldF9jbGtkaXYoc3RydWN0IHNuZF9zb2NfY3B1X2RhaSAqY3B1X2RhaSwKKwlpbnQgZGl2X2lkLCBpbnQgZGl2KQoreworCXUzMiByZWc7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzd2l0Y2ggKGRpdl9pZCkgeworCWNhc2UgUzNDMjRYWF9ESVZfTUNMSzoKKwkJcmVnID0gcmVhZGwoczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTTU9EKSAmIH5TM0MyNDEwX0lJU01PRF9GU19NQVNLOworCQl3cml0ZWwocmVnIHwgZGl2LCBzM2MyNHh4X2kycy5yZWdzICsgUzNDMjQxMF9JSVNNT0QpOworCQlicmVhazsKKwljYXNlIFMzQzI0WFhfRElWX0JDTEs6CisJCXJlZyA9IHJlYWRsKHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU01PRCkgJiB+KFMzQzI0MTBfSUlTTU9EXzM4NEZTKTsKKwkJd3JpdGVsKHJlZyB8IGRpdiwgczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTTU9EKTsKKwkJYnJlYWs7CisJY2FzZSBTM0MyNFhYX0RJVl9QUkVTQ0FMRVI6CisJCXdyaXRlbChkaXYsIHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU1BTUik7CisJCXJlZyA9IHJlYWRsKHMzYzI0eHhfaTJzLnJlZ3MgKyBTM0MyNDEwX0lJU0NPTik7CisJCXdyaXRlbChyZWcgfCBTM0MyNDEwX0lJU0NPTl9QU0NFTiwgczNjMjR4eF9pMnMucmVncyArIFMzQzI0MTBfSUlTQ09OKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUbyBhdm9pZCBkdXBsaWNhdGluZyBjbG9jayBjb2RlLCBhbGxvdyBtYWNoaW5lIGRyaXZlciB0bworICogZ2V0IHRoZSBjbG9ja3JhdGUgZnJvbSBoZXJlLgorICovCit1MzIgczNjMjR4eF9pMnNfZ2V0X2Nsb2NrcmF0ZSh2b2lkKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoczNjMjR4eF9pMnMuaWlzX2Nsayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzM2MyNHh4X2kyc19nZXRfY2xvY2tyYXRlKTsKKworc3RhdGljIGludCBzM2MyNHh4X2kyc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCURCRygiRW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCXMzYzI0eHhfaTJzLnJlZ3MgPSBpb3JlbWFwKFMzQzI0MTBfUEFfSUlTLCAweDEwMCk7CisJaWYgKHMzYzI0eHhfaTJzLnJlZ3MgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXMzYzI0eHhfaTJzLmlpc19jbGs9Y2xrX2dldCgmcGRldi0+ZGV2LCAiaWlzIik7CisJaWYgKHMzYzI0eHhfaTJzLmlpc19jbGsgPT0gTlVMTCkgeworCQlEQkcoImZhaWxlZCB0byBnZXQgaWlzX2Nsb2NrXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWNsa19lbmFibGUoczNjMjR4eF9pMnMuaWlzX2Nsayk7CisKKwkvKiBDb25maWd1cmUgdGhlIEkyUyBwaW5zIGluIGNvcnJlY3QgbW9kZSAqLworCXMzYzI0MTBfZ3Bpb19jZmdwaW4oUzNDMjQxMF9HUEUwLCBTM0MyNDEwX0dQRTBfSTJTTFJDSyk7CisJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRTEsIFMzQzI0MTBfR1BFMV9JMlNTQ0xLKTsKKwlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFMiwgUzNDMjQxMF9HUEUyX0NEQ0xLKTsKKwlzM2MyNDEwX2dwaW9fY2ZncGluKFMzQzI0MTBfR1BFMywgUzNDMjQxMF9HUEUzX0kyU1NESSk7CisJczNjMjQxMF9ncGlvX2NmZ3BpbihTM0MyNDEwX0dQRTQsIFMzQzI0MTBfR1BFNF9JMlNTRE8pOworCisJd3JpdGVsKFMzQzI0MTBfSUlTQ09OX0lJU0VOLCBzM2MyNHh4X2kycy5yZWdzICsgUzNDMjQxMF9JSVNDT04pOworCisJczNjMjR4eF9zbmRfdHhjdHJsKDApOworCXMzYzI0eHhfc25kX3J4Y3RybCgwKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFMzQzI0WFhfSTJTX1JBVEVTIFwKKwkoU05EUlZfUENNX1JBVEVfODAwMCB8IFNORFJWX1BDTV9SQVRFXzExMDI1IHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBcCisJU05EUlZfUENNX1JBVEVfMjIwNTAgfCBTTkRSVl9QQ01fUkFURV8zMjAwMCB8IFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgXAorCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCkKKworc3RydWN0IHNuZF9zb2NfY3B1X2RhaSBzM2MyNHh4X2kyc19kYWkgPSB7CisJLm5hbWUgPSAiczNjMjR4eC1pMnMiLAorCS5pZCA9IDAsCisJLnR5cGUgPSBTTkRfU09DX0RBSV9JMlMsCisJLnByb2JlID0gczNjMjR4eF9pMnNfcHJvYmUsCisJLnBsYXliYWNrID0geworCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFMzQzI0WFhfSTJTX1JBVEVTLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCS5jYXB0dXJlID0geworCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJLmNoYW5uZWxzX21heCA9IDIsCisJCS5yYXRlcyA9IFMzQzI0WFhfSTJTX1JBVEVTLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzggfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSx9LAorCS5vcHMgPSB7CisJCS50cmlnZ2VyID0gczNjMjR4eF9pMnNfdHJpZ2dlciwKKwkJLmh3X3BhcmFtcyA9IHMzYzI0eHhfaTJzX2h3X3BhcmFtcyx9LAorCS5kYWlfb3BzID0geworCQkuc2V0X2ZtdCA9IHMzYzI0eHhfaTJzX3NldF9mbXQsCisJCS5zZXRfY2xrZGl2ID0gczNjMjR4eF9pMnNfc2V0X2Nsa2RpdiwKKwkJLnNldF9zeXNjbGsgPSBzM2MyNHh4X2kyc19zZXRfc3lzY2xrLAorCX0sCit9OworRVhQT1JUX1NZTUJPTF9HUEwoczNjMjR4eF9pMnNfZGFpKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MsIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJzM2MyNHh4IEkyUyBTb0MgSW50ZXJmYWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4LWkycy5oIGIvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eC1pMnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzdiNGVjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eC1pMnMuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogczNjMjR4eC1pMnMuYyAgLS0gIEFMU0EgU29jIEF1ZGlvIExheWVyCisgKgorICogQ29weXJpZ2h0IDIwMDUgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqIEF1dGhvcjogR3JhZW1lIEdyZWdvcnkKKyAqICAgICAgICAgZ3JhZW1lLmdyZWdvcnlAd29sZnNvbm1pY3JvLmNvbSBvciBsaW51eEB3b2xmc29ubWljcm8uY29tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFJldmlzaW9uIGhpc3RvcnkKKyAqICAgIDEwdGggTm92IDIwMDYgICBJbml0aWFsIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBTM0MyNFhYSTJTX0hfCisjZGVmaW5lIFMzQzI0WFhJMlNfSF8KKworLyogY2xvY2sgc291cmNlcyAqLworI2RlZmluZSBTM0MyNFhYX0NMS1NSQ19QQ0xLIDAKKyNkZWZpbmUgUzNDMjRYWF9DTEtTUkNfTVBMTCAxCisKKy8qIENsb2NrIGRpdmlkZXJzICovCisjZGVmaW5lIFMzQzI0WFhfRElWX01DTEsJMAorI2RlZmluZSBTM0MyNFhYX0RJVl9CQ0xLCTEKKyNkZWZpbmUgUzNDMjRYWF9ESVZfUFJFU0NBTEVSCTIKKworLyogcHJlc2NhbGVyICovCisjZGVmaW5lIFMzQzI0WFhfUFJFU0NBTEUoYSxiKSBcCisJKCgoYSAtIDEpIDw8IFMzQzI0MTBfSUlTUFNSX0lOVFNISUZUKSB8ICgoYiAtIDEpIDw8IFMzQzI0MTBfSUlTUFNSX0VYVFNIRklUKSkKKwordTMyIHMzYzI0eHhfaTJzX2dldF9jbG9ja3JhdGUodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3Qgc25kX3NvY19jcHVfZGFpIHMzYzI0eHhfaTJzX2RhaTsKKworI2VuZGlmIC8qUzNDMjRYWEkyU19IXyovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvczNjMjR4eC9zM2MyNHh4LXBjbS5jIGIvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eC1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWRjNjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eC1wY20uYwpAQCAtMCwwICsxLDQ2OCBAQAorLyoKKyAqIHMzYzI0eHgtcGNtLmMgIC0tICBBTFNBIFNvYyBBdWRpbyBMYXllcgorICoKKyAqIChjKSAyMDA2IFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBQTEMuCisgKiBHcmFlbWUgR3JlZ29yeSBncmFlbWUuZ3JlZ29yeUB3b2xmc29ubWljcm8uY29tIG9yIGxpbnV4QHdvbGZzb25taWNyby5jb20KKyAqCisgKiAoYykgMjAwNC0yMDA1IFNpbXRlYyBFbGVjdHJvbmljcworICoJaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMTF0aCBEZWMgMjAwNiAgIE1lcmdlZCB3aXRoIFNpbXRlYyBkcml2ZXIKKyAqICAgIDEwdGggTm92IDIwMDYgICBJbml0aWFsIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvYXVkaW8uaD4KKworI2luY2x1ZGUgInMzYzI0eHgtcGNtLmgiCisKKyNkZWZpbmUgUzNDMjRYWF9QQ01fREVCVUcgMAorI2lmIFMzQzI0WFhfUENNX0RFQlVHCisjZGVmaW5lIERCRyh4Li4uKSBwcmludGsoS0VSTl9ERUJVRyB4KQorI2Vsc2UKKyNkZWZpbmUgREJHKHguLi4pCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHMzYzI0eHhfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQkJICAgIFNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCQkgICAgU05EUlZfUENNX0lORk9fTU1BUCB8CisJCQkJICAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQsCisJLmZvcm1hdHMJCT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1UxNl9MRSB8CisJCQkJICAgIFNORFJWX1BDTV9GTVRCSVRfVTggfAorCQkJCSAgICBTTkRSVl9QQ01fRk1UQklUX1M4LAorCS5jaGFubmVsc19taW4JCT0gMiwKKwkuY2hhbm5lbHNfbWF4CQk9IDIsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSAxMjgqMTAyNCwKKwkucGVyaW9kX2J5dGVzX21pbgk9IFBBR0VfU0laRSwKKwkucGVyaW9kX2J5dGVzX21heAk9IFBBR0VfU0laRSoyLAorCS5wZXJpb2RzX21pbgkJPSAyLAorCS5wZXJpb2RzX21heAkJPSAxMjgsCisJLmZpZm9fc2l6ZQkJPSAzMiwKK307CisKK3N0cnVjdCBzM2MyNHh4X3J1bnRpbWVfZGF0YSB7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCBzdGF0ZTsKKwl1bnNpZ25lZCBpbnQgZG1hX2xvYWRlZDsKKwl1bnNpZ25lZCBpbnQgZG1hX2xpbWl0OworCXVuc2lnbmVkIGludCBkbWFfcGVyaW9kOworCWRtYV9hZGRyX3QgZG1hX3N0YXJ0OworCWRtYV9hZGRyX3QgZG1hX3BvczsKKwlkbWFfYWRkcl90IGRtYV9lbmQ7CisJc3RydWN0IHMzYzI0eHhfcGNtX2RtYV9wYXJhbXMgKnBhcmFtczsKK307CisKKy8qIHMzYzI0eHhfcGNtX2VucXVldWUKKyAqCisgKiBwbGFjZSBhIGRtYSBidWZmZXIgb250byB0aGUgcXVldWUgZm9yIHRoZSBkbWEgc3lzdGVtCisgKiB0byBoYW5kbGUuCisqLworc3RhdGljIHZvaWQgczNjMjR4eF9wY21fZW5xdWV1ZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlkbWFfYWRkcl90IHBvcyA9IHBydGQtPmRtYV9wb3M7CisJaW50IHJldDsKKworCURCRygiRW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCXdoaWxlIChwcnRkLT5kbWFfbG9hZGVkIDwgcHJ0ZC0+ZG1hX2xpbWl0KSB7CisJCXVuc2lnbmVkIGxvbmcgbGVuID0gcHJ0ZC0+ZG1hX3BlcmlvZDsKKworCQlEQkcoImRtYV9sb2FkZWQ6ICVkXG4iLHBydGQtPmRtYV9sb2FkZWQpOworCisJCWlmICgocG9zICsgbGVuKSA+IHBydGQtPmRtYV9lbmQpIHsKKwkJCWxlbiAgPSBwcnRkLT5kbWFfZW5kIC0gcG9zOworCQkJREJHKEtFUk5fREVCVUcgIiVzOiBjb3JyZWN0ZWQgZG1hIGxlbiAlbGRcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBsZW4pOworCQl9CisKKwkJcmV0ID0gczNjMjQxMF9kbWFfZW5xdWV1ZShwcnRkLT5wYXJhbXMtPmNoYW5uZWwsIAorCQkJc3Vic3RyZWFtLCBwb3MsIGxlbik7CisKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlwcnRkLT5kbWFfbG9hZGVkKys7CisJCQlwb3MgKz0gcHJ0ZC0+ZG1hX3BlcmlvZDsKKwkJCWlmIChwb3MgPj0gcHJ0ZC0+ZG1hX2VuZCkKKwkJCQlwb3MgPSBwcnRkLT5kbWFfc3RhcnQ7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJcHJ0ZC0+ZG1hX3BvcyA9IHBvczsKK30KKworc3RhdGljIHZvaWQgczNjMjR4eF9hdWRpb19idWZmZG9uZShzdHJ1Y3QgczNjMjQxMF9kbWFfY2hhbiAqY2hhbm5lbCwKKwkJCQl2b2lkICpkZXZfaWQsIGludCBzaXplLAorCQkJCWVudW0gczNjMjQxMF9kbWFfYnVmZnJlc3VsdCByZXN1bHQpCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBkZXZfaWQ7CisJc3RydWN0IHMzYzI0eHhfcnVudGltZV9kYXRhICpwcnRkOworCisJREJHKCJFbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKHJlc3VsdCA9PSBTM0MyNDEwX1JFU19BQk9SVCB8fCByZXN1bHQgPT0gUzNDMjQxMF9SRVNfRVJSKQorCQlyZXR1cm47CisKKwlwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJCisJaWYgKHN1YnN0cmVhbSkKKwkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCisJc3Bpbl9sb2NrKCZwcnRkLT5sb2NrKTsKKwlpZiAocHJ0ZC0+c3RhdGUgJiBTVF9SVU5OSU5HKSB7CisJCXBydGQtPmRtYV9sb2FkZWQtLTsKKwkJczNjMjR4eF9wY21fZW5xdWV1ZShzdWJzdHJlYW0pOworCX0KKworCXNwaW5fdW5sb2NrKCZwcnRkLT5sb2NrKTsKK30KKworc3RhdGljIGludCBzM2MyNHh4X3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzM2MyNHh4X3BjbV9kbWFfcGFyYW1zICpkbWEgPSBydGQtPmRhaS0+Y3B1X2RhaS0+ZG1hX2RhdGE7CisJdW5zaWduZWQgbG9uZyB0b3RieXRlcyA9IHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKTsKKwlpbnQgcmV0PTA7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkvKiByZXR1cm4gaWYgdGhpcyBpcyBhIGJ1ZmZlcmxlc3MgdHJhbnNmZXIgZS5nLgorCSAqIGNvZGVjIDwtLT4gQlQgY29kZWMgb3IgR1NNIG1vZGVtIC0tIGxnIEZJWE1FICovCisJaWYgKCFkbWEpCisJCXJldHVybiAwOworCisJLyogcHJlcGFyZSBETUEgKi8KKwlwcnRkLT5wYXJhbXMgPSBkbWE7CisKKwlEQkcoInBhcmFtcyAlcCwgY2xpZW50ICVwLCBjaGFubmVsICVkXG4iLCBwcnRkLT5wYXJhbXMsCisJCXBydGQtPnBhcmFtcy0+Y2xpZW50LCBwcnRkLT5wYXJhbXMtPmNoYW5uZWwpOworCisJcmV0ID0gczNjMjQxMF9kbWFfcmVxdWVzdChwcnRkLT5wYXJhbXMtPmNoYW5uZWwsCisJCQkJICBwcnRkLT5wYXJhbXMtPmNsaWVudCwgTlVMTCk7CisKKwlpZiAocmV0KSB7CisJCURCRyhLRVJOX0VSUiAiZmFpbGVkIHRvIGdldCBkbWEgY2hhbm5lbFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogY2hhbm5lbCBuZWVkcyBjb25maWd1cmluZyBmb3IgbWVtPT5kZXZpY2UsIGluY3JlbWVudCBtZW1vcnkgYWRkciwKKwkgKiBzeW5jIHRvIHBjbGssIGhhbGYtd29yZCB0cmFuc2ZlcnMgdG8gdGhlIElJUy1GSUZPLiAqLworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7CisJCXMzYzI0MTBfZG1hX2RldmNvbmZpZyhwcnRkLT5wYXJhbXMtPmNoYW5uZWwsCisJCQkJUzNDMjQxMF9ETUFTUkNfTUVNLCBTM0MyNDEwX0RJU1JDQ19JTkMgfAorCQkJCVMzQzI0MTBfRElTUkNDX0FQQiwgcHJ0ZC0+cGFyYW1zLT5kbWFfYWRkcik7CisKKwkJczNjMjQxMF9kbWFfY29uZmlnKHBydGQtPnBhcmFtcy0+Y2hhbm5lbCwKKwkJCQlwcnRkLT5wYXJhbXMtPmRtYV9zaXplLAorCQkJCVMzQzI0MTBfRENPTl9TWU5DX1BDTEsgfCAKKwkJCQlTM0MyNDEwX0RDT05fSEFORFNIQUtFKTsKKwl9IGVsc2UgeworCQlzM2MyNDEwX2RtYV9jb25maWcocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLAorCQkJCXBydGQtPnBhcmFtcy0+ZG1hX3NpemUsCisJCQkJUzNDMjQxMF9EQ09OX0hBTkRTSEFLRSB8IAorCQkJCVMzQzI0MTBfRENPTl9TWU5DX1BDTEspOworCisJCXMzYzI0MTBfZG1hX2RldmNvbmZpZyhwcnRkLT5wYXJhbXMtPmNoYW5uZWwsCisJCQkJCVMzQzI0MTBfRE1BU1JDX0hXLCAweDMsCisJCQkJCXBydGQtPnBhcmFtcy0+ZG1hX2FkZHIpOworCX0KKworCXMzYzI0MTBfZG1hX3NldF9idWZmZG9uZV9mbihwcnRkLT5wYXJhbXMtPmNoYW5uZWwsCisJCQkJICAgIHMzYzI0eHhfYXVkaW9fYnVmZmRvbmUpOworCisJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKKworCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IHRvdGJ5dGVzOworCisJc3Bpbl9sb2NrX2lycSgmcHJ0ZC0+bG9jayk7CisJcHJ0ZC0+ZG1hX2xvYWRlZCA9IDA7CisJcHJ0ZC0+ZG1hX2xpbWl0ID0gcnVudGltZS0+aHcucGVyaW9kc19taW47CisJcHJ0ZC0+ZG1hX3BlcmlvZCA9IHBhcmFtc19wZXJpb2RfYnl0ZXMocGFyYW1zKTsKKwlwcnRkLT5kbWFfc3RhcnQgPSBydW50aW1lLT5kbWFfYWRkcjsKKwlwcnRkLT5kbWFfcG9zID0gcHJ0ZC0+ZG1hX3N0YXJ0OworCXBydGQtPmRtYV9lbmQgPSBwcnRkLT5kbWFfc3RhcnQgKyB0b3RieXRlczsKKwlzcGluX3VubG9ja19pcnEoJnBydGQtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjR4eF9wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKworCURCRygiRW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIFRPRE8gLSBkbyB3ZSBuZWVkIHRvIGVuc3VyZSBETUEgZmx1c2hlZCAqLworCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgTlVMTCk7CisKKwlpZiAocHJ0ZC0+cGFyYW1zKSB7CisJCXMzYzI0MTBfZG1hX2ZyZWUocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLCBwcnRkLT5wYXJhbXMtPmNsaWVudCk7CisJCXBydGQtPnBhcmFtcyA9IE5VTEw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjR4eF9wY21fcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCURCRygiRW50ZXJlZCAlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCS8qIHJldHVybiBpZiB0aGlzIGlzIGEgYnVmZmVybGVzcyB0cmFuc2ZlciBlLmcuCisJICogY29kZWMgPC0tPiBCVCBjb2RlYyBvciBHU00gbW9kZW0gLS0gbGcgRklYTUUgKi8KKwlpZiAoIXBydGQtPnBhcmFtcykKKwkgCXJldHVybiAwOworCisJLyogZmx1c2ggdGhlIERNQSBjaGFubmVsICovCisJczNjMjQxMF9kbWFfY3RybChwcnRkLT5wYXJhbXMtPmNoYW5uZWwsIFMzQzI0MTBfRE1BT1BfRkxVU0gpOworCXBydGQtPmRtYV9sb2FkZWQgPSAwOworCXBydGQtPmRtYV9wb3MgPSBwcnRkLT5kbWFfc3RhcnQ7CisKKwkvKiBlbnF1ZXVlIGRtYSBidWZmZXJzICovCisJczNjMjR4eF9wY21fZW5xdWV1ZShzdWJzdHJlYW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzM2MyNHh4X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBzM2MyNHh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQgPSAwOworCisJREJHKCJFbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3Bpbl9sb2NrKCZwcnRkLT5sb2NrKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCXBydGQtPnN0YXRlIHw9IFNUX1JVTk5JTkc7CisJCXMzYzI0MTBfZG1hX2N0cmwocHJ0ZC0+cGFyYW1zLT5jaGFubmVsLCBTM0MyNDEwX0RNQU9QX1NUQVJUKTsKKwkJczNjMjQxMF9kbWFfY3RybChwcnRkLT5wYXJhbXMtPmNoYW5uZWwsIFMzQzI0MTBfRE1BT1BfU1RBUlRFRCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXBydGQtPnN0YXRlICY9IH5TVF9SVU5OSU5HOworCQlzM2MyNDEwX2RtYV9jdHJsKHBydGQtPnBhcmFtcy0+Y2hhbm5lbCwgUzNDMjQxMF9ETUFPUF9TVE9QKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9jaygmcHJ0ZC0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgCisJczNjMjR4eF9wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzM2MyNHh4X3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHJlczsKKwlkbWFfYWRkcl90IHNyYywgZHN0OworCisJREJHKCJFbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc3Bpbl9sb2NrKCZwcnRkLT5sb2NrKTsKKwlzM2MyNDEwX2RtYV9nZXRwb3NpdGlvbihwcnRkLT5wYXJhbXMtPmNoYW5uZWwsICZzcmMsICZkc3QpOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwkJcmVzID0gZHN0IC0gcHJ0ZC0+ZG1hX3N0YXJ0OworCWVsc2UKKwkJcmVzID0gc3JjIC0gcHJ0ZC0+ZG1hX3N0YXJ0OworCisJc3Bpbl91bmxvY2soJnBydGQtPmxvY2spOworCisJREJHKCJQb2ludGVyICV4ICV4XG4iLHNyYyxkc3QpOworCisJLyogd2Ugc2VlbSB0byBiZSBnZXR0aW5nIHRoZSBvZGQgZXJyb3IgZnJvbSB0aGUgcGNtIGxpYnJhcnkgZHVlCisJICogdG8gb3V0LW9mLWJvdW5kcyBwb2ludGVycy4gdGhpcyBpcyBtYXliZSBkdWUgdG8gdGhlIGRtYSBlbmdpbmUKKwkgKiBub3QgaGF2aW5nIGxvYWRlZCB0aGUgbmV3IHZhbHVlcyBmb3IgdGhlIGNoYW5uZWwgYmVmb3JlIGJlaW5nCisJICogY2FsbGxlZC4uLiAodG9kbyAtIGZpeCApCisJICovCisKKwlpZiAocmVzID49IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pKSB7CisJCWlmIChyZXMgPT0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkpCisJCQlyZXMgPSAwOworCX0KKworCXJldHVybiBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCByZXMpOworfQorCitzdGF0aWMgaW50IHMzYzI0eHhfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQ7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJnMzYzI0eHhfcGNtX2hhcmR3YXJlKTsKKworCXBydGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJ0ZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHBydGQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjR4eF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3QgczNjMjR4eF9ydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAocHJ0ZCkKKwkJa2ZyZWUocHJ0ZCk7CisJZWxzZQorCQlEQkcoInMzYzI0eHhfcGNtX2Nsb3NlIGNhbGxlZCB3aXRoIHBydGQgPT0gTlVMTFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNHh4X3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlyZXR1cm4gZG1hX21tYXBfd3JpdGVjb21iaW5lKHN1YnN0cmVhbS0+cGNtLT5jYXJkLT5kZXYsIHZtYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lLT5kbWFfYXJlYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lLT5kbWFfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lLT5kbWFfYnl0ZXMpOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHMzYzI0eHhfcGNtX29wcyA9IHsKKwkub3BlbgkJPSBzM2MyNHh4X3BjbV9vcGVuLAorCS5jbG9zZQkJPSBzM2MyNHh4X3BjbV9jbG9zZSwKKwkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcwk9IHMzYzI0eHhfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZQk9IHMzYzI0eHhfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUJPSBzM2MyNHh4X3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyCT0gczNjMjR4eF9wY21fdHJpZ2dlciwKKwkucG9pbnRlcgk9IHMzYzI0eHhfcGNtX3BvaW50ZXIsCisJLm1tYXAJCT0gczNjMjR4eF9wY21fbW1hcCwKK307CisKK3N0YXRpYyBpbnQgczNjMjR4eF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihzdHJ1Y3Qgc25kX3BjbSAqcGNtLCBpbnQgc3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwlzaXplX3Qgc2l6ZSA9IHMzYzI0eHhfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXg7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlidWYtPmRldi50eXBlID0gU05EUlZfRE1BX1RZUEVfREVWOworCWJ1Zi0+ZGV2LmRldiA9IHBjbS0+Y2FyZC0+ZGV2OworCWJ1Zi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlidWYtPmFyZWEgPSBkbWFfYWxsb2Nfd3JpdGVjb21iaW5lKHBjbS0+Y2FyZC0+ZGV2LCBzaXplLAorCQkJCQkgICAmYnVmLT5hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zi0+YXJlYSkKKwkJcmV0dXJuIC1FTk9NRU07CisJYnVmLT5ieXRlcyA9IHNpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHMzYzI0eHhfcGNtX2ZyZWVfZG1hX2J1ZmZlcnMoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZjsKKwlpbnQgc3RyZWFtOworCisJREJHKCJFbnRlcmVkICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJZm9yIChzdHJlYW0gPSAwOyBzdHJlYW0gPCAyOyBzdHJlYW0rKykgeworCQlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07CisJCWlmICghc3Vic3RyZWFtKQorCQkJY29udGludWU7CisKKwkJYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwkJaWYgKCFidWYtPmFyZWEpCisJCQljb250aW51ZTsKKworCQlkbWFfZnJlZV93cml0ZWNvbWJpbmUocGNtLT5jYXJkLT5kZXYsIGJ1Zi0+Ynl0ZXMsCisJCQkJICAgICAgYnVmLT5hcmVhLCBidWYtPmFkZHIpOworCQlidWYtPmFyZWEgPSBOVUxMOworCX0KK30KKworc3RhdGljIHU2NCBzM2MyNHh4X3BjbV9kbWFtYXNrID0gRE1BXzMyQklUX01BU0s7CisKK3N0YXRpYyBpbnQgczNjMjR4eF9wY21fbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgCisJc3RydWN0IHNuZF9zb2NfY29kZWNfZGFpICpkYWksIHN0cnVjdCBzbmRfcGNtICpwY20pCit7CisJaW50IHJldCA9IDA7CisKKwlEQkcoIkVudGVyZWQgJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIWNhcmQtPmRldi0+ZG1hX21hc2spCisJCWNhcmQtPmRldi0+ZG1hX21hc2sgPSAmczNjMjR4eF9wY21fZG1hbWFzazsKKwlpZiAoIWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWNhcmQtPmRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSAweGZmZmZmZmZmOworCisJaWYgKGRhaS0+cGxheWJhY2suY2hhbm5lbHNfbWluKSB7CisJCXJldCA9IHMzYzI0eHhfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIocGNtLAorCQkJU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGFpLT5jYXB0dXJlLmNoYW5uZWxzX21pbikgeworCQlyZXQgPSBzM2MyNHh4X3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKKwkJCVNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9Cisgb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBzbmRfc29jX3BsYXRmb3JtIHMzYzI0eHhfc29jX3BsYXRmb3JtID0geworCS5uYW1lCQk9ICJzM2MyNHh4LWF1ZGlvIiwKKwkucGNtX29wcyAJPSAmczNjMjR4eF9wY21fb3BzLAorCS5wY21fbmV3CT0gczNjMjR4eF9wY21fbmV3LAorCS5wY21fZnJlZQk9IHMzYzI0eHhfcGNtX2ZyZWVfZG1hX2J1ZmZlcnMsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChzM2MyNHh4X3NvY19wbGF0Zm9ybSk7CisKK01PRFVMRV9BVVRIT1IoIkJlbiBEb29rcywgPGJlbkBzaW10ZWMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgUzNDMjRYWCBQQ00gRE1BIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3MzYzI0eHgvczNjMjR4eC1wY20uaCBiL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHgtcGNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4OGM3OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zM2MyNHh4L3MzYzI0eHgtcGNtLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqICBzM2MyNHh4LXBjbS5oIC0tCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIEFMU0EgUENNIGludGVyZmFjZSBmb3IgdGhlIFNhbXN1bmcgUzNDMjR4eCBDUFUKKyAqLworCisjaWZuZGVmIF9TM0MyNFhYX1BDTV9ICisjZGVmaW5lIF9TM0MyNFhYX1BDTV9ICisKKyNkZWZpbmUgU1RfUlVOTklORwkJKDE8PDApCisjZGVmaW5lIFNUX09QRU5FRAkJKDE8PDEpCisKK3N0cnVjdCBzM2MyNHh4X3BjbV9kbWFfcGFyYW1zIHsKKwlzdHJ1Y3QgczNjMjQxMF9kbWFfY2xpZW50ICpjbGllbnQ7CS8qIHN0cmVhbSBpZGVudGlmaWVyICovCisJaW50IGNoYW5uZWw7CQkJCS8qIENoYW5uZWwgSUQgKi8KKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCWludCBkbWFfc2l6ZTsJCQkvKiBTaXplIG9mIHRoZSBETUEgdHJhbnNmZXIgKi8KK307CisKKyNkZWZpbmUgUzNDMjRYWF9EQUlfSTJTCQkJMAorCisvKiBwbGF0Zm9ybSBkYXRhICovCitleHRlcm4gc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gczNjMjR4eF9zb2NfcGxhdGZvcm07CitleHRlcm4gc3RydWN0IHNuZF9hYzk3X2J1c19vcHMgczNjMjR4eF9hYzk3X29wczsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWRhcG0uYyBiL3NvdW5kL3NvYy9zb2MtZGFwbS5jCmluZGV4IDdjYWY4YzcuLjk2YmNlNTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtZGFwbS5jCkBAIC04ODIsMTMgKzg4MiwxNSBAQAogCWlmICh3c2luay0+aWQgPT0gc25kX3NvY19kYXBtX2lucHV0KSB7CiAJCWlmICh3c291cmNlLT5pZCA9PSBzbmRfc29jX2RhcG1fbWljYmlhcyB8fAogCQkJd3NvdXJjZS0+aWQgPT0gc25kX3NvY19kYXBtX21pYyB8fAotCQkJd3NpbmstPmlkID09IHNuZF9zb2NfZGFwbV9saW5lKQorCQkJd3NpbmstPmlkID09IHNuZF9zb2NfZGFwbV9saW5lIHx8CisJCQl3c2luay0+aWQgPT0gc25kX3NvY19kYXBtX291dHB1dCkKIAkJCXdzaW5rLT5leHQgPSAxOwogCX0KIAlpZiAod3NvdXJjZS0+aWQgPT0gc25kX3NvY19kYXBtX291dHB1dCkgewogCQlpZiAod3NpbmstPmlkID09IHNuZF9zb2NfZGFwbV9zcGsgfHwKIAkJCXdzaW5rLT5pZCA9PSBzbmRfc29jX2RhcG1faHAgfHwKLQkJCXdzaW5rLT5pZCA9PSBzbmRfc29jX2RhcG1fbGluZSkKKwkJCXdzaW5rLT5pZCA9PSBzbmRfc29jX2RhcG1fbGluZSB8fAorCQkJd3NpbmstPmlkID09IHNuZF9zb2NfZGFwbV9pbnB1dCkKIAkJCXdzb3VyY2UtPmV4dCA9IDE7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9zcGFyYy9jczQyMzEuYyBiL3NvdW5kL3NwYXJjL2NzNDIzMS5jCmluZGV4IDkwMGEwMGQuLmRjYTAzNDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NwYXJjL2NzNDIzMS5jCisrKyBiL3NvdW5kL3NwYXJjL2NzNDIzMS5jCkBAIC02NjEsMTEgKzY2MSw5IEBACiAJewogCQl1bnNpZ25lZCBpbnQgd2hhdCA9IDA7CiAJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqczsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCXNuZF9wY21fZ3JvdXBfZm9yX2VhY2gocG9zLCBzdWJzdHJlYW0pIHsKLQkJCXMgPSBzbmRfcGNtX2dyb3VwX3N1YnN0cmVhbV9lbnRyeShwb3MpOworCQlzbmRfcGNtX2dyb3VwX2Zvcl9lYWNoX2VudHJ5KHMsIHN1YnN0cmVhbSkgewogCQkJaWYgKHMgPT0gY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKSB7CiAJCQkJd2hhdCB8PSBDUzQyMzFfUExBWUJBQ0tfRU5BQkxFOwogCQkJCXNuZF9wY21fdHJpZ2dlcl9kb25lKHMsIHN1YnN0cmVhbSk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvS2NvbmZpZyBiL3NvdW5kL3VzYi9LY29uZmlnCmluZGV4IGYwNWQwMmYuLjMxNTM2MGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9LY29uZmlnCisrKyBiL3NvdW5kL3VzYi9LY29uZmlnCkBAIC0yOSw1ICsyOSwzMyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgc25kLXVzYi11c3gyeS4KIAorY29uZmlnIFNORF9VU0JfQ0FJQVEKKwl0cmlzdGF0ZSAiTmF0aXZlIEluc3RydW1lbnRzIFVTQiBhdWRpbyBkZXZpY2VzIgorCSBkZXBlbmRzIG9uIFNORCAmJiBVU0IKKwkgc2VsZWN0IFNORF9IV0RFUAorCSBzZWxlY3QgU05EX1JBV01JREkKKwkgc2VsZWN0IFNORF9QQ00KKwkgaGVscAorCSAgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBjYWlhcSBVU0IgYXVkaW8gaW50ZXJmYWNlcywKKwkgICBuYW1lbHk6CisKKwkgICAgKiBOYXRpdmUgSW5zdHJ1bWVudHMgUmlnS29udHJvbDIKKwkgICAgKiBOYXRpdmUgSW5zdHJ1bWVudHMgS29yZSBDb250cm9sbGVyCisJICAgICogTmF0aXZlIEluc3RydW1lbnRzIEF1ZGlvIEtvbnRyb2wgMQorCSAgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBBdWRpbyA4IERKCisKKwkgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICAgd2lsbCBiZSBjYWxsZWQgc25kLXVzYi1jYWlhcS4KKworY29uZmlnIFNORF9VU0JfQ0FJQVFfSU5QVVQKKwlib29sICJlbmFibGUgaW5wdXQgZGV2aWNlIGZvciBjb250cm9sbGVycyIKKwlkZXBlbmRzIG9uIFNORF9VU0JfQ0FJQVEKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgaW5wdXQgY29udHJvbGxlcnMgbGlrZSBidXR0b25zLCBrbm9icywKKwkgIGFscGhhIGRpYWxzIGFuZCBhbmFsb2cgcGVkYWxzIG9uIHRoZSBmb2xsb3dpbmcgcHJvZHVjdHM6CisKKwkgICAqIE5hdGl2ZSBJbnN0cnVtZW50cyBSaWdLb250cm9sMgorCSAgICogTmF0aXZlIEluc3RydW1lbnRzIEF1ZGlvIEtvbnRyb2wgMQorCiBlbmRtZW51CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9NYWtlZmlsZSBiL3NvdW5kL3VzYi9NYWtlZmlsZQppbmRleCAyYzFkYzExLi5hYTI1MmVmIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvTWFrZWZpbGUKKysrIGIvc291bmQvdXNiL01ha2VmaWxlCkBAIC05LDQgKzksNCBAQAogb2JqLSQoQ09ORklHX1NORF9VU0JfQVVESU8pICs9IHNuZC11c2ItYXVkaW8ubyBzbmQtdXNiLWxpYi5vCiBvYmotJChDT05GSUdfU05EX1VTQl9VU1gyWSkgKz0gc25kLXVzYi1saWIubwogCi1vYmotJChDT05GSUdfU05EKSArPSB1c3gyeS8KK29iai0kKENPTkZJR19TTkQpICs9IHVzeDJ5LyBjYWlhcS8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYWlhcS9NYWtlZmlsZSBiL3NvdW5kL3VzYi9jYWlhcS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTVjOGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL2NhaWFxL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorc25kLXVzYi1jYWlhcS1vYmpzIDo9IGNhaWFxLWRldmljZS5vIGNhaWFxLWF1ZGlvLm8gY2FpYXEtbWlkaS5vIGNhaWFxLWlucHV0Lm8KKworb2JqLSQoQ09ORklHX1NORF9VU0JfQ0FJQVEpICs9IHNuZC11c2ItY2FpYXEubwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2NhaWFxL2NhaWFxLWF1ZGlvLmMgYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDE0ZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL2NhaWFxL2NhaWFxLWF1ZGlvLmMKQEAgLTAsMCArMSw3MDcgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgMjAwNiwyMDA3IERhbmllbCBNYWNrLCBLYXJzdGVuIFdpZXNlCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CisjaWZkZWYgQ09ORklHX1NORF9VU0JfQ0FJQVFfSU5QVVQKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJjYWlhcS1kZXZpY2UuaCIKKyNpbmNsdWRlICJjYWlhcS1hdWRpby5oIgorCisjZGVmaW5lIE5fVVJCUwkJCTMyCisjZGVmaW5lIENMT0NLX0RSSUZUX1RPTEVSQU5DRQk1CisjZGVmaW5lIEZSQU1FU19QRVJfVVJCCQk4CisjZGVmaW5lIEJZVEVTX1BFUl9GUkFNRQkJNTEyCisjZGVmaW5lIENIQU5ORUxTX1BFUl9TVFJFQU0JMgorI2RlZmluZSBCWVRFU19QRVJfU0FNUExFCTMKKyNkZWZpbmUgQllURVNfUEVSX1NBTVBMRV9VU0IJNAorI2RlZmluZSBNQVhfQlVGRkVSX1NJWkUJCSgxMjgqMTAyNCkKKwkJCQkgCisjZGVmaW5lIEVORFBPSU5UX0NBUFRVUkUJMgorI2RlZmluZSBFTkRQT0lOVF9QTEFZQkFDSwk2CisKKyNkZWZpbmUgTUFLRV9DSEVDS0JZVEUoZGV2LHN0cmVhbSxpKSBcCisJKHN0cmVhbSA8PCAxKSB8ICh+KGkgLyAoZGV2LT5uX3N0cmVhbXMgKiBCWVRFU19QRVJfU0FNUExFX1VTQikpICYgMSkKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF91c2JfY2FpYXFfcGNtX2hhcmR3YXJlID0geworCS5pbmZvIAkJPSAoU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwgCisJCQkgICBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiksCisJLmZvcm1hdHMgCT0gU05EUlZfUENNX0ZNVEJJVF9TMjRfM0JFLAorCS5yYXRlcyAJCT0gKFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgU05EUlZfUENNX1JBVEVfNDgwMDAgfCAKKwkJCSAgIFNORFJWX1BDTV9SQVRFXzk2MDAwKSwKKwkucmF0ZV9taW4JPSA0NDEwMCwKKwkucmF0ZV9tYXgJPSAwLCAvKiB3aWxsIG92ZXJ3cml0ZSBsYXRlciAqLworCS5jaGFubmVsc19taW4JPSBDSEFOTkVMU19QRVJfU1RSRUFNLAorCS5jaGFubmVsc19tYXgJPSBDSEFOTkVMU19QRVJfU1RSRUFNLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gTUFYX0JVRkZFUl9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gNDA5NiwKKwkucGVyaW9kX2J5dGVzX21heCA9IE1BWF9CVUZGRVJfU0laRSwKKwkucGVyaW9kc19taW4JPSAxLAorCS5wZXJpb2RzX21heAk9IDEwMjQsCit9OworCitzdGF0aWMgdm9pZAorYWN0aXZhdGVfc3Vic3RyZWFtKHN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYsCisJICAgICAgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YikKK3sKKwlpZiAoc3ViLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJZGV2LT5zdWJfcGxheWJhY2tbc3ViLT5udW1iZXJdID0gc3ViOworCWVsc2UKKwkJZGV2LT5zdWJfY2FwdHVyZVtzdWItPm51bWJlcl0gPSBzdWI7Cit9CisKK3N0YXRpYyB2b2lkIAorZGVhY3RpdmF0ZV9zdWJzdHJlYW0oc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiwKKwkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YikKK3sKKwlpZiAoc3ViLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJZGV2LT5zdWJfcGxheWJhY2tbc3ViLT5udW1iZXJdID0gTlVMTDsKKwllbHNlCisJCWRldi0+c3ViX2NhcHR1cmVbc3ViLT5udW1iZXJdID0gTlVMTDsKK30KKworc3RhdGljIGludAorYWxsX3N1YnN0cmVhbXNfemVybyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKipzdWJzKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1RSRUFNUzsgaSsrKQorCQlpZiAoc3Vic1tpXSAhPSBOVUxMKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc3RyZWFtX3N0YXJ0KHN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYpCit7CisJaW50IGksIHJldDsKKworCWRlYnVnKCJzdHJlYW1fc3RhcnQoJXApXG4iLCBkZXYpOworCXNwaW5fbG9ja19pcnEoJmRldi0+c3BpbmxvY2spOworCWlmIChkZXYtPnN0cmVhbWluZykgeworCQlzcGluX3VubG9ja19pcnEoJmRldi0+c3BpbmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXYtPmlucHV0X3BhbmljID0gMDsKKwlkZXYtPm91dHB1dF9wYW5pYyA9IDA7CisJZGV2LT5maXJzdF9wYWNrZXQgPSAxOworCWRldi0+c3RyZWFtaW5nID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBOX1VSQlM7IGkrKykgeworCQlyZXQgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmRhdGFfdXJic19pbltpXSwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXQpIHsKKwkJCWxvZygidW5hYmxlIHRvIHRyaWdnZXIgaW5pdGlhbCByZWFkICMlZCEgKHJldCA9ICVkKVxuIiwKKwkJCQlpLCByZXQpOworCQkJZGV2LT5zdHJlYW1pbmcgPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnNwaW5sb2NrKTsKKwkJCXJldHVybiAtRVBJUEU7CisJCX0KKwl9CisJCisJc3Bpbl91bmxvY2tfaXJxKCZkZXYtPnNwaW5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3RyZWFtX3N0b3Aoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldikKK3sKKwlpbnQgaTsKKwkKKwlkZWJ1Zygic3RyZWFtX3N0b3AoJXApXG4iLCBkZXYpOworCWlmICghZGV2LT5zdHJlYW1pbmcpCisJCXJldHVybjsKKwkKKwlkZXYtPnN0cmVhbWluZyA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5fVVJCUzsgaSsrKSB7CisJCXVzYl91bmxpbmtfdXJiKGRldi0+ZGF0YV91cmJzX2luW2ldKTsKKwkJdXNiX3VubGlua191cmIoZGV2LT5kYXRhX3VyYnNfb3V0W2ldKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc25kX3VzYl9jYWlhcV9zdWJzdHJlYW1fb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCWRlYnVnKCJzbmRfdXNiX2NhaWFxX3N1YnN0cmVhbV9vcGVuKCVwKVxuIiwgc3Vic3RyZWFtKTsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3ID0gZGV2LT5wY21faW5mbzsKKwlzbmRfcGNtX2xpbWl0X2h3X3JhdGVzKHN1YnN0cmVhbS0+cnVudGltZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3VzYl9jYWlhcV9zdWJzdHJlYW1fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWRlYnVnKCJzbmRfdXNiX2NhaWFxX3N1YnN0cmVhbV9jbG9zZSglcClcbiIsIHN1YnN0cmVhbSk7CisJaWYgKGFsbF9zdWJzdHJlYW1zX3plcm8oZGV2LT5zdWJfcGxheWJhY2spICYmCisJICAgIGFsbF9zdWJzdHJlYW1zX3plcm8oZGV2LT5zdWJfY2FwdHVyZSkpIHsKKwkJLyogd2hlbiB0aGUgbGFzdCBjbGllbnQgaGFzIHN0b3BwZWQgc3RyZWFtaW5nLCAKKwkJICogYWxsIHNhbXBsZSByYXRlcyBhcmUgYWxsb3dlZCBhZ2FpbiAqLworCQlzdHJlYW1fc3RvcChkZXYpOworCQlkZXYtPnBjbV9pbmZvLnJhdGVzID0gZGV2LT5zYW1wbGVyYXRlczsKKwl9CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3VzYl9jYWlhcV9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3ViLAorCQkJICAgICAJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQoreworCWRlYnVnKCJzbmRfdXNiX2NhaWFxX3BjbV9od19wYXJhbXMoJXApXG4iLCBzdWIpOworCXJldHVybiBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3ViLCBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcykpOworfQorCitzdGF0aWMgaW50IHNuZF91c2JfY2FpYXFfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWIpCit7CisJc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3ViKTsKKwlkZWJ1Zygic25kX3VzYl9jYWlhcV9wY21faHdfZnJlZSglcClcbiIsIHN1Yik7CisJc3Bpbl9sb2NrX2lycSgmZGV2LT5zcGlubG9jayk7CisJZGVhY3RpdmF0ZV9zdWJzdHJlYW0oZGV2LCBzdWIpOworCXNwaW5fdW5sb2NrX2lycSgmZGV2LT5zcGlubG9jayk7CisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3ViKTsKK30KKworLyogdGhpcyBzaG91bGQgcHJvYmFibHkgZ28gdXBzdHJlYW0gKi8KKyNpZiBTTkRSVl9QQ01fUkFURV81NTEyICE9IDEgPDwgMCB8fCBTTkRSVl9QQ01fUkFURV8xOTIwMDAgIT0gMSA8PCAxMgorI2Vycm9yICJDaGFuZ2UgdGhpcyB0YWJsZSIKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzW10gPSB7IDU1MTIsIDgwMDAsIDExMDI1LCAxNjAwMCwgMjIwNTAsIDMyMDAwLCA0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLCA2NDAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMCB9OworCitzdGF0aWMgaW50IHNuZF91c2JfY2FpYXFfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IGJ5dGVzX3Blcl9zYW1wbGUsIGJwcCwgcmV0LCBpOworCWludCBpbmRleCA9IHN1YnN0cmVhbS0+bnVtYmVyOworCXN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCWRlYnVnKCJzbmRfdXNiX2NhaWFxX3BjbV9wcmVwYXJlKCVwKVxuIiwgc3Vic3RyZWFtKTsKKwkKKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJZGV2LT5hdWRpb19vdXRfYnVmX3Bvc1tpbmRleF0gPSBCWVRFU19QRVJfU0FNUExFICsgMTsKKwllbHNlCisJCWRldi0+YXVkaW9faW5fYnVmX3Bvc1tpbmRleF0gPSAwOworCQorCWlmIChkZXYtPnN0cmVhbWluZykKKwkJcmV0dXJuIDA7CisJCisJLyogdGhlIGZpcnN0IGNsaWVudCB0aGF0IG9wZW5zIGEgc3RyZWFtIGRlZmluZXMgdGhlIHNhbXBsZSByYXRlCisJICogc2V0dGluZyBmb3IgYWxsIHN1YnNlcXVlbnQgY2FsbHMsIHVudGlsIHRoZSBsYXN0IGNsaWVudCBjbG9zZWQuICovCisJZm9yIChpPTA7IGkgPCBBUlJBWV9TSVpFKHJhdGVzKTsgaSsrKQorCQlpZiAocnVudGltZS0+cmF0ZSA9PSByYXRlc1tpXSkKKwkJCWRldi0+cGNtX2luZm8ucmF0ZXMgPSAxIDw8IGk7CisJCisJc25kX3BjbV9saW1pdF9od19yYXRlcyhydW50aW1lKTsKKworCWJ5dGVzX3Blcl9zYW1wbGUgPSBCWVRFU19QRVJfU0FNUExFOworCWlmIChkZXYtPnNwZWMuZGF0YV9hbGlnbm1lbnQgPT0gMikKKwkJYnl0ZXNfcGVyX3NhbXBsZSsrOworCQorCWJwcCA9ICgocnVudGltZS0+cmF0ZSAvIDgwMDApICsgQ0xPQ0tfRFJJRlRfVE9MRVJBTkNFKQorCQkqIGJ5dGVzX3Blcl9zYW1wbGUgKiBDSEFOTkVMU19QRVJfU1RSRUFNICogZGV2LT5uX3N0cmVhbXM7CisJCisJcmV0ID0gc25kX3VzYl9jYWlhcV9zZXRfYXVkaW9fcGFyYW1zKGRldiwgcnVudGltZS0+cmF0ZSwKKwkJCQkJICAgICBydW50aW1lLT5zYW1wbGVfYml0cywgYnBwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3RyZWFtX3N0YXJ0KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkKKwlkZXYtPm91dHB1dF9ydW5uaW5nID0gMDsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoZGV2LT5wcmVwYXJlX3dhaXRfcXVldWUsIGRldi0+b3V0cHV0X3J1bm5pbmcsIEhaKTsKKwlpZiAoIWRldi0+b3V0cHV0X3J1bm5pbmcpIHsKKwkJc3RyZWFtX3N0b3AoZGV2KTsKKwkJcmV0dXJuIC1FUElQRTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdXNiX2NhaWFxX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3ViLCBpbnQgY21kKQoreworCXN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1Yik7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlzcGluX2xvY2soJmRldi0+c3BpbmxvY2spOworCQlhY3RpdmF0ZV9zdWJzdHJlYW0oZGV2LCBzdWIpOworCQlzcGluX3VubG9jaygmZGV2LT5zcGlubG9jayk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXNwaW5fbG9jaygmZGV2LT5zcGlubG9jayk7CisJCWRlYWN0aXZhdGVfc3Vic3RyZWFtKGRldiwgc3ViKTsKKwkJc3Bpbl91bmxvY2soJmRldi0+c3BpbmxvY2spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190CitzbmRfdXNiX2NhaWFxX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3ViKQoreworCWludCBpbmRleCA9IHN1Yi0+bnVtYmVyOworCXN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1Yik7CisKKwlpZiAoZGV2LT5pbnB1dF9wYW5pYyB8fCBkZXYtPm91dHB1dF9wYW5pYykKKwkJcmV0dXJuIFNORFJWX1BDTV9QT1NfWFJVTjsKKworCWlmIChzdWItPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1Yi0+cnVudGltZSwgCisJCQkJCWRldi0+YXVkaW9fb3V0X2J1Zl9wb3NbaW5kZXhdKTsKKwllbHNlCisJCXJldHVybiBieXRlc190b19mcmFtZXMoc3ViLT5ydW50aW1lLAorCQkJCQlkZXYtPmF1ZGlvX2luX2J1Zl9wb3NbaW5kZXhdKTsKK30KKworLyogb3BlcmF0b3JzIGZvciBib3RoIHBsYXliYWNrIGFuZCBjYXB0dXJlICovCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF91c2JfY2FpYXFfb3BzID0geworCS5vcGVuID0JCXNuZF91c2JfY2FpYXFfc3Vic3RyZWFtX29wZW4sCisJLmNsb3NlID0Jc25kX3VzYl9jYWlhcV9zdWJzdHJlYW1fY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF91c2JfY2FpYXFfcGNtX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CXNuZF91c2JfY2FpYXFfcGNtX2h3X2ZyZWUsCisJLnByZXBhcmUgPQlzbmRfdXNiX2NhaWFxX3BjbV9wcmVwYXJlLAorCS50cmlnZ2VyID0Jc25kX3VzYl9jYWlhcV9wY21fdHJpZ2dlciwKKwkucG9pbnRlciA9CXNuZF91c2JfY2FpYXFfcGNtX3BvaW50ZXIKK307CisJCitzdGF0aWMgdm9pZCBjaGVja19mb3JfZWxhcHNlZF9wZXJpb2RzKHN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYsCisJCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICoqc3VicykKK3sKKwlpbnQgc3RyZWFtLCBwYiwgKmNudDsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YjsKKworCWZvciAoc3RyZWFtID0gMDsgc3RyZWFtIDwgZGV2LT5uX3N0cmVhbXM7IHN0cmVhbSsrKSB7CisJCXN1YiA9IHN1YnNbc3RyZWFtXTsKKwkJaWYgKCFzdWIpCisJCQljb250aW51ZTsKKworCQlwYiA9IGZyYW1lc190b19ieXRlcyhzdWItPnJ1bnRpbWUsIAorCQkJCSAgICAgc3ViLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CisJCWNudCA9IChzdWItPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSA/CisJCQkJCSZkZXYtPnBlcmlvZF9vdXRfY291bnRbc3RyZWFtXSA6CisJCQkJCSZkZXYtPnBlcmlvZF9pbl9jb3VudFtzdHJlYW1dOworCisJCWlmICgqY250ID49IHBiKSB7CisJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1Yik7CisJCQkqY250ICU9IHBiOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCByZWFkX2luX3VyYl9tb2RlMChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LAorCQkJICAgICAgY29uc3Qgc3RydWN0IHVyYiAqdXJiLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmlzbykKK3sKKwl1bnNpZ25lZCBjaGFyICp1c2JfYnVmID0gdXJiLT50cmFuc2Zlcl9idWZmZXIgKyBpc28tPm9mZnNldDsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YjsKKwlpbnQgc3RyZWFtLCBpOworCisJaWYgKGFsbF9zdWJzdHJlYW1zX3plcm8oZGV2LT5zdWJfY2FwdHVyZSkpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmZGV2LT5zcGlubG9jayk7CisJCisJZm9yIChpID0gMDsgaSA8IGlzby0+YWN0dWFsX2xlbmd0aDspIHsKKwkJZm9yIChzdHJlYW0gPSAwOyBzdHJlYW0gPCBkZXYtPm5fc3RyZWFtczsgc3RyZWFtKyssIGkrKykgeworCQkJc3ViID0gZGV2LT5zdWJfY2FwdHVyZVtzdHJlYW1dOworCQkJaWYgKHN1YikgeworCQkJCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ0ID0gc3ViLT5ydW50aW1lOworCQkJCWNoYXIgKmF1ZGlvX2J1ZiA9IHJ0LT5kbWFfYXJlYTsKKwkJCQlpbnQgc3ogPSBmcmFtZXNfdG9fYnl0ZXMocnQsIHJ0LT5idWZmZXJfc2l6ZSk7CisJCQkJYXVkaW9fYnVmW2Rldi0+YXVkaW9faW5fYnVmX3Bvc1tzdHJlYW1dKytdIAorCQkJCQk9IHVzYl9idWZbaV07CisJCQkJZGV2LT5wZXJpb2RfaW5fY291bnRbc3RyZWFtXSsrOworCQkJCWlmIChkZXYtPmF1ZGlvX2luX2J1Zl9wb3Nbc3RyZWFtXSA9PSBzeikKKwkJCQkJZGV2LT5hdWRpb19pbl9idWZfcG9zW3N0cmVhbV0gPSAwOworCQkJfQorCQl9CisJfQorCQorCXNwaW5fdW5sb2NrKCZkZXYtPnNwaW5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9pbl91cmJfbW9kZTIoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCB1cmIgKnVyYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc28pCit7CisJdW5zaWduZWQgY2hhciAqdXNiX2J1ZiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgaXNvLT5vZmZzZXQ7CisJdW5zaWduZWQgY2hhciBjaGVja19ieXRlOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3ViOworCWludCBzdHJlYW0sIGk7CisKKwlzcGluX2xvY2soJmRldi0+c3BpbmxvY2spOworCQorCWZvciAoaSA9IDA7IGkgPCBpc28tPmFjdHVhbF9sZW5ndGg7KSB7CisJCWlmIChpICUgKGRldi0+bl9zdHJlYW1zICogQllURVNfUEVSX1NBTVBMRV9VU0IpID09IDApIHsKKwkJCWZvciAoc3RyZWFtID0gMDsgCisJCQkgICAgIHN0cmVhbSA8IGRldi0+bl9zdHJlYW1zOyAKKwkJCSAgICAgc3RyZWFtKyssIGkrKykgeworCQkJCWlmIChkZXYtPmZpcnN0X3BhY2tldCkKKwkJCQkJY29udGludWU7CisKKwkJCQljaGVja19ieXRlID0gTUFLRV9DSEVDS0JZVEUoZGV2LCBzdHJlYW0sIGkpOworCQkJCQorCQkJCWlmICgodXNiX2J1ZltpXSAmIDB4M2YpICE9IGNoZWNrX2J5dGUpCisJCQkJCWRldi0+aW5wdXRfcGFuaWMgPSAxOworCisJCQkJaWYgKHVzYl9idWZbaV0gJiAweDgwKQorCQkJCQlkZXYtPm91dHB1dF9wYW5pYyA9IDE7CisJCQl9CisJCX0KKwkJZGV2LT5maXJzdF9wYWNrZXQgPSAwOworCisJCWZvciAoc3RyZWFtID0gMDsgc3RyZWFtIDwgZGV2LT5uX3N0cmVhbXM7IHN0cmVhbSsrLCBpKyspIHsKKwkJCXN1YiA9IGRldi0+c3ViX2NhcHR1cmVbc3RyZWFtXTsKKwkJCWlmIChzdWIpIHsKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydCA9IHN1Yi0+cnVudGltZTsKKwkJCQljaGFyICphdWRpb19idWYgPSBydC0+ZG1hX2FyZWE7CisJCQkJaW50IHN6ID0gZnJhbWVzX3RvX2J5dGVzKHJ0LCBydC0+YnVmZmVyX3NpemUpOworCQkJCWF1ZGlvX2J1ZltkZXYtPmF1ZGlvX2luX2J1Zl9wb3Nbc3RyZWFtXSsrXSA9CisJCQkJCXVzYl9idWZbaV07CisJCQkJZGV2LT5wZXJpb2RfaW5fY291bnRbc3RyZWFtXSsrOworCQkJCWlmIChkZXYtPmF1ZGlvX2luX2J1Zl9wb3Nbc3RyZWFtXSA9PSBzeikKKwkJCQkJZGV2LT5hdWRpb19pbl9idWZfcG9zW3N0cmVhbV0gPSAwOworCQkJfQorCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmRldi0+c3BpbmxvY2spOworfQorCitzdGF0aWMgdm9pZCByZWFkX2luX3VyYihzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LAorCQkJY29uc3Qgc3RydWN0IHVyYiAqdXJiLAorCQkJY29uc3Qgc3RydWN0IHVzYl9pc29fcGFja2V0X2Rlc2NyaXB0b3IgKmlzbykKK3sKKwlpZiAoIWRldi0+c3RyZWFtaW5nKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGRldi0+c3BlYy5kYXRhX2FsaWdubWVudCkgeworCWNhc2UgMDoKKwkJcmVhZF9pbl91cmJfbW9kZTAoZGV2LCB1cmIsIGlzbyk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcmVhZF9pbl91cmJfbW9kZTIoZGV2LCB1cmIsIGlzbyk7CisJCWJyZWFrOworCX0KKworCWlmIChkZXYtPmlucHV0X3BhbmljIHx8IGRldi0+b3V0cHV0X3BhbmljKSB7CisJCWRlYnVnKCJzdHJlYW1pbmcgZXJyb3IgZGV0ZWN0ZWQgJXMgJXNcbiIsIAorCQkJCWRldi0+aW5wdXRfcGFuaWMgPyAiKGlucHV0KSIgOiAiIiwKKwkJCQlkZXYtPm91dHB1dF9wYW5pYyA/ICIob3V0cHV0KSIgOiAiIik7CisJfQorCisJY2hlY2tfZm9yX2VsYXBzZWRfcGVyaW9kcyhkZXYsIGRldi0+c3ViX2NhcHR1cmUpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX291dF91cmIoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiwgCisJCQkgc3RydWN0IHVyYiAqdXJiLCAKKwkJCSBjb25zdCBzdHJ1Y3QgdXNiX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqaXNvKQoreworCXVuc2lnbmVkIGNoYXIgKnVzYl9idWYgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArIGlzby0+b2Zmc2V0OworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3ViOworCWludCBzdHJlYW0sIGk7CisKKwlzcGluX2xvY2soJmRldi0+c3BpbmxvY2spOworCQorCWZvciAoaSA9IDA7IGkgPCBpc28tPmxlbmd0aDspIHsKKwkJZm9yIChzdHJlYW0gPSAwOyBzdHJlYW0gPCBkZXYtPm5fc3RyZWFtczsgc3RyZWFtKyssIGkrKykgeworCQkJc3ViID0gZGV2LT5zdWJfcGxheWJhY2tbc3RyZWFtXTsKKwkJCWlmIChzdWIpIHsKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydCA9IHN1Yi0+cnVudGltZTsKKwkJCQljaGFyICphdWRpb19idWYgPSBydC0+ZG1hX2FyZWE7CisJCQkJaW50IHN6ID0gZnJhbWVzX3RvX2J5dGVzKHJ0LCBydC0+YnVmZmVyX3NpemUpOworCQkJCXVzYl9idWZbaV0gPQorCQkJCQlhdWRpb19idWZbZGV2LT5hdWRpb19vdXRfYnVmX3Bvc1tzdHJlYW1dXTsKKwkJCQlkZXYtPnBlcmlvZF9vdXRfY291bnRbc3RyZWFtXSsrOworCQkJCWRldi0+YXVkaW9fb3V0X2J1Zl9wb3Nbc3RyZWFtXSsrOworCQkJCWlmIChkZXYtPmF1ZGlvX291dF9idWZfcG9zW3N0cmVhbV0gPT0gc3opCisJCQkJCWRldi0+YXVkaW9fb3V0X2J1Zl9wb3Nbc3RyZWFtXSA9IDA7CisJCQl9IGVsc2UKKwkJCQl1c2JfYnVmW2ldID0gMDsKKwkJfQorCisJCS8qIGZpbGwgaW4gdGhlIGNoZWNrIGJ5dGVzICovCisJCWlmIChkZXYtPnNwZWMuZGF0YV9hbGlnbm1lbnQgPT0gMiAmJgorCQkgICAgaSAlIChkZXYtPm5fc3RyZWFtcyAqIEJZVEVTX1BFUl9TQU1QTEVfVVNCKSA9PSAKKwkJICAgIAkoZGV2LT5uX3N0cmVhbXMgKiBDSEFOTkVMU19QRVJfU1RSRUFNKSkKKwkJICAgIGZvciAoc3RyZWFtID0gMDsgc3RyZWFtIDwgZGV2LT5uX3N0cmVhbXM7IHN0cmVhbSsrLCBpKyspCisJCSAgICAJdXNiX2J1ZltpXSA9IE1BS0VfQ0hFQ0tCWVRFKGRldiwgc3RyZWFtLCBpKTsKKwl9CisKKwlzcGluX3VubG9jaygmZGV2LT5zcGlubG9jayk7CisJY2hlY2tfZm9yX2VsYXBzZWRfcGVyaW9kcyhkZXYsIGRldi0+c3ViX3BsYXliYWNrKTsKK30KKworc3RhdGljIHZvaWQgcmVhZF9jb21wbGV0ZWQoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBzbmRfdXNiX2NhaWFxX2NiX2luZm8gKmluZm8gPSB1cmItPmNvbnRleHQ7IAorCXN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXY7CisJc3RydWN0IHVyYiAqb3V0OworCWludCBmcmFtZSwgbGVuLCBzZW5kX2l0ID0gMCwgb3V0ZnJhbWUgPSAwOworCisJaWYgKHVyYi0+c3RhdHVzIHx8ICFpbmZvKQorCQlyZXR1cm47CisKKwlkZXYgPSBpbmZvLT5kZXY7CisJaWYgKCFkZXYtPnN0cmVhbWluZykKKwkJcmV0dXJuOworCisJb3V0ID0gZGV2LT5kYXRhX3VyYnNfb3V0W2luZm8tPmluZGV4XTsKKworCS8qIHJlYWQgdGhlIHJlY2VudGx5IHJlY2VpdmVkIHBhY2tldCBhbmQgc2VuZCBiYWNrIG9uZSB3aGljaCBoYXMKKwkgKiB0aGUgc2FtZSBsYXlvdXQgKi8KKwlmb3IgKGZyYW1lID0gMDsgZnJhbWUgPCBGUkFNRVNfUEVSX1VSQjsgZnJhbWUrKykgeworCQlpZiAodXJiLT5pc29fZnJhbWVfZGVzY1tmcmFtZV0uc3RhdHVzKQorCQkJY29udGludWU7CisKKwkJbGVuID0gdXJiLT5pc29fZnJhbWVfZGVzY1tvdXRmcmFtZV0uYWN0dWFsX2xlbmd0aDsKKwkJb3V0LT5pc29fZnJhbWVfZGVzY1tvdXRmcmFtZV0ubGVuZ3RoID0gbGVuOworCQlvdXQtPmlzb19mcmFtZV9kZXNjW291dGZyYW1lXS5hY3R1YWxfbGVuZ3RoID0gMDsKKwkJb3V0LT5pc29fZnJhbWVfZGVzY1tvdXRmcmFtZV0ub2Zmc2V0ID0gQllURVNfUEVSX0ZSQU1FICogZnJhbWU7CisJCQorCQlpZiAobGVuID4gMCkgeworCQkJZmlsbF9vdXRfdXJiKGRldiwgb3V0LCAmb3V0LT5pc29fZnJhbWVfZGVzY1tvdXRmcmFtZV0pOworCQkJcmVhZF9pbl91cmIoZGV2LCB1cmIsICZ1cmItPmlzb19mcmFtZV9kZXNjW2ZyYW1lXSk7CisJCQlzZW5kX2l0ID0gMTsKKwkJfQorCisJCW91dGZyYW1lKys7CisJfQorCisJaWYgKHNlbmRfaXQpIHsKKwkJb3V0LT5udW1iZXJfb2ZfcGFja2V0cyA9IEZSQU1FU19QRVJfVVJCOworCQlvdXQtPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1c2Jfc3VibWl0X3VyYihvdXQsIEdGUF9BVE9NSUMpOworCX0KKwkKKwkvKiByZS1zdWJtaXQgaW5ib3VuZCB1cmIgKi8KKwlmb3IgKGZyYW1lID0gMDsgZnJhbWUgPCBGUkFNRVNfUEVSX1VSQjsgZnJhbWUrKykgeworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ZyYW1lXS5vZmZzZXQgPSBCWVRFU19QRVJfRlJBTUUgKiBmcmFtZTsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1tmcmFtZV0ubGVuZ3RoID0gQllURVNfUEVSX0ZSQU1FOworCQl1cmItPmlzb19mcmFtZV9kZXNjW2ZyYW1lXS5hY3R1YWxfbGVuZ3RoID0gMDsKKwl9CisJCisJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IEZSQU1FU19QRVJfVVJCOworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfY29tcGxldGVkKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3Qgc25kX3VzYl9jYWlhcV9jYl9pbmZvICppbmZvID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYgPSBpbmZvLT5kZXY7CisKKwlpZiAoIWRldi0+b3V0cHV0X3J1bm5pbmcpIHsKKwkJZGV2LT5vdXRwdXRfcnVubmluZyA9IDE7CisJCXdha2VfdXAoJmRldi0+cHJlcGFyZV93YWl0X3F1ZXVlKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXJiICoqYWxsb2NfdXJicyhzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LCBpbnQgZGlyLCBpbnQgKnJldCkKK3sKKwlpbnQgaSwgZnJhbWU7CisJc3RydWN0IHVyYiAqKnVyYnM7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBkZXYtPmNoaXAuZGV2OworCXVuc2lnbmVkIGludCBwaXBlOworCisJcGlwZSA9IChkaXIgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgPyAKKwkJdXNiX3NuZGlzb2NwaXBlKHVzYl9kZXYsIEVORFBPSU5UX1BMQVlCQUNLKSA6CisJCXVzYl9yY3Zpc29jcGlwZSh1c2JfZGV2LCBFTkRQT0lOVF9DQVBUVVJFKTsKKworCXVyYnMgPSBrbWFsbG9jKE5fVVJCUyAqIHNpemVvZigqdXJicyksIEdGUF9LRVJORUwpOworCWlmICghdXJicykgeworCQlsb2coInVuYWJsZSB0byBrbWFsbG9jKCkgdXJicywgT09NIT9cbiIpOworCQkqcmV0ID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5fVVJCUzsgaSsrKSB7CisJCXVyYnNbaV0gPSB1c2JfYWxsb2NfdXJiKEZSQU1FU19QRVJfVVJCLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1cmJzW2ldKSB7CisJCQlsb2coInVuYWJsZSB0byB1c2JfYWxsb2NfdXJiKCksIE9PTSE/XG4iKTsKKwkJCSpyZXQgPSAtRU5PTUVNOworCQkJcmV0dXJuIHVyYnM7CisJCX0KKworCQl1cmJzW2ldLT50cmFuc2Zlcl9idWZmZXIgPSAKKwkJCWttYWxsb2MoRlJBTUVTX1BFUl9VUkIgKiBCWVRFU19QRVJfRlJBTUUsIEdGUF9LRVJORUwpOworCQlpZiAoIXVyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlcikgeworCQkJbG9nKCJ1bmFibGUgdG8ga21hbGxvYygpIHRyYW5zZmVyIGJ1ZmZlciwgT09NIT9cbiIpOworCQkJKnJldCA9IC1FTk9NRU07CisJCQlyZXR1cm4gdXJiczsKKwkJfQorCQkKKwkJZm9yIChmcmFtZSA9IDA7IGZyYW1lIDwgRlJBTUVTX1BFUl9VUkI7IGZyYW1lKyspIHsKKwkJCXN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc28gPSAKKwkJCQkmdXJic1tpXS0+aXNvX2ZyYW1lX2Rlc2NbZnJhbWVdOworCQkJCisJCQlpc28tPm9mZnNldCA9IEJZVEVTX1BFUl9GUkFNRSAqIGZyYW1lOworCQkJaXNvLT5sZW5ndGggPSBCWVRFU19QRVJfRlJBTUU7CisJCX0KKwkJCisJCXVyYnNbaV0tPmRldiA9IHVzYl9kZXY7CisJCXVyYnNbaV0tPnBpcGUgPSBwaXBlOworCQl1cmJzW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gRlJBTUVTX1BFUl9VUkIgCisJCQkJCQkqIEJZVEVTX1BFUl9GUkFNRTsKKwkJdXJic1tpXS0+Y29udGV4dCA9ICZkZXYtPmRhdGFfY2JfaW5mb1tpXTsKKwkJdXJic1tpXS0+aW50ZXJ2YWwgPSAxOworCQl1cmJzW2ldLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJdXJic1tpXS0+bnVtYmVyX29mX3BhY2tldHMgPSBGUkFNRVNfUEVSX1VSQjsKKwkJdXJic1tpXS0+Y29tcGxldGUgPSAoZGlyID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkgPworCQkJCQlyZWFkX2NvbXBsZXRlZCA6IHdyaXRlX2NvbXBsZXRlZDsKKwl9CisKKwkqcmV0ID0gMDsKKwlyZXR1cm4gdXJiczsKK30KKworc3RhdGljIHZvaWQgZnJlZV91cmJzKHN0cnVjdCB1cmIgKip1cmJzKQoreworCWludCBpOworCisJaWYgKCF1cmJzKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgTl9VUkJTOyBpKyspIHsKKwkJaWYgKCF1cmJzW2ldKQorCQkJY29udGludWU7CisJCQorCQl1c2Jfa2lsbF91cmIodXJic1tpXSk7CisJCWtmcmVlKHVyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYl9mcmVlX3VyYih1cmJzW2ldKTsKKwl9CisKKwlrZnJlZSh1cmJzKTsKK30KKworaW50IF9fZGV2aW5pdCBzbmRfdXNiX2NhaWFxX2F1ZGlvX2luaXQoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldikKK3sKKwlpbnQgaSwgcmV0OworCisJZGV2LT5uX2F1ZGlvX2luICA9IG1heChkZXYtPnNwZWMubnVtX2FuYWxvZ19hdWRpb19pbiwgCisJCQkgICAgICAgZGV2LT5zcGVjLm51bV9kaWdpdGFsX2F1ZGlvX2luKSAvIAorCQkJCUNIQU5ORUxTX1BFUl9TVFJFQU07CisJZGV2LT5uX2F1ZGlvX291dCA9IG1heChkZXYtPnNwZWMubnVtX2FuYWxvZ19hdWRpb19vdXQsCisJCQkgICAgICAgZGV2LT5zcGVjLm51bV9kaWdpdGFsX2F1ZGlvX291dCkgLyAKKwkJCQlDSEFOTkVMU19QRVJfU1RSRUFNOworCWRldi0+bl9zdHJlYW1zID0gbWF4KGRldi0+bl9hdWRpb19pbiwgZGV2LT5uX2F1ZGlvX291dCk7CisKKwlkZWJ1ZygiZGV2LT5uX2F1ZGlvX2luID0gJWRcbiIsIGRldi0+bl9hdWRpb19pbik7CisJZGVidWcoImRldi0+bl9hdWRpb19vdXQgPSAlZFxuIiwgZGV2LT5uX2F1ZGlvX291dCk7CisJZGVidWcoImRldi0+bl9zdHJlYW1zID0gJWRcbiIsIGRldi0+bl9zdHJlYW1zKTsKKworCWlmIChkZXYtPm5fc3RyZWFtcyA+IE1BWF9TVFJFQU1TKSB7CisJCWxvZygidW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlLCB0b28gbWFueSBzdHJlYW1zLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHNuZF9wY21fbmV3KGRldi0+Y2hpcC5jYXJkLCBkZXYtPnByb2R1Y3RfbmFtZSwgMCwgCisJCQlkZXYtPm5fYXVkaW9fb3V0LCBkZXYtPm5fYXVkaW9faW4sICZkZXYtPnBjbSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlsb2coInNuZF9wY21fbmV3KCkgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2LT5wY20tPnByaXZhdGVfZGF0YSA9IGRldjsKKwlzdHJjcHkoZGV2LT5wY20tPm5hbWUsIGRldi0+cHJvZHVjdF9uYW1lKTsKKworCW1lbXNldChkZXYtPnN1Yl9wbGF5YmFjaywgMCwgc2l6ZW9mKGRldi0+c3ViX3BsYXliYWNrKSk7CisJbWVtc2V0KGRldi0+c3ViX2NhcHR1cmUsIDAsIHNpemVvZihkZXYtPnN1Yl9jYXB0dXJlKSk7CisJCisJbWVtY3B5KCZkZXYtPnBjbV9pbmZvLCAmc25kX3VzYl9jYWlhcV9wY21faGFyZHdhcmUsCisJCQlzaXplb2Yoc25kX3VzYl9jYWlhcV9wY21faGFyZHdhcmUpKTsKKworCS8qIHNldHVwIHNhbXBsZXJhdGVzICovCisJZGV2LT5zYW1wbGVyYXRlcyA9IGRldi0+cGNtX2luZm8ucmF0ZXM7CisJc3dpdGNoIChkZXYtPmNoaXAudXNiX2lkKSB7CisJY2FzZSBVU0JfSUQoVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywgVVNCX1BJRF9BSzEpOgorCQlkZXYtPnNhbXBsZXJhdGVzIHw9IFNORFJWX1BDTV9SQVRFXzg4MjAwOworCQlkZXYtPnNhbXBsZXJhdGVzIHw9IFNORFJWX1BDTV9SQVRFXzE5MjAwMDsKKwkJYnJlYWs7CisJY2FzZSBVU0JfSUQoVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywgVVNCX1BJRF9BVURJTzhESik6CisJCWRldi0+c2FtcGxlcmF0ZXMgfD0gU05EUlZfUENNX1JBVEVfODgyMDA7CisJCWJyZWFrOworCX0KKworCXNuZF9wY21fc2V0X29wcyhkZXYtPnBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgCisJCQkJJnNuZF91c2JfY2FpYXFfb3BzKTsKKwlzbmRfcGNtX3NldF9vcHMoZGV2LT5wY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwgCisJCQkJJnNuZF91c2JfY2FpYXFfb3BzKTsKKworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwoZGV2LT5wY20sCisJCQkJCVNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCisJCQkJCXNuZF9kbWFfY29udGludW91c19kYXRhKEdGUF9LRVJORUwpLAorCQkJCQlNQVhfQlVGRkVSX1NJWkUsIE1BWF9CVUZGRVJfU0laRSk7CisKKwlkZXYtPmRhdGFfY2JfaW5mbyA9CisJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbmRfdXNiX2NhaWFxX2NiX2luZm8pICogTl9VUkJTLCAKKwkJCQkJR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRldi0+ZGF0YV9jYl9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBOX1VSQlM7IGkrKykgeworCQlkZXYtPmRhdGFfY2JfaW5mb1tpXS5kZXYgPSBkZXY7CisJCWRldi0+ZGF0YV9jYl9pbmZvW2ldLmluZGV4ID0gaTsKKwl9CisJCisJZGV2LT5kYXRhX3VyYnNfaW4gPSBhbGxvY191cmJzKGRldiwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLCAmcmV0KTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShkZXYtPmRhdGFfY2JfaW5mbyk7CisJCWZyZWVfdXJicyhkZXYtPmRhdGFfdXJic19pbik7CisJCXJldHVybiByZXQ7CisJfQorCQorCWRldi0+ZGF0YV91cmJzX291dCA9IGFsbG9jX3VyYnMoZGV2LCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAmcmV0KTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShkZXYtPmRhdGFfY2JfaW5mbyk7CisJCWZyZWVfdXJicyhkZXYtPmRhdGFfdXJic19pbik7CisJCWZyZWVfdXJicyhkZXYtPmRhdGFfdXJic19vdXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIHNuZF91c2JfY2FpYXFfYXVkaW9fZnJlZShzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2KQoreworCWRlYnVnKCJzbmRfdXNiX2NhaWFxX2F1ZGlvX2ZyZWUgKCVwKVxuIiwgZGV2KTsKKwlzdHJlYW1fc3RvcChkZXYpOworCWZyZWVfdXJicyhkZXYtPmRhdGFfdXJic19pbik7CisJZnJlZV91cmJzKGRldi0+ZGF0YV91cmJzX291dCk7CisJa2ZyZWUoZGV2LT5kYXRhX2NiX2luZm8pOworfQorCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvY2FpYXEtYXVkaW8uaCBiL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjFmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtYXVkaW8uaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgQ0FJQVFfQVVESU9fSAorI2RlZmluZSBDQUlBUV9BVURJT19ICisKK2ludCBzbmRfdXNiX2NhaWFxX2F1ZGlvX2luaXQoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldik7Cit2b2lkIHNuZF91c2JfY2FpYXFfYXVkaW9fZnJlZShzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2KTsKKworI2VuZGlmIC8qIENBSUFRX0FVRElPX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1kZXZpY2UuYyBiL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzA5MzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL2NhaWFxL2NhaWFxLWRldmljZS5jCkBAIC0wLDAgKzEsNDM2IEBACisvKgorICogY2FpYXEuYzogQUxTQSBkcml2ZXIgZm9yIGNhaWFxL05hdGl2ZUluc3RydW1lbnRzIGRldmljZXMKKyAqCisgKiAgIENvcHlyaWdodCAoYykgMjAwNyBEYW5pZWwgTWFjayA8ZGFuaWVsQGNhaWFxLmRlPgorICogICAgICAgICAgICAgICAgICAgICAgS2Fyc3RlbiBXaWVzZSA8Znp1QHdlbWdlaG9lcnRkZXJzdGFhdC5kZT4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcmF3bWlkaS5oPgorCisjaW5jbHVkZSAiY2FpYXEtZGV2aWNlLmgiCisjaW5jbHVkZSAiY2FpYXEtYXVkaW8uaCIKKyNpbmNsdWRlICJjYWlhcS1taWRpLmgiCisKKyNpZmRlZiBDT05GSUdfU05EX1VTQl9DQUlBUV9JTlBVVAorI2luY2x1ZGUgImNhaWFxLWlucHV0LmgiCisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiRGFuaWVsIE1hY2sgPGRhbmllbEBjYWlhcS5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiY2FpYXEgVVNCIGF1ZGlvLCB2ZXJzaW9uIDEuMS4wIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tOYXRpdmUgSW5zdHJ1bWVudHMsIFJpZ0tvbnRyb2wyfSwiCisJCQkgIntOYXRpdmUgSW5zdHJ1bWVudHMsIEtvcmUgQ29udHJvbGxlcn0sIgorCQkJICJ7TmF0aXZlIEluc3RydW1lbnRzLCBBdWRpbyBLb250cm9sIDF9IgorCQkJICJ7TmF0aXZlIEluc3RydW1lbnRzLCBBdWRpbyA4IERKfX0iKTsKKworc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsgLyogSW5kZXggMC1tYXggKi8KK3N0YXRpYyBjaGFyKiBpZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsgLyogSWQgZm9yIHRoaXMgY2FyZCAqLworc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOyAvKiBFbmFibGUgdGhpcyBjYXJkICovCitzdGF0aWMgaW50IHNuZF9jYXJkX3VzZWRbU05EUlZfQ0FSRFNdOworCittb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIHRoZSBjYWlhcSBzb3VuZCBkZXZpY2UiKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgdGhlIGNhaWFxIHNvdW5kY2FyZC4iKTsKK21vZHVsZV9wYXJhbV9hcnJheShlbmFibGUsIGJvb2wsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgdGhlIGNhaWFxIHNvdW5kY2FyZC4iKTsKKworZW51bSB7CisJU0FNUExFUkFURV80NDEwMAk9IDAsCisJU0FNUExFUkFURV80ODAwMAk9IDEsCisJU0FNUExFUkFURV85NjAwMAk9IDIsCisJU0FNUExFUkFURV8xOTIwMDAJPSAzLAorCVNBTVBMRVJBVEVfODgyMDAJPSA0LAorCVNBTVBMRVJBVEVfSU5WQUxJRAk9IDB4ZmYKK307CisKK2VudW0geworCURFUFRIX05PTkUJPSAwLAorCURFUFRIXzE2CT0gMSwKKwlERVBUSF8yNAk9IDIsCisJREVQVEhfMzIJPSAzCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgc25kX3VzYl9pZF90YWJsZVtdID0geworCXsKKwkJLm1hdGNoX2ZsYWdzID0JVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZJQ0UsCisJCS5pZFZlbmRvciA9CVVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsCisJCS5pZFByb2R1Y3QgPQlVU0JfUElEX1JJR0tPTlRST0wyIAorCX0sCisJeworCQkubWF0Y2hfZmxhZ3MgPQlVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkJLmlkVmVuZG9yID0JVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywKKwkJLmlkUHJvZHVjdCA9CVVTQl9QSURfS09SRUNPTlRST0xMRVIKKwl9LAorCXsKKwkJLm1hdGNoX2ZsYWdzID0gIFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFLAorCQkuaWRWZW5kb3IgPSAgICAgVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywKKwkJLmlkUHJvZHVjdCA9ICAgIFVTQl9QSURfQUsxCisJfSwKKwl7CisJCS5tYXRjaF9mbGFncyA9ICBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSwKKwkJLmlkVmVuZG9yID0gICAgIFVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsCisJCS5pZFByb2R1Y3QgPSAgICBVU0JfUElEX0FVRElPOERKCisJfSwKKwl7IC8qIHRlcm1pbmF0b3IgKi8gfQorfTsKKworc3RhdGljIHZvaWQgdXNiX2VwMV9jb21tYW5kX3JlcGx5X2Rpc3BhdGNoIChzdHJ1Y3QgdXJiKiB1cmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2ID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCisJaWYgKHVyYi0+c3RhdHVzIHx8ICFkZXYpIHsKKwkJbG9nKCJyZWNlaXZlZCBFUDEgdXJiLT5zdGF0dXMgPSAlaVxuIiwgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoKGJ1ZlswXSkgeworCWNhc2UgRVAxX0NNRF9HRVRfREVWSUNFX0lORk86CisJIAltZW1jcHkoJmRldi0+c3BlYywgYnVmKzEsIHNpemVvZihzdHJ1Y3QgY2FpYXFfZGV2aWNlX3NwZWMpKTsKKwkJZGV2LT5zcGVjLmZ3X3ZlcnNpb24gPSBsZTE2X3RvX2NwdShkZXYtPnNwZWMuZndfdmVyc2lvbik7CisJCWRlYnVnKCJkZXZpY2Ugc3BlYyAoZmlybXdhcmUgJWQpOiBhdWRpbzogJWQgaW4sICVkIG91dCwgIgorCQkJIk1JREk6ICVkIGluLCAlZCBvdXQsIGRhdGEgYWxpZ25tZW50ICVkXG4iLAorCQkJZGV2LT5zcGVjLmZ3X3ZlcnNpb24sCisJCQlkZXYtPnNwZWMubnVtX2FuYWxvZ19hdWRpb19pbiwKKwkJCWRldi0+c3BlYy5udW1fYW5hbG9nX2F1ZGlvX291dCwKKwkJCWRldi0+c3BlYy5udW1fbWlkaV9pbiwKKwkJCWRldi0+c3BlYy5udW1fbWlkaV9vdXQsCisJCQlkZXYtPnNwZWMuZGF0YV9hbGlnbm1lbnQpOworCisJCWRldi0+c3BlY19yZWNlaXZlZCsrOworCQl3YWtlX3VwKCZkZXYtPmVwMV93YWl0X3F1ZXVlKTsKKwkJYnJlYWs7CisJY2FzZSBFUDFfQ01EX0FVRElPX1BBUkFNUzoKKwkJZGV2LT5hdWRpb19wYXJtX2Fuc3dlciA9IGJ1ZlsxXTsKKwkJd2FrZV91cCgmZGV2LT5lcDFfd2FpdF9xdWV1ZSk7CisJCWJyZWFrOworCWNhc2UgRVAxX0NNRF9NSURJX1JFQUQ6CisJCXNuZF91c2JfY2FpYXFfbWlkaV9oYW5kbGVfaW5wdXQoZGV2LCBidWZbMV0sIGJ1ZiArIDMsIGJ1ZlsyXSk7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX1NORF9VU0JfQ0FJQVFfSU5QVVQKKwljYXNlIEVQMV9DTURfUkVBRF9FUlA6CisJY2FzZSBFUDFfQ01EX1JFQURfQU5BTE9HOgorCWNhc2UgRVAxX0NNRF9SRUFEX0lPOgorCQlzbmRfdXNiX2NhaWFxX2lucHV0X2Rpc3BhdGNoKGRldiwgYnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCQlicmVhazsKKyNlbmRpZgorCX0KKworCWRldi0+ZXAxX2luX3VyYi5hY3R1YWxfbGVuZ3RoID0gMDsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYigmZGV2LT5lcDFfaW5fdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0IDwgMCkKKwkJbG9nKCJ1bmFibGUgdG8gc3VibWl0IHVyYi4gT09NIT9cbiIpOworfQorCitzdGF0aWMgaW50IHNlbmRfY29tbWFuZCAoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiwKKwkJCSB1bnNpZ25lZCBjaGFyIGNvbW1hbmQsIAorCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCSBpbnQgbGVuKQoreworCWludCBhY3R1YWxfbGVuOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gZGV2LT5jaGlwLmRldjsKKworCWlmICghdXNiX2RldikKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAobGVuID4gRVAxX0JVRlNJWkUgLSAxKQorCQlsZW4gPSBFUDFfQlVGU0laRSAtIDE7CisKKwlpZiAoYnVmZmVyICYmIGxlbiA+IDApCisJCW1lbWNweShkZXYtPmVwMV9vdXRfYnVmKzEsIGJ1ZmZlciwgbGVuKTsKKwkKKwlkZXYtPmVwMV9vdXRfYnVmWzBdID0gY29tbWFuZDsKKwlyZXR1cm4gdXNiX2J1bGtfbXNnKHVzYl9kZXYsIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCAxKSwKKwkJCSAgIGRldi0+ZXAxX291dF9idWYsIGxlbisxLCAmYWN0dWFsX2xlbiwgMjAwKTsKK30KKworaW50IHNuZF91c2JfY2FpYXFfc2V0X2F1ZGlvX3BhcmFtcyAoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiwKKwkJICAgCQkgICAgaW50IHJhdGUsIGludCBkZXB0aCwgaW50IGJwcCkKK3sKKwlpbnQgcmV0OworCWNoYXIgdG1wWzVdOworCQorCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgNDQxMDA6CXRtcFswXSA9IFNBTVBMRVJBVEVfNDQxMDA7ICAgYnJlYWs7CisJY2FzZSA0ODAwMDoJdG1wWzBdID0gU0FNUExFUkFURV80ODAwMDsgICBicmVhazsKKwljYXNlIDg4MjAwOgl0bXBbMF0gPSBTQU1QTEVSQVRFXzg4MjAwOyAgIGJyZWFrOworCWNhc2UgOTYwMDA6CXRtcFswXSA9IFNBTVBMRVJBVEVfOTYwMDA7ICAgYnJlYWs7CisJY2FzZSAxOTIwMDA6CXRtcFswXSA9IFNBTVBMRVJBVEVfMTkyMDAwOyAgYnJlYWs7CisJZGVmYXVsdDoJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChkZXB0aCkgeworCWNhc2UgMTY6CXRtcFsxXSA9IERFUFRIXzE2OyAgIGJyZWFrOworCWNhc2UgMjQ6CXRtcFsxXSA9IERFUFRIXzI0OyAgIGJyZWFrOworCWRlZmF1bHQ6CXJldHVybiAtRUlOVkFMOworCX0KKworCXRtcFsyXSA9IGJwcCAmIDB4ZmY7CisJdG1wWzNdID0gYnBwID4+IDg7CisJdG1wWzRdID0gMTsgLyogcGFja2V0cyBwZXIgbWljcm9mcmFtZSAqLworCisJZGVidWcoInNldHRpbmcgYXVkaW8gcGFyYW1zOiAlZCBIeiwgJWQgYml0cywgJWQgYnBwXG4iLAorCQlyYXRlLCBkZXB0aCwgYnBwKTsKKworCWRldi0+YXVkaW9fcGFybV9hbnN3ZXIgPSAtMTsKKwlyZXQgPSBzZW5kX2NvbW1hbmQoZGV2LCBFUDFfQ01EX0FVRElPX1BBUkFNUywgdG1wLCBzaXplb2YodG1wKSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCQorCWlmICghd2FpdF9ldmVudF90aW1lb3V0KGRldi0+ZXAxX3dhaXRfcXVldWUsIAorCSAgICBkZXYtPmF1ZGlvX3Bhcm1fYW5zd2VyID49IDAsIEhaKSkKKwkJcmV0dXJuIC1FUElQRTsKKwkJCisJaWYgKGRldi0+YXVkaW9fcGFybV9hbnN3ZXIgIT0gMSkgCisJCWRlYnVnKCJ1bmFibGUgdG8gc2V0IHRoZSBkZXZpY2UncyBhdWRpbyBwYXJhbXNcbiIpOworCisJcmV0dXJuIGRldi0+YXVkaW9fcGFybV9hbnN3ZXIgPT0gMSA/IDAgOiAtRUlOVkFMOworfQorCitpbnQgc25kX3VzYl9jYWlhcV9zZXRfYXV0b19tc2cgKHN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYsIAorCQkJCWludCBkaWdpdGFsLCBpbnQgYW5hbG9nLCBpbnQgZXJwKQoreworCWNoYXIgdG1wWzNdID0geyBkaWdpdGFsLCBhbmFsb2csIGVycCB9OworCXJldHVybiBzZW5kX2NvbW1hbmQoZGV2LCBFUDFfQ01EX0FVVE9fTVNHLCB0bXAsIHNpemVvZih0bXApKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfY2FyZChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2KQoreworCWludCByZXQ7CisJY2hhciB2YWxbM107CisJCisJLyogZGV2aWNlLXNwZWNpZmljIHN0YXJ0dXAgc3BlY2lhbHMgKi8KKwlzd2l0Y2ggKGRldi0+Y2hpcC51c2JfaWQpIHsKKwljYXNlIFVTQl9JRChVU0JfVklEX05BVElWRUlOU1RSVU1FTlRTLCBVU0JfUElEX1JJR0tPTlRST0wyKToKKwkJLyogUmlnS29udHJvbDIgLSBkaXNwbGF5IGNlbnRlcmVkIGRhc2ggKCctJykgKi8KKwkJdmFsWzBdID0gMHgwMDsKKwkJdmFsWzFdID0gMHgwMDsKKwkJdmFsWzJdID0gMHgwMTsKKwkJc2VuZF9jb21tYW5kKGRldiwgRVAxX0NNRF9XUklURV9JTywgdmFsLCAzKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfSUQoVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywgVVNCX1BJRF9BSzEpOgorCQkvKiBBdWRpbyBLb250cm9sIDEgLSBtYWtlIFVTQi1MRUQgc3RvcCBibGlua2luZyAqLworCQl2YWxbMF0gPSAweDAwOworCQlzZW5kX2NvbW1hbmQoZGV2LCBFUDFfQ01EX1dSSVRFX0lPLCB2YWwsIDEpOworCQlicmVhazsKKwl9CisJCisJcmV0ID0gc25kX3VzYl9jYWlhcV9hdWRpb19pbml0KGRldik7CisJaWYgKHJldCA8IDApCisJCWxvZygiVW5hYmxlIHRvIHNldCB1cCBhdWRpbyBzeXN0ZW0gKHJldD0lZClcbiIsIHJldCk7CisJCisJcmV0ID0gc25kX3VzYl9jYWlhcV9taWRpX2luaXQoZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJbG9nKCJVbmFibGUgdG8gc2V0IHVwIE1JREkgc3lzdGVtIChyZXQ9JWQpXG4iLCByZXQpOworCisjaWZkZWYgQ09ORklHX1NORF9VU0JfQ0FJQVFfSU5QVVQKKwlyZXQgPSBzbmRfdXNiX2NhaWFxX2lucHV0X2luaXQoZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJbG9nKCJVbmFibGUgdG8gc2V0IHVwIGlucHV0IHN5c3RlbSAocmV0PSVkKVxuIiwgcmV0KTsKKyNlbmRpZgorCisJLyogZmluYWxseSwgcmVnaXN0ZXIgdGhlIGNhcmQgYW5kIGFsbCBpdHMgc3ViLWluc3RhbmNlcyAqLworCXJldCA9IHNuZF9jYXJkX3JlZ2lzdGVyKGRldi0+Y2hpcC5jYXJkKTsKKwlpZiAocmV0IDwgMCkgeworCQlsb2coInNuZF9jYXJkX3JlZ2lzdGVyKCkgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCXNuZF9jYXJkX2ZyZWUoZGV2LT5jaGlwLmNhcmQpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzbmRfY2FyZCogY3JlYXRlX2NhcmQoc3RydWN0IHVzYl9kZXZpY2UqIHVzYl9kZXYpCit7CisJaW50IGRldm51bTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldjsKKworCWZvciAoZGV2bnVtID0gMDsgZGV2bnVtIDwgU05EUlZfQ0FSRFM7IGRldm51bSsrKQorCQlpZiAoZW5hYmxlW2Rldm51bV0gJiYgIXNuZF9jYXJkX3VzZWRbZGV2bnVtXSkKKwkJCWJyZWFrOworCisJaWYgKGRldm51bSA+PSBTTkRSVl9DQVJEUykKKwkJcmV0dXJuIE5VTEw7CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4W2Rldm51bV0sIGlkW2Rldm51bV0sIFRISVNfTU9EVUxFLCAKKwkJCQkJc2l6ZW9mKHN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2KSk7CisJaWYgKCFjYXJkKQorCQlyZXR1cm4gTlVMTDsKKworCWRldiA9IGNhaWFxZGV2KGNhcmQpOworCWRldi0+Y2hpcC5kZXYgPSB1c2JfZGV2OworCWRldi0+Y2hpcC5jYXJkID0gY2FyZDsKKwlkZXYtPmNoaXAudXNiX2lkID0gVVNCX0lEKHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IsCisJCQkJCXVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5zcGlubG9jayk7CisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmdXNiX2Rldi0+ZGV2KTsKKworCXJldHVybiBjYXJkOworfQorCitzdGF0aWMgaW50IGluaXRfY2FyZChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2KQoreworCWNoYXIgKmM7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBkZXYtPmNoaXAuZGV2OworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGRldi0+Y2hpcC5jYXJkOworCWludCBlcnIsIGxlbjsKKwkKKwlpZiAodXNiX3NldF9pbnRlcmZhY2UodXNiX2RldiwgMCwgMSkgIT0gMCkgeworCQlsb2coImNhbid0IHNldCBhbHQgaW50ZXJmYWNlLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXVzYl9pbml0X3VyYigmZGV2LT5lcDFfaW5fdXJiKTsKKwl1c2JfaW5pdF91cmIoJmRldi0+bWlkaV9vdXRfdXJiKTsKKworCXVzYl9maWxsX2J1bGtfdXJiKCZkZXYtPmVwMV9pbl91cmIsIHVzYl9kZXYsIAorCQkJICB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgMHgxKSwKKwkJCSAgZGV2LT5lcDFfaW5fYnVmLCBFUDFfQlVGU0laRSwgCisJCQkgIHVzYl9lcDFfY29tbWFuZF9yZXBseV9kaXNwYXRjaCwgZGV2KTsKKworCXVzYl9maWxsX2J1bGtfdXJiKCZkZXYtPm1pZGlfb3V0X3VyYiwgdXNiX2RldiwgCisJCQkgIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCAweDEpLAorCQkJICBkZXYtPm1pZGlfb3V0X2J1ZiwgRVAxX0JVRlNJWkUsIAorCQkJICBzbmRfdXNiX2NhaWFxX21pZGlfb3V0cHV0X2RvbmUsIGRldik7CisJCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5lcDFfd2FpdF9xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5wcmVwYXJlX3dhaXRfcXVldWUpOworCQorCWlmICh1c2Jfc3VibWl0X3VyYigmZGV2LT5lcDFfaW5fdXJiLCBHRlBfS0VSTkVMKSAhPSAwKQorCQlyZXR1cm4gLUVJTzsKKworCWVyciA9IHNlbmRfY29tbWFuZChkZXYsIEVQMV9DTURfR0VUX0RFVklDRV9JTkZPLCBOVUxMLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCF3YWl0X2V2ZW50X3RpbWVvdXQoZGV2LT5lcDFfd2FpdF9xdWV1ZSwgZGV2LT5zcGVjX3JlY2VpdmVkLCBIWikpCisJCXJldHVybiAtRU5PREVWOworCisJdXNiX3N0cmluZyh1c2JfZGV2LCB1c2JfZGV2LT5kZXNjcmlwdG9yLmlNYW51ZmFjdHVyZXIsCisJCSAgIGRldi0+dmVuZG9yX25hbWUsIENBSUFRX1VTQl9TVFJfTEVOKTsKKwkKKwl1c2Jfc3RyaW5nKHVzYl9kZXYsIHVzYl9kZXYtPmRlc2NyaXB0b3IuaVByb2R1Y3QsCisJCSAgIGRldi0+cHJvZHVjdF9uYW1lLCBDQUlBUV9VU0JfU1RSX0xFTik7CisJCisJdXNiX3N0cmluZyh1c2JfZGV2LCB1c2JfZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsCisJCSAgIGRldi0+c2VyaWFsLCBDQUlBUV9VU0JfU1RSX0xFTik7CisKKwkvKiB0ZXJtaW5hdGUgc2VyaWFsIHN0cmluZyBhdCBmaXJzdCB3aGl0ZSBzcGFjZSBvY2N1cmVuY2UgKi8KKwljID0gc3RyY2hyKGRldi0+c2VyaWFsLCAnICcpOworCWlmIChjKQorCQkqYyA9ICdcMCc7CisJCisJc3RyY3B5KGNhcmQtPmRyaXZlciwgTU9ETkFNRSk7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgZGV2LT5wcm9kdWN0X25hbWUpOworCisJbGVuID0gc25wcmludGYoY2FyZC0+bG9uZ25hbWUsIHNpemVvZihjYXJkLT5sb25nbmFtZSksCisJCSAgICAgICAiJXMgJXMgKHNlcmlhbCAlcywgIiwKKwkJICAgICAgIGRldi0+dmVuZG9yX25hbWUsIGRldi0+cHJvZHVjdF9uYW1lLCBkZXYtPnNlcmlhbCk7CisKKwlpZiAobGVuIDwgc2l6ZW9mKGNhcmQtPmxvbmduYW1lKSAtIDIpCisJCWxlbiArPSB1c2JfbWFrZV9wYXRoKHVzYl9kZXYsIGNhcmQtPmxvbmduYW1lICsgbGVuLAorCQkJCSAgICAgc2l6ZW9mKGNhcmQtPmxvbmduYW1lKSAtIGxlbik7CisKKwljYXJkLT5sb25nbmFtZVtsZW4rK10gPSAnKSc7CisJY2FyZC0+bG9uZ25hbWVbbGVuXSA9ICdcMCc7CisJc2V0dXBfY2FyZChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgCisJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkOworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXZpY2UgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCQorCWNhcmQgPSBjcmVhdGVfY2FyZChkZXZpY2UpOworCQorCWlmICghY2FyZCkKKwkJcmV0dXJuIC1FTk9NRU07CisJCQkKKwlkZXZfc2V0X2RydmRhdGEoJmludGYtPmRldiwgY2FyZCk7CisJcmV0ID0gaW5pdF9jYXJkKGNhaWFxZGV2KGNhcmQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlsb2coInVuYWJsZSB0byBpbml0IGNhcmQhIChyZXQ9JWQpXG4iLCByZXQpOworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCQlyZXR1cm4gcmV0OworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldjsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoJmludGYtPmRldik7CisKKwlkZWJ1Zygic25kX2Rpc2Nvbm5lY3QoJXApXG4iLCBpbnRmKTsKKworCWlmICghY2FyZCkKKwkJcmV0dXJuOworCisJZGV2ID0gY2FpYXFkZXYoY2FyZCk7CisJc25kX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKKworI2lmZGVmIENPTkZJR19TTkRfVVNCX0NBSUFRX0lOUFVUCisJc25kX3VzYl9jYWlhcV9pbnB1dF9mcmVlKGRldik7CisjZW5kaWYKKwlzbmRfdXNiX2NhaWFxX2F1ZGlvX2ZyZWUoZGV2KTsKKwkKKwl1c2Jfa2lsbF91cmIoJmRldi0+ZXAxX2luX3VyYik7CisJdXNiX2tpbGxfdXJiKCZkZXYtPm1pZGlfb3V0X3VyYik7CisJCisJc25kX2NhcmRfZnJlZShjYXJkKTsKKwl1c2JfcmVzZXRfZGV2aWNlKGludGVyZmFjZV90b191c2JkZXYoaW50ZikpOworfQorCisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBzbmRfdXNiX2lkX3RhYmxlKTsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzbmRfdXNiX2RyaXZlciA9IHsKKwkubmFtZSAJCT0gTU9ETkFNRSwKKwkucHJvYmUgCQk9IHNuZF9wcm9iZSwKKwkuZGlzY29ubmVjdAk9IHNuZF9kaXNjb25uZWN0LAorCS5pZF90YWJsZSAJPSBzbmRfdXNiX2lkX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc25kX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9yZWdpc3Rlcigmc25kX3VzYl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc25kX21vZHVsZV9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnNuZF91c2JfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc25kX21vZHVsZV9pbml0KQorbW9kdWxlX2V4aXQoc25kX21vZHVsZV9leGl0KQorCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvY2FpYXEtZGV2aWNlLmggYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg4ZDVlYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1kZXZpY2UuaApAQCAtMCwwICsxLDExNiBAQAorI2lmbmRlZiBDQUlBUV9ERVZJQ0VfSAorI2RlZmluZSBDQUlBUV9ERVZJQ0VfSAorCisjaW5jbHVkZSAiLi4vdXNiYXVkaW8uaCIKKworI2RlZmluZSBVU0JfVklEX05BVElWRUlOU1RSVU1FTlRTIDB4MTdjYworCisjZGVmaW5lIFVTQl9QSURfUklHS09OVFJPTDIJMHgxOTY5CisjZGVmaW5lIFVTQl9QSURfS09SRUNPTlRST0xMRVIgCTB4NDcxMQorI2RlZmluZSBVU0JfUElEX0FLMQkJMHgwODE1CisjZGVmaW5lIFVTQl9QSURfQVVESU84REoJMHgxOTc4CisKKyNkZWZpbmUgRVAxX0JVRlNJWkUgNjQKKyNkZWZpbmUgQ0FJQVFfVVNCX1NUUl9MRU4gMHhmZgorI2RlZmluZSBNQVhfU1RSRUFNUyAzMgorCisvLyNkZWZpbmUJU05EX1VTQl9DQUlBUV9ERUJVRworCisjZGVmaW5lIE1PRE5BTUUgInNuZC11c2ItY2FpYXEiCisjZGVmaW5lIGxvZyh4Li4uKSBzbmRfcHJpbnRrKEtFUk5fV0FSTklORyBNT0ROQU1FIiBsb2c6ICIgeCkKKworI2lmZGVmIFNORF9VU0JfQ0FJQVFfREVCVUcKKyNkZWZpbmUgZGVidWcoeC4uLikgc25kX3ByaW50ayhLRVJOX1dBUk5JTkcgTU9ETkFNRSAiIGRlYnVnOiAiIHgpCisjZWxzZQorI2RlZmluZSBkZWJ1Zyh4Li4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIEVQMV9DTURfR0VUX0RFVklDRV9JTkZPCTB4MQorI2RlZmluZSBFUDFfQ01EX1JFQURfRVJQCTB4MgorI2RlZmluZSBFUDFfQ01EX1JFQURfQU5BTE9HCTB4MworI2RlZmluZSBFUDFfQ01EX1JFQURfSU8JCTB4NAorI2RlZmluZSBFUDFfQ01EX1dSSVRFX0lPCTB4NQorI2RlZmluZSBFUDFfQ01EX01JRElfUkVBRAkweDYKKyNkZWZpbmUgRVAxX0NNRF9NSURJX1dSSVRFCTB4NworI2RlZmluZSBFUDFfQ01EX0FVRElPX1BBUkFNUwkweDkKKyNkZWZpbmUgRVAxX0NNRF9BVVRPX01TRwkweGIKKworc3RydWN0IGNhaWFxX2RldmljZV9zcGVjIHsKKwl1bnNpZ25lZCBzaG9ydCBmd192ZXJzaW9uOworCXVuc2lnbmVkIGNoYXIgaHdfc3VidHlwZTsKKwl1bnNpZ25lZCBjaGFyIG51bV9lcnA7CisJdW5zaWduZWQgY2hhciBudW1fYW5hbG9nX2luOworCXVuc2lnbmVkIGNoYXIgbnVtX2RpZ2l0YWxfaW47CisJdW5zaWduZWQgY2hhciBudW1fZGlnaXRhbF9vdXQ7CisJdW5zaWduZWQgY2hhciBudW1fYW5hbG9nX2F1ZGlvX291dDsKKwl1bnNpZ25lZCBjaGFyIG51bV9hbmFsb2dfYXVkaW9faW47CisJdW5zaWduZWQgY2hhciBudW1fZGlnaXRhbF9hdWRpb19vdXQ7CisJdW5zaWduZWQgY2hhciBudW1fZGlnaXRhbF9hdWRpb19pbjsKKwl1bnNpZ25lZCBjaGFyIG51bV9taWRpX291dDsKKwl1bnNpZ25lZCBjaGFyIG51bV9taWRpX2luOworCXVuc2lnbmVkIGNoYXIgZGF0YV9hbGlnbm1lbnQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHNuZF91c2JfY2FpYXFfY2JfaW5mbzsKKworc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgeworCXN0cnVjdCBzbmRfdXNiX2F1ZGlvIGNoaXA7CisKKwlzdHJ1Y3QgdXJiIGVwMV9pbl91cmI7CisJc3RydWN0IHVyYiBtaWRpX291dF91cmI7CisJc3RydWN0IHVyYiAqKmRhdGFfdXJic19pbjsKKwlzdHJ1Y3QgdXJiICoqZGF0YV91cmJzX291dDsKKwlzdHJ1Y3Qgc25kX3VzYl9jYWlhcV9jYl9pbmZvICpkYXRhX2NiX2luZm87CisJCisJdW5zaWduZWQgY2hhciBlcDFfaW5fYnVmW0VQMV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGVwMV9vdXRfYnVmW0VQMV9CVUZTSVpFXTsKKwl1bnNpZ25lZCBjaGFyIG1pZGlfb3V0X2J1ZltFUDFfQlVGU0laRV07CisKKwlzdHJ1Y3QgY2FpYXFfZGV2aWNlX3NwZWMgc3BlYzsKKwlzcGlubG9ja190IHNwaW5sb2NrOworCXdhaXRfcXVldWVfaGVhZF90IGVwMV93YWl0X3F1ZXVlOworCXdhaXRfcXVldWVfaGVhZF90IHByZXBhcmVfd2FpdF9xdWV1ZTsKKwlpbnQgc3BlY19yZWNlaXZlZCwgYXVkaW9fcGFybV9hbnN3ZXI7CisJCisJY2hhciB2ZW5kb3JfbmFtZVtDQUlBUV9VU0JfU1RSX0xFTl07CisJY2hhciBwcm9kdWN0X25hbWVbQ0FJQVFfVVNCX1NUUl9MRU5dOworCWNoYXIgc2VyaWFsW0NBSUFRX1VTQl9TVFJfTEVOXTsKKworCWludCBuX3N0cmVhbXMsIG5fYXVkaW9faW4sIG5fYXVkaW9fb3V0OworCWludCBzdHJlYW1pbmcsIGZpcnN0X3BhY2tldCwgb3V0cHV0X3J1bm5pbmc7CisJaW50IGF1ZGlvX2luX2J1Zl9wb3NbTUFYX1NUUkVBTVNdOworCWludCBhdWRpb19vdXRfYnVmX3Bvc1tNQVhfU1RSRUFNU107CisJaW50IHBlcmlvZF9pbl9jb3VudFtNQVhfU1RSRUFNU107CisJaW50IHBlcmlvZF9vdXRfY291bnRbTUFYX1NUUkVBTVNdOworCWludCBpbnB1dF9wYW5pYywgb3V0cHV0X3BhbmljOworCWNoYXIgKmF1ZGlvX2luX2J1ZiwgKmF1ZGlvX291dF9idWY7CisJdW5zaWduZWQgaW50IHNhbXBsZXJhdGVzOworCisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJfcGxheWJhY2tbTUFYX1NUUkVBTVNdOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3ViX2NhcHR1cmVbTUFYX1NUUkVBTVNdOworCisJLyogTGludXggaW5wdXQgKi8KKyNpZmRlZiBDT05GSUdfU05EX1VTQl9DQUlBUV9JTlBVVAorCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKyNlbmRpZgorCQorCS8qIEFMU0EgKi8KKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCXN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHBjbV9pbmZvOworCXN0cnVjdCBzbmRfcmF3bWlkaSAqcm1pZGk7CisJc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqbWlkaV9yZWNlaXZlX3N1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICptaWRpX291dF9zdWJzdHJlYW07Cit9OworCitzdHJ1Y3Qgc25kX3VzYl9jYWlhcV9jYl9pbmZvIHsKKwlzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2OworCWludCBpbmRleDsKK307CisKKyNkZWZpbmUgY2FpYXFkZXYoYykgKChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiopKGMpLT5wcml2YXRlX2RhdGEpCisKK2ludCBzbmRfdXNiX2NhaWFxX3NldF9hdWRpb19wYXJhbXMgKHN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYsIGludCByYXRlLCBpbnQgZGVwdGgsIGludCBiYnApOworaW50IHNuZF91c2JfY2FpYXFfc2V0X2F1dG9fbXNnIChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LCBpbnQgZGlnaXRhbCwgaW50IGFuYWxvZywgaW50IGVycCk7CisKKworI2VuZGlmIC8qIENBSUFRX0RFVklDRV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvY2FpYXEtaW5wdXQuYyBiL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1pbnB1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhY2QxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtaW5wdXQuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChjKSAyMDA2LDIwMDcgRGFuaWVsIE1hY2ssIFRpbSBSdWV0egorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3Jhd21pZGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlICJjYWlhcS1kZXZpY2UuaCIKKyNpbmNsdWRlICJjYWlhcS1pbnB1dC5oIgorCisjaWZkZWYgQ09ORklHX1NORF9VU0JfQ0FJQVFfSU5QVVQKKworc3RhdGljIHVuc2lnbmVkIGNoYXIga2V5Y29kZV9hazFbXSA9ICB7IEtFWV9DLCBLRVlfQiwgS0VZX0EgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtleWNvZGVfcmsyW10gPSAgeyBLRVlfMSwgS0VZXzIsIEtFWV8zLCBLRVlfNCwgCisJCQkJCUtFWV81LCBLRVlfNiwgS0VZXzcgfTsKKworI2RlZmluZSBERUc5MCAgKHJhbmdlLzIpCisjZGVmaW5lIERFRzE4MCAocmFuZ2UpCisjZGVmaW5lIERFRzI3MCAoREVHOTAgKyBERUcxODApCisjZGVmaW5lIERFRzM2MCAoREVHMTgwICogMikKKyNkZWZpbmUgSElHSF9QRUFLICgyNjgpCisjZGVmaW5lIExPV19QRUFLICgtNykKKworLyogc29tZSBvZiB0aGVzZSBkZXZpY2VzIGhhdmUgZW5kbGVzcyByb3RhdGlvbiBwb3RlbnRpb21ldGVycworICogYnVpbHQgaW4gd2hpY2ggdXNlIHR3byB0YXBlcnMsIDkwIGRlZ3JlZXMgcGhhc2Ugc2hpZnRlZC4KKyAqIHRoaXMgYWxnb3JpdGhtIGRlY29kZXMgdGhlbSB0byBvbmUgc2luZ2xlIHZhbHVlLCByYW5naW5nCisgKiBmcm9tIDAgdG8gOTk5ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGRlY29kZV9lcnAodW5zaWduZWQgY2hhciBhLCB1bnNpZ25lZCBjaGFyIGIpCit7CisJaW50IHdlaWdodF9hLCB3ZWlnaHRfYjsKKwlpbnQgcG9zX2EsIHBvc19iOworCWludCByZXQ7CisJaW50IHJhbmdlID0gSElHSF9QRUFLIC0gTE9XX1BFQUs7CisJaW50IG1pZF92YWx1ZSA9IChISUdIX1BFQUsgKyBMT1dfUEVBSykgLyAyOworCisJd2VpZ2h0X2IgPSBhYnMobWlkX3ZhbHVlLWEpIC0gKHJhbmdlLzIgLSAxMDApLzI7CisJCisJaWYgKHdlaWdodF9iIDwgMCkKKwkJd2VpZ2h0X2IgPSAwOworCisJaWYgKHdlaWdodF9iID4gMTAwKQorCQl3ZWlnaHRfYiA9IDEwMDsKKworCXdlaWdodF9hID0gMTAwIC0gd2VpZ2h0X2I7CisKKwlpZiAoYSA8IG1pZF92YWx1ZSkgeworCQkvKiAwLi45MCBhbmQgMjcwLi4zNjAgZGVncmVlcyAqLworCQlwb3NfYiA9IGIgLSBMT1dfUEVBSyArIERFRzI3MDsKKwkJaWYgKHBvc19iID49IERFRzM2MCkKKwkJCXBvc19iIC09IERFRzM2MDsKKwl9IGVsc2UKKwkJLyogOTAuLjI3MCBkZWdyZWVzICovCisJCXBvc19iID0gSElHSF9QRUFLIC0gYiArIERFRzkwOworCisKKwlpZiAoYiA+IG1pZF92YWx1ZSkKKwkJLyogMC4uMTgwIGRlZ3JlZXMgKi8KKwkJcG9zX2EgPSBhIC0gTE9XX1BFQUs7CisJZWxzZQorCQkvKiAxODAuLjM2MCBkZWdyZWVzICovCisJCXBvc19hID0gSElHSF9QRUFLIC0gYSArIERFRzE4MDsKKworCS8qIGludGVycG9sYXRlIGJvdGggc2xpZGVyIHZhbHVlcywgZGVwZW5kaW5nIG9uIHdlaWdodCBmYWN0b3JzICovCisJLyogMC4uOTkgeCBERUczNjAgKi8KKwlyZXQgPSBwb3NfYSAqIHdlaWdodF9hICsgcG9zX2IgKiB3ZWlnaHRfYjsKKworCS8qIG5vcm1hbGl6ZSB0byAwLi45OTkgKi8KKwlyZXQgKj0gMTA7CisJcmV0IC89IERFRzM2MDsKKworCWlmIChyZXQgPCAwKQorCQlyZXQgKz0gMTAwMDsKKwkKKwlpZiAocmV0ID49IDEwMDApCisJCXJldCAtPSAxMDAwOworCisJcmV0dXJuIHJldDsKK30KKworI3VuZGVmIERFRzkwCisjdW5kZWYgREVHMTgwCisjdW5kZWYgREVHMjcwCisjdW5kZWYgREVHMzYwCisjdW5kZWYgSElHSF9QRUFLCisjdW5kZWYgTE9XX1BFQUsKKworCitzdGF0aWMgdm9pZCBzbmRfY2FpYXFfaW5wdXRfcmVhZF9hbmFsb2coc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiwgCisJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzd2l0Y2goZGV2LT5pbnB1dF9kZXYtPmlkLnByb2R1Y3QpIHsKKwljYXNlIFVTQl9QSURfUklHS09OVFJPTDI6CisJCWlucHV0X3JlcG9ydF9hYnMoZGV2LT5pbnB1dF9kZXYsIEFCU19YLCAoYnVmWzRdIDw8IDgpIHxidWZbNV0pOworCQlpbnB1dF9yZXBvcnRfYWJzKGRldi0+aW5wdXRfZGV2LCBBQlNfWSwgKGJ1ZlswXSA8PCA4KSB8YnVmWzFdKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYtPmlucHV0X2RldiwgQUJTX1osIChidWZbMl0gPDwgOCkgfGJ1ZlszXSk7CisJCWlucHV0X3N5bmMoZGV2LT5pbnB1dF9kZXYpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNuZF9jYWlhcV9pbnB1dF9yZWFkX2VycChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LCAKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCXN3aXRjaChkZXYtPmlucHV0X2Rldi0+aWQucHJvZHVjdCkgeworCWNhc2UgVVNCX1BJRF9BSzE6CisJCWkgPSBkZWNvZGVfZXJwKGJ1ZlswXSwgYnVmWzFdKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhkZXYtPmlucHV0X2RldiwgQUJTX1gsIGkpOworCQlpbnB1dF9zeW5jKGRldi0+aW5wdXRfZGV2KTsJCisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgc25kX2NhaWFxX2lucHV0X3JlYWRfaW8oc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiwgCisJCQkJICAgIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICprZXljb2RlID0gZGV2LT5pbnB1dF9kZXYtPmtleWNvZGU7CisKKwlpZiAoIWtleWNvZGUpCisJCXJldHVybjsKKworCWlmIChkZXYtPmlucHV0X2Rldi0+aWQucHJvZHVjdCA9PSBVU0JfUElEX1JJR0tPTlRST0wyKQorCQlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJCWJ1ZltpXSA9IH5idWZbaV07CisKKwlmb3IgKGk9MDsgKGk8ZGV2LT5pbnB1dF9kZXYtPmtleWNvZGVtYXgpICYmIChpIDwgbGVuKTsgaSsrKQorCQlpbnB1dF9yZXBvcnRfa2V5KGRldi0+aW5wdXRfZGV2LCBrZXljb2RlW2ldLCAKKwkJCQkJYnVmW2kvOF0gJiAoMSA8PCAoaSU4KSkpOworCisJaW5wdXRfc3luYyhkZXYtPmlucHV0X2Rldik7Cit9CisKK3ZvaWQgc25kX3VzYl9jYWlhcV9pbnB1dF9kaXNwYXRjaChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LCAKKwkJCQkgIGNoYXIgKmJ1ZiwgCisJCQkJICB1bnNpZ25lZCBpbnQgbGVuKQoreworCWlmICghZGV2LT5pbnB1dF9kZXYgfHwgKGxlbiA8IDEpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGJ1ZlswXSkgeworCWNhc2UgRVAxX0NNRF9SRUFEX0FOQUxPRzoKKwkJc25kX2NhaWFxX2lucHV0X3JlYWRfYW5hbG9nKGRldiwgYnVmKzEsIGxlbi0xKTsKKwkJYnJlYWs7CisJY2FzZSBFUDFfQ01EX1JFQURfRVJQOgorCQlzbmRfY2FpYXFfaW5wdXRfcmVhZF9lcnAoZGV2LCBidWYrMSwgbGVuLTEpOworCQlicmVhazsKKwljYXNlIEVQMV9DTURfUkVBRF9JTzoKKwkJc25kX2NhaWFxX2lucHV0X3JlYWRfaW8oZGV2LCBidWYrMSwgbGVuLTEpOworCQlicmVhazsKKwl9Cit9CisKK2ludCBzbmRfdXNiX2NhaWFxX2lucHV0X2luaXQoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGRldi0+Y2hpcC5kZXY7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJaW50IGksIHJldDsKKworCWlucHV0ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpbnB1dCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnB1dC0+bmFtZSA9IGRldi0+cHJvZHVjdF9uYW1lOworCWlucHV0LT5pZC5idXN0eXBlID0gQlVTX1VTQjsKKwlpbnB1dC0+aWQudmVuZG9yICA9IHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3I7CisJaW5wdXQtPmlkLnByb2R1Y3QgPSB1c2JfZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdDsKKwlpbnB1dC0+aWQudmVyc2lvbiA9IHVzYl9kZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlOworCisgICAgICAgIHN3aXRjaCAoZGV2LT5jaGlwLnVzYl9pZCkgeworCWNhc2UgVVNCX0lEKFVTQl9WSURfTkFUSVZFSU5TVFJVTUVOVFMsIFVTQl9QSURfUklHS09OVFJPTDIpOgorCQlpbnB1dC0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOworCQlpbnB1dC0+YWJzYml0WzBdID0gQklUKEFCU19YKSB8IEJJVChBQlNfWSkgfCBCSVQoQUJTX1opOworCQlpbnB1dC0+a2V5Y29kZSA9IGtleWNvZGVfcmsyOworCQlpbnB1dC0+a2V5Y29kZXNpemUgPSBzaXplb2YoY2hhcik7CisJCWlucHV0LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShrZXljb2RlX3JrMik7CisJCWZvciAoaT0wOyBpPEFSUkFZX1NJWkUoa2V5Y29kZV9yazIpOyBpKyspCisJCQlzZXRfYml0KGtleWNvZGVfcmsyW2ldLCBpbnB1dC0+a2V5Yml0KTsKKworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX1gsIDAsIDQwOTYsIDAsIDEwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19ZLCAwLCA0MDk2LCAwLCAxMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBBQlNfWiwgMCwgNDA5NiwgMCwgMTApOworCQlzbmRfdXNiX2NhaWFxX3NldF9hdXRvX21zZyhkZXYsIDEsIDEwLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfSUQoVVNCX1ZJRF9OQVRJVkVJTlNUUlVNRU5UUywgVVNCX1BJRF9BSzEpOgorCQlpbnB1dC0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKSB8IEJJVChFVl9BQlMpOworCQlpbnB1dC0+YWJzYml0WzBdID0gQklUKEFCU19YKTsKKwkJaW5wdXQtPmtleWNvZGUgPSBrZXljb2RlX2FrMTsKKwkJaW5wdXQtPmtleWNvZGVzaXplID0gc2l6ZW9mKGNoYXIpOworCQlpbnB1dC0+a2V5Y29kZW1heCA9IEFSUkFZX1NJWkUoa2V5Y29kZV9hazEpOworCQlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGtleWNvZGVfYWsxKTsgaSsrKQorCQkJc2V0X2JpdChrZXljb2RlX2FrMVtpXSwgaW5wdXQtPmtleWJpdCk7CisKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19YLCAwLCA5OTksIDAsIDEwKTsKKwkJc25kX3VzYl9jYWlhcV9zZXRfYXV0b19tc2coZGV2LCAxLCAwLCA1KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogbm8gaW5wdXQgbWV0aG9kcyBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UgKi8KKwkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOworCWlmIChyZXQgPCAwKSB7CisJCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXYtPmlucHV0X2RldiA9IGlucHV0OworCXJldHVybiAwOworfQorCit2b2lkIHNuZF91c2JfY2FpYXFfaW5wdXRfZnJlZShzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2KQoreworCWlmICghZGV2IHx8ICFkZXYtPmlucHV0X2RldikKKwkJcmV0dXJuOworCisJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT5pbnB1dF9kZXYpOworCWlucHV0X2ZyZWVfZGV2aWNlKGRldi0+aW5wdXRfZGV2KTsKKwlkZXYtPmlucHV0X2RldiA9IE5VTEw7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU05EX1VTQl9DQUlBUV9JTlBVVCAqLworCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvY2FpYXEvY2FpYXEtaW5wdXQuaCBiL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1pbnB1dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDUzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtaW5wdXQuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgQ0FJQVFfSU5QVVRfSAorI2RlZmluZSBDQUlBUV9JTlBVVF9ICisKK3ZvaWQgc25kX3VzYl9jYWlhcV9pbnB1dF9kaXNwYXRjaChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW4pOworaW50IHNuZF91c2JfY2FpYXFfaW5wdXRfaW5pdChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2KTsKK3ZvaWQgc25kX3VzYl9jYWlhcV9pbnB1dF9mcmVlKHN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1taWRpLmMgYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtbWlkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5M2NhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtbWlkaS5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIDIwMDYsMjAwNyBEYW5pZWwgTWFjaworICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3Jhd21pZGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKworI2luY2x1ZGUgImNhaWFxLWRldmljZS5oIgorI2luY2x1ZGUgImNhaWFxLW1pZGkuaCIKKworCitzdGF0aWMgaW50IHNuZF91c2JfY2FpYXFfbWlkaV9pbnB1dF9vcGVuKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfdXNiX2NhaWFxX21pZGlfaW5wdXRfY2xvc2Uoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfdXNiX2NhaWFxX21pZGlfaW5wdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCB1cCkKK3sKKwlzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2ID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFkZXYpCisJCXJldHVybjsKKwkKKwlkZXYtPm1pZGlfcmVjZWl2ZV9zdWJzdHJlYW0gPSB1cCA/IHN1YnN0cmVhbSA6IE5VTEw7Cit9CisKKworc3RhdGljIGludCBzbmRfdXNiX2NhaWFxX21pZGlfb3V0cHV0X29wZW4oc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF91c2JfY2FpYXFfbWlkaV9vdXRwdXRfY2xvc2Uoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbmRfdXNiX2NhaWFxX21pZGlfc2VuZChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LAorCQkJCSAgICBzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IGxlbiwgcmV0OworCQorCWRldi0+bWlkaV9vdXRfYnVmWzBdID0gRVAxX0NNRF9NSURJX1dSSVRFOworCWRldi0+bWlkaV9vdXRfYnVmWzFdID0gMDsgLyogcG9ydCAqLworCWxlbiA9IHNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWsoc3Vic3RyZWFtLCBkZXYtPm1pZGlfb3V0X2J1ZiszLCBFUDFfQlVGU0laRS0zKTsKKwkKKwlpZiAobGVuIDw9IDApCisJCXJldHVybjsKKwkKKwlkZXYtPm1pZGlfb3V0X2J1ZlsyXSA9IGxlbjsKKwlkZXYtPm1pZGlfb3V0X3VyYi50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gbGVuKzM7CisJCisJcmV0ID0gdXNiX3N1Ym1pdF91cmIoJmRldi0+bWlkaV9vdXRfdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmV0IDwgMCkKKwkJbG9nKCJzbmRfdXNiX2NhaWFxX21pZGlfc2VuZCglcCk6IHVzYl9zdWJtaXRfdXJiKCkgZmFpbGVkLCAlZFxuIiwKKwkJCQlzdWJzdHJlYW0sIHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF91c2JfY2FpYXFfbWlkaV9vdXRwdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCB1cCkKK3sKKwlzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2ID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCQorCWlmIChkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSAhPSBOVUxMKQorCQlyZXR1cm47CisJCisJaWYgKCF1cCkgeworCQlkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSA9IE5VTEw7CisJCXJldHVybjsKKwl9CisJCisJZGV2LT5taWRpX291dF9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJc25kX3VzYl9jYWlhcV9taWRpX3NlbmQoZGV2LCBzdWJzdHJlYW0pOworfQorCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3Jhd21pZGlfb3BzIHNuZF91c2JfY2FpYXFfbWlkaV9vdXRwdXQgPQoreworCS5vcGVuID0JCXNuZF91c2JfY2FpYXFfbWlkaV9vdXRwdXRfb3BlbiwKKwkuY2xvc2UgPQlzbmRfdXNiX2NhaWFxX21pZGlfb3V0cHV0X2Nsb3NlLAorCS50cmlnZ2VyID0gICAgICBzbmRfdXNiX2NhaWFxX21pZGlfb3V0cHV0X3RyaWdnZXIsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9yYXdtaWRpX29wcyBzbmRfdXNiX2NhaWFxX21pZGlfaW5wdXQgPQoreworCS5vcGVuID0JCXNuZF91c2JfY2FpYXFfbWlkaV9pbnB1dF9vcGVuLAorCS5jbG9zZSA9CXNuZF91c2JfY2FpYXFfbWlkaV9pbnB1dF9jbG9zZSwKKwkudHJpZ2dlciA9ICAgICAgc25kX3VzYl9jYWlhcV9taWRpX2lucHV0X3RyaWdnZXIsCit9OworCit2b2lkIHNuZF91c2JfY2FpYXFfbWlkaV9oYW5kbGVfaW5wdXQoc3RydWN0IHNuZF91c2JfY2FpYXFkZXYgKmRldiwgCisJCQkJICAgICBpbnQgcG9ydCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCWlmICghZGV2LT5taWRpX3JlY2VpdmVfc3Vic3RyZWFtKQorCQlyZXR1cm47CisJCisJc25kX3Jhd21pZGlfcmVjZWl2ZShkZXYtPm1pZGlfcmVjZWl2ZV9zdWJzdHJlYW0sIGJ1ZiwgbGVuKTsKK30KKworaW50IF9fZGV2aW5pdCBzbmRfdXNiX2NhaWFxX21pZGlfaW5pdChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2aWNlKQoreworCWludCByZXQ7CisJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKKworCXJldCA9IHNuZF9yYXdtaWRpX25ldyhkZXZpY2UtPmNoaXAuY2FyZCwgZGV2aWNlLT5wcm9kdWN0X25hbWUsIDAsCisJCQkJCWRldmljZS0+c3BlYy5udW1fbWlkaV9vdXQsCisJCQkJCWRldmljZS0+c3BlYy5udW1fbWlkaV9pbiwKKwkJCQkJJnJtaWRpKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3RyY3B5KHJtaWRpLT5uYW1lLCBkZXZpY2UtPnByb2R1Y3RfbmFtZSk7CisKKwlybWlkaS0+aW5mb19mbGFncyA9IFNORFJWX1JBV01JRElfSU5GT19EVVBMRVg7CisJcm1pZGktPnByaXZhdGVfZGF0YSA9IGRldmljZTsKKworCWlmIChkZXZpY2UtPnNwZWMubnVtX21pZGlfb3V0ID4gMCkgeworCQlybWlkaS0+aW5mb19mbGFncyB8PSBTTkRSVl9SQVdNSURJX0lORk9fT1VUUFVUOworCQlzbmRfcmF3bWlkaV9zZXRfb3BzKHJtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9PVVRQVVQsIAorCQkJCSAgICAmc25kX3VzYl9jYWlhcV9taWRpX291dHB1dCk7CisJfQorCisJaWYgKGRldmljZS0+c3BlYy5udW1fbWlkaV9pbiA+IDApIHsKKwkJcm1pZGktPmluZm9fZmxhZ3MgfD0gU05EUlZfUkFXTUlESV9JTkZPX0lOUFVUOworCQlzbmRfcmF3bWlkaV9zZXRfb3BzKHJtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVCwgCisJCQkJICAgICZzbmRfdXNiX2NhaWFxX21pZGlfaW5wdXQpOworCX0KKwkKKwlkZXZpY2UtPnJtaWRpID0gcm1pZGk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzbmRfdXNiX2NhaWFxX21pZGlfb3V0cHV0X2RvbmUoc3RydWN0IHVyYiogdXJiKQoreworCXN0cnVjdCBzbmRfdXNiX2NhaWFxZGV2ICpkZXYgPSB1cmItPmNvbnRleHQ7CisgICAgICAJY2hhciAqYnVmID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJCisJaWYgKHVyYi0+c3RhdHVzICE9IDApCisJCXJldHVybjsKKworCWlmICghZGV2LT5taWRpX291dF9zdWJzdHJlYW0pCisJCXJldHVybjsKKworCXNuZF9yYXdtaWRpX3RyYW5zbWl0X2FjayhkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSwgYnVmWzJdKTsKKwlkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSA9IE5VTEw7CisJc25kX3VzYl9jYWlhcV9taWRpX3NlbmQoZGV2LCBkZXYtPm1pZGlfb3V0X3N1YnN0cmVhbSk7Cit9CisKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9jYWlhcS9jYWlhcS1taWRpLmggYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtbWlkaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTZkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC91c2IvY2FpYXEvY2FpYXEtbWlkaS5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBDQUlBUV9NSURJX0gKKyNkZWZpbmUgQ0FJQVFfTUlESV9ICisKK2ludCBzbmRfdXNiX2NhaWFxX21pZGlfaW5pdChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2KTsKK3ZvaWQgc25kX3VzYl9jYWlhcV9taWRpX2hhbmRsZV9pbnB1dChzdHJ1Y3Qgc25kX3VzYl9jYWlhcWRldiAqZGV2LCBpbnQgcG9ydCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKTsKK3ZvaWQgc25kX3VzYl9jYWlhcV9taWRpX291dHB1dF9kb25lKHN0cnVjdCB1cmIqIHVyYik7CisKKyNlbmRpZiAvKiBDQUlBUV9NSURJX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JhdWRpby5jIGIvc291bmQvdXNiL3VzYmF1ZGlvLmMKaW5kZXggYjZkODg2My4uOGViYzFhZCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYmF1ZGlvLmMKKysrIGIvc291bmQvdXNiL3VzYmF1ZGlvLmMKQEAgLTE4NzgsNiArMTg3OCw5IEBACiAJfQogCiAJLyogc2V0IHRoZSBwZXJpb2QgdGltZSBtaW5pbXVtIDFtcyAqLworCS8qIEZJWE1FOiBoaWdoLXNwZWVkIG1vZGUgYWxsb3dzIDEyNXVzIG1pbmltdW0gcGVyaW9kLCBidXQgbWFueSBwYXJ0cworCSAqIGluIHRoZSBjdXJyZW50IGNvZGUgYXNzdW1lIHRoZSAxbXMgcGVyaW9kLgorCSAqLwogCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9USU1FLAogCQkJCSAgICAgMTAwMCAqIE1JTl9QQUNLU19VUkIsCiAJCQkJICAgICAvKihucnBhY2tzICogTUFYX1VSQlMpICogMTAwMCovIFVJTlRfTUFYKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JtaWRpLmMgYi9zb3VuZC91c2IvdXNibWlkaS5jCmluZGV4IDI0ZjVhMjYuLjk5Mjk1ZjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JtaWRpLmMKKysrIGIvc291bmQvdXNiL3VzYm1pZGkuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiB1c2JtaWRpLmMgLSBBTFNBIFVTQiBNSURJIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IENsZW1lbnMgTGFkaXNjaAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDcgQ2xlbWVucyBMYWRpc2NoCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIEJhc2VkIG9uIHRoZSBPU1MgdXNiLW1pZGkgZHJpdmVyIGJ5IE5BR0FOTyBEYWlzdWtlLApAQCAtMTQ1LDYgKzE0NSw3IEBACiAJc3RydWN0IHVyYiogdXJiOwogCXN0cnVjdCB1c2JtaWRpX2luX3BvcnQgewogCQlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW07CisJCXU4IHJ1bm5pbmdfc3RhdHVzX2xlbmd0aDsKIAl9IHBvcnRzWzB4MTBdOwogCXU4IHNlZW5fZjU7CiAJdTggZXJyb3JfcmVzdWJtaXQ7CkBAIC0zNjYsNiArMzY3LDQ2IEBACiB9CiAKIC8qCisgKiBCdWdneSBNLUF1ZGlvIGRldmljZTogcnVubmluZyBzdGF0dXMgb24gaW5wdXQgcmVzdWx0cyBpbiBhIHBhY2tldCB0aGF0IGhhcworICogdGhlIGRhdGEgYnl0ZXMgYnV0IG5vdCB0aGUgc3RhdHVzIGJ5dGUgYW5kIHRoYXQgaXMgbWFya2VkIHdpdGggQ0lOIDQuCisgKi8KK3N0YXRpYyB2b2lkIHNuZF91c2JtaWRpX21hdWRpb19icm9rZW5fcnVubmluZ19zdGF0dXNfaW5wdXQoCisJCQkJCXN0cnVjdCBzbmRfdXNiX21pZGlfaW5fZW5kcG9pbnQqIGVwLAorCQkJCQl1aW50OF90KiBidWZmZXIsIGludCBidWZmZXJfbGVuZ3RoKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSArIDMgPCBidWZmZXJfbGVuZ3RoOyBpICs9IDQpCisJCWlmIChidWZmZXJbaV0gIT0gMCkgeworCQkJaW50IGNhYmxlID0gYnVmZmVyW2ldID4+IDQ7CisJCQl1OCBjaW4gPSBidWZmZXJbaV0gJiAweDBmOworCQkJc3RydWN0IHVzYm1pZGlfaW5fcG9ydCAqcG9ydCA9ICZlcC0+cG9ydHNbY2FibGVdOworCQkJaW50IGxlbmd0aDsKKwkJCQorCQkJbGVuZ3RoID0gc25kX3VzYm1pZGlfY2luX2xlbmd0aFtjaW5dOworCQkJaWYgKGNpbiA9PSAweGYgJiYgYnVmZmVyW2kgKyAxXSA+PSAweGY4KQorCQkJCTsgLyogcmVhbHRpbWUgbXNnOiBubyBydW5uaW5nIHN0YXR1cyBjaGFuZ2UgKi8KKwkJCWVsc2UgaWYgKGNpbiA+PSAweDggJiYgY2luIDw9IDB4ZSkKKwkJCQkvKiBjaGFubmVsIG1zZyAqLworCQkJCXBvcnQtPnJ1bm5pbmdfc3RhdHVzX2xlbmd0aCA9IGxlbmd0aCAtIDE7CisJCQllbHNlIGlmIChjaW4gPT0gMHg0ICYmCisJCQkJIHBvcnQtPnJ1bm5pbmdfc3RhdHVzX2xlbmd0aCAhPSAwICYmCisJCQkJIGJ1ZmZlcltpICsgMV0gPCAweDgwKQorCQkJCS8qIENJTiA0IHRoYXQgaXMgbm90IGEgU3lzRXggKi8KKwkJCQlsZW5ndGggPSBwb3J0LT5ydW5uaW5nX3N0YXR1c19sZW5ndGg7CisJCQllbHNlCisJCQkJLyoKKwkJCQkgKiBBbGwgb3RoZXIgbXNncyBjYW5ub3QgYmVnaW4gcnVubmluZyBzdGF0dXMuCisJCQkJICogKEEgY2hhbm5lbCBtc2cgc2VudCBhcyB0d28gb3IgdGhyZWUgQ0lOIDB4RgorCQkJCSAqIHBhY2tldHMgY291bGQgaW4gdGhlb3J5LCBidXQgdGhpcyBkZXZpY2UKKwkJCQkgKiBkb2Vzbid0IHVzZSB0aGlzIGZvcm1hdC4pCisJCQkJICovCisJCQkJcG9ydC0+cnVubmluZ19zdGF0dXNfbGVuZ3RoID0gMDsKKwkJCXNuZF91c2JtaWRpX2lucHV0X2RhdGEoZXAsIGNhYmxlLCAmYnVmZmVyW2kgKyAxXSwgbGVuZ3RoKTsKKwkJfQorfQorCisvKgogICogQWRkcyBvbmUgVVNCIE1JREkgcGFja2V0IHRvIHRoZSBvdXRwdXQgYnVmZmVyLgogICovCiBzdGF0aWMgdm9pZCBzbmRfdXNibWlkaV9vdXRwdXRfc3RhbmRhcmRfcGFja2V0KHN0cnVjdCB1cmIqIHVyYiwgdWludDhfdCBwMCwKQEAgLTUyNSw2ICs1NjYsMTIgQEAKIAkub3V0cHV0X3BhY2tldCA9IHNuZF91c2JtaWRpX291dHB1dF9taWRpbWFuX3BhY2tldCwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdXNiX3Byb3RvY29sX29wcyBzbmRfdXNibWlkaV9tYXVkaW9fYnJva2VuX3J1bm5pbmdfc3RhdHVzX29wcyA9IHsKKwkuaW5wdXQgPSBzbmRfdXNibWlkaV9tYXVkaW9fYnJva2VuX3J1bm5pbmdfc3RhdHVzX2lucHV0LAorCS5vdXRwdXQgPSBzbmRfdXNibWlkaV9zdGFuZGFyZF9vdXRwdXQsIAorCS5vdXRwdXRfcGFja2V0ID0gc25kX3VzYm1pZGlfb3V0cHV0X3N0YW5kYXJkX3BhY2tldCwKK307CisKIC8qCiAgKiBOb3ZhdGlvbiBVU0IgTUlESSBwcm90b2NvbDogbnVtYmVyIG9mIGRhdGEgYnl0ZXMgaXMgaW4gdGhlIGZpcnN0IGJ5dGUKICAqICh3aGVuIHJlY2VpdmluZykgKCsxISkgb3IgaW4gdGhlIHNlY29uZCBieXRlICh3aGVuIHNlbmRpbmcpOyBkYXRhIGJlZ2lucwpAQCAtOTE4LDcgKzk2NSwxMSBAQAogCX0KIAkvKiB3ZSBuZXZlciB1c2UgaW50ZXJydXB0IG91dHB1dCBwaXBlcyAqLwogCXBpcGUgPSB1c2Jfc25kYnVsa3BpcGUodW1pZGktPmNoaXAtPmRldiwgZXBfaW5mby0+b3V0X2VwKTsKLQllcC0+bWF4X3RyYW5zZmVyID0gdXNiX21heHBhY2tldCh1bWlkaS0+Y2hpcC0+ZGV2LCBwaXBlLCAxKTsKKwlpZiAodW1pZGktPmNoaXAtPnVzYl9pZCA9PSBVU0JfSUQoMHgwYTkyLCAweDEwMjApKSAvKiBFU0kgTTRVICovCisJCS8qIEZJWE1FOiB3ZSBuZWVkIG1vcmUgVVJCcyB0byBnZXQgcmVhc29uYWJsZSBiYW5kd2lkdGggaGVyZTogKi8KKwkJZXAtPm1heF90cmFuc2ZlciA9IDQ7CisJZWxzZQorCQllcC0+bWF4X3RyYW5zZmVyID0gdXNiX21heHBhY2tldCh1bWlkaS0+Y2hpcC0+ZGV2LCBwaXBlLCAxKTsKIAlidWZmZXIgPSB1c2JfYnVmZmVyX2FsbG9jKHVtaWRpLT5jaGlwLT5kZXYsIGVwLT5tYXhfdHJhbnNmZXIsCiAJCQkJICBHRlBfS0VSTkVMLCAmZXAtPnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWJ1ZmZlcikgewpAQCAtMTYwNiw2ICsxNjU3LDkgQEAKIAlzd2l0Y2ggKHF1aXJrID8gcXVpcmstPnR5cGUgOiBRVUlSS19NSURJX1NUQU5EQVJEX0lOVEVSRkFDRSkgewogCWNhc2UgUVVJUktfTUlESV9TVEFOREFSRF9JTlRFUkZBQ0U6CiAJCWVyciA9IHNuZF91c2JtaWRpX2dldF9tc19pbmZvKHVtaWRpLCBlbmRwb2ludHMpOworCQlpZiAoY2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDA3NjMsIDB4MDE1MCkpIC8qIE0tQXVkaW8gVW5vICovCisJCQl1bWlkaS0+dXNiX3Byb3RvY29sX29wcyA9CisJCQkJJnNuZF91c2JtaWRpX21hdWRpb19icm9rZW5fcnVubmluZ19zdGF0dXNfb3BzOwogCQlicmVhazsKIAljYXNlIFFVSVJLX01JRElfRklYRURfRU5EUE9JTlQ6CiAJCW1lbWNweSgmZW5kcG9pbnRzWzBdLCBxdWlyay0+ZGF0YSwKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JxdWlya3MuaCBiL3NvdW5kL3VzYi91c2JxdWlya3MuaAppbmRleCA4NTgyNjIwLi44ZmNiZTkzIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNicXVpcmtzLmgKKysrIGIvc291bmQvdXNiL3VzYnF1aXJrcy5oCkBAIC00MCw2ICs0MCwyOSBAQAogCS5iSW50ZXJmYWNlQ2xhc3MgPSBVU0JfQ0xBU1NfVkVORE9SX1NQRUMKIAogLyoKKyAqIExvZ2l0ZWNoIFF1aWNrQ2FtOiBiRGV2aWNlQ2xhc3MgaXMgdmVuZG9yLXNwZWNpZmljLCBzbyBnZW5lcmljIGludGVyZmFjZQorICogY2xhc3MgbWF0Y2hlcyBkbyBub3QgdGFrZSBlZmZlY3Qgd2l0aG91dCBhbiBleHBsaWNpdCBJRCBtYXRjaC4KKyAqLworeworCS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwKKwkJICAgICAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTIHwKKwkJICAgICAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX1NVQkNMQVNTLAorCS5pZFZlbmRvciA9IDB4MDQ2ZCwKKwkuaWRQcm9kdWN0ID0gMHgwOGYwLAorCS5iSW50ZXJmYWNlQ2xhc3MgPSBVU0JfQ0xBU1NfQVVESU8sCisJLmJJbnRlcmZhY2VTdWJDbGFzcyA9IFVTQl9TVUJDTEFTU19BVURJT19DT05UUk9MCit9LAoreworCS5tYXRjaF9mbGFncyA9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFIHwKKwkJICAgICAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTIHwKKwkJICAgICAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX1NVQkNMQVNTLAorCS5pZFZlbmRvciA9IDB4MDQ2ZCwKKwkuaWRQcm9kdWN0ID0gMHgwOGY2LAorCS5iSW50ZXJmYWNlQ2xhc3MgPSBVU0JfQ0xBU1NfQVVESU8sCisJLmJJbnRlcmZhY2VTdWJDbGFzcyA9IFVTQl9TVUJDTEFTU19BVURJT19DT05UUk9MCit9LAorCisvKgogICogWWFtYWhhIGRldmljZXMKICAqLwogCg==