LyoKICoJT1NTIGRyaXZlciBmb3IgTGludXggMi5bNDZdLnggZm9yCiAqCiAqCVRyaWRlbnQgNEQtV2F2ZQogKglTaVMgNzAxOAogKglBTGkgNTQ1MQogKglUdmlhL0lHU1QgQ3liZXJQcm8gNTA1MAogKgogKglEcml2ZXI6IEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CiAqCiAqICBCdWlsdCBmcm9tOgogKglMb3cgbGV2ZWwgY29kZTogPGF1ZGlvQHRyaWRlbnRtaWNyby5jb20+IGZyb20gQUxTQQogKglGcmFtZXdvcms6IFRob21hcyBTYWlsZXIgPHNhaWxlckBpZmUuZWUuZXRoei5jaD4KICoJRXh0ZW5kZWQgYnk6IFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPiAgCiAqCiAqICBIYWNrZWQgdXAgYnk6CiAqCUFhcm9uIEhvbHR6bWFuIDxhaG9sdHptYUBlc3MuZW5nci51dmljLmNhPgogKglPbGxpZSBMaG8gPG9sbGllQHNpcy5jb20udHc+IFNpUyA3MDE4IEF1ZGlvIENvcmUgU3VwcG9ydAogKglDaGluZy1MaW5nIExlZSA8Y2xpbmctbGlAYWxpLmNvbS50dz4gQUxpIDU0NTEgQXVkaW8gQ29yZSBTdXBwb3J0IAogKglNYXR0IFd1IDxtYXR0d3VAYWNlcnNvZnRlY2guY29tLmNuPiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQKICoJUGV0ZXIgV+RjaHRsZXIgPHB3YWVjaHRsZXJAbG9ld2Uta29tcC5kZT4gQ3liZXJQcm81MDUwIHN1cHBvcnQKICogICAgICBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QG11bGl4Lm9yZz4KICoKICoKICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAqCiAqICBIaXN0b3J5CiAqICB2MC4xNC4xMGoKICogIAlKYW51YXJ5IDMgMjAwNCBFdWdlbmUgVGVvIDxldWdlbmV0ZW9AZXVnZW5ldGVvLm5ldD4KICogIAltaW5vciBjbGVhbnVwIHRvIHVzZSBwcl9kZWJ1ZyBpbnN0ZWFkIG9mIFRSREJHIHNpbmNlIGl0IGlzIGFscmVhZHkKICogIAlkZWZpbmVkIGluIGxpbnV4L2tlcm5lbC5oLgogKiAgdjAuMTQuMTBpCiAqICAgICAgRGVjZW1iZXIgMjkgMjAwMyBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QG11bGl4Lm9yZz4KICogICAgICBtYWpvciBjbGVhbnVwIGZvciAyLjYsIGZpeCBhIGZldyBlcnJvciBwYXRjaCBidWdsZXRzCiAqICAgICAgd2l0aCByZXR1cm5pbmcgd2l0aG91dCBwcm9wZXJseSBjbGVhbmluZyB1cCBmaXJzdCwKICogICAgICBnZXQgcmlkIG9mIGxvY2tfa2VybmVsKCkuCiAqICB2MC4xNC4xMGgKICoJU2VwdCAxMCAyMDAyIFBhc2NhbCBTY2htaWR0IDxkZXIuZXJlbWl0QGVtYWlsLmRlPgogKglhZGRlZCBzdXBwb3J0IGZvciBBTGkgNTQ1MSBqb3lzdGljayBwb3J0CiAqICB2MC4xNC4xMGcKICoJU2VwdCAwNSAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CiAqCWFkYXB0IHRvIG5ldyBwY2kgam95c3RpY2sgYXR0YWNobWVudCBpbnRlcmZhY2UKICogIHYwLjE0LjEwZgogKiAgICAgIEp1bHkgMjQgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBwYXRjaCBmcm9tIEVyaWMgTGVtYXIgKHZpYSBJYW4gU29ib3JvZmYpOiBpbiBzdXNwZW5kIGFuZCByZXN1bWUsIAogKiAgICAgIGZpeCB3cm9uZyBjYXN0IGZyb20gcGNpX2RldiogdG8gc3RydWN0IHRyaWRlbnRfY2FyZCouIAogKiAgdjAuMTQuMTBlCiAqICAgICAgSnVseSAxOSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogKiAgICAgIHJld3JpdGUgdGhlIERNQSBidWZmZXIgYWxsb2NhdGlvbi9kZWFsbGNvYXRpb24gZnVuY3Rpb25zLCB0byBtYWtlIGl0IAogKiAgICAgIG1vZHVsYXIgYW5kIGZpeCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBjYWxsIGZyZWVfcGFnZXMgb24gbWVtb3J5IAogKiAgICAgIG9idGFpbmVkIHdpdGggcGNpX2FsbG9jX2NvbnNpc3RlbnQuIEFsc28gcmVtb3ZlIHVubmVjZXNzYXJ5ICNpZmRlZiAKICogICAgICBDT05GSUdfUFJPQ19GUyBhbmQgdmFyaW91cyBvdGhlciBjbGVhbnVwcy4KICogIHYwLjE0LjEwZAogKiAgICAgIEp1bHkgMTkgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBtYWRlIHNldmVyYWwgcHJpbnRrKEtFUk5fTk9USUNFLi4uKSBpbnRvIFRSREJHKC4uLiksIHRvIGF2b2lkIHNwYW1taW5nCiAqICAgICAgbXkgc3lzbG9nIHdpdGggaHVuZHJlZHMgb2YgbWVzc2FnZXMuIAogKiAgdjAuMTQuMTBjCiAqICAgICAgSnVseSAxNiAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPgogKiAgICAgIENsZWFuZWQgdXAgTGVpIEh1J3MgMC40LjEwIGRyaXZlciB0byBjb25mb3JtIHRvIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKICogICAgICBhbmQgdGhlIGNvZGluZyBzdHlsZSB1c2VkIGluIHRoZSByZXN0IG9mIHRoZSBmaWxlLiAKICogIHYwLjE0LjEwYgogKiAgICAgIEp1bmUgMjMgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KICogICAgICBhZGQgYSBtaXNzaW5nIHVubG9ja19zZXRfZm10LCByZW1vdmUgYSBzdXBlcmZsb3VzIGxvY2svdW5sb2NrIHBhaXIgCiAqICAgICAgd2l0aCBub3RoaW5nIGluIGJldHdlZW4uIAogKiAgdjAuMTQuMTBhCiAqICAgICAgSnVuZSAyMSAyMDAyIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAYWN0Y29tLmNvLmlsPiAKICogICAgICB1c2UgYSBkZWJ1ZyBtYWNybyBpbnN0ZWFkIG9mICNpZmRlZiBDT05GSUdfREVCVUcsIHRyaW0gdG8gODAgY29sdW1ucyAKICogICAgICBwZXIgbGluZSwgdXNlICdkbyB7fSB3aGlsZSAoMCknIGluIHN0YXRlbWVudCBtYWNyb3MuIAogKiAgdjAuMTQuMTAKICogICAgICBKdW5lIDYgMjAwMiBMZWkgSHUgPExlaV9odUBhbGkuY29tLnR3PgogKiAgICAgIHJld3JpdGUgdGhlIHBhcnQgdG8gcmVhZC93cml0ZSByZWdpc3RlcnMgb2YgYXVkaW8gY29kZWMgZm9yIEFsaTU0NTEgCiAqICB2MC4xNC45ZQogKiAgICAgIEphbnVhcnkgMiAyMDAyIFZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHVjdy5jej4gYWRkZWQgZ2FtZXBvcnQKICogICAgICBzdXBwb3J0IHRvIGF2b2lkIHJlc291cmNlIGNvbmZsaWN0IHdpdGggcGNpZ2FtZS5jCiAqICB2MC4xNC45ZAogKiAgCU9jdG9iZXIgOCAyMDAxIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgogKgl1c2Ugc2V0X2N1cnJlbnRfc3RhdGUsIHByb3Blcmx5IHJlbGVhc2UgcmVzb3VyY2VzIG9uIGZhaWx1cmUgaW4KICoJdHJpZGVudF9wcm9iZSwgZ2V0IHJpZCBvZiBjaGVja19yZWdpb24KICogIHYwLjE0LjljCiAqCUF1Z3VzdCAxMCAyMDAxIFBldGVyIFfkY2h0bGVyIDxwd2FlY2h0bGVyQGxvZXdlLWtvbXAuZGU+CiAqCWFkZGVkIHN1cHBvcnQgZm9yIFR2aWEgKGZvcm1lcmx5IEludGVncmFwaGljcy9JR1NUKSBDeWJlclBybzUwNTAKICoJdGhpcyBjaGlwIGlzIG9mdGVuIGZvdW5kIGluIHNldHRvcCBib3hlcyAoY29tYmluZWQgdmlkZW8rYXVkaW8pCiAqICB2MC4xNC45YgogKglTd2l0Y2ggdG8gc3RhdGljIGlubGluZSBub3QgZXh0ZXJuIGlubGluZSAoZ2NjIDMpCiAqICB2MC4xNC45YQogKglBdWcgNiAyMDAxIEFsYW4gQ294CiAqCTAuMTQuOSBjcmFzaGVkIG9uIHJtbW9kIGR1ZSB0byBhIHRpbWVyL2JoIGxlZnQgcnVubmluZy4gU2ltcGxpZmllZAogKgl0aGUgZXhpc3RpbmcgbG9naWMgKHRoZSBCSCBkb2Vzbid0IGhlbHAgYXMgYWM5NyBpcyBsb2NrX2lycXNhdmUpCiAqCWFuZCB1c2VkIGRlbF90aW1lcl9zeW5jIHRvIGNsZWFuIHVwCiAqCUZpeGVkIGEgcHJvYmxlbSB3aGVyZSB0aGUgQUxpIGNoYW5nZSBicm9rZSBteSBnZW5lcmljIGNhcmQKICogIHYwLjE0LjkKICoJSnVsIDEwIDIwMDEgTWF0dCBXdQogKglBZGQgSC9XIFZvbHVtZSBDb250cm9sCiAqICB2MC4xNC44YQogKglKdWx5IDcgMjAwMSBBbGFuIENveAogKglNb3ZlZCBNYXR0IFd1J3MgYWM5NyByZWdpc3RlciBjYWNoZSBpbnRvIHRoZSBjYXJkIHN0cnVjdHVyZQogKiAgdjAuMTQuOAogKglBcHIgMzAgMjAwMSBNYXR0IFd1CiAqCVNldCBFQlVGMSBhbmQgRUJVRjIgdG8gc3RpbGwgbW9kZQogKglBZGQgZGM5Ny9hYzk3IHJlc2V0IGZ1bmN0aW9uCiAqCUZpeCBwb3dlciBtYW5hZ2VtZW50OiBhbGlfcmVzdG9yZV9yZWdzCiAqICB1bnJlbGVhc2VkIAogKglNYXIgMDkgMjAwMSBNYXR0IFd1CiAqCUFkZCBjYWNoZSBmb3IgYWM5NyBhY2Nlc3MKICogIHYwLjE0LjcKICoJRmViIDA2IDIwMDEgTWF0dCBXdQogKglGaXggYWM5NyBpbml0aWFsaXphdGlvbgogKglGaXggYnVnOiBhbiBleHRyYSB0YWlsIHdpbGwgYmUgcGxheWVkIHdoZW4gcGxheWluZwogKglKYW4gMDUgMjAwMSBNYXR0IFd1CiAqCUltcGxlbWVudCBtdWx0aS1jaGFubmVscyBhbmQgUy9QRElGIGluIHN1cHBvcnQgZm9yIEFMaSAxNTM1KwogKiAgdjAuMTQuNiAKICoJTm92IDEgMjAwMCBDaGluZy1MaW5nIExlZQogKglGaXggdGhlIGJ1ZyBvZiBtZW1vcnkgbGVhayB3aGVuIHN3aXRjaGluZyA1LjEtY2hhbm5lbHMgdG8gMiBjaGFubmVscy4KICoJQWRkIGxvY2sgcHJvdGVjdGlvbiBpbnRvIGR5bmFtaWMgY2hhbmdpbmcgZm9ybWF0IG9mIGRhdGEuCiAqCU9jdCAxOCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCTUuMS1jaGFubmVscyBzdXBwb3J0IGZvciBBTGkKICoJSnVuZSAyOCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCVMvUERJRiBvdXQvaW4ocGxheWJhY2svcmVjb3JkKSBzdXBwb3J0IGZvciBBTGkgMTUzNSssIHVzaW5nIC9wcm9jIHRvIGJlIHNlbGVjdGVkIGJ5IHVzZXIKICoJU2ltcGxlIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBmb3IgQUxpCiAqICB2MC4xNC41IE1heSAyMyAyMDAwIE9sbGllIExobwogKiAgCU1pc2MgYnVnIGZpeCBmcm9tIHRoZSBOZXQKICogIHYwLjE0LjQgTWF5IDIwIDIwMDAgQWFyb24gSG9sdHptYW4KICogIAlGaXgga2ZyZWUnZCBtZW1vcnkgYWNjZXNzIGluIHJlbGVhc2UKICogIAlGaXggcmFjZSBpbiBvcGVuIHdoaWxlIGxvb2tpbmcgZm9yIGEgZnJlZSB2aXJ0dWFsIGNoYW5uZWwgc2xvdAogKiAgCXJlbW92ZSBvcGVuX3dhaXQgd3EgKHdoaWNoIGFwcGVhcnMgdG8gYmUgdW51c2VkKQogKiAgdjAuMTQuMyBNYXkgMTAgMjAwMCBPbGxpZSBMaG8KICoJZml4ZWQgYSBzbWFsbCBidWcgaW4gdHJpZGVudF91cGRhdGVfcHRyLCB4bW1zIDEuMC4xIG5vIGxvbmdlciB1c2VzIDEwMCUgQ1BVCiAqICB2MC4xNC4yIE1hciAyOSAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCUFkZCBjbGVhciB0byBzaWxlbmNlIGFkdmFuY2UgaW4gdHJpZGVudF91cGRhdGVfcHRyIAogKglmaXggaW52YWxpZCBkYXRhIG9mIHRoZSBlbmQgb2YgdGhlIHNvdW5kCiAqICB2MC4xNC4xIE1hciAyNCAyMDAwIENoaW5nLUxpbmcgTGVlCiAqCUFMaSA1NDUxIHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgTy5LLgogKglBTGkgNTQ1MSBvcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgc3RydWN0dXJlZCBiYXNlZCBvbiBzb25pY3ZpYmVzLCBhbmQKICoJc3VnZ2VzdGVkIHRvIG1lcmdlIGludG8gdGhpcyBmaWxlIGJ5IEFsYW4gQ294LgogKiAgdjAuMTQgTWFyIDE1IDIwMDAgT2xsaWUgTGhvCiAqCTUuMSBjaGFubmVsIG91dHB1dCBzdXBwb3J0IHdpdGggY2hhbm5lbCBiaW5kaW5nLiBXaGF0J3MgdGhlIE1hdHJpeCA/CiAqICB2MC4xMy4xIE1hciAxMCAyMDAwIE9sbGllIExobwogKglmZXcgbWlub3IgYnVncyBvbiBkdWFsIGNvZGVjIHN1cHBvcnQsIG5lZWRzIG1vcmUgdGVzdGluZwogKiAgdjAuMTMgTWFyIDAzIDIwMDAgT2xsaWUgTGhvCiAqCW5ldyBwY2lfKiBmb3IgMi40IGtlcm5lbCwgYmFjayBwb3J0ZWQgdG8gMi4yCiAqICB2MC4xMiBGZWIgMjMgMjAwMCBPbGxpZSBMaG8KICoJUHJlbGltaW5hcnkgUmVjb3JkaW5nIHN1cHBvcnQKICogIHYwLjExLjIgRmViIDE5IDIwMDAgT2xsaWUgTGhvCiAqCXJlbW92ZWQgaW5jb21wbGV0ZSBmdWxsLWR1bHBsZXggc3VwcG9ydAogKiAgdjAuMTEuMSBKYW4gMjggMjAwMCBPbGxpZSBMaG8KICoJc21hbGwgYnVnIGluIHNldHRpbmcgc2FtcGxlIHJhdGUgZm9yIDRkLW54IChyZXBvcnRlZCBieSBBYXJvbikKICogIHYwLjExIEphbiAyNyAyMDAwIE9sbGllIExobwogKglETUEgYnVnLCBzY2hlZHVsZXIgbGF0ZW5jeSwgc2Vjb25kIHRyeQogKiAgdjAuMTAgSmFuIDI0IDIwMDAgT2xsaWUgTGhvCiAqCURNQSBidWcgZml4ZWQsIGZvdW5kIGtlcm5lbCBzY2hlZHVsaW5nIHByb2JsZW0KICogIHYwLjA5IEphbiAyMCAyMDAwIE9sbGllIExobwogKglDbGVhbiB1cCBvZiBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyByb3V0aW5lIChwcmVwYXJlIGZvciBjaGFubmVsIGJpbmRpbmcpCiAqICB2MC4wOCBKYW4gMTQgMjAwMCBPbGxpZSBMaG8KICoJSXNvbGF0aW9uIG9mIEFDOTcgY29kZWMgY29kZQogKiAgdjAuMDcgSmFuIDEzIDIwMDAgT2xsaWUgTGhvCiAqCUdldCByaWQgb2YgdWdseSBvbGQgbG93IGxldmVsIGFjY2VzcyByb3V0aW5lcyAoZS5nLiBDSFJlZ3MubHAqKioqKQogKiAgdjAuMDYgSmFuIDExIDIwMDAgT2xsaWUgTGhvCiAqCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGR1YWwgKG1vcmUgPykgQUM5NyBjb2RlY3MKICogIHYwLjA1IEphbiAwOCAyMDAwIEx1Y2EgTW9udGVjY2hpYW5pIDxtLmx1Y2FAaW5hbWUuY29tPgogKglhZGFwdCB0byAyLjMueCBuZXcgX19zZXR1cC9fX2luaXQgY2FsbAogKiAgdjAuMDQgRGVjIDMxIDE5OTkgT2xsaWUgTGhvCiAqCU11bHRpcGxlIE9wZW4sIHVzaW5nIE1pZGRsZSBMb29wIEludGVycnVwdCB0byBzbW9vdGggcGxheWJhY2sKICogIHYwLjAzIERlYyAyNCAxOTk5IE9sbGllIExobwogKgltZW0gbGVhayBpbiBwcm9nX2RtYWJ1ZiBhbmQgZGVhbGxvY19kbWFidWYgcmVtb3ZlZAogKiAgdjAuMDIgRGVjIDE1IDE5OTkgT2xsaWUgTGhvCiAqCVNpUyA3MDE4IHN1cHBvcnQgYWRkZWQsIHBsYXliYWNrIE8uSy4KICogIHYwLjAxIEFsYW4gQ294IGV0LiBhbC4KICoJSW5pdGlhbCBSZWxlYXNlIGluIGtlcm5lbCAyLjMuMzAsIGRvZXMgbm90IHdvcmsKICogCiAqICBUb0RvCiAqCUNsZWFuIHVwIG9mIGxvdyBsZXZlbCBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyBjb2RlLiAoZG9uZSkKICoJRml4IHRoZSBidWcgb24gZG1hIGJ1ZmZlciBtYW5hZ2VtZW50IGluIHVwZGF0ZV9wdHIsIHJlYWQvd3JpdGUsIGRyYWluX2RhYyAoZG9uZSkKICoJRHVhbCBBQzk3IGNvZGVjcyBzdXBwb3J0IChkb25lKQogKglSZWNvcmRpbmcgc3VwcG9ydCAoZG9uZSkKICoJTW1hcCBzdXBwb3J0CiAqCSJDaGFubmVsIEJpbmRpbmciIGlvY3RsIGV4dGVuc2lvbiAoZG9uZSkKICoJbmV3IHBjaSBkZXZpY2UgZHJpdmVyIGludGVyZmFjZSBmb3IgMi40IGtlcm5lbCAoZG9uZSkKICoKICoJTG9jayBvcmRlciAoaGlnaC0+bG93KQogKgkJbG9jawktCWhhcmR3YXJlIGxvY2sKICoJCW9wZW5fbXV0ZXggLSAJZ3VhcmQgb3BlbnMKICoJCXNlbQktCWd1YXJkIGRtYWJ1Ziwgd3JpdGUgcmUtZW50cnkgZXRjCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvcG9sbC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvcG0uaD4KI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2RtYS5oPgoKI2lmIGRlZmluZWQoQ09ORklHX0FMUEhBX05BVVRJTFVTKSB8fCBkZWZpbmVkKENPTkZJR19BTFBIQV9HRU5FUklDKQojaW5jbHVkZSA8YXNtL2h3cnBiLmg+CiNlbmRpZgoKI2luY2x1ZGUgInRyaWRlbnQuaCIKCiNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTQuMTBqLTIuNiIKCiNpZiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVCkgfHwgKGRlZmluZWQoTU9EVUxFKSAmJiBkZWZpbmVkKENPTkZJR19HQU1FUE9SVF9NT0RVTEUpKQojZGVmaW5lIFNVUFBPUlRfSk9ZU1RJQ0sgMQojZW5kaWYKCi8qIG1hZ2ljIG51bWJlcnMgdG8gcHJvdGVjdCBvdXIgZGF0YSBzdHJ1Y3R1cmVzICovCiNkZWZpbmUgVFJJREVOVF9DQVJEX01BR0lDCTB4NTA3MjY5NkUJLyogIlByaW4iICovCiNkZWZpbmUgVFJJREVOVF9TVEFURV9NQUdJQwkweDYzNjU3MzczCS8qICJjZXNzIiAqLwoKI2RlZmluZSBUUklERU5UX0RNQV9NQVNLCTB4M2ZmZmZmZmYJLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLwojZGVmaW5lIEFMSV9ETUFfTUFTSwkJMHg3ZmZmZmZmZgkvKiBBTEkgVHJpZGVudHMgaGF2ZSAzMS1iaXQgRE1BLiBXb3cuICovCgojZGVmaW5lIE5SX0hXX0NICQkzMgoKLyogbWF4aW11bSBudW1iZXIgb2YgQUM5NyBjb2RlY3MgY29ubmVjdGVkLCBBQzk3IDIuMCBkZWZpbmVkIDQsIGJ1dCA3MDE4IGFuZCA0RC1OWCBvbmx5CiAgIGhhdmUgMiBTREFUQV9JTiBsaW5lcyAoY3VycmVudGx5KSAqLwojZGVmaW5lIE5SX0FDOTcJCTIKCi8qIG1pbm9yIG51bWJlciBvZiAvZGV2L3N3bW9kZW0gKHRlbXBvcmFyeSwgZXhwZXJpbWVudGFsKSAqLwojZGVmaW5lIFNORF9ERVZfU1dNT0RFTQk3CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgYWxpX211bHRpX2NoYW5uZWxzXzVfMVtdID0gewoJLypBTElfU1VSUl9MRUZUX0NIQU5ORUwsIEFMSV9TVVJSX1JJR0hUX0NIQU5ORUwsICovCglBTElfQ0VOVEVSX0NIQU5ORUwsCglBTElfTEVGX0NIQU5ORUwsCglBTElfU1VSUl9MRUZUX0NIQU5ORUwsCglBTElfU1VSUl9SSUdIVF9DSEFOTkVMCn07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NpemVbXSA9IHsgMSwgMiwgMiwgNCB9OwpzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKCnN0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfbWFnaWNbXSA9IEtFUk5fQ1JJVCAidHJpZGVudDogaW52YWxpZCBtYWdpYyB2YWx1ZSBpbiAlc1xuIjsKCmVudW0gewoJVFJJREVOVF80RF9EWCA9IDAsCglUUklERU5UXzREX05YLAoJU0lTXzcwMTgsCglBTElfNTQ1MSwKCUNZQkVSNTA1MAp9OwoKc3RhdGljIGNoYXIgKmNhcmRfbmFtZXNbXSA9IHsKCSJUcmlkZW50IDREV2F2ZSBEWCIsCgkiVHJpZGVudCA0RFdhdmUgTlgiLAoJIlNpUyA3MDE4IFBDSSBBdWRpbyIsCgkiQUxpIEF1ZGlvIEFjY2VsZXJhdG9yIiwKCSJUdmlhL0lHU1QgQ3liZXJQcm8gNTA1MCIKfTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB0cmlkZW50X3BjaV90YmxbXSA9IHsKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfVFJJREVOVCwgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWCksCgkJUENJX0NMQVNTX01VTFRJTUVESUFfQVVESU8gPDwgOCwgMHhmZmZmMDAsIFRSSURFTlRfNERfRFh9LAoJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9UUklERU5ULCBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSwKCQkwLCAwLCBUUklERU5UXzREX05YfSwKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU0ksIFBDSV9ERVZJQ0VfSURfU0lfNzAxOCksIDAsIDAsIFNJU183MDE4fSwKCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQUxJLCBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSwgMCwgMCwgQUxJXzU0NTF9LAoJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFUkcsIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApLAoJCTAsIDAsIENZQkVSNTA1MH0sCgl7MCx9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdHJpZGVudF9wY2lfdGJsKTsKCi8qICJzb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AgKi8Kc3RydWN0IHRyaWRlbnRfc3RhdGUgewoJdW5zaWduZWQgaW50IG1hZ2ljOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsJLyogQ2FyZCBpbmZvICovCgoJLyogZmlsZSBtb2RlICovCgltb2RlX3Qgb3Blbl9tb2RlOwoKCS8qIHZpcnR1YWwgY2hhbm5lbCBudW1iZXIgKi8KCWludCB2aXJ0OwoKCXN0cnVjdCBkbWFidWYgewoJCS8qIHdhdmUgc2FtcGxlIHN0dWZmICovCgkJdW5zaWduZWQgaW50IHJhdGU7CgkJdW5zaWduZWQgY2hhciBmbXQsIGVuYWJsZTsKCgkJLyogaGFyZHdhcmUgY2hhbm5lbCAqLwoJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWw7CgoJCS8qIE9TUyBidWZmZXIgbWFuYWdlbWVudCBzdHVmZiAqLwoJCXZvaWQgKnJhd2J1ZjsKCQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CgkJdW5zaWduZWQgYnVmb3JkZXI7CgkJdW5zaWduZWQgbnVtZnJhZzsKCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CgoJCS8qIG91ciBidWZmZXIgYWN0cyBsaWtlIGEgY2lyY3VsYXIgcmluZyAqLwoJCXVuc2lnbmVkIGh3cHRyOwkvKiB3aGVyZSBkbWEgbGFzdCBzdGFydGVkLCB1cGRhdGVkIGJ5IHVwZGF0ZV9wdHIgKi8KCQl1bnNpZ25lZCBzd3B0cjsJLyogd2hlcmUgZHJpdmVyIGxhc3QgY2xlYXIvZmlsbGVkLCB1cGRhdGVkIGJ5IHJlYWQvd3JpdGUgKi8KCQlpbnQgY291bnQ7CS8qIGJ5dGVzIHRvIGJlIGNvbXN1bWVkIG9yIGJlZW4gZ2VuZXJhdGVkIGJ5IGRtYSBtYWNoaW5lICovCgkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIGRtYWVkIGJ5IGhhcmR3YXJlICovCgoJCXVuc2lnbmVkIGVycm9yOwkvKiBudW1iZXIgb2Ygb3Zlci91bmRlcnJ1bnMgKi8KICAgICAgICAgICAgICAgIC8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLwoJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CQoKCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCgkJdW5zaWduZWQgZnJhZ3NpemU7CgkJdW5zaWduZWQgZG1hc2l6ZTsKCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKCgkJLyogT1NTIHN0dWZmICovCgkJdW5zaWduZWQgbWFwcGVkOjE7CgkJdW5zaWduZWQgcmVhZHk6MTsKCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CgkJdW5zaWduZWQgdXBkYXRlX2ZsYWc7CgkJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OwoJCWludCBvc3NtYXhmcmFnczsKCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKCgl9IGRtYWJ1ZjsKCgkvKiA1LjEgY2hhbm5lbHMgKi8KCXN0cnVjdCB0cmlkZW50X3N0YXRlICpvdGhlcl9zdGF0ZXNbNF07CglpbnQgbXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50OwoJdW5zaWduZWQgY2hhbnNfbnVtOwoJdW5zaWduZWQgbG9uZyBmbXRfZmxhZzsKCS8qIEd1YXJkIGFnYWluc3QgbW1hcC93cml0ZS9yZWFkIHJhY2VzICovCglzdHJ1Y3QgbXV0ZXggc2VtOwoKfTsKCi8qIGhhcmR3YXJlIGNoYW5uZWxzICovCnN0cnVjdCB0cmlkZW50X2NoYW5uZWwgewoJaW50IG51bTsgLyogY2hhbm5lbCBudW1iZXIgKi8KCXUzMiBsYmE7IC8qIExvb3AgQmVnaW5lIEFkZHJlc3MsIHdoZXJlIGRtYSBidWZmZXIgc3RhcnRzICovCgl1MzIgZXNvOyAvKiBFbmQgU2FtcGxlIE9mZnNldCwgd2VocmUgZG1hIGJ1ZmZlciBlbmRzICovIAoJICAgICAgICAgLyogKGluIHRoZSB1bml0IG9mIHNhbXBsZXMpICovCgl1MzIgZGVsdGE7IC8qIGRlbHRhIHZhbHVlLCBzYW1wbGUgcmF0ZSAvIDQ4ayBmb3IgcGxheWJhY2ssICovCgkgICAgICAgICAgIC8qIDQ4ay9zYW1wbGUgcmF0ZSBmb3IgcmVjb3JkaW5nICovCgl1MTYgYXR0cmlidXRlOyAvKiBjb250cm9sIHdoZXJlIFBDTSBkYXRhIGdvIGFuZCBjb21lICAqLwoJdTE2IGZtX3ZvbDsKCXUzMiBjb250cm9sOyAvKiBzaWduZWQvdW5zaWduZWQsIDgvMTYgYml0cywgbW9uby9zdGVyZW8gKi8KfTsKCnN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgewoJdTMyIHN0YXJ0OwoJdTMyIHN0b3A7Cgl1MzIgYWludDsKCXUzMiBhaW50X2VuOwp9OwoKc3RhdGljIHN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgYmFua19hX2FkZHJzID0gewoJVDREX1NUQVJUX0EsCglUNERfU1RPUF9BLAoJVDREX0FJTlRfQSwKCVQ0RF9BSU5URU5fQQp9OwoKc3RhdGljIHN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgYmFua19iX2FkZHJzID0gewoJVDREX1NUQVJUX0IsCglUNERfU1RPUF9CLAoJVDREX0FJTlRfQiwKCVQ0RF9BSU5URU5fQgp9OwoKc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgewoJLyogcmVnaXN0ZXIgYWRkcmVzc2VzIHRvIGNvbnRyb2wgYmFuayBvcGVyYXRpb25zICovCglzdHJ1Y3QgdHJpZGVudF9wY21fYmFua19hZGRyZXNzICphZGRyZXNzZXM7CgkvKiBlYWNoIGJhbmsgaGFzIDMyIGNoYW5uZWxzICovCgl1MzIgYml0bWFwOwkJLyogY2hhbm5lbCBhbGxvY2F0aW9uIGJpdG1hcCAqLwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCBjaGFubmVsc1szMl07Cn07CgpzdHJ1Y3QgdHJpZGVudF9jYXJkIHsKCXVuc2lnbmVkIGludCBtYWdpYzsKCgkvKiBXZSBrZWVwIHRyaWRlbnQgY2FyZHMgaW4gYSBsaW5rZWQgbGlzdCAqLwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqbmV4dDsKCgkvKiBzaW5nbGUgb3BlbiBsb2NrIG1lY2hhbmlzbSwgb25seSB1c2VkIGZvciByZWNvcmRpbmcgKi8KCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OwoKCS8qIFRoZSB0cmlkZW50IGhhcyBhIGNlcnRhaW4gYW1vdW50IG9mIGNyb3NzIGNoYW5uZWwgaW50ZXJhY3Rpb24KCSAgIHNvIHdlIHVzZSBhIHNpbmdsZSBwZXIgY2FyZCBsb2NrICovCglzcGlubG9ja190IGxvY2s7CgoJLyogUENJIGRldmljZSBzdHVmZiAqLwoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7Cgl1MTYgcGNpX2lkOwoJdTggcmV2aXNpb247CgoJLyogc291bmRjb3JlIHN0dWZmICovCglpbnQgZGV2X2F1ZGlvOwoKCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgKi8gCgkvKiBiYW5rcyBhbmQgY2hhbm5lbHMgKi8KCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3X2NvZGVjW05SX0FDOTddOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgYmFua3NbTlJfQkFOS1NdOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlc1tOUl9IV19DSF07CgoJLyogaGFyZHdhcmUgcmVzb3VyY2VzICovCgl1bnNpZ25lZCBsb25nIGlvYmFzZTsKCXUzMiBpcnE7CgoJLyogRnVuY3Rpb24gc3VwcG9ydCAqLwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqKCphbGxvY19wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKik7CglzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICooKmFsbG9jX3JlY19wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKik7Cgl2b2lkICgqZnJlZV9wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKiwgdW5zaWduZWQgaW50IGNoYW4pOwoJdm9pZCAoKmFkZHJlc3NfaW50ZXJydXB0KSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKTsKCgkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgZm9yIHNwZGlmIGluICovCglpbnQgbXVsdGlfY2hhbm5lbF91c2VfY291bnQ7CglpbnQgcmVjX2NoYW5uZWxfdXNlX2NvdW50OwoJdTE2IG1peGVyX3JlZ3NbNjRdW05SX0FDOTddOwkvKiBNYWRlIGNhcmQgbG9jYWwgYnkgQWxhbiAqLwoJaW50IG1peGVyX3JlZ3NfcmVhZHk7CgoJLyogQWRkZWQgZm9yIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sICovCglpbnQgaHd2b2xjdGw7CglzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKCgkvKiBHYW1lIHBvcnQgc3VwcG9ydCAqLwoJc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKfTsKCmVudW0gZG1hYnVmX21vZGUgewoJRE1fUExBWUJBQ0sgPSAwLAoJRE1fUkVDT1JECn07CgovKiB0YWJsZSB0byBtYXAgZnJvbSBDSEFOTkVMTUFTSyB0byBjaGFubmVsIGF0dHJpYnV0ZSBmb3IgU2lTIDcwMTggKi8Kc3RhdGljIHUxNiBtYXNrMmF0dHJbXSA9IHsKCVBDTV9MUiwgUENNX0xSLCBTVVJSX0xSLCBDRU5URVJfTEZFLAoJSFNFVCwgTUlDLCBNT0RFTV9MSU5FMSwgTU9ERU1fTElORTIsCglJMlNfTFIsIFNQRElGX0xSCn07CgovKiB0YWJsZSB0byBtYXAgZnJvbSBjaGFubmVsIGF0dHJpYnV0ZSB0byBDSEFOTkVMTUFTSyBmb3IgU2lTIDcwMTggKi8Kc3RhdGljIGludCBhdHRyMm1hc2tbXSA9IHsKCURTUF9CSU5EX01PREVNMSwgRFNQX0JJTkRfTU9ERU0yLCBEU1BfQklORF9GUk9OVCwgRFNQX0JJTkRfSEFORFNFVCwKCURTUF9CSU5EX0kyUywgRFNQX0JJTkRfQ0VOVEVSX0xGRSwgRFNQX0JJTkRfU1VSUiwgRFNQX0JJTkRfU1BESUYKfTsKCi8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSBmb3Igc3BkaWYgaW4gKi8Kc3RhdGljIGludCBhbGlfY2xvc2VfbXVsdGlfY2hhbm5lbHModm9pZCk7CnN0YXRpYyB2b2lkIGFsaV9kZWxheShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgaW50ZXJ2YWwpOwpzdGF0aWMgdm9pZCBhbGlfZGV0ZWN0X3NwZGlmX3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CgpzdGF0aWMgdm9pZCBhbGlfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZywgdTE2IHZhbCk7CnN0YXRpYyB1MTYgYWxpX2FjOTdfcmVhZChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZyk7CgpzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2FyZCAqZGV2czsKCnN0YXRpYyB2b2lkIHRyaWRlbnRfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWwpOwpzdGF0aWMgdTE2IHRyaWRlbnRfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpOwoKc3RhdGljIGludCB0cmlkZW50X29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKc3RhdGljIGludCB0cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCgkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CgpzdGF0aWMgdm9pZCBhbGlfYWM5N19zZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnLCB1MTYgdmFsKTsKc3RhdGljIHUxNiBhbGlfYWM5N19nZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnKTsKc3RhdGljIHZvaWQgYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgcmF0ZSk7CnN0YXRpYyB2b2lkIGFsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0KTsKc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmFsaV9hbGxvY19yZWNfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICphbGlfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CnN0YXRpYyB2b2lkIGFsaV9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKc3RhdGljIGludCBhbGlfc2V0dXBfbXVsdGlfY2hhbm5lbHMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGNoYW5fbnVtcyk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYWxpX2dldF9zcGRpZl9pbl9yYXRlKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOwpzdGF0aWMgdm9pZCBhbGlfc2V0dXBfc3BkaWZfaW4oc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CnN0YXRpYyB2b2lkIGFsaV9kaXNhYmxlX3NwZGlmX2luKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOwpzdGF0aWMgdm9pZCBhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGNoKTsKc3RhdGljIHZvaWQgYWxpX3NldHVwX3NwZGlmX291dChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgZmxhZyk7CnN0YXRpYyBpbnQgYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsCgkJCSBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCAKCQkJIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwgCgkJCSB1bnNpZ25lZCBpbnQgKnN0YXRlX2NudCk7CnN0YXRpYyBpbnQgYWxpX2FsbG9jYXRlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCAKCQkJCQkgICAgICAgaW50IGNoYW5fbnVtcyk7CnN0YXRpYyB2b2lkIGFsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKTsKCiNkZWZpbmUgc2Vla19vZmZzZXQoZG1hX3B0ciwgYnVmZmVyLCBjbnQsIG9mZnNldCwgY29weV9jb3VudCkJZG8geyBcCiAgICAgICAgKGRtYV9wdHIpICs9IChvZmZzZXQpOwkgIFwKCShidWZmZXIpICs9IChvZmZzZXQpOwkgIFwKICAgICAgICAoY250KSAtPSAob2Zmc2V0KTsJICBcCgkoY29weV9jb3VudCkgKz0gKG9mZnNldCk7IFwKfSB3aGlsZSAoMCkKCnN0YXRpYyBpbmxpbmUgaW50IGxvY2tfc2V0X2ZtdChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSogc3RhdGUpCnsKCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZzdGF0ZS0+Zm10X2ZsYWcpKQoJCXJldHVybiAtRUZBVUxUOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX3NldF9mbXQoc3RydWN0IHRyaWRlbnRfc3RhdGUqIHN0YXRlKQp7CgljbGVhcl9iaXQoMCwgJnN0YXRlLT5mbXRfZmxhZyk7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9lbmFibGVfbG9vcF9pbnRlcnJ1cHRzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXUzMiBnbG9iYWxfY29udHJvbDsKCglnbG9iYWxfY29udHJvbCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCXN3aXRjaCAoY2FyZC0+cGNpX2lkKSB7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQlnbG9iYWxfY29udHJvbCB8PSAoRU5ETFBfSUUgfCBNSURMUF9JRSB8IEJBTktfQl9FTik7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CgkJZ2xvYmFsX2NvbnRyb2wgfD0gKEVORExQX0lFIHwgTUlETFBfSUUpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KCglvdXRsKGdsb2JhbF9jb250cm9sLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCXByX2RlYnVnKCJ0cmlkZW50OiBFbmFibGUgTG9vcCBJbnRlcnJ1cHRzLCBnbG9iY3RsID0gMHglMDhYXG4iLAoJCSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKSk7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9kaXNhYmxlX2xvb3BfaW50ZXJydXB0cyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MzIgZ2xvYmFsX2NvbnRyb2w7CgoJZ2xvYmFsX2NvbnRyb2wgPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKCWdsb2JhbF9jb250cm9sICY9IH4oRU5ETFBfSUUgfCBNSURMUF9JRSk7CglvdXRsKGdsb2JhbF9jb250cm9sLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCXByX2RlYnVnKCJ0cmlkZW50OiBEaXNhYmxlZCBMb29wIEludGVycnVwdHMsIGdsb2JjdGwgPSAweCUwOFhcbiIsCgkJIGdsb2JhbF9jb250cm9sKTsKCglyZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQKdHJpZGVudF9lbmFibGVfdm9pY2VfaXJxKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rID0gJmNhcmQtPmJhbmtzW2NoYW5uZWwgPj4gNV07Cgl1MzIgcmVnLCBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50X2VuOwoKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CglyZWcgfD0gbWFzazsKCW91dGwocmVnLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CgojaWZkZWYgREVCVUcKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7Cglwcl9kZWJ1ZygidHJpZGVudDogZW5hYmxlZCBJUlEgb24gY2hhbm5lbCAlZCwgJXMgPSAweCUwOHgoYWRkcjolWClcbiIsCgkJIGNoYW5uZWwsIGFkZHIgPT0gVDREX0FJTlRFTl9CID8gIkFJTlRFTl9CIiA6ICJBSU5URU5fQSIsCgkJIHJlZywgYWRkcik7CiNlbmRpZiAvKiBERUJVRyAqLwp9CgpzdGF0aWMgdm9pZAp0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7Cgl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rID0gJmNhcmQtPmJhbmtzW2NoYW5uZWwgPj4gNV07Cgl1MzIgcmVnLCBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50X2VuOwoKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CglyZWcgJj0gfm1hc2s7CglvdXRsKHJlZywgVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoKCS8qIEFjayB0aGUgY2hhbm5lbCBpbiBjYXNlIHRoZSBpbnRlcnJ1cHQgd2FzIHNldCBiZWZvcmUgd2UgZGlzYWJsZSBpdC4gKi8KCW91dGwobWFzaywgVFJJRF9SRUcoY2FyZCwgYmFuay0+YWRkcmVzc2VzLT5haW50KSk7CgojaWZkZWYgREVCVUcKCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7Cglwcl9kZWJ1ZygidHJpZGVudDogZGlzYWJsZWQgSVJRIG9uIGNoYW5uZWwgJWQsICVzID0gMHglMDh4KGFkZHI6JVgpXG4iLAoJCSBjaGFubmVsLCBhZGRyID09IFQ0RF9BSU5URU5fQiA/ICJBSU5URU5fQiIgOiAiQUlOVEVOX0EiLAoJCSByZWcsIGFkZHIpOwojZW5kaWYgLyogREVCVUcgKi8KfQoKc3RhdGljIHZvaWQKdHJpZGVudF9zdGFydF92b2ljZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOwoJdTMyIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPnN0YXJ0OwoKI2lmZGVmIERFQlVHCgl1MzIgcmVnOwojZW5kaWYgLyogREVCVUcgKi8KCglvdXRsKG1hc2ssIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCiNpZmRlZiBERUJVRwoJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCXByX2RlYnVnKCJ0cmlkZW50OiBzdGFydCB2b2ljZSBvbiBjaGFubmVsICVkLCAlcyA9IDB4JTA4eChhZGRyOiVYKVxuIiwKCQkgY2hhbm5lbCwgYWRkciA9PSBUNERfU1RBUlRfQiA/ICJTVEFSVF9CIiA6ICJTVEFSVF9BIiwKCQkgcmVnLCBhZGRyKTsKI2VuZGlmIC8qIERFQlVHICovCn0KCnN0YXRpYyB2b2lkCnRyaWRlbnRfc3RvcF92b2ljZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOwoJdTMyIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPnN0b3A7CgojaWZkZWYgREVCVUcKCXUzMiByZWc7CiNlbmRpZiAvKiBERUJVRyAqLwoKCW91dGwobWFzaywgVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoKI2lmZGVmIERFQlVHCglyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOwoJcHJfZGVidWcoInRyaWRlbnQ6IHN0b3Agdm9pY2Ugb24gY2hhbm5lbCAlZCwgJXMgPSAweCUwOHgoYWRkcjolWClcbiIsCgkJIGNoYW5uZWwsIGFkZHIgPT0gVDREX1NUT1BfQiA/ICJTVE9QX0IiIDogIlNUT1BfQSIsCgkJIHJlZywgYWRkcik7CiNlbmRpZiAvKiBERUJVRyAqLwp9CgpzdGF0aWMgdTMyCnRyaWRlbnRfZ2V0X2ludGVycnVwdF9tYXNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsXTsKCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50OwoJcmV0dXJuIGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7Cn0KCnN0YXRpYyBpbnQKdHJpZGVudF9jaGVja19jaGFubmVsX2ludGVycnVwdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7Cgl1MzIgcmVnID0gdHJpZGVudF9nZXRfaW50ZXJydXB0X21hc2soY2FyZCwgY2hhbm5lbCA+PiA1KTsKCiNpZmRlZiBERUJVRwoJaWYgKHJlZyAmIG1hc2spCgkJcHJfZGVidWcoInRyaWRlbnQ6IGNoYW5uZWwgJWQgaGFzIGludGVycnVwdCwgJXMgPSAweCUwOHhcbiIsCgkJCSBjaGFubmVsLCByZWcgPT0gVDREX0FJTlRfQiA/ICJBSU5UX0IiIDogIkFJTlRfQSIsCgkJCSByZWcpOwojZW5kaWYgLyogREVCVUcgKi8KCXJldHVybiAocmVnICYgbWFzaykgPyAxIDogMDsKfQoKc3RhdGljIHZvaWQKdHJpZGVudF9hY2tfY2hhbm5lbF9pbnRlcnJ1cHQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbmsgPSAmY2FyZC0+YmFua3NbY2hhbm5lbCA+PiA1XTsKCXUzMiByZWcsIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPmFpbnQ7CgoJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCXJlZyAmPSBtYXNrOwoJb3V0bChyZWcsIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKCiNpZmRlZiBERUJVRwoJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9BSU5UX0IpKTsKCXByX2RlYnVnKCJ0cmlkZW50OiBBY2sgY2hhbm5lbCAlZCBpbnRlcnJ1cHQsIEFJTlRfQiA9IDB4JTA4eFxuIiwKCQkgY2hhbm5lbCwgcmVnKTsKI2VuZGlmIC8qIERFQlVHICovCn0KCnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICoKdHJpZGVudF9hbGxvY19wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuazsKCWludCBpZHg7CgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0JdOwoKCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgewoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OwoJCQljaGFubmVsLT5udW0gPSBpZHggKyAzMjsKCQkJcmV0dXJuIGNoYW5uZWw7CgkJfQoJfQoKCS8qIG5vIG1vcmUgZnJlZSBjaGFubmVscyBhdmFpbGFibGUgKi8KCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogbm8gbW9yZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBCLlxuIik7CglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKdHJpZGVudF9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQp7CglpbnQgYmFuazsKCXVuc2lnbmVkIGNoYXIgYjsKCglpZiAoY2hhbm5lbCA8IDMxIHx8IGNoYW5uZWwgPiA2MykKCQlyZXR1cm47CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYIHx8IAoJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSB7CgkJYiA9IGluYihUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7CgkJaWYgKChiICYgfjB4ODApID09IGNoYW5uZWwpCgkJCW91dGIoMHgwLCBUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7Cgl9CgoJYmFuayA9IGNoYW5uZWwgPj4gNTsKCWNoYW5uZWwgPSBjaGFubmVsICYgMHgxZjsKCgljYXJkLT5iYW5rc1tiYW5rXS5iaXRtYXAgJj0gfigxIDw8IChjaGFubmVsKSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICoKY3liZXJfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglpbnQgaWR4OwoKCS8qIFRoZSBjeWJlcnBybyA1MDUwIGhhcyBvbmx5IDMyIHZvaWNlcyBhbmQgb25lIGJhbmsgKi8KCS8qIC4uIGF0IGxlYXN0IHRoZXkgYXJlIG5vdCBkb2N1bWVudGVkIChpZiB5b3Ugd2FudCB0byBjYWxsIHRoYXQgCgkgKiBjcmFwIGRvY3VtZW50YXRpb24pLCBwZXJoYXBzIGJyb2tlbiA/ICovCgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwoKCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgewoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OwoJCQljaGFubmVsLT5udW0gPSBpZHg7CgkJCXJldHVybiBjaGFubmVsOwoJCX0KCX0KCgkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhaWxhYmxlICovCglwcmludGsoS0VSTl9FUlIgImN5YmVycHJvNTA1MDogbm8gbW9yZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBBLlxuIik7CglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKY3liZXJfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJaWYgKGNoYW5uZWwgPiAzMSkKCQlyZXR1cm47CgljYXJkLT5iYW5rc1tCQU5LX0FdLmJpdG1hcCAmPSB+KDEgPDwgKGNoYW5uZWwpKTsKfQoKc3RhdGljIGlubGluZSB2b2lkCmN5YmVyX291dGlkeChpbnQgcG9ydCwgaW50IGlkeCwgaW50IGRhdGEpCnsKCW91dGIoaWR4LCBwb3J0KTsKCW91dGIoZGF0YSwgcG9ydCArIDEpOwp9CgpzdGF0aWMgaW5saW5lIGludApjeWJlcl9pbmlkeChpbnQgcG9ydCwgaW50IGlkeCkKewoJb3V0YihpZHgsIHBvcnQpOwoJcmV0dXJuIGluYihwb3J0ICsgMSk7Cn0KCnN0YXRpYyBpbnQKY3liZXJfaW5pdF9yaXR1YWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJLyogc29tZSBibGFjayBtYWdpYywgdGFrZW4gZnJvbSBTREsgc2FtcGxlcyAqLwoJLyogcmVtb3ZlIHRoaXMgYW5kIG5vdGhpbmcgd2lsbCB3b3JrICovCglpbnQgcG9ydERhdDsKCWludCByZXQgPSAwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCgkvKgoJICogICAgICBLZWVwIGludGVycnVwdHMgb2ZmIGZvciB0aGUgY29uZmlndXJlIC0gd2UgZG9uJ3Qgd2FudCB0bwoJICogICAgICBjbGFzaCB3aXRoIGFub3RoZXIgY3liZXJwcm8gY29uZmlnIGV2ZW50CgkgKi8KCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJcG9ydERhdCA9IGN5YmVyX2luaWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUpOwoJLyogZW5hYmxlLCBpZiBpdCB3YXMgZGlzYWJsZWQgKi8KCWlmICgocG9ydERhdCAmIENZQkVSX0JNU0tfQVVFTlopICE9IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKSB7CgkJcHJpbnRrKEtFUk5fSU5GTyAiY3liZXJwcm81MDUwOiBlbmFibGluZyBhdWRpbyBjb250cm9sbGVyXG4iKTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSwgCgkJCSAgICAgcG9ydERhdCB8IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKTsKCQkvKiBjaGVjayBhZ2FpbiBpZiBoYXJkd2FyZSBpcyBlbmFibGVkIG5vdyAqLwoJCXBvcnREYXQgPSBjeWJlcl9pbmlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfQVVESU9fRU5BQkxFKTsKCX0KCWlmICgocG9ydERhdCAmIENZQkVSX0JNU0tfQVVFTlopICE9IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJjeWJlcnBybzUwNTA6IGluaXRBdWRpb0FjY2Vzczogbm8gc3VjY2Vzc1xuIik7CgkJcmV0ID0gLTE7Cgl9IGVsc2UgewoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCBDWUJFUl9JRFhfSVJRX0VOQUJMRSwgCgkJCSAgICAgQ1lCRVJfQk1TS19BVURJT19JTlRfRU5BQkxFKTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMSk7CgkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmEsIDB4MjApOwoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJiLCAweDA4KTsKCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMik7CgkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YjMsIDB4MDYpOwoJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJmLCAweDAwKTsKCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCXJldHVybiByZXQ7Cn0KCi8qICBjYWxsZWQgd2l0aCBzcGluIGxvY2sgaGVsZCAqLwoKc3RhdGljIGludAp0cmlkZW50X2xvYWRfY2hhbm5lbF9yZWdpc3RlcnMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdTMyICogZGF0YSwgCgkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJaW50IGk7CgoJaWYgKGNoYW5uZWwgPiA2MykKCQlyZXR1cm4gMDsKCgkvKiBzZWxlY3QgaGFyZHdhcmUgY2hhbm5lbCB0byB3cml0ZSAqLwoJb3V0YihjaGFubmVsLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOwoKCS8qIE91dHB1dCB0aGUgY2hhbm5lbCByZWdpc3RlcnMsIGJ1dCBkb24ndCB3cml0ZSByZWdpc3RlcgoJICAgdGhyZWUgdG8gYW4gQUxJIGNoaXAuICovCglmb3IgKGkgPSAwOyBpIDwgQ0hBTk5FTF9SRUdTOyBpKyspIHsKCQlpZiAoaSA9PSAzICYmIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKQoJCQljb250aW51ZTsKCQlvdXRsKGRhdGFbaV0sIFRSSURfUkVHKGNhcmQsIENIQU5ORUxfU1RBUlQgKyA0ICogaSkpOwoJfQoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxIHx8IAoJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSB7CgkJb3V0bChBTElfRU1PRF9TdGlsbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0VCVUYxKSk7CgkJb3V0bChBTElfRU1PRF9TdGlsbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0VCVUYyKSk7Cgl9CglyZXR1cm4gMTsKfQoKLyogY2FsbGVkIHdpdGggc3BpbiBsb2NrIGhlbGQgKi8Kc3RhdGljIGludAp0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7Cgl1bnNpZ25lZCBpbnQgZGF0YVtDSEFOTkVMX1JFR1MgKyAxXTsKCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWw7CgoJY2hhbm5lbCA9IHN0YXRlLT5kbWFidWYuY2hhbm5lbDsKCglkYXRhWzFdID0gY2hhbm5lbC0+bGJhOwoJZGF0YVs0XSA9IGNoYW5uZWwtPmNvbnRyb2w7CgoJc3dpdGNoIChzdGF0ZS0+Y2FyZC0+cGNpX2lkKSB7CgljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CgkJZGF0YVswXSA9IDA7CS8qIEN1cnJlbnQgU2FtcGxlIE9mZnNldCAqLwoJCWRhdGFbMl0gPSAoY2hhbm5lbC0+ZXNvIDw8IDE2KSB8IChjaGFubmVsLT5kZWx0YSAmIDB4ZmZmZik7CgkJZGF0YVszXSA9IDA7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKCQlkYXRhWzBdID0gMDsJLyogQ3VycmVudCBTYW1wbGUgT2Zmc2V0ICovCgkJZGF0YVsyXSA9IChjaGFubmVsLT5lc28gPDwgMTYpIHwgKGNoYW5uZWwtPmRlbHRhICYgMHhmZmZmKTsKCQlkYXRhWzNdID0gKGNoYW5uZWwtPmF0dHJpYnV0ZSA8PCAxNikgfCAoY2hhbm5lbC0+Zm1fdm9sICYgMHhmZmZmKTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKCQlkYXRhWzBdID0gMDsJLyogQ3VycmVudCBTYW1wbGUgT2Zmc2V0ICovCgkJZGF0YVsyXSA9IChjaGFubmVsLT5lc28gPDwgMTYpIHwgKGNoYW5uZWwtPmRlbHRhICYgMHhmZmZmKTsKCQlkYXRhWzNdID0gY2hhbm5lbC0+Zm1fdm9sICYgMHhmZmZmOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCWRhdGFbMF0gPSAoY2hhbm5lbC0+ZGVsdGEgPDwgMjQpOwoJCWRhdGFbMl0gPSAoKGNoYW5uZWwtPmRlbHRhIDw8IDE2KSAmIDB4ZmYwMDAwMDApIHwgCgkJCShjaGFubmVsLT5lc28gJiAweDAwZmZmZmZmKTsKCQlkYXRhWzNdID0gY2hhbm5lbC0+Zm1fdm9sICYgMHhmZmZmOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KCglyZXR1cm4gdHJpZGVudF9sb2FkX2NoYW5uZWxfcmVnaXN0ZXJzKHN0YXRlLT5jYXJkLCBkYXRhLCBjaGFubmVsLT5udW0pOwp9CgpzdGF0aWMgaW50CmNvbXB1dGVfcmF0ZV9wbGF5KHUzMiByYXRlKQp7CglpbnQgZGVsdGE7CgkvKiBXZSBzcGVjaWFsIGNhc2UgNDQxMDAgYW5kIDgwMDAgc2luY2Ugcm91bmRpbmcgd2l0aCB0aGUgZXF1YXRpb24KCSAgIGRvZXMgbm90IGdpdmUgdXMgYW4gYWNjdXJhdGUgZW5vdWdoIHZhbHVlLiBGb3IgMTEwMjUgYW5kIDIyMDUwCgkgICB0aGUgZXF1YXRpb24gZ2l2ZXMgdXMgdGhlIGJlc3QgYW5zd2VyLiBBbGwgb3RoZXIgZnJlcXVlbmNpZXMgd2lsbAoJICAgYWxzbyB1c2UgdGhlIGVxdWF0aW9uLiBKRFcgKi8KCWlmIChyYXRlID09IDQ0MTAwKQoJCWRlbHRhID0gMHhlYjM7CgllbHNlIGlmIChyYXRlID09IDgwMDApCgkJZGVsdGEgPSAweDJhYjsKCWVsc2UgaWYgKHJhdGUgPT0gNDgwMDApCgkJZGVsdGEgPSAweDEwMDA7CgllbHNlCgkJZGVsdGEgPSAoKChyYXRlIDw8IDEyKSArIHJhdGUpIC8gNDgwMDApICYgMHgwMDAwZmZmZjsKCXJldHVybiBkZWx0YTsKfQoKc3RhdGljIGludApjb21wdXRlX3JhdGVfcmVjKHUzMiByYXRlKQp7CglpbnQgZGVsdGE7CgoJaWYgKHJhdGUgPT0gNDQxMDApCgkJZGVsdGEgPSAweDExNmE7CgllbHNlIGlmIChyYXRlID09IDgwMDApCgkJZGVsdGEgPSAweDYwMDA7CgllbHNlIGlmIChyYXRlID09IDQ4MDAwKQoJCWRlbHRhID0gMHgxMDAwOwoJZWxzZQoJCWRlbHRhID0gKCg0ODAwMCA8PCAxMikgLyByYXRlKSAmIDB4MDAwMGZmZmY7CgoJcmV0dXJuIGRlbHRhOwp9CgovKiBzZXQgcGxheWJhY2sgc2FtcGxlIHJhdGUgKi8Kc3RhdGljIHVuc2lnbmVkIGludAp0cmlkZW50X3NldF9kYWNfcmF0ZShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCglpZiAocmF0ZSA+IDQ4MDAwKQoJCXJhdGUgPSA0ODAwMDsKCWlmIChyYXRlIDwgNDAwMCkKCQlyYXRlID0gNDAwMDsKCglkbWFidWYtPnJhdGUgPSByYXRlOwoJZG1hYnVmLT5jaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9wbGF5KHJhdGUpOwoKCXRyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyhzdGF0ZSk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IGNhbGxlZCB0cmlkZW50X3NldF9kYWNfcmF0ZSA6IHJhdGUgPSAlZFxuIiwgcmF0ZSk7CgoJcmV0dXJuIHJhdGU7Cn0KCi8qIHNldCByZWNvcmRpbmcgc2FtcGxlIHJhdGUgKi8Kc3RhdGljIHVuc2lnbmVkIGludAp0cmlkZW50X3NldF9hZGNfcmF0ZShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCglpZiAocmF0ZSA+IDQ4MDAwKQoJCXJhdGUgPSA0ODAwMDsKCWlmIChyYXRlIDwgNDAwMCkKCQlyYXRlID0gNDAwMDsKCglkbWFidWYtPnJhdGUgPSByYXRlOwoJZG1hYnVmLT5jaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9yZWMocmF0ZSk7CgoJdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHN0YXRlKTsKCglwcl9kZWJ1ZygidHJpZGVudDogY2FsbGVkIHRyaWRlbnRfc2V0X2FkY19yYXRlIDogcmF0ZSA9ICVkXG4iLCByYXRlKTsKCglyZXR1cm4gcmF0ZTsKfQoKLyogcHJlcGFyZSBjaGFubmVsIGF0dHJpYnV0ZXMgZm9yIHBsYXliYWNrICovCnN0YXRpYyB2b2lkCnRyaWRlbnRfcGxheV9zZXR1cChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9IGRtYWJ1Zi0+Y2hhbm5lbDsKCgljaGFubmVsLT5sYmEgPSBkbWFidWYtPmRtYV9oYW5kbGU7CgljaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9wbGF5KGRtYWJ1Zi0+cmF0ZSk7CgoJY2hhbm5lbC0+ZXNvID0gZG1hYnVmLT5kbWFzaXplID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CgljaGFubmVsLT5lc28gLT0gMTsKCglpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCAhPSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpIHsKCQljaGFubmVsLT5hdHRyaWJ1dGUgPSAwOwoJCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQkJaWYgKChjaGFubmVsLT5udW0gPT0gQUxJX1NQRElGX0lOX0NIQU5ORUwpIHx8IAoJCQkgICAgKGNoYW5uZWwtPm51bSA9PSBBTElfUENNX0lOX0NIQU5ORUwpKQoJCQkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0YXRlLT5jYXJkLCBjaGFubmVsLT5udW0pOwoJCQllbHNlIGlmICgoaW5sKFRSSURfUkVHKHN0YXRlLT5jYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKSAKCQkJCSAgJiBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkKCQkJCSAmJiAoY2hhbm5lbC0+bnVtID09IEFMSV9TUERJRl9PVVRfQ0hBTk5FTCkpIHsKCQkJCWFsaV9zZXRfc3BkaWZfb3V0X3JhdGUoc3RhdGUtPmNhcmQsIAoJCQkJCQkgICAgICAgc3RhdGUtPmRtYWJ1Zi5yYXRlKTsKCQkJCXN0YXRlLT5kbWFidWYuY2hhbm5lbC0+ZGVsdGEgPSAweDEwMDA7CgkJCX0KCQl9Cgl9CgoJY2hhbm5lbC0+Zm1fdm9sID0gMHgwOwoKCWNoYW5uZWwtPmNvbnRyb2wgPSBDSEFOTkVMX0xPT1A7CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgewoJCS8qIDE2LWJpdHMgKi8KCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfMTZCSVRTOwoJCS8qIHNpZ25lZCAqLwoJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF9TSUdORUQ7Cgl9CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pCgkJLyogc3RlcmVvICovCgkJY2hhbm5lbC0+Y29udHJvbCB8PSBDSEFOTkVMX1NURVJFTzsKCglwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9wbGF5X3NldHVwLCBMQkEgPSAweCUwOHgsIERlbHRhID0gMHglMDh4LCAiCgkJICJFU08gPSAweCUwOHgsIENvbnRyb2wgPSAweCUwOHhcbiIsIGNoYW5uZWwtPmxiYSwKCQkgY2hhbm5lbC0+ZGVsdGEsIGNoYW5uZWwtPmVzbywgY2hhbm5lbC0+Y29udHJvbCk7CgoJdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHN0YXRlKTsKfQoKLyogcHJlcGFyZSBjaGFubmVsIGF0dHJpYnV0ZXMgZm9yIHJlY29yZGluZyAqLwpzdGF0aWMgdm9pZAp0cmlkZW50X3JlY19zZXR1cChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXUxNiB3OwoJdTggYnZhbDsKCglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSBkbWFidWYtPmNoYW5uZWw7Cgl1bnNpZ25lZCBpbnQgcmF0ZTsKCgkvKiBFbmFibGUgQUMtOTcgQURDIChjYXB0dXJlKSAqLwoJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKCWNhc2UgUENJX0RFVklDRV9JRF9BTElfNTQ1MToKCQlhbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChzdGF0ZSk7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQkvKiBmb3IgNzAxOCwgdGhlIGFjOTcgaXMgYWx3YXlzIGluIHBsYXliYWNrL3JlY29yZCAoZHVwbGV4KSBtb2RlICovCgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CgkJdyA9IGluYihUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKCQlvdXRiKHcgfCAweDQ4LCBUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKCQkvKiBlbmFibGUgYW5kIHNldCByZWNvcmQgY2hhbm5lbCAqLwoJCW91dGIoMHg4MCB8IGNoYW5uZWwtPm51bSwgVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCXcgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKCQlvdXR3KHcgfCAweDEwMDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgkJLyogZW5hYmxlIGFuZCBzZXQgcmVjb3JkIGNoYW5uZWwgKi8KCQlvdXRiKDB4ODAgfCBjaGFubmVsLT5udW0sIFRSSURfUkVHKGNhcmQsIFQ0RF9SRUNfQ0gpKTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKCQkvKiBkb24ndCBrbm93IHlldCwgdXNpbmcgc3BlY2lhbCBjaGFubmVsIDIyIGluIEdDMSgweGQ0KT8gKi8KCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuOwoJfQoKCWNoYW5uZWwtPmxiYSA9IGRtYWJ1Zi0+ZG1hX2hhbmRsZTsKCWNoYW5uZWwtPmRlbHRhID0gY29tcHV0ZV9yYXRlX3JlYyhkbWFidWYtPnJhdGUpOwoJaWYgKChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgJiYgCgkgICAgKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkpIHsKCQlyYXRlID0gYWxpX2dldF9zcGRpZl9pbl9yYXRlKGNhcmQpOwoJCWlmIChyYXRlID09IDApIHsKCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogQUxpIDU0NTEgIgoJCQkgICAgICAgIlMvUERJRiBpbnB1dCBzZXR1cCBlcnJvciFcbiIpOwoJCQlyYXRlID0gNDgwMDA7CgkJfQoJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCQlpZiAoYnZhbCAmIDB4MTApIHsKCQkJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBjbGVhcmVkIEFMaSAiCgkJCSAgICAgICAiNTQ1MSBTL1BESUYgcGFyaXR5IGVycm9yIGZsYWcuXG4iKTsKCQl9CgoJCWlmIChyYXRlICE9IDQ4MDAwKQoJCQljaGFubmVsLT5kZWx0YSA9ICgocmF0ZSA8PCAxMikgLyBkbWFidWYtPnJhdGUpICYgMHgwMDAwZmZmZjsKCX0KCgljaGFubmVsLT5lc28gPSBkbWFidWYtPmRtYXNpemUgPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKCWNoYW5uZWwtPmVzbyAtPSAxOwoKCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkICE9IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewoJCWNoYW5uZWwtPmF0dHJpYnV0ZSA9IDA7Cgl9CgoJY2hhbm5lbC0+Zm1fdm9sID0gMHgwOwoKCWNoYW5uZWwtPmNvbnRyb2wgPSBDSEFOTkVMX0xPT1A7CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgewoJCS8qIDE2LWJpdHMgKi8KCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfMTZCSVRTOwoJCS8qIHNpZ25lZCAqLwoJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF9TSUdORUQ7Cgl9CglpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pCgkJLyogc3RlcmVvICovCgkJY2hhbm5lbC0+Y29udHJvbCB8PSBDSEFOTkVMX1NURVJFTzsKCglwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9yZWNfc2V0dXAsIExCQSA9IDB4JTA4eCwgRGVsYXQgPSAweCUwOHgsICIKCQkgIkVTTyA9IDB4JTA4eCwgQ29udHJvbCA9IDB4JTA4eFxuIiwgY2hhbm5lbC0+bGJhLAoJCSBjaGFubmVsLT5kZWx0YSwgY2hhbm5lbC0+ZXNvLCBjaGFubmVsLT5jb250cm9sKTsKCgl0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RhdGUpOwp9CgovKiBnZXQgY3VycmVudCBwbGF5YmFjay9yZWNvcmRpbmcgZG1hIGJ1ZmZlciBwb2ludGVyIChieXRlIG9mZnNldCBmcm9tIExCQSksCiAgIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQKdHJpZGVudF9nZXRfZG1hX2FkZHIoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXUzMiBjc287CgoJaWYgKCFkbWFidWYtPmVuYWJsZSkKCQlyZXR1cm4gMDsKCglvdXRiKGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtLCBUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgVDREX0xGT19HQ19DSVIpKTsKCglzd2l0Y2ggKHN0YXRlLT5jYXJkLT5wY2lfaWQpIHsKCWNhc2UgUENJX0RFVklDRV9JRF9BTElfNTQ1MToKCWNhc2UgUENJX0RFVklDRV9JRF9TSV83MDE4OgoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgoJCS8qIDE2IGJpdHMgRVNPLCBDU08gZm9yIDcwMTggYW5kIERYICovCgkJY3NvID0gaW53KFRSSURfUkVHKHN0YXRlLT5jYXJkLCBDSF9EWF9DU09fQUxQSEFfRk1TICsgMikpOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCS8qIDI0IGJpdHMgRVNPLCBDU08gZm9yIE5YICovCgkJY3NvID0gaW5sKFRSSURfUkVHKHN0YXRlLT5jYXJkLCBDSF9OWF9ERUxUQV9DU08pKSAmIDB4MDBmZmZmZmY7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAwOwoJfQoKCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X2dldF9kbWFfYWRkcjogY2hpcCByZXBvcnRlZCBjaGFubmVsOiAlZCwgIgoJCSAiY3NvID0gMHglMDR4XG4iLCBkbWFidWYtPmNoYW5uZWwtPm51bSwgY3NvKTsKCgkvKiBFU08gYW5kIENTTyBhcmUgaW4gdW5pdHMgb2YgU2FtcGxlcywgY29udmVydCB0byBieXRlIG9mZnNldCAqLwoJY3NvIDw8PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoKCXJldHVybiAoY3NvICUgZG1hYnVmLT5kbWFzaXplKTsKfQoKLyogU3RvcCByZWNvcmRpbmcgKGxvY2sgaGVsZCkgKi8Kc3RhdGljIGlubGluZSB2b2lkCl9fc3RvcF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIGludCBjaGFuX251bSA9IGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoKCWRtYWJ1Zi0+ZW5hYmxlICY9IH5BRENfUlVOTklORzsKCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFuX251bSk7Cgl0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5fbnVtKTsKfQoKc3RhdGljIHZvaWQKc3RvcF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglfX3N0b3BfYWRjKHN0YXRlKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKfQoKc3RhdGljIHZvaWQKc3RhcnRfYWRjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBpbnQgY2hhbl9udW0gPSBkbWFidWYtPmNoYW5uZWwtPm51bTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCWlmICgoZG1hYnVmLT5tYXBwZWQgfHwgCgkgICAgIGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpICYmIAoJICAgIGRtYWJ1Zi0+cmVhZHkpIHsKCQlkbWFidWYtPmVuYWJsZSB8PSBBRENfUlVOTklORzsKCQl0cmlkZW50X2VuYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOwoJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgY2hhbl9udW0pOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwp9CgovKiBzdG9wIHBsYXliYWNrIChsb2NrIGhlbGQpICovCnN0YXRpYyBpbmxpbmUgdm9pZApfX3N0b3BfZGFjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBpbnQgY2hhbl9udW0gPSBkbWFidWYtPmNoYW5uZWwtPm51bTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKCglkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7Cgl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbl9udW0pOwoJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT4KCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJfQoJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFuX251bSk7Cn0KCnN0YXRpYyB2b2lkCnN0b3BfZGFjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJX19zdG9wX2RhYyhzdGF0ZSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyB2b2lkCnN0YXJ0X2RhYyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgaW50IGNoYW5fbnVtID0gZG1hYnVmLT5jaGFubmVsLT5udW07CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglpZiAoKGRtYWJ1Zi0+bWFwcGVkIHx8IGRtYWJ1Zi0+Y291bnQgPiAwKSAmJiBkbWFidWYtPnJlYWR5KSB7CgkJZG1hYnVmLT5lbmFibGUgfD0gREFDX1JVTk5JTkc7CgkJdHJpZGVudF9lbmFibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5fbnVtKTsKCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIGNoYW5fbnVtKTsKCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CgkJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+CgkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIHN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPgoJCQkJCSAgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT4KCQkJCQkgICAgZG1hYnVmLmNoYW5uZWwtPm51bSk7CgkJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+CgkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOwoJCX0KCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKfQoKI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNS1QQUdFX1NISUZUKQojZGVmaW5lIERNQUJVRl9NSU5PUkRFUiAxCgovKiBhbGxvYyBhIERNQSBidWZmZXIgb2Ygd2l0aCBhIGJ1ZmZlciBvZiB0aGlzIG9yZGVyICovCnN0YXRpYyBpbnQKYWxsb2NfZG1hYnVmKHN0cnVjdCBkbWFidWYgKmRtYWJ1Ziwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGludCBvcmRlcikKewoJdm9pZCAqcmF3YnVmID0gTlVMTDsKCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKCglpZiAoIShyYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsIAoJCQkJCSAgICAmZG1hYnVmLT5kbWFfaGFuZGxlKSkpCgkJcmV0dXJuIC1FTk9NRU07CgoJcHJfZGVidWcoInRyaWRlbnQ6IGFsbG9jYXRlZCAlbGQgKG9yZGVyID0gJWQpIGJ5dGVzIGF0ICVwXG4iLAoJCSBQQUdFX1NJWkUgPDwgb3JkZXIsIG9yZGVyLCByYXdidWYpOwoKCWRtYWJ1Zi0+cmVhZHkgPSBkbWFidWYtPm1hcHBlZCA9IDA7CglkbWFidWYtPnJhd2J1ZiA9IHJhd2J1ZjsKCWRtYWJ1Zi0+YnVmb3JkZXIgPSBvcmRlcjsKCgkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSAqLyAKCS8qIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLwoJcGVuZCA9IHZpcnRfdG9fcGFnZShyYXdidWYgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpOwoJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQoJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKCglyZXR1cm4gMDsKfQoKLyogYWxsb2NhdGUgdGhlIG1haW4gRE1BIGJ1ZmZlciwgcGxheWJhY2sgYW5kIHJlY29yZGluZyBidWZmZXIgc2hvdWxkIGJlICovCi8qIGFsbG9jYXRlZCBzZXBhcmF0ZWx5ICovCnN0YXRpYyBpbnQKYWxsb2NfbWFpbl9kbWFidWYoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCWludCBvcmRlcjsKCWludCByZXQgPSAtRU5PTUVNOwoKCS8qIGFsbG9jIGFzIGJpZyBhIGNodW5rIGFzIHdlIGNhbiwgRklYTUU6IGlzIHRoaXMgbmVjZXNzYXJ5ID8/ICovCglmb3IgKG9yZGVyID0gRE1BQlVGX0RFRkFVTFRPUkRFUjsgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKSB7CgkJaWYgKCEocmV0ID0gYWxsb2NfZG1hYnVmKGRtYWJ1Ziwgc3RhdGUtPmNhcmQtPnBjaV9kZXYsIG9yZGVyKSkpCgkJCXJldHVybiAwOwoJCS8qIGVsc2UgdHJ5IGFnYWluICovCgl9CglyZXR1cm4gcmV0Owp9CgovKiBkZWFsbG9jYXRlIGEgRE1BIGJ1ZmZlciAqLwpzdGF0aWMgdm9pZApkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgZG1hYnVmICpkbWFidWYsIHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQp7CglzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CgoJaWYgKGRtYWJ1Zi0+cmF3YnVmKSB7CgkJLyogdW5kbyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAqLwoJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpIC0gMSk7CgkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCgkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOwoJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIsIAoJCQkJICAgIGRtYWJ1Zi0+cmF3YnVmLCBkbWFidWYtPmRtYV9oYW5kbGUpOwoJCWRtYWJ1Zi0+cmF3YnVmID0gTlVMTDsKCX0KCWRtYWJ1Zi0+bWFwcGVkID0gZG1hYnVmLT5yZWFkeSA9IDA7Cn0KCnN0YXRpYyBpbnQKcHJvZ19kbWFidWYoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCBlbnVtIGRtYWJ1Zl9tb2RlIHJlYykKewoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBieXRlcGVyc2VjOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnMgPSBzdGF0ZTsKCXVuc2lnbmVkIGJ1ZnNpemUsIGRtYV9udW1zOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCByZXQsIGksIG9yZGVyOwoKCWlmICgocmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKQoJCXJldHVybiByZXQ7CgoJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikKCQlkbWFfbnVtcyA9IDU7CgllbHNlCgkJZG1hX251bXMgPSAxOwoKCWZvciAoaSA9IDA7IGkgPCBkbWFfbnVtczsgaSsrKSB7CgkJaWYgKGkgPiAwKSB7CgkJCXMgPSBzdGF0ZS0+b3RoZXJfc3RhdGVzW2kgLSAxXTsKCQkJZG1hYnVmID0gJnMtPmRtYWJ1ZjsKCQkJZG1hYnVmLT5mbXQgPSBzdGF0ZS0+ZG1hYnVmLmZtdDsKCQkJZG1hYnVmLT5yYXRlID0gc3RhdGUtPmRtYWJ1Zi5yYXRlOwoJCX0KCgkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlkbWFidWYtPmh3cHRyID0gZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOwoJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmVycm9yID0gMDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KCQlpZiAoIWRtYWJ1Zi0+cmF3YnVmKSB7CgkJCWlmIChpID09IDApIHsKCQkJCWlmICgocmV0ID0gYWxsb2NfbWFpbl9kbWFidWYoc3RhdGUpKSkgewoJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCQlyZXR1cm4gcmV0OwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJcmV0ID0gLUVOT01FTTsKCQkJCW9yZGVyID0gc3RhdGUtPmRtYWJ1Zi5idWZvcmRlciAtIDE7CgkJCQlpZiAob3JkZXIgPj0gRE1BQlVGX01JTk9SREVSKSB7CgkJCQkJcmV0ID0gYWxsb2NfZG1hYnVmKGRtYWJ1ZiwKCQkJCQkJCSAgIHN0YXRlLT5jYXJkLT5wY2lfZGV2LAoJCQkJCQkJICAgb3JkZXIpOwoJCQkJfQoJCQkJaWYgKHJldCkgewoJCQkJCS8qIHJlbGVhc2UgdGhlIG1haW4gRE1BIGJ1ZmZlciAqLwoJCQkJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+ZG1hYnVmLCBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CgkJCQkJLyogcmVsZWFzZSB0aGUgYXV4aWxpYXJ5IERNQSBidWZmZXJzICovCgkJCQkJZm9yIChpIC09IDI7IGkgPj0gMDsgaS0tKQoJCQkJCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmLCAKCQkJCQkJCSAgICAgICBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CgkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgkJCX0KCQl9CgkJLyogRklYTUU6IGZpZ3VyZSBvdXQgYWxsIHRoaXMgT1NTIGZyYWdtZW50IHN0dWZmICovCgkJYnl0ZXBlcnNlYyA9IGRtYWJ1Zi0+cmF0ZSA8PCBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCWJ1ZnNpemUgPSBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcjsKCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQpIHsKCQkJaWYgKCgxMDAwIDw8IGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVwZXJzZWMpCgkJCQlkbWFidWYtPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjIC8gMTAwMCk7CgkJCWVsc2UKCQkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gZG1hYnVmLT5vc3NmcmFnc2hpZnQ7CgkJfSBlbHNlIHsKCQkJLyogbGV0cyBoYW5kIG91dCByZWFzb25hYmxlIGJpZyBhc3MgYnVmZmVycyBieSBkZWZhdWx0ICovCgkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gKGRtYWJ1Zi0+YnVmb3JkZXIgKyBQQUdFX1NISUZUIC0gMik7CgkJfQoJCWRtYWJ1Zi0+bnVtZnJhZyA9IGJ1ZnNpemUgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJd2hpbGUgKGRtYWJ1Zi0+bnVtZnJhZyA8IDQgJiYgZG1hYnVmLT5mcmFnc2hpZnQgPiAzKSB7CgkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0LS07CgkJCWRtYWJ1Zi0+bnVtZnJhZyA9IGJ1ZnNpemUgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJfQoJCWRtYWJ1Zi0+ZnJhZ3NpemUgPSAxIDw8IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwoJCWlmIChkbWFidWYtPm9zc21heGZyYWdzID49IDQgJiYgZG1hYnVmLT5vc3NtYXhmcmFncyA8IGRtYWJ1Zi0+bnVtZnJhZykKCQkJZG1hYnVmLT5udW1mcmFnID0gZG1hYnVmLT5vc3NtYXhmcmFnczsKCQlkbWFidWYtPmZyYWdzYW1wbGVzID0gZG1hYnVmLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCWRtYWJ1Zi0+ZG1hc2l6ZSA9IGRtYWJ1Zi0+bnVtZnJhZyA8PCBkbWFidWYtPmZyYWdzaGlmdDsKCgkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgCgkJICAgICAgIGRtYWJ1Zi0+ZG1hc2l6ZSk7CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJaWYgKHJlYyA9PSBETV9SRUNPUkQpCgkJCXRyaWRlbnRfcmVjX3NldHVwKHMpOwoJCWVsc2UgLyogRE1fUExBWUJBQ0sgKi8KCQkJdHJpZGVudF9wbGF5X3NldHVwKHMpOwoKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJCS8qIHNldCB0aGUgcmVhZHkgZmxhZyBmb3IgdGhlIGRtYSBidWZmZXIgKi8KCQlkbWFidWYtPnJlYWR5ID0gMTsKCgkJcHJfZGVidWcoInRyaWRlbnQ6IHByb2dfZG1hYnVmKCVkKSwgc2FtcGxlIHJhdGUgPSAlZCwgIgoJCQkgImZvcm1hdCA9ICVkLCBudW1mcmFnID0gJWQsIGZyYWdzaXplID0gJWQgIgoJCQkgImRtYXNpemUgPSAlZFxuIiwgZG1hYnVmLT5jaGFubmVsLT5udW0sCgkJCSBkbWFidWYtPnJhdGUsIGRtYWJ1Zi0+Zm10LCBkbWFidWYtPm51bWZyYWcsCgkJCSBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmRtYXNpemUpOwoJfQoJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9yZWNvcmQoc3RydWN0IHRyaWRlbnRfc3RhdGUqIHN0YXRlKQp7CglyZXR1cm4gcHJvZ19kbWFidWYoc3RhdGUsIERNX1JFQ09SRCk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0cnVjdCB0cmlkZW50X3N0YXRlKiBzdGF0ZSkKewoJcmV0dXJuIHByb2dfZG1hYnVmKHN0YXRlLCBETV9QTEFZQkFDSyk7Cn0KCi8qIHdlIGFyZSBkb2luZyBxdWFudHVtIG1lY2hhbmljcyBoZXJlLCB0aGUgYnVmZmVyIGNhbiBvbmx5IGJlIGVtcHR5LCBoYWxmIG9yIGZ1bGwgZmlsbGVkIGkuZS4KICAgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18ICAgb3IgICB8eHh4eHh4eHh4eHh4fC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHh4eHh4eHh4fAogICBidXQgd2UgYWxtb3N0IGFsd2F5cyBnZXQgdGhpcwogICB8eHh4eHh4LS0tLS0tfC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHgtLS0tLS0tfAogICBzbyB3ZSBoYXZlIHRvIGNsZWFyIHRoZSB0YWlsIHNwYWNlIHRvICJzaWxlbmNlIgogICB8eHh4eHh4MDAwMDAwfC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHh4MDAwMDAwfAoqLwpzdGF0aWMgdm9pZAp0cmlkZW50X2NsZWFyX3RhaWwoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIHN3cHRyOwoJdW5zaWduZWQgY2hhciBzaWxlbmNlID0gKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gMCA6IDB4ODA7Cgl1bnNpZ25lZCBpbnQgbGVuOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgoJaWYgKHN3cHRyID09IDAgfHwgc3dwdHIgPT0gZG1hYnVmLT5kbWFzaXplIC8gMiB8fCAKCSAgICBzd3B0ciA9PSBkbWFidWYtPmRtYXNpemUpCgkJcmV0dXJuOwoKCWlmIChzd3B0ciA8IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIpCgkJbGVuID0gZG1hYnVmLT5kbWFzaXplIC8gMiAtIHN3cHRyOwoJZWxzZQoJCWxlbiA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOwoKCW1lbXNldChkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBzaWxlbmNlLCBsZW4pOwoJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgIT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWRtYWJ1Zi0+c3dwdHIgKz0gbGVuOwoJCWRtYWJ1Zi0+Y291bnQgKz0gbGVuOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Cgl9CgoJLyogcmVzdGFydCB0aGUgZG1hIG1hY2hpbmUgaW4gY2FzZSBpdCBpcyBoYWx0ZWQgKi8KCXN0YXJ0X2RhYyhzdGF0ZSk7Cn0KCnN0YXRpYyBpbnQKZHJhaW5fZGFjKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgaW50IG5vbmJsb2NrKQp7CglERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCXVuc2lnbmVkIGxvbmcgdG1vOwoJaW50IGNvdW50OwoJdW5zaWduZWQgbG9uZyBkaWZmID0gMDsKCglpZiAoZG1hYnVmLT5tYXBwZWQgfHwgIWRtYWJ1Zi0+cmVhZHkpCgkJcmV0dXJuIDA7CgoJYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwoJZm9yICg7OykgewoJCS8qIEl0IHNlZW1zIHRoYXQgd2UgaGF2ZSB0byBzZXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gVEFTS19JTlRFUlJVUFRJQkxFCgkJICAgZXZlcnkgdGltZSB0byBtYWtlIHRoZSBwcm9jZXNzIHJlYWxseSBnbyB0byBzbGVlcCAqLwoJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CgoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoKCQlpZiAoY291bnQgPD0gMCkKCQkJYnJlYWs7CgoJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQkJYnJlYWs7CgoJCWlmIChub25ibG9jaykgewoJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CgkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CgkJCXJldHVybiAtRUJVU1k7CgkJfQoKCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBpcyBsZWZ0IGluIHRoZSBidWZmZXIsIHdlIGhhdmUgdG8gd2FpdCB1bnRpbAoJCSAgIENTTyA9PSBFU08vMiBvciBDU08gPT0gRVNPIHdoZW4gYWRkcmVzcyBlbmdpbmUgaW50ZXJydXB0cyAqLwoJCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgfHwgCgkJICAgIHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkgewoJCQlkaWZmID0gZG1hYnVmLT5zd3B0ciAtIHRyaWRlbnRfZ2V0X2RtYV9hZGRyKHN0YXRlKSArIGRtYWJ1Zi0+ZG1hc2l6ZTsKCQkJZGlmZiA9IGRpZmYgJSAoZG1hYnVmLT5kbWFzaXplKTsKCQkJdG1vID0gKGRpZmYgKiBIWikgLyBkbWFidWYtPnJhdGU7CgkJfSBlbHNlIHsKCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIGRtYWJ1Zi0+cmF0ZTsKCQl9CgkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOwoJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyB0bW8gOiAxKSAmJiB0bW8pIHsKCQkJYnJlYWs7CgkJfQoJfQoJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwoJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoKCXJldHVybiAwOwp9CgovKiB1cGRhdGUgYnVmZmVyIG1hbmFuZ2VtZW50IHBvaW50ZXJzLCBlc3BlY2lhbGx5LCAqLyAKLyogZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLwpzdGF0aWMgdm9pZAp0cmlkZW50X3VwZGF0ZV9wdHIoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXVuc2lnbmVkIGh3cHRyLCBzd3B0cjsKCWludCBjbGVhcl9jbnQgPSAwOwoJaW50IGRpZmY7Cgl1bnNpZ25lZCBjaGFyIHNpbGVuY2U7Cgl1bnNpZ25lZCBoYWxmX2RtYXNpemU7CgoJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KCWh3cHRyID0gdHJpZGVudF9nZXRfZG1hX2FkZHIoc3RhdGUpOwoJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOwoJZG1hYnVmLT5od3B0ciA9IGh3cHRyOwoJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBkaWZmOwoKCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIEFEQyAqLwoJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CgkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CgkJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CgkJfSBlbHNlIHsKCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOwoKCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwIHx8IAoJCQkgICAgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgewoJCQkJLyogYnVmZmVyIHVuZGVycnVuIG9yIGJ1ZmZlciBvdmVycnVuLCAqLyAKCQkJCS8qIHdlIGhhdmUgbm8gd2F5IHRvIHJlY292ZXIgaXQgaGVyZSwganVzdCAqLyAKCQkJCS8qIHN0b3AgdGhlIG1hY2hpbmUgYW5kIGxldCB0aGUgcHJvY2VzcyAqLyAKCQkJCS8qIGZvcmNlIGh3cHRyIGFuZCBzd3B0ciB0byBzeW5jICovCgkJCQlfX3N0b3BfYWRjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKCQkJfQoJCQlpZiAoZG1hYnVmLT5jb3VudCA8IChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIpCgkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwoJCX0KCX0KCgkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBEQUMgKi8KCWlmIChkbWFidWYtPmVuYWJsZSA9PSBEQUNfUlVOTklORykgewoJCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCQlkbWFidWYtPmNvdW50ICs9IGRpZmY7CgkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCgkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOwoJCX0gZWxzZSB7CgkJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKCgkJCWlmIChkbWFidWYtPmNvdW50IDwgMCB8fCAKCQkJICAgIGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlcgoJCQkJICAgaXQgaGVyZSwganVzdCBzdG9wIHRoZSBtYWNoaW5lIGFuZCBsZXQgdGhlIHByb2Nlc3MgZm9yY2UgaHdwdHIKCQkJCSAgIGFuZCBzd3B0ciB0byBzeW5jICovCgkJCQlfX3N0b3BfZGFjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKCQkJfSBlbHNlIGlmICghZG1hYnVmLT5lbmRjbGVhcmVkKSB7CgkJCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CgkJCQlzaWxlbmNlID0gKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQgPyAwIDogMHg4MCk7CgkJCQlpZiAoZG1hYnVmLT51cGRhdGVfZmxhZyAmIEFMSV9BRERSRVNTX0lOVF9VUERBVEUpIHsKCQkJCQkvKiBXZSBtdXN0IGNsZWFyIGVuZCBkYXRhIG9mIDEvMiBkbWFidWYgaWYgbmVlZGVkLgoJCQkJCSAgIEFjY29yZGluZyB0byAxLzIgYWxnb3JpdGhtIG9mIEFkZHJlc3MgRW5naW5lIEludGVycnVwdCwKCQkJCQkgICBjaGVjayB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZGF0YSBvZiBoYWxmIGRtYXNpemUuICovCgkJCQkJaGFsZl9kbWFzaXplID0gZG1hYnVmLT5kbWFzaXplIC8gMjsKCQkJCQlpZiAoKGRpZmYgPSBod3B0ciAtIGhhbGZfZG1hc2l6ZSkgPCAwKQoJCQkJCQlkaWZmID0gaHdwdHI7CgkJCQkJaWYgKChkbWFidWYtPmNvdW50ICsgZGlmZikgPCBoYWxmX2RtYXNpemUpIHsKCQkJCQkJLy90aGVyZSBpcyBpbnZhbGlkIGRhdGEgaW4gdGhlIGVuZCBvZiBoYWxmIGJ1ZmZlcgoJCQkJCQlpZiAoKGNsZWFyX2NudCA9IGhhbGZfZG1hc2l6ZSAtIHN3cHRyKSA8IDApCgkJCQkJCQljbGVhcl9jbnQgKz0gaGFsZl9kbWFzaXplOwoJCQkJCQkvL2NsZWFyIHRoZSBpbnZhbGlkIGRhdGEKCQkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKCQkJCQkJCWNsZWFyX2NudCA9IGNsZWFyX2NudCAvIDI7CgkJCQkJCQlzd3B0ciA9IHN3cHRyIC8gMjsKCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCX0KCQkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMTsKCQkJCQl9CgkJCQl9IGVsc2UgaWYgKGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKSB7CgkJCQkJY2xlYXJfY250ID0gZG1hYnVmLT5mcmFnc2l6ZTsKCQkJCQlpZiAoKHN3cHRyICsgY2xlYXJfY250KSA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKCQkJCQkJY2xlYXJfY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CgkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgewoJCQkJCQljbGVhcl9jbnQgPSBjbGVhcl9jbnQgLyAyOwoJCQkJCQlzd3B0ciA9IHN3cHRyIC8gMjsKCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CgkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAoJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOwoJCQkJCX0KCQkJCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAxOwoJCQkJfQoJCQl9CgkJCS8qIHRyaWRlbnRfdXBkYXRlX3B0ciBpcyBjYWxsZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgb3IgYnkgcHJvY2VzcyB2aWEKCQkJICAgaW9jdGwvcG9sbCwgd2Ugb25seSB3YWtlIHVwIHRoZSB3YWl0aW5nIHByb2Nlc3Mgd2hlbiB3ZSBoYXZlIG1vcmUKCQkJICAgdGhhbiAxLzIgYnVmZmVyIGZyZWUgKGFsd2F5cyB0cnVlIGZvciBpbnRlcnJ1cHQgaGFuZGxlcikgKi8KCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgLyAyKQoJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKCQl9Cgl9CglkbWFidWYtPnVwZGF0ZV9mbGFnICY9IH5BTElfQUREUkVTU19JTlRfVVBEQVRFOwp9CgpzdGF0aWMgdm9pZAp0cmlkZW50X2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCWludCBpOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlOwoJdW5zaWduZWQgaW50IGNoYW5uZWw7CgoJLyogVXBkYXRlIHRoZSBwb2ludGVycyBmb3IgYWxsIGNoYW5uZWxzIHdlIGFyZSBydW5uaW5nLiAqLwoJLyogRklYTUU6IHNob3VsZCByZWFkIGludGVycnVwdCBzdGF0dXMgb25seSBvbmNlICovCglmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0g7IGkrKykgewoJCWNoYW5uZWwgPSA2MyAtIGk7CgkJaWYgKHRyaWRlbnRfY2hlY2tfY2hhbm5lbF9pbnRlcnJ1cHQoY2FyZCwgY2hhbm5lbCkpIHsKCQkJdHJpZGVudF9hY2tfY2hhbm5lbF9pbnRlcnJ1cHQoY2FyZCwgY2hhbm5lbCk7CgkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKCQkJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJCX0gZWxzZSB7CgkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBzcHVyaW91cyBjaGFubmVsICIgCgkJCQkgICAgICAgImlycSAlZC5cbiIsIGNoYW5uZWwpOwoJCQkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIGNoYW5uZWwpOwoJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFubmVsKTsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQKYWxpX2h3dm9sX2NvbnRyb2woc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IG9wdCkKewoJdTE2IGR3VGVtcCwgdm9sdW1lWzJdLCBtdXRlLCBkaWZmLCAqcFZvbFsyXTsKCglkd1RlbXAgPSBhbGlfYWM5N19yZWFkKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIpOwoJbXV0ZSA9IGR3VGVtcCAmIDB4ODAwMDsKCXZvbHVtZVswXSA9IGR3VGVtcCAmIDB4MDAxZjsKCXZvbHVtZVsxXSA9IChkd1RlbXAgJiAweDFmMDApID4+IDg7CglpZiAodm9sdW1lWzBdIDwgdm9sdW1lWzFdKSB7CgkJcFZvbFswXSA9ICZ2b2x1bWVbMF07CgkJcFZvbFsxXSA9ICZ2b2x1bWVbMV07Cgl9IGVsc2UgewoJCXBWb2xbMV0gPSAmdm9sdW1lWzBdOwoJCXBWb2xbMF0gPSAmdm9sdW1lWzFdOwoJfQoJZGlmZiA9ICoocFZvbFsxXSkgLSAqKHBWb2xbMF0pOwoKCWlmIChvcHQgPT0gMSkgewkJLy8gTVVURQoJCWR3VGVtcCBePSAweDgwMDA7CgkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgCgkJCSAgICAgICAweDAyLCBkd1RlbXApOwoJfSBlbHNlIGlmIChvcHQgPT0gMikgewkvLyBEb3duCgkJaWYgKG11dGUpCgkJCXJldHVybjsKCQlpZiAoKihwVm9sWzFdKSA8IDB4MDAxZikgewoJCQkoKnBWb2xbMV0pKys7CgkJCSoocFZvbFswXSkgPSAqKHBWb2xbMV0pIC0gZGlmZjsKCQl9CgkJZHdUZW1wICY9IDB4ZTBlMDsKCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOwoJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIsIGR3VGVtcCk7CgkJY2FyZC0+YWM5N19jb2RlY1swXS0+bWl4ZXJfc3RhdGVbMF0gPSAoKDMyIC0gdm9sdW1lWzBdKSAqIDI1IC8gOCkgfCAKCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKCX0gZWxzZSBpZiAob3B0ID09IDQpIHsJLy8gVXAKCQlpZiAobXV0ZSkKCQkJcmV0dXJuOwoJCWlmICgqKHBWb2xbMF0pID4gMCkgewoJCQkoKnBWb2xbMF0pLS07CgkJCSoocFZvbFsxXSkgPSAqKHBWb2xbMF0pICsgZGlmZjsKCQl9CgkJZHdUZW1wICY9IDB4ZTBlMDsKCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOwoJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIsIGR3VGVtcCk7CgkJY2FyZC0+YWM5N19jb2RlY1swXS0+bWl4ZXJfc3RhdGVbMF0gPSAoKDMyIC0gdm9sdW1lWzBdKSAqIDI1IC8gOCkgfCAKCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKCX0gZWxzZSB7CgkJLyogTm90aGluZyBuZWVkcyBkb2luZyAqLwoJfQp9CgovKgogKglSZS1lbmFibGUgcmVwb3J0aW5nIG9mIHZvbCBjaGFuZ2UgYWZ0ZXIgMC4xIHNlY29uZHMKICovCgpzdGF0aWMgdm9pZAphbGlfdGltZW91dCh1bnNpZ25lZCBsb25nIHB0cikKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIHB0cjsKCXUxNiB0ZW1wID0gMDsKCgkvKiBFbmFibGUgR1BJTyBJUlEgKE1JU0NJTlQgYml0IDE4aCkgKi8KCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7Cgl0ZW1wIHw9IDB4MDAwNDsKCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7Cn0KCi8qCiAqCVNldCB1cCB0aGUgdGltZXIgdG8gY2xlYXIgdGhlIHZvbCBjaGFuZ2Ugbm90aWZpY2F0aW9uCiAqLwoKc3RhdGljIHZvaWQKYWxpX3NldF90aW1lcihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CgkvKiBBZGQgVGltZXIgUm91dGluZSB0byBFbmFibGUgR1BJTyBJUlEgKi8KCWRlbF90aW1lcigmY2FyZC0+dGltZXIpOwkvKiBOZXZlciBxdWV1ZSB0d2ljZSAqLwoJY2FyZC0+dGltZXIuZnVuY3Rpb24gPSBhbGlfdGltZW91dDsKCWNhcmQtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY2FyZDsKCWNhcmQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKCWFkZF90aW1lcigmY2FyZC0+dGltZXIpOwp9CgovKgogKglQcm9jZXNzIGEgR1BJTyBldmVudAogKi8KCnN0YXRpYyB2b2lkCmFsaV9xdWV1ZV90YXNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBvcHQpCnsKCXUxNiB0ZW1wOwoKCS8qIERpc2FibGUgR1BJTyBJUlEgKE1JU0NJTlQgYml0IDE4aCkgKi8KCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7Cgl0ZW1wICY9ICh1MTYpICh+MHgwMDA0KTsKCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7CgoJLyogQWRqdXN0IHRoZSB2b2x1bWUgKi8KCWFsaV9od3ZvbF9jb250cm9sKGNhcmQsIG9wdCk7CgoJLyogU2V0IHRoZSB0aW1lciBmb3IgMS8xMHRoIHNlYyAqLwoJYWxpX3NldF90aW1lcihjYXJkKTsKfQoKc3RhdGljIHZvaWQKY3liZXJfYWRkcmVzc19pbnRlcnJ1cHQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJaW50IGksIGlycV9zdGF0dXM7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGU7Cgl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKCgkvKiBVcGRhdGUgdGhlIHBvaW50ZXJzIGZvciBhbGwgY2hhbm5lbHMgd2UgYXJlIHJ1bm5pbmcuICovCgkvKiBGSVhFRDogcmVhZCBpbnRlcnJ1cHQgc3RhdHVzIG9ubHkgb25jZSAqLwoJaXJxX3N0YXR1cyA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfQUlOVF9BKSk7CgoJcHJfZGVidWcoImN5YmVyX2FkZHJlc3NfaW50ZXJydXB0OiBpcnFfc3RhdHVzIDB4JVhcbiIsIGlycV9zdGF0dXMpOwoKCWZvciAoaSA9IDA7IGkgPCBOUl9IV19DSDsgaSsrKSB7CgkJY2hhbm5lbCA9IDMxIC0gaTsKCQlpZiAoaXJxX3N0YXR1cyAmICgxIDw8IGNoYW5uZWwpKSB7CgkJCS8qIGNsZWFyIGJpdCBieSB3cml0aW5nIGEgMSwgemVyb2VzIGFyZSBpZ25vcmVkICovCgkJCW91dGwoKDEgPDwgY2hhbm5lbCksIFRSSURfUkVHKGNhcmQsIFQ0RF9BSU5UX0EpKTsKCgkJCXByX2RlYnVnKCJjeWJlcl9pbnRlcnJ1cHQ6IGNoYW5uZWwgJWRcbiIsIGNoYW5uZWwpOwoKCQkJaWYgKChzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXSkgIT0gTlVMTCkgewoJCQkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQkJfSBlbHNlIHsKCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImN5YmVyNTA1MDogc3B1cmlvdXMgIiAKCQkJCSAgICAgICAiY2hhbm5lbCBpcnEgJWQuXG4iLCBjaGFubmVsKTsKCQkJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFubmVsKTsKCQkJCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbm5lbCk7CgkJCX0KCQl9Cgl9Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdAp0cmlkZW50X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKikgZGV2X2lkOwoJdTMyIGV2ZW50OwoJdTMyIGdwaW87CgoJc3Bpbl9sb2NrKCZjYXJkLT5sb2NrKTsKCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfaW50ZXJydXB0IGNhbGxlZCwgTUlTQ0lOVCA9IDB4JTA4eFxuIiwKCQkgZXZlbnQpOwoKCWlmIChldmVudCAmIEFERFJFU1NfSVJRKSB7CgkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQoY2FyZCk7Cgl9CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJLyogR1BJTyBJUlEgKEgvVyBWb2x1bWUgQ29udHJvbCkgKi8KCQlldmVudCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJCWlmIChldmVudCAmICgxIDw8IDI1KSkgewoJCQlncGlvID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HUElPKSk7CgkJCWlmICghdGltZXJfcGVuZGluZygmY2FyZC0+dGltZXIpKQoJCQkJYWxpX3F1ZXVlX3Rhc2soY2FyZCwgZ3BpbyAmIDB4MDcpOwoJCX0KCQlldmVudCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJCW91dGwoZXZlbnQgfCAoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAoJCSAgICAgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKCQlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CgkJcmV0dXJuIElSUV9IQU5ETEVEOwoJfQoKCS8qIG1hbnVhbGx5IGNsZWFyIGludGVycnVwdCBzdGF0dXMsIGJhZCBoYXJkd2FyZSBkZXNpZ24sIGJsYW1lIFReMiAqLwoJb3V0bCgoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAoJICAgICBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOwoJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgovKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyAqLyAKLyogdG8gYmUgY29waWVkIHRvIHRoZSB1c2VyJ3MgYnVmZmVyLiAgaXQgaXMgZmlsbGVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgKi8gCi8qIGRyYWluZWQgYnkgdGhpcyBsb29wLiAqLwpzdGF0aWMgc3NpemVfdAp0cmlkZW50X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cglzc2l6ZV90IHJldCA9IDA7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgc3dwdHI7CglpbnQgY250OwoKCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X3JlYWQgY2FsbGVkLCBjb3VudCA9ICV6ZFxuIiwgY291bnQpOwoKCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKCglpZiAoZG1hYnVmLT5tYXBwZWQpCgkJcmV0dXJuIC1FTlhJTzsKCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCgkJcmV0dXJuIC1FRkFVTFQ7CgoJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7CglpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpKQoJCWdvdG8gb3V0OwoKCXdoaWxlIChjb3VudCA+IDApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlpZiAoZG1hYnVmLT5jb3VudCA+IChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSkgewoJCQkvKiBidWZmZXIgb3ZlcnJ1biwgd2UgYXJlIHJlY292ZXJpbmcgZnJvbSAqLyAKCQkJLyogc2xlZXBfb25fdGltZW91dCwgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciwgKi8gCgkJCS8qIG1ha2UgcHJvY2VzcyBmbHVzaCB0aGUgYnVmZmVyICovCgkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CgkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOwoJCX0KCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CgkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CgkJaWYgKGRtYWJ1Zi0+Y291bnQgPCBjbnQpCgkJCWNudCA9IGRtYWJ1Zi0+Y291bnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCgkJaWYgKGNudCA+IGNvdW50KQoJCQljbnQgPSBjb3VudDsKCQlpZiAoY250IDw9IDApIHsKCQkJdW5zaWduZWQgbG9uZyB0bW87CgkJCS8qIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKCQkJLyogd2FpdCBmb3IgZGF0YSB0byBiZSByZWNvcmRlZCAqLwoJCQlzdGFydF9hZGMoc3RhdGUpOwoJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FQUdBSU47CgkJCQlnb3RvIG91dDsKCQkJfQoKCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKCQkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIHNwYWNlIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8gCgkJCS8qIHdlIGhhdmUgdG8gd2FpdCB1bnRpbCBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyAqLyAKCQkJLyogd2hlbiBhZGRyZXNzIGVuZ2luZSBpbnRlcnJ1cHRzICovCgkJCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyAoZG1hYnVmLT5yYXRlICogMik7CgkJCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKCQkJLyogVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zIHdoZW4gc2xlZXBfb25fdGltZW91dCByZXR1cm5zLCBvbmUgaXMgd2hlbgoJCQkgICB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkKCQkJICAgSVNSIE9OIFRJTUUuIEFub3RoZXIgaXMgd2hlbiB0aW1lb3V0IGlzIGV4cGlyZWQsIHdoaWNoIG1lYW5zIHRoYXQKCQkJICAgZWl0aGVyIGludGVycnVwdCBpcyBOT1Qgc2VydmljZWQgY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQKCQkJICAgaXMgVE9PIExBVEUgZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKHNjaGVkdWxlciBsYXRlbmN5KQoJCQkgICB3aGljaCByZXN1bHRzIGluIGEgKHBvdGVudGlhbCkgYnVmZmVyIG92ZXJydW4uIEFuZCB3b3JzZSwgdGhlcmUgaXMKCQkJICAgTk9USElORyB3ZSBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KCQkJaWYgKCFpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmRtYWJ1Zi0+d2FpdCwgdG1vKSkgewoJCQkJcHJfZGVidWcoS0VSTl9FUlIgInRyaWRlbnQ6IHJlY29yZGluZyBzY2hlZHVsZSB0aW1lb3V0LCAiCgkJCQkJICJkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCgkJCQkJIGRtYWJ1Zi0+ZG1hc2l6ZSwgZG1hYnVmLT5mcmFnc2l6ZSwgZG1hYnVmLT5jb3VudCwKCQkJCQkgZG1hYnVmLT5od3B0ciwgZG1hYnVmLT5zd3B0cik7CgoJCQkJLyogYSBidWZmZXIgb3ZlcnJ1biwgd2UgZGVsYXkgdGhlIHJlY292ZXJ5IHVudGlsIG5leHQgdGltZSB0aGUKCQkJCSAgIHdoaWxlIGxvb3AgYmVnaW4gYW5kIHdlIFJFQUxMWSBoYXZlIHNwYWNlIHRvIHJlY29yZCAqLwoJCQl9CgkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7CgkJCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVOWElPOwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJY29udGludWU7CgkJfQoKCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgY250KSkgewoJCQlpZiAoIXJldCkKCQkJCXJldCA9IC1FRkFVTFQ7CgkJCWdvdG8gb3V0OwoJCX0KCgkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgZG1hYnVmLT5kbWFzaXplOwoKCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CgkJZG1hYnVmLT5jb3VudCAtPSBjbnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCgkJY291bnQgLT0gY250OwoJCWJ1ZmZlciArPSBjbnQ7CgkJcmV0ICs9IGNudDsKCQlzdGFydF9hZGMoc3RhdGUpOwoJfQpvdXQ6CgltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwoJcmV0dXJuIHJldDsKfQoKLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgdG8gYmUgZG1hIHRvCiAgIHRoZSBzb3VuZGNhcmQuICBpdCBpcyBkcmFpbmVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgZmlsbGVkIGJ5IHRoaXMgbG9vcC4gKi8KCnN0YXRpYyBzc2l6ZV90CnRyaWRlbnRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cglzc2l6ZV90IHJldDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1bnNpZ25lZCBzd3B0cjsKCWludCBjbnQ7Cgl1bnNpZ25lZCBpbnQgc3RhdGVfY250OwoJdW5zaWduZWQgaW50IGNvcHlfY291bnQ7CglpbnQgbHJldDsgLyogZm9yIGxvY2tfc2V0X2ZtdCAqLwoKCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X3dyaXRlIGNhbGxlZCwgY291bnQgPSAlemRcbiIsIGNvdW50KTsKCglWQUxJREFURV9TVEFURShzdGF0ZSk7CgoJLyoKCSAqICAgICAgR3VhcmQgYWdhaW5zdCBhbiBtbWFwIG9yIGlvY3RsIHdoaWxlIHdyaXRpbmcKCSAqLwoKCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwoKCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCXJldCA9IC1FTlhJTzsKCQlnb3RvIG91dDsKCX0KCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSkKCQlnb3RvIG91dDsKCglpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpIHsKCQlyZXQgPSAtRUZBVUxUOwoJCWdvdG8gb3V0OwoJfQoKCXJldCA9IDA7CgoJd2hpbGUgKGNvdW50ID4gMCkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCWlmIChkbWFidWYtPmNvdW50IDwgMCkgewoJCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gKi8gCgkJCS8qIHNsZWVwX29uX3RpbWVvdXQsIHJlc3luYyBod3B0ciBhbmQgc3dwdHIgKi8KCQkJZG1hYnVmLT5jb3VudCA9IDA7CgkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOwoJCX0KCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CgkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CgkJaWYgKGRtYWJ1Zi0+Y291bnQgKyBjbnQgPiBkbWFidWYtPmRtYXNpemUpCgkJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIGRtYWJ1Zi0+Y291bnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCgkJaWYgKGNudCA+IGNvdW50KQoJCQljbnQgPSBjb3VudDsKCQlpZiAoY250IDw9IDApIHsKCQkJdW5zaWduZWQgbG9uZyB0bW87CgkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovIAoJCQkvKiB3YWl0IGZvciBkYXRhIHRvIGJlIHBsYXllZCAqLwoJCQlzdGFydF9kYWMoc3RhdGUpOwoJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKCQkJCWlmICghcmV0KQoJCQkJCXJldCA9IC1FQUdBSU47CgkJCQlnb3RvIG91dDsKCQkJfQoJCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIsICovIAoJCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8gCgkJCS8qIHdoZW4gYWRkcmVzcyBlbmdpbmUgaW50ZXJydXB0cyAqLwoJCQlsb2NrX3NldF9mbXQoc3RhdGUpOwoJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSAqIDIpOwoJCQl0bW8gPj49IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CgkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKCgkJCS8qIFRoZXJlIGFyZSB0d28gc2l0dWF0aW9ucyB3aGVuIHNsZWVwX29uX3RpbWVvdXQgKi8gCgkJCS8qIHJldHVybnMsIG9uZSBpcyB3aGVuIHRoZSBpbnRlcnJ1cHQgaXMgc2VydmljZWQgKi8gCgkJCS8qIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkgSVNSICovIAoJCQkvKiBPTiBUSU1FLiBBbm90aGVyIGlzIHdoZW4gdGltZW91dCBpcyBleHBpcmVkLCB3aGljaCAqLyAKCQkJLyogbWVhbnMgdGhhdCBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCAqLyAKCQkJLyogY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQgaXMgVE9PIExBVEUgKi8gCgkJCS8qIGZvciB0aGUgcHJvY2VzcyB0byBiZSBzY2hlZHVsZWQgdG8gcnVuICovIAoJCQkvKiAoc2NoZWR1bGVyIGxhdGVuY3kpIHdoaWNoIHJlc3VsdHMgaW4gYSAocG90ZW50aWFsKSAqLyAKCQkJLyogYnVmZmVyIHVuZGVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzIE5PVEhJTkcgd2UgKi8gCgkJCS8qIGNhbiBkbyB0byBwcmV2ZW50IGl0LiAqLwoJCQlpZiAoIWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmZG1hYnVmLT53YWl0LCB0bW8pKSB7CgkJCQlwcl9kZWJ1ZyhLRVJOX0VSUiAidHJpZGVudDogcGxheWJhY2sgc2NoZWR1bGUgIgoJCQkJCSAidGltZW91dCwgZG1hc3ogJXUgZnJhZ3N6ICV1IGNvdW50ICVpICIKCQkJCQkgImh3cHRyICV1IHN3cHRyICV1XG4iLCBkbWFidWYtPmRtYXNpemUsCgkJCQkJIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+Y291bnQsCgkJCQkJIGRtYWJ1Zi0+aHdwdHIsIGRtYWJ1Zi0+c3dwdHIpOwoKCQkJCS8qIGEgYnVmZmVyIHVuZGVycnVuLCB3ZSBkZWxheSB0aGUgcmVjb3ZlcnkgKi8gCgkJCQkvKiB1bnRpbCBuZXh0IHRpbWUgdGhlIHdoaWxlIGxvb3AgYmVnaW4gYW5kICovIAoJCQkJLyogd2UgUkVBTExZIGhhdmUgZGF0YSB0byBwbGF5ICovCgkJCX0KCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CgkJCQlnb3RvIG91dF9ub2xvY2s7CgkJCX0KCQkJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7CgkJCWlmIChkbWFidWYtPm1hcHBlZCkgewoJCQkJaWYgKCFyZXQpCgkJCQkJcmV0ID0gLUVOWElPOwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJY29udGludWU7CgkJfQoJCWlmICgobHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkgewoJCQlyZXQgPSBscmV0OwoJCQlnb3RvIG91dDsKCQl9CgoJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKCQkJY29weV9jb3VudCA9IDA7CgkJCXN0YXRlX2NudCA9IDA7CgkJCWlmIChhbGlfd3JpdGVfNV8xKHN0YXRlLCBidWZmZXIsIGNudCwgJmNvcHlfY291bnQsIAoJCQkJCSAgJnN0YXRlX2NudCkgPT0gLUVGQVVMVCkgewoJCQkJaWYgKHN0YXRlX2NudCkgewoJCQkJCXN3cHRyID0gKHN3cHRyICsgc3RhdGVfY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQkJCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CgkJCQkJZG1hYnVmLT5jb3VudCArPSBzdGF0ZV9jbnQ7CgkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMDsKCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCQkJfQoJCQkJcmV0ICs9IGNvcHlfY291bnQ7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRUZBVUxUOwoJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJZ290byBvdXQ7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgCgkJCQkJICAgYnVmZmVyLCBjbnQpKSB7CgkJCQlpZiAoIXJldCkKCQkJCQlyZXQgPSAtRUZBVUxUOwoJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJZ290byBvdXQ7CgkJCX0KCQkJc3RhdGVfY250ID0gY250OwoJCX0KCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgoJCXN3cHRyID0gKHN3cHRyICsgc3RhdGVfY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKCgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJZG1hYnVmLT5zd3B0ciA9IHN3cHRyOwoJCWRtYWJ1Zi0+Y291bnQgKz0gc3RhdGVfY250OwoJCWRtYWJ1Zi0+ZW5kY2xlYXJlZCA9IDA7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCgkJY291bnQgLT0gY250OwoJCWJ1ZmZlciArPSBjbnQ7CgkJcmV0ICs9IGNudDsKCQlzdGFydF9kYWMoc3RhdGUpOwoJfQpvdXQ6CgltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwpvdXRfbm9sb2NrOgoJcmV0dXJuIHJldDsKfQoKLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8Kc3RhdGljIHVuc2lnbmVkIGludAp0cmlkZW50X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJdW5zaWduZWQgaW50IG1hc2sgPSAwOwoKCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKCgkvKgoJICogICAgICBHdWFyZCBhZ2FpbnN0IGEgcGFyYWxsZWwgcG9sbCBhbmQgd3JpdGUgY2F1c2luZyBtdWx0aXBsZQoJICogICAgICBwcm9nX2RtYWJ1ZiBldmVudHMKCSAqLwoKCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwoKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCWlmICghZG1hYnVmLT5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpIHsKCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKCQkJcmV0dXJuIDA7CgkJfQoJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKCX0KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpIHsKCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKCQkJcmV0dXJuIDA7CgkJfQoJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKCX0KCgltdXRleF91bmxvY2soJnN0YXRlLT5zZW0pOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwoJfQoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CgkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCgkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwoJCX0gZWxzZSB7CgkJCWlmICgoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArIAoJCQkgICAgKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CgkJfQoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gbWFzazsKfQoKc3RhdGljIGludAp0cmlkZW50X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQp7CglzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCWludCByZXQgPSAtRUlOVkFMOwoJdW5zaWduZWQgbG9uZyBzaXplOwoKCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKCgkvKgoJICogICAgICBMb2NrIGFnYWluc3QgcG9sbCByZWFkIHdyaXRlIG9yIG1tYXAgY3JlYXRpbmcgYnVmZmVycy4gQWxzbyBsb2NrCgkgKiAgICAgIGEgcmVhZCBvciB3cml0ZSBhZ2FpbnN0IGFuIG1tYXAuCgkgKi8KCgltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKCglpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CgkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpICE9IDApCgkJCWdvdG8gb3V0OwoJfSBlbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgewoJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkgIT0gMCkKCQkJZ290byBvdXQ7Cgl9IGVsc2UKCQlnb3RvIG91dDsKCglyZXQgPSAtRUlOVkFMOwoJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKCQlnb3RvIG91dDsKCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CglpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikpCgkJZ290byBvdXQ7CglyZXQgPSAtRUFHQUlOOwoJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCgkJCSAgICAgdmlydF90b19waHlzKGRtYWJ1Zi0+cmF3YnVmKSA+PiBQQUdFX1NISUZULAoJCQkgICAgIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKCQlnb3RvIG91dDsKCWRtYWJ1Zi0+bWFwcGVkID0gMTsKCXJldCA9IDA7Cm91dDoKCW11dGV4X3VubG9jaygmc3RhdGUtPnNlbSk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50CnRyaWRlbnRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAoJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKCWNvdW50X2luZm8gY2luZm87CglpbnQgdmFsLCBtYXBwZWQsIHJldCA9IDA7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7Cgl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKCWludCBfX3VzZXIgKnAgPSBhcmdwOwoKCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKCgoJbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiAoRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFEKSkgJiYgZG1hYnVmLT5tYXBwZWQpOwoKCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X2lvY3RsLCBjb21tYW5kID0gJTJkLCBhcmcgPSAweCUwOHhcbiIsCgkJIF9JT0NfTlIoY21kKSwgYXJnID8gKnAgOiAwKTsKCglzd2l0Y2ggKGNtZCkgewoJY2FzZSBPU1NfR0VUVkVSU0lPTjoKCQlyZXQgPSBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfUkVTRVQ6CgkJLyogRklYTUU6IHNwaW5fbG9jayA/ICovCgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCXN0b3BfZGFjKHN0YXRlKTsKCQkJc3luY2hyb25pemVfaXJxKGNhcmQtPmlycSk7CgkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciA9IDA7CgkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKCQl9CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJc3RvcF9hZGMoc3RhdGUpOwoJCQlzeW5jaHJvbml6ZV9pcnEoY2FyZC0+aXJxKTsKCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOwoJCX0KCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU1lOQzoKCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCgkJCXJldCA9IGRyYWluX2RhYyhzdGF0ZSwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoJLyogc2V0IHNtYXBsZSByYXRlICovCgkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKCQkJcmV0ID0gLUVGQVVMVDsKCQkJYnJlYWs7CgkJfQoJCWlmICh2YWwgPj0gMCkgewoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJCXN0b3BfZGFjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJCQl0cmlkZW50X3NldF9kYWNfcmF0ZShzdGF0ZSwgdmFsKTsKCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJCX0KCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJCXN0b3BfYWRjKHN0YXRlKTsKCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJCQl0cmlkZW50X3NldF9hZGNfcmF0ZShzdGF0ZSwgdmFsKTsKCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJCX0KCQl9CgkJcmV0ID0gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU1RFUkVPOgkvKiBzZXQgc3RlcmVvIG9yIG1vbm8gY2hhbm5lbCAqLwoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoKHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkKCQkJcmV0dXJuIHJldDsKCgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCXN0b3BfZGFjKHN0YXRlKTsKCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCWlmICh2YWwpCgkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF9TVEVSRU87CgkJCWVsc2UKCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9TVEVSRU87CgkJfQoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCXN0b3BfYWRjKHN0YXRlKTsKCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCWlmICh2YWwpCgkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF9TVEVSRU87CgkJCWVsc2UKCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9TVEVSRU87CgkJfQoJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpKQoJCQkJcmV0ID0gdmFsOwoJCQllbHNlCgkJCQlyZXQgPSBwdXRfdXNlcihkbWFidWYtPmZyYWdzaXplLCBwKTsKCQkJYnJlYWs7CgkJfQoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCWlmICgodmFsID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkpCgkJCQlyZXQgPSB2YWw7CgkJCWVsc2UKCQkJCXJldCA9IHB1dF91c2VyKGRtYWJ1Zi0+ZnJhZ3NpemUsIHApOwoJCQlicmVhazsKCQl9CgkJLyogbmVpdGhlciBSRUFEIG5vciBXUklURT8gaXMgdGhpcyBldmVuIHBvc3NpYmxlPyAqLwoJCXJldCA9IC1FSU5WQUw7CgkJYnJlYWs7CgoKCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCAqLwoJCXJldCA9IHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUgfCBBRk1UX1M4IHwgCgkJCSAgICAgICBBRk1UX1U4LCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU0VURk1UOgkvKiBTZWxlY3Qgc2FtcGxlIGZvcm1hdCAqLwoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoKHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkKCQkJcmV0dXJuIHJldDsKCgkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CgkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQkJc3RvcF9kYWMoc3RhdGUpOwoJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQoJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UXzE2QklUOwoJCQkJZWxzZQoJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF8xNkJJVDsKCQkJfQoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQkJc3RvcF9hZGMoc3RhdGUpOwoJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQoJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UXzE2QklUOwoJCQkJZWxzZQoJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF8xNkJJVDsKCQkJfQoJCX0KCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CgkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gQUZNVF9TMTZfTEUgOiAKCQkJICAgICAgIEFGTVRfVTgsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKHZhbCAhPSAwKSB7CgkJCWlmICgocmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKQoJCQkJcmV0dXJuIHJldDsKCgkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewoJCQkJc3RvcF9kYWMoc3RhdGUpOwoJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgoJCQkJLy9wcmV2ZW50IGZyb20gbWVtb3J5IGxlYWsKCQkJCWlmICgoc3RhdGUtPmNoYW5zX251bSA+IDIpICYmIChzdGF0ZS0+Y2hhbnNfbnVtICE9IHZhbCkpIHsKCQkJCQlhbGlfZnJlZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0YXRlKTsKCQkJCQlzdGF0ZS0+Y2hhbnNfbnVtID0gMTsKCQkJCX0KCgkJCQlpZiAodmFsID49IDIpIHsKCgkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOwoJCQkJCWlmICgodmFsID09IDYpICYmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpKSB7CgkJCQkJCWlmIChjYXJkLT5yZWNfY2hhbm5lbF91c2VfY291bnQgPiAwKSB7CgkJCQkJCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IFJlY29yZCBpcyAiCgkJCQkJCQkgICAgICAgIndvcmtpbmcgb24gdGhlIGNhcmQhXG4iKTsKCQkJCQkJCXJldCA9IC1FQlVTWTsKCQkJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgoJCQkJCQlyZXQgPSBhbGlfc2V0dXBfbXVsdGlfY2hhbm5lbHMoc3RhdGUtPmNhcmQsIDYpOwoJCQkJCQlpZiAocmV0IDwgMCkgewoJCQkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJbXV0ZXhfbG9jaygmc3RhdGUtPmNhcmQtPm9wZW5fbXV0ZXgpOwoJCQkJCQlyZXQgPSBhbGlfYWxsb2NhdGVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdGF0ZSwgNik7CgkJCQkJCWlmIChyZXQgPCAwKSB7CgkJCQkJCQltdXRleF91bmxvY2soJnN0YXRlLT5jYXJkLT5vcGVuX211dGV4KTsKCQkJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCXN0YXRlLT5jYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCsrOwoJCQkJCQltdXRleF91bmxvY2soJnN0YXRlLT5jYXJkLT5vcGVuX211dGV4KTsKCQkJCQl9IGVsc2UKCQkJCQkJdmFsID0gMjsJLyp5aWVsZCB0byAyLWNoYW5uZWxzICovCgkJCQl9IGVsc2UKCQkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfU1RFUkVPOwoJCQkJc3RhdGUtPmNoYW5zX251bSA9IHZhbDsKCQkJfQoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCQkJc3RvcF9hZGMoc3RhdGUpOwoJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CgkJCQlpZiAodmFsID49IDIpIHsKCQkJCQlpZiAoISgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIAoJCQkJCSAgICAgICh2YWwgPT0gNikpKQoJCQkJCQl2YWwgPSAyOwoJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UX1NURVJFTzsKCQkJCX0gZWxzZQoJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9TVEVSRU87CgkJCQlzdGF0ZS0+Y2hhbnNfbnVtID0gdmFsOwoJCQl9CgkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKCQl9CgkJcmV0ID0gcHV0X3VzZXIodmFsLCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfUE9TVDoKCQkvKiBDYXVzZSB0aGUgd29ya2luZyBmcmFnbWVudCB0byBiZSBvdXRwdXQgKi8KCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgoJCWlmIChkbWFidWYtPnN1YmRpdmlzaW9uKSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gdmFsOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgoJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwoJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQgPCA0KQoJCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDQ7CgkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID4gMTUpCgkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMTU7CgkJaWYgKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPCA0KQoJCQlkbWFidWYtPm9zc21heGZyYWdzID0gNDsKCgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpIHsKCQkJcmV0ID0gLUVJTlZBTDsKCQkJYnJlYWs7CgkJfQoJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSAhPSAwKSB7CgkJCXJldCA9IHZhbDsKCQkJYnJlYWs7CgkJfQoJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT5mcmFnc2l6ZTsKCQlhYmluZm8uYnl0ZXMgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OwoJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOwoJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/IAoJCQktRUZBVUxUIDogMDsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgoJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpICE9IDApIHsKCQkJcmV0ID0gdmFsOwoJCQlicmVhazsKCQl9CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplOwoJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+Y291bnQ7CgkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CgkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YgKGFiaW5mbykpID8gCgkJCS1FRkFVTFQgOiAwOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CgkJYnJlYWs7CgoJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CgkJcmV0ID0gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IAoJCQkgICAgICAgRFNQX0NBUF9NTUFQIHwgRFNQX0NBUF9CSU5ELCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKCQl2YWwgPSAwOwoJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgZG1hYnVmLT5lbmFibGUpCgkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOwoJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIGRtYWJ1Zi0+ZW5hYmxlKQoJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CgkJcmV0ID0gcHV0X3VzZXIodmFsLCBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgewoJCQlyZXQgPSAtRUZBVUxUOwoJCQlicmVhazsKCQl9CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAKCQkJCSAgICAocmV0ID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkpCgkJCQkJYnJlYWs7CgkJCQlzdGFydF9hZGMoc3RhdGUpOwoJCQl9IGVsc2UKCQkJCXN0b3BfYWRjKHN0YXRlKTsKCQl9CgkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgewoJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIAoJCQkJICAgIChyZXQgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpKQoJCQkJCWJyZWFrOwoJCQkJc3RhcnRfZGFjKHN0YXRlKTsKCQkJfSBlbHNlCgkJCQlzdG9wX2RhYyhzdGF0ZSk7CgkJfQoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgoJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CgkJCXJldCA9IC1FSU5WQUw7CgkJCWJyZWFrOwoJCX0KCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpCgkJICAgICE9IDApIHsKCQkJcmV0ID0gdmFsOwoJCQlicmVhazsKCQl9CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXM7CgkJY2luZm8uYmxvY2tzID0gZG1hYnVmLT5jb3VudCA+PiBkbWFidWYtPmZyYWdzaGlmdDsKCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOwoJCWlmIChkbWFidWYtPm1hcHBlZCkKCQkJZG1hYnVmLT5jb3VudCAmPSBkbWFidWYtPmZyYWdzaXplIC0gMTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwoJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/IAoJCQktRUZBVUxUIDogMDsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpIHsKCQkJcmV0ID0gLUVJTlZBTDsKCQkJYnJlYWs7CgkJfQoJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKQoJCSAgICAhPSAwKSB7CgkJCXJldCA9IHZhbDsKCQkJYnJlYWs7CgkJfQoKCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOwoJCWNpbmZvLmJ5dGVzID0gZG1hYnVmLT50b3RhbF9ieXRlczsKCQljaW5mby5ibG9ja3MgPSBkbWFidWYtPmNvdW50ID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OwoJCWNpbmZvLnB0ciA9IGRtYWJ1Zi0+aHdwdHI7CgkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQoJCQlkbWFidWYtPmNvdW50ICY9IGRtYWJ1Zi0+ZnJhZ3NpemUgLSAxOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJcmV0ID0gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mIChjaW5mbykpID8gCgkJCS1FRkFVTFQgOiAwOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CgkJcmV0ID0gLUVJTlZBTDsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgoJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgewoJCQlyZXQgPSAtRUlOVkFMOwoJCQlicmVhazsKCQl9CgkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpICE9IDApIHsKCQkJcmV0ID0gdmFsOwoJCQlicmVhazsKCQl9CgkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKCQl2YWwgPSBkbWFidWYtPmNvdW50OwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CgkJcmV0ID0gcHV0X3VzZXIodmFsLCBwKTsKCQlicmVhazsKCgljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CgkJcmV0ID0gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKCQlicmVhazsKCgljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgoJCXJldCA9IHB1dF91c2VyKChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UX1NURVJFTykgPyAyIDogMSwgCgkJCSAgICAgICBwKTsKCQlicmVhazsKCgljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CgkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gQUZNVF9TMTZfTEUgOiAKCQkJICAgICAgIEFGTVRfVTgsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSzoKCQlyZXQgPSBwdXRfdXNlcihEU1BfQklORF9GUk9OVCB8IERTUF9CSU5EX1NVUlIgfCAKCQkJICAgICAgIERTUF9CSU5EX0NFTlRFUl9MRkUsICBwKTsKCQlicmVhazsKCgljYXNlIFNORENUTF9EU1BfQklORF9DSEFOTkVMOgoJCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkICE9IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewoJCQlyZXQgPSAtRUlOVkFMOwoJCQlicmVhazsKCQl9CgoJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CgkJCXJldCA9IC1FRkFVTFQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAodmFsID09IERTUF9CSU5EX1FVRVJZKSB7CgkJCXZhbCA9IGRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlIHwgMHgzYzAwOwoJCQl2YWwgPSBhdHRyMm1hc2tbdmFsID4+IDhdOwoJCX0gZWxzZSB7CgkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwoJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKCQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfUkVDIHwgCgkJCQkJCQkgICAgICBTUkNfRU5BQkxFKTsKCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQoJCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9TUENfUEIgfCAKCQkJCQkJCSAgICAgIFNSQ19FTkFCTEUpOwoJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSB8PSBtYXNrMmF0dHJbZmZzKHZhbCldOwoJCX0KCQlyZXQgPSBwdXRfdXNlcih2YWwsIHApOwoJCWJyZWFrOwoKCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6CgljYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgoJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgoJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CglkZWZhdWx0OgoJCXJldCA9IC1FSU5WQUw7CgkJYnJlYWs7CgoJfQoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludAp0cmlkZW50X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWludCBpID0gMDsKCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZGV2czsKCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IE5VTEw7CglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSBOVUxMOwoKCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSAqLwoJLyogVE9ETzogdGhlcmUncyBzb21lIHJlZHVuZGFjeSBoZXJlIHdydCB0aGUgY2hlY2sgYmVsb3cgKi8KCS8qIGZvciBtdWx0aV91c2VfY291bnQgPiAwLiBTaG91bGQgd2UgcmV0dXJuIC1FQlVTWSBvciBmaW5kICovCgkvKiBhIGRpZmZlcmVudCBjYXJkPyBmb3Igbm93LCBkb24ndCBicmVhayBjdXJyZW50IGJlaGF2aW91ciAqLwoJLyogLS0gbXVsaXggKi8KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJCWlmIChjYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA+IDApCgkJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCX0KCgkvKiBmaW5kIGFuIGF2YWlsYWJsZSB2aXJ0dWFsIGNoYW5uZWwgKGluc3RhbmNlIG9mIC9kZXYvZHNwKSAqLwoJd2hpbGUgKGNhcmQgIT0gTlVMTCkgewoJCW11dGV4X2xvY2soJmNhcmQtPm9wZW5fbXV0ZXgpOwoJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CgkJCS8qIFNraXAgb3BlbnMgb24gY2FyZHMgdGhhdCBhcmUgaW4gNiBjaGFubmVsIG1vZGUgKi8KCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID4gMCkgewoJCQkJbXV0ZXhfdW5sb2NrKCZjYXJkLT5vcGVuX211dGV4KTsKCQkJCWNhcmQgPSBjYXJkLT5uZXh0OwoJCQkJY29udGludWU7CgkJCX0KCQl9CgkJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKCQkJaWYgKGNhcmQtPnN0YXRlc1tpXSA9PSBOVUxMKSB7CgkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXSA9IGttYWxsb2Moc2l6ZW9mKCpzdGF0ZSksIEdGUF9LRVJORUwpOwoJCQkJaWYgKHN0YXRlID09IE5VTEwpIHsKCQkJCQltdXRleF91bmxvY2soJmNhcmQtPm9wZW5fbXV0ZXgpOwoJCQkJCXJldHVybiAtRU5PTUVNOwoJCQkJfQoJCQkJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSk7CgkJCQltdXRleF9pbml0KCZzdGF0ZS0+c2VtKTsKCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwoJCQkJZ290byBmb3VuZF92aXJ0OwoJCQl9CgkJfQoJCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgkJY2FyZCA9IGNhcmQtPm5leHQ7Cgl9CgkvKiBubyBtb3JlIHZpcnR1YWwgY2hhbm5lbCBhdmFpYWJsZSAqLwoJaWYgKCFzdGF0ZSkgewoJCXJldHVybiAtRU5PREVWOwoJfQogICAgICBmb3VuZF92aXJ0OgoJLyogZm91bmQgYSBmcmVlIHZpcnR1YWwgY2hhbm5lbCwgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbHMgKi8KCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQoJCWRtYWJ1Zi0+Y2hhbm5lbCA9IGNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbChjYXJkKTsKCWVsc2UKCQlkbWFidWYtPmNoYW5uZWwgPSBjYXJkLT5hbGxvY19wY21fY2hhbm5lbChjYXJkKTsKCglpZiAoZG1hYnVmLT5jaGFubmVsID09IE5VTEwpIHsKCQlrZnJlZShjYXJkLT5zdGF0ZXNbaV0pOwoJCWNhcmQtPnN0YXRlc1tpXSA9IE5VTEw7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJLyogaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCBjaGFubmVsICovCglzdGF0ZS0+dmlydCA9IGk7CglzdGF0ZS0+Y2FyZCA9IGNhcmQ7CglzdGF0ZS0+bWFnaWMgPSBUUklERU5UX1NUQVRFX01BR0lDOwoJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKCWZpbGUtPnByaXZhdGVfZGF0YSA9IHN0YXRlOwoKCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzICovIAoJLyogR3VpZGUgIC9kZXYvZHNwIHNob3VsZCBiZSBkZWZhdWx0IHRvIHVuc2lnbmVkIDgtYml0cywgbW9ubywgKi8gCgkvKiB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLwoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX01BU0s7CgkJaWYgKChtaW5vciAmIDB4MGYpID09IFNORF9ERVZfRFNQMTYpCgkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UXzE2QklUOwoJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMDsKCQlkbWFidWYtPm9zc21heGZyYWdzID0gMDsKCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gMDsKCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgewoJCQkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIGF0dHJpYnV0ZSB0byBub3JtYWwgcGxheWJhY2sgKi8KCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSBDSEFOTkVMX1BCOwoJCX0KCQl0cmlkZW50X3NldF9kYWNfcmF0ZShzdGF0ZSwgODAwMCk7Cgl9CgoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKCQkvKiBGSVhNRTogVHJpZGVudCA0ZCBjYW4gb25seSByZWNvcmQgaW4gc2lnbmVkIDE2LWJpdHMgc3RlcmVvLCAqLyAKCQkvKiA0OGtIeiBzYW1wbGUsIHRvIGJlIGRlYWxlZCB3aXRoIGluIHRyaWRlbnRfc2V0X2FkY19yYXRlKCkgPz8gKi8KCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfTUFTSzsKCQlpZiAoKG1pbm9yICYgMHgwZikgPT0gU05EX0RFVl9EU1AxNikKCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfMTZCSVQ7CgkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAwOwoJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAwOwoJCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSAwOwoJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CgkJCS8qIHNldCBkZWZhdWx0IGNoYW5uZWwgYXR0cmlidXRlIHRvIDB4OGE4MCwgcmVjb3JkIGZyb20KCQkJICAgUENNIEwvUiBGSUZPIGFuZCBtb25vID0gKGxlZnQgKyByaWdodCArIDEpLzIgKi8KCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfCBQQ01fTFIgfCAKCQkJCQkJICAgICAgTU9OT19NSVgpOwoJCX0KCQl0cmlkZW50X3NldF9hZGNfcmF0ZShzdGF0ZSwgODAwMCk7CgoJCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSAqLwoJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkKCQkJY2FyZC0+cmVjX2NoYW5uZWxfdXNlX2NvdW50Kys7Cgl9CgoJc3RhdGUtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgoJcHJfZGVidWcoInRyaWRlbnQ6IG9wZW4gdmlydHVhbCBjaGFubmVsICVkLCBoYXJkIGNoYW5uZWwgJWRcbiIsCgkJIHN0YXRlLT52aXJ0LCBkbWFidWYtPmNoYW5uZWwtPm51bSk7CgoJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKCglWQUxJREFURV9TVEFURShzdGF0ZSk7CgoJY2FyZCA9IHN0YXRlLT5jYXJkOwoJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CgoJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CgkJdHJpZGVudF9jbGVhcl90YWlsKHN0YXRlKTsKCQlkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKCX0KCglwcl9kZWJ1ZygidHJpZGVudDogY2xvc2luZyB2aXJ0dWFsIGNoYW5uZWwgJWQsIGhhcmQgY2hhbm5lbCAlZFxuIiwKCQkgc3RhdGUtPnZpcnQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKCgkvKiBzdG9wIERNQSBzdGF0ZSBtYWNoaW5lIGFuZCBmcmVlIERNQSBidWZmZXJzL2NoYW5uZWxzICovCgltdXRleF9sb2NrKCZjYXJkLT5vcGVuX211dGV4KTsKCglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKCQlzdG9wX2RhYyhzdGF0ZSk7CgkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5kbWFidWYsIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jaGFubmVsLT5udW0pOwoKCQkvKiBBZGRlZCBieSBNYXR0IFd1ICovCgkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID4gMikgewoJCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50LS0gPCAwKQoJCQkJCWNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID0gMDsKCQkJCWlmIChjYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA9PSAwKQoJCQkJCWFsaV9jbG9zZV9tdWx0aV9jaGFubmVscygpOwoJCQkJYWxpX2ZyZWVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdGF0ZSk7CgkJCX0KCQl9Cgl9CglpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewoJCXN0b3BfYWRjKHN0YXRlKTsKCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPmRtYWJ1Ziwgc3RhdGUtPmNhcmQtPnBjaV9kZXYpOwoJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkLCBkbWFidWYtPmNoYW5uZWwtPm51bSk7CgoJCS8qIEFkZGVkIGJ5IE1hdHQgV3UgKi8KCQlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQkJaWYgKGNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudC0tIDwgMCkKCQkJCWNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudCA9IDA7CgkJfQoJfQoKCWNhcmQtPnN0YXRlc1tzdGF0ZS0+dmlydF0gPSBOVUxMOwoJa2ZyZWUoc3RhdGUpOwoKCS8qIHdlJ3JlIGNvdmVyZWQgYnkgdGhlIG9wZW5fbXV0ZXggKi8KCW11dGV4X3VubG9jaygmY2FyZC0+b3Blbl9tdXRleCk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJpZGVudF9hdWRpb19mb3BzID0gewoJLm93bmVyID0gVEhJU19NT0RVTEUsCgkubGxzZWVrID0gbm9fbGxzZWVrLAoJLnJlYWQgPSB0cmlkZW50X3JlYWQsCgkud3JpdGUgPSB0cmlkZW50X3dyaXRlLAoJLnBvbGwgPSB0cmlkZW50X3BvbGwsCgkuaW9jdGwgPSB0cmlkZW50X2lvY3RsLAoJLm1tYXAgPSB0cmlkZW50X21tYXAsCgkub3BlbiA9IHRyaWRlbnRfb3BlbiwKCS5yZWxlYXNlID0gdHJpZGVudF9yZWxlYXNlLAp9OwoKLyogdHJpZGVudCBzcGVjaWZpYyBBQzk3IGZ1bmN0aW9ucyAqLwovKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLwpzdGF0aWMgdm9pZAp0cmlkZW50X2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOwoJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2ssIGJ1c3k7Cgl1bnNpZ25lZCBzaG9ydCBjb3VudCA9IDB4ZmZmZjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1MzIgZGF0YTsKCglkYXRhID0gKCh1MzIpIHZhbCkgPDwgMTY7CgoJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKCWRlZmF1bHQ6CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQlhZGRyZXNzID0gU0lfQUM5N19XUklURTsKCQltYXNrID0gU0lfQUM5N19CVVNZX1dSSVRFIHwgU0lfQUM5N19BVURJT19CVVNZOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnVzeSA9IFNJX0FDOTdfQlVTWV9XUklURTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKCQlhZGRyZXNzID0gRFhfQUNSMF9BQzk3X1c7CgkJbWFzayA9IGJ1c3kgPSBEWF9BQzk3X0JVU1lfV1JJVEU7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CgkJYWRkcmVzcyA9IE5YX0FDUjFfQUM5N19XOwoJCW1hc2sgPSBOWF9BQzk3X0JVU1lfV1JJVEU7CgkJaWYgKGNvZGVjLT5pZCkKCQkJbWFzayB8PSBOWF9BQzk3X1dSSVRFX1NFQ09OREFSWTsKCQlidXN5ID0gTlhfQUM5N19CVVNZX1dSSVRFOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgoJCWFkZHJlc3MgPSBTSV9BQzk3X1dSSVRFOwoJCW1hc2sgPSBidXN5ID0gU0lfQUM5N19CVVNZX1dSSVRFOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnJlYWs7Cgl9CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCWRvIHsKCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSkgJiBidXN5KSA9PSAwKQoJCQlicmVhazsKCX0gd2hpbGUgKGNvdW50LS0pOwoKCWRhdGEgfD0gKG1hc2sgfCAocmVnICYgQUM5N19SRUdfQUREUikpOwoKCWlmIChjb3VudCA9PSAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBBQzk3IENPREVDIHdyaXRlIHRpbWVkIG91dC5cbiIpOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCQlyZXR1cm47Cgl9CgoJb3V0bChkYXRhLCBUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cn0KCi8qIFJlYWQgQUM5NyBjb2RlYyByZWdpc3RlcnMgKi8Kc3RhdGljIHUxNgp0cmlkZW50X2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOwoJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2ssIGJ1c3k7Cgl1bnNpZ25lZCBzaG9ydCBjb3VudCA9IDB4ZmZmZjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cgl1MzIgZGF0YTsKCglzd2l0Y2ggKGNhcmQtPnBjaV9pZCkgewoJZGVmYXVsdDoKCWNhc2UgUENJX0RFVklDRV9JRF9TSV83MDE4OgoJCWFkZHJlc3MgPSBTSV9BQzk3X1JFQUQ7CgkJbWFzayA9IFNJX0FDOTdfQlVTWV9SRUFEIHwgU0lfQUM5N19BVURJT19CVVNZOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnVzeSA9IFNJX0FDOTdfQlVTWV9SRUFEOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgoJCWFkZHJlc3MgPSBEWF9BQ1IxX0FDOTdfUjsKCQltYXNrID0gYnVzeSA9IERYX0FDOTdfQlVTWV9SRUFEOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgoJCWlmIChjb2RlYy0+aWQpCgkJCWFkZHJlc3MgPSBOWF9BQ1IzX0FDOTdfUl9TRUNPTkRBUlk7CgkJZWxzZQoJCQlhZGRyZXNzID0gTlhfQUNSMl9BQzk3X1JfUFJJTUFSWTsKCQltYXNrID0gTlhfQUM5N19CVVNZX1JFQUQ7CgkJYnVzeSA9IE5YX0FDOTdfQlVTWV9SRUFEIHwgTlhfQUM5N19CVVNZX0RBVEE7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CgkJYWRkcmVzcyA9IFNJX0FDOTdfUkVBRDsKCQltYXNrID0gYnVzeSA9IFNJX0FDOTdfQlVTWV9SRUFEOwoJCWlmIChjb2RlYy0+aWQpCgkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CgkJYnJlYWs7Cgl9CgoJZGF0YSA9IChtYXNrIHwgKHJlZyAmIEFDOTdfUkVHX0FERFIpKTsKCglzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJb3V0bChkYXRhLCBUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CglkbyB7CgkJZGF0YSA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CgkJaWYgKChkYXRhICYgYnVzeSkgPT0gMCkKCQkJYnJlYWs7Cgl9IHdoaWxlIChjb3VudC0tKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglpZiAoY291bnQgPT0gMCkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogQUM5NyBDT0RFQyByZWFkIHRpbWVkIG91dC5cbiIpOwoJCWRhdGEgPSAwOwoJfQoJcmV0dXJuICgodTE2KSAoZGF0YSA+PiAxNikpOwp9CgovKiByZXdyaXRlIGFjOTcgcmVhZCBhbmQgd3JpdGUgbWl4ZXIgcmVnaXN0ZXIgYnkgaHVsZWkgZm9yIEFMSSovCnN0YXRpYyBpbnQKYWNxdWlyZWNvZGVjYWNjZXNzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXUxNiB3c2VtYW1hc2sgPSAweDYwMDA7CS8qIGJpdCAxNC4uMTMgKi8KCXUxNiB3c2VtYWJpdHM7Cgl1MTYgd2NvbnRyb2w7CglpbnQgYmxvY2sgPSAwOwoJaW50IG5jb3VudCA9IDI1OwoJd2hpbGUgKDEpIHsKCQl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCXdzZW1hYml0cyA9IHdjb250cm9sICYgd3NlbWFtYXNrOwoKCQlpZiAod3NlbWFiaXRzID09IDB4NDAwMCkKCQkJcmV0dXJuIDE7CS8qIDB4NDAwMCBpcyBhdWRpbyAsdGhlbiBzdWNjZXNzICovCgkJaWYgKG5jb3VudC0tIDwgMCkKCQkJYnJlYWs7CgkJaWYgKHdzZW1hYml0cyA9PSAwKSB7CgkJICAgICAgdW5sb2NrOgoJCQlvdXRsKCgodTMyKSAod2NvbnRyb2wgJiAweDFlZmYpIHwgMHgwMDAwNDAwMCksIAoJCQkgICAgIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CgkJCWNvbnRpbnVlOwoJCX0KCQl1ZGVsYXkoMjApOwoJfQoJaWYgKCFibG9jaykgewoJCXByX2RlYnVnKCJhY2Nlc3Njb2RlY3NlbWFwaG9yZTogdHJ5IHVubG9ja1xuIik7CgkJYmxvY2sgPSAxOwoJCWdvdG8gdW5sb2NrOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCnJlbGVhc2Vjb2RlY2FjY2VzcyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1bnNpZ25lZCBsb25nIHdjb250cm9sOwoJd2NvbnRyb2wgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCW91dGwoKHdjb250cm9sICYgMHhmZmZmMWVmZiksIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7Cn0KCnN0YXRpYyBpbnQKd2FpdGZvcnN0aW1lcnRpY2soc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdW5zaWduZWQgbG9uZyBjaGsxLCBjaGsyOwoJdW5zaWduZWQgaW50IHdjb3VudCA9IDB4ZmZmZjsKCWNoazEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NUSU1FUikpOwoKCXdoaWxlICgxKSB7CgkJY2hrMiA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7CgkJaWYgKCh3Y291bnQgPiAwKSAmJiBjaGsxICE9IGNoazIpCgkJCXJldHVybiAxOwoJCWlmICh3Y291bnQgPD0gMCkKCQkJYnJlYWs7CgkJdWRlbGF5KDUwKTsKCX0KCXJldHVybiAwOwp9CgovKiBSZWFkIEFDOTcgY29kZWMgcmVnaXN0ZXJzIGZvciBBTGkqLwpzdGF0aWMgdTE2CmFsaV9hYzk3X2dldChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgc2Vjb25kYXJ5LCB1OCByZWcpCnsKCXVuc2lnbmVkIGludCBhZGRyZXNzLCBtYXNrOwoJdW5zaWduZWQgaW50IG5jb3VudDsKCXVuc2lnbmVkIGxvbmcgYXVkX3JlZzsKCXUzMiBkYXRhOwoJdTE2IHdjb250cm9sOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglpZiAoIWNhcmQpCgkJQlVHKCk7CgoJYWRkcmVzcyA9IEFMSV9BQzk3X1JFQUQ7CglpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKSB7CgkJYWRkcmVzcyA9IEFMSV9BQzk3X1dSSVRFOwoJfQoJbWFzayA9IEFMSV9BQzk3X1JFQURfQUNUSU9OIHwgQUxJX0FDOTdfQVVESU9fQlVTWTsKCWlmIChzZWNvbmRhcnkpCgkJbWFzayB8PSBBTElfQUM5N19TRUNPTkRBUlk7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglpZiAoIWFjcXVpcmVjb2RlY2FjY2VzcyhjYXJkKSkKCQlwcmludGsoS0VSTl9FUlIgImFjY2VzcyBjb2RlYyBmYWlsXG4iKTsKCgl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJd2NvbnRyb2wgJj0gMHhmZTAwOwoJd2NvbnRyb2wgfD0gKDB4ODAwMCB8IHJlZyk7CglvdXR3KHdjb250cm9sLCBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoKCWRhdGEgPSAobWFzayB8IChyZWcgJiBBQzk3X1JFR19BRERSKSk7CgoJaWYgKCF3YWl0Zm9yc3RpbWVydGljayhjYXJkKSkgewoJCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfcmVhZDogQklUX0NMT0NLIGlzIGRlYWRcbiIpOwoJCWdvdG8gcmVsZWFzZWNvZGVjOwoJfQoKCXVkZWxheSgyMCk7CgoJbmNvdW50ID0gMTA7CgoJd2hpbGUgKDEpIHsKCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpICYgQUxJX0FDOTdfQlVTWV9SRUFEKSAKCQkgICAgIT0gMCkKCQkJYnJlYWs7CgkJaWYgKG5jb3VudCA8PSAwKQoJCQlicmVhazsKCQlpZiAobmNvdW50LS0gPT0gMSkgewoJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfcmVhZCA6dHJ5IGNsZWFyIGJ1c3kgZmxhZ1xuIik7CgkJCWF1ZF9yZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKCQkJb3V0bCgoYXVkX3JlZyAmIDB4ZmZmZjdmZmYpLCAKCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCX0KCQl1ZGVsYXkoMTApOwoJfQoKCWRhdGEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gKCh1MTYpIChkYXRhID4+IDE2KSk7CgogICAgICByZWxlYXNlY29kZWM6CglyZWxlYXNlY29kZWNhY2Nlc3MoY2FyZCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CglwcmludGsoS0VSTl9FUlIgImFsaV9hYzk3X3JlYWQ6IEFDOTcgQ09ERUMgcmVhZCB0aW1lZCBvdXQuXG4iKTsKCXJldHVybiAwOwp9CgovKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyBmb3IgaHVsZWkqLwpzdGF0aWMgdm9pZAphbGlfYWM5N19zZXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IHNlY29uZGFyeSwgdTggcmVnLCB1MTYgdmFsKQp7Cgl1bnNpZ25lZCBpbnQgYWRkcmVzcywgbWFzazsKCXVuc2lnbmVkIGludCBuY291bnQ7Cgl1MzIgZGF0YTsKCXUxNiB3Y29udHJvbDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJZGF0YSA9ICgodTMyKSB2YWwpIDw8IDE2OwoKCWlmICghY2FyZCkKCQlCVUcoKTsKCglhZGRyZXNzID0gQUxJX0FDOTdfV1JJVEU7CgltYXNrID0gQUxJX0FDOTdfV1JJVEVfQUNUSU9OIHwgQUxJX0FDOTdfQVVESU9fQlVTWTsKCWlmIChzZWNvbmRhcnkpCgkJbWFzayB8PSBBTElfQUM5N19TRUNPTkRBUlk7CglpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKQoJCW1hc2sgfD0gQUxJX0FDOTdfV1JJVEVfTUlYRVJfUkVHSVNURVI7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCWlmICghYWNxdWlyZWNvZGVjYWNjZXNzKGNhcmQpKQoJCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfd3JpdGU6IGFjY2VzcyBjb2RlYyBmYWlsXG4iKTsKCgl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJd2NvbnRyb2wgJj0gMHhmZjAwOwoJd2NvbnRyb2wgfD0gKDB4ODEwMCB8IHJlZyk7IC8qIGJpdCA4PTE6IChhbGkxNTM1IClyZXNlcnZlZC8gKi8gCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWxpMTUzNSsgd3JpdGUgKi8KCW91dGwoKGRhdGEgfCB3Y29udHJvbCksIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CgoJaWYgKCF3YWl0Zm9yc3RpbWVydGljayhjYXJkKSkgewoJCXByaW50ayhLRVJOX0VSUiAiQklUX0NMT0NLIGlzIGRlYWRcbiIpOwoJCWdvdG8gcmVsZWFzZWNvZGVjOwoJfQoKCW5jb3VudCA9IDEwOwoJd2hpbGUgKDEpIHsKCQl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCWlmICghKHdjb250cm9sICYgMHg4MDAwKSkKCQkJYnJlYWs7CgkJaWYgKG5jb3VudCA8PSAwKQoJCQlicmVhazsKCQlpZiAobmNvdW50LS0gPT0gMSkgewoJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfc2V0IDp0cnkgY2xlYXIgYnVzeSBmbGFnISFcbiIpOwoJCQlvdXR3KHdjb250cm9sICYgMHg3ZmZmLCAKCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOwoJCX0KCQl1ZGVsYXkoMTApOwoJfQoKICAgICAgcmVsZWFzZWNvZGVjOgoJcmVsZWFzZWNvZGVjYWNjZXNzKGNhcmQpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuOwp9CgpzdGF0aWMgdm9pZAphbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdCkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXQtPmNhcmQ7Cgl1bnNpZ25lZCBsb25nIHNfY2hhbm5lbHM7CgoJc19jaGFubmVscyA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCXNfY2hhbm5lbHMgfD0gKDEgPDwgc3RhdC0+ZG1hYnVmLmNoYW5uZWwtPm51bSk7CglvdXRsKHNfY2hhbm5lbHMsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwp9CgpzdGF0aWMgdTE2CmFsaV9hYzk3X3JlYWQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcpCnsKCWludCBpZDsKCXUxNiBkYXRhOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IE5VTEw7CgoJLyogQWRkZWQgYnkgTWF0dCBXdSAqLwoJaWYgKCFjb2RlYykKCQlCVUcoKTsKCgljYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKikgY29kZWMtPnByaXZhdGVfZGF0YTsKCglpZiAoIWNhcmQtPm1peGVyX3JlZ3NfcmVhZHkpCgkJcmV0dXJuIGFsaV9hYzk3X2dldChjYXJkLCBjb2RlYy0+aWQsIHJlZyk7CgoJLyoKCSAqICAgICAgRklYTUU6IG5lZWQgdG8gc3RvcCB0aGlzIGNhY2hpbmcgc29tZSByZWdpc3RlcnMKCSAqLwoJaWYgKGNvZGVjLT5pZCkKCQlpZCA9IDE7CgllbHNlCgkJaWQgPSAwOwoKCWRhdGEgPSBjYXJkLT5taXhlcl9yZWdzW3JlZyAvIDJdW2lkXTsKCXJldHVybiBkYXRhOwp9CgpzdGF0aWMgdm9pZAphbGlfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZywgdTE2IHZhbCkKewoJaW50IGlkOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsKCgkvKiAgQWRkZWQgYnkgTWF0dCBXdSAqLwoJaWYgKCFjb2RlYykKCQlCVUcoKTsKCgljYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKikgY29kZWMtPnByaXZhdGVfZGF0YTsKCglpZiAoIWNhcmQtPm1peGVyX3JlZ3NfcmVhZHkpIHsKCQlhbGlfYWM5N19zZXQoY2FyZCwgY29kZWMtPmlkLCByZWcsIHZhbCk7CgkJcmV0dXJuOwoJfQoKCWlmIChjb2RlYy0+aWQpCgkJaWQgPSAxOwoJZWxzZQoJCWlkID0gMDsKCgljYXJkLT5taXhlcl9yZWdzW3JlZyAvIDJdW2lkXSA9IHZhbDsKCWFsaV9hYzk3X3NldChjYXJkLCBjb2RlYy0+aWQsIHJlZywgdmFsKTsKfQoKLyoKZmxhZzoJQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQKCUFMSV9QQ01fVE9fU1BESUZfT1VUCiovCgpzdGF0aWMgdm9pZAphbGlfc2V0dXBfc3BkaWZfb3V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBmbGFnKQp7Cgl1bnNpZ25lZCBsb25nIHNwZGlmOwoJdW5zaWduZWQgY2hhciBjaDsKCgljaGFyIHRlbXA7CglzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CgoJcGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsCgkJCQkgcGNpX2Rldik7CglpZiAocGNpX2RldiA9PSBOVUxMKQoJCXJldHVybjsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NjEsICZ0ZW1wKTsKCXRlbXAgfD0gMHg0MDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDYxLCB0ZW1wKTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2QsICZ0ZW1wKTsKCXRlbXAgfD0gMHgwMTsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdkLCB0ZW1wKTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2UsICZ0ZW1wKTsKCXRlbXAgJj0gKH4weDIwKTsKCXRlbXAgfD0gMHgxMDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdlLCB0ZW1wKTsKCglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCgljaCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCW91dGIoY2ggfCBBTElfU1BESUZfT1VUX0VOQUJMRSwgVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CgljaCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJb3V0YihjaCAmIEFMSV9TUERJRl9PVVRfQ0hfU1RBVFVTLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoKCWlmIChmbGFnICYgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQpIHsKCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQlzcGRpZiB8PSBBTElfU1BESUZfT1VUX0NIX0VOQUJMRTsKCQlzcGRpZiAmPSBBTElfU1BESUZfT1VUX1NFTF9TUERJRjsKCQlvdXR3KHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MpKTsKCQlpZiAoZmxhZyAmIEFMSV9TUERJRl9PVVRfTk9OX1BDTSkKCQkJc3BkaWYgfD0gMHgwMDAyOwoJCWVsc2UKCQkJc3BkaWYgJj0gKH4weDAwMDIpOwoJCW91dHcoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUykpOwoJfSBlbHNlIHsKCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQlzcGRpZiB8PSBBTElfU1BESUZfT1VUX1NFTF9QQ007CgkJb3V0dyhzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7Cgl9Cn0KCnN0YXRpYyB2b2lkCmFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgY2gpCnsKCXVuc2lnbmVkIGxvbmcgc2M7CgoJc2MgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzYyAmPSB+KDEgPDwgY2gpOwoJb3V0bChzYywgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9kaXNhYmxlX3NwZGlmX2luKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCXVuc2lnbmVkIGxvbmcgc3BkaWY7CgoJc3BkaWYgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzcGRpZiAmPSAofkFMSV9TUERJRl9JTl9TVVBQT1JUKTsKCW91dGwoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoKCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChjYXJkLCBBTElfU1BESUZfSU5fQ0hBTk5FTCk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9zZXR1cF9zcGRpZl9pbihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1bnNpZ25lZCBsb25nIHNwZGlmOwoKCS8vU2V0IFNQRElGIElOIFN1cHBvcnRlZAoJc3BkaWYgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzcGRpZiB8PSBBTElfU1BESUZfSU5fU1VQUE9SVDsKCW91dGwoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOwoKCS8vU2V0IFNQRElGIElOIFJlYwoJc3BkaWYgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CglzcGRpZiB8PSBBTElfU1BESUZfSU5fQ0hfRU5BQkxFOwoJb3V0bChzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgoJc3BkaWYgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCXNwZGlmIHw9IEFMSV9TUERJRl9JTl9DSF9TVEFUVVM7CglvdXRiKHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwovKgoJc3BkaWYgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCXNwZGlmIHw9IEFMSV9TUERJRl9JTl9GVU5DX0VOQUJMRTsKCW91dGIoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CiovCn0KCnN0YXRpYyB2b2lkCmFsaV9kZWxheShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgaW50ZXJ2YWwpCnsKCXVuc2lnbmVkIGxvbmcgYmVnaW50aW1lciwgY3VycmVudHRpbWVyOwoKCWJlZ2ludGltZXIgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NUSU1FUikpOwoJY3VycmVudHRpbWVyID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TVElNRVIpKTsKCgl3aGlsZSAoY3VycmVudHRpbWVyIDwgYmVnaW50aW1lciArIGludGVydmFsKQoJCWN1cnJlbnR0aW1lciA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9kZXRlY3Rfc3BkaWZfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MTYgd3ZhbCA9IDA7Cgl1MTYgY291bnQgPSAwOwoJdTggYnZhbCA9IDAsIFIxID0gMCwgUjIgPSAwOwoKCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCWJ2YWwgfD0gMHgwMjsKCW91dGIoYnZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKCglidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMSkpOwoJYnZhbCB8PSAweDFGOwoJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDEpKTsKCgl3aGlsZSAoKChSMSA8IDB4MEIpIHx8IChSMSA+IDB4MEUpKSAmJiAoUjEgIT0gMHgxMikgJiYgCgkgICAgICAgY291bnQgPD0gNTAwMDApIHsKCQljb3VudCsrOwoKCQlhbGlfZGVsYXkoY2FyZCwgNik7CgoJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CgkJUjEgPSBidmFsICYgMHgxRjsKCX0KCglpZiAoY291bnQgPiA1MDAwMCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgInRyaWRlbnQ6IEVycm9yIGluICIKCQkgICAgICAgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZSFcbiIpOwoJCXJldHVybjsKCX0KCgljb3VudCA9IDA7CgoJd2hpbGUgKGNvdW50IDw9IDUwMDAwKSB7CgkJY291bnQrKzsKCgkJYWxpX2RlbGF5KGNhcmQsIDYpOwoKCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMSkpOwoJCVIyID0gYnZhbCAmIDB4MUY7CgoJCWlmIChSMiAhPSBSMSkKCQkJUjEgPSBSMjsKCQllbHNlCgkJCWJyZWFrOwoJfQoKCWlmIChjb3VudCA+IDUwMDAwKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogRXJyb3IgaW4gIgoJCSAgICAgICAiYWxpX2RldGVjdF9zcGRpZl9yYXRlIVxuIik7CgkJcmV0dXJuOwoJfQoKCXN3aXRjaCAoUjIpIHsKCWNhc2UgMHgwYjoKCWNhc2UgMHgwYzoKCWNhc2UgMHgwZDoKCWNhc2UgMHgwZToKCQl3dmFsID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoJCXd2YWwgJj0gMHhFMEYwOwoJCXd2YWwgfD0gKHUxNikgMHgwOSA8PCA4IHwgKHUxNikgMHgwNTsKCQlvdXR3KHd2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoKCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKSAmIDB4RjA7CgkJb3V0YihidmFsIHwgMHgwMiwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMykpOwoJCWJyZWFrOwoKCWNhc2UgMHgxMjoKCQl3dmFsID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoJCXd2YWwgJj0gMHhFMEYwOwoJCXd2YWwgfD0gKHUxNikgMHgwRSA8PCA4IHwgKHUxNikgMHgwODsKCQlvdXR3KHd2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMICsgMikpOwoKCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKSAmIDB4RjA7CgkJb3V0YihidmFsIHwgMHgwMywgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMykpOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9Cgp9CgpzdGF0aWMgdW5zaWduZWQgaW50CmFsaV9nZXRfc3BkaWZfaW5fcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1MzIgZHdSYXRlID0gMDsKCXU4IGJ2YWwgPSAwOwoKCWFsaV9kZXRlY3Rfc3BkaWZfcmF0ZShjYXJkKTsKCglidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CglidmFsICY9IDB4N0Y7CglidmFsIHw9IDB4NDA7CglvdXRiKGJ2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CgoJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSk7CglidmFsICY9IDB4MEY7CgoJc3dpdGNoIChidmFsKSB7CgljYXNlIDA6CgkJZHdSYXRlID0gNDQxMDA7CgkJYnJlYWs7CgljYXNlIDE6CgkJZHdSYXRlID0gNDgwMDA7CgkJYnJlYWs7CgljYXNlIDI6CgkJZHdSYXRlID0gMzIwMDA7CgkJYnJlYWs7CglkZWZhdWx0OgoJCS8vIEVycm9yIG9jY3VycwoJCWJyZWFrOwoJfQoKCXJldHVybiBkd1JhdGU7Cgp9CgpzdGF0aWMgaW50CmFsaV9jbG9zZV9tdWx0aV9jaGFubmVscyh2b2lkKQp7CgljaGFyIHRlbXAgPSAwOwoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOwoKCXBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAoJCQkJIHBjaV9kZXYpOwoJaWYgKHBjaV9kZXYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgMHg1OSwgJnRlbXApOwoJdGVtcCAmPSB+MHg4MDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCB0ZW1wKTsKCglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCglwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSwKCQkJCSBOVUxMKTsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4QjgsICZ0ZW1wKTsKCXRlbXAgJj0gfjB4MjA7CglwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHhCOCwgdGVtcCk7CgoJcGNpX2Rldl9wdXQocGNpX2Rldik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaGFuX251bXMpCnsKCXVuc2lnbmVkIGxvbmcgZHdWYWx1ZTsKCWNoYXIgdGVtcCA9IDA7CglzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CgoJcGNpX2RldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsCgkJCQkgcGNpX2Rldik7CglpZiAocGNpX2RldiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NTksICZ0ZW1wKTsKCXRlbXAgfD0gMHg4MDsKCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCB0ZW1wKTsKCglwY2lfZGV2X3B1dChwY2lfZGV2KTsKCglwY2lfZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSwKCQkJCSBOVUxMKTsKCWlmIChwY2lfZGV2ID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgKGludCkgMHhCOCwgJnRlbXApOwoJdGVtcCB8PSAweDIwOwoJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIChpbnQpIDB4QjgsICh1OCkgdGVtcCk7CgoJcGNpX2Rldl9wdXQocGNpX2Rldik7CgoJaWYgKGNoYW5fbnVtcyA9PSA2KSB7CgkJZHdWYWx1ZSA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKSB8IDB4MDAwZjAwMDA7CgkJb3V0bChkd1ZhbHVlLCBUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCQltZGVsYXkoNCk7CgkJZHdWYWx1ZSA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKCQlpZiAoZHdWYWx1ZSAmIDB4MjAwMDAwMCkgewoJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCA4MDgwKTsKCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgMHgzNiwgMCk7CgkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MzgsIDApOwoJCQkvKgoJCQkgKiAgICAgIE9uIGEgYm9hcmQgd2l0aCBhIHNpbmdsZSBjb2RlYyB5b3Ugd29uJ3QgZ2V0IHRoZQoJCQkgKiAgICAgIHN1cnJvdW5kLiBPbiBvdGhlciBib2FyZHMgY29uZmlndXJlIGl0LgoJCQkgKi8KCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbMV0gIT0gTlVMTCkgewoJCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1sxXSwgMHgzNiwgMCk7CgkJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzFdLCAweDM4LCAwKTsKCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4MDIsIDB4MDYwNik7CgkJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzFdLCAweDE4LCAweDAzMDMpOwoJCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1sxXSwgMHg3NCwgMHgzKTsKCQkJfQoJCQlyZXR1cm4gMTsKCQl9Cgl9CglyZXR1cm4gLUVJTlZBTDsKfQoKc3RhdGljIHZvaWQKYWxpX2ZyZWVfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCWludCBiYW5rOwoKCWlmIChjaGFubmVsID4gMzEpCgkJcmV0dXJuOwoKCWJhbmsgPSBjaGFubmVsID4+IDU7CgljaGFubmVsID0gY2hhbm5lbCAmIDB4MWY7CgoJY2FyZC0+YmFua3NbYmFua10uYml0bWFwICY9IH4oMSA8PCAoY2hhbm5lbCkpOwp9CgpzdGF0aWMgaW50CmFsaV9hbGxvY2F0ZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgaW50IGNoYW5fbnVtcykKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnM7CglpbnQgaSwgc3RhdGVfY291bnQgPSAwOwoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsOwoJdW5zaWduZWQgbG9uZyBudW07CgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwoKCWlmIChjaGFuX251bXMgIT0gNikKCQlyZXR1cm4gMDsKCglmb3IgKGkgPSAwOyAoaSA8IEFMSV9DSEFOTkVMUykgJiYgKHN0YXRlX2NvdW50ICE9IDQpOyBpKyspIHsKCQlpZiAoY2FyZC0+c3RhdGVzW2ldKQoJCQljb250aW51ZTsKCgkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJaWYgKCEoYmFuay0+Yml0bWFwICYgKDEgPDwgbnVtKSkpIHsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgbnVtOwoJCQljaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW251bV07CgkJCWNoYW5uZWwtPm51bSA9IG51bTsKCQl9IGVsc2UgewoJCQlzdGF0ZV9jb3VudC0tOwoJCQlmb3IgKDsgc3RhdGVfY291bnQgPj0gMDsgc3RhdGVfY291bnQtLSkgewoJCQkJa2ZyZWUoc3RhdGUtPm90aGVyX3N0YXRlc1tzdGF0ZV9jb3VudF0pOwoJCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJCQkJYWxpX2ZyZWVfcGNtX2NoYW5uZWwoY2FyZCwgbnVtKTsKCQkJfQoJCQlyZXR1cm4gLUVCVVNZOwoJCX0KCQlzID0gY2FyZC0+c3RhdGVzW2ldID0ga21hbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CgkJaWYgKCFzKSB7CgkJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOwoJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOwoJCQlzdGF0ZV9jb3VudC0tOwoJCQlmb3IgKDsgc3RhdGVfY291bnQgPj0gMDsgc3RhdGVfY291bnQtLSkgewoJCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOwoJCQkJa2ZyZWUoc3RhdGUtPm90aGVyX3N0YXRlc1tzdGF0ZV9jb3VudF0pOwoJCQl9CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCQltZW1zZXQocywgMCwgc2l6ZW9mKCpzdGF0ZSkpOwoKCQlzLT5kbWFidWYuY2hhbm5lbCA9IGNoYW5uZWw7CgkJcy0+ZG1hYnVmLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYWJ1Zi5vc3NtYXhmcmFncyA9CgkJCXMtPmRtYWJ1Zi5zdWJkaXZpc2lvbiA9IDA7CgkJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hYnVmLndhaXQpOwoJCXMtPm1hZ2ljID0gY2FyZC0+bWFnaWM7CgkJcy0+Y2FyZCA9IGNhcmQ7CgkJcy0+dmlydCA9IGk7CgkJYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwocyk7CgkJc3RhdGUtPm90aGVyX3N0YXRlc1tzdGF0ZV9jb3VudCsrXSA9IHM7Cgl9CgoJaWYgKHN0YXRlX2NvdW50ICE9IDQpIHsKCQlzdGF0ZV9jb3VudC0tOwoJCWZvciAoOyBzdGF0ZV9jb3VudCA+PSAwOyBzdGF0ZV9jb3VudC0tKSB7CgkJCWtmcmVlKHN0YXRlLT5vdGhlcl9zdGF0ZXNbc3RhdGVfY291bnRdKTsKCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CgkJCWFsaV9mcmVlX3BjbV9jaGFubmVsKGNhcmQsIG51bSk7CgkJfQoJCXJldHVybiAtRUJVU1k7Cgl9CglyZXR1cm4gMDsKfQoKI2lmZGVmIENPTkZJR19QTQovKiBzYXZlIHJlZ2lzdGVycyBmb3IgQUxpIFBvd2VyIE1hbmFnZW1lbnQgKi8Kc3RhdGljIHN0cnVjdCBhbGlfc2F2ZWRfcmVnaXN0ZXJzIHsKCXVuc2lnbmVkIGxvbmcgZ2xvYmFsX3JlZ3NbQUxJX0dMT0JBTF9SRUdTXTsKCXVuc2lnbmVkIGxvbmcgY2hhbm5lbF9yZWdzW0FMSV9DSEFOTkVMU11bQUxJX0NIQU5ORUxfUkVHU107Cgl1bnNpZ25lZCBtaXhlcl9yZWdzW0FMSV9NSVhFUl9SRUdTXTsKfSBhbGlfcmVnaXN0ZXJzOwoKc3RhdGljIHZvaWQKYWxpX3NhdmVfcmVncyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IGksIGo7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKCglhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MmNdID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgkvL2FsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMF0gPSBpbmwoVFJJRF9SRUcoY2FyZCxUNERfU1RBUlRfQSkpOyAgICAKCWFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMV0gPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX1NUT1BfQSkpOwoKCS8vZGlzYWJsZSBhbGwgSVJRIGJpdHMKCW91dGwoQUxJX0RJU0FCTEVfQUxMX0lSUSwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKCglmb3IgKGkgPSAxOyBpIDwgQUxJX01JWEVSX1JFR1M7IGkrKykKCQlhbGlfcmVnaXN0ZXJzLm1peGVyX3JlZ3NbaV0gPSBhbGlfYWM5N19yZWFkKGNhcmQtPmFjOTdfY29kZWNbMF0sIAoJCQkJCQkJICAgIGkgKiAyKTsKCglmb3IgKGkgPSAwOyBpIDwgQUxJX0dMT0JBTF9SRUdTOyBpKyspIHsKCQlpZiAoKGkgKiA0ID09IFQ0RF9NSVNDSU5UKSB8fCAoaSAqIDQgPT0gVDREX1NUT1BfQSkpCgkJCWNvbnRpbnVlOwoJCWFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbaV0gPSBpbmwoVFJJRF9SRUcoY2FyZCwgaSAqIDQpKTsKCX0KCglmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspIHsKCQlvdXRiKGksIFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CgkJZm9yIChqID0gMDsgaiA8IEFMSV9DSEFOTkVMX1JFR1M7IGorKykKCQkJYWxpX3JlZ2lzdGVycy5jaGFubmVsX3JlZ3NbaV1bal0gPSBpbmwoVFJJRF9SRUcoY2FyZCwgCgkJCQkJCQkJCWogKiA0ICsgMHhlMCkpOwoJfQoKCS8vU3RvcCBhbGwgSFcgY2hhbm5lbAoJb3V0bChBTElfU1RPUF9BTExfQ0hBTk5FTFMsIFRSSURfUkVHKGNhcmQsIFQ0RF9TVE9QX0EpKTsKCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyB2b2lkCmFsaV9yZXN0b3JlX3JlZ3Moc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWludCBpLCBqOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CgoJZm9yIChpID0gMTsgaSA8IEFMSV9NSVhFUl9SRUdTOyBpKyspCgkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgaSAqIDIsIAoJCQkgICAgICAgYWxpX3JlZ2lzdGVycy5taXhlcl9yZWdzW2ldKTsKCglmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspIHsKCQlvdXRiKGksIFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CgkJZm9yIChqID0gMDsgaiA8IEFMSV9DSEFOTkVMX1JFR1M7IGorKykKCQkJb3V0bChhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSwgCgkJCSAgICAgVFJJRF9SRUcoY2FyZCwgaiAqIDQgKyAweGUwKSk7Cgl9CgoJZm9yIChpID0gMDsgaSA8IEFMSV9HTE9CQUxfUkVHUzsgaSsrKSB7CgkJaWYgKChpICogNCA9PSBUNERfTUlTQ0lOVCkgfHwgKGkgKiA0ID09IFQ0RF9TVE9QX0EpIHx8IAoJCSAgICAoaSAqIDQgPT0gVDREX1NUQVJUX0EpKQoJCQljb250aW51ZTsKCQlvdXRsKGFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbaV0sIFRSSURfUkVHKGNhcmQsIGkgKiA0KSk7Cgl9CgoJLy9zdGFydCBIVyBjaGFubmVsCglvdXRsKGFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMF0sIFRSSURfUkVHKGNhcmQsIFQ0RF9TVEFSVF9BKSk7CgkvL3Jlc3RvcmUgSVJRIGVuYWJsZSBiaXRzCglvdXRsKGFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyY10sIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CgoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3QgdW51c2VkKQp7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKGRldik7CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJYWxpX3NhdmVfcmVncyhjYXJkKTsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKCglpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQlhbGlfcmVzdG9yZV9yZWdzKGNhcmQpOwoJfQoJcmV0dXJuIDA7Cn0KI2VuZGlmCgpzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqCmFsaV9hbGxvY19wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CglzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuazsKCWludCBpZHg7CgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwoKCWlmIChpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgJiAKCSAgICAoQUxJX1NQRElGX09VVF9DSF9FTkFCTEUpKSB7CgkJaWR4ID0gQUxJX1NQRElGX09VVF9DSEFOTkVMOwoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OwoJCQljaGFubmVsLT5udW0gPSBpZHg7CgkJCXJldHVybiBjaGFubmVsOwoJCX0KCX0KCglmb3IgKGlkeCA9IEFMSV9QQ01fT1VUX0NIQU5ORUxfRklSU1Q7IGlkeCA8PSBBTElfUENNX09VVF9DSEFOTkVMX0xBU1Q7IAoJICAgICBpZHgrKykgewoJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWwgPSAmYmFuay0+Y2hhbm5lbHNbaWR4XTsKCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OwoJCQljaGFubmVsLT5udW0gPSBpZHg7CgkJCXJldHVybiBjaGFubmVsOwoJCX0KCX0KCgkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhbGlhYmxlICovCiNpZiAwIAoJcHJpbnRrKEtFUk5fRVJSICJhbGk6IG5vIG1vcmUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQS5cbiIpOwojZW5kaWYgLyogMCAqLyAKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqCmFsaV9hbGxvY19yZWNfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CglpbnQgaWR4OwoKCWlmIChpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgJiBBTElfU1BESUZfSU5fU1VQUE9SVCkKCQlpZHggPSBBTElfU1BESUZfSU5fQ0hBTk5FTDsKCWVsc2UKCQlpZHggPSBBTElfUENNX0lOX0NIQU5ORUw7CgoJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOwoKCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CgkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOwoJCWJhbmstPmJpdG1hcCB8PSAxIDw8IGlkeDsKCQljaGFubmVsLT5udW0gPSBpZHg7CgkJcmV0dXJuIGNoYW5uZWw7Cgl9CgoJLyogbm8gZnJlZSByZWNvcmRhYmxlIGNoYW5uZWxzIGF2YWxpYWJsZSAqLwojaWYgMCAKCXByaW50ayhLRVJOX0VSUiAiYWxpOiBubyByZWNvcmRhYmxlIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiBCYW5rIEEuXG4iKTsKI2VuZGlmIC8qIDAgKi8gCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgcmF0ZSkKewoJdW5zaWduZWQgY2hhciBjaF9zdF9zZWw7Cgl1bnNpZ25lZCBzaG9ydCBzdGF0dXNfcmF0ZTsKCglzd2l0Y2ggKHJhdGUpIHsKCWNhc2UgNDQxMDA6CgkJc3RhdHVzX3JhdGUgPSAwOwoJCWJyZWFrOwoJY2FzZSAzMjAwMDoKCQlzdGF0dXNfcmF0ZSA9IDB4MzAwOwoJCWJyZWFrOwoJY2FzZSA0ODAwMDoKCWRlZmF1bHQ6CgkJc3RhdHVzX3JhdGUgPSAweDIwMDsKCQlicmVhazsKCX0KCgkvKiBzZWxlY3Qgc3BkaWZfb3V0ICovIAoJY2hfc3Rfc2VsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSkgJiBBTElfU1BESUZfT1VUX0NIX1NUQVRVUzsKCgljaF9zdF9zZWwgfD0gMHg4MDsJLyogc2VsZWN0IHJpZ2h0ICovIAoJb3V0YihjaF9zdF9zZWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CglvdXRiKHN0YXR1c19yYXRlIHwgMHgyMCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMikpOwoKCWNoX3N0X3NlbCAmPSAofjB4ODApOwkvKiBzZWxlY3QgbGVmdCAqLyAKCW91dGIoY2hfc3Rfc2VsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOwoJb3V0dyhzdGF0dXNfcmF0ZSB8IDB4MTAsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDIpKTsKfQoKc3RhdGljIHZvaWQKYWxpX2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCnsKCWludCBpLCBjaGFubmVsOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlOwoJdTMyIG1hc2ssIGNoYW5uZWxfbWFzazsKCgltYXNrID0gdHJpZGVudF9nZXRfaW50ZXJydXB0X21hc2soY2FyZCwgMCk7Cglmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0g7IGkrKykgewoJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pID09IE5VTEwpCgkJCWNvbnRpbnVlOwoJCWNoYW5uZWwgPSBzdGF0ZS0+ZG1hYnVmLmNoYW5uZWwtPm51bTsKCQlpZiAoKGNoYW5uZWxfbWFzayA9IDEgPDwgY2hhbm5lbCkgJiBtYXNrKSB7CgkJCW1hc2sgJj0gfmNoYW5uZWxfbWFzazsKCQkJdHJpZGVudF9hY2tfY2hhbm5lbF9pbnRlcnJ1cHQoY2FyZCwgY2hhbm5lbCk7CgkJCXVkZWxheSgxMDApOwoJCQlzdGF0ZS0+ZG1hYnVmLnVwZGF0ZV9mbGFnIHw9IEFMSV9BRERSRVNTX0lOVF9VUERBVEU7CgkJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CgkJfQoJfQoJaWYgKG1hc2spIHsKCQlmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0g7IGkrKykgewoJCQlpZiAobWFzayAmICgxIDw8IGkpKSB7CgkJCQlwcmludGsoImFsaTogc3B1cmlvdXMgY2hhbm5lbCBpcnEgJWQuXG4iLCBpKTsKCQkJCXRyaWRlbnRfYWNrX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQsIGkpOwoJCQkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIGkpOwoJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBpKTsKCQkJfQoJCX0KCX0KfQoKLyogVXBkYXRpbmcgdGhlIHZhbHVlcyBvZiBjb3VudGVycyBvZiBvdGhlcl9zdGF0ZXMnIERNQXMgd2l0aG91dCBsb2NrIApwcm90ZWN0aW9uIGlzIG5vIGhhcm0gYmVjYXVzZSBhbGwgRE1BcyBvZiBtdWx0aS1jaGFubmVscyBhbmQgaW50ZXJydXB0CmRlcGVuZCBvbiBhIG1hc3RlciBzdGF0ZSdzIERNQSwgYW5kIGNoYW5naW5nIHRoZSBjb3VudGVycyBvZiB0aGUgbWFzdGVyCnN0YXRlIERNQSBpcyBwcm90ZWN0ZWQgYnkgYSBzcGlubG9jay4KKi8Kc3RhdGljIGludAphbGlfd3JpdGVfNV8xKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgCgkgICAgICBpbnQgY250X2Zvcl9tdWx0aV9jaGFubmVsLCB1bnNpZ25lZCBpbnQgKmNvcHlfY291bnQsIAoJICAgICAgdW5zaWduZWQgaW50ICpzdGF0ZV9jbnQpCnsKCglzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKCXN0cnVjdCBkbWFidWYgKmRtYWJ1Zl90ZW1wOwoJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciA9IGJ1ZjsKCXVuc2lnbmVkIHN3cHRyLCBvdGhlcl9kbWFfbnVtcywgc2FtcGxlX3M7Cgl1bnNpZ25lZCBpbnQgaSwgbG9vcDsKCglvdGhlcl9kbWFfbnVtcyA9IDQ7CglzYW1wbGVfcyA9IHNhbXBsZV9zaXplW2RtYWJ1Zi0+Zm10XSA+PiAxOwoJc3dwdHIgPSBkbWFidWYtPnN3cHRyOwoKCWlmICgoaSA9IHN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQpID4gMCkgewoJCWlmIChpID09IDEpIHsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCQkJaS0tOwoJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CgkJCXN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQrKzsKCQl9IGVsc2UKCQkJaSA9IGkgLSAoc3RhdGUtPmNoYW5zX251bSAtIG90aGVyX2RtYV9udW1zKTsKCQlmb3IgKDsgKGkgPCBvdGhlcl9kbWFfbnVtcykgJiYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA+IDApOyBpKyspIHsKCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCgkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCQl9CgkJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA9PSAwKQoJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50ICs9IGk7Cgl9CglpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgewoJCWxvb3AgPSBjbnRfZm9yX211bHRpX2NoYW5uZWwgLyAoc3RhdGUtPmNoYW5zX251bSAqIHNhbXBsZV9zKTsKCQlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7CgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIAoJCQkJCSAgIHNhbXBsZV9zICogMikpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCSAgICBzYW1wbGVfcyAqIDIsICpjb3B5X2NvdW50KTsKCQkJKCpzdGF0ZV9jbnQpICs9IChzYW1wbGVfcyAqIDIpOwoKCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+ZG1hYnVmOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCgkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCgkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbMV0tPmRtYWJ1ZjsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAoJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgoJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWY7CgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOwoKCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+ZG1hYnVmOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCgkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCgkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCQl9CgoJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CgkJCXN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQgPSBjbnRfZm9yX211bHRpX2NoYW5uZWwgLyBzYW1wbGVfczsKCgkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIHNhbXBsZV9zKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlzZWVrX29mZnNldChzd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJCSgqc3RhdGVfY250KSArPSBzYW1wbGVfczsKCgkJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CgkJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgCgkJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKCQkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKCQkJCSgqc3RhdGVfY250KSArPSBzYW1wbGVfczsKCgkJCQlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgewoJCQkJCWludCBkaWZmID0gc3RhdGUtPmNoYW5zX251bSAtIG90aGVyX2RtYV9udW1zOwoJCQkJCWxvb3AgPSBzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50IC0gZGlmZjsKCQkJCQlmb3IgKGkgPSAwOyBpIDwgbG9vcDsgaSsrKSB7CgkJCQkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZjsKCQkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyAKCQkJCQkJCQkgICBkbWFidWZfdGVtcC0+c3dwdHIsIAoJCQkJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQoJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCQkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCAKCQkJCQkJCSAgICBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAoJCQkJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfSBlbHNlCgkJCXN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQgPSAwOwoJfQoJZm9yIChpID0gMDsgaSA8IG90aGVyX2RtYV9udW1zOyBpKyspIHsKCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7CgkJZG1hYnVmX3RlbXAtPnN3cHRyID0gZG1hYnVmX3RlbXAtPnN3cHRyICUgZG1hYnVmX3RlbXAtPmRtYXNpemU7Cgl9CglyZXR1cm4gKnN0YXRlX2NudDsKfQoKc3RhdGljIHZvaWQKYWxpX2ZyZWVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCnsKCWludCBpOwoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOwoJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnM7Cgl1bnNpZ25lZCBvdGhlcl9zdGF0ZXNfY291bnQ7CgoJb3RoZXJfc3RhdGVzX2NvdW50ID0gc3RhdGUtPmNoYW5zX251bSAtIDI7IC8qIGV4Y2VwdCBQQ00gTC9SIGNoYW5uZWxzICovCglmb3IgKGkgPSAwOyBpIDwgb3RoZXJfc3RhdGVzX2NvdW50OyBpKyspIHsKCQlzID0gc3RhdGUtPm90aGVyX3N0YXRlc1tpXTsKCQlkZWFsbG9jX2RtYWJ1Zigmcy0+ZG1hYnVmLCBjYXJkLT5wY2lfZGV2KTsKCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwocy0+Y2FyZCwgcy0+ZG1hYnVmLmNoYW5uZWwtPm51bSk7CgkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwocy0+Y2FyZCwgcy0+ZG1hYnVmLmNoYW5uZWwtPm51bSk7CgkJY2FyZC0+c3RhdGVzW3MtPnZpcnRdID0gTlVMTDsKCQlrZnJlZShzKTsKCX0KfQoKc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcmVzOwoKc3RhdGljIGludAphbGlfd3JpdGVfcHJvYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKewoJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIGRhdGE7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJY2hhciBjOwoKCWlmIChjb3VudCA8IDApCgkJcmV0dXJuIC1FSU5WQUw7CglpZiAoY291bnQgPT0gMCkKCQlyZXR1cm4gMDsKCWlmIChnZXRfdXNlcihjLCBidWZmZXIpKQoJCXJldHVybiAtRUZBVUxUOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cglzd2l0Y2ggKGMpIHsKCWNhc2UgJzAnOgoJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1BDTV9UT19TUERJRl9PVVQpOwoJCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChjYXJkLCBBTElfU1BESUZfT1VUX0NIQU5ORUwpOwoJCWJyZWFrOwoJY2FzZSAnMSc6CgkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfU1BESUZfT1VUX1RPX1NQRElGX09VVCB8IAoJCQkJICAgIEFMSV9TUERJRl9PVVRfUENNKTsKCQlicmVhazsKCWNhc2UgJzInOgoJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1NQRElGX09VVF9UT19TUERJRl9PVVQgfCAKCQkJCSAgICBBTElfU1BESUZfT1VUX05PTl9QQ00pOwoJCWJyZWFrOwoJY2FzZSAnMyc6CgkJYWxpX2Rpc2FibGVfc3BkaWZfaW4oY2FyZCk7CS8vZGVmYXVsdAoJCWJyZWFrOwoJY2FzZSAnNCc6CgkJYWxpX3NldHVwX3NwZGlmX2luKGNhcmQpOwoJCWJyZWFrOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOwoKCXJldHVybiBjb3VudDsKfQoKLyogT1NTIC9kZXYvbWl4ZXIgZmlsZSBvcGVyYXRpb24gbWV0aG9kcyAqLwpzdGF0aWMgaW50CnRyaWRlbnRfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCWludCBpID0gMDsKCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gZGV2czsKCglmb3IgKGNhcmQgPSBkZXZzOyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0KQoJCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCgkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwgJiYgCgkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCgkJCQlnb3RvIG1hdGNoOwoKCWlmICghY2FyZCkgewoJCXJldHVybiAtRU5PREVWOwoJfQogICAgICBtYXRjaDoKCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQtPmFjOTdfY29kZWNbaV07CgoJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOwp9CgpzdGF0aWMgaW50CnRyaWRlbnRfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCAKCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwoKCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKfQoKc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmlkZW50X21peGVyX2ZvcHMgPSB7Cgkub3duZXIgPSBUSElTX01PRFVMRSwKCS5sbHNlZWsgPSBub19sbHNlZWssCgkuaW9jdGwgPSB0cmlkZW50X2lvY3RsX21peGRldiwKCS5vcGVuID0gdHJpZGVudF9vcGVuX21peGRldiwKfTsKCnN0YXRpYyBpbnQKYWxpX3Jlc2V0XzU0NTEoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOwoJdW5zaWduZWQgaW50IGR3VmFsOwoJdW5zaWduZWQgc2hvcnQgd0NvdW50LCB3UmVnOwoKCXBjaV9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLAoJCQkJIHBjaV9kZXYpOwoJaWYgKHBjaV9kZXYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsICZkd1ZhbCk7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsIGR3VmFsIHwgMHgwODAwMDAwMCk7Cgl1ZGVsYXkoNTAwMCk7CglwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgMHg3YywgJmR3VmFsKTsKCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg3YywgZHdWYWwgJiAweGY3ZmZmZmZmKTsKCXVkZWxheSg1MDAwKTsKCXBjaV9kZXZfcHV0KHBjaV9kZXYpOwoKCXBjaV9kZXYgPSBjYXJkLT5wY2lfZGV2OwoJaWYgKHBjaV9kZXYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4NDQsICZkd1ZhbCk7CglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4NDQsIGR3VmFsIHwgMHgwMDBjMDAwMCk7Cgl1ZGVsYXkoNTAwKTsKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCAmZHdWYWwpOwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCBkd1ZhbCAmIDB4ZmZmYmZmZmYpOwoJdWRlbGF5KDUwMDApOwoKCS8qIFRPRE86IHJlY29nbml6ZSBpZiB3ZSBoYXZlIGEgUE0gY2FwYWJsZSBjb2RlYyBhbmQgb25seSBkbyB0aGlzICovCgkvKiBpZiB0aGUgY29kZWMgaXMgUE0gY2FwYWJsZSAqLwoJd0NvdW50ID0gMjAwMDsKCXdoaWxlICh3Q291bnQtLSkgewoJCXdSZWcgPSBhbGlfYWM5N19nZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MKTsKCQlpZiAoKHdSZWcgJiAweDAwMGYpID09IDB4MDAwZikKCQkJcmV0dXJuIDA7CgkJdWRlbGF5KDUwMDApOwoJfQoJLyogVGhpcyBpcyBub24gZmF0YWwgaWYgeW91IGhhdmUgYSBub24gUE0gY2FwYWJsZSBjb2RlYy4uICovCglyZXR1cm4gMDsKfQoKLyogQUM5NyBjb2RlYyBpbml0aWFsaXNhdGlvbi4gKi8Kc3RhdGljIGludCBfX2RldmluaXQKdHJpZGVudF9hYzk3X2luaXQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJaW50IG51bV9hYzk3ID0gMDsKCXVuc2lnbmVkIGxvbmcgcmVhZHlfMm5kID0gMDsKCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYzsKCWludCBpID0gMDsKCgkvKiBpbml0aWFsaXplIGNvbnRyb2xsZXIgc2lkZSBvZiBBQyBsaW5rLCBhbmQgZmluZCBvdXQgaWYgc2Vjb25kYXJ5IGNvZGVzCgkgICByZWFsbHkgZXhpc3QgKi8KCXN3aXRjaCAoY2FyZC0+cGNpX2lkKSB7CgljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CgkJaWYgKGFsaV9yZXNldF81NDUxKGNhcmQpKSB7CgkJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudF9hYzk3X2luaXQ6IGVycm9yICIKCQkJICAgICAgICJyZXNldHRpbmcgNTQ1MS5cbiIpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCW91dGwoMHg4MDAwMDAwMSwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgkJb3V0bCgweDAwMDAwMDAwLCBUUklEX1JFRyhjYXJkLCBUNERfQUlOVEVOX0EpKTsKCQlvdXRsKDB4ZmZmZmZmZmYsIFRSSURfUkVHKGNhcmQsIFQ0RF9BSU5UX0EpKTsKCQlvdXRsKDB4MDAwMDAwMDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NVVNJQ1ZPTF9XQVZFVk9MKSk7CgkJb3V0YigweDEwLCBUUklEX1JFRyhjYXJkLCBBTElfTVBVUjIpKTsKCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CgkJcmVhZHlfMm5kICY9IDB4M2ZmZjsKCQlvdXRsKHJlYWR5XzJuZCB8IFBDTU9VVCB8IDB4ODAwMCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CgkJcmVhZHlfMm5kID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOwoJCXJlYWR5XzJuZCAmPSBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWTsKCQlpZiAoY2FyZC0+cmV2aXNpb24gPCBBTElfNTQ1MV9WMDIpCgkJCXJlYWR5XzJuZCA9IDA7CgkJYnJlYWs7CgljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKCQkvKiBkaXNhYmxlIEFDOTcgR1BJTyBpbnRlcnJ1cHQgKi8KCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOwoJCS8qIHdoZW4gcG93ZXIgdXAgdGhlIEFDIGxpbmsgaXMgaW4gY29sZCByZXNldCBtb2RlIHNvIHN0b3AgaXQgKi8KCQlvdXRsKFBDTU9VVCB8IFNVUlJPVVQgfCBDRU5URVJPVVQgfCBMRkVPVVQgfCBTRUNPTkRBUllfSUQsIAoJCSAgICAgVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwoJCS8qIGl0IHRha2UgYSBsb25nIHRpbWUgdG8gcmVjb3ZlciBmcm9tIGEgY29sZCByZXNldCAqLyAKCQkvKiAoZXNwZWNpYWxseSB3aGVuIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgY29kZWMpICovCgkJdWRlbGF5KDIwMDApOwoJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CgkJcmVhZHlfMm5kICY9IFNJX0FDOTdfU0VDT05EQVJZX1JFQURZOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgoJCS8qIHBsYXliYWNrIG9uICovCgkJb3V0bChEWF9BQzk3X1BMQVlCQUNLLCBUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKCQlicmVhazsKCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKCQkvKiBlbmFibGUgQUM5NyBPdXRwdXQgU2xvdCAzLDQgKFBDTSBMZWZ0L1JpZ2h0IFBsYXliYWNrKSAqLwoJCW91dGwoTlhfQUM5N19QQ01fT1VUUFVULCBUUklEX1JFRyhjYXJkLCBOWF9BQ1IwX0FDOTdfQ09NX1NUQVQpKTsKCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSk7CgkJcmVhZHlfMm5kICY9IE5YX0FDOTdfU0VDT05EQVJZX1JFQURZOwoJCWJyZWFrOwoJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgoJCS8qIGRpc2FibGUgQUM5NyBHUElPIGludGVycnVwdCAqLwoJCW91dGwoMHgwMCwgVFJJRF9SRUcoY2FyZCwgU0lfQUM5N19HUElPKSk7CgkJLyogd2hlbiBwb3dlciB1cCwgdGhlIEFDIGxpbmsgaXMgaW4gY29sZCByZXNldCBtb2RlLCBzbyBzdG9wIGl0ICovCgkJb3V0bChQQ01PVVQgfCBTVVJST1VUIHwgQ0VOVEVST1VUIHwgTEZFT1VULCAKCQkgICAgIFRSSURfUkVHKGNhcmQsIFNJX1NFUklBTF9JTlRGX0NUUkwpKTsKCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKGVzcGVjaWFsbHkgKi8gCgkJLyogd2hlbiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIGNvZGVjKSAqLwoJCXVkZWxheSgyMDAwKTsKCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOwoJCXJlYWR5XzJuZCAmPSBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWTsKCQlicmVhazsKCX0KCglmb3IgKG51bV9hYzk3ID0gMDsgbnVtX2FjOTcgPCBOUl9BQzk3OyBudW1fYWM5NysrKSB7CgkJaWYgKChjb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkKCQkJcmV0dXJuIC1FTk9NRU07CgoJCS8qIGluaXRpYWxpemUgc29tZSBiYXNpYyBjb2RlYyBpbmZvcm1hdGlvbiwgb3RoZXIgZmllbGRzICovIAoJCS8qIHdpbGwgYmUgZmlsbGVkIGluIGFjOTdfcHJvYmVfY29kZWMgKi8KCQljb2RlYy0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKCQljb2RlYy0+aWQgPSBudW1fYWM5NzsKCgkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJCWNvZGVjLT5jb2RlY19yZWFkID0gYWxpX2FjOTdfcmVhZDsKCQkJY29kZWMtPmNvZGVjX3dyaXRlID0gYWxpX2FjOTdfd3JpdGU7CgkJfSBlbHNlIHsKCQkJY29kZWMtPmNvZGVjX3JlYWQgPSB0cmlkZW50X2FjOTdfZ2V0OwoJCQljb2RlYy0+Y29kZWNfd3JpdGUgPSB0cmlkZW50X2FjOTdfc2V0OwoJCX0KCgkJaWYgKGFjOTdfcHJvYmVfY29kZWMoY29kZWMpID09IDApCgkJCWJyZWFrOwoKCQljb2RlYy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJnRyaWRlbnRfbWl4ZXJfZm9wcywgLTEpOwoJCWlmIChjb2RlYy0+ZGV2X21peGVyIDwgMCkgewoJCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IGNvdWxkbid0IHJlZ2lzdGVyIG1peGVyIVxuIik7CgkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CgkJCWJyZWFrOwoJCX0KCgkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBjb2RlYzsKCgkJLyogaWYgdGhlcmUgaXMgbm8gc2Vjb25kYXJ5IGNvZGVjIGF0IGFsbCwgZG9uJ3QgcHJvYmUgYW55IG1vcmUgKi8KCQlpZiAoIXJlYWR5XzJuZCkKCQkJYnJlYWs7Cgl9CgoJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CgkJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgewoJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPT0gTlVMTCkKCQkJCWJyZWFrOwoJCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewoJCQkJdTE2IHJlZyA9IGFsaV9hYzk3X2dldChjYXJkLCBudW1fYWM5NywgaSAqIDIpOwoJCQkJY2FyZC0+bWl4ZXJfcmVnc1tpXVtudW1fYWM5N10gPSByZWc7CgkJCX0KCQl9Cgl9CglyZXR1cm4gbnVtX2FjOTcgKyAxOwp9CgojaWZkZWYgU1VQUE9SVF9KT1lTVElDSwovKiBHYW1lcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBjYXJkcyBBREMgZ2FtZXBvcnQgKi8KCnN0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaWRlbnRfZ2FtZV9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBnYW1lcG9ydC0+cG9ydF9kYXRhOwoKCXJldHVybiBpbmIoVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfTEVHKSk7Cn0KCnN0YXRpYyB2b2lkIHRyaWRlbnRfZ2FtZV90cmlnZ2VyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBnYW1lcG9ydC0+cG9ydF9kYXRhOwoKCW91dGIoMHhmZiwgVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfTEVHKSk7Cn0KCnN0YXRpYyBpbnQgdHJpZGVudF9nYW1lX2Nvb2tlZF9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsCgkJCQkgICAgaW50ICpheGVzLCBpbnQgKmJ1dHRvbnMpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBnYW1lcG9ydC0+cG9ydF9kYXRhOwoJaW50IGk7CgoJKmJ1dHRvbnMgPSAofmluYihUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9MRUcpKSA+PiA0KSAmIDB4ZjsKCglmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CgkJYXhlc1tpXSA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9BWEQpICsgaSAqIHNpemVvZiAodTE2KSk7CgkJaWYgKGF4ZXNbaV0gPT0gMHhmZmZmKQoJCQlheGVzW2ldID0gLTE7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgdHJpZGVudF9nYW1lX29wZW4oc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50IG1vZGUpCnsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBnYW1lcG9ydC0+cG9ydF9kYXRhOwoKCXN3aXRjaCAobW9kZSkgewoJY2FzZSBHQU1FUE9SVF9NT0RFX0NPT0tFRDoKCQlvdXRiKDB4ODAsIFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0NSKSk7CgkJbXNsZWVwKDIwKTsKCQlyZXR1cm4gMDsKCWNhc2UgR0FNRVBPUlRfTU9ERV9SQVc6CgkJb3V0YigweDAwLCBUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9DUikpOwoJCXJldHVybiAwOwoJZGVmYXVsdDoKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgX19kZXZpbml0IHRyaWRlbnRfcmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKewoJc3RydWN0IGdhbWVwb3J0ICpncDsKCgljYXJkLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOwoJaWYgKCFncCkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogY2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGdhbWVwb3J0XG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCglnYW1lcG9ydF9zZXRfbmFtZShncCwgIlRyaWRlbnQgNERXYXZlIik7CglnYW1lcG9ydF9zZXRfcGh5cyhncCwgInBjaSVzL2dhbWVwb3J0MCIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKCWdwLT5yZWFkID0gdHJpZGVudF9nYW1lX3JlYWQ7CglncC0+dHJpZ2dlciA9IHRyaWRlbnRfZ2FtZV90cmlnZ2VyOwoJZ3AtPmNvb2tlZF9yZWFkID0gdHJpZGVudF9nYW1lX2Nvb2tlZF9yZWFkOwoJZ3AtPm9wZW4gPSB0cmlkZW50X2dhbWVfb3BlbjsKCWdwLT5mdXp6ID0gNjQ7CglncC0+cG9ydF9kYXRhID0gY2FyZDsKCglnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGlubGluZSB2b2lkIHRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQp7CglpZiAoY2FyZC0+Z2FtZXBvcnQpCgkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KGNhcmQtPmdhbWVwb3J0KTsKfQoKI2Vsc2UKc3RhdGljIGlubGluZSBpbnQgdHJpZGVudF9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKSB7IHJldHVybiAtRU5PU1lTOyB9CnN0YXRpYyBpbmxpbmUgdm9pZCB0cmlkZW50X3VucmVnaXN0ZXJfZ2FtZXBvcnQoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkgeyB9CiNlbmRpZiAvKiBTVVBQT1JUX0pPWVNUSUNLICovCgovKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyICovIAovKiBub3csIHRoZXkgYXJlIGRlZmVyZWQgdW50aWwgIkFDQ0VTUyIgdGltZSAoaW4gcHJvZ19kbWFidWYgY2FsbGVkIGJ5ICovIAovKiBvcGVuL3JlYWQvd3JpdGUvaW9jdGwvbW1hcCkgKi8Kc3RhdGljIGludCBfX2RldmluaXQKdHJpZGVudF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKewoJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CglzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkOwoJdTggYml0czsKCXU4IHJldmlzaW9uOwoJaW50IGkgPSAwOwoJdTE2IHRlbXA7CglzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9tMTUzMyA9IE5VTEw7CglpbnQgcmMgPSAtRU5PREVWOwoJdTY0IGRtYV9tYXNrOwoKCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKCQlnb3RvIG91dDsKCglpZiAocGNpX2Rldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpCgkJZG1hX21hc2sgPSBBTElfRE1BX01BU0s7CgllbHNlCgkJZG1hX21hc2sgPSBUUklERU5UX0RNQV9NQVNLOwoJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgZG1hX21hc2spKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCIgCgkJICAgICAgICIgJXMgUENJIGJ1c21hc3RlciBETUFcbiIsIAoJCSAgICAgICBwY2lfZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSA/IAoJCSAgICAgICAiMzItYml0IiA6ICIzMC1iaXQiKTsKCQlnb3RvIG91dDsKCX0KCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldmlzaW9uKTsKCglpZiAocGNpX2lkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkKCQlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMSk7CgllbHNlCgkJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsIDApOwoKCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCAyNTYsIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0pKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjYW4ndCBhbGxvY2F0ZSBJL08gc3BhY2UgYXQgIgoJCSAgICAgICAiMHglNC40bHhcbiIsIGlvYmFzZSk7CgkJZ290byBvdXQ7Cgl9CgoJcmMgPSAtRU5PTUVNOwoJaWYgKChjYXJkID0ga21hbGxvYyhzaXplb2YoKmNhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewoJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogb3V0IG9mIG1lbW9yeVxuIik7CgkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247Cgl9CgltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mICgqY2FyZCkpOwoKCWluaXRfdGltZXIoJmNhcmQtPnRpbWVyKTsKCWNhcmQtPmlvYmFzZSA9IGlvYmFzZTsKCWNhcmQtPnBjaV9kZXYgPSBwY2lfZGV2X2dldChwY2lfZGV2KTsKCWNhcmQtPnBjaV9pZCA9IHBjaV9pZC0+ZGV2aWNlOwoJY2FyZC0+cmV2aXNpb24gPSByZXZpc2lvbjsKCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKCWNhcmQtPm5leHQgPSBkZXZzOwoJY2FyZC0+bWFnaWMgPSBUUklERU5UX0NBUkRfTUFHSUM7CgljYXJkLT5iYW5rc1tCQU5LX0FdLmFkZHJlc3NlcyA9ICZiYW5rX2FfYWRkcnM7CgljYXJkLT5iYW5rc1tCQU5LX0FdLmJpdG1hcCA9IDBVTDsKCWNhcmQtPmJhbmtzW0JBTktfQl0uYWRkcmVzc2VzID0gJmJhbmtfYl9hZGRyczsKCWNhcmQtPmJhbmtzW0JBTktfQl0uYml0bWFwID0gMFVMOwoKCW11dGV4X2luaXQoJmNhcmQtPm9wZW5fbXV0ZXgpOwoJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOwoJaW5pdF90aW1lcigmY2FyZC0+dGltZXIpOwoKCWRldnMgPSBjYXJkOwoKCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOwoKCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6ICVzIGZvdW5kIGF0IElPIDB4JTA0bHgsIElSUSAlZFxuIiwgCgkgICAgICAgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZC0+aW9iYXNlLCBjYXJkLT5pcnEpOwoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCS8qIEFMaSBjaGFubmVsIE1hbmFnZW1lbnQgKi8KCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGFsaV9hbGxvY19wY21fY2hhbm5lbDsKCQljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBhbGlfYWxsb2NfcmVjX3BjbV9jaGFubmVsOwoJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBhbGlfZnJlZV9wY21fY2hhbm5lbDsKCgkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQgPSBhbGlfYWRkcmVzc19pbnRlcnJ1cHQ7CgoJCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSBmb3Igc3BkaWYgaW4gKi8KCQljYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA9IDA7CgkJY2FyZC0+cmVjX2NoYW5uZWxfdXNlX2NvdW50ID0gMDsKCgkJLyogQUxpIFNQRElGIE9VVCBmdW5jdGlvbiAqLwoJCWlmIChjYXJkLT5yZXZpc2lvbiA9PSBBTElfNTQ1MV9WMDIpIHsKCQkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfUENNX1RPX1NQRElGX09VVCk7CgkJCXJlcyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJBTGk1NDUxIiwgMCwgTlVMTCk7CgkJCWlmIChyZXMpIHsKCQkJCXJlcy0+d3JpdGVfcHJvYyA9IGFsaV93cml0ZV9wcm9jOwoJCQkJcmVzLT5kYXRhID0gY2FyZDsKCQkJfQoJCX0KCgkJLyogQWRkIEgvVyBWb2x1bWUgQ29udHJvbCBCeSBNYXR0IFd1IEp1bC4gMDYsIDIwMDEgKi8KCQljYXJkLT5od3ZvbGN0bCA9IDA7CgkJcGNpX2Rldl9tMTUzMyA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCAKCQkJCQkJUENJX0RFVklDRV9JRF9BTF9NMTUzMywgCgkJCQkJCXBjaV9kZXZfbTE1MzMpOwoJCXJjID0gLUVOT0RFVjsKCQlpZiAocGNpX2Rldl9tMTUzMyA9PSBOVUxMKQoJCQlnb3RvIG91dF9wcm9jX2ZzOwoJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXZfbTE1MzMsIDB4NjMsICZiaXRzKTsKCQlpZiAoYml0cyAmICgxIDw8IDUpKQoJCQljYXJkLT5od3ZvbGN0bCA9IDE7CgkJaWYgKGNhcmQtPmh3dm9sY3RsKSB7CgkJCS8qIENsZWFyIG0xNTMzIHBjaSBjZmcgNzhoIGJpdCAzMCB0byB6ZXJvLCB3aGljaCBtYWtlcwoJCQkgICBHUElPMTEvMTIvMTMgd29yayBhcyBBQ0dQX1VQL0RPV04vTVVURS4gKi8KCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2Rldl9tMTUzMywgMHg3YiwgJmJpdHMpOwoJCQliaXRzICY9IDB4YmY7CS8qY2xlYXIgYml0IDYgKi8KCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXZfbTE1MzMsIDB4N2IsIGJpdHMpOwoJCX0KCX0gZWxzZSBpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApIHsKCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGN5YmVyX2FsbG9jX3BjbV9jaGFubmVsOwoJCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IGN5YmVyX2FsbG9jX3BjbV9jaGFubmVsOwoJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBjeWJlcl9mcmVlX3BjbV9jaGFubmVsOwoJCWNhcmQtPmFkZHJlc3NfaW50ZXJydXB0ID0gY3liZXJfYWRkcmVzc19pbnRlcnJ1cHQ7CgkJY3liZXJfaW5pdF9yaXR1YWwoY2FyZCk7Cgl9IGVsc2UgewoJCWNhcmQtPmFsbG9jX3BjbV9jaGFubmVsID0gdHJpZGVudF9hbGxvY19wY21fY2hhbm5lbDsKCQljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSB0cmlkZW50X2FsbG9jX3BjbV9jaGFubmVsOwoJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSB0cmlkZW50X2ZyZWVfcGNtX2NoYW5uZWw7CgkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQgPSB0cmlkZW50X2FkZHJlc3NfaW50ZXJydXB0OwoJfQoKCS8qIGNsYWltIG91ciBpcnEgKi8KCXJjID0gLUVOT0RFVjsKCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZ0cmlkZW50X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCgkJCWNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQpKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkXG4iLCAKCQkgICAgICAgY2FyZC0+aXJxKTsKCQlnb3RvIG91dF9wcm9jX2ZzOwoJfQoJLyogcmVnaXN0ZXIgL2Rldi9kc3AgKi8KCWlmICgoY2FyZC0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZ0cmlkZW50X2F1ZGlvX2ZvcHMsIC0xKSkgPCAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjb3VsZG4ndCByZWdpc3RlciBEU1AgZGV2aWNlIVxuIik7CgkJZ290byBvdXRfZnJlZV9pcnE7Cgl9CgljYXJkLT5taXhlcl9yZWdzX3JlYWR5ID0gMDsKCS8qIGluaXRpYWxpemUgQUM5NyBjb2RlYyBhbmQgcmVnaXN0ZXIgL2Rldi9taXhlciAqLwoJaWYgKHRyaWRlbnRfYWM5N19pbml0KGNhcmQpIDw9IDApIHsKCQkvKiB1bnJlZ2lzdGVyIGF1ZGlvIGRldmljZXMgKi8KCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKSB7CgkJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKCQkJCXN0cnVjdCBhYzk3X2NvZGVjKiBjb2RlYyA9IGNhcmQtPmFjOTdfY29kZWNbaV07CgkJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNvZGVjLT5kZXZfbWl4ZXIpOwoJCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKCQkJfQoJCX0KCQlnb3RvIG91dF91bnJlZ2lzdGVyX3NvdW5kX2RzcDsKCX0KCWNhcmQtPm1peGVyX3JlZ3NfcmVhZHkgPSAxOwoJb3V0bCgweDAwLCBUUklEX1JFRyhjYXJkLCBUNERfTVVTSUNWT0xfV0FWRVZPTCkpOwoKCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgewoJCS8qIEFkZCBIL1cgVm9sdW1lIENvbnRyb2wgQnkgTWF0dCBXdSBKdWwuIDA2LCAyMDAxICovCgkJaWYgKGNhcmQtPmh3dm9sY3RsKSB7CgkJCS8qIEVuYWJsZSBHUElPIElSUSAoTUlTQ0lOVCBiaXQgMThoKSAqLwoJCQl0ZW1wID0gaW53KFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOwoJCQl0ZW1wIHw9IDB4MDAwNDsKCQkJb3V0dyh0ZW1wLCBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCArIDIpKTsKCgkJCS8qIEVuYWJsZSBIL1cgVm9sdW1lIENvbnRyb2wgR0xPVkFMIENPTlRST0wgYml0IDAgKi8KCQkJdGVtcCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKCQkJdGVtcCB8PSAweDAwMDE7CgkJCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CgoJCX0KCQlpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKQoJCQlhbGlfY2xvc2VfbXVsdGlfY2hhbm5lbHMoKTsKCQkvKiBlZGl0ZWQgYnkgSE1TRU8gZm9yIEdUIHNvdW5kICovCiNpZiBkZWZpbmVkKENPTkZJR19BTFBIQV9OQVVUSUxVUykgfHwgZGVmaW5lZChDT05GSUdfQUxQSEFfR0VORVJJQykKCQl7CgkJCXUxNiBhYzk3X2RhdGE7CgkJCWV4dGVybiBzdHJ1Y3QgaHdycGJfc3RydWN0ICpod3JwYjsKCgkJCWlmICgoaHdycGItPnN5c190eXBlKSA9PSAyMDEpIHsKCQkJCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6IFJ1bm5pbmcgb24gQWxwaGEgc3lzdGVtICIKCQkJCSAgICAgICAidHlwZSBOYXV0aWx1c1xuIik7CgkJCQlhYzk3X2RhdGEgPSBhbGlfYWM5N19nZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MKTsKCQkJCWFsaV9hYzk3X3NldChjYXJkLCAwLCBBQzk3X1BPV0VSX0NPTlRST0wsIAoJCQkJCSAgICAgYWM5N19kYXRhIHwgQUxJX0VBUERfUE9XRVJfRE9XTik7CgkJCX0KCQl9CiNlbmRpZgkJCQkvKiBDT05GSUdfQUxQSEFfTkFVVElMVVMgfHwgQ09ORklHX0FMUEhBX0dFTkVSSUMgKi8KCQkvKiBlZGl0ZWQgYnkgSE1TRU8gZm9yIEdUIHNvdW5kICovCgl9CglyYyA9IDA7CglwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgY2FyZCk7CgoJLyogRW5hYmxlIEFkZHJlc3MgRW5naW5lIEludGVycnVwdHMgKi8KCXRyaWRlbnRfZW5hYmxlX2xvb3BfaW50ZXJydXB0cyhjYXJkKTsKCgkvKiBSZWdpc3RlciBnYW1lcG9ydCAqLwoJdHJpZGVudF9yZWdpc3Rlcl9nYW1lcG9ydChjYXJkKTsKCm91dDoKCXJldHVybiByYzsKCm91dF91bnJlZ2lzdGVyX3NvdW5kX2RzcDoKCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7Cm91dF9mcmVlX2lycToKCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Cm91dF9wcm9jX2ZzOgoJcGNpX2Rldl9wdXQoY2FyZC0+cGNpX2Rldik7CglpZiAocmVzKSB7CgkJcmVtb3ZlX3Byb2NfZW50cnkoIkFMaTU0NTEiLCBOVUxMKTsKCQlyZXMgPSBOVUxMOwoJfQoJa2ZyZWUoY2FyZCk7CglkZXZzID0gTlVMTDsKb3V0X3JlbGVhc2VfcmVnaW9uOgoJcmVsZWFzZV9yZWdpb24oaW9iYXNlLCAyNTYpOwoJcmV0dXJuIHJjOyAKfQoKc3RhdGljIHZvaWQgX19kZXZleGl0CnRyaWRlbnRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQp7CglpbnQgaTsKCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CgoJLyoKCSAqICAgICAgS2lsbCBydW5uaW5nIHRpbWVycyBiZWZvcmUgdW5sb2FkLiBXZSBjYW4ndCBoYXZlIHRoZW0KCSAqICAgICAgZ29pbmcgb2ZmIGFmdGVyIHJtbW9kIQoJICovCglpZiAoY2FyZC0+aHd2b2xjdGwpCgkJZGVsX3RpbWVyX3N5bmMoJmNhcmQtPnRpbWVyKTsKCgkvKiBBTGkgUy9QRElGIGFuZCBQb3dlciBNYW5hZ2VtZW50ICovCglpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9QQ01fVE9fU1BESUZfT1VUKTsKCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwoY2FyZCwgQUxJX1NQRElGX09VVF9DSEFOTkVMKTsKCQlhbGlfZGlzYWJsZV9zcGRpZl9pbihjYXJkKTsKCQlyZW1vdmVfcHJvY19lbnRyeSgiQUxpNTQ1MSIsIE5VTEwpOwoJfQoKCS8qIFVucmVnaXN0ZXIgZ2FtZXBvcnQgKi8KCXRyaWRlbnRfdW5yZWdpc3Rlcl9nYW1lcG9ydChjYXJkKTsKCgkvKiBLaWxsIGludGVycnVwdHMsIGFuZCBTUC9ESUYgKi8KCXRyaWRlbnRfZGlzYWJsZV9sb29wX2ludGVycnVwdHMoY2FyZCk7CgoJLyogZnJlZSBoYXJkd2FyZSByZXNvdXJjZXMgKi8KCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CglyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIDI1Nik7CgoJLyogdW5yZWdpc3RlciBhdWRpbyBkZXZpY2VzICovCglmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQoJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIpOwoJCQlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5N19jb2RlY1tpXSk7CgkJfQoJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKCglwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CglwY2lfZGV2X3B1dChjYXJkLT5wY2lfZGV2KTsKCWtmcmVlKGNhcmQpOwp9CgpNT0RVTEVfQVVUSE9SKCJBbGFuIENveCwgQWFyb24gSG9sdHptYW4sIE9sbGllIExobywgQ2hpbmcgTGluZyBMZWUsIE11bGkgQmVuLVllaHVkYSIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIlRyaWRlbnQgNERXYXZlL1NpUyA3MDE4L0FMaSA1NDUxIGFuZCBUdmlhL0lHU1QgQ3liZXJQcm81MDUwIFBDSSAiCgkJICAgIkF1ZGlvIERyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgojZGVmaW5lIFRSSURFTlRfTU9EVUxFX05BTUUgInRyaWRlbnQiCgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdHJpZGVudF9wY2lfZHJpdmVyID0gewoJLm5hbWUgPSBUUklERU5UX01PRFVMRV9OQU1FLAoJLmlkX3RhYmxlID0gdHJpZGVudF9wY2lfdGJsLAoJLnByb2JlID0gdHJpZGVudF9wcm9iZSwKCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cmlkZW50X3JlbW92ZSksCiNpZmRlZiBDT05GSUdfUE0KCS5zdXNwZW5kID0gdHJpZGVudF9zdXNwZW5kLAoJLnJlc3VtZSA9IHRyaWRlbnRfcmVzdW1lCiNlbmRpZgp9OwoKc3RhdGljIGludCBfX2luaXQKdHJpZGVudF9pbml0X21vZHVsZSh2b2lkKQp7CglwcmludGsoS0VSTl9JTkZPICJUcmlkZW50IDREV2F2ZS9TaVMgNzAxOC9BTGkgNTQ1MSxUdmlhIEN5YmVyUHJvICIgCgkgICAgICAgIjUwNTAgUENJIEF1ZGlvLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIgCgkgICAgICAgX19EQVRFX18gIlxuIik7CgoJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRyaWRlbnRfcGNpX2RyaXZlcik7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdAp0cmlkZW50X2NsZWFudXBfbW9kdWxlKHZvaWQpCnsKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdHJpZGVudF9wY2lfZHJpdmVyKTsKfQoKbW9kdWxlX2luaXQodHJpZGVudF9pbml0X21vZHVsZSk7Cm1vZHVsZV9leGl0KHRyaWRlbnRfY2xlYW51cF9tb2R1bGUpOwo=