ZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwppbmRleCA5ZjZlMDE5Li5hMjljMTIzIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggYTk4OTNlYy4uZGI3ODMwMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTE4Miw2ICsxODIsNyBAQAogCiBjb25maWcgSVBfTkZfSVBUQUJMRVMKIAl0cmlzdGF0ZSAiSVAgdGFibGVzIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBmaWx0ZXJpbmcvbWFzcS9OQVQpIgorCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAloZWxwCiAJICBpcHRhYmxlcyBpcyBhIGdlbmVyYWwsIGV4dGVuc2libGUgcGFja2V0IGlkZW50aWZpY2F0aW9uIGZyYW1ld29yay4KIAkgIFRoZSBwYWNrZXQgZmlsdGVyaW5nIGFuZCBmdWxsIE5BVCAobWFzcXVlcmFkaW5nLCBwb3J0IGZvcndhcmRpbmcsCkBAIC0xOTEsMTYgKzE5Miw2IEBACiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAogIyBUaGUgbWF0Y2hlcy4KLWNvbmZpZyBJUF9ORl9NQVRDSF9MSU1JVAotCXRyaXN0YXRlICJsaW1pdCBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBsaW1pdCBtYXRjaGluZyBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIHJhdGUgYXQgd2hpY2ggYSBydWxlIGNhbiBiZQotCSAgbWF0Y2hlZDogbWFpbmx5IHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBMT0cgdGFyZ2V0ICgiTE9HCi0JICB0YXJnZXQgc3VwcG9ydCIsIGJlbG93KSBhbmQgdG8gYXZvaWQgc29tZSBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2tzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQX05GX01BVENIX0lQUkFOR0UKIAl0cmlzdGF0ZSAiSVAgcmFuZ2UgbWF0Y2ggc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCkBAIC0yMTAsMzcgKzIwMSw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfTkZfTUFUQ0hfTUFDCi0JdHJpc3RhdGUgIk1BQyBhZGRyZXNzIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIE1BQyBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIHNvdXJjZQotCSAgRXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgcGFja2V0LgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX1BLVFRZUEUKLQl0cmlzdGF0ZSAiUGFja2V0IHR5cGUgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgUGFja2V0IHR5cGUgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBhIHBhY2tldCBieQotCSAgaXRzICJjbGFzcyIsIGVnLiBCUk9BRENBU1QsIE1VTFRJQ0FTVCwgLi4uCi0KLQkgIFR5cGljYWwgdXNhZ2U6Ci0JICBpcHRhYmxlcyAtQSBJTlBVVCAtbSBwa3R0eXBlIC0tcGt0LXR5cGUgYnJvYWRjYXN0IC1qIExPRwotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX01BUksKLQl0cmlzdGF0ZSAibmV0ZmlsdGVyIE1BUksgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgTmV0ZmlsdGVyIG1hcmsgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZQotCSAgYG5mbWFyaycgdmFsdWUgaW4gdGhlIHBhY2tldC4gIFRoaXMgY2FuIGJlIHNldCBieSB0aGUgTUFSSyB0YXJnZXQKLQkgIChzZWUgYmVsb3cpLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQX05GX01BVENIX01VTFRJUE9SVAogCXRyaXN0YXRlICJNdWx0aXBsZSBwb3J0IG1hdGNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtMzAxLDE1ICsyNjEsNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX01BVENIX0xFTkdUSAotCXRyaXN0YXRlICJMRU5HVEggbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIGEgcGFja2V0IGFnYWluc3QgYQotCSAgc3BlY2lmaWMgdmFsdWUgb3IgcmFuZ2Ugb2YgdmFsdWVzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQX05GX01BVENIX1RUTAogCXRyaXN0YXRlICJUVEwgbWF0Y2ggc3VwcG9ydCIKIAlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCkBAIC0zMTksNTAgKzI3MCw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVBfTkZfTUFUQ0hfVENQTVNTCi0JdHJpc3RhdGUgInRjcG1zcyBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhZGRzIGEgYHRjcG1zcycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gZXhhbWluZSB0aGUKLQkgIE1TUyB2YWx1ZSBvZiBUQ1AgU1lOIHBhY2tldHMsIHdoaWNoIGNvbnRyb2wgdGhlIG1heGltdW0gcGFja2V0IHNpemUKLQkgIGZvciB0aGF0IGNvbm5lY3Rpb24uCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCi1jb25maWcgSVBfTkZfTUFUQ0hfSEVMUEVSCi0JdHJpc3RhdGUgIkhlbHBlciBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0tfSVBWNAotCWhlbHAKLQkgIEhlbHBlciBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgaW4gZHluYW1pYyBjb25uZWN0aW9ucwotCSAgdHJhY2tlZCBieSBhIGNvbm50cmFjay1oZWxwZXIsIGllLiBpcF9jb25udHJhY2tfZnRwCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBZLgotCi1jb25maWcgSVBfTkZfTUFUQ0hfU1RBVEUKLQl0cmlzdGF0ZSAiQ29ubmVjdGlvbiBzdGF0ZSBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0tfSVBWNAotCWhlbHAKLQkgIENvbm5lY3Rpb24gc3RhdGUgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZWlyCi0JICByZWxhdGlvbnNoaXAgdG8gYSB0cmFja2VkIGNvbm5lY3Rpb24gKGllLiBwcmV2aW91cyBwYWNrZXRzKS4gIFRoaXMKLQkgIGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgcGFja2V0IGNsYXNzaWZpY2F0aW9uLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX01BVENIX0NPTk5UUkFDSwotCXRyaXN0YXRlICJDb25uZWN0aW9uIHRyYWNraW5nIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDS19JUFY0Ci0JaGVscAotCSAgVGhpcyBpcyBhIGdlbmVyYWwgY29ubnRyYWNrIG1hdGNoIG1vZHVsZSwgYSBzdXBlcnNldCBvZiB0aGUgc3RhdGUgbWF0Y2guCi0KLQkgIEl0IGFsbG93cyBtYXRjaGluZyBvbiBhZGRpdGlvbmFsIGNvbm50cmFjayBpbmZvcm1hdGlvbiwgd2hpY2ggaXMKLQkgIHVzZWZ1bCBpbiBjb21wbGV4IGNvbmZpZ3VyYXRpb25zLCBzdWNoIGFzIE5BVCBnYXRld2F5cyB3aXRoIG11bHRpcGxlCi0JICBpbnRlcm5ldCBsaW5rcyBvciB0dW5uZWxzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQX05GX01BVENIX09XTkVSCiAJdHJpc3RhdGUgIk93bmVyIG1hdGNoIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtMzcyLDE1ICsyNzksNiBAQAogCiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAotY29uZmlnIElQX05GX01BVENIX1BIWVNERVYKLQl0cmlzdGF0ZSAiUGh5c2RldiBtYXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMgJiYgQlJJREdFX05FVEZJTFRFUgotCWhlbHAKLQkgIFBoeXNkZXYgcGFja2V0IG1hdGNoaW5nIG1hdGNoZXMgYWdhaW5zdCB0aGUgcGh5c2ljYWwgYnJpZGdlIHBvcnRzCi0JICB0aGUgSVAgcGFja2V0IGFycml2ZWQgb24gb3Igd2lsbCBsZWF2ZSBieS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9NQVRDSF9BRERSVFlQRQogCXRyaXN0YXRlICAnYWRkcmVzcyB0eXBlIG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtMzkxLDc1ICsyODksNiBAQAogCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCiAKLWNvbmZpZyBJUF9ORl9NQVRDSF9SRUFMTQotCXRyaXN0YXRlICAncmVhbG0gbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0Jc2VsZWN0IE5FVF9DTFNfUk9VVEUKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhZGRzIGEgYHJlYWxtJyBtYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byB1c2UgdGhlIHJlYWxtCi0JICBrZXkgZnJvbSB0aGUgcm91dGluZyBzdWJzeXN0ZW0gaW5zaWRlIGlwdGFibGVzLgotCQotCSAgVGhpcyBtYXRjaCBwcmV0dHkgbXVjaCByZXNlbWJsZXMgdGhlIENPTkZJR19ORVRfQ0xTX1JPVVRFNCBvcHRpb24gCi0JICBpbiB0YyB3b3JsZC4KLQkKLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgotCi1jb25maWcgSVBfTkZfTUFUQ0hfU0NUUAotCXRyaXN0YXRlICAnU0NUUCBwcm90b2NvbCBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBXaXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQsIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBpcHRhYmxlcwotCSAgYHNjdHAnIG1hdGNoIGluIG9yZGVyIHRvIG1hdGNoIG9uIFNDVFAgc291cmNlL2Rlc3RpbmF0aW9uIHBvcnRzCi0JICBhbmQgU0NUUCBjaHVuayB0eXBlcy4KLQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9EQ0NQCi0JdHJpc3RhdGUgICdEQ0NQIHByb3RvY29sIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIFdpdGggdGhpcyBvcHRpb24gZW5hYmxlZCwgeW91IHdpbGwgYmUgYWJsZSB0byB1c2UgdGhlIGlwdGFibGVzCi0JICBgZGNjcCcgbWF0Y2ggaW4gb3JkZXIgdG8gbWF0Y2ggb24gRENDUCBzb3VyY2UvZGVzdGluYXRpb24gcG9ydHMKLQkgIGFuZCBEQ0NQIGZsYWdzLgotCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KLQotY29uZmlnIElQX05GX01BVENIX0NPTU1FTlQKLQl0cmlzdGF0ZSAgJ2NvbW1lbnQgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb21tZW50JyBkdW1teS1tYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBwdXQKLQkgIGNvbW1lbnRzIGluIHlvdXIgaXB0YWJsZXMgcnVsZXNldC4KLQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9DT05OTUFSSwotCXRyaXN0YXRlICAnQ29ubmVjdGlvbiBtYXJrIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwotCWRlcGVuZHMgb24gKElQX05GX0NPTk5UUkFDSyAmJiBJUF9ORl9DT05OVFJBQ0tfTUFSSykgfHwgKE5GX0NPTk5UUkFDS19NQVJLICYmIE5GX0NPTk5UUkFDS19JUFY0KQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgY29ubm1hcmsnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQotCSAgY29ubmVjdGlvbiBtYXJrIHZhbHVlIHByZXZpb3VzbHkgc2V0IGZvciB0aGUgc2Vzc2lvbiBieSBgQ09OTk1BUksnLiAKLQkKLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAotCSAgaXB0X2Nvbm5tYXJrLm8uICBJZiB1bnN1cmUsIHNheSBgTicuCi0KLWNvbmZpZyBJUF9ORl9NQVRDSF9DT05OQllURVMKLQl0cmlzdGF0ZSAgJ0Nvbm5lY3Rpb24gYnl0ZS9wYWNrZXQgY291bnRlciBtYXRjaCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQlkZXBlbmRzIG9uIChJUF9ORl9DT05OVFJBQ0sgJiYgSVBfTkZfQ1RfQUNDVCkgfHwgKE5GX0NUX0FDQ1QgJiYgTkZfQ09OTlRSQUNLX0lQVjQpCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb25uYnl0ZXMnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQotCSAgbnVtYmVyIG9mIGJ5dGVzIGFuZC9vciBwYWNrZXRzIGZvciBlYWNoIGRpcmVjdGlvbiB3aXRoaW4gYSBjb25uZWN0aW9uLgotCi0JICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KLQogY29uZmlnIElQX05GX01BVENIX0hBU0hMSU1JVAogCXRyaXN0YXRlICAnaGFzaGxpbWl0IG1hdGNoIHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUwpAQCAtNDc0LDE5ICszMDMsNiBAQAogCSAgZGVzdGluYXRpb24gSVAnIG9yIGA1MDBwcHMgZnJvbSBhbnkgZ2l2ZW4gc291cmNlIElQJyAgd2l0aCBhIHNpbmdsZQogCSAgSVB0YWJsZXMgcnVsZS4KIAotY29uZmlnIElQX05GX01BVENIX1NUUklORwotCXRyaXN0YXRlICAnc3RyaW5nIG1hdGNoIHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUF9ORl9JUFRBQkxFUyAKLQlzZWxlY3QgVEVYVFNFQVJDSAotCXNlbGVjdCBURVhUU0VBUkNIX0tNUAotCXNlbGVjdCBURVhUU0VBUkNIX0JNCi0Jc2VsZWN0IFRFWFRTRUFSQ0hfRlNNCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBzdHJpbmcnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIGxvb2sgZm9yCi0JICBwYXR0ZXJuIG1hdGNoaW5ncyBpbiBwYWNrZXRzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQX05GX01BVENIX1BPTElDWQogICAgICAgIHRyaXN0YXRlICJJUHNlYyBwb2xpY3kgbWF0Y2ggc3VwcG9ydCIKICAgICAgICBkZXBlbmRzIG9uIElQX05GX0lQVEFCTEVTICYmIFhGUk0KQEAgLTU3MiwxNyArMzg4LDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9UQVJHRVRfTkZRVUVVRQotCXRyaXN0YXRlICJORlFVRVVFIFRhcmdldCBTdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBUaGlzIFRhcmdldCByZXBsYWNlZCB0aGUgb2xkIG9ic29sZXRlIFFVRVVFIHRhcmdldC4KLQotCSAgQXMgb3Bwb3NlZCB0byBRVUVVRSwgaXQgc3VwcG9ydHMgNjU1MzUgZGlmZmVyZW50IHF1ZXVlcywKLQkgIG5vdCBqdXN0IG9uZS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KICMgTkFUICsgc3BlY2lmaWMgdGFyZ2V0cwogY29uZmlnIElQX05GX05BVAogCXRyaXN0YXRlICJGdWxsIE5BVCIKQEAgLTczNSwzMSArNTQwLDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9UQVJHRVRfTUFSSwotCXRyaXN0YXRlICJNQVJLIHRhcmdldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBNQVJLJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB5b3UgdG8gY3JlYXRlIHJ1bGVzCi0JICBpbiB0aGUgYG1hbmdsZScgdGFibGUgd2hpY2ggYWx0ZXIgdGhlIG5ldGZpbHRlciBtYXJrIChuZm1hcmspIGZpZWxkCi0JICBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2tldCBwcmlvciB0byByb3V0aW5nLiBUaGlzIGNhbiBjaGFuZ2UKLQkgIHRoZSByb3V0aW5nIG1ldGhvZCAoc2VlIGBVc2UgbmV0ZmlsdGVyIE1BUksgdmFsdWUgYXMgcm91dGluZwotCSAga2V5JykgYW5kIGNhbiBhbHNvIGJlIHVzZWQgYnkgb3RoZXIgc3Vic3lzdGVtcyB0byBjaGFuZ2UgdGhlaXIKLQkgIGJlaGF2aW9yLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQX05GX1RBUkdFVF9DTEFTU0lGWQotCXRyaXN0YXRlICJDTEFTU0lGWSB0YXJnZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQX05GX01BTkdMRQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgQ0xBU1NJRlknIHRhcmdldCwgd2hpY2ggZW5hYmxlcyB0aGUgdXNlciB0byBzZXQKLQkgIHRoZSBwcmlvcml0eSBvZiBhIHBhY2tldC4gU29tZSBxZGlzY3MgY2FuIHVzZSB0aGlzIHZhbHVlIGZvcgotCSAgY2xhc3NpZmljYXRpb24sIGFtb25nIHRoZXNlIGFyZToKLQotICAJICBhdG0sIGNicSwgZHNtYXJrLCBwZmlmb19mYXN0LCBodGIsIHByaW8KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUF9ORl9UQVJHRVRfVFRMCiAJdHJpc3RhdGUgICdUVEwgdGFyZ2V0IHN1cHBvcnQnCiAJZGVwZW5kcyBvbiBJUF9ORl9NQU5HTEUKQEAgLTc3NCwxOSArNTU0LDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUF9ORl9UQVJHRVRfQ09OTk1BUksKLQl0cmlzdGF0ZSAgJ0NPTk5NQVJLIHRhcmdldCBzdXBwb3J0JwotCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFCi0JZGVwZW5kcyBvbiAoSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX0NPTk5UUkFDS19NQVJLKSB8fCAoTkZfQ09OTlRSQUNLX01BUksgJiYgTkZfQ09OTlRSQUNLX0lQVjQpCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBDT05OTUFSSycgdGFyZ2V0LCB3aGljaCBhbGxvd3Mgb25lIHRvIG1hbmlwdWxhdGUKLQkgIHRoZSBjb25uZWN0aW9uIG1hcmsgdmFsdWUuICBTaW1pbGFyIHRvIHRoZSBNQVJLIHRhcmdldCwgYnV0Ci0JICBhZmZlY3RzIHRoZSBjb25uZWN0aW9uIG1hcmsgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIHBhY2tldCBtYXJrIHZhbHVlLgotCQotCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAotCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCi0JICBpcHRfQ09OTk1BUksuby4gIElmIHVuc3VyZSwgc2F5IGBOJy4KLQogY29uZmlnIElQX05GX1RBUkdFVF9DTFVTVEVSSVAKIAl0cmlzdGF0ZSAiQ0xVU1RFUklQIHRhcmdldCBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gSVBfTkZfTUFOR0xFICYmIEVYUEVSSU1FTlRBTApAQCAtODEwLDIzICs1NzcsMTAgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKIAkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgogCi1jb25maWcgSVBfTkZfVEFSR0VUX05PVFJBQ0sKLQl0cmlzdGF0ZSAgJ05PVFJBQ0sgdGFyZ2V0IHN1cHBvcnQnCi0JZGVwZW5kcyBvbiBJUF9ORl9SQVcKLQlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0tfSVBWNAotCWhlbHAKLQkgIFRoZSBOT1RSQUNLIHRhcmdldCBhbGxvd3MgYSBzZWxlY3QgcnVsZSB0byBzcGVjaWZ5Ci0JICB3aGljaCBwYWNrZXRzICpub3QqIHRvIGVudGVyIHRoZSBjb25udHJhY2svTkFUCi0JICBzdWJzeXN0ZW0gd2l0aCBhbGwgdGhlIGNvbnNlcXVlbmNlcyAobm8gSUNNUCBlcnJvciB0cmFja2luZywKLQkgIG5vIHByb3RvY29sIGhlbHBlcnMgZm9yIHRoZSBzZWxlY3RlZCBwYWNrZXRzKS4KLQkKLQkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKLQkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgotCi0KICMgQVJQIHRhYmxlcwogY29uZmlnIElQX05GX0FSUFRBQkxFUwogCXRyaXN0YXRlICJBUlAgdGFibGVzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUwogCWhlbHAKIAkgIGFycHRhYmxlcyBpcyBhIGdlbmVyYWwsIGV4dGVuc2libGUgcGFja2V0IGlkZW50aWZpY2F0aW9uIGZyYW1ld29yay4KIAkgIFRoZSBBUlAgcGFja2V0IGZpbHRlcmluZyBhbmQgbWFuZ2xpbmcgKG1hbmlwdWxhdGlvbilzdWJzeXN0ZW1zCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggNTQ5YjAxYS4uYmNlZmU2NGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTQ3LDE0ICs0Nyw4IEBACiAKICMgbWF0Y2hlcwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0hFTFBFUikgKz0gaXB0X2hlbHBlci5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfTElNSVQpICs9IGlwdF9saW1pdC5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfSEFTSExJTUlUKSArPSBpcHRfaGFzaGxpbWl0Lm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9TQ1RQKSArPSBpcHRfc2N0cC5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfRENDUCkgKz0gaXB0X2RjY3Aubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX01BUkspICs9IGlwdF9tYXJrLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9NQUMpICs9IGlwdF9tYWMubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0lQUkFOR0UpICs9IGlwdF9pcHJhbmdlLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9QS1RUWVBFKSArPSBpcHRfcGt0dHlwZS5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfTVVMVElQT1JUKSArPSBpcHRfbXVsdGlwb3J0Lm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9PV05FUikgKz0gaXB0X293bmVyLm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9UT1MpICs9IGlwdF90b3MubwpAQCAtNjIsNDAgKzU2LDI1IEBACiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfRUNOKSArPSBpcHRfZWNuLm8KIG9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9EU0NQKSArPSBpcHRfZHNjcC5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQKSArPSBpcHRfYWgubyBpcHRfZXNwLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEgpICs9IGlwdF9sZW5ndGgubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1RUTCkgKz0gaXB0X3R0bC5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfU1RBVEUpICs9IGlwdF9zdGF0ZS5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTk1BUkspICs9IGlwdF9jb25ubWFyay5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTlRSQUNLKSArPSBpcHRfY29ubnRyYWNrLm8KLW9iai0kKENPTkZJR19JUF9ORl9NQVRDSF9DT05OQllURVMpICs9IGlwdF9jb25uYnl0ZXMubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1RDUE1TUykgKz0gaXB0X3RjcG1zcy5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfUkVBTE0pICs9IGlwdF9yZWFsbS5vCiBvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQUREUlRZUEUpICs9IGlwdF9hZGRydHlwZS5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfUEhZU0RFVikgKz0gaXB0X3BoeXNkZXYubwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1BPTElDWSkgKz0gaXB0X3BvbGljeS5vCi1vYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfQ09NTUVOVCkgKz0gaXB0X2NvbW1lbnQubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX1NUUklORykgKz0gaXB0X3N0cmluZy5vCiAKICMgdGFyZ2V0cwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1QpICs9IGlwdF9SRUpFQ1Qubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9UT1MpICs9IGlwdF9UT1Mubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9FQ04pICs9IGlwdF9FQ04ubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9EU0NQKSArPSBpcHRfRFNDUC5vCi1vYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX01BUkspICs9IGlwdF9NQVJLLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERSkgKz0gaXB0X01BU1FVRVJBREUubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9SRURJUkVDVCkgKz0gaXB0X1JFRElSRUNULm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQKSArPSBpcHRfTkVUTUFQLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfU0FNRSkgKz0gaXB0X1NBTUUubwotb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9DTEFTU0lGWSkgKz0gaXB0X0NMQVNTSUZZLm8KIG9iai0kKENPTkZJR19JUF9ORl9OQVRfU05NUF9CQVNJQykgKz0gaXBfbmF0X3NubXBfYmFzaWMubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9MT0cpICs9IGlwdF9MT0cubwotb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9DT05OTUFSSykgKz0gaXB0X0NPTk5NQVJLLm8KIG9iai0kKENPTkZJR19JUF9ORl9UQVJHRVRfVUxPRykgKz0gaXB0X1VMT0cubwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9UQ1BNU1MpICs9IGlwdF9UQ1BNU1Mubwotb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9OT1RSQUNLKSArPSBpcHRfTk9UUkFDSy5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX0NMVVNURVJJUCkgKz0gaXB0X0NMVVNURVJJUC5vCiBvYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX1RUTCkgKz0gaXB0X1RUTC5vCi1vYmotJChDT05GSUdfSVBfTkZfVEFSR0VUX05GUVVFVUUpICs9IGlwdF9ORlFVRVVFLm8KIAogIyBnZW5lcmljIEFSUCB0YWJsZXMKIG9iai0kKENPTkZJR19JUF9ORl9BUlBUQUJMRVMpICs9IGFycF90YWJsZXMubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMKaW5kZXggYjZkNTI4NC4uYWZlM2Q4ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtNTUsMjggKzU2LDkgQEAKICNlbHNlCiAjZGVmaW5lIEFSUF9ORl9BU1NFUlQoeCkKICNlbmRpZgotI2RlZmluZSBTTVBfQUxJR04oeCkgKCgoeCkgKyBTTVBfQ0FDSEVfQllURVMtMSkgJiB+KFNNUF9DQUNIRV9CWVRFUy0xKSkKIAotc3RhdGljIERFQ0xBUkVfTVVURVgoYXJwdF9tdXRleCk7Ci0KLSNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KSBBUlBfTkZfQVNTRVJUKGRvd25fdHJ5bG9jaygmYXJwdF9tdXRleCkgIT0gMCkKLSNkZWZpbmUgQVNTRVJUX1dSSVRFX0xPQ0soeCkgQVJQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmFycHRfbXV0ZXgpICE9IDApCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbGlzdGhlbHAuaD4KIAotc3RydWN0IGFycHRfdGFibGVfaW5mbyB7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0JdW5zaWduZWQgaW50IG51bWJlcjsKLQl1bnNpZ25lZCBpbnQgaW5pdGlhbF9lbnRyaWVzOwotCXVuc2lnbmVkIGludCBob29rX2VudHJ5W05GX0FSUF9OVU1IT09LU107Ci0JdW5zaWduZWQgaW50IHVuZGVyZmxvd1tORl9BUlBfTlVNSE9PS1NdOwotCXZvaWQgKmVudHJpZXNbTlJfQ1BVU107Ci19OwotCi1zdGF0aWMgTElTVF9IRUFEKGFycHRfdGFyZ2V0KTsKLXN0YXRpYyBMSVNUX0hFQUQoYXJwdF90YWJsZXMpOwotI2RlZmluZSBTRVRfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCA9IChiKTsgKGMpLnBjbnQgPSAocCk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQUREX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgKz0gKGIpOyAoYykucGNudCArPSAocCk7IH0gd2hpbGUoMCkKLQogc3RhdGljIGlubGluZSBpbnQgYXJwX2RldmFkZHJfY29tcGFyZShjb25zdCBzdHJ1Y3QgYXJwdF9kZXZhZGRyX2luZm8gKmFwLAogCQkJCSAgICAgIGNoYXIgKmhkcl9hZGRyLCBpbnQgbGVuKQogewpAQCAtMjIzLDkgKzIwNSw5IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYXJwdF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCiAJCQkgICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCiAJCQkgICAgICAgdm9pZCAqdXNlcmluZm8pCiB7CkBAIC0yNTQsNiArMjM2LDcgQEAKIAlzdHJ1Y3QgYXJwdF9lbnRyeSAqZSwgKmJhY2s7CiAJY29uc3QgY2hhciAqaW5kZXYsICpvdXRkZXY7CiAJdm9pZCAqdGFibGVfYmFzZTsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOwogCiAJLyogQVJQIGhlYWRlciwgcGx1cyAyIGRldmljZSBhZGRyZXNzZXMsIHBsdXMgMiBJUCBhZGRyZXNzZXMuICAqLwogCWlmICghcHNrYl9tYXlfcHVsbCgoKnBza2IpLCAoc2l6ZW9mKHN0cnVjdCBhcnBoZHIpICsKQEAgLTI2NSw5ICsyNDgsOSBAQAogCW91dGRldiA9IG91dCA/IG91dC0+bmFtZSA6IG51bGxkZXZuYW1lOwogCiAJcmVhZF9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JdGFibGVfYmFzZSA9ICh2b2lkICopdGFibGUtPnByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdKTsKLQliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT51bmRlcmZsb3dbaG9va10pOworCXRhYmxlX2Jhc2UgPSAodm9pZCAqKXByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHByaXZhdGUtPmhvb2tfZW50cnlbaG9va10pOworCWJhY2sgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgcHJpdmF0ZS0+dW5kZXJmbG93W2hvb2tdKTsKIAogCWFycCA9ICgqcHNrYiktPm5oLmFycGg7CiAJZG8gewpAQCAtMzE1LDggKzI5OCw4IEBACiAJCQkJICogYWJzLiB2ZXJkaWN0cwogCQkJCSAqLwogCQkJCXZlcmRpY3QgPSB0LT51Lmtlcm5lbC50YXJnZXQtPnRhcmdldChwc2tiLAotCQkJCQkJCQkgICAgIGhvb2ssCiAJCQkJCQkJCSAgICAgaW4sIG91dCwKKwkJCQkJCQkJICAgICBob29rLAogCQkJCQkJCQkgICAgIHQtPmRhdGEsCiAJCQkJCQkJCSAgICAgdXNlcmRhdGEpOwogCkBAIC0zNDEsMTA2ICszMjQsNiBAQAogCQlyZXR1cm4gdmVyZGljdDsKIH0KIAotLyoKLSAqIFRoZXNlIGFyZSB3ZWlyZCwgYnV0IG1vZHVsZSBsb2FkaW5nIG11c3Qgbm90IGJlIGRvbmUgd2l0aCBtdXRleAotICogaGVsZCAoc2luY2UgdGhleSB3aWxsIHJlZ2lzdGVyKSwgYW5kIHdlIGhhdmUgdG8gaGF2ZSBhIHNpbmdsZQotICogZnVuY3Rpb24gdG8gdXNlIHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKCkuCi0gKi8KLQotLyogRmluZCB0YWJsZSBieSBuYW1lLCBncmFicyBtdXRleCAmIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXJwdF90YWJsZSAqZmluZF90YWJsZV9sb2NrKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGFycHRfdGFibGUgKnQ7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhcnB0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmYXJwdF90YWJsZXMsIGxpc3QpCi0JCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldCh0LT5tZSkpCi0JCQlyZXR1cm4gdDsKLQl1cCgmYXJwdF9tdXRleCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyogRmluZCB0YXJnZXQsIGdyYWJzIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXJwdF90YXJnZXQgKmZpbmRfdGFyZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQotewotCXN0cnVjdCBhcnB0X3RhcmdldCAqdDsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFycHRfbXV0ZXgpICE9IDApCi0JCXJldHVybiBFUlJfUFRSKC1FSU5UUik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZhcnB0X3RhcmdldCwgbGlzdCkgewotCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmICh0LT5yZXZpc2lvbiA9PSByZXZpc2lvbikgewotCQkJCWlmICh0cnlfbW9kdWxlX2dldCh0LT5tZSkpIHsKLQkJCQkJdXAoJmFycHRfbXV0ZXgpOwotCQkJCQlyZXR1cm4gdDsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQllcnIgPSAtRVBST1RPVFlQRTsgLyogRm91bmQgc29tZXRoaW5nLiAqLwotCQl9Ci0JfQotCXVwKCZhcnB0X211dGV4KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi1zdHJ1Y3QgYXJwdF90YXJnZXQgKmFycHRfZmluZF90YXJnZXQoY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCi17Ci0Jc3RydWN0IGFycHRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLQl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhcmdldChuYW1lLCByZXZpc2lvbiksCi0JCQkJCSAiYXJwdF8lcyIsIG5hbWUpOwotCWlmIChJU19FUlIodGFyZ2V0KSB8fCAhdGFyZ2V0KQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gdGFyZ2V0OwotfQotCi1zdGF0aWMgaW50IHRhcmdldF9yZXZmbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKLXsKLQlzdHJ1Y3QgYXJwdF90YXJnZXQgKnQ7Ci0JaW50IGhhdmVfcmV2ID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmFycHRfdGFyZ2V0LCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKHQtPnJldmlzaW9uID4gKmJlc3RwKQotCQkJCSpiZXN0cCA9IHQtPnJldmlzaW9uOwotCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKQotCQkJCWhhdmVfcmV2ID0xOwotCQl9Ci0JfQotCXJldHVybiBoYXZlX3JldjsKLX0KLQotLyogUmV0dXJucyB0cnVlIG9yIGZhbHNlIChpZiBubyBzdWNoIGV4dGVuc2lvbiBhdCBhbGwpICovCi1zdGF0aWMgaW5saW5lIGludCBmaW5kX3JldmlzaW9uKGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLAotCQkJCWludCAoKnJldmZuKShjb25zdCBjaGFyICosIHU4LCBpbnQgKiksCi0JCQkJaW50ICplcnIpCi17Ci0JaW50IGhhdmVfcmV2LCBiZXN0ID0gLTE7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZhcnB0X211dGV4KSAhPSAwKSB7Ci0JCSplcnIgPSAtRUlOVFI7Ci0JCXJldHVybiAxOwotCX0KLQloYXZlX3JldiA9IHJldmZuKG5hbWUsIHJldmlzaW9uLCAmYmVzdCk7Ci0JdXAoJmFycHRfbXV0ZXgpOwotCi0JLyogTm90aGluZyBhdCBhbGw/ICBSZXR1cm4gMCB0byB0cnkgbG9hZGluZyBtb2R1bGUuICovCi0JaWYgKGJlc3QgPT0gLTEpIHsKLQkJKmVyciA9IC1FTk9FTlQ7Ci0JCXJldHVybiAwOwotCX0KLQotCSplcnIgPSBiZXN0OwotCWlmICghaGF2ZV9yZXYpCi0JCSplcnIgPSAtRVBST1RPTk9TVVBQT1JUOwotCXJldHVybiAxOwotfQotCi0KIC8qIEFsbCB6ZXJvZXMgPT0gdW5jb25kaXRpb25hbCBydWxlLiAqLwogc3RhdGljIGlubGluZSBpbnQgdW5jb25kaXRpb25hbChjb25zdCBzdHJ1Y3QgYXJwdF9hcnAgKmFycCkKIHsKQEAgLTQ1Niw3ICszMzksNyBAQAogLyogRmlndXJlcyBvdXQgZnJvbSB3aGF0IGhvb2sgZWFjaCBydWxlIGNhbiBiZSBjYWxsZWQ6IHJldHVybnMgMCBpZgogICogdGhlcmUgYXJlIGxvb3BzLiAgUHV0cyBob29rIGJpdG1hc2sgaW4gY29tZWZyb20uCiAgKi8KLXN0YXRpYyBpbnQgbWFya19zb3VyY2VfY2hhaW5zKHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKm5ld2luZm8sCitzdGF0aWMgaW50IG1hcmtfc291cmNlX2NoYWlucyhzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKIAkJCSAgICAgIHVuc2lnbmVkIGludCB2YWxpZF9ob29rcywgdm9pZCAqZW50cnkwKQogewogCXVuc2lnbmVkIGludCBob29rOwpAQCAtNTg3LDggKzQ3MCw4IEBACiAJfQogCiAJdCA9IGFycHRfZ2V0X3RhcmdldChlKTsKLQl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhcmdldCh0LT51LnVzZXIubmFtZSwKLQkJCQkJCSAgICAgdC0+dS51c2VyLnJldmlzaW9uKSwKKwl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChORl9BUlAsIHQtPnUudXNlci5uYW1lLAorCQkJCQkJCXQtPnUudXNlci5yZXZpc2lvbiksCiAJCQkJCSAiYXJwdF8lcyIsIHQtPnUudXNlci5uYW1lKTsKIAlpZiAoSVNfRVJSKHRhcmdldCkgfHwgIXRhcmdldCkgewogCQlkdXByaW50ZigiY2hlY2tfZW50cnk6IGAlcycgbm90IGZvdW5kXG4iLCB0LT51LnVzZXIubmFtZSk7CkBAIC02MjIsNyArNTA1LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfZW50cnlfc2l6ZV9hbmRfaG9va3Moc3RydWN0IGFycHRfZW50cnkgKmUsCi0JCQkJCSAgICAgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCQkJICAgICBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKIAkJCQkJICAgICB1bnNpZ25lZCBjaGFyICpiYXNlLAogCQkJCQkgICAgIHVuc2lnbmVkIGNoYXIgKmxpbWl0LAogCQkJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqaG9va19lbnRyaWVzLApAQCAtNjU2LDcgKzUzOSw3IEBACiAgICAgICAgICAgIDwgMCAobm90IEFSUFRfUkVUVVJOKS4gLS1SUiAqLwogCiAJLyogQ2xlYXIgY291bnRlcnMgYW5kIGNvbWVmcm9tICovCi0JZS0+Y291bnRlcnMgPSAoKHN0cnVjdCBhcnB0X2NvdW50ZXJzKSB7IDAsIDAgfSk7CisJZS0+Y291bnRlcnMgPSAoKHN0cnVjdCB4dF9jb3VudGVycykgeyAwLCAwIH0pOwogCWUtPmNvbWVmcm9tID0gMDsKIAogCSgqaSkrKzsKQEAgLTY4Myw3ICs1NjYsNyBAQAogICovCiBzdGF0aWMgaW50IHRyYW5zbGF0ZV90YWJsZShjb25zdCBjaGFyICpuYW1lLAogCQkJICAgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLAotCQkJICAgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCSAgIHN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAogCQkJICAgdm9pZCAqZW50cnkwLAogCQkJICAgdW5zaWduZWQgaW50IHNpemUsCiAJCQkgICB1bnNpZ25lZCBpbnQgbnVtYmVyLApAQCAtNzY0LDM0ICs2NDcsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICpyZXBsYWNlX3RhYmxlKHN0cnVjdCBhcnB0X3RhYmxlICp0YWJsZSwKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzLAotCQkJCQkgICAgIHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKm5ld2luZm8sCi0JCQkJCSAgICAgaW50ICplcnJvcikKLXsKLQlzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICpvbGRpbmZvOwotCi0JLyogRG8gdGhlIHN1YnN0aXR1dGlvbi4gKi8KLQl3cml0ZV9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JLyogQ2hlY2sgaW5zaWRlIGxvY2s6IGlzIHRoZSBvbGQgbnVtYmVyIGNvcnJlY3Q/ICovCi0JaWYgKG51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKSB7Ci0JCWR1cHJpbnRmKCJudW1fY291bnRlcnMgIT0gdGFibGUtPnByaXZhdGUtPm51bWJlciAoJXUvJXUpXG4iLAotCQkJIG51bV9jb3VudGVycywgdGFibGUtPnByaXZhdGUtPm51bWJlcik7Ci0JCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOwotCQkqZXJyb3IgPSAtRUFHQUlOOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb2xkaW5mbyA9IHRhYmxlLT5wcml2YXRlOwotCXRhYmxlLT5wcml2YXRlID0gbmV3aW5mbzsKLQluZXdpbmZvLT5pbml0aWFsX2VudHJpZXMgPSBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXM7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0KLQlyZXR1cm4gb2xkaW5mbzsKLX0KLQogLyogR2V0cyBjb3VudGVycy4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGFkZF9lbnRyeV90b19jb3VudGVyKGNvbnN0IHN0cnVjdCBhcnB0X2VudHJ5ICplLAotCQkJCSAgICAgICBzdHJ1Y3QgYXJwdF9jb3VudGVycyB0b3RhbFtdLAorCQkJCSAgICAgICBzdHJ1Y3QgeHRfY291bnRlcnMgdG90YWxbXSwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50ICppKQogewogCUFERF9DT1VOVEVSKHRvdGFsWyppXSwgZS0+Y291bnRlcnMuYmNudCwgZS0+Y291bnRlcnMucGNudCk7CkBAIC04MDEsNyArNjU5LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgc2V0X2VudHJ5X3RvX2NvdW50ZXIoY29uc3Qgc3RydWN0IGFycHRfZW50cnkgKmUsCi0JCQkJICAgICAgIHN0cnVjdCBhcnB0X2NvdW50ZXJzIHRvdGFsW10sCisJCQkJICAgICAgIHN0cnVjdCB4dF9jb3VudGVycyB0b3RhbFtdLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmkpCiB7CiAJU0VUX0NPVU5URVIodG90YWxbKmldLCBlLT5jb3VudGVycy5iY250LCBlLT5jb3VudGVycy5wY250KTsKQEAgLTgxMCw4ICs2NjgsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBnZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IGFycHRfdGFibGVfaW5mbyAqdCwKLQkJCSBzdHJ1Y3QgYXJwdF9jb3VudGVycyBjb3VudGVyc1tdKQorc3RhdGljIHZvaWQgZ2V0X2NvdW50ZXJzKGNvbnN0IHN0cnVjdCB4dF90YWJsZV9pbmZvICp0LAorCQkJIHN0cnVjdCB4dF9jb3VudGVycyBjb3VudGVyc1tdKQogewogCXVuc2lnbmVkIGludCBjcHU7CiAJdW5zaWduZWQgaW50IGk7CkBAIC04NDksNyArNzA3LDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgb2ZmLCBudW0sIGNvdW50ZXJzaXplOwogCXN0cnVjdCBhcnB0X2VudHJ5ICplOwotCXN0cnVjdCBhcnB0X2NvdW50ZXJzICpjb3VudGVyczsKKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CiAJaW50IHJldCA9IDA7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIApAQCAtODU3LDE4ICs3MTYsMTggQEAKIAkgKiAob3RoZXIgdGhhbiBjb21lZnJvbSwgd2hpY2ggdXNlcnNwYWNlIGRvZXNuJ3QgY2FyZQogCSAqIGFib3V0KS4KIAkgKi8KLQljb3VudGVyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYXJwdF9jb3VudGVycykgKiB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOwotCWNvdW50ZXJzID0gdm1hbGxvYyhjb3VudGVyc2l6ZSk7CisJY291bnRlcnNpemUgPSBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSAqIHByaXZhdGUtPm51bWJlcjsKKwljb3VudGVycyA9IHZtYWxsb2Nfbm9kZShjb3VudGVyc2l6ZSwgbnVtYV9ub2RlX2lkKCkpOwogCiAJaWYgKGNvdW50ZXJzID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogRmlyc3QsIHN1bSBjb3VudGVycy4uLiAqLwogCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQlnZXRfY291bnRlcnModGFibGUtPnByaXZhdGUsIGNvdW50ZXJzKTsKKwlnZXRfY291bnRlcnMocHJpdmF0ZSwgY291bnRlcnMpOwogCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOwogCi0JbG9jX2NwdV9lbnRyeSA9IHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCS8qIC4uLiB0aGVuIGNvcHkgZW50aXJlIHRoaW5nIC4uLiAqLwogCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciwgbG9jX2NwdV9lbnRyeSwgdG90YWxfc2l6ZSkgIT0gMCkgewogCQlyZXQgPSAtRUZBVUxUOwpAQCAtOTExLDc1ICs3NzAsMzQgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBhcnB0X3RhYmxlICp0OwogCi0JdCA9IGZpbmRfdGFibGVfbG9jayhlbnRyaWVzLT5uYW1lKTsKKwl0ID0geHRfZmluZF90YWJsZV9sb2NrKE5GX0FSUCwgZW50cmllcy0+bmFtZSk7CiAJaWYgKHQgfHwgIUlTX0VSUih0KSkgeworCQlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHQtPnByaXZhdGU7CiAJCWR1cHJpbnRmKCJ0LT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKLQkJCSB0LT5wcml2YXRlLT5udW1iZXIpOwotCQlpZiAoZW50cmllcy0+c2l6ZSA9PSB0LT5wcml2YXRlLT5zaXplKQotCQkJcmV0ID0gY29weV9lbnRyaWVzX3RvX3VzZXIodC0+cHJpdmF0ZS0+c2l6ZSwKKwkJCSBwcml2YXRlLT5udW1iZXIpOworCQlpZiAoZW50cmllcy0+c2l6ZSA9PSBwcml2YXRlLT5zaXplKQorCQkJcmV0ID0gY29weV9lbnRyaWVzX3RvX3VzZXIocHJpdmF0ZS0+c2l6ZSwKIAkJCQkJCSAgIHQsIHVwdHItPmVudHJ5dGFibGUpOwogCQllbHNlIHsKIAkJCWR1cHJpbnRmKCJnZXRfZW50cmllczogSSd2ZSBnb3QgJXUgbm90ICV1IVxuIiwKLQkJCQkgdC0+cHJpdmF0ZS0+c2l6ZSwKLQkJCQkgZW50cmllcy0+c2l6ZSk7CisJCQkJIHByaXZhdGUtPnNpemUsIGVudHJpZXMtPnNpemUpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQogCQltb2R1bGVfcHV0KHQtPm1lKTsKLQkJdXAoJmFycHRfbXV0ZXgpOworCQl4dF90YWJsZV91bmxvY2sodCk7CiAJfSBlbHNlCiAJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfdGFibGVfaW5mbyhzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvICppbmZvKQotewotCWludCBjcHU7Ci0JZm9yX2VhY2hfY3B1KGNwdSkgewotCQlpZiAoaW5mby0+c2l6ZSA8PSBQQUdFX1NJWkUpCi0JCQlrZnJlZShpbmZvLT5lbnRyaWVzW2NwdV0pOwotCQllbHNlCi0JCQl2ZnJlZShpbmZvLT5lbnRyaWVzW2NwdV0pOwotCX0KLQlrZnJlZShpbmZvKTsKLX0KLQotc3RhdGljIHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKmFsbG9jX3RhYmxlX2luZm8odW5zaWduZWQgaW50IHNpemUpCi17Ci0Jc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbzsKLQlpbnQgY3B1OwotCQotCW5ld2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXJwdF90YWJsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdpbmZvKQotCQlyZXR1cm4gTlVMTDsKLQotCW5ld2luZm8tPnNpemUgPSBzaXplOwotCi0JZm9yX2VhY2hfY3B1KGNwdSkgewotCQlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCi0JCQluZXdpbmZvLT5lbnRyaWVzW2NwdV0gPSBrbWFsbG9jX25vZGUoc2l6ZSwKLQkJCQkJCQlHRlBfS0VSTkVMLAotCQkJCQkJCWNwdV90b19ub2RlKGNwdSkpOwotCQllbHNlCi0JCQluZXdpbmZvLT5lbnRyaWVzW2NwdV0gPSB2bWFsbG9jX25vZGUoc2l6ZSwKLQkJCQkJCQkgICAgIGNwdV90b19ub2RlKGNwdSkpOwotCi0JCWlmIChuZXdpbmZvLT5lbnRyaWVzW2NwdV0gPT0gTlVMTCkgewotCQkJZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbmV3aW5mbzsKLX0KLQogc3RhdGljIGludCBkb19yZXBsYWNlKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCWludCByZXQ7CiAJc3RydWN0IGFycHRfcmVwbGFjZSB0bXA7CiAJc3RydWN0IGFycHRfdGFibGUgKnQ7Ci0Jc3RydWN0IGFycHRfdGFibGVfaW5mbyAqbmV3aW5mbywgKm9sZGluZm87Ci0Jc3RydWN0IGFycHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLCAqb2xkaW5mbzsKKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOwogCXZvaWQgKmxvY19jcHVfZW50cnksICpsb2NfY3B1X29sZF9lbnRyeTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkgIT0gMCkKQEAgLTk4OSwxMSArODA3LDcgQEAKIAlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLnNpemUpCiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAKLQkvKiBQZWRhbnRyeTogcHJldmVudCB0aGVtIGZyb20gaGl0dGluZyBCVUcoKSBpbiB2bWFsbG9jLmMgLS1SUiAqLwotCWlmICgoU01QX0FMSUdOKHRtcC5zaXplKSA+PiBQQUdFX1NISUZUKSArIDIgPiBudW1fcGh5c3BhZ2VzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW5ld2luZm8gPSBhbGxvY190YWJsZV9pbmZvKHRtcC5zaXplKTsKKwluZXdpbmZvID0geHRfYWxsb2NfdGFibGVfaW5mbyh0bXAuc2l6ZSk7CiAJaWYgKCFuZXdpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTAwNSw3ICs4MTksNyBAQAogCQlnb3RvIGZyZWVfbmV3aW5mbzsKIAl9CiAKLQljb3VudGVycyA9IHZtYWxsb2ModG1wLm51bV9jb3VudGVycyAqIHNpemVvZihzdHJ1Y3QgYXJwdF9jb3VudGVycykpOworCWNvdW50ZXJzID0gdm1hbGxvYyh0bXAubnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykpOwogCWlmICghY291bnRlcnMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmcmVlX25ld2luZm87CkBAIC0xMDE5LDcgKzgzMyw3IEBACiAKIAlkdXByaW50ZigiYXJwX3RhYmxlczogVHJhbnNsYXRlZCB0YWJsZVxuIik7CiAKLQl0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF90YWJsZV9sb2NrKHRtcC5uYW1lKSwKKwl0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YWJsZV9sb2NrKE5GX0FSUCwgdG1wLm5hbWUpLAogCQkJCSAgICAiYXJwdGFibGVfJXMiLCB0bXAubmFtZSk7CiAJaWYgKCF0IHx8IElTX0VSUih0KSkgewogCQlyZXQgPSB0ID8gUFRSX0VSUih0KSA6IC1FTk9FTlQ7CkBAIC0xMDM0LDcgKzg0OCw3IEBACiAJCWdvdG8gcHV0X21vZHVsZTsKIAl9CiAKLQlvbGRpbmZvID0gcmVwbGFjZV90YWJsZSh0LCB0bXAubnVtX2NvdW50ZXJzLCBuZXdpbmZvLCAmcmV0KTsKKwlvbGRpbmZvID0geHRfcmVwbGFjZV90YWJsZSh0LCB0bXAubnVtX2NvdW50ZXJzLCBuZXdpbmZvLCAmcmV0KTsKIAlpZiAoIW9sZGluZm8pCiAJCWdvdG8gcHV0X21vZHVsZTsKIApAQCAtMTA1NCwyMyArODY4LDIzIEBACiAJbG9jX2NwdV9vbGRfZW50cnkgPSBvbGRpbmZvLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCUFSUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X29sZF9lbnRyeSwgb2xkaW5mby0+c2l6ZSwgY2xlYW51cF9lbnRyeSxOVUxMKTsKIAotCWZyZWVfdGFibGVfaW5mbyhvbGRpbmZvKTsKKwl4dF9mcmVlX3RhYmxlX2luZm8ob2xkaW5mbyk7CiAJaWYgKGNvcHlfdG9fdXNlcih0bXAuY291bnRlcnMsIGNvdW50ZXJzLAotCQkJIHNpemVvZihzdHJ1Y3QgYXJwdF9jb3VudGVycykgKiB0bXAubnVtX2NvdW50ZXJzKSAhPSAwKQorCQkJIHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpICogdG1wLm51bV9jb3VudGVycykgIT0gMCkKIAkJcmV0ID0gLUVGQVVMVDsKIAl2ZnJlZShjb3VudGVycyk7Ci0JdXAoJmFycHRfbXV0ZXgpOworCXh0X3RhYmxlX3VubG9jayh0KTsKIAlyZXR1cm4gcmV0OwogCiAgcHV0X21vZHVsZToKIAltb2R1bGVfcHV0KHQtPm1lKTsKLQl1cCgmYXJwdF9tdXRleCk7CisJeHRfdGFibGVfdW5sb2NrKHQpOwogIGZyZWVfbmV3aW5mb19jb3VudGVyc191bnRyYW5zOgogCUFSUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LCBuZXdpbmZvLT5zaXplLCBjbGVhbnVwX2VudHJ5LCBOVUxMKTsKICBmcmVlX25ld2luZm9fY291bnRlcnM6CiAJdmZyZWUoY291bnRlcnMpOwogIGZyZWVfbmV3aW5mbzoKLQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwNzgsNyArODkyLDcgQEAKICAqIGFuZCBldmVyeXRoaW5nIGlzIE9LLgogICovCiBzdGF0aWMgaW5saW5lIGludCBhZGRfY291bnRlcl90b19lbnRyeShzdHJ1Y3QgYXJwdF9lbnRyeSAqZSwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGFycHRfY291bnRlcnMgYWRkbWVbXSwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHh0X2NvdW50ZXJzIGFkZG1lW10sCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCAqaSkKIHsKIApAQCAtMTA5MSwxNSArOTA1LDE2IEBACiBzdGF0aWMgaW50IGRvX2FkZF9jb3VudGVycyh2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgYXJwdF9jb3VudGVyc19pbmZvIHRtcCwgKnBhZGRjOworCXN0cnVjdCB4dF9jb3VudGVyc19pbmZvIHRtcCwgKnBhZGRjOwogCXN0cnVjdCBhcnB0X3RhYmxlICp0OworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOwogCWludCByZXQgPSAwOwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlciwgc2l6ZW9mKHRtcCkpICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKGxlbiAhPSBzaXplb2YodG1wKSArIHRtcC5udW1fY291bnRlcnMqc2l6ZW9mKHN0cnVjdCBhcnB0X2NvdW50ZXJzKSkKKwlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLm51bV9jb3VudGVycypzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYWRkYyA9IHZtYWxsb2MobGVuKTsKQEAgLTExMTEsMjkgKzkyNiwzMCBAQAogCQlnb3RvIGZyZWU7CiAJfQogCi0JdCA9IGZpbmRfdGFibGVfbG9jayh0bXAubmFtZSk7CisJdCA9IHh0X2ZpbmRfdGFibGVfbG9jayhORl9BUlAsIHRtcC5uYW1lKTsKIAlpZiAoIXQgfHwgSVNfRVJSKHQpKSB7CiAJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKIAkJZ290byBmcmVlOwogCX0KIAogCXdyaXRlX2xvY2tfYmgoJnQtPmxvY2spOwotCWlmICh0LT5wcml2YXRlLT5udW1iZXIgIT0gcGFkZGMtPm51bV9jb3VudGVycykgeworCXByaXZhdGUgPSB0LT5wcml2YXRlOworCWlmIChwcml2YXRlLT5udW1iZXIgIT0gcGFkZGMtPm51bV9jb3VudGVycykgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIHVubG9ja191cF9mcmVlOwogCX0KIAogCWkgPSAwOwogCS8qIENob29zZSB0aGUgY29weSB0aGF0IGlzIG9uIG91ciBub2RlICovCi0JbG9jX2NwdV9lbnRyeSA9IHQtPnByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlsb2NfY3B1X2VudHJ5ID0gcHJpdmF0ZS0+ZW50cmllc1tzbXBfcHJvY2Vzc29yX2lkKCldOwogCUFSUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LAotCQkJICAgdC0+cHJpdmF0ZS0+c2l6ZSwKKwkJCSAgIHByaXZhdGUtPnNpemUsCiAJCQkgICBhZGRfY291bnRlcl90b19lbnRyeSwKIAkJCSAgIHBhZGRjLT5jb3VudGVycywKIAkJCSAgICZpKTsKICB1bmxvY2tfdXBfZnJlZToKIAl3cml0ZV91bmxvY2tfYmgoJnQtPmxvY2spOwotCXVwKCZhcnB0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAJbW9kdWxlX3B1dCh0LT5tZSk7CiAgZnJlZToKIAl2ZnJlZShwYWRkYyk7CkBAIC0xMTkwLDI1ICsxMDA2LDI2IEBACiAJCX0KIAkJbmFtZVtBUlBUX1RBQkxFX01BWE5BTUVMRU4tMV0gPSAnXDAnOwogCi0JCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhYmxlX2xvY2sobmFtZSksCisJCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhYmxlX2xvY2soTkZfQVJQLCBuYW1lKSwKIAkJCQkJICAgICJhcnB0YWJsZV8lcyIsIG5hbWUpOwogCQlpZiAodCAmJiAhSVNfRVJSKHQpKSB7CiAJCQlzdHJ1Y3QgYXJwdF9nZXRpbmZvIGluZm87CisJCQlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHQtPnByaXZhdGU7CiAKIAkJCWluZm8udmFsaWRfaG9va3MgPSB0LT52YWxpZF9ob29rczsKLQkJCW1lbWNweShpbmZvLmhvb2tfZW50cnksIHQtPnByaXZhdGUtPmhvb2tfZW50cnksCisJCQltZW1jcHkoaW5mby5ob29rX2VudHJ5LCBwcml2YXRlLT5ob29rX2VudHJ5LAogCQkJICAgICAgIHNpemVvZihpbmZvLmhvb2tfZW50cnkpKTsKLQkJCW1lbWNweShpbmZvLnVuZGVyZmxvdywgdC0+cHJpdmF0ZS0+dW5kZXJmbG93LAorCQkJbWVtY3B5KGluZm8udW5kZXJmbG93LCBwcml2YXRlLT51bmRlcmZsb3csCiAJCQkgICAgICAgc2l6ZW9mKGluZm8udW5kZXJmbG93KSk7Ci0JCQlpbmZvLm51bV9lbnRyaWVzID0gdC0+cHJpdmF0ZS0+bnVtYmVyOwotCQkJaW5mby5zaXplID0gdC0+cHJpdmF0ZS0+c2l6ZTsKKwkJCWluZm8ubnVtX2VudHJpZXMgPSBwcml2YXRlLT5udW1iZXI7CisJCQlpbmZvLnNpemUgPSBwcml2YXRlLT5zaXplOwogCQkJc3RyY3B5KGluZm8ubmFtZSwgbmFtZSk7CiAKIAkJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJmluZm8sICpsZW4pICE9IDApCiAJCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWVsc2UKIAkJCQlyZXQgPSAwOwotCQkJdXAoJmFycHRfbXV0ZXgpOworCQkJeHRfdGFibGVfdW5sb2NrKHQpOwogCQkJbW9kdWxlX3B1dCh0LT5tZSk7CiAJCX0gZWxzZQogCQkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwpAQCAtMTIzMyw3ICsxMDUwLDcgQEAKIAl9CiAKIAljYXNlIEFSUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVDogewotCQlzdHJ1Y3QgYXJwdF9nZXRfcmV2aXNpb24gcmV2OworCQlzdHJ1Y3QgeHRfZ2V0X3JldmlzaW9uIHJldjsKIAogCQlpZiAoKmxlbiAhPSBzaXplb2YocmV2KSkgewogCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTEyNDQsOCArMTA2MSw4IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfcmV2aXNpb24ocmV2Lm5hbWUsIHJldi5yZXZpc2lvbiwKLQkJCQkJCSAgICAgIHRhcmdldF9yZXZmbiwgJnJldCksCisJCXRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfcmV2aXNpb24oTkZfQVJQLCByZXYubmFtZSwKKwkJCQkJCQkgcmV2LnJldmlzaW9uLCAxLCAmcmV0KSwKIAkJCQkJImFycHRfJXMiLCByZXYubmFtZSk7CiAJCWJyZWFrOwogCX0KQEAgLTEyNTgsMzggKzEwNzUsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCi1pbnQgYXJwdF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGFycHRfdGFyZ2V0ICp0YXJnZXQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmYXJwdF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCi0JbGlzdF9hZGQoJnRhcmdldC0+bGlzdCwgJmFycHRfdGFyZ2V0KTsKLQl1cCgmYXJwdF9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGFycHRfdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGFycHRfdGFyZ2V0ICp0YXJnZXQpCi17Ci0JZG93bigmYXJwdF9tdXRleCk7Ci0JTElTVF9ERUxFVEUoJmFycHRfdGFyZ2V0LCB0YXJnZXQpOwotCXVwKCZhcnB0X211dGV4KTsKLX0KLQogaW50IGFycHRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IGFycHRfdGFibGUgKnRhYmxlLAogCQkJY29uc3Qgc3RydWN0IGFycHRfcmVwbGFjZSAqcmVwbCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBhcnB0X3RhYmxlX2luZm8gKm5ld2luZm87Ci0Jc3RhdGljIHN0cnVjdCBhcnB0X3RhYmxlX2luZm8gYm9vdHN0cmFwCisJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm87CisJc3RhdGljIHN0cnVjdCB4dF90YWJsZV9pbmZvIGJvb3RzdHJhcAogCQk9IHsgMCwgMCwgMCwgeyAwIH0sIHsgMCB9LCB7IH0gfTsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCi0JbmV3aW5mbyA9IGFsbG9jX3RhYmxlX2luZm8ocmVwbC0+c2l6ZSk7CisJbmV3aW5mbyA9IHh0X2FsbG9jX3RhYmxlX2luZm8ocmVwbC0+c2l6ZSk7CiAJaWYgKCFuZXdpbmZvKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCXJldHVybiByZXQ7CkBAIC0xMzA0LDYwICsxMDk5LDMzIEBACiAJCQkgICAgICByZXBsLT5udW1fZW50cmllcywKIAkJCSAgICAgIHJlcGwtPmhvb2tfZW50cnksCiAJCQkgICAgICByZXBsLT51bmRlcmZsb3cpOworCiAJZHVwcmludGYoImFycHRfcmVnaXN0ZXJfdGFibGU6IHRyYW5zbGF0ZSB0YWJsZSBnaXZlcyAlZFxuIiwgcmV0KTsKIAlpZiAocmV0ICE9IDApIHsKLQkJZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOworCQl4dF9mcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZhcnB0X211dGV4KTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOworCWlmICh4dF9yZWdpc3Rlcl90YWJsZSh0YWJsZSwgJmJvb3RzdHJhcCwgbmV3aW5mbykgIT0gMCkgeworCQl4dF9mcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogRG9uJ3QgYXV0b2xvYWQ6IHdlJ2QgZWF0IG91ciB0YWlsLi4uICovCi0JaWYgKGxpc3RfbmFtZWRfZmluZCgmYXJwdF90YWJsZXMsIHRhYmxlLT5uYW1lKSkgewotCQlyZXQgPSAtRUVYSVNUOwotCQlnb3RvIGZyZWVfdW5sb2NrOwotCX0KLQotCS8qIFNpbXBsaWZpZXMgcmVwbGFjZV90YWJsZSBjb2RlLiAqLwotCXRhYmxlLT5wcml2YXRlID0gJmJvb3RzdHJhcDsKLQlpZiAoIXJlcGxhY2VfdGFibGUodGFibGUsIDAsIG5ld2luZm8sICZyZXQpKQotCQlnb3RvIGZyZWVfdW5sb2NrOwotCi0JZHVwcmludGYoInRhYmxlLT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKLQkJIHRhYmxlLT5wcml2YXRlLT5udW1iZXIpOwotCQotCS8qIHNhdmUgbnVtYmVyIG9mIGluaXRpYWwgZW50cmllcyAqLwotCXRhYmxlLT5wcml2YXRlLT5pbml0aWFsX2VudHJpZXMgPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOwotCi0Jcndsb2NrX2luaXQoJnRhYmxlLT5sb2NrKTsKLQlsaXN0X3ByZXBlbmQoJmFycHRfdGFibGVzLCB0YWJsZSk7Ci0KLSB1bmxvY2s6Ci0JdXAoJmFycHRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci0KLSBmcmVlX3VubG9jazoKLQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7Ci0JZ290byB1bmxvY2s7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgYXJwdF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBhcnB0X3RhYmxlICp0YWJsZSkKIHsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCi0JZG93bigmYXJwdF9tdXRleCk7Ci0JTElTVF9ERUxFVEUoJmFycHRfdGFibGVzLCB0YWJsZSk7Ci0JdXAoJmFycHRfbXV0ZXgpOworCXByaXZhdGUgPSB4dF91bnJlZ2lzdGVyX3RhYmxlKHRhYmxlKTsKIAogCS8qIERlY3JlYXNlIG1vZHVsZSB1c2FnZSBjb3VudHMgYW5kIGZyZWUgcmVzb3VyY2VzICovCi0JbG9jX2NwdV9lbnRyeSA9IHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwotCUFSUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LCB0YWJsZS0+cHJpdmF0ZS0+c2l6ZSwKKwlsb2NfY3B1X2VudHJ5ID0gcHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlBUlBUX0VOVFJZX0lURVJBVEUobG9jX2NwdV9lbnRyeSwgcHJpdmF0ZS0+c2l6ZSwKIAkJCSAgIGNsZWFudXBfZW50cnksIE5VTEwpOwotCWZyZWVfdGFibGVfaW5mbyh0YWJsZS0+cHJpdmF0ZSk7CisJeHRfZnJlZV90YWJsZV9pbmZvKHByaXZhdGUpOwogfQogCiAvKiBUaGUgYnVpbHQtaW4gdGFyZ2V0czogc3RhbmRhcmQgKE5VTEwpIGFuZCBlcnJvci4gKi8KQEAgLTEzODAsNTIgKzExNDgsMTUgQEAKIAkuZ2V0CQk9IGRvX2FycHRfZ2V0X2N0bCwKIH07CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIGlubGluZSBpbnQgcHJpbnRfbmFtZShjb25zdCBzdHJ1Y3QgYXJwdF90YWJsZSAqdCwKLQkJCSAgICAgb2ZmX3Qgc3RhcnRfb2Zmc2V0LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgsCi0JCQkgICAgIG9mZl90ICpwb3MsIHVuc2lnbmVkIGludCAqY291bnQpCi17Ci0JaWYgKCgqY291bnQpKysgPj0gc3RhcnRfb2Zmc2V0KSB7Ci0JCXVuc2lnbmVkIGludCBuYW1lbGVuOwotCi0JCW5hbWVsZW4gPSBzcHJpbnRmKGJ1ZmZlciArICpwb3MsICIlc1xuIiwgdC0+bmFtZSk7Ci0JCWlmICgqcG9zICsgbmFtZWxlbiA+IGxlbmd0aCkgewotCQkJLyogU3RvcCBpdGVyYXRpbmcgKi8KLQkJCXJldHVybiAxOwotCQl9Ci0JCSpwb3MgKz0gbmFtZWxlbjsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXJwdF9nZXRfdGFibGVzKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCi17Ci0Jb2ZmX3QgcG9zID0gMDsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXJwdF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlMSVNUX0ZJTkQoJmFycHRfdGFibGVzLCBwcmludF9uYW1lLCBzdHJ1Y3QgYXJwdF90YWJsZSAqLAotCQkgIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgsICZwb3MsICZjb3VudCk7Ci0KLQl1cCgmYXJwdF9tdXRleCk7Ci0KLQkvKiBgc3RhcnQnIGhhY2sgLSBzZWUgZnMvcHJvYy9nZW5lcmljLmMgbGluZSB+MTA1ICovCi0JKnN0YXJ0PShjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50LW9mZnNldCk7Ci0JcmV0dXJuIHBvczsKLX0KLSNlbmRpZiAvKkNPTkZJR19QUk9DX0ZTKi8KLQogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKKwl4dF9wcm90b19pbml0KE5GX0FSUCk7CisKIAkvKiBOb29uZSBlbHNlIHdpbGwgYmUgZG93bmluZyBzZW0gbm93LCBzbyB3ZSB3b24ndCBzbGVlcCAqLwotCWRvd24oJmFycHRfbXV0ZXgpOwotCWxpc3RfYXBwZW5kKCZhcnB0X3RhcmdldCwgJmFycHRfc3RhbmRhcmRfdGFyZ2V0KTsKLQlsaXN0X2FwcGVuZCgmYXJwdF90YXJnZXQsICZhcnB0X2Vycm9yX3RhcmdldCk7Ci0JdXAoJmFycHRfbXV0ZXgpOworCXh0X3JlZ2lzdGVyX3RhcmdldChORl9BUlAsICZhcnB0X3N0YW5kYXJkX3RhcmdldCk7CisJeHRfcmVnaXN0ZXJfdGFyZ2V0KE5GX0FSUCwgJmFycHRfZXJyb3JfdGFyZ2V0KTsKIAogCS8qIFJlZ2lzdGVyIHNldHNvY2tvcHQgKi8KIAlyZXQgPSBuZl9yZWdpc3Rlcl9zb2Nrb3B0KCZhcnB0X3NvY2tvcHRzKTsKQEAgLTE0MzQsMTkgKzExNjUsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JewotCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7Ci0KLQkJcHJvYyA9IHByb2NfbmV0X2NyZWF0ZSgiYXJwX3RhYmxlc19uYW1lcyIsIDAsIGFycHRfZ2V0X3RhYmxlcyk7Ci0JCWlmICghcHJvYykgewotCQkJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZhcnB0X3NvY2tvcHRzKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JfQotI2VuZGlmCi0KIAlwcmludGsoImFycF90YWJsZXM6IChDKSAyMDAyIERhdmlkIFMuIE1pbGxlclxuIik7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDU0LDE2ICsxMTcyLDEyIEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewogCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmYXJwdF9zb2Nrb3B0cyk7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQlwcm9jX25ldF9yZW1vdmUoImFycF90YWJsZXNfbmFtZXMiKTsKLSNlbmRpZgorCXh0X3Byb3RvX2ZpbmkoTkZfQVJQKTsKIH0KIAogRVhQT1JUX1NZTUJPTChhcnB0X3JlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woYXJwdF91bnJlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woYXJwdF9kb190YWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGFycHRfcmVnaXN0ZXJfdGFyZ2V0KTsKLUVYUE9SVF9TWU1CT0woYXJwdF91bnJlZ2lzdGVyX3RhcmdldCk7CiAKIG1vZHVsZV9pbml0KGluaXQpOwogbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdF9tYW5nbGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jCmluZGV4IDNlNTkyZWMuLmM5NzY1MGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0X21hbmdsZS5jCkBAIC04LDggKzgsOSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJhcnB0YWJsZXMgYXJwIHBheWxvYWQgbWFuZ2xlIHRhcmdldCIpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci10YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLCB1bnNpZ25lZCBpbnQgaG9va251bSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqdGFyZ2luZm8sIHZvaWQgKnVzZXJpbmZvKQordGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgdW5zaWduZWQgaW50IGhvb2tudW0sIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorICAgdm9pZCAqdXNlcmluZm8pCiB7CiAJY29uc3Qgc3RydWN0IGFycHRfbWFuZ2xlICptYW5nbGUgPSB0YXJnaW5mbzsKIAlzdHJ1Y3QgYXJwaGRyICphcnA7CkBAIC02NCw3ICs2NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCBzdHJ1Y3QgYXJwdF9lbnRyeSAqZSwgdm9pZCAqdGFyZ2luZm8sCitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqZSwgdm9pZCAqdGFyZ2luZm8sCiAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLCB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCWNvbnN0IHN0cnVjdCBhcnB0X21hbmdsZSAqbWFuZ2xlID0gdGFyZ2luZm87CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMKaW5kZXggMGQ3NTlmNS4uZjZhYjQ1ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0YWJsZV9maWx0ZXIuYwpAQCAtMTQ1LDYgKzE0NSw3IEBACiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKIAkucHJpdmF0ZQk9IE5VTEwsCiAJLm1lCQk9IFRISVNfTU9EVUxFLAorCS5hZgkJPSBORl9BUlAsCiB9OwogCiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKaW5kZXggOWRlYzEyOS4uODMzZmNiNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTk0NCw3ICs5NDQsNyBAQAogCiAvKiBTb21lIG1vZHVsZXMgbmVlZCB1cywgYnV0IGRvbid0IGRlcGVuZCBkaXJlY3RseSBvbiBhbnkgc3ltYm9sLgogICAgVGhleSBzaG91bGQgY2FsbCB0aGlzLiAqLwotdm9pZCBuZWVkX2lwX2Nvbm50cmFjayh2b2lkKQordm9pZCBuZWVkX2Nvbm50cmFjayh2b2lkKQogewogfQogCkBAIC05NjIsNyArOTYyLDcgQEAKIEVYUE9SVF9TWU1CT0woaW52ZXJ0X3R1cGxlcHIpOwogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfYWx0ZXJfcmVwbHkpOwogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfZGVzdHJveWVkKTsKLUVYUE9SVF9TWU1CT0wobmVlZF9pcF9jb25udHJhY2spOworRVhQT1JUX1NZTUJPTChuZWVkX2Nvbm50cmFjayk7CiBFWFBPUlRfU1lNQk9MKGlwX2Nvbm50cmFja19oZWxwZXJfcmVnaXN0ZXIpOwogRVhQT1JUX1NZTUJPTChpcF9jb25udHJhY2tfaGVscGVyX3VucmVnaXN0ZXIpOwogRVhQT1JUX1NZTUJPTChpcF9jdF9pdGVyYXRlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX25hdF9ydWxlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYwppbmRleCBjYjY2YjhiLi4xZGU4NjI4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3J1bGUuYwpAQCAtOTUsNiArOTUsNyBAQAogCS52YWxpZF9ob29rcwk9IE5BVF9WQUxJRF9IT09LUywKIAkubG9jawkJPSBSV19MT0NLX1VOTE9DS0VELAogCS5tZQkJPSBUSElTX01PRFVMRSwKKwkuYWYJCT0gQUZfSU5FVCwKIH07CiAKIC8qIFNvdXJjZSBOQVQgKi8KQEAgLTE2OCw3ICsxNjksNyBAQAogfQogCiBzdGF0aWMgaW50IGlwdF9zbmF0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAJCQkgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAJCQkgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpAQCAtMjAxLDcgKzIwMiw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXB0X2RuYXRfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKIAkJCSAgICAgICB2b2lkICp0YXJnaW5mbywKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCmluZGV4IDhiOGExZjAuLmFkNDM4ZmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF9uYXRfc3RhbmRhbG9uZS5jCkBAIC0zNjQsNyArMzY0LDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAotCW5lZWRfaXBfY29ubnRyYWNrKCk7CisJbmVlZF9jb25udHJhY2soKTsKIAogCWlmICghaW5pdCkgZ290byBjbGVhbnVwOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKaW5kZXggODc3YmM5Ni4uMjM3MWIyMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwpAQCAtMiw3ICsyLDcgQEAKICAqIFBhY2tldCBtYXRjaGluZyBjb2RlLgogICoKICAqIENvcHlyaWdodCAoQykgMTk5OSBQYXVsIGBSdXN0eScgUnVzc2VsbCAmIE1pY2hhZWwgSi4gTmV1bGluZwotICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA1IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC0xMSw2ICsxMSw4IEBACiAgKiAxOSBKYW4gMjAwMiBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgogICogCS0gaW5jcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50IGFzIHNvb24gYXMgd2UgaGF2ZSBydWxlcyBpbnNpZGUKICAqIAkgIGEgdGFibGUKKyAqIDA4IE9jdCAyMDA1IEhhcmFsZCBXZWx0ZSA8bGFmb3JlQG5ldGZpbHRlci5vcmc+CisgKiAJLSBHZW5lcmFsaXplIGludG8gInhfdGFibGVzIiBsYXllciBhbmQgIntpcCxpcDYsYXJwfV90YWJsZXMiCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgpAQCAtMjAsOCArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC91ZHAuaD4KICNpbmNsdWRlIDxsaW51eC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpAQCAtNjIsMTQgKzYzLDYgQEAKICNlbHNlCiAjZGVmaW5lIElQX05GX0FTU0VSVCh4KQogI2VuZGlmCi0jZGVmaW5lIFNNUF9BTElHTih4KSAoKCh4KSArIFNNUF9DQUNIRV9CWVRFUy0xKSAmIH4oU01QX0NBQ0hFX0JZVEVTLTEpKQotCi1zdGF0aWMgREVDTEFSRV9NVVRFWChpcHRfbXV0ZXgpOwotCi0vKiBNdXN0IGhhdmUgbXV0ZXggKi8KLSNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KSBJUF9ORl9BU1NFUlQoZG93bl90cnlsb2NrKCZpcHRfbXV0ZXgpICE9IDApCi0jZGVmaW5lIEFTU0VSVF9XUklURV9MT0NLKHgpIElQX05GX0FTU0VSVChkb3duX3RyeWxvY2soJmlwdF9tdXRleCkgIT0gMCkKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9saXN0aGVscC5oPgogCiAjaWYgMAogLyogQWxsIHRoZSBiZXR0ZXIgdG8gZGVidWcgeW91IHdpdGguLi4gKi8KQEAgLTg2LDM2ICs3OSw2IEBACiAKICAgIEhlbmNlIHRoZSBzdGFydCBvZiBhbnkgdGFibGUgaXMgZ2l2ZW4gYnkgZ2V0X3RhYmxlKCkgYmVsb3cuICAqLwogCi0vKiBUaGUgdGFibGUgaXRzZWxmICovCi1zdHJ1Y3QgaXB0X3RhYmxlX2luZm8KLXsKLQkvKiBTaXplIHBlciB0YWJsZSAqLwotCXVuc2lnbmVkIGludCBzaXplOwotCS8qIE51bWJlciBvZiBlbnRyaWVzOiBGSVhNRS4gLS1SUiAqLwotCXVuc2lnbmVkIGludCBudW1iZXI7Ci0JLyogSW5pdGlhbCBudW1iZXIgb2YgZW50cmllcy4gTmVlZGVkIGZvciBtb2R1bGUgdXNhZ2UgY291bnQgKi8KLQl1bnNpZ25lZCBpbnQgaW5pdGlhbF9lbnRyaWVzOwotCi0JLyogRW50cnkgcG9pbnRzIGFuZCB1bmRlcmZsb3dzICovCi0JdW5zaWduZWQgaW50IGhvb2tfZW50cnlbTkZfSVBfTlVNSE9PS1NdOwotCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfSVBfTlVNSE9PS1NdOwotCi0JLyogaXB0X2VudHJ5IHRhYmxlczogb25lIHBlciBDUFUgKi8KLQl2b2lkICplbnRyaWVzW05SX0NQVVNdOwotfTsKLQotc3RhdGljIExJU1RfSEVBRChpcHRfdGFyZ2V0KTsKLXN0YXRpYyBMSVNUX0hFQUQoaXB0X21hdGNoKTsKLXN0YXRpYyBMSVNUX0hFQUQoaXB0X3RhYmxlcyk7Ci0jZGVmaW5lIFNFVF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ID0gKGIpOyAoYykucGNudCA9IChwKTsgfSB3aGlsZSgwKQotI2RlZmluZSBBRERfQ09VTlRFUihjLGIscCkgZG8geyAoYykuYmNudCArPSAoYik7IChjKS5wY250ICs9IChwKTsgfSB3aGlsZSgwKQotCi0jaWYgMAotI2RlZmluZSBkb3duKHgpIGRvIHsgcHJpbnRrKCJET1dOOiV1OiIgI3ggIlxuIiwgX19MSU5FX18pOyBkb3duKHgpOyB9IHdoaWxlKDApCi0jZGVmaW5lIGRvd25faW50ZXJydXB0aWJsZSh4KSAoeyBpbnQgX19yOyBwcmludGsoIkRPV05pOiV1OiIgI3ggIlxuIiwgX19MSU5FX18pOyBfX3IgPSBkb3duX2ludGVycnVwdGlibGUoeCk7IGlmIChfX3IgIT0gMCkgcHJpbnRrKCJBQk9SVC1ET1dOaToldVxuIiwgX19MSU5FX18pOyBfX3I7IH0pCi0jZGVmaW5lIHVwKHgpIGRvIHsgcHJpbnRrKCJVUDoldToiICN4ICJcbiIsIF9fTElORV9fKTsgdXAoeCk7IH0gd2hpbGUoMCkKLSNlbmRpZgotCiAvKiBSZXR1cm5zIHdoZXRoZXIgbWF0Y2hlcyBydWxlIG9yIG5vdC4gKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBpcF9wYWNrZXRfbWF0Y2goY29uc3Qgc3RydWN0IGlwaGRyICppcCwKQEAgLTIzNCw3ICsxOTcsOCBAQAogCSAgICAgaW50ICpob3Rkcm9wKQogewogCS8qIFN0b3AgaXRlcmF0aW9uIGlmIGl0IGRvZXNuJ3QgbWF0Y2ggKi8KLQlpZiAoIW0tPnUua2VybmVsLm1hdGNoLT5tYXRjaChza2IsIGluLCBvdXQsIG0tPmRhdGEsIG9mZnNldCwgaG90ZHJvcCkpCisJaWYgKCFtLT51Lmtlcm5lbC5tYXRjaC0+bWF0Y2goc2tiLCBpbiwgb3V0LCBtLT5kYXRhLCBvZmZzZXQsIAorCSAgICBza2ItPm5oLmlwaC0+aWhsKjQsIGhvdGRyb3ApKQogCQlyZXR1cm4gMTsKIAllbHNlCiAJCXJldHVybiAwOwpAQCAtMjY1LDYgKzIyOSw3IEBACiAJY29uc3QgY2hhciAqaW5kZXYsICpvdXRkZXY7CiAJdm9pZCAqdGFibGVfYmFzZTsKIAlzdHJ1Y3QgaXB0X2VudHJ5ICplLCAqYmFjazsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOwogCiAJLyogSW5pdGlhbGl6YXRpb24gKi8KIAlpcCA9ICgqcHNrYiktPm5oLmlwaDsKQEAgLTI4MSwyNCArMjQ2LDExIEBACiAKIAlyZWFkX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKIAlJUF9ORl9BU1NFUlQodGFibGUtPnZhbGlkX2hvb2tzICYgKDEgPDwgaG9vaykpOwotCXRhYmxlX2Jhc2UgPSAodm9pZCAqKXRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3NtcF9wcm9jZXNzb3JfaWQoKV07Ci0JZSA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCB0YWJsZS0+cHJpdmF0ZS0+aG9va19lbnRyeVtob29rXSk7Ci0KLSNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCi0JLyogQ2hlY2sgbm9vbmUgZWxzZSB1c2luZyBvdXIgdGFibGUgKi8KLQlpZiAoKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tICE9IDB4ZGVhZDU3YWMKLQkgICAgJiYgKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tICE9IDB4ZWVlZWVlZWMpIHsKLQkJcHJpbnRrKCJBU1NFUlQ6IENQVSAjJXUsICVzIGNvbWVmcm9tKCVwKSA9ICVYXG4iLAotCQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLAotCQkgICAgICAgdGFibGUtPm5hbWUsCi0JCSAgICAgICAmKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tLAotCQkgICAgICAgKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tKTsKLQl9Ci0JKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tID0gMHg1N2FjYzAwMTsKLSNlbmRpZgorCXRhYmxlX2Jhc2UgPSAodm9pZCAqKXByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwllID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHByaXZhdGUtPmhvb2tfZW50cnlbaG9va10pOwogCiAJLyogRm9yIHJldHVybiBmcm9tIGJ1aWx0aW4gY2hhaW4gKi8KLQliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHRhYmxlLT5wcml2YXRlLT51bmRlcmZsb3dbaG9va10pOworCWJhY2sgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgcHJpdmF0ZS0+dW5kZXJmbG93W2hvb2tdKTsKIAogCWRvIHsKIAkJSVBfTkZfQVNTRVJUKGUpOwpAQCAtMzg0LDkgKzMzNiw2IEBACiAJCX0KIAl9IHdoaWxlICghaG90ZHJvcCk7CiAKLSNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCi0JKChzdHJ1Y3QgaXB0X2VudHJ5ICopdGFibGVfYmFzZSktPmNvbWVmcm9tID0gMHhkZWFkNTdhYzsKLSNlbmRpZgogCXJlYWRfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CiAKICNpZmRlZiBERUJVR19BTExPV19BTEwKQEAgLTM5OCwxNDUgKzM0Nyw2IEBACiAjZW5kaWYKIH0KIAotLyoKLSAqIFRoZXNlIGFyZSB3ZWlyZCwgYnV0IG1vZHVsZSBsb2FkaW5nIG11c3Qgbm90IGJlIGRvbmUgd2l0aCBtdXRleAotICogaGVsZCAoc2luY2UgdGhleSB3aWxsIHJlZ2lzdGVyKSwgYW5kIHdlIGhhdmUgdG8gaGF2ZSBhIHNpbmdsZQotICogZnVuY3Rpb24gdG8gdXNlIHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKCkuCi0gKi8KLQotLyogRmluZCB0YWJsZSBieSBuYW1lLCBncmFicyBtdXRleCAmIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXB0X3RhYmxlICpmaW5kX3RhYmxlX2xvY2soY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgaXB0X3RhYmxlICp0OwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmaXB0X3RhYmxlcywgbGlzdCkKLQkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwICYmIHRyeV9tb2R1bGVfZ2V0KHQtPm1lKSkKLQkJCXJldHVybiB0OwotCXVwKCZpcHRfbXV0ZXgpOwotCXJldHVybiBOVUxMOwotfQotCi0vKiBGaW5kIG1hdGNoLCBncmFicyByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwdF9tYXRjaCAqZmluZF9tYXRjaChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgaXB0X21hdGNoICptOwotCWludCBlcnIgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXB0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmaXB0X21hdGNoLCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAobS0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKG0tPnJldmlzaW9uID09IHJldmlzaW9uKSB7Ci0JCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KG0tPm1lKSkgewotCQkJCQl1cCgmaXB0X211dGV4KTsKLQkJCQkJcmV0dXJuIG07Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJZXJyID0gLUVQUk9UT1RZUEU7IC8qIEZvdW5kIHNvbWV0aGluZy4gKi8KLQkJfQotCX0KLQl1cCgmaXB0X211dGV4KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi0vKiBGaW5kIHRhcmdldCwgZ3JhYnMgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcHRfdGFyZ2V0ICpmaW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgaXB0X3RhcmdldCAqdDsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmlwdF90YXJnZXQsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAodC0+cmV2aXNpb24gPT0gcmV2aXNpb24pIHsKLQkJCQlpZiAodHJ5X21vZHVsZV9nZXQodC0+bWUpKSB7Ci0JCQkJCXVwKCZpcHRfbXV0ZXgpOwotCQkJCQlyZXR1cm4gdDsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQllcnIgPSAtRVBST1RPVFlQRTsgLyogRm91bmQgc29tZXRoaW5nLiAqLwotCQl9Ci0JfQotCXVwKCZpcHRfbXV0ZXgpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLXN0cnVjdCBpcHRfdGFyZ2V0ICppcHRfZmluZF90YXJnZXQoY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCi17Ci0Jc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldDsKLQotCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFyZ2V0KG5hbWUsIHJldmlzaW9uKSwKLQkJCQkJICJpcHRfJXMiLCBuYW1lKTsKLQlpZiAoSVNfRVJSKHRhcmdldCkgfHwgIXRhcmdldCkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHRhcmdldDsKLX0KLQotc3RhdGljIGludCBtYXRjaF9yZXZmbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwgaW50ICpiZXN0cCkKLXsKLQlzdHJ1Y3QgaXB0X21hdGNoICptOwotCWludCBoYXZlX3JldiA9IDA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZpcHRfbWF0Y2gsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcChtLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAobS0+cmV2aXNpb24gPiAqYmVzdHApCi0JCQkJKmJlc3RwID0gbS0+cmV2aXNpb247Ci0JCQlpZiAobS0+cmV2aXNpb24gPT0gcmV2aXNpb24pCi0JCQkJaGF2ZV9yZXYgPSAxOwotCQl9Ci0JfQotCXJldHVybiBoYXZlX3JldjsKLX0KLQotc3RhdGljIGludCB0YXJnZXRfcmV2Zm4oY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCAqYmVzdHApCi17Ci0Jc3RydWN0IGlwdF90YXJnZXQgKnQ7Ci0JaW50IGhhdmVfcmV2ID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmlwdF90YXJnZXQsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAodC0+cmV2aXNpb24gPiAqYmVzdHApCi0JCQkJKmJlc3RwID0gdC0+cmV2aXNpb247Ci0JCQlpZiAodC0+cmV2aXNpb24gPT0gcmV2aXNpb24pCi0JCQkJaGF2ZV9yZXYgPSAxOwotCQl9Ci0JfQotCXJldHVybiBoYXZlX3JldjsKLX0KLQotLyogUmV0dXJucyB0cnVlIG9yIGZhbHNlIChpZiBubyBzdWNoIGV4dGVuc2lvbiBhdCBhbGwpICovCi1zdGF0aWMgaW5saW5lIGludCBmaW5kX3JldmlzaW9uKGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLAotCQkJCWludCAoKnJldmZuKShjb25zdCBjaGFyICosIHU4LCBpbnQgKiksCi0JCQkJaW50ICplcnIpCi17Ci0JaW50IGhhdmVfcmV2LCBiZXN0ID0gLTE7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpICE9IDApIHsKLQkJKmVyciA9IC1FSU5UUjsKLQkJcmV0dXJuIDE7Ci0JfQotCWhhdmVfcmV2ID0gcmV2Zm4obmFtZSwgcmV2aXNpb24sICZiZXN0KTsKLQl1cCgmaXB0X211dGV4KTsKLQotCS8qIE5vdGhpbmcgYXQgYWxsPyAgUmV0dXJuIDAgdG8gdHJ5IGxvYWRpbmcgbW9kdWxlLiAqLwotCWlmIChiZXN0ID09IC0xKSB7Ci0JCSplcnIgPSAtRU5PRU5UOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkqZXJyID0gYmVzdDsKLQlpZiAoIWhhdmVfcmV2KQotCQkqZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKLQlyZXR1cm4gMTsKLX0KLQotCiAvKiBBbGwgemVyb2VzID09IHVuY29uZGl0aW9uYWwgcnVsZS4gKi8KIHN0YXRpYyBpbmxpbmUgaW50CiB1bmNvbmRpdGlvbmFsKGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwKQpAQCAtNTUzLDcgKzM2Myw3IEBACiAvKiBGaWd1cmVzIG91dCBmcm9tIHdoYXQgaG9vayBlYWNoIHJ1bGUgY2FuIGJlIGNhbGxlZDogcmV0dXJucyAwIGlmCiAgICB0aGVyZSBhcmUgbG9vcHMuICBQdXRzIGhvb2sgYml0bWFzayBpbiBjb21lZnJvbS4gKi8KIHN0YXRpYyBpbnQKLW1hcmtfc291cmNlX2NoYWlucyhzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm8sCittYXJrX3NvdXJjZV9jaGFpbnMoc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sCiAJCSAgIHVuc2lnbmVkIGludCB2YWxpZF9ob29rcywgdm9pZCAqZW50cnkwKQogewogCXVuc2lnbmVkIGludCBob29rOwpAQCAtNjk5LDcgKzUwOSw3IEBACiB7CiAJc3RydWN0IGlwdF9tYXRjaCAqbWF0Y2g7CiAKLQltYXRjaCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfbWF0Y2gobS0+dS51c2VyLm5hbWUsCisJbWF0Y2ggPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX21hdGNoKEFGX0lORVQsIG0tPnUudXNlci5uYW1lLAogCQkJCQkJICAgbS0+dS51c2VyLnJldmlzaW9uKSwKIAkJCQkJImlwdF8lcyIsIG0tPnUudXNlci5uYW1lKTsKIAlpZiAoSVNfRVJSKG1hdGNoKSB8fCAhbWF0Y2gpIHsKQEAgLTc0NCw3ICs1NTQsOCBAQAogCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKIAogCXQgPSBpcHRfZ2V0X3RhcmdldChlKTsKLQl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhcmdldCh0LT51LnVzZXIubmFtZSwKKwl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChBRl9JTkVULAorCQkJCQkJICAgICB0LT51LnVzZXIubmFtZSwKIAkJCQkJCSAgICAgdC0+dS51c2VyLnJldmlzaW9uKSwKIAkJCQkJICJpcHRfJXMiLCB0LT51LnVzZXIubmFtZSk7CiAJaWYgKElTX0VSUih0YXJnZXQpIHx8ICF0YXJnZXQpIHsKQEAgLTc4MSw3ICs1OTIsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludAogY2hlY2tfZW50cnlfc2l6ZV9hbmRfaG9va3Moc3RydWN0IGlwdF9lbnRyeSAqZSwKLQkJCSAgIHN0cnVjdCBpcHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkJCSAgIHN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAogCQkJICAgdW5zaWduZWQgY2hhciAqYmFzZSwKIAkJCSAgIHVuc2lnbmVkIGNoYXIgKmxpbWl0LAogCQkJICAgY29uc3QgdW5zaWduZWQgaW50ICpob29rX2VudHJpZXMsCkBAIC04MTUsNyArNjI2LDcgQEAKICAgICAgICAgICAgPCAwIChub3QgSVBUX1JFVFVSTikuIC0tUlIgKi8KIAogCS8qIENsZWFyIGNvdW50ZXJzIGFuZCBjb21lZnJvbSAqLwotCWUtPmNvdW50ZXJzID0gKChzdHJ1Y3QgaXB0X2NvdW50ZXJzKSB7IDAsIDAgfSk7CisJZS0+Y291bnRlcnMgPSAoKHN0cnVjdCB4dF9jb3VudGVycykgeyAwLCAwIH0pOwogCWUtPmNvbWVmcm9tID0gMDsKIAogCSgqaSkrKzsKQEAgLTg0NSw3ICs2NTYsNyBAQAogc3RhdGljIGludAogdHJhbnNsYXRlX3RhYmxlKGNvbnN0IGNoYXIgKm5hbWUsCiAJCXVuc2lnbmVkIGludCB2YWxpZF9ob29rcywKLQkJc3RydWN0IGlwdF90YWJsZV9pbmZvICpuZXdpbmZvLAorCQlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKIAkJdm9pZCAqZW50cnkwLAogCQl1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJdW5zaWduZWQgaW50IG51bWJlciwKQEAgLTkyMiw0OCArNzMzLDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFibGVfaW5mbyAqCi1yZXBsYWNlX3RhYmxlKHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlLAotCSAgICAgIHVuc2lnbmVkIGludCBudW1fY291bnRlcnMsCi0JICAgICAgc3RydWN0IGlwdF90YWJsZV9pbmZvICpuZXdpbmZvLAotCSAgICAgIGludCAqZXJyb3IpCi17Ci0Jc3RydWN0IGlwdF90YWJsZV9pbmZvICpvbGRpbmZvOwotCi0jaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwotCXsKLQkJaW50IGNwdTsKLQotCQlmb3JfZWFjaF9jcHUoY3B1KSB7Ci0JCQlzdHJ1Y3QgaXB0X2VudHJ5ICp0YWJsZV9iYXNlID0gbmV3aW5mby0+ZW50cmllc1tjcHVdOwotCQkJaWYgKHRhYmxlX2Jhc2UpCi0JCQkJdGFibGVfYmFzZS0+Y29tZWZyb20gPSAweGRlYWQ1N2FjOwotCQl9Ci0JfQotI2VuZGlmCi0KLQkvKiBEbyB0aGUgc3Vic3RpdHV0aW9uLiAqLwotCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQkvKiBDaGVjayBpbnNpZGUgbG9jazogaXMgdGhlIG9sZCBudW1iZXIgY29ycmVjdD8gKi8KLQlpZiAobnVtX2NvdW50ZXJzICE9IHRhYmxlLT5wcml2YXRlLT5udW1iZXIpIHsKLQkJZHVwcmludGYoIm51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyICgldS8ldSlcbiIsCi0JCQkgbnVtX2NvdW50ZXJzLCB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JCSplcnJvciA9IC1FQUdBSU47Ci0JCXJldHVybiBOVUxMOwotCX0KLQlvbGRpbmZvID0gdGFibGUtPnByaXZhdGU7Ci0JdGFibGUtPnByaXZhdGUgPSBuZXdpbmZvOwotCW5ld2luZm8tPmluaXRpYWxfZW50cmllcyA9IG9sZGluZm8tPmluaXRpYWxfZW50cmllczsKLQl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQotCXJldHVybiBvbGRpbmZvOwotfQotCiAvKiBHZXRzIGNvdW50ZXJzLiAqLwogc3RhdGljIGlubGluZSBpbnQKIGFkZF9lbnRyeV90b19jb3VudGVyKGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCi0JCSAgICAgc3RydWN0IGlwdF9jb3VudGVycyB0b3RhbFtdLAorCQkgICAgIHN0cnVjdCB4dF9jb3VudGVycyB0b3RhbFtdLAogCQkgICAgIHVuc2lnbmVkIGludCAqaSkKIHsKIAlBRERfQ09VTlRFUih0b3RhbFsqaV0sIGUtPmNvdW50ZXJzLmJjbnQsIGUtPmNvdW50ZXJzLnBjbnQpOwpAQCAtOTg0LDggKzc1Nyw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1nZXRfY291bnRlcnMoY29uc3Qgc3RydWN0IGlwdF90YWJsZV9pbmZvICp0LAotCSAgICAgc3RydWN0IGlwdF9jb3VudGVycyBjb3VudGVyc1tdKQorZ2V0X2NvdW50ZXJzKGNvbnN0IHN0cnVjdCB4dF90YWJsZV9pbmZvICp0LAorCSAgICAgc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzW10pCiB7CiAJdW5zaWduZWQgaW50IGNwdTsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTEwMjQsMTQgKzc5NywxNSBAQAogewogCXVuc2lnbmVkIGludCBvZmYsIG51bSwgY291bnRlcnNpemU7CiAJc3RydWN0IGlwdF9lbnRyeSAqZTsKLQlzdHJ1Y3QgaXB0X2NvdW50ZXJzICpjb3VudGVyczsKKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CiAJaW50IHJldCA9IDA7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIAogCS8qIFdlIG5lZWQgYXRvbWljIHNuYXBzaG90IG9mIGNvdW50ZXJzOiByZXN0IGRvZXNuJ3QgY2hhbmdlCiAJICAgKG90aGVyIHRoYW4gY29tZWZyb20sIHdoaWNoIHVzZXJzcGFjZSBkb2Vzbid0IGNhcmUKIAkgICBhYm91dCkuICovCi0JY291bnRlcnNpemUgPSBzaXplb2Yoc3RydWN0IGlwdF9jb3VudGVycykgKiB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOworCWNvdW50ZXJzaXplID0gc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykgKiBwcml2YXRlLT5udW1iZXI7CiAJY291bnRlcnMgPSB2bWFsbG9jX25vZGUoY291bnRlcnNpemUsIG51bWFfbm9kZV9pZCgpKTsKIAogCWlmIChjb3VudGVycyA9PSBOVUxMKQpAQCAtMTAzOSwxNCArODEzLDE0IEBACiAKIAkvKiBGaXJzdCwgc3VtIGNvdW50ZXJzLi4uICovCiAJd3JpdGVfbG9ja19iaCgmdGFibGUtPmxvY2spOwotCWdldF9jb3VudGVycyh0YWJsZS0+cHJpdmF0ZSwgY291bnRlcnMpOworCWdldF9jb3VudGVycyhwcml2YXRlLCBjb3VudGVycyk7CiAJd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7CiAKIAkvKiBjaG9vc2UgdGhlIGNvcHkgdGhhdCBpcyBvbiBvdXIgbm9kZS9jcHUsIC4uLgogCSAqIFRoaXMgY2hvaWNlIGlzIGxhenkgKGJlY2F1c2UgY3VycmVudCB0aHJlYWQgaXMKIAkgKiBhbGxvd2VkIHRvIG1pZ3JhdGUgdG8gYW5vdGhlciBjcHUpCiAJICovCi0JbG9jX2NwdV9lbnRyeSA9IHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCS8qIC4uLiB0aGVuIGNvcHkgZW50aXJlIHRoaW5nIC4uLiAqLwogCWlmIChjb3B5X3RvX3VzZXIodXNlcnB0ciwgbG9jX2NwdV9lbnRyeSwgdG90YWxfc2l6ZSkgIT0gMCkgewogCQlyZXQgPSAtRUZBVUxUOwpAQCAtMTEwOCw3NCArODgyLDM2IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgaXB0X3RhYmxlICp0OwogCi0JdCA9IGZpbmRfdGFibGVfbG9jayhlbnRyaWVzLT5uYW1lKTsKKwl0ID0geHRfZmluZF90YWJsZV9sb2NrKEFGX0lORVQsIGVudHJpZXMtPm5hbWUpOwogCWlmICh0ICYmICFJU19FUlIodCkpIHsKKwkJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0LT5wcml2YXRlOwogCQlkdXByaW50ZigidC0+cHJpdmF0ZS0+bnVtYmVyID0gJXVcbiIsCi0JCQkgdC0+cHJpdmF0ZS0+bnVtYmVyKTsKLQkJaWYgKGVudHJpZXMtPnNpemUgPT0gdC0+cHJpdmF0ZS0+c2l6ZSkKLQkJCXJldCA9IGNvcHlfZW50cmllc190b191c2VyKHQtPnByaXZhdGUtPnNpemUsCisJCQkgcHJpdmF0ZS0+bnVtYmVyKTsKKwkJaWYgKGVudHJpZXMtPnNpemUgPT0gcHJpdmF0ZS0+c2l6ZSkKKwkJCXJldCA9IGNvcHlfZW50cmllc190b191c2VyKHByaXZhdGUtPnNpemUsCiAJCQkJCQkgICB0LCB1cHRyLT5lbnRyeXRhYmxlKTsKIAkJZWxzZSB7CiAJCQlkdXByaW50ZigiZ2V0X2VudHJpZXM6IEkndmUgZ290ICV1IG5vdCAldSFcbiIsCi0JCQkJIHQtPnByaXZhdGUtPnNpemUsCisJCQkJIHByaXZhdGUtPnNpemUsCiAJCQkJIGVudHJpZXMtPnNpemUpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQogCQltb2R1bGVfcHV0KHQtPm1lKTsKLQkJdXAoJmlwdF9tdXRleCk7CisJCXh0X3RhYmxlX3VubG9jayh0KTsKIAl9IGVsc2UKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV90YWJsZV9pbmZvKHN0cnVjdCBpcHRfdGFibGVfaW5mbyAqaW5mbykKLXsKLQlpbnQgY3B1OwotCWZvcl9lYWNoX2NwdShjcHUpIHsKLQkJaWYgKGluZm8tPnNpemUgPD0gUEFHRV9TSVpFKQotCQkJa2ZyZWUoaW5mby0+ZW50cmllc1tjcHVdKTsKLQkJZWxzZQotCQkJdmZyZWUoaW5mby0+ZW50cmllc1tjcHVdKTsKLQl9Ci0Ja2ZyZWUoaW5mbyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKmFsbG9jX3RhYmxlX2luZm8odW5zaWduZWQgaW50IHNpemUpCi17Ci0Jc3RydWN0IGlwdF90YWJsZV9pbmZvICpuZXdpbmZvOwotCWludCBjcHU7Ci0KLQluZXdpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwdF90YWJsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdpbmZvKQotCQlyZXR1cm4gTlVMTDsKLQotCW5ld2luZm8tPnNpemUgPSBzaXplOwotCi0JZm9yX2VhY2hfY3B1KGNwdSkgewotCQlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCi0JCQluZXdpbmZvLT5lbnRyaWVzW2NwdV0gPSBrbWFsbG9jX25vZGUoc2l6ZSwKLQkJCQlHRlBfS0VSTkVMLAotCQkJCWNwdV90b19ub2RlKGNwdSkpOwotCQllbHNlCi0JCQluZXdpbmZvLT5lbnRyaWVzW2NwdV0gPSB2bWFsbG9jX25vZGUoc2l6ZSwgY3B1X3RvX25vZGUoY3B1KSk7Ci0JCWlmIChuZXdpbmZvLT5lbnRyaWVzW2NwdV0gPT0gMCkgewotCQkJZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbmV3aW5mbzsKLX0KLQogc3RhdGljIGludAogZG9fcmVwbGFjZSh2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBpcHRfcmVwbGFjZSB0bXA7CiAJc3RydWN0IGlwdF90YWJsZSAqdDsKLQlzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gKm5ld2luZm8sICpvbGRpbmZvOwotCXN0cnVjdCBpcHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLCAqb2xkaW5mbzsKKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOwogCXZvaWQgKmxvY19jcHVfZW50cnksICpsb2NfY3B1X29sZF9lbnRyeTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmdG1wLCB1c2VyLCBzaXplb2YodG1wKSkgIT0gMCkKQEAgLTExODUsMTEgKzkyMSw3IEBACiAJaWYgKGxlbiAhPSBzaXplb2YodG1wKSArIHRtcC5zaXplKQogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCi0JLyogUGVkYW50cnk6IHByZXZlbnQgdGhlbSBmcm9tIGhpdHRpbmcgQlVHKCkgaW4gdm1hbGxvYy5jIC0tUlIgKi8KLQlpZiAoKFNNUF9BTElHTih0bXAuc2l6ZSkgPj4gUEFHRV9TSElGVCkgKyAyID4gbnVtX3BoeXNwYWdlcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQluZXdpbmZvID0gYWxsb2NfdGFibGVfaW5mbyh0bXAuc2l6ZSk7CisJbmV3aW5mbyA9IHh0X2FsbG9jX3RhYmxlX2luZm8odG1wLnNpemUpOwogCWlmICghbmV3aW5mbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEyMDEsNyArOTMzLDcgQEAKIAkJZ290byBmcmVlX25ld2luZm87CiAJfQogCi0JY291bnRlcnMgPSB2bWFsbG9jKHRtcC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IGlwdF9jb3VudGVycykpOworCWNvdW50ZXJzID0gdm1hbGxvYyh0bXAubnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykpOwogCWlmICghY291bnRlcnMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmcmVlX25ld2luZm87CkBAIC0xMjE1LDcgKzk0Nyw3IEBACiAKIAlkdXByaW50ZigiaXBfdGFibGVzOiBUcmFuc2xhdGVkIHRhYmxlXG4iKTsKIAotCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhYmxlX2xvY2sodG1wLm5hbWUpLAorCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhYmxlX2xvY2soQUZfSU5FVCwgdG1wLm5hbWUpLAogCQkJCSAgICAiaXB0YWJsZV8lcyIsIHRtcC5uYW1lKTsKIAlpZiAoIXQgfHwgSVNfRVJSKHQpKSB7CiAJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKQEAgLTEyMzAsNyArOTYyLDcgQEAKIAkJZ290byBwdXRfbW9kdWxlOwogCX0KIAotCW9sZGluZm8gPSByZXBsYWNlX3RhYmxlKHQsIHRtcC5udW1fY291bnRlcnMsIG5ld2luZm8sICZyZXQpOworCW9sZGluZm8gPSB4dF9yZXBsYWNlX3RhYmxlKHQsIHRtcC5udW1fY291bnRlcnMsIG5ld2luZm8sICZyZXQpOwogCWlmICghb2xkaW5mbykKIAkJZ290byBwdXRfbW9kdWxlOwogCkBAIC0xMjQ5LDIzICs5ODEsMjMgQEAKIAkvKiBEZWNyZWFzZSBtb2R1bGUgdXNhZ2UgY291bnRzIGFuZCBmcmVlIHJlc291cmNlICovCiAJbG9jX2NwdV9vbGRfZW50cnkgPSBvbGRpbmZvLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwogCUlQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfb2xkX2VudHJ5LCBvbGRpbmZvLT5zaXplLCBjbGVhbnVwX2VudHJ5LE5VTEwpOwotCWZyZWVfdGFibGVfaW5mbyhvbGRpbmZvKTsKKwl4dF9mcmVlX3RhYmxlX2luZm8ob2xkaW5mbyk7CiAJaWYgKGNvcHlfdG9fdXNlcih0bXAuY291bnRlcnMsIGNvdW50ZXJzLAotCQkJIHNpemVvZihzdHJ1Y3QgaXB0X2NvdW50ZXJzKSAqIHRtcC5udW1fY291bnRlcnMpICE9IDApCisJCQkgc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykgKiB0bXAubnVtX2NvdW50ZXJzKSAhPSAwKQogCQlyZXQgPSAtRUZBVUxUOwogCXZmcmVlKGNvdW50ZXJzKTsKLQl1cCgmaXB0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAJcmV0dXJuIHJldDsKIAogIHB1dF9tb2R1bGU6CiAJbW9kdWxlX3B1dCh0LT5tZSk7Ci0JdXAoJmlwdF9tdXRleCk7CisJeHRfdGFibGVfdW5sb2NrKHQpOwogIGZyZWVfbmV3aW5mb19jb3VudGVyc191bnRyYW5zOgogCUlQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIG5ld2luZm8tPnNpemUsIGNsZWFudXBfZW50cnksTlVMTCk7CiAgZnJlZV9uZXdpbmZvX2NvdW50ZXJzOgogCXZmcmVlKGNvdW50ZXJzKTsKICBmcmVlX25ld2luZm86Ci0JZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOworCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjczLDcgKzEwMDUsNyBAQAogICogYW5kIGV2ZXJ5dGhpbmcgaXMgT0suICovCiBzdGF0aWMgaW5saW5lIGludAogYWRkX2NvdW50ZXJfdG9fZW50cnkoc3RydWN0IGlwdF9lbnRyeSAqZSwKLQkJICAgICBjb25zdCBzdHJ1Y3QgaXB0X2NvdW50ZXJzIGFkZG1lW10sCisJCSAgICAgY29uc3Qgc3RydWN0IHh0X2NvdW50ZXJzIGFkZG1lW10sCiAJCSAgICAgdW5zaWduZWQgaW50ICppKQogewogI2lmIDAKQEAgLTEyOTUsMTUgKzEwMjcsMTYgQEAKIGRvX2FkZF9jb3VudGVycyh2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgaXB0X2NvdW50ZXJzX2luZm8gdG1wLCAqcGFkZGM7CisJc3RydWN0IHh0X2NvdW50ZXJzX2luZm8gdG1wLCAqcGFkZGM7CiAJc3RydWN0IGlwdF90YWJsZSAqdDsKKwlzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqcHJpdmF0ZTsKIAlpbnQgcmV0ID0gMDsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChsZW4gIT0gc2l6ZW9mKHRtcCkgKyB0bXAubnVtX2NvdW50ZXJzKnNpemVvZihzdHJ1Y3QgaXB0X2NvdW50ZXJzKSkKKwlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLm51bV9jb3VudGVycypzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYWRkYyA9IHZtYWxsb2Nfbm9kZShsZW4sIG51bWFfbm9kZV9pZCgpKTsKQEAgLTEzMTUsMjkgKzEwNDgsMzAgQEAKIAkJZ290byBmcmVlOwogCX0KIAotCXQgPSBmaW5kX3RhYmxlX2xvY2sodG1wLm5hbWUpOworCXQgPSB4dF9maW5kX3RhYmxlX2xvY2soQUZfSU5FVCwgdG1wLm5hbWUpOwogCWlmICghdCB8fCBJU19FUlIodCkpIHsKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwogCQlnb3RvIGZyZWU7CiAJfQogCiAJd3JpdGVfbG9ja19iaCgmdC0+bG9jayk7Ci0JaWYgKHQtPnByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CisJcHJpdmF0ZSA9IHQtPnByaXZhdGU7CisJaWYgKHByaXZhdGUtPm51bWJlciAhPSBwYWRkYy0+bnVtX2NvdW50ZXJzKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gdW5sb2NrX3VwX2ZyZWU7CiAJfQogCiAJaSA9IDA7CiAJLyogQ2hvb3NlIHRoZSBjb3B5IHRoYXQgaXMgb24gb3VyIG5vZGUgKi8KLQlsb2NfY3B1X2VudHJ5ID0gdC0+cHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlsb2NfY3B1X2VudHJ5ID0gcHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKIAlJUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LAotCQkJICB0LT5wcml2YXRlLT5zaXplLAorCQkJICBwcml2YXRlLT5zaXplLAogCQkJICBhZGRfY291bnRlcl90b19lbnRyeSwKIAkJCSAgcGFkZGMtPmNvdW50ZXJzLAogCQkJICAmaSk7CiAgdW5sb2NrX3VwX2ZyZWU6CiAJd3JpdGVfdW5sb2NrX2JoKCZ0LT5sb2NrKTsKLQl1cCgmaXB0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAJbW9kdWxlX3B1dCh0LT5tZSk7CiAgZnJlZToKIAl2ZnJlZShwYWRkYyk7CkBAIC0xMzk2LDI1ICsxMTMwLDI2IEBACiAJCX0KIAkJbmFtZVtJUFRfVEFCTEVfTUFYTkFNRUxFTi0xXSA9ICdcMCc7CiAKLQkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFibGVfbG9jayhuYW1lKSwKKwkJdCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVULCBuYW1lKSwKIAkJCQkJICAgICJpcHRhYmxlXyVzIiwgbmFtZSk7CiAJCWlmICh0ICYmICFJU19FUlIodCkpIHsKIAkJCXN0cnVjdCBpcHRfZ2V0aW5mbyBpbmZvOworCQkJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGUgPSB0LT5wcml2YXRlOwogCiAJCQlpbmZvLnZhbGlkX2hvb2tzID0gdC0+dmFsaWRfaG9va3M7Ci0JCQltZW1jcHkoaW5mby5ob29rX2VudHJ5LCB0LT5wcml2YXRlLT5ob29rX2VudHJ5LAorCQkJbWVtY3B5KGluZm8uaG9va19lbnRyeSwgcHJpdmF0ZS0+aG9va19lbnRyeSwKIAkJCSAgICAgICBzaXplb2YoaW5mby5ob29rX2VudHJ5KSk7Ci0JCQltZW1jcHkoaW5mby51bmRlcmZsb3csIHQtPnByaXZhdGUtPnVuZGVyZmxvdywKKwkJCW1lbWNweShpbmZvLnVuZGVyZmxvdywgcHJpdmF0ZS0+dW5kZXJmbG93LAogCQkJICAgICAgIHNpemVvZihpbmZvLnVuZGVyZmxvdykpOwotCQkJaW5mby5udW1fZW50cmllcyA9IHQtPnByaXZhdGUtPm51bWJlcjsKLQkJCWluZm8uc2l6ZSA9IHQtPnByaXZhdGUtPnNpemU7CisJCQlpbmZvLm51bV9lbnRyaWVzID0gcHJpdmF0ZS0+bnVtYmVyOworCQkJaW5mby5zaXplID0gcHJpdmF0ZS0+c2l6ZTsKIAkJCW1lbWNweShpbmZvLm5hbWUsIG5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKIAogCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyLCAmaW5mbywgKmxlbikgIT0gMCkKIAkJCQlyZXQgPSAtRUZBVUxUOwogCQkJZWxzZQogCQkJCXJldCA9IDA7Ci0JCQl1cCgmaXB0X211dGV4KTsKKwkJCXh0X3RhYmxlX3VubG9jayh0KTsKIAkJCW1vZHVsZV9wdXQodC0+bWUpOwogCQl9IGVsc2UKIAkJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKQEAgLTE0NDEsNyArMTE3Niw3IEBACiAJY2FzZSBJUFRfU09fR0VUX1JFVklTSU9OX01BVENIOgogCWNhc2UgSVBUX1NPX0dFVF9SRVZJU0lPTl9UQVJHRVQ6IHsKIAkJc3RydWN0IGlwdF9nZXRfcmV2aXNpb24gcmV2OwotCQlpbnQgKCpyZXZmbikoY29uc3QgY2hhciAqLCB1OCwgaW50ICopOworCQlpbnQgdGFyZ2V0OwogCiAJCWlmICgqbGVuICE9IHNpemVvZihyZXYpKSB7CiAJCQlyZXQgPSAtRUlOVkFMOwpAQCAtMTQ1MywxMiArMTE4OCwxMyBAQAogCQl9CiAKIAkJaWYgKGNtZCA9PSBJUFRfU09fR0VUX1JFVklTSU9OX1RBUkdFVCkKLQkJCXJldmZuID0gdGFyZ2V0X3JldmZuOworCQkJdGFyZ2V0ID0gMTsKIAkJZWxzZQotCQkJcmV2Zm4gPSBtYXRjaF9yZXZmbjsKKwkJCXRhcmdldCA9IDA7CiAKLQkJdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF9yZXZpc2lvbihyZXYubmFtZSwgcmV2LnJldmlzaW9uLAotCQkJCQkJICAgICAgcmV2Zm4sICZyZXQpLAorCQl0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3JldmlzaW9uKEFGX0lORVQsIHJldi5uYW1lLAorCQkJCQkJCSByZXYucmV2aXNpb24sCisJCQkJCQkJIHRhcmdldCwgJnJldCksCiAJCQkJCSJpcHRfJXMiLCByZXYubmFtZSk7CiAJCWJyZWFrOwogCX0KQEAgLTE0NzEsNjAgKzEyMDcsMTUgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCi1pbnQKLWlwdF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCkKK2ludCBpcHRfcmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSwgY29uc3Qgc3RydWN0IGlwdF9yZXBsYWNlICpyZXBsKQogewogCWludCByZXQ7Ci0KLQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCWxpc3RfYWRkKCZ0YXJnZXQtPmxpc3QsICZpcHRfdGFyZ2V0KTsKLQl1cCgmaXB0X211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1pcHRfdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwdF90YXJnZXQgKnRhcmdldCkKLXsKLQlkb3duKCZpcHRfbXV0ZXgpOwotCUxJU1RfREVMRVRFKCZpcHRfdGFyZ2V0LCB0YXJnZXQpOwotCXVwKCZpcHRfbXV0ZXgpOwotfQotCi1pbnQKLWlwdF9yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXB0X21hdGNoICptYXRjaCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQotCWxpc3RfYWRkKCZtYXRjaC0+bGlzdCwgJmlwdF9tYXRjaCk7Ci0JdXAoJmlwdF9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1pcHRfdW5yZWdpc3Rlcl9tYXRjaChzdHJ1Y3QgaXB0X21hdGNoICptYXRjaCkKLXsKLQlkb3duKCZpcHRfbXV0ZXgpOwotCUxJU1RfREVMRVRFKCZpcHRfbWF0Y2gsIG1hdGNoKTsKLQl1cCgmaXB0X211dGV4KTsKLX0KLQotaW50IGlwdF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXB0X3RhYmxlICp0YWJsZSwgY29uc3Qgc3RydWN0IGlwdF9yZXBsYWNlICpyZXBsKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGlwdF90YWJsZV9pbmZvICpuZXdpbmZvOwotCXN0YXRpYyBzdHJ1Y3QgaXB0X3RhYmxlX2luZm8gYm9vdHN0cmFwCisJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm87CisJc3RhdGljIHN0cnVjdCB4dF90YWJsZV9pbmZvIGJvb3RzdHJhcAogCQk9IHsgMCwgMCwgMCwgeyAwIH0sIHsgMCB9LCB7IH0gfTsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCi0JbmV3aW5mbyA9IGFsbG9jX3RhYmxlX2luZm8ocmVwbC0+c2l6ZSk7CisJbmV3aW5mbyA9IHh0X2FsbG9jX3RhYmxlX2luZm8ocmVwbC0+c2l6ZSk7CiAJaWYgKCFuZXdpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTU0MCwyNDYgKzEyMzEsMjkgQEAKIAkJCSAgICAgIHJlcGwtPmhvb2tfZW50cnksCiAJCQkgICAgICByZXBsLT51bmRlcmZsb3cpOwogCWlmIChyZXQgIT0gMCkgewotCQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKKwlpZiAoeHRfcmVnaXN0ZXJfdGFibGUodGFibGUsICZib290c3RyYXAsIG5ld2luZm8pICE9IDApIHsKKwkJeHRfZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIERvbid0IGF1dG9sb2FkOiB3ZSdkIGVhdCBvdXIgdGFpbC4uLiAqLwotCWlmIChsaXN0X25hbWVkX2ZpbmQoJmlwdF90YWJsZXMsIHRhYmxlLT5uYW1lKSkgewotCQlyZXQgPSAtRUVYSVNUOwotCQlnb3RvIGZyZWVfdW5sb2NrOwotCX0KLQotCS8qIFNpbXBsaWZpZXMgcmVwbGFjZV90YWJsZSBjb2RlLiAqLwotCXRhYmxlLT5wcml2YXRlID0gJmJvb3RzdHJhcDsKLQlpZiAoIXJlcGxhY2VfdGFibGUodGFibGUsIDAsIG5ld2luZm8sICZyZXQpKQotCQlnb3RvIGZyZWVfdW5sb2NrOwotCi0JZHVwcmludGYoInRhYmxlLT5wcml2YXRlLT5udW1iZXIgPSAldVxuIiwKLQkJIHRhYmxlLT5wcml2YXRlLT5udW1iZXIpOwotCQotCS8qIHNhdmUgbnVtYmVyIG9mIGluaXRpYWwgZW50cmllcyAqLwotCXRhYmxlLT5wcml2YXRlLT5pbml0aWFsX2VudHJpZXMgPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyOwotCi0Jcndsb2NrX2luaXQoJnRhYmxlLT5sb2NrKTsKLQlsaXN0X3ByZXBlbmQoJmlwdF90YWJsZXMsIHRhYmxlKTsKLQotIHVubG9jazoKLQl1cCgmaXB0X211dGV4KTsKLQlyZXR1cm4gcmV0OwotCi0gZnJlZV91bmxvY2s6Ci0JZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwotCWdvdG8gdW5sb2NrOworCXJldHVybiAwOwogfQogCiB2b2lkIGlwdF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCBpcHRfdGFibGUgKnRhYmxlKQogeworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKLQlkb3duKCZpcHRfbXV0ZXgpOwotCUxJU1RfREVMRVRFKCZpcHRfdGFibGVzLCB0YWJsZSk7Ci0JdXAoJmlwdF9tdXRleCk7CisgCXByaXZhdGUgPSB4dF91bnJlZ2lzdGVyX3RhYmxlKHRhYmxlKTsKIAogCS8qIERlY3JlYXNlIG1vZHVsZSB1c2FnZSBjb3VudHMgYW5kIGZyZWUgcmVzb3VyY2VzICovCi0JbG9jX2NwdV9lbnRyeSA9IHRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOwotCUlQVF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIHRhYmxlLT5wcml2YXRlLT5zaXplLAotCQkJICBjbGVhbnVwX2VudHJ5LCBOVUxMKTsKLQlmcmVlX3RhYmxlX2luZm8odGFibGUtPnByaXZhdGUpOwotfQotCi0vKiBSZXR1cm5zIDEgaWYgdGhlIHBvcnQgaXMgbWF0Y2hlZCBieSB0aGUgcmFuZ2UsIDAgb3RoZXJ3aXNlICovCi1zdGF0aWMgaW5saW5lIGludAotcG9ydF9tYXRjaCh1X2ludDE2X3QgbWluLCB1X2ludDE2X3QgbWF4LCB1X2ludDE2X3QgcG9ydCwgaW50IGludmVydCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gKHBvcnQgPj0gbWluICYmIHBvcnQgPD0gbWF4KSBeIGludmVydDsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci10Y3BfZmluZF9vcHRpb24odV9pbnQ4X3Qgb3B0aW9uLAotCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQl1bnNpZ25lZCBpbnQgb3B0bGVuLAotCQlpbnQgaW52ZXJ0LAotCQlpbnQgKmhvdGRyb3ApCi17Ci0JLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCi0JdV9pbnQ4X3QgX29wdFs2MCAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKV0sICpvcDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWR1cHJpbnRmKCJ0Y3BfbWF0Y2g6IGZpbmRpbmcgb3B0aW9uXG4iKTsKLQotCWlmICghb3B0bGVuKQotCQlyZXR1cm4gaW52ZXJ0OwotCi0JLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KLQlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCi0JCQkJc2tiLT5uaC5pcGgtPmlobCo0ICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLAotCQkJCW9wdGxlbiwgX29wdCk7Ci0JaWYgKG9wID09IE5VTEwpIHsKLQkJKmhvdGRyb3AgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuOyApIHsKLQkJaWYgKG9wW2ldID09IG9wdGlvbikgcmV0dXJuICFpbnZlcnQ7Ci0JCWlmIChvcFtpXSA8IDIpIGkrKzsKLQkJZWxzZSBpICs9IG9wW2krMV0/OjE7Ci0JfQotCi0JcmV0dXJuIGludmVydDsKLX0KLQotc3RhdGljIGludAotdGNwX21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCSAgaW50IG9mZnNldCwKLQkgIGludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7Ci0JY29uc3Qgc3RydWN0IGlwdF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87Ci0KLQlpZiAob2Zmc2V0KSB7Ci0JCS8qIFRvIHF1b3RlIEFsYW46Ci0KLQkJICAgRG9uJ3QgYWxsb3cgYSBmcmFnbWVudCBvZiBUQ1AgOCBieXRlcyBpbi4gTm9ib2R5IG5vcm1hbAotCQkgICBjYXVzZXMgdGhpcy4gSXRzIGEgY3JhY2tlciB0cnlpbmcgdG8gYnJlYWsgaW4gYnkgZG9pbmcgYQotCQkgICBmbGFnIG92ZXJ3cml0ZSB0byBwYXNzIHRoZSBkaXJlY3Rpb24gY2hlY2tzLgotCQkqLwotCQlpZiAob2Zmc2V0ID09IDEpIHsKLQkJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MSBmcmFnLlxuIik7Ci0JCQkqaG90ZHJvcCA9IDE7Ci0JCX0KLQkJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KLQkJcmV0dXJuIDA7Ci0JfQotCi0jZGVmaW5lIEZXSU5WVENQKGJvb2wsaW52ZmxnKSAoKGJvb2wpIF4gISEodGNwaW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQotCi0JdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCi0JCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKLQlpZiAodGggPT0gTlVMTCkgewotCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQotCQkgICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCi0JCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghcG9ydF9tYXRjaCh0Y3BpbmZvLT5zcHRzWzBdLCB0Y3BpbmZvLT5zcHRzWzFdLAotCQkJbnRvaHModGgtPnNvdXJjZSksCi0JCQkhISh0Y3BpbmZvLT5pbnZmbGFncyAmIElQVF9UQ1BfSU5WX1NSQ1BUKSkpCi0JCXJldHVybiAwOwotCWlmICghcG9ydF9tYXRjaCh0Y3BpbmZvLT5kcHRzWzBdLCB0Y3BpbmZvLT5kcHRzWzFdLAotCQkJbnRvaHModGgtPmRlc3QpLAotCQkJISEodGNwaW5mby0+aW52ZmxhZ3MgJiBJUFRfVENQX0lOVl9EU1RQVCkpKQotCQlyZXR1cm4gMDsKLQlpZiAoIUZXSU5WVENQKCgoKHVuc2lnbmVkIGNoYXIgKil0aClbMTNdICYgdGNwaW5mby0+ZmxnX21hc2spCi0JCSAgICAgID09IHRjcGluZm8tPmZsZ19jbXAsCi0JCSAgICAgIElQVF9UQ1BfSU5WX0ZMQUdTKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHRjcGluZm8tPm9wdGlvbikgewotCQlpZiAodGgtPmRvZmYgKiA0IDwgc2l6ZW9mKF90Y3BoKSkgewotCQkJKmhvdGRyb3AgPSAxOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKCF0Y3BfZmluZF9vcHRpb24odGNwaW5mby0+b3B0aW9uLCBza2IsCi0JCQkJICAgICB0aC0+ZG9mZio0IC0gc2l6ZW9mKF90Y3BoKSwKLQkJCQkgICAgIHRjcGluZm8tPmludmZsYWdzICYgSVBUX1RDUF9JTlZfT1BUSU9OLAotCQkJCSAgICAgaG90ZHJvcCkpCi0JCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KLXN0YXRpYyBpbnQKLXRjcF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JICAgICAgIHZvaWQgKm1hdGNoaW5mbywKLQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKLQotCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBUQ1AsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCi0JcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX1RDUAotCQkmJiAhKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pCi0JCSYmIG1hdGNoc2l6ZSA9PSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdGNwKSkKLQkJJiYgISh0Y3BpbmZvLT5pbnZmbGFncyAmIH5JUFRfVENQX0lOVl9NQVNLKTsKLX0KLQotc3RhdGljIGludAotdWRwX21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCSAgaW50IG9mZnNldCwKLQkgIGludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7Ci0JY29uc3Qgc3RydWN0IGlwdF91ZHAgKnVkcGluZm8gPSBtYXRjaGluZm87Ci0KLQkvKiBNdXN0IG5vdCBiZSBhIGZyYWdtZW50LiAqLwotCWlmIChvZmZzZXQpCi0JCXJldHVybiAwOwotCi0JdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCi0JCQkJc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKLQlpZiAodWggPT0gTlVMTCkgewotCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQotCQkgICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCi0JCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFVEUCB0aW55Z3JhbS5cbiIpOwotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBwb3J0X21hdGNoKHVkcGluZm8tPnNwdHNbMF0sIHVkcGluZm8tPnNwdHNbMV0sCi0JCQkgIG50b2hzKHVoLT5zb3VyY2UpLAotCQkJICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIElQVF9VRFBfSU5WX1NSQ1BUKSkKLQkJJiYgcG9ydF9tYXRjaCh1ZHBpbmZvLT5kcHRzWzBdLCB1ZHBpbmZvLT5kcHRzWzFdLAotCQkJICAgICAgbnRvaHModWgtPmRlc3QpLAotCQkJICAgICAgISEodWRwaW5mby0+aW52ZmxhZ3MgJiBJUFRfVURQX0lOVl9EU1RQVCkpOwotfQotCi0vKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi1zdGF0aWMgaW50Ci11ZHBfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAotCSAgICAgICB2b2lkICptYXRjaGluZm8sCi0JICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAotCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOwotCi0JLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFVEUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KLQlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fVURQIHx8IChpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgewotCQlkdXByaW50ZigiaXB0X3VkcDogUHJvdG9jb2wgJXUgIT0gJXVcbiIsIGlwLT5wcm90bywKLQkJCSBJUFBST1RPX1VEUCk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAobWF0Y2hpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdWRwKSkpIHsKLQkJZHVwcmludGYoImlwdF91ZHA6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKLQkJCSBtYXRjaGluZm9zaXplLCBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdWRwKSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHVkcGluZm8tPmludmZsYWdzICYgfklQVF9VRFBfSU5WX01BU0spIHsKLQkJZHVwcmludGYoImlwdF91ZHA6IHVua25vd24gZmxhZ3MgJVhcbiIsCi0JCQkgdWRwaW5mby0+aW52ZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKKwlsb2NfY3B1X2VudHJ5ID0gcHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlJUFRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LCBwcml2YXRlLT5zaXplLCBjbGVhbnVwX2VudHJ5LCBOVUxMKTsKKwl4dF9mcmVlX3RhYmxlX2luZm8ocHJpdmF0ZSk7CiB9CiAKIC8qIFJldHVybnMgMSBpZiB0aGUgdHlwZSBhbmQgY29kZSBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KQEAgLTE3OTgsNiArMTI3Miw3IEBACiAJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKIAkgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAJICAgaW50IG9mZnNldCwKKwkgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKIAkgICBpbnQgKmhvdGRyb3ApCiB7CiAJc3RydWN0IGljbXBoZHIgX2ljbXBoLCAqaWM7CkBAIC0xODA3LDggKzEyODIsNyBAQAogCWlmIChvZmZzZXQpCiAJCXJldHVybiAwOwogCi0JaWMgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsKjQsCi0JCQkJc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOworCWljID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9pY21waCksICZfaWNtcGgpOwogCWlmIChpYyA9PSBOVUxMKSB7CiAJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCiAJCSAqIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4KQEAgLTE4MjgsMTEgKzEzMDIsMTIgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGljbXBfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJICAgY29uc3Qgdm9pZCAqaW5mbywKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogeworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaW5mbzsKIAljb25zdCBzdHJ1Y3QgaXB0X2ljbXAgKmljbXBpbmZvID0gbWF0Y2hpbmZvOwogCiAJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IElDTVAsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCkBAIC0xODYyLDEyMyArMTMzNywyMiBAQAogCS5nZXQJCT0gZG9faXB0X2dldF9jdGwsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCB0Y3BfbWF0Y2hzdHJ1Y3QgPSB7Ci0JLm5hbWUJCT0gInRjcCIsCi0JLm1hdGNoCQk9ICZ0Y3BfbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmdGNwX2NoZWNrZW50cnksCi19OwotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCB1ZHBfbWF0Y2hzdHJ1Y3QgPSB7Ci0JLm5hbWUJCT0gInVkcCIsCi0JLm1hdGNoCQk9ICZ1ZHBfbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmdWRwX2NoZWNrZW50cnksCi19OwotCiBzdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBpY21wX21hdGNoc3RydWN0ID0gewogCS5uYW1lCQk9ICJpY21wIiwKIAkubWF0Y2gJCT0gJmljbXBfbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSAmaWNtcF9jaGVja2VudHJ5LAogfTsKIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW5saW5lIGludCBwcmludF9uYW1lKGNvbnN0IGNoYXIgKmksCi0JCQkgICAgIG9mZl90IHN0YXJ0X29mZnNldCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoLAotCQkJICAgICBvZmZfdCAqcG9zLCB1bnNpZ25lZCBpbnQgKmNvdW50KQotewotCWlmICgoKmNvdW50KSsrID49IHN0YXJ0X29mZnNldCkgewotCQl1bnNpZ25lZCBpbnQgbmFtZWxlbjsKLQotCQluYW1lbGVuID0gc3ByaW50ZihidWZmZXIgKyAqcG9zLCAiJXNcbiIsCi0JCQkJICBpICsgc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpKTsKLQkJaWYgKCpwb3MgKyBuYW1lbGVuID4gbGVuZ3RoKSB7Ci0JCQkvKiBTdG9wIGl0ZXJhdGluZyAqLwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJKnBvcyArPSBuYW1lbGVuOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgcHJpbnRfdGFyZ2V0KGNvbnN0IHN0cnVjdCBpcHRfdGFyZ2V0ICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IHN0YXJ0X29mZnNldCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90ICpwb3MsIHVuc2lnbmVkIGludCAqY291bnQpCi17Ci0JaWYgKHQgPT0gJmlwdF9zdGFuZGFyZF90YXJnZXQgfHwgdCA9PSAmaXB0X2Vycm9yX3RhcmdldCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHByaW50X25hbWUoKGNoYXIgKil0LCBzdGFydF9vZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCBwb3MsIGNvdW50KTsKLX0KLQotc3RhdGljIGludCBpcHRfZ2V0X3RhYmxlcyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotewotCW9mZl90IHBvcyA9IDA7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlMSVNUX0ZJTkQoJmlwdF90YWJsZXMsIHByaW50X25hbWUsIHZvaWQgKiwKLQkJICBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCAmcG9zLCAmY291bnQpOwotCi0JdXAoJmlwdF9tdXRleCk7Ci0KLQkvKiBgc3RhcnQnIGhhY2sgLSBzZWUgZnMvcHJvYy9nZW5lcmljLmMgbGluZSB+MTA1ICovCi0JKnN0YXJ0PShjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50LW9mZnNldCk7Ci0JcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIGludCBpcHRfZ2V0X3RhcmdldHMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKLXsKLQlvZmZfdCBwb3MgPSAwOwotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcHRfbXV0ZXgpICE9IDApCi0JCXJldHVybiAwOwotCi0JTElTVF9GSU5EKCZpcHRfdGFyZ2V0LCBwcmludF90YXJnZXQsIHN0cnVjdCBpcHRfdGFyZ2V0ICosCi0JCSAgb2Zmc2V0LCBidWZmZXIsIGxlbmd0aCwgJnBvcywgJmNvdW50KTsKLQkKLQl1cCgmaXB0X211dGV4KTsKLQotCSpzdGFydCA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50IC0gb2Zmc2V0KTsKLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgaW50IGlwdF9nZXRfbWF0Y2hlcyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotewotCW9mZl90IHBvcyA9IDA7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwdF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0JCi0JTElTVF9GSU5EKCZpcHRfbWF0Y2gsIHByaW50X25hbWUsIHZvaWQgKiwKLQkJICBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCAmcG9zLCAmY291bnQpOwotCi0JdXAoJmlwdF9tdXRleCk7Ci0KLQkqc3RhcnQgPSAoY2hhciAqKSgodW5zaWduZWQgbG9uZyljb3VudCAtIG9mZnNldCk7Ci0JcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB7IGNoYXIgKm5hbWU7IGdldF9pbmZvX3QgKmdldF9pbmZvOyB9IGlwdF9wcm9jX2VudHJ5W10gPQoteyB7ICJpcF90YWJsZXNfbmFtZXMiLCBpcHRfZ2V0X3RhYmxlcyB9LAotICB7ICJpcF90YWJsZXNfdGFyZ2V0cyIsIGlwdF9nZXRfdGFyZ2V0cyB9LAotICB7ICJpcF90YWJsZXNfbWF0Y2hlcyIsIGlwdF9nZXRfbWF0Y2hlcyB9LAotICB7IE5VTEwsIE5VTEx9IH07Ci0jZW5kaWYgLypDT05GSUdfUFJPQ19GUyovCi0KIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCisJeHRfcHJvdG9faW5pdChBRl9JTkVUKTsKKwogCS8qIE5vb25lIGVsc2Ugd2lsbCBiZSBkb3duaW5nIHNlbSBub3csIHNvIHdlIHdvbid0IHNsZWVwICovCi0JZG93bigmaXB0X211dGV4KTsKLQlsaXN0X2FwcGVuZCgmaXB0X3RhcmdldCwgJmlwdF9zdGFuZGFyZF90YXJnZXQpOwotCWxpc3RfYXBwZW5kKCZpcHRfdGFyZ2V0LCAmaXB0X2Vycm9yX3RhcmdldCk7Ci0JbGlzdF9hcHBlbmQoJmlwdF9tYXRjaCwgJnRjcF9tYXRjaHN0cnVjdCk7Ci0JbGlzdF9hcHBlbmQoJmlwdF9tYXRjaCwgJnVkcF9tYXRjaHN0cnVjdCk7Ci0JbGlzdF9hcHBlbmQoJmlwdF9tYXRjaCwgJmljbXBfbWF0Y2hzdHJ1Y3QpOwotCXVwKCZpcHRfbXV0ZXgpOworCXh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X3N0YW5kYXJkX3RhcmdldCk7CisJeHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfZXJyb3JfdGFyZ2V0KTsKKwl4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaWNtcF9tYXRjaHN0cnVjdCk7CiAKIAkvKiBSZWdpc3RlciBzZXRzb2Nrb3B0ICovCiAJcmV0ID0gbmZfcmVnaXN0ZXJfc29ja29wdCgmaXB0X3NvY2tvcHRzKTsKQEAgLTE5ODcsNDkgKzEzNjEsMjMgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpcHRfcHJvY19lbnRyeVtpXS5uYW1lOyBpKyspIHsKLQkJcHJvYyA9IHByb2NfbmV0X2NyZWF0ZShpcHRfcHJvY19lbnRyeVtpXS5uYW1lLCAwLAotCQkJCSAgICAgICBpcHRfcHJvY19lbnRyeVtpXS5nZXRfaW5mbyk7Ci0JCWlmICghcHJvYykgewotCQkJd2hpbGUgKC0taSA+PSAwKQotCQkJCXByb2NfbmV0X3JlbW92ZShpcHRfcHJvY19lbnRyeVtpXS5uYW1lKTsKLQkJCW5mX3VucmVnaXN0ZXJfc29ja29wdCgmaXB0X3NvY2tvcHRzKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JfQotCX0KLSNlbmRpZgotCi0JcHJpbnRrKCJpcF90YWJsZXM6IChDKSAyMDAwLTIwMDIgTmV0ZmlsdGVyIGNvcmUgdGVhbVxuIik7CisJcHJpbnRrKCJpcF90YWJsZXM6IChDKSAyMDAwLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7CiAJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZpcHRfc29ja29wdHMpOwotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JewotCWludCBpOwotCWZvciAoaSA9IDA7IGlwdF9wcm9jX2VudHJ5W2ldLm5hbWU7IGkrKykKLQkJcHJvY19uZXRfcmVtb3ZlKGlwdF9wcm9jX2VudHJ5W2ldLm5hbWUpOwotCX0KLSNlbmRpZgorCisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaWNtcF9tYXRjaHN0cnVjdCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9lcnJvcl90YXJnZXQpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfc3RhbmRhcmRfdGFyZ2V0KTsKKworCXh0X3Byb3RvX2ZpbmkoQUZfSU5FVCk7CiB9CiAKIEVYUE9SVF9TWU1CT0woaXB0X3JlZ2lzdGVyX3RhYmxlKTsKIEVYUE9SVF9TWU1CT0woaXB0X3VucmVnaXN0ZXJfdGFibGUpOwotRVhQT1JUX1NZTUJPTChpcHRfcmVnaXN0ZXJfbWF0Y2gpOwotRVhQT1JUX1NZTUJPTChpcHRfdW5yZWdpc3Rlcl9tYXRjaCk7CiBFWFBPUlRfU1lNQk9MKGlwdF9kb190YWJsZSk7Ci1FWFBPUlRfU1lNQk9MKGlwdF9yZWdpc3Rlcl90YXJnZXQpOwotRVhQT1JUX1NZTUJPTChpcHRfdW5yZWdpc3Rlcl90YXJnZXQpOwotRVhQT1JUX1NZTUJPTChpcHRfZmluZF90YXJnZXQpOwotCiBtb2R1bGVfaW5pdChpbml0KTsKIG1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKaW5kZXggNDVjNTJkOC4uZDliYzk3MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCkBAIC0zNzksMTIgKzM3OSwxMyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgIGNvbnN0IHZvaWQgKmVfdm9pZCwKICAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CiAJc3RydWN0IGlwdF9jbHVzdGVyaXBfdGd0X2luZm8gKmNpcGluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplID0gZV92b2lkOwogCiAJc3RydWN0IGNsdXN0ZXJpcF9jb25maWcgKmNvbmZpZzsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9EU0NQLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0RTQ1AuYwppbmRleCA2ZTMxOTU3Li44OThjZGY3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0RTQ1AuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0RTQ1AuYwpAQCAtNTcsNyArNTcsNyBAQAogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgIGNvbnN0IHZvaWQgKmVfdm9pZCwKICAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9FQ04uYwppbmRleCBhMTMxOTY5Li43MDY0NDU0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0VDTi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfRUNOLmMKQEAgLTExMywxMiArMTEzLDEzIEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgY29uc3Qgdm9pZCAqZV92b2lkLAogICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X0VDTl9pbmZvICplaW5mbyA9IChzdHJ1Y3QgaXB0X0VDTl9pbmZvICopdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSA9IGVfdm9pZDsKIAogCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X0VDTl9pbmZvKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUNOOiB0YXJnaW5mb3NpemUgJXUgIT0gJVp1XG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKaW5kZXggMzBiZTBmMS4uNjYwNmRkYjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTE9HLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9MT0cuYwpAQCAtNDMxLDcgKzQzMSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXB0X2xvZ19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCQkgICAgICBjb25zdCB2b2lkICplLAogCQkJICAgICAgdm9pZCAqdGFyZ2luZm8sCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9NQVNRVUVSQURFLmMKaW5kZXggMjc4NjA1MS4uMTJjNTZkMzMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCkBAIC00MCw3ICs0MCw3IEBACiAvKiBGSVhNRTogTXVsdGlwbGUgdGFyZ2V0cy4gLS1SUiAqLwogc3RhdGljIGludAogbWFzcXVlcmFkZV9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgY29uc3Qgdm9pZCAqZSwKIAkJIHZvaWQgKnRhcmdpbmZvLAogCQkgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkJIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwppbmRleCBlNmU3YjYwLi5iMDc0NDY3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAogc3RhdGljIGludAogY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKyAgICAgIGNvbnN0IHZvaWQgKmUsCiAgICAgICB2b2lkICp0YXJnaW5mbywKICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORlFVRVVFLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05GUVVFVUUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlZGM5Yi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05GUVVFVUUuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIGlwdGFibGVzIG1vZHVsZSBmb3IgdXNpbmcgbmV3IG5ldGZpbHRlciBuZXRsaW5rIHF1ZXVlCi0gKgotICogKEMpIDIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIAotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKiAKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTkZRVUVVRS5oPgotCi1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgTkZRVUVVRSB0YXJnZXQiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIHVuc2lnbmVkIGludAotdGFyZ2V0KHN0cnVjdCBza19idWZmICoqcHNrYiwKLSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgICB1bnNpZ25lZCBpbnQgaG9va251bSwKLSAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKLSAgICAgICB2b2lkICp1c2VyaW5mbykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X05GUV9pbmZvICp0aW5mbyA9IHRhcmdpbmZvOwotCi0JcmV0dXJuIE5GX1FVRVVFX05SKHRpbmZvLT5xdWV1ZW51bSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCi0gICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X05GUV9pbmZvKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZRVUVVRTogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKLQkJICAgICAgIHRhcmdpbmZvc2l6ZSwKLQkJICAgICAgIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9ORlFfaW5mbykpKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfTkZRX3JlZyA9IHsKLQkubmFtZQkJPSAiTkZRVUVVRSIsCi0JLnRhcmdldAkJPSB0YXJnZXQsCi0JLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X05GUV9yZWcpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X05GUV9yZWcpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCmluZGV4IDUyNDViZmQuLjE0MGJlNTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKQEAgLTMzLDcgKzMzLDcgQEAKIC8qIEZJWE1FOiBUYWtlIG11bHRpcGxlIHJhbmdlcyAtLVJSICovCiBzdGF0aWMgaW50CiByZWRpcmVjdF9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgICAgIGNvbnN0IHZvaWQgKmUsCiAJICAgICAgIHZvaWQgKnRhcmdpbmZvLAogCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKaW5kZXggNjY5MzUyNi4uM2ViNDdhYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCkBAIC0yODIsMTIgKzI4MiwxMyBAQAogfQogCiBzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCSBjb25zdCB2b2lkICplX3ZvaWQsCiAJCSB2b2lkICp0YXJnaW5mbywKIAkJIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJCSB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogIAljb25zdCBzdHJ1Y3QgaXB0X3JlamVjdF9pbmZvICpyZWppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSA9IGVfdm9pZDsKIAogIAlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9yZWplY3RfaW5mbykpKSB7CiAgIAkJREVCVUdQKCJSRUpFQ1Q6IHRhcmdpbmZvc2l6ZSAldSAhPSAwXG4iLCB0YXJnaW5mb3NpemUpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NBTUUuYwppbmRleCA3YTA1MzZkOC4uYTIyZGU1OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TQU1FLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogc3RhdGljIGludAogc2FtZV9jaGVjayhjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICAgICBjb25zdCB2b2lkICplLAogCSAgICAgIHZvaWQgKnRhcmdpbmZvLAogCSAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RDUE1TUy5jCmluZGV4IDhkYjcwZDYuLmMxMjI4NDEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVENQTVNTLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UQ1BNU1MuYwpAQCAtMjEwLDEyICsyMTAsMTMgQEAKIC8qIE11c3Qgc3BlY2lmeSAtcCB0Y3AgLS1zeW4vLS10Y3AtZmxhZ3MgU1lOICovCiBzdGF0aWMgaW50CiBpcHRfdGNwbXNzX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCQkgICAgICBjb25zdCB2b2lkICplX3ZvaWQsCiAJCSAgICAgIHZvaWQgKnRhcmdpbmZvLAogCQkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCWNvbnN0IHN0cnVjdCBpcHRfdGNwbXNzX2luZm8gKnRjcG1zc2luZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplID0gZV92b2lkOwogCiAJaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfdGNwbXNzX2luZm8pKSkgewogCQlERUJVR1AoImlwdF90Y3Btc3NfY2hlY2tlbnRyeTogdGFyZ2luZm9zaXplICV1ICE9ICV1XG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVE9TLmMKaW5kZXggZGVhZGIzNi4uM2E0NGE1NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UT1MuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RPUy5jCkBAIC01Miw3ICs1Miw3IEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgY29uc3Qgdm9pZCAqZV92b2lkLAogICAgICAgICAgICB2b2lkICp0YXJnaW5mbywKICAgICAgICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1RUTC5jCmluZGV4IGI5YWU2YTkuLmI3NjllYjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVFRMLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9UVEwuYwpAQCAtNjYsNyArNjYsNyBAQAogfQogCiBzdGF0aWMgaW50IGlwdF90dGxfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCWNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJCWNvbnN0IHZvaWQgKmUsCiAJCXZvaWQgKnRhcmdpbmZvLAogCQl1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQl1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9VTE9HLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYwppbmRleCAzODY0MWNkLi42NDFkYmM0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYwpAQCAtMzMwLDcgKzMzMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgaXB0X3Vsb2dfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplLAogCQkJICAgICAgIHZvaWQgKnRhcmdpbmZvLAogCQkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2ttYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jCmluZGV4IGUxOWMyYTUuLmQ2YjgzYTk3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FkZHJ0eXBlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9hZGRydHlwZS5jCkBAIC0yOSw3ICsyOSw3IEBACiAKIHN0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCQkgaW50IG9mZnNldCwgaW50ICpob3Rkcm9wKQorCQkgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X2FkZHJ0eXBlX2luZm8gKmluZm8gPSBtYXRjaGluZm87CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKQEAgLTQzLDcgKzQzLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLCBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKK3N0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmlwLAogCQkgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FoLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2FoLmMKaW5kZXggYTBmZWE4NC4uMTQ0YWRmZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9haC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfYWguYwpAQCAtNDEsNiArNDEsNyBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKIAlzdHJ1Y3QgaXBfYXV0aF9oZHIgX2FoZHIsICphaDsKQEAgLTUwLDcgKzUxLDcgQEAKIAlpZiAob2Zmc2V0KQogCQlyZXR1cm4gMDsKIAotCWFoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCAqIDQsCisJYWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLAogCQkJCXNpemVvZihfYWhkciksICZfYWhkcik7CiAJaWYgKGFoID09IE5VTEwpIHsKIAkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKQEAgLTY5LDEyICs3MCwxMyBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJICAgY29uc3Qgdm9pZCAqaXBfdm9pZCwKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCiAJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X2FoICphaGluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpcF92b2lkOwogCiAJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IEFILCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLwogCWlmIChpcC0+cHJvdG8gIT0gSVBQUk9UT19BSCB8fCAoaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29tbWVudC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb21tZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzZhMWUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb21tZW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogSW1wbGVtZW50cyBhIGR1bW15IG1hdGNoIHRvIGFsbG93IGF0dGFjaGluZyBjb21tZW50cyB0byBydWxlcwotICoKLSAqIDIwMDMtMDUtMTMgQnJhZCBGaXNoZXIgKGJyYWRAaW5mby1saW5rLm5ldCkKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2NvbW1lbnQuaD4KLQotTU9EVUxFX0FVVEhPUigiQnJhZCBGaXNoZXIgPGJyYWRAaW5mby1saW5rLm5ldD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgY29tbWVudCBtYXRjaCBtb2R1bGUiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIGludAotbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgaW50ICpob3Rkcm9wKQotewotCS8qIFdlIGFsd2F5cyBtYXRjaCAqLwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0gICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLSAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQkvKiBDaGVjayB0aGUgc2l6ZSAqLwotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2NvbW1lbnRfaW5mbykpKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggY29tbWVudF9tYXRjaCA9IHsKLQkubmFtZQkJPSAiY29tbWVudCIsCi0JLm1hdGNoCQk9IG1hdGNoLAotCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZjb21tZW50X21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmY29tbWVudF9tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2RjY3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZGNjcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDMyNzhiLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZGNjcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0gKiBpcHRhYmxlcyBtb2R1bGUgZm9yIERDQ1AgcHJvdG9jb2wgaGVhZGVyIG1hdGNoaW5nCi0gKgotICogKEMpIDIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9kY2NwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZGNjcC5oPgotCi0jZGVmaW5lIERDQ0hFQ0soY29uZCwgb3B0aW9uLCBmbGFnLCBpbnZmbGFnKSAoISgoZmxhZykgJiAob3B0aW9uKSkgXAotCQkgICAgICAgICAgICAgICAgICB8fCAoISEoKGludmZsYWcpICYgKG9wdGlvbikpIF4gKGNvbmQpKSkKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRjY3Bfb3B0YnVmOwotc3RhdGljIERFRklORV9TUElOTE9DSyhkY2NwX2J1ZmxvY2spOwotCi1zdGF0aWMgaW5saW5lIGludAotZGNjcF9maW5kX29wdGlvbih1X2ludDhfdCBvcHRpb24sCi0JCSBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCwKLQkJIGludCAqaG90ZHJvcCkKLXsKLQkvKiB0Y3AuZG9mZiBpcyBvbmx5IDQgYml0cywgaWUuIG1heCAxNSAqIDQgYnl0ZXMgKi8KLQl1bnNpZ25lZCBjaGFyICpvcDsKLQl1bnNpZ25lZCBpbnQgb3B0b2ZmID0gX19kY2NwX2hkcl9sZW4oZGgpOwotCXVuc2lnbmVkIGludCBvcHRsZW4gPSBkaC0+ZGNjcGhfZG9mZio0IC0gX19kY2NwX2hkcl9sZW4oZGgpOwotCXVuc2lnbmVkIGludCBpOwotCi0JaWYgKGRoLT5kY2NwaF9kb2ZmICogNCA8IF9fZGNjcF9oZHJfbGVuKGRoKSkgewotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghb3B0bGVuKQotCQlyZXR1cm4gMDsKLQotCXNwaW5fbG9ja19iaCgmZGNjcF9idWZsb2NrKTsKLQlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCi0JCQkJc2tiLT5uaC5pcGgtPmlobCo0ICsgb3B0b2ZmLAotCQkJCW9wdGxlbiwgZGNjcF9vcHRidWYpOwotCWlmIChvcCA9PSBOVUxMKSB7Ci0JCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHdob2xlIGhlYWRlciwgZHJvcCBwYWNrZXQuICovCi0JCXNwaW5fdW5sb2NrX2JoKCZkY2NwX2J1ZmxvY2spOwotCQkqaG90ZHJvcCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgewotCQlpZiAob3BbaV0gPT0gb3B0aW9uKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmZGNjcF9idWZsb2NrKTsKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJaWYgKG9wW2ldIDwgMikgCi0JCQlpKys7Ci0JCWVsc2UgCi0JCQlpICs9IG9wW2krMV0/OjE7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJmRjY3BfYnVmbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGlubGluZSBpbnQKLW1hdGNoX3R5cGVzKGNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGgsIHVfaW50MTZfdCB0eXBlbWFzaykKLXsKLQlyZXR1cm4gKHR5cGVtYXNrICYgKDEgPDwgZGgtPmRjY3BoX3R5cGUpKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLW1hdGNoX29wdGlvbih1X2ludDhfdCBvcHRpb24sIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICBjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLCBpbnQgKmhvdGRyb3ApCi17Ci0JcmV0dXJuIGRjY3BfZmluZF9vcHRpb24ob3B0aW9uLCBza2IsIGRoLCBob3Rkcm9wKTsKLX0KLQotc3RhdGljIGludAotbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgaW50ICpob3Rkcm9wKQotewotCWNvbnN0IHN0cnVjdCBpcHRfZGNjcF9pbmZvICppbmZvID0gCi0JCQkJKGNvbnN0IHN0cnVjdCBpcHRfZGNjcF9pbmZvICopbWF0Y2hpbmZvOwotCXN0cnVjdCBkY2NwX2hkciBfZGgsICpkaDsKLQotCWlmIChvZmZzZXQpCi0JCXJldHVybiAwOwotCQotCWRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCo0LCBzaXplb2YoX2RoKSwgJl9kaCk7Ci0JaWYgKGRoID09IE5VTEwpIHsKLQkJKmhvdGRyb3AgPSAxOwotCQlyZXR1cm4gMDsKLSAgICAgICAJfQotCi0JcmV0dXJuICBEQ0NIRUNLKCgobnRvaHMoZGgtPmRjY3BoX3Nwb3J0KSA+PSBpbmZvLT5zcHRzWzBdKSAKLQkJCSYmIChudG9ocyhkaC0+ZGNjcGhfc3BvcnQpIDw9IGluZm8tPnNwdHNbMV0pKSwgCi0JCSAgIAlJUFRfRENDUF9TUkNfUE9SVFMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKLQkJJiYgRENDSEVDSygoKG50b2hzKGRoLT5kY2NwaF9kcG9ydCkgPj0gaW5mby0+ZHB0c1swXSkgCi0JCQkmJiAobnRvaHMoZGgtPmRjY3BoX2Rwb3J0KSA8PSBpbmZvLT5kcHRzWzFdKSksIAotCQkJSVBUX0RDQ1BfREVTVF9QT1JUUywgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQotCQkmJiBEQ0NIRUNLKG1hdGNoX3R5cGVzKGRoLCBpbmZvLT50eXBlbWFzayksCi0JCQkgICBJUFRfRENDUF9UWVBFLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCi0JCSYmIERDQ0hFQ0sobWF0Y2hfb3B0aW9uKGluZm8tPm9wdGlvbiwgc2tiLCBkaCwgaG90ZHJvcCksCi0JCQkgICBJUFRfRENDUF9PUFRJT04sIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAotCSAgIHZvaWQgKm1hdGNoaW5mbywKLQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9kY2NwX2luZm8gKmluZm87Ci0KLQlpbmZvID0gKGNvbnN0IHN0cnVjdCBpcHRfZGNjcF9pbmZvICopbWF0Y2hpbmZvOwotCi0JcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX0RDQ1AKLQkJJiYgIShpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKQotCQkmJiBtYXRjaHNpemUgPT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2RjY3BfaW5mbykpCi0JCSYmICEoaW5mby0+ZmxhZ3MgJiB+SVBUX0RDQ1BfVkFMSURfRkxBR1MpCi0JCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+SVBUX0RDQ1BfVkFMSURfRkxBR1MpCi0JCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+aW5mby0+ZmxhZ3MpOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBkY2NwX21hdGNoID0gCi17IAotCS5uYW1lIAkJPSAiZGNjcCIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAotCS5tZSAJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCS8qIGRvZmYgaXMgOCBiaXRzLCBzbyB0aGUgbWF4aW11bSBvcHRpb24gc2l6ZSBpcyAoNCoyNTYpLiAgRG9uJ3QgcHV0Ci0JICogdGhpcyBpbiBCU1Mgc2luY2UgRGF2ZU0gaXMgd29ycmllZCBhYm91dCBsb2NrZWQgVExCJ3MgZm9yIGtlcm5lbAotCSAqIEJTUy4gKi8KLQlkY2NwX29wdGJ1ZiA9IGttYWxsb2MoMjU2ICogNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkY2NwX29wdGJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmV0ID0gaXB0X3JlZ2lzdGVyX21hdGNoKCZkY2NwX21hdGNoKTsKLQlpZiAocmV0KQotCQlrZnJlZShkY2NwX29wdGJ1Zik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZkY2NwX21hdGNoKTsKLQlrZnJlZShkY2NwX29wdGJ1Zik7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXRjaCBmb3IgRENDUCBwcm90b2NvbCBwYWNrZXRzIik7Ci0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZHNjcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9kc2NwLmMKaW5kZXggNWRmNTJhNi4uOTIwNjNiNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9kc2NwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9kc2NwLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogc3RhdGljIGludCBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCiAJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LCBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JCSBpbnQgb2Zmc2V0LCBpbnQgKmhvdGRyb3ApCisJCSBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcHRfZHNjcF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CkBAIC0zMSw3ICszMSw3IEBACiAJcmV0dXJuICgoaXBoLT50b3MmSVBUX0RTQ1BfTUFTSykgPT0gc2hfZHNjcCkgXiBpbmZvLT5pbnZlcnQ7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXAsCiAJCSAgICAgIHZvaWQgKm1hdGNoaW5mbywgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2Vjbi5jCmluZGV4IGI2ZjcxODEuLmU2OGIwYzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYwpAQCAtNjcsNyArNjcsNyBAQAogCiBzdGF0aWMgaW50IG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKIAkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLQkJIGludCBvZmZzZXQsIGludCAqaG90ZHJvcCkKKwkJIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBwcm90b2ZmLCBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IGlwdF9lY25faW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIApAQCAtODUsMTEgKzg1LDEyIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAqaXBfdm9pZCwKIAkJICAgICAgdm9pZCAqbWF0Y2hpbmZvLCB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewogCWNvbnN0IHN0cnVjdCBpcHRfZWNuX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAgPSBpcF92b2lkOwogCiAJaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfZWNuX2luZm8pKSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2VzcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lc3AuYwppbmRleCBlMWQwZGQzLi45ZGUxOTFhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2VzcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZXNwLmMKQEAgLTQyLDYgKzQyLDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJc3RydWN0IGlwX2VzcF9oZHIgX2VzcCwgKmVoOwpAQCAtNTEsNyArNTIsNyBAQAogCWlmIChvZmZzZXQpCiAJCXJldHVybiAwOwogCi0JZWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCwKKwllaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsCiAJCQkJc2l6ZW9mKF9lc3ApLCAmX2VzcCk7CiAJaWYgKGVoID09IE5VTEwpIHsKIAkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKQEAgLTcwLDEyICs3MSwxMyBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJICAgY29uc3Qgdm9pZCAqaXBfdm9pZCwKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCiAJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X2VzcCAqZXNwaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGlwX3ZvaWQ7CiAKIAkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gRVNQLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLwogCWlmIChpcC0+cHJvdG8gIT0gSVBQUk9UT19FU1AgfHwgKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hhc2hsaW1pdC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9oYXNobGltaXQuYwppbmRleCAyZGQxY2NjLi40ZmU0OGMxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hhc2hsaW1pdC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGFzaGxpbWl0LmMKQEAgLTQyOSw2ICs0MjksNyBAQAogCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQljb25zdCB2b2lkICptYXRjaGluZm8sCiAJCWludCBvZmZzZXQsCisJCXVuc2lnbmVkIGludCBwcm90b2ZmLAogCQlpbnQgKmhvdGRyb3ApCiB7CiAJc3RydWN0IGlwdF9oYXNobGltaXRfaW5mbyAqciA9IApAQCAtNTA0LDcgKzUwNSw3IEBACiAKIHN0YXRpYyBpbnQKIGhhc2hsaW1pdF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkJICAgICBjb25zdCB2b2lkICppbmYsCiAJCSAgICAgdm9pZCAqbWF0Y2hpbmZvLAogCQkgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaXByYW5nZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMKaW5kZXggYjgzNWI3Yi4uMTNmYjE2ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9pcHJhbmdlLmMKQEAgLTI4LDcgKzI4LDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LCBpbnQgKmhvdGRyb3ApCisgICAgICBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgcHJvdG9mZiwgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcHRfaXByYW5nZV9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gc2tiLT5uaC5pcGg7CkBAIC02Myw3ICs2Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSBjb25zdCB2b2lkICppbmYsCiAJCSB2b2lkICptYXRjaGluZm8sCiAJCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbGVuZ3RoLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xlbmd0aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFiY2ZiLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbGVuZ3RoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIHBhY2tldCBsZW5ndGguICovCi0vKiAoQykgMTk5OS0yMDAxIEphbWVzIE1vcnJpcyA8am1vcnJvc0BpbnRlcmNvZGUuY29tLmF1PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xlbmd0aC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotCi1NT0RVTEVfQVVUSE9SKCJKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIHBhY2tldCBsZW5ndGggbWF0Y2hpbmcgbW9kdWxlIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X2xlbmd0aF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCXVfaW50MTZfdCBwa3RsZW4gPSBudG9ocyhza2ItPm5oLmlwaC0+dG90X2xlbik7Ci0JCi0JcmV0dXJuIChwa3RsZW4gPj0gaW5mby0+bWluICYmIHBrdGxlbiA8PSBpbmZvLT5tYXgpIF4gaW5mby0+aW52ZXJ0OwotfQotCi1zdGF0aWMgaW50Ci1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0gICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKLSAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLSAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9sZW5ndGhfaW5mbykpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBsZW5ndGhfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gImxlbmd0aCIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZsZW5ndGhfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZsZW5ndGhfbWF0Y2gpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tdWx0aXBvcnQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbXVsdGlwb3J0LmMKaW5kZXggOTllODE4OC4uMmQ1MjMyNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tdWx0aXBvcnQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X211bHRpcG9ydC5jCkBAIC05Nyw2ICs5Nyw3IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewogCXUxNiBfcG9ydHNbMl0sICpwcHRyOwpAQCAtMTA1LDcgKzEwNiw3IEBACiAJaWYgKG9mZnNldCkKIAkJcmV0dXJuIDA7CiAKLQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCAqIDQsCisJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsCiAJCQkJICBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKIAlpZiAocHB0ciA9PSBOVUxMKSB7CiAJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCkBAIC0xMjgsNiArMTI5LDcgQEAKIAkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKIAkgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogCSBpbnQgb2Zmc2V0LAorCSB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKIAkgaW50ICpob3Rkcm9wKQogewogCXUxNiBfcG9ydHNbMl0sICpwcHRyOwpAQCAtMTM2LDcgKzEzOCw3IEBACiAJaWYgKG9mZnNldCkKIAkJcmV0dXJuIDA7CiAKLQlwcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCAqIDQsCisJcHB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsCiAJCQkJICBzaXplb2YoX3BvcnRzKSwgX3BvcnRzKTsKIAlpZiAocHB0ciA9PSBOVUxMKSB7CiAJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCkBAIC0xNTQsNyArMTU2LDcgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCSAgIGNvbnN0IHZvaWQgKmlwLAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCkBAIC0xNjQsNyArMTY2LDcgQEAKIAogc3RhdGljIGludAogY2hlY2tlbnRyeV92MShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJICAgICAgY29uc3Qgdm9pZCAqaXAsCiAJICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogCSAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfb3duZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfb3duZXIuYwppbmRleCAwY2VlMjg2Li40ODQzZDBjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X293bmVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9vd25lci5jCkBAIC0yNyw2ICsyNyw3IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewogCWNvbnN0IHN0cnVjdCBpcHRfb3duZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKQEAgLTUxLDcgKzUyLDcgQEAKIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgICAgICBjb25zdCB2b2lkICppcCwKICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9waHlzZGV2LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3BoeXNkZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmNTU0OC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3BoeXNkZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIHRoZSBicmlkZ2UgcG9ydCBpbiBhbmQKLSAqIG91dCBkZXZpY2UgZm9yIElQIHBhY2tldHMgY29taW5nIGludG8gY29udGFjdCB3aXRoIGEgYnJpZGdlLiAqLwotCi0vKiAoQykgMjAwMS0yMDAzIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3BoeXNkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+Ci0jZGVmaW5lIE1BVENIICAgMQotI2RlZmluZSBOT01BVENIIDAKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgYnJpZGdlIHBoeXNpY2FsIGRldmljZSBtYXRjaCBtb2R1bGUiKTsKLQotc3RhdGljIGludAotbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgaW50ICpob3Rkcm9wKQotewotCWludCBpOwotCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXTsKLQljb25zdCBzdHJ1Y3QgaXB0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OwotCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlOwotCi0JLyogTm90IGEgYnJpZGdlZCBJUCBwYWNrZXQgb3Igbm8gaW5mbyBhdmFpbGFibGUgeWV0OgotCSAqIExPQ0FMX09VVC9tYW5nbGUgYW5kIExPQ0FMX09VVC9uYXQgZG9uJ3Qga25vdyBpZgotCSAqIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2Ugd2lsbCBiZSBhIGJyaWRnZS4gKi8KLQlpZiAoIShuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZSkpIHsKLQkJLyogUmV0dXJuIE1BVENIIGlmIHRoZSBpbnZlcnQgZmxhZ3Mgb2YgdGhlIHVzZWQgb3B0aW9ucyBhcmUgb24gKi8KLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfQlJJREdFRCkgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfQlJJREdFRCkpCi0JCQlyZXR1cm4gTk9NQVRDSDsKLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfSVNJTikgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfSVNJTikpCi0JCQlyZXR1cm4gTk9NQVRDSDsKLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfSVNPVVQpICYmCi0JCSAgICAhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX0lTT1VUKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9JTikgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfSU4pKQotCQkJcmV0dXJuIE5PTUFUQ0g7Ci0JCWlmICgoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX09VVCkgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfT1VUKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlyZXR1cm4gTUFUQ0g7Ci0JfQotCi0JLyogVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGluIHRoZSBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMgKi8KLQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9CUklER0VEKSAmJgotCSAgICAoISEobmZfYnJpZGdlLT5tYXNrICYgQlJORl9CUklER0VEKSBeCi0JICAgICEoaW5mby0+aW52ZXJ0ICYgSVBUX1BIWVNERVZfT1BfQlJJREdFRCkpKQotCQlyZXR1cm4gTk9NQVRDSDsKLQotCWlmICgoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX0lTSU4gJiYKLQkgICAgKCFuZl9icmlkZ2UtPnBoeXNpbmRldiBeICEhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX0lTSU4pKSkgfHwKLQkgICAgKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9JU09VVCAmJgotCSAgICAoIW5mX2JyaWRnZS0+cGh5c291dGRldiBeICEhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX0lTT1VUKSkpKQotCQlyZXR1cm4gTk9NQVRDSDsKLQotCWlmICghKGluZm8tPmJpdG1hc2sgJiBJUFRfUEhZU0RFVl9PUF9JTikpCi0JCWdvdG8gbWF0Y2hfb3V0ZGV2OwotCWluZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXYgPyBuZl9icmlkZ2UtPnBoeXNpbmRldi0+bmFtZSA6IG51bGxkZXZuYW1lOwotCWZvciAoaSA9IDAsIHJldCA9IDA7IGkgPCBJRk5BTVNJWi9zaXplb2YodW5zaWduZWQgaW50KTsgaSsrKSB7Ci0JCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmRldilbaV0KLQkJCV4gKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmZvLT5waHlzaW5kZXYpW2ldKQotCQkJJiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPmluX21hc2spW2ldOwotCX0KLQotCWlmICgocmV0ID09IDApIF4gIShpbmZvLT5pbnZlcnQgJiBJUFRfUEhZU0RFVl9PUF9JTikpCi0JCXJldHVybiBOT01BVENIOwotCi1tYXRjaF9vdXRkZXY6Ci0JaWYgKCEoaW5mby0+Yml0bWFzayAmIElQVF9QSFlTREVWX09QX09VVCkpCi0JCXJldHVybiBNQVRDSDsKLQlvdXRkZXYgPSBuZl9icmlkZ2UtPnBoeXNvdXRkZXYgPwotCQkgbmZfYnJpZGdlLT5waHlzb3V0ZGV2LT5uYW1lIDogbnVsbGRldm5hbWU7Ci0JZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laL3NpemVvZih1bnNpZ25lZCBpbnQpOyBpKyspIHsKLQkJcmV0IHw9ICgoKGNvbnN0IHVuc2lnbmVkIGludCAqKW91dGRldilbaV0KLQkJCV4gKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmZvLT5waHlzb3V0ZGV2KVtpXSkKLQkJCSYgKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmZvLT5vdXRfbWFzaylbaV07Ci0JfQotCi0JcmV0dXJuIChyZXQgIT0gMCkgXiAhKGluZm8tPmludmVydCAmIElQVF9QSFlTREVWX09QX09VVCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCSAgICAgICB2b2lkICptYXRjaGluZm8sCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3BoeXNkZXZfaW5mbykpKQotCQlyZXR1cm4gMDsKLQlpZiAoIShpbmZvLT5iaXRtYXNrICYgSVBUX1BIWVNERVZfT1BfTUFTSykgfHwKLQkgICAgaW5mby0+Yml0bWFzayAmIH5JUFRfUEhZU0RFVl9PUF9NQVNLKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggcGh5c2Rldl9tYXRjaCA9IHsKLQkubmFtZQkJPSAicGh5c2RldiIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZwaHlzZGV2X21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmcGh5c2Rldl9tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3BrdHR5cGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcGt0dHlwZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGRiMWRjLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcGt0dHlwZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogKEMpIDE5OTktMjAwMSBNaWNoYWwgTHVkdmlnIDxtaWNoYWxAbG9naXguY3o+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9wa3R0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1pY2hhbCBMdWR2aWcgPG1pY2hhbEBsb2dpeC5jej4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSVAgdGFibGVzIG1hdGNoIHRvIG1hdGNoIG9uIGxpbmtsYXllciBwYWNrZXQgdHlwZSIpOwotCi1zdGF0aWMgaW50IG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLSAgICBjb25zdCBzdHJ1Y3QgaXB0X3BrdHR5cGVfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQotICAgIHJldHVybiAoc2tiLT5wa3RfdHlwZSA9PSBpbmZvLT5wa3R0eXBlKSBeIGluZm8tPmludmVydDsKLX0KLQotc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCSAgIHZvaWQgKm1hdGNoaW5mbywKLQkJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLQkJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLS8qCi0JaWYgKGhvb2tfbWFzawotCSAgICAmIH4oKDEgPDwgTkZfSVBfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVBfTE9DQUxfSU4pCi0JCXwgKDEgPDwgTkZfSVBfRk9SV0FSRCkpKSB7Ci0JCXByaW50aygiaXB0X3BrdHR5cGU6IG9ubHkgdmFsaWQgZm9yIFBSRV9ST1VUSU5HLCBMT0NBTF9JTiBvciBGT1JXQVJELlxuIik7Ci0JCXJldHVybiAwOwotCX0KLSovCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcGt0dHlwZV9pbmZvKSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHBrdHR5cGVfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gInBrdHR5cGUiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmcGt0dHlwZV9tYXRjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnBrdHR5cGVfbWF0Y2gpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVjZW50LmMKaW5kZXggNWRkY2NiMS4uNDQ2MTFkNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWNlbnQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JlY2VudC5jCkBAIC0xMDQsNiArMTA0LDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApOwogCiAvKiBGdW5jdGlvbiB0byBoYXNoIGEgZ2l2ZW4gYWRkcmVzcyBpbnRvIHRoZSBoYXNoIHRhYmxlIG9mIHRhYmxlX3NpemUgc2l6ZSAqLwpAQCAtMzE3LDcgKzMxOCw3IEBACiAJc2tiLT5uaC5pcGgtPmRhZGRyID0gMDsKIAkvKiBDbGVhciB0dGwgc2luY2Ugd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyBpdCAqLwogCXNrYi0+bmguaXBoLT50dGwgPSAwOwotCW1hdGNoKHNrYixOVUxMLE5VTEwsaW5mbywwLE5VTEwpOworCW1hdGNoKHNrYixOVUxMLE5VTEwsaW5mbywwLDAsTlVMTCk7CiAKIAlrZnJlZShza2ItPm5oLmlwaCk7CiBvdXRfZnJlZV9za2I6CkBAIC0zNTcsNiArMzU4LDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJaW50IHBrdF9jb3VudCwgaGl0c19mb3VuZCwgYW5zOwpAQCAtNjU0LDcgKzY1Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgICAgICAgY29uc3Qgdm9pZCAqaXAsCiAgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKICAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RhdGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3ZjE2Yi4uMDAwMDAwMAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3N0YXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIGNvbm5lY3Rpb24gdHJhY2tpbmcgaW5mb3JtYXRpb24uICovCi0KLS8qIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDQgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RhdGUuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiUnVzdHkgUnVzc2VsbCA8cnVzdHlAcnVzdGNvcnAuY29tLmF1PiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBjb25uZWN0aW9uIHRyYWNraW5nIHN0YXRlIG1hdGNoIG1vZHVsZSIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9zdGF0ZV9pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKLQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKLQl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7Ci0KLQlpZiAobmZfY3RfaXNfdW50cmFja2VkKHNrYikpCi0JCXN0YXRlYml0ID0gSVBUX1NUQVRFX1VOVFJBQ0tFRDsKLQllbHNlIGlmICghbmZfY3RfZ2V0X2N0aW5mbyhza2IsICZjdGluZm8pKQotCQlzdGF0ZWJpdCA9IElQVF9TVEFURV9JTlZBTElEOwotCWVsc2UKLQkJc3RhdGViaXQgPSBJUFRfU1RBVEVfQklUKGN0aW5mbyk7Ci0KLQlyZXR1cm4gKHNpbmZvLT5zdGF0ZW1hc2sgJiBzdGF0ZWJpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCi0JCSB2b2lkICptYXRjaGluZm8sCi0JCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdGF0ZV9pbmZvKSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHN0YXRlX21hdGNoID0gewotCS5uYW1lCQk9ICJzdGF0ZSIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZjaGVjaywKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JbmVlZF9pcF9jb25udHJhY2soKTsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZzdGF0ZV9tYXRjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnN0YXRlX21hdGNoKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdGNwbXNzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3RjcG1zcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGM5YjE2Li4wMDAwMDAwCi0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdGNwbXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBUQ1AgTVNTIHZhbHVlcy4gKi8KLQotLyogQ29weXJpZ2h0IChDKSAyMDAwIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPG5ldC90Y3AuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF90Y3Btc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLQotI2RlZmluZSBUSF9TWU4gMHgwMgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgVENQIE1TUyBtYXRjaCBtb2R1bGUiKTsKLQotLyogUmV0dXJucyAxIGlmIHRoZSBtc3Mgb3B0aW9uIGlzIHNldCBhbmQgbWF0Y2hlZCBieSB0aGUgcmFuZ2UsIDAgb3RoZXJ3aXNlICovCi1zdGF0aWMgaW5saW5lIGludAotbXNzb3B0aW9uX21hdGNoKHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsCi0JCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCWludCBpbnZlcnQsCi0JCWludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgdGNwaGRyIF90Y3BoLCAqdGg7Ci0JLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCi0JdTggX29wdFsxNSAqIDQgLSBzaXplb2YoX3RjcGgpXSwgKm9wOwotCXVuc2lnbmVkIGludCBpLCBvcHRsZW47Ci0KLQkvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBoZWFkZXIsIGRyb3AgcGFja2V0LiAqLwotCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc2tiLT5uaC5pcGgtPmlobCAqIDQsCi0JCQkJc2l6ZW9mKF90Y3BoKSwgJl90Y3BoKTsKLQlpZiAodGggPT0gTlVMTCkKLQkJZ290byBkcm9waXQ7Ci0KLQkvKiBNYWxmb3JtZWQuICovCi0JaWYgKHRoLT5kb2ZmKjQgPCBzaXplb2YoKnRoKSkKLQkJZ290byBkcm9waXQ7Ci0KLQlvcHRsZW4gPSB0aC0+ZG9mZio0IC0gc2l6ZW9mKCp0aCk7Ci0JaWYgKCFvcHRsZW4pCi0JCWdvdG8gb3V0OwotCi0JLyogVHJ1bmNhdGVkIG9wdGlvbnMuICovCi0Jb3AgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2ItPm5oLmlwaC0+aWhsICogNCArIHNpemVvZigqdGgpLAotCQkJCW9wdGxlbiwgX29wdCk7Ci0JaWYgKG9wID09IE5VTEwpCi0JCWdvdG8gZHJvcGl0OwotCi0JZm9yIChpID0gMDsgaSA8IG9wdGxlbjsgKSB7Ci0JCWlmIChvcFtpXSA9PSBUQ1BPUFRfTVNTCi0JCSAgICAmJiAob3B0bGVuIC0gaSkgPj0gVENQT0xFTl9NU1MKLQkJICAgICYmIG9wW2krMV0gPT0gVENQT0xFTl9NU1MpIHsKLQkJCXVfaW50MTZfdCBtc3N2YWw7Ci0KLQkJCW1zc3ZhbCA9IChvcFtpKzJdIDw8IDgpIHwgb3BbaSszXTsKLQkJCQotCQkJcmV0dXJuIChtc3N2YWwgPj0gbWluICYmIG1zc3ZhbCA8PSBtYXgpIF4gaW52ZXJ0OwotCQl9Ci0JCWlmIChvcFtpXSA8IDIpIGkrKzsKLQkJZWxzZSBpICs9IG9wW2krMV0/OjE7Ci0JfQotb3V0OgotCXJldHVybiBpbnZlcnQ7Ci0KLSBkcm9waXQ6Ci0JKmhvdGRyb3AgPSAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JY29uc3Qgc3RydWN0IGlwdF90Y3Btc3NfbWF0Y2hfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQotCXJldHVybiBtc3NvcHRpb25fbWF0Y2goaW5mby0+bXNzX21pbiwgaW5mby0+bXNzX21heCwgc2tiLAotCQkJICAgICAgIGluZm8tPmludmVydCwgaG90ZHJvcCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKLSAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmIChtYXRjaHNpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X3RjcG1zc19tYXRjaF9pbmZvKSkpCi0JCXJldHVybiAwOwotCi0JLyogTXVzdCBzcGVjaWZ5IC1wIHRjcCAqLwotCWlmIChpcC0+cHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwgKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pKSB7Ci0JCXByaW50aygidGNwbXNzOiBPbmx5IHdvcmtzIG9uIFRDUCBwYWNrZXRzXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXB0X21hdGNoIHRjcG1zc19tYXRjaCA9IHsKLQkubmFtZQkJPSAidGNwbXNzIiwKLQkubWF0Y2gJCT0gJm1hdGNoLAotCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnRjcG1zc19tYXRjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJnRjcG1zc19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90b3MuYwppbmRleCAwODZhMWJiLi45YWI3NjVlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3Rvcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdG9zLmMKQEAgLTIzLDYgKzIzLDcgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7CiAJY29uc3Qgc3RydWN0IGlwdF90b3NfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKQEAgLTMyLDcgKzMzLDcgQEAKIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorICAgICAgICAgICBjb25zdCB2b2lkICppcCwKICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfdHRsLmMKaW5kZXggMjE5YWE5ZC4uODJkYTUzZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF90dGwuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3R0bC5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIHN0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAogCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCQkgaW50IG9mZnNldCwgaW50ICpob3Rkcm9wKQorCQkgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHByb3RvZmYsIGludCAqaG90ZHJvcCkKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X3R0bF9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCkBAIC00Nyw3ICs0Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgdm9pZCAgKmlwLAogCQkgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCmluZGV4IDI2MGE0ZjAuLjIxMmEzMDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCkBAIC03OCw3ICs3OCw4IEBACiAJLm5hbWUJCT0gImZpbHRlciIsCiAJLnZhbGlkX2hvb2tzCT0gRklMVEVSX1ZBTElEX0hPT0tTLAogCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCi0JLm1lCQk9IFRISVNfTU9EVUxFCisJLm1lCQk9IFRISVNfTU9EVUxFLAorCS5hZgkJPSBBRl9JTkVULAogfTsKIAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbWFuZ2xlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwppbmRleCAxNjBlYjExLi4zMjEyYTVjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYwpAQCAtMTA5LDYgKzEwOSw3IEBACiAJLnZhbGlkX2hvb2tzCT0gTUFOR0xFX1ZBTElEX0hPT0tTLAogCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCiAJLm1lCQk9IFRISVNfTU9EVUxFLAorCS5hZgkJPSBBRl9JTkVULAogfTsKIAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfcmF3LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYwppbmRleCA0NzQ0OWJhLi5mZGI5ZTljIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYwpAQCAtODMsNyArODMsOCBAQAogCS5uYW1lID0gInJhdyIsIAogCS52YWxpZF9ob29rcyA9ICBSQVdfVkFMSURfSE9PS1MsIAogCS5sb2NrID0gUldfTE9DS19VTkxPQ0tFRCwgCi0JLm1lID0gVEhJU19NT0RVTEUKKwkubWUgPSBUSElTX01PRFVMRSwKKwkuYWYgPSBBRl9JTkVULAogfTsKIAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKaW5kZXggMGM1NmM1MmEuLjE2NzYxOWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYwpAQCAtNTc1LDcgKzU3NSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQluZWVkX25mX2Nvbm50cmFjaygpOworCW5lZWRfY29ubnRyYWNrKCk7CiAJcmV0dXJuIGluaXRfb3JfY2xlYW51cCgxKTsKIH0KIApAQCAtNTg3LDkgKzU4Nyw0IEBACiBtb2R1bGVfaW5pdChpbml0KTsKIG1vZHVsZV9leGl0KGZpbmkpOwogCi12b2lkIG5lZWRfaXBfY29ubnRyYWNrKHZvaWQpCi17Ci19Ci0KLUVYUE9SVF9TWU1CT0wobmVlZF9pcF9jb25udHJhY2spOwogRVhQT1JUX1NZTUJPTChuZl9jdF9pcHY0X2dhdGhlcl9mcmFncyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDEwNWRkNjkuLjJkNmY4ZWMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCkBAIC00MSw2ICs0MSw3IEBACiAKIGNvbmZpZyBJUDZfTkZfSVBUQUJMRVMKIAl0cmlzdGF0ZSAiSVA2IHRhYmxlcyBzdXBwb3J0IChyZXF1aXJlZCBmb3IgZmlsdGVyaW5nL21hc3EvTkFUKSIKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJaGVscAogCSAgaXA2dGFibGVzIGlzIGEgZ2VuZXJhbCwgZXh0ZW5zaWJsZSBwYWNrZXQgaWRlbnRpZmljYXRpb24gZnJhbWV3b3JrLgogCSAgQ3VycmVudGx5IG9ubHkgdGhlIHBhY2tldCBmaWx0ZXJpbmcgYW5kIHBhY2tldCBtYW5nbGluZyBzdWJzeXN0ZW0KQEAgLTUwLDI1ICs1MSw2IEBACiAJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KIAogIyBUaGUgc2ltcGxlIG1hdGNoZXMuCi1jb25maWcgSVA2X05GX01BVENIX0xJTUlUCi0JdHJpc3RhdGUgImxpbWl0IG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBsaW1pdCBtYXRjaGluZyBhbGxvd3MgeW91IHRvIGNvbnRyb2wgdGhlIHJhdGUgYXQgd2hpY2ggYSBydWxlIGNhbiBiZQotCSAgbWF0Y2hlZDogbWFpbmx5IHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBMT0cgdGFyZ2V0ICgiTE9HCi0JICB0YXJnZXQgc3VwcG9ydCIsIGJlbG93KSBhbmQgdG8gYXZvaWQgc29tZSBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2tzLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIElQNl9ORl9NQVRDSF9NQUMKLQl0cmlzdGF0ZSAiTUFDIGFkZHJlc3MgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIG1hYyBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIHNvdXJjZQotCSAgRXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgcGFja2V0LgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQNl9ORl9NQVRDSF9SVAogCXRyaXN0YXRlICJSb3V0aW5nIGhlYWRlciBtYXRjaCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCkBAIC0xMjQsMTYgKzEwNiw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVA2X05GX01BVENIX01BUksKLQl0cmlzdGF0ZSAibmV0ZmlsdGVyIE1BUksgbWF0Y2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIE5ldGZpbHRlciBtYXJrIG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gbWF0Y2ggcGFja2V0cyBiYXNlZCBvbiB0aGUKLQkgIGBuZm1hcmsnIHZhbHVlIGluIHRoZSBwYWNrZXQuICBUaGlzIGNhbiBiZSBzZXQgYnkgdGhlIE1BUksgdGFyZ2V0Ci0JICAoc2VlIGJlbG93KS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUDZfTkZfTUFUQ0hfSVBWNkhFQURFUgogCXRyaXN0YXRlICJJUHY2IEV4dGVuc2lvbiBIZWFkZXJzIE1hdGNoIgogCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCkBAIC0xNTEsMTUgKzEyMyw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVA2X05GX01BVENIX0xFTkdUSAotCXRyaXN0YXRlICJQYWNrZXQgTGVuZ3RoIG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKLQloZWxwCi0JICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZSBsZW5ndGggb2YgYSBwYWNrZXQgYWdhaW5zdCBhCi0JICBzcGVjaWZpYyB2YWx1ZSBvciByYW5nZSBvZiB2YWx1ZXMuCi0KLQkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgSVA2X05GX01BVENIX0VVSTY0CiAJdHJpc3RhdGUgIkVVSTY0IGFkZHJlc3MgY2hlY2siCiAJZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMKQEAgLTE3MCwxNSArMTMzLDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUDZfTkZfTUFUQ0hfUEhZU0RFVgotCXRyaXN0YXRlICJQaHlzZGV2IG1hdGNoIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUDZfTkZfSVBUQUJMRVMgJiYgQlJJREdFX05FVEZJTFRFUgotCWhlbHAKLQkgIFBoeXNkZXYgcGFja2V0IG1hdGNoaW5nIG1hdGNoZXMgYWdhaW5zdCB0aGUgcGh5c2ljYWwgYnJpZGdlIHBvcnRzCi0JICB0aGUgSVAgcGFja2V0IGFycml2ZWQgb24gb3Igd2lsbCBsZWF2ZSBieS4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUDZfTkZfTUFUQ0hfUE9MSUNZCiAJdHJpc3RhdGUgIklQc2VjIHBvbGljeSBtYXRjaCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTICYmIFhGUk0KQEAgLTIxOSwxNyArMTczLDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBJUDZfTkZfVEFSR0VUX05GUVVFVUUKLQl0cmlzdGF0ZSAiTkZRVUVVRSBUYXJnZXQgU3VwcG9ydCIKLQlkZXBlbmRzIG9uIElQNl9ORl9JUFRBQkxFUwotCWhlbHAKLQkgIFRoaXMgVGFyZ2V0IHJlcGxhY2VkIHRoZSBvbGQgb2Jzb2xldGUgUVVFVUUgdGFyZ2V0LgotCi0JICBBcyBvcHBvc2VkIHRvIFFVRVVFLCBpdCBzdXBwb3J0cyA2NTUzNSBkaWZmZXJlbnQgcXVldWVzLAotCSAgbm90IGp1c3Qgb25lLgotCi0JICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIElQNl9ORl9NQU5HTEUKIAl0cmlzdGF0ZSAiUGFja2V0IG1hbmdsaW5nIgogCWRlcGVuZHMgb24gSVA2X05GX0lQVEFCTEVTCkBAIC0yNDAsMTkgKzE4Myw2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgSVA2X05GX1RBUkdFVF9NQVJLCi0JdHJpc3RhdGUgIk1BUksgdGFyZ2V0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJUDZfTkZfTUFOR0xFCi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBNQVJLJyB0YXJnZXQsIHdoaWNoIGFsbG93cyB5b3UgdG8gY3JlYXRlIHJ1bGVzCi0JICBpbiB0aGUgYG1hbmdsZScgdGFibGUgd2hpY2ggYWx0ZXIgdGhlIG5ldGZpbHRlciBtYXJrIChuZm1hcmspIGZpZWxkCi0JICBhc3NvY2lhdGVkIHdpdGggdGhlIHBhY2tldCBwYWNrZXQgcHJpb3IgdG8gcm91dGluZy4gVGhpcyBjYW4gY2hhbmdlCi0JICB0aGUgcm91dGluZyBtZXRob2QgKHNlZSBgVXNlIG5ldGZpbHRlciBNQVJLIHZhbHVlIGFzIHJvdXRpbmcKLQkgIGtleScpIGFuZCBjYW4gYWxzbyBiZSB1c2VkIGJ5IG90aGVyIHN1YnN5c3RlbXMgdG8gY2hhbmdlIHRoZWlyCi0JICBiZWhhdmlvci4KLQotCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBJUDZfTkZfVEFSR0VUX0hMCiAJdHJpc3RhdGUgICdITCAoaG9wbGltaXQpIHRhcmdldCBzdXBwb3J0JwogCWRlcGVuZHMgb24gSVA2X05GX01BTkdMRQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IGMwYzgwOWIuLjY2M2I0NzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTQsMTAgKzQsNyBAQAogCiAjIExpbmsgb3JkZXIgbWF0dGVycyBoZXJlLgogb2JqLSQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgKz0gaXA2X3RhYmxlcy5vCi1vYmotJChDT05GSUdfSVA2X05GX01BVENIX0xJTUlUKSArPSBpcDZ0X2xpbWl0Lm8KLW9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfTUFSSykgKz0gaXA2dF9tYXJrLm8KIG9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfTEVOR1RIKSArPSBpcDZ0X2xlbmd0aC5vCi1vYmotJChDT05GSUdfSVA2X05GX01BVENIX01BQykgKz0gaXA2dF9tYWMubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9SVCkgKz0gaXA2dF9ydC5vCiBvYmotJChDT05GSUdfSVA2X05GX01BVENIX09QVFMpICs9IGlwNnRfaGJoLm8gaXA2dF9kc3Qubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9JUFY2SEVBREVSKSArPSBpcDZ0X2lwdjZoZWFkZXIubwpAQCAtMTcsMTIgKzE0LDkgQEAKIG9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfRVVJNjQpICs9IGlwNnRfZXVpNjQubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9NVUxUSVBPUlQpICs9IGlwNnRfbXVsdGlwb3J0Lm8KIG9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfT1dORVIpICs9IGlwNnRfb3duZXIubwotb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9QSFlTREVWKSArPSBpcDZ0X3BoeXNkZXYubwogb2JqLSQoQ09ORklHX0lQNl9ORl9GSUxURVIpICs9IGlwNnRhYmxlX2ZpbHRlci5vCiBvYmotJChDT05GSUdfSVA2X05GX01BTkdMRSkgKz0gaXA2dGFibGVfbWFuZ2xlLm8KLW9iai0kKENPTkZJR19JUDZfTkZfVEFSR0VUX01BUkspICs9IGlwNnRfTUFSSy5vCiBvYmotJChDT05GSUdfSVA2X05GX1RBUkdFVF9ITCkgKz0gaXA2dF9ITC5vCi1vYmotJChDT05GSUdfSVA2X05GX1RBUkdFVF9ORlFVRVVFKSArPSBpcDZ0X05GUVVFVUUubwogb2JqLSQoQ09ORklHX0lQNl9ORl9RVUVVRSkgKz0gaXA2X3F1ZXVlLm8KIG9iai0kKENPTkZJR19JUDZfTkZfVEFSR0VUX0xPRykgKz0gaXA2dF9MT0cubwogb2JqLSQoQ09ORklHX0lQNl9ORl9SQVcpICs9IGlwNnRhYmxlX3Jhdy5vCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYwppbmRleCAxMzkwMzcwLi44NDcwNjhmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKQEAgLTEzLDYgKzEzLDkgQEAKICAqIAkgIGEgdGFibGUKICAqIDA2IEp1biAyMDAyIEFuZHJhcyBLaXMtU3phYm8gPGtpc3phQHNjaC5ibWUuaHU+CiAgKiAgICAgIC0gbmV3IGV4dGVuc2lvbiBoZWFkZXIgcGFyc2VyIGNvZGUKKyAqIDE1IE9jdCAyMDA1IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICogCS0gVW5pZmljYXRpb24gb2Yge2lwLGlwNn1fdGFibGVzIGludG8geF90YWJsZXMKKyAqIAktIFJlbW92ZWQgdGNwIGFuZCB1ZHAgY29kZSwgc2luY2UgaXQncyBub3QgaXB2NiBzcGVjaWZpYwogICovCiAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CkBAIC0yMyw4ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ljbXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTMzLDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7CkBAIC02NywxMyArNjksOCBAQAogI2Vsc2UKICNkZWZpbmUgSVBfTkZfQVNTRVJUKHgpCiAjZW5kaWYKLSNkZWZpbmUgU01QX0FMSUdOKHgpICgoKHgpICsgU01QX0NBQ0hFX0JZVEVTLTEpICYgfihTTVBfQ0FDSEVfQllURVMtMSkpCiAKLXN0YXRpYyBERUNMQVJFX01VVEVYKGlwNnRfbXV0ZXgpOwogCi0vKiBNdXN0IGhhdmUgbXV0ZXggKi8KLSNkZWZpbmUgQVNTRVJUX1JFQURfTE9DSyh4KSBJUF9ORl9BU1NFUlQoZG93bl90cnlsb2NrKCZpcDZ0X211dGV4KSAhPSAwKQotI2RlZmluZSBBU1NFUlRfV1JJVEVfTE9DSyh4KSBJUF9ORl9BU1NFUlQoZG93bl90cnlsb2NrKCZpcDZ0X211dGV4KSAhPSAwKQogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2xpc3RoZWxwLmg+CiAKICNpZiAwCkBAIC05MSwzMCArODgsNiBAQAogCiAgICBIZW5jZSB0aGUgc3RhcnQgb2YgYW55IHRhYmxlIGlzIGdpdmVuIGJ5IGdldF90YWJsZSgpIGJlbG93LiAgKi8KIAotLyogVGhlIHRhYmxlIGl0c2VsZiAqLwotc3RydWN0IGlwNnRfdGFibGVfaW5mbwotewotCS8qIFNpemUgcGVyIHRhYmxlICovCi0JdW5zaWduZWQgaW50IHNpemU7Ci0JLyogTnVtYmVyIG9mIGVudHJpZXM6IEZJWE1FLiAtLVJSICovCi0JdW5zaWduZWQgaW50IG51bWJlcjsKLQkvKiBJbml0aWFsIG51bWJlciBvZiBlbnRyaWVzLiBOZWVkZWQgZm9yIG1vZHVsZSB1c2FnZSBjb3VudCAqLwotCXVuc2lnbmVkIGludCBpbml0aWFsX2VudHJpZXM7Ci0KLQkvKiBFbnRyeSBwb2ludHMgYW5kIHVuZGVyZmxvd3MgKi8KLQl1bnNpZ25lZCBpbnQgaG9va19lbnRyeVtORl9JUDZfTlVNSE9PS1NdOwotCXVuc2lnbmVkIGludCB1bmRlcmZsb3dbTkZfSVA2X05VTUhPT0tTXTsKLQotCS8qIGlwNnRfZW50cnkgdGFibGVzOiBvbmUgcGVyIENQVSAqLwotCXZvaWQgKmVudHJpZXNbTlJfQ1BVU107Ci19OwotCi1zdGF0aWMgTElTVF9IRUFEKGlwNnRfdGFyZ2V0KTsKLXN0YXRpYyBMSVNUX0hFQUQoaXA2dF9tYXRjaCk7Ci1zdGF0aWMgTElTVF9IRUFEKGlwNnRfdGFibGVzKTsKLSNkZWZpbmUgU0VUX0NPVU5URVIoYyxiLHApIGRvIHsgKGMpLmJjbnQgPSAoYik7IChjKS5wY250ID0gKHApOyB9IHdoaWxlKDApCi0jZGVmaW5lIEFERF9DT1VOVEVSKGMsYixwKSBkbyB7IChjKS5iY250ICs9IChiKTsgKGMpLnBjbnQgKz0gKHApOyB9IHdoaWxlKDApCi0KICNpZiAwCiAjZGVmaW5lIGRvd24oeCkgZG8geyBwcmludGsoIkRPV046JXU6IiAjeCAiXG4iLCBfX0xJTkVfXyk7IGRvd24oeCk7IH0gd2hpbGUoMCkKICNkZWZpbmUgZG93bl9pbnRlcnJ1cHRpYmxlKHgpICh7IGludCBfX3I7IHByaW50aygiRE9XTmk6JXU6IiAjeCAiXG4iLCBfX0xJTkVfXyk7IF9fciA9IGRvd25faW50ZXJydXB0aWJsZSh4KTsgaWYgKF9fciAhPSAwKSBwcmludGsoIkFCT1JULURPV05pOiV1XG4iLCBfX0xJTkVfXyk7IF9fcjsgfSkKQEAgLTI5Nyw3ICsyNzAsNyBAQAogCSAgICAgIHVuc2lnbmVkIGludCBob29rLAogCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKIAkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgICAgIHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKKwkgICAgICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAogCSAgICAgIHZvaWQgKnVzZXJkYXRhKQogewogCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHNpemVvZihsb25nKSkpKTsKQEAgLTMwOSw2ICsyODIsNyBAQAogCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OwogCXZvaWQgKnRhYmxlX2Jhc2U7CiAJc3RydWN0IGlwNnRfZW50cnkgKmUsICpiYWNrOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOwogCiAJLyogSW5pdGlhbGl6YXRpb24gKi8KIAlpbmRldiA9IGluID8gaW4tPm5hbWUgOiBudWxsZGV2bmFtZTsKQEAgLTMyMSw5ICsyOTUsMTAgQEAKIAkgKiBtYXRjaCBpdC4gKi8KIAogCXJlYWRfbG9ja19iaCgmdGFibGUtPmxvY2spOworCXByaXZhdGUgPSB0YWJsZS0+cHJpdmF0ZTsKIAlJUF9ORl9BU1NFUlQodGFibGUtPnZhbGlkX2hvb2tzICYgKDEgPDwgaG9vaykpOwotCXRhYmxlX2Jhc2UgPSAodm9pZCAqKXRhYmxlLT5wcml2YXRlLT5lbnRyaWVzW3NtcF9wcm9jZXNzb3JfaWQoKV07Ci0JZSA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCB0YWJsZS0+cHJpdmF0ZS0+aG9va19lbnRyeVtob29rXSk7CisJdGFibGVfYmFzZSA9ICh2b2lkICopcHJpdmF0ZS0+ZW50cmllc1tzbXBfcHJvY2Vzc29yX2lkKCldOworCWUgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgcHJpdmF0ZS0+aG9va19lbnRyeVtob29rXSk7CiAKICNpZmRlZiBDT05GSUdfTkVURklMVEVSX0RFQlVHCiAJLyogQ2hlY2sgbm9vbmUgZWxzZSB1c2luZyBvdXIgdGFibGUgKi8KQEAgLTMzOSw3ICszMTQsNyBAQAogI2VuZGlmCiAKIAkvKiBGb3IgcmV0dXJuIGZyb20gYnVpbHRpbiBjaGFpbiAqLwotCWJhY2sgPSBnZXRfZW50cnkodGFibGVfYmFzZSwgdGFibGUtPnByaXZhdGUtPnVuZGVyZmxvd1tob29rXSk7CisJYmFjayA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCBwcml2YXRlLT51bmRlcmZsb3dbaG9va10pOwogCiAJZG8gewogCQlJUF9ORl9BU1NFUlQoZSk7CkBAIC00MzksMTQ1ICs0MTQsNiBAQAogI2VuZGlmCiB9CiAKLS8qCi0gKiBUaGVzZSBhcmUgd2VpcmQsIGJ1dCBtb2R1bGUgbG9hZGluZyBtdXN0IG5vdCBiZSBkb25lIHdpdGggbXV0ZXgKLSAqIGhlbGQgKHNpbmNlIHRoZXkgd2lsbCByZWdpc3RlciksIGFuZCB3ZSBoYXZlIHRvIGhhdmUgYSBzaW5nbGUKLSAqIGZ1bmN0aW9uIHRvIHVzZSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSgpLgotICovCi0KLS8qIEZpbmQgdGFibGUgYnkgbmFtZSwgZ3JhYnMgbXV0ZXggJiByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwNnRfdGFibGUgKmZpbmRfdGFibGVfbG9jayhjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBpcDZ0X3RhYmxlICp0OwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmlwNnRfdGFibGVzLCBsaXN0KQotCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDAgJiYgdHJ5X21vZHVsZV9nZXQodC0+bWUpKQotCQkJcmV0dXJuIHQ7Ci0JdXAoJmlwNnRfbXV0ZXgpOwotCXJldHVybiBOVUxMOwotfQotCi0vKiBGaW5kIG1hdGNoLCBncmFicyByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlwNnRfbWF0Y2ggKmZpbmRfbWF0Y2goY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCi17Ci0Jc3RydWN0IGlwNnRfbWF0Y2ggKm07Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KSAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVFIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmaXA2dF9tYXRjaCwgbGlzdCkgewotCQlpZiAoc3RyY21wKG0tPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmIChtLT5yZXZpc2lvbiA9PSByZXZpc2lvbikgewotCQkJCWlmICh0cnlfbW9kdWxlX2dldChtLT5tZSkpIHsKLQkJCQkJdXAoJmlwNnRfbXV0ZXgpOwotCQkJCQlyZXR1cm4gbTsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQllcnIgPSAtRVBST1RPVFlQRTsgLyogRm91bmQgc29tZXRoaW5nLiAqLwotCQl9Ci0JfQotCXVwKCZpcDZ0X211dGV4KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi0vKiBGaW5kIHRhcmdldCwgZ3JhYnMgcmVmLiAgUmV0dXJucyBFUlJfUFRSKCkgb24gZXJyb3IuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcDZ0X3RhcmdldCAqZmluZF90YXJnZXQoY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCi17Ci0Jc3RydWN0IGlwNnRfdGFyZ2V0ICp0OwotCWludCBlcnIgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJmlwNnRfdGFyZ2V0LCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJaWYgKHQtPnJldmlzaW9uID09IHJldmlzaW9uKSB7Ci0JCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KHQtPm1lKSkgewotCQkJCQl1cCgmaXA2dF9tdXRleCk7Ci0JCQkJCXJldHVybiB0OwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWVyciA9IC1FUFJPVE9UWVBFOyAvKiBGb3VuZCBzb21ldGhpbmcuICovCi0JCX0KLQl9Ci0JdXAoJmlwNnRfbXV0ZXgpOwotCXJldHVybiBFUlJfUFRSKGVycik7Ci19Ci0KLXN0cnVjdCBpcDZ0X3RhcmdldCAqaXA2dF9maW5kX3RhcmdldChjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKLXsKLQlzdHJ1Y3QgaXA2dF90YXJnZXQgKnRhcmdldDsKLQotCXRhcmdldCA9IHRyeV90aGVuX3JlcXVlc3RfbW9kdWxlKGZpbmRfdGFyZ2V0KG5hbWUsIHJldmlzaW9uKSwKLQkJCQkJICJpcDZ0XyVzIiwgbmFtZSk7Ci0JaWYgKElTX0VSUih0YXJnZXQpIHx8ICF0YXJnZXQpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiB0YXJnZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbWF0Y2hfcmV2Zm4oY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCAqYmVzdHApCi17Ci0Jc3RydWN0IGlwNnRfbWF0Y2ggKm07Ci0JaW50IGhhdmVfcmV2ID0gMDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJmlwNnRfbWF0Y2gsIGxpc3QpIHsKLQkJaWYgKHN0cmNtcChtLT5uYW1lLCBuYW1lKSA9PSAwKSB7Ci0JCQlpZiAobS0+cmV2aXNpb24gPiAqYmVzdHApCi0JCQkJKmJlc3RwID0gbS0+cmV2aXNpb247Ci0JCQlpZiAobS0+cmV2aXNpb24gPT0gcmV2aXNpb24pCi0JCQkJaGF2ZV9yZXYgPSAxOwotCQl9Ci0JfQotCXJldHVybiBoYXZlX3JldjsKLX0KLQotc3RhdGljIGludCB0YXJnZXRfcmV2Zm4oY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCAqYmVzdHApCi17Ci0Jc3RydWN0IGlwNnRfdGFyZ2V0ICp0OwotCWludCBoYXZlX3JldiA9IDA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZpcDZ0X3RhcmdldCwgbGlzdCkgewotCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDApIHsKLQkJCWlmICh0LT5yZXZpc2lvbiA+ICpiZXN0cCkKLQkJCQkqYmVzdHAgPSB0LT5yZXZpc2lvbjsKLQkJCWlmICh0LT5yZXZpc2lvbiA9PSByZXZpc2lvbikKLQkJCQloYXZlX3JldiA9IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIGhhdmVfcmV2OwotfQotCi0vKiBSZXR1cm5zIHRydWUgb3IgZmFscyAoaWYgbm8gc3VjaCBleHRlbnNpb24gYXQgYWxsKSAqLwotc3RhdGljIGlubGluZSBpbnQgZmluZF9yZXZpc2lvbihjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbiwKLQkJCQlpbnQgKCpyZXZmbikoY29uc3QgY2hhciAqLCB1OCwgaW50ICopLAotCQkJCWludCAqZXJyKQotewotCWludCBoYXZlX3JldiwgYmVzdCA9IC0xOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCkgIT0gMCkgewotCQkqZXJyID0gLUVJTlRSOwotCQlyZXR1cm4gMTsKLQl9Ci0JaGF2ZV9yZXYgPSByZXZmbihuYW1lLCByZXZpc2lvbiwgJmJlc3QpOwotCXVwKCZpcDZ0X211dGV4KTsKLQotCS8qIE5vdGhpbmcgYXQgYWxsPyAgUmV0dXJuIDAgdG8gdHJ5IGxvYWRpbmcgbW9kdWxlLiAqLwotCWlmIChiZXN0ID09IC0xKSB7Ci0JCSplcnIgPSAtRU5PRU5UOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkqZXJyID0gYmVzdDsKLQlpZiAoIWhhdmVfcmV2KQotCQkqZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKLQlyZXR1cm4gMTsKLX0KLQotCiAvKiBBbGwgemVyb2VzID09IHVuY29uZGl0aW9uYWwgcnVsZS4gKi8KIHN0YXRpYyBpbmxpbmUgaW50CiB1bmNvbmRpdGlvbmFsKGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NikKQEAgLTU5NCw3ICs0MzAsNyBAQAogLyogRmlndXJlcyBvdXQgZnJvbSB3aGF0IGhvb2sgZWFjaCBydWxlIGNhbiBiZSBjYWxsZWQ6IHJldHVybnMgMCBpZgogICAgdGhlcmUgYXJlIGxvb3BzLiAgUHV0cyBob29rIGJpdG1hc2sgaW4gY29tZWZyb20uICovCiBzdGF0aWMgaW50Ci1tYXJrX3NvdXJjZV9jaGFpbnMoc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbywKK21hcmtfc291cmNlX2NoYWlucyhzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKIAkJICAgdW5zaWduZWQgaW50IHZhbGlkX2hvb2tzLCB2b2lkICplbnRyeTApCiB7CiAJdW5zaWduZWQgaW50IGhvb2s7CkBAIC03NDAsMTEgKzU3NiwxMSBAQAogewogCXN0cnVjdCBpcDZ0X21hdGNoICptYXRjaDsKIAotCW1hdGNoID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF9tYXRjaChtLT51LnVzZXIubmFtZSwKLQkJCQkJCSAgIG0tPnUudXNlci5yZXZpc2lvbiksCisJbWF0Y2ggPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX21hdGNoKEFGX0lORVQ2LCBtLT51LnVzZXIubmFtZSwKKwkJCSAgICAgIAkJbS0+dS51c2VyLnJldmlzaW9uKSwKIAkJCQkJImlwNnRfJXMiLCBtLT51LnVzZXIubmFtZSk7CiAJaWYgKElTX0VSUihtYXRjaCkgfHwgIW1hdGNoKSB7Ci0JCWR1cHJpbnRmKCJjaGVja19tYXRjaDogYCVzJyBub3QgZm91bmRcbiIsIG0tPnUudXNlci5uYW1lKTsKKwkgIAlkdXByaW50ZigiY2hlY2tfbWF0Y2g6IGAlcycgbm90IGZvdW5kXG4iLCBtLT51LnVzZXIubmFtZSk7CiAJCXJldHVybiBtYXRjaCA/IFBUUl9FUlIobWF0Y2gpIDogLUVOT0VOVDsKIAl9CiAJbS0+dS5rZXJuZWwubWF0Y2ggPSBtYXRjaDsKQEAgLTc4NSw4ICs2MjEsOSBAQAogCQlnb3RvIGNsZWFudXBfbWF0Y2hlczsKIAogCXQgPSBpcDZ0X2dldF90YXJnZXQoZSk7Ci0JdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF90YXJnZXQodC0+dS51c2VyLm5hbWUsCi0JCQkJCQkgICAgIHQtPnUudXNlci5yZXZpc2lvbiksCisJdGFyZ2V0ID0gdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoeHRfZmluZF90YXJnZXQoQUZfSU5FVDYsCisJCQkJCQkJdC0+dS51c2VyLm5hbWUsCisJCQkJCQkJdC0+dS51c2VyLnJldmlzaW9uKSwKIAkJCQkJICJpcDZ0XyVzIiwgdC0+dS51c2VyLm5hbWUpOwogCWlmIChJU19FUlIodGFyZ2V0KSB8fCAhdGFyZ2V0KSB7CiAJCWR1cHJpbnRmKCJjaGVja19lbnRyeTogYCVzJyBub3QgZm91bmRcbiIsIHQtPnUudXNlci5uYW1lKTsKQEAgLTgyMiw3ICs2NTksNyBAQAogCiBzdGF0aWMgaW5saW5lIGludAogY2hlY2tfZW50cnlfc2l6ZV9hbmRfaG9va3Moc3RydWN0IGlwNnRfZW50cnkgKmUsCi0JCQkgICBzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICpuZXdpbmZvLAorCQkJICAgc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sCiAJCQkgICB1bnNpZ25lZCBjaGFyICpiYXNlLAogCQkJICAgdW5zaWduZWQgY2hhciAqbGltaXQsCiAJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgKmhvb2tfZW50cmllcywKQEAgLTg1Niw3ICs2OTMsNyBAQAogICAgICAgICAgICA8IDAgKG5vdCBJUDZUX1JFVFVSTikuIC0tUlIgKi8KIAogCS8qIENsZWFyIGNvdW50ZXJzIGFuZCBjb21lZnJvbSAqLwotCWUtPmNvdW50ZXJzID0gKChzdHJ1Y3QgaXA2dF9jb3VudGVycykgeyAwLCAwIH0pOworCWUtPmNvdW50ZXJzID0gKChzdHJ1Y3QgeHRfY291bnRlcnMpIHsgMCwgMCB9KTsKIAllLT5jb21lZnJvbSA9IDA7CiAKIAkoKmkpKys7CkBAIC04ODYsNyArNzIzLDcgQEAKIHN0YXRpYyBpbnQKIHRyYW5zbGF0ZV90YWJsZShjb25zdCBjaGFyICpuYW1lLAogCQl1bnNpZ25lZCBpbnQgdmFsaWRfaG9va3MsCi0JCXN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKm5ld2luZm8sCisJCXN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvLAogCQl2b2lkICplbnRyeTAsCiAJCXVuc2lnbmVkIGludCBzaXplLAogCQl1bnNpZ25lZCBpbnQgbnVtYmVyLApAQCAtOTYzLDQ4ICs4MDAsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqCi1yZXBsYWNlX3RhYmxlKHN0cnVjdCBpcDZ0X3RhYmxlICp0YWJsZSwKLQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzLAotCSAgICAgIHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKm5ld2luZm8sCi0JICAgICAgaW50ICplcnJvcikKLXsKLQlzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICpvbGRpbmZvOwotCi0jaWZkZWYgQ09ORklHX05FVEZJTFRFUl9ERUJVRwotCXsKLQkJaW50IGNwdTsKLQotCQlmb3JfZWFjaF9jcHUoY3B1KSB7Ci0JCQlzdHJ1Y3QgaXA2dF9lbnRyeSAqdGFibGVfYmFzZSA9IG5ld2luZm8tPmVudHJpZXNbY3B1XTsKLQkJCWlmICh0YWJsZV9iYXNlKQotCQkJCXRhYmxlX2Jhc2UtPmNvbWVmcm9tID0gMHhkZWFkNTdhYzsKLQkJfQotCX0KLSNlbmRpZgotCi0JLyogRG8gdGhlIHN1YnN0aXR1dGlvbi4gKi8KLQl3cml0ZV9sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0JLyogQ2hlY2sgaW5zaWRlIGxvY2s6IGlzIHRoZSBvbGQgbnVtYmVyIGNvcnJlY3Q/ICovCi0JaWYgKG51bV9jb3VudGVycyAhPSB0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyKSB7Ci0JCWR1cHJpbnRmKCJudW1fY291bnRlcnMgIT0gdGFibGUtPnByaXZhdGUtPm51bWJlciAoJXUvJXUpXG4iLAotCQkJIG51bV9jb3VudGVycywgdGFibGUtPnByaXZhdGUtPm51bWJlcik7Ci0JCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOwotCQkqZXJyb3IgPSAtRUFHQUlOOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jb2xkaW5mbyA9IHRhYmxlLT5wcml2YXRlOwotCXRhYmxlLT5wcml2YXRlID0gbmV3aW5mbzsKLQluZXdpbmZvLT5pbml0aWFsX2VudHJpZXMgPSBvbGRpbmZvLT5pbml0aWFsX2VudHJpZXM7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZ0YWJsZS0+bG9jayk7Ci0KLQlyZXR1cm4gb2xkaW5mbzsKLX0KLQogLyogR2V0cyBjb3VudGVycy4gKi8KIHN0YXRpYyBpbmxpbmUgaW50CiBhZGRfZW50cnlfdG9fY291bnRlcihjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKLQkJICAgICBzdHJ1Y3QgaXA2dF9jb3VudGVycyB0b3RhbFtdLAorCQkgICAgIHN0cnVjdCB4dF9jb3VudGVycyB0b3RhbFtdLAogCQkgICAgIHVuc2lnbmVkIGludCAqaSkKIHsKIAlBRERfQ09VTlRFUih0b3RhbFsqaV0sIGUtPmNvdW50ZXJzLmJjbnQsIGUtPmNvdW50ZXJzLnBjbnQpOwpAQCAtMTAyNSw4ICs4MjQsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotZ2V0X2NvdW50ZXJzKGNvbnN0IHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKnQsCi0JICAgICBzdHJ1Y3QgaXA2dF9jb3VudGVycyBjb3VudGVyc1tdKQorZ2V0X2NvdW50ZXJzKGNvbnN0IHN0cnVjdCB4dF90YWJsZV9pbmZvICp0LAorCSAgICAgc3RydWN0IHh0X2NvdW50ZXJzIGNvdW50ZXJzW10pCiB7CiAJdW5zaWduZWQgaW50IGNwdTsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTEwNjAsMTkgKzg1OSwyMCBAQAogCiBzdGF0aWMgaW50CiBjb3B5X2VudHJpZXNfdG9fdXNlcih1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZSwKLQkJICAgICBzdHJ1Y3QgaXA2dF90YWJsZSAqdGFibGUsCisJCSAgICAgc3RydWN0IHh0X3RhYmxlICp0YWJsZSwKIAkJICAgICB2b2lkIF9fdXNlciAqdXNlcnB0cikKIHsKIAl1bnNpZ25lZCBpbnQgb2ZmLCBudW0sIGNvdW50ZXJzaXplOwogCXN0cnVjdCBpcDZ0X2VudHJ5ICplOwotCXN0cnVjdCBpcDZ0X2NvdW50ZXJzICpjb3VudGVyczsKKwlzdHJ1Y3QgeHRfY291bnRlcnMgKmNvdW50ZXJzOworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CiAJaW50IHJldCA9IDA7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeTsKIAogCS8qIFdlIG5lZWQgYXRvbWljIHNuYXBzaG90IG9mIGNvdW50ZXJzOiByZXN0IGRvZXNuJ3QgY2hhbmdlCiAJICAgKG90aGVyIHRoYW4gY29tZWZyb20sIHdoaWNoIHVzZXJzcGFjZSBkb2Vzbid0IGNhcmUKIAkgICBhYm91dCkuICovCi0JY291bnRlcnNpemUgPSBzaXplb2Yoc3RydWN0IGlwNnRfY291bnRlcnMpICogdGFibGUtPnByaXZhdGUtPm51bWJlcjsKKwljb3VudGVyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgeHRfY291bnRlcnMpICogcHJpdmF0ZS0+bnVtYmVyOwogCWNvdW50ZXJzID0gdm1hbGxvYyhjb3VudGVyc2l6ZSk7CiAKIAlpZiAoY291bnRlcnMgPT0gTlVMTCkKQEAgLTEwODAsMTEgKzg4MCwxMSBAQAogCiAJLyogRmlyc3QsIHN1bSBjb3VudGVycy4uLiAqLwogCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT5sb2NrKTsKLQlnZXRfY291bnRlcnModGFibGUtPnByaXZhdGUsIGNvdW50ZXJzKTsKKwlnZXRfY291bnRlcnMocHJpdmF0ZSwgY291bnRlcnMpOwogCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOwogCiAJLyogY2hvb3NlIHRoZSBjb3B5IHRoYXQgaXMgb24gb3VyYyBub2RlL2NwdSAqLwotCWxvY19jcHVfZW50cnkgPSB0YWJsZS0+cHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlsb2NfY3B1X2VudHJ5ID0gcHJpdmF0ZS0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKIAlpZiAoY29weV90b191c2VyKHVzZXJwdHIsIGxvY19jcHVfZW50cnksIHRvdGFsX3NpemUpICE9IDApIHsKIAkJcmV0ID0gLUVGQVVMVDsKIAkJZ290byBmcmVlX2NvdW50ZXJzOwpAQCAtMTE0Myw4NyArOTQzLDQyIEBACiAJICAgIHN0cnVjdCBpcDZ0X2dldF9lbnRyaWVzIF9fdXNlciAqdXB0cikKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBpcDZ0X3RhYmxlICp0OworCXN0cnVjdCB4dF90YWJsZSAqdDsKIAotCXQgPSBmaW5kX3RhYmxlX2xvY2soZW50cmllcy0+bmFtZSk7CisJdCA9IHh0X2ZpbmRfdGFibGVfbG9jayhBRl9JTkVUNiwgZW50cmllcy0+bmFtZSk7CiAJaWYgKHQgJiYgIUlTX0VSUih0KSkgewotCQlkdXByaW50ZigidC0+cHJpdmF0ZS0+bnVtYmVyID0gJXVcbiIsCi0JCQkgdC0+cHJpdmF0ZS0+bnVtYmVyKTsKLQkJaWYgKGVudHJpZXMtPnNpemUgPT0gdC0+cHJpdmF0ZS0+c2l6ZSkKLQkJCXJldCA9IGNvcHlfZW50cmllc190b191c2VyKHQtPnByaXZhdGUtPnNpemUsCisJCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdC0+cHJpdmF0ZTsKKwkJZHVwcmludGYoInQtPnByaXZhdGUtPm51bWJlciA9ICV1XG4iLCBwcml2YXRlLT5udW1iZXIpOworCQlpZiAoZW50cmllcy0+c2l6ZSA9PSBwcml2YXRlLT5zaXplKQorCQkJcmV0ID0gY29weV9lbnRyaWVzX3RvX3VzZXIocHJpdmF0ZS0+c2l6ZSwKIAkJCQkJCSAgIHQsIHVwdHItPmVudHJ5dGFibGUpOwogCQllbHNlIHsKIAkJCWR1cHJpbnRmKCJnZXRfZW50cmllczogSSd2ZSBnb3QgJXUgbm90ICV1IVxuIiwKLQkJCQkgdC0+cHJpdmF0ZS0+c2l6ZSwKLQkJCQkgZW50cmllcy0+c2l6ZSk7CisJCQkJIHByaXZhdGUtPnNpemUsIGVudHJpZXMtPnNpemUpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJfQogCQltb2R1bGVfcHV0KHQtPm1lKTsKLQkJdXAoJmlwNnRfbXV0ZXgpOworCQl4dF90YWJsZV91bmxvY2sodCk7CiAJfSBlbHNlCiAJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfdGFibGVfaW5mbyhzdHJ1Y3QgaXA2dF90YWJsZV9pbmZvICppbmZvKQotewotCWludCBjcHU7Ci0JZm9yX2VhY2hfY3B1KGNwdSkgewotCQlpZiAoaW5mby0+c2l6ZSA8PSBQQUdFX1NJWkUpCi0JCQlrZnJlZShpbmZvLT5lbnRyaWVzW2NwdV0pOwotCQllbHNlCi0JCQl2ZnJlZShpbmZvLT5lbnRyaWVzW2NwdV0pOwotCX0KLQlrZnJlZShpbmZvKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKmFsbG9jX3RhYmxlX2luZm8odW5zaWduZWQgaW50IHNpemUpCi17Ci0Jc3RydWN0IGlwNnRfdGFibGVfaW5mbyAqbmV3aW5mbzsKLQlpbnQgY3B1OwotCi0JbmV3aW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld2luZm8pCi0JCXJldHVybiBOVUxMOwotCi0JbmV3aW5mby0+c2l6ZSA9IHNpemU7Ci0KLQlmb3JfZWFjaF9jcHUoY3B1KSB7Ci0JCWlmIChzaXplIDw9IFBBR0VfU0laRSkKLQkJCW5ld2luZm8tPmVudHJpZXNbY3B1XSA9IGttYWxsb2Nfbm9kZShzaXplLAotCQkJCQkJCUdGUF9LRVJORUwsCi0JCQkJCQkJY3B1X3RvX25vZGUoY3B1KSk7Ci0JCWVsc2UKLQkJCW5ld2luZm8tPmVudHJpZXNbY3B1XSA9IHZtYWxsb2Nfbm9kZShzaXplLAotCQkJCQkJCSAgICAgY3B1X3RvX25vZGUoY3B1KSk7Ci0JCWlmIChuZXdpbmZvLT5lbnRyaWVzW2NwdV0gPT0gTlVMTCkgewotCQkJZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbmV3aW5mbzsKLX0KLQogc3RhdGljIGludAogZG9fcmVwbGFjZSh2b2lkIF9fdXNlciAqdXNlciwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBpcDZ0X3JlcGxhY2UgdG1wOwotCXN0cnVjdCBpcDZ0X3RhYmxlICp0OwotCXN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKm5ld2luZm8sICpvbGRpbmZvOwotCXN0cnVjdCBpcDZ0X2NvdW50ZXJzICpjb3VudGVyczsKKwlzdHJ1Y3QgeHRfdGFibGUgKnQ7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm8sICpvbGRpbmZvOworCXN0cnVjdCB4dF9jb3VudGVycyAqY291bnRlcnM7CiAJdm9pZCAqbG9jX2NwdV9lbnRyeSwgKmxvY19jcHVfb2xkX2VudHJ5OwogCiAJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXIsIHNpemVvZih0bXApKSAhPSAwKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCS8qIFBlZGFudHJ5OiBwcmV2ZW50IHRoZW0gZnJvbSBoaXR0aW5nIEJVRygpIGluIHZtYWxsb2MuYyAtLVJSICovCi0JaWYgKChTTVBfQUxJR04odG1wLnNpemUpID4+IFBBR0VfU0hJRlQpICsgMiA+IG51bV9waHlzcGFnZXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbmV3aW5mbyA9IGFsbG9jX3RhYmxlX2luZm8odG1wLnNpemUpOworCW5ld2luZm8gPSB4dF9hbGxvY190YWJsZV9pbmZvKHRtcC5zaXplKTsKIAlpZiAoIW5ld2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMjM1LDcgKzk5MCw3IEBACiAJCWdvdG8gZnJlZV9uZXdpbmZvOwogCX0KIAotCWNvdW50ZXJzID0gdm1hbGxvYyh0bXAubnVtX2NvdW50ZXJzICogc2l6ZW9mKHN0cnVjdCBpcDZ0X2NvdW50ZXJzKSk7CisJY291bnRlcnMgPSB2bWFsbG9jKHRtcC5udW1fY291bnRlcnMgKiBzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSk7CiAJaWYgKCFjb3VudGVycykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZyZWVfbmV3aW5mbzsKQEAgLTEyNDksNyArMTAwNCw3IEBACiAKIAlkdXByaW50ZigiaXBfdGFibGVzOiBUcmFuc2xhdGVkIHRhYmxlXG4iKTsKIAotCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhYmxlX2xvY2sodG1wLm5hbWUpLAorCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhYmxlX2xvY2soQUZfSU5FVDYsIHRtcC5uYW1lKSwKIAkJCQkgICAgImlwNnRhYmxlXyVzIiwgdG1wLm5hbWUpOwogCWlmICghdCB8fCBJU19FUlIodCkpIHsKIAkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwpAQCAtMTI2NCw3ICsxMDE5LDcgQEAKIAkJZ290byBwdXRfbW9kdWxlOwogCX0KIAotCW9sZGluZm8gPSByZXBsYWNlX3RhYmxlKHQsIHRtcC5udW1fY291bnRlcnMsIG5ld2luZm8sICZyZXQpOworCW9sZGluZm8gPSB4dF9yZXBsYWNlX3RhYmxlKHQsIHRtcC5udW1fY291bnRlcnMsIG5ld2luZm8sICZyZXQpOwogCWlmICghb2xkaW5mbykKIAkJZ290byBwdXRfbW9kdWxlOwogCkBAIC0xMjgzLDIzICsxMDM4LDIzIEBACiAJLyogRGVjcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50cyBhbmQgZnJlZSByZXNvdXJjZSAqLwogCWxvY19jcHVfb2xkX2VudHJ5ID0gb2xkaW5mby0+ZW50cmllc1tyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpXTsKIAlJUDZUX0VOVFJZX0lURVJBVEUobG9jX2NwdV9vbGRfZW50cnksIG9sZGluZm8tPnNpemUsIGNsZWFudXBfZW50cnksTlVMTCk7Ci0JZnJlZV90YWJsZV9pbmZvKG9sZGluZm8pOworCXh0X2ZyZWVfdGFibGVfaW5mbyhvbGRpbmZvKTsKIAlpZiAoY29weV90b191c2VyKHRtcC5jb3VudGVycywgY291bnRlcnMsCi0JCQkgc2l6ZW9mKHN0cnVjdCBpcDZ0X2NvdW50ZXJzKSAqIHRtcC5udW1fY291bnRlcnMpICE9IDApCisJCQkgc2l6ZW9mKHN0cnVjdCB4dF9jb3VudGVycykgKiB0bXAubnVtX2NvdW50ZXJzKSAhPSAwKQogCQlyZXQgPSAtRUZBVUxUOwogCXZmcmVlKGNvdW50ZXJzKTsKLQl1cCgmaXA2dF9tdXRleCk7CisJeHRfdGFibGVfdW5sb2NrKHQpOwogCXJldHVybiByZXQ7CiAKICBwdXRfbW9kdWxlOgogCW1vZHVsZV9wdXQodC0+bWUpOwotCXVwKCZpcDZ0X211dGV4KTsKKwl4dF90YWJsZV91bmxvY2sodCk7CiAgZnJlZV9uZXdpbmZvX2NvdW50ZXJzX3VudHJhbnM6CiAJSVA2VF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIG5ld2luZm8tPnNpemUsIGNsZWFudXBfZW50cnksTlVMTCk7CiAgZnJlZV9uZXdpbmZvX2NvdW50ZXJzOgogCXZmcmVlKGNvdW50ZXJzKTsKICBmcmVlX25ld2luZm86Ci0JZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOworCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzA3LDcgKzEwNjIsNyBAQAogICogYW5kIGV2ZXJ5dGhpbmcgaXMgT0suICovCiBzdGF0aWMgaW5saW5lIGludAogYWRkX2NvdW50ZXJfdG9fZW50cnkoc3RydWN0IGlwNnRfZW50cnkgKmUsCi0JCSAgICAgY29uc3Qgc3RydWN0IGlwNnRfY291bnRlcnMgYWRkbWVbXSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgeHRfY291bnRlcnMgYWRkbWVbXSwKIAkJICAgICB1bnNpZ25lZCBpbnQgKmkpCiB7CiAjaWYgMApAQCAtMTMyOSwxNSArMTA4NCwxNiBAQAogZG9fYWRkX2NvdW50ZXJzKHZvaWQgX191c2VyICp1c2VyLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBpcDZ0X2NvdW50ZXJzX2luZm8gdG1wLCAqcGFkZGM7Ci0Jc3RydWN0IGlwNnRfdGFibGUgKnQ7CisJc3RydWN0IHh0X2NvdW50ZXJzX2luZm8gdG1wLCAqcGFkZGM7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CisJc3RydWN0IHh0X3RhYmxlICp0OwogCWludCByZXQgPSAwOwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlciwgc2l6ZW9mKHRtcCkpICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKGxlbiAhPSBzaXplb2YodG1wKSArIHRtcC5udW1fY291bnRlcnMqc2l6ZW9mKHN0cnVjdCBpcDZ0X2NvdW50ZXJzKSkKKwlpZiAobGVuICE9IHNpemVvZih0bXApICsgdG1wLm51bV9jb3VudGVycypzaXplb2Yoc3RydWN0IHh0X2NvdW50ZXJzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYWRkYyA9IHZtYWxsb2MobGVuKTsKQEAgLTEzNDksMjkgKzExMDUsMzAgQEAKIAkJZ290byBmcmVlOwogCX0KIAotCXQgPSBmaW5kX3RhYmxlX2xvY2sodG1wLm5hbWUpOworCXQgPSB4dF9maW5kX3RhYmxlX2xvY2soQUZfSU5FVDYsIHRtcC5uYW1lKTsKIAlpZiAoIXQgfHwgSVNfRVJSKHQpKSB7CiAJCXJldCA9IHQgPyBQVFJfRVJSKHQpIDogLUVOT0VOVDsKIAkJZ290byBmcmVlOwogCX0KIAogCXdyaXRlX2xvY2tfYmgoJnQtPmxvY2spOwotCWlmICh0LT5wcml2YXRlLT5udW1iZXIgIT0gcGFkZGMtPm51bV9jb3VudGVycykgeworCXByaXZhdGUgPSB0LT5wcml2YXRlOworCWlmIChwcml2YXRlLT5udW1iZXIgIT0gcGFkZGMtPm51bV9jb3VudGVycykgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIHVubG9ja191cF9mcmVlOwogCX0KIAogCWkgPSAwOwogCS8qIENob29zZSB0aGUgY29weSB0aGF0IGlzIG9uIG91ciBub2RlICovCi0JbG9jX2NwdV9lbnRyeSA9IHQtPnByaXZhdGUtPmVudHJpZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlsb2NfY3B1X2VudHJ5ID0gcHJpdmF0ZS0+ZW50cmllc1tzbXBfcHJvY2Vzc29yX2lkKCldOwogCUlQNlRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LAotCQkJICB0LT5wcml2YXRlLT5zaXplLAorCQkJICBwcml2YXRlLT5zaXplLAogCQkJICBhZGRfY291bnRlcl90b19lbnRyeSwKIAkJCSAgcGFkZGMtPmNvdW50ZXJzLAogCQkJICAmaSk7CiAgdW5sb2NrX3VwX2ZyZWU6CiAJd3JpdGVfdW5sb2NrX2JoKCZ0LT5sb2NrKTsKLQl1cCgmaXA2dF9tdXRleCk7CisJeHRfdGFibGVfdW5sb2NrKHQpOwogCW1vZHVsZV9wdXQodC0+bWUpOwogIGZyZWU6CiAJdmZyZWUocGFkZGMpOwpAQCAtMTQxNSw3ICsxMTcyLDcgQEAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgSVA2VF9TT19HRVRfSU5GTzogewogCQljaGFyIG5hbWVbSVA2VF9UQUJMRV9NQVhOQU1FTEVOXTsKLQkJc3RydWN0IGlwNnRfdGFibGUgKnQ7CisJCXN0cnVjdCB4dF90YWJsZSAqdDsKIAogCQlpZiAoKmxlbiAhPSBzaXplb2Yoc3RydWN0IGlwNnRfZ2V0aW5mbykpIHsKIAkJCWR1cHJpbnRmKCJsZW5ndGggJXUgIT0gJXVcbiIsICpsZW4sCkBAIC0xNDMwLDI1ICsxMTg3LDI2IEBACiAJCX0KIAkJbmFtZVtJUDZUX1RBQkxFX01BWE5BTUVMRU4tMV0gPSAnXDAnOwogCi0JCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZShmaW5kX3RhYmxlX2xvY2sobmFtZSksCisJCXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhYmxlX2xvY2soQUZfSU5FVDYsIG5hbWUpLAogCQkJCQkgICAgImlwNnRhYmxlXyVzIiwgbmFtZSk7CiAJCWlmICh0ICYmICFJU19FUlIodCkpIHsKIAkJCXN0cnVjdCBpcDZ0X2dldGluZm8gaW5mbzsKKwkJCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlID0gdC0+cHJpdmF0ZTsKIAogCQkJaW5mby52YWxpZF9ob29rcyA9IHQtPnZhbGlkX2hvb2tzOwotCQkJbWVtY3B5KGluZm8uaG9va19lbnRyeSwgdC0+cHJpdmF0ZS0+aG9va19lbnRyeSwKKwkJCW1lbWNweShpbmZvLmhvb2tfZW50cnksIHByaXZhdGUtPmhvb2tfZW50cnksCiAJCQkgICAgICAgc2l6ZW9mKGluZm8uaG9va19lbnRyeSkpOwotCQkJbWVtY3B5KGluZm8udW5kZXJmbG93LCB0LT5wcml2YXRlLT51bmRlcmZsb3csCisJCQltZW1jcHkoaW5mby51bmRlcmZsb3csIHByaXZhdGUtPnVuZGVyZmxvdywKIAkJCSAgICAgICBzaXplb2YoaW5mby51bmRlcmZsb3cpKTsKLQkJCWluZm8ubnVtX2VudHJpZXMgPSB0LT5wcml2YXRlLT5udW1iZXI7Ci0JCQlpbmZvLnNpemUgPSB0LT5wcml2YXRlLT5zaXplOworCQkJaW5mby5udW1fZW50cmllcyA9IHByaXZhdGUtPm51bWJlcjsKKwkJCWluZm8uc2l6ZSA9IHByaXZhdGUtPnNpemU7CiAJCQltZW1jcHkoaW5mby5uYW1lLCBuYW1lLCBzaXplb2YoaW5mby5uYW1lKSk7CiAKIAkJCWlmIChjb3B5X3RvX3VzZXIodXNlciwgJmluZm8sICpsZW4pICE9IDApCiAJCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWVsc2UKIAkJCQlyZXQgPSAwOwotCQkJdXAoJmlwNnRfbXV0ZXgpOworCQkJeHRfdGFibGVfdW5sb2NrKHQpOwogCQkJbW9kdWxlX3B1dCh0LT5tZSk7CiAJCX0gZWxzZQogCQkJcmV0ID0gdCA/IFBUUl9FUlIodCkgOiAtRU5PRU5UOwpAQCAtMTQ3NSw3ICsxMjMzLDcgQEAKIAljYXNlIElQNlRfU09fR0VUX1JFVklTSU9OX01BVENIOgogCWNhc2UgSVA2VF9TT19HRVRfUkVWSVNJT05fVEFSR0VUOiB7CiAJCXN0cnVjdCBpcDZ0X2dldF9yZXZpc2lvbiByZXY7Ci0JCWludCAoKnJldmZuKShjb25zdCBjaGFyICosIHU4LCBpbnQgKik7CisJCWludCB0YXJnZXQ7CiAKIAkJaWYgKCpsZW4gIT0gc2l6ZW9mKHJldikpIHsKIAkJCXJldCA9IC1FSU5WQUw7CkBAIC0xNDg3LDEyICsxMjQ1LDEzIEBACiAJCX0KIAogCQlpZiAoY21kID09IElQNlRfU09fR0VUX1JFVklTSU9OX1RBUkdFVCkKLQkJCXJldmZuID0gdGFyZ2V0X3JldmZuOworCQkJdGFyZ2V0ID0gMTsKIAkJZWxzZQotCQkJcmV2Zm4gPSBtYXRjaF9yZXZmbjsKKwkJCXRhcmdldCA9IDA7CiAKLQkJdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoZmluZF9yZXZpc2lvbihyZXYubmFtZSwgcmV2LnJldmlzaW9uLAotCQkJCQkJICAgICAgcmV2Zm4sICZyZXQpLAorCQl0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3JldmlzaW9uKEFGX0lORVQ2LCByZXYubmFtZSwKKwkJCQkJCQkgcmV2LnJldmlzaW9uLAorCQkJCQkJCSB0YXJnZXQsICZyZXQpLAogCQkJCQkiaXA2dF8lcyIsIHJldi5uYW1lKTsKIAkJYnJlYWs7CiAJfQpAQCAtMTUwNSw2MSArMTI2NCwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIFJlZ2lzdHJhdGlvbiBob29rcyBmb3IgdGFyZ2V0cy4gKi8KLWludAotaXA2dF9yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwNnRfdGFyZ2V0ICp0YXJnZXQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCWxpc3RfYWRkKCZ0YXJnZXQtPmxpc3QsICZpcDZ0X3RhcmdldCk7Ci0JdXAoJmlwNnRfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQKLWlwNnRfdW5yZWdpc3Rlcl90YXJnZXQoc3RydWN0IGlwNnRfdGFyZ2V0ICp0YXJnZXQpCi17Ci0JZG93bigmaXA2dF9tdXRleCk7Ci0JTElTVF9ERUxFVEUoJmlwNnRfdGFyZ2V0LCB0YXJnZXQpOwotCXVwKCZpcDZ0X211dGV4KTsKLX0KLQotaW50Ci1pcDZ0X3JlZ2lzdGVyX21hdGNoKHN0cnVjdCBpcDZ0X21hdGNoICptYXRjaCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZpcDZ0X211dGV4KTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0KLQlsaXN0X2FkZCgmbWF0Y2gtPmxpc3QsICZpcDZ0X21hdGNoKTsKLQl1cCgmaXA2dF9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1pcDZ0X3VucmVnaXN0ZXJfbWF0Y2goc3RydWN0IGlwNnRfbWF0Y2ggKm1hdGNoKQotewotCWRvd24oJmlwNnRfbXV0ZXgpOwotCUxJU1RfREVMRVRFKCZpcDZ0X21hdGNoLCBtYXRjaCk7Ci0JdXAoJmlwNnRfbXV0ZXgpOwotfQotCi1pbnQgaXA2dF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXA2dF90YWJsZSAqdGFibGUsCitpbnQgaXA2dF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAogCQkJY29uc3Qgc3RydWN0IGlwNnRfcmVwbGFjZSAqcmVwbCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gKm5ld2luZm87Ci0Jc3RhdGljIHN0cnVjdCBpcDZ0X3RhYmxlX2luZm8gYm9vdHN0cmFwCisJc3RydWN0IHh0X3RhYmxlX2luZm8gKm5ld2luZm87CisJc3RhdGljIHN0cnVjdCB4dF90YWJsZV9pbmZvIGJvb3RzdHJhcAogCQk9IHsgMCwgMCwgMCwgeyAwIH0sIHsgMCB9LCB7IH0gfTsKIAl2b2lkICpsb2NfY3B1X2VudHJ5OwogCi0JbmV3aW5mbyA9IGFsbG9jX3RhYmxlX2luZm8ocmVwbC0+c2l6ZSk7CisJbmV3aW5mbyA9IHh0X2FsbG9jX3RhYmxlX2luZm8ocmVwbC0+c2l6ZSk7CiAJaWYgKCFuZXdpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTU3MywyNDQgKzEyODcsMjkgQEAKIAkJCSAgICAgIHJlcGwtPmhvb2tfZW50cnksCiAJCQkgICAgICByZXBsLT51bmRlcmZsb3cpOwogCWlmIChyZXQgIT0gMCkgewotCQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoJmlwNnRfbXV0ZXgpOwotCWlmIChyZXQgIT0gMCkgewotCQlmcmVlX3RhYmxlX2luZm8obmV3aW5mbyk7CisJaWYgKHh0X3JlZ2lzdGVyX3RhYmxlKHRhYmxlLCAmYm9vdHN0cmFwLCBuZXdpbmZvKSAhPSAwKSB7CisJCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBEb24ndCBhdXRvbG9hZDogd2UnZCBlYXQgb3VyIHRhaWwuLi4gKi8KLQlpZiAobGlzdF9uYW1lZF9maW5kKCZpcDZ0X3RhYmxlcywgdGFibGUtPm5hbWUpKSB7Ci0JCXJldCA9IC1FRVhJU1Q7Ci0JCWdvdG8gZnJlZV91bmxvY2s7Ci0JfQotCi0JLyogU2ltcGxpZmllcyByZXBsYWNlX3RhYmxlIGNvZGUuICovCi0JdGFibGUtPnByaXZhdGUgPSAmYm9vdHN0cmFwOwotCWlmICghcmVwbGFjZV90YWJsZSh0YWJsZSwgMCwgbmV3aW5mbywgJnJldCkpCi0JCWdvdG8gZnJlZV91bmxvY2s7Ci0KLQlkdXByaW50ZigidGFibGUtPnByaXZhdGUtPm51bWJlciA9ICV1XG4iLAotCQkgdGFibGUtPnByaXZhdGUtPm51bWJlcik7Ci0KLQkvKiBzYXZlIG51bWJlciBvZiBpbml0aWFsIGVudHJpZXMgKi8KLQl0YWJsZS0+cHJpdmF0ZS0+aW5pdGlhbF9lbnRyaWVzID0gdGFibGUtPnByaXZhdGUtPm51bWJlcjsKLQotCXJ3bG9ja19pbml0KCZ0YWJsZS0+bG9jayk7Ci0JbGlzdF9wcmVwZW5kKCZpcDZ0X3RhYmxlcywgdGFibGUpOwotCi0gdW5sb2NrOgotCXVwKCZpcDZ0X211dGV4KTsKLQlyZXR1cm4gcmV0OwotCi0gZnJlZV91bmxvY2s6Ci0JZnJlZV90YWJsZV9pbmZvKG5ld2luZm8pOwotCWdvdG8gdW5sb2NrOworCXJldHVybiAwOwogfQogCi12b2lkIGlwNnRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgaXA2dF90YWJsZSAqdGFibGUpCit2b2lkIGlwNnRfdW5yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQogeworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOwogCXZvaWQgKmxvY19jcHVfZW50cnk7CiAKLQlkb3duKCZpcDZ0X211dGV4KTsKLQlMSVNUX0RFTEVURSgmaXA2dF90YWJsZXMsIHRhYmxlKTsKLQl1cCgmaXA2dF9tdXRleCk7CisJcHJpdmF0ZSA9IHh0X3VucmVnaXN0ZXJfdGFibGUodGFibGUpOwogCiAJLyogRGVjcmVhc2UgbW9kdWxlIHVzYWdlIGNvdW50cyBhbmQgZnJlZSByZXNvdXJjZXMgKi8KLQlsb2NfY3B1X2VudHJ5ID0gdGFibGUtPnByaXZhdGUtPmVudHJpZXNbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV07Ci0JSVA2VF9FTlRSWV9JVEVSQVRFKGxvY19jcHVfZW50cnksIHRhYmxlLT5wcml2YXRlLT5zaXplLAotCQkJICBjbGVhbnVwX2VudHJ5LCBOVUxMKTsKLQlmcmVlX3RhYmxlX2luZm8odGFibGUtPnByaXZhdGUpOwotfQotCi0vKiBSZXR1cm5zIDEgaWYgdGhlIHBvcnQgaXMgbWF0Y2hlZCBieSB0aGUgcmFuZ2UsIDAgb3RoZXJ3aXNlICovCi1zdGF0aWMgaW5saW5lIGludAotcG9ydF9tYXRjaCh1X2ludDE2X3QgbWluLCB1X2ludDE2X3QgbWF4LCB1X2ludDE2X3QgcG9ydCwgaW50IGludmVydCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gKHBvcnQgPj0gbWluICYmIHBvcnQgPD0gbWF4KSBeIGludmVydDsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci10Y3BfZmluZF9vcHRpb24odV9pbnQ4X3Qgb3B0aW9uLAotCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQl1bnNpZ25lZCBpbnQgdGNwb2ZmLAotCQl1bnNpZ25lZCBpbnQgb3B0bGVuLAotCQlpbnQgaW52ZXJ0LAotCQlpbnQgKmhvdGRyb3ApCi17Ci0JLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCi0JdV9pbnQ4X3QgX29wdFs2MCAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKV0sICpvcDsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWR1cHJpbnRmKCJ0Y3BfbWF0Y2g6IGZpbmRpbmcgb3B0aW9uXG4iKTsKLQlpZiAoIW9wdGxlbikKLQkJcmV0dXJuIGludmVydDsKLQkvKiBJZiB3ZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBoZWFkZXIsIGRyb3AgcGFja2V0LiAqLwotCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgdGNwb2ZmICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpLCBvcHRsZW4sCi0JCQkJX29wdCk7Ci0JaWYgKG9wID09IE5VTEwpIHsKLQkJKmhvdGRyb3AgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuOyApIHsKLQkJaWYgKG9wW2ldID09IG9wdGlvbikgcmV0dXJuICFpbnZlcnQ7Ci0JCWlmIChvcFtpXSA8IDIpIGkrKzsKLQkJZWxzZSBpICs9IG9wW2krMV0/OjE7Ci0JfQotCi0JcmV0dXJuIGludmVydDsKLX0KLQotc3RhdGljIGludAotdGNwX21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotCSAgaW50IG9mZnNldCwKLQkgIHVuc2lnbmVkIGludCBwcm90b2ZmLAotCSAgaW50ICpob3Rkcm9wKQotewotCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKLQljb25zdCBzdHJ1Y3QgaXA2dF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87Ci0KLQlpZiAob2Zmc2V0KSB7Ci0JCS8qIFRvIHF1b3RlIEFsYW46Ci0KLQkJICAgRG9uJ3QgYWxsb3cgYSBmcmFnbWVudCBvZiBUQ1AgOCBieXRlcyBpbi4gTm9ib2R5IG5vcm1hbAotCQkgICBjYXVzZXMgdGhpcy4gSXRzIGEgY3JhY2tlciB0cnlpbmcgdG8gYnJlYWsgaW4gYnkgZG9pbmcgYQotCQkgICBmbGFnIG92ZXJ3cml0ZSB0byBwYXNzIHRoZSBkaXJlY3Rpb24gY2hlY2tzLgotCQkqLwotCQlpZiAob2Zmc2V0ID09IDEpIHsKLQkJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MSBmcmFnLlxuIik7Ci0JCQkqaG90ZHJvcCA9IDE7Ci0JCX0KLQkJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KLQkJcmV0dXJuIDA7Ci0JfQotCi0jZGVmaW5lIEZXSU5WVENQKGJvb2wsaW52ZmxnKSAoKGJvb2wpIF4gISEodGNwaW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQotCi0JdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwotCWlmICh0aCA9PSBOVUxMKSB7Ci0JCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCi0JCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KLQkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0wIHRpbnlncmFtLlxuIik7Ci0JCSpob3Rkcm9wID0gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCFwb3J0X21hdGNoKHRjcGluZm8tPnNwdHNbMF0sIHRjcGluZm8tPnNwdHNbMV0sCi0JCQludG9ocyh0aC0+c291cmNlKSwKLQkJCSEhKHRjcGluZm8tPmludmZsYWdzICYgSVA2VF9UQ1BfSU5WX1NSQ1BUKSkpCi0JCXJldHVybiAwOwotCWlmICghcG9ydF9tYXRjaCh0Y3BpbmZvLT5kcHRzWzBdLCB0Y3BpbmZvLT5kcHRzWzFdLAotCQkJbnRvaHModGgtPmRlc3QpLAotCQkJISEodGNwaW5mby0+aW52ZmxhZ3MgJiBJUDZUX1RDUF9JTlZfRFNUUFQpKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCFGV0lOVlRDUCgoKCh1bnNpZ25lZCBjaGFyICopdGgpWzEzXSAmIHRjcGluZm8tPmZsZ19tYXNrKQotCQkgICAgICA9PSB0Y3BpbmZvLT5mbGdfY21wLAotCQkgICAgICBJUDZUX1RDUF9JTlZfRkxBR1MpKQotCQlyZXR1cm4gMDsKLQlpZiAodGNwaW5mby0+b3B0aW9uKSB7Ci0JCWlmICh0aC0+ZG9mZiAqIDQgPCBzaXplb2YoX3RjcGgpKSB7Ci0JCQkqaG90ZHJvcCA9IDE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoIXRjcF9maW5kX29wdGlvbih0Y3BpbmZvLT5vcHRpb24sIHNrYiwgcHJvdG9mZiwKLQkJCQkgICAgIHRoLT5kb2ZmKjQgLSBzaXplb2YoKnRoKSwKLQkJCQkgICAgIHRjcGluZm8tPmludmZsYWdzICYgSVA2VF9UQ1BfSU5WX09QVElPTiwKLQkJCQkgICAgIGhvdGRyb3ApKQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi0vKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi1zdGF0aWMgaW50Ci10Y3BfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NiwKLQkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWNvbnN0IHN0cnVjdCBpcDZ0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKLQotCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBUQ1AsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCi0JcmV0dXJuIGlwdjYtPnByb3RvID09IElQUFJPVE9fVENQCi0JCSYmICEoaXB2Ni0+aW52ZmxhZ3MgJiBJUDZUX0lOVl9QUk9UTykKLQkJJiYgbWF0Y2hzaXplID09IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3RjcCkpCi0JCSYmICEodGNwaW5mby0+aW52ZmxhZ3MgJiB+SVA2VF9UQ1BfSU5WX01BU0spOwotfQotCi1zdGF0aWMgaW50Ci11ZHBfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0JICBpbnQgb2Zmc2V0LAotCSAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0JICBpbnQgKmhvdGRyb3ApCi17Ci0Jc3RydWN0IHVkcGhkciBfdWRwaCwgKnVoOwotCWNvbnN0IHN0cnVjdCBpcDZ0X3VkcCAqdWRwaW5mbyA9IG1hdGNoaW5mbzsKLQotCS8qIE11c3Qgbm90IGJlIGEgZnJhZ21lbnQuICovCi0JaWYgKG9mZnNldCkKLQkJcmV0dXJuIDA7Ci0KLQl1aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYsIHNpemVvZihfdWRwaCksICZfdWRwaCk7Ci0JaWYgKHVoID09IE5VTEwpIHsKLQkJLyogV2UndmUgYmVlbiBhc2tlZCB0byBleGFtaW5lIHRoaXMgcGFja2V0LCBhbmQgd2UKLQkJICAgY2FuJ3QuICBIZW5jZSwgbm8gY2hvaWNlIGJ1dCB0byBkcm9wLiAqLwotCQlkdXByaW50ZigiRHJvcHBpbmcgZXZpbCBVRFAgdGlueWdyYW0uXG4iKTsKLQkJKmhvdGRyb3AgPSAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gcG9ydF9tYXRjaCh1ZHBpbmZvLT5zcHRzWzBdLCB1ZHBpbmZvLT5zcHRzWzFdLAotCQkJICBudG9ocyh1aC0+c291cmNlKSwKLQkJCSAgISEodWRwaW5mby0+aW52ZmxhZ3MgJiBJUDZUX1VEUF9JTlZfU1JDUFQpKQotCQkmJiBwb3J0X21hdGNoKHVkcGluZm8tPmRwdHNbMF0sIHVkcGluZm8tPmRwdHNbMV0sCi0JCQkgICAgICBudG9ocyh1aC0+ZGVzdCksCi0JCQkgICAgICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIElQNlRfVURQX0lOVl9EU1RQVCkpOwotfQotCi0vKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCi1zdGF0aWMgaW50Ci11ZHBfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NiwKLQkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKLQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQljb25zdCBzdHJ1Y3QgaXA2dF91ZHAgKnVkcGluZm8gPSBtYXRjaGluZm87Ci0KLQkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gVURQLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLwotCWlmIChpcHY2LT5wcm90byAhPSBJUFBST1RPX1VEUCB8fCAoaXB2Ni0+aW52ZmxhZ3MgJiBJUDZUX0lOVl9QUk9UTykpIHsKLQkJZHVwcmludGYoImlwNnRfdWRwOiBQcm90b2NvbCAldSAhPSAldVxuIiwgaXB2Ni0+cHJvdG8sCi0JCQkgSVBQUk9UT19VRFApOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKG1hdGNoaW5mb3NpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfdWRwKSkpIHsKLQkJZHVwcmludGYoImlwNnRfdWRwOiBtYXRjaHNpemUgJXUgIT0gJXVcbiIsCi0JCQkgbWF0Y2hpbmZvc2l6ZSwgSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfdWRwKSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKHVkcGluZm8tPmludmZsYWdzICYgfklQNlRfVURQX0lOVl9NQVNLKSB7Ci0JCWR1cHJpbnRmKCJpcDZ0X3VkcDogdW5rbm93biBmbGFncyAlWFxuIiwKLQkJCSB1ZHBpbmZvLT5pbnZmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOworCWxvY19jcHVfZW50cnkgPSBwcml2YXRlLT5lbnRyaWVzW3Jhd19zbXBfcHJvY2Vzc29yX2lkKCldOworCUlQNlRfRU5UUllfSVRFUkFURShsb2NfY3B1X2VudHJ5LCBwcml2YXRlLT5zaXplLCBjbGVhbnVwX2VudHJ5LCBOVUxMKTsKKwl4dF9mcmVlX3RhYmxlX2luZm8ocHJpdmF0ZSk7CiB9CiAKIC8qIFJldHVybnMgMSBpZiB0aGUgdHlwZSBhbmQgY29kZSBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KQEAgLTE4NTgsMTEgKzEzNTcsMTIgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGljbXA2X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NiwKKwkgICBjb25zdCB2b2lkICplbnRyeSwKIAkgICB2b2lkICptYXRjaGluZm8sCiAJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogeworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NiA9IGVudHJ5OwogCWNvbnN0IHN0cnVjdCBpcDZ0X2ljbXAgKmljbXBpbmZvID0gbWF0Y2hpbmZvOwogCiAJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IElDTVAsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCkBAIC0xODkyLDE2NCArMTM5Miw0MiBAQAogCS5nZXQJCT0gZG9faXA2dF9nZXRfY3RsLAogfTsKIAotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIHRjcF9tYXRjaHN0cnVjdCA9IHsKLQkubmFtZQkJPSAidGNwIiwKLQkubWF0Y2gJCT0gJnRjcF9tYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZ0Y3BfY2hlY2tlbnRyeSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCB1ZHBfbWF0Y2hzdHJ1Y3QgPSB7Ci0JLm5hbWUJCT0gInVkcCIsCi0JLm1hdGNoCQk9ICZ1ZHBfbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmdWRwX2NoZWNrZW50cnksCi19OwotCiBzdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggaWNtcDZfbWF0Y2hzdHJ1Y3QgPSB7CiAJLm5hbWUJCT0gImljbXA2IiwKIAkubWF0Y2gJCT0gJmljbXA2X21hdGNoLAogCS5jaGVja2VudHJ5CT0gJmljbXA2X2NoZWNrZW50cnksCiB9OwogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbmxpbmUgaW50IHByaW50X25hbWUoY29uc3QgY2hhciAqaSwKLQkJCSAgICAgb2ZmX3Qgc3RhcnRfb2Zmc2V0LCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgsCi0JCQkgICAgIG9mZl90ICpwb3MsIHVuc2lnbmVkIGludCAqY291bnQpCi17Ci0JaWYgKCgqY291bnQpKysgPj0gc3RhcnRfb2Zmc2V0KSB7Ci0JCXVuc2lnbmVkIGludCBuYW1lbGVuOwotCi0JCW5hbWVsZW4gPSBzcHJpbnRmKGJ1ZmZlciArICpwb3MsICIlc1xuIiwKLQkJCQkgIGkgKyBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkpOwotCQlpZiAoKnBvcyArIG5hbWVsZW4gPiBsZW5ndGgpIHsKLQkJCS8qIFN0b3AgaXRlcmF0aW5nICovCi0JCQlyZXR1cm4gMTsKLQkJfQotCQkqcG9zICs9IG5hbWVsZW47Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBwcmludF90YXJnZXQoY29uc3Qgc3RydWN0IGlwNnRfdGFyZ2V0ICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IHN0YXJ0X29mZnNldCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90ICpwb3MsIHVuc2lnbmVkIGludCAqY291bnQpCi17Ci0JaWYgKHQgPT0gJmlwNnRfc3RhbmRhcmRfdGFyZ2V0IHx8IHQgPT0gJmlwNnRfZXJyb3JfdGFyZ2V0KQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gcHJpbnRfbmFtZSgoY2hhciAqKXQsIHN0YXJ0X29mZnNldCwgYnVmZmVyLCBsZW5ndGgsIHBvcywgY291bnQpOwotfQotCi1zdGF0aWMgaW50IGlwNnRfZ2V0X3RhYmxlcyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotewotCW9mZl90IHBvcyA9IDA7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQotCWlmIChkb3duX2ludGVycnVwdGlibGUoJmlwNnRfbXV0ZXgpICE9IDApCi0JCXJldHVybiAwOwotCi0JTElTVF9GSU5EKCZpcDZ0X3RhYmxlcywgcHJpbnRfbmFtZSwgY2hhciAqLAotCQkgIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgsICZwb3MsICZjb3VudCk7Ci0KLQl1cCgmaXA2dF9tdXRleCk7Ci0KLQkvKiBgc3RhcnQnIGhhY2sgLSBzZWUgZnMvcHJvYy9nZW5lcmljLmMgbGluZSB+MTA1ICovCi0JKnN0YXJ0PShjaGFyICopKCh1bnNpZ25lZCBsb25nKWNvdW50LW9mZnNldCk7Ci0JcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIGludCBpcDZ0X2dldF90YXJnZXRzKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCi17Ci0Jb2ZmX3QgcG9zID0gMDsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlMSVNUX0ZJTkQoJmlwNnRfdGFyZ2V0LCBwcmludF90YXJnZXQsIHN0cnVjdCBpcDZ0X3RhcmdldCAqLAotCQkgIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgsICZwb3MsICZjb3VudCk7Ci0KLQl1cCgmaXA2dF9tdXRleCk7Ci0KLQkqc3RhcnQgPSAoY2hhciAqKSgodW5zaWduZWQgbG9uZyljb3VudCAtIG9mZnNldCk7Ci0JcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIGludCBpcDZ0X2dldF9tYXRjaGVzKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgpCi17Ci0Jb2ZmX3QgcG9zID0gMDsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmaXA2dF9tdXRleCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlMSVNUX0ZJTkQoJmlwNnRfbWF0Y2gsIHByaW50X25hbWUsIGNoYXIgKiwKLQkJICBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoLCAmcG9zLCAmY291bnQpOwotCi0JdXAoJmlwNnRfbXV0ZXgpOwotCi0JKnN0YXJ0ID0gKGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpY291bnQgLSBvZmZzZXQpOwotCXJldHVybiBwb3M7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgeyBjaGFyICpuYW1lOyBnZXRfaW5mb190ICpnZXRfaW5mbzsgfSBpcDZ0X3Byb2NfZW50cnlbXSA9Ci17IHsgImlwNl90YWJsZXNfbmFtZXMiLCBpcDZ0X2dldF90YWJsZXMgfSwKLSAgeyAiaXA2X3RhYmxlc190YXJnZXRzIiwgaXA2dF9nZXRfdGFyZ2V0cyB9LAotICB7ICJpcDZfdGFibGVzX21hdGNoZXMiLCBpcDZ0X2dldF9tYXRjaGVzIH0sCi0gIHsgTlVMTCwgTlVMTH0gfTsKLSNlbmRpZiAvKkNPTkZJR19QUk9DX0ZTKi8KLQogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKKwl4dF9wcm90b19pbml0KEFGX0lORVQ2KTsKKwogCS8qIE5vb25lIGVsc2Ugd2lsbCBiZSBkb3duaW5nIHNlbSBub3csIHNvIHdlIHdvbid0IHNsZWVwICovCi0JZG93bigmaXA2dF9tdXRleCk7Ci0JbGlzdF9hcHBlbmQoJmlwNnRfdGFyZ2V0LCAmaXA2dF9zdGFuZGFyZF90YXJnZXQpOwotCWxpc3RfYXBwZW5kKCZpcDZ0X3RhcmdldCwgJmlwNnRfZXJyb3JfdGFyZ2V0KTsKLQlsaXN0X2FwcGVuZCgmaXA2dF9tYXRjaCwgJnRjcF9tYXRjaHN0cnVjdCk7Ci0JbGlzdF9hcHBlbmQoJmlwNnRfbWF0Y2gsICZ1ZHBfbWF0Y2hzdHJ1Y3QpOwotCWxpc3RfYXBwZW5kKCZpcDZ0X21hdGNoLCAmaWNtcDZfbWF0Y2hzdHJ1Y3QpOwotCXVwKCZpcDZ0X211dGV4KTsKKwl4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X3N0YW5kYXJkX3RhcmdldCk7CisJeHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmaXA2dF9lcnJvcl90YXJnZXQpOworCXh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmaWNtcDZfbWF0Y2hzdHJ1Y3QpOwogCiAJLyogUmVnaXN0ZXIgc2V0c29ja29wdCAqLwogCXJldCA9IG5mX3JlZ2lzdGVyX3NvY2tvcHQoJmlwNnRfc29ja29wdHMpOwogCWlmIChyZXQgPCAwKSB7CiAJCWR1cHJpbnRmKCJVbmFibGUgdG8gcmVnaXN0ZXIgc29ja29wdHMuXG4iKTsKKwkJeHRfcHJvdG9fZmluaShBRl9JTkVUNik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLQl7Ci0JCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaXA2dF9wcm9jX2VudHJ5W2ldLm5hbWU7IGkrKykgewotCQkJcHJvYyA9IHByb2NfbmV0X2NyZWF0ZShpcDZ0X3Byb2NfZW50cnlbaV0ubmFtZSwgMCwKLQkJCQkJICAgICAgIGlwNnRfcHJvY19lbnRyeVtpXS5nZXRfaW5mbyk7Ci0JCQlpZiAoIXByb2MpIHsKLQkJCQl3aGlsZSAoLS1pID49IDApCi0JCQkJICAgICAgIHByb2NfbmV0X3JlbW92ZShpcDZ0X3Byb2NfZW50cnlbaV0ubmFtZSk7Ci0JCQkJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZpcDZ0X3NvY2tvcHRzKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXByaW50aygiaXA2X3RhYmxlczogKEMpIDIwMDAtMjAwMiBOZXRmaWx0ZXIgY29yZSB0ZWFtXG4iKTsKKwlwcmludGsoImlwNl90YWJsZXM6IChDKSAyMDAwLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7CiAJbmZfdW5yZWdpc3Rlcl9zb2Nrb3B0KCZpcDZ0X3NvY2tvcHRzKTsKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwotCXsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGlwNnRfcHJvY19lbnRyeVtpXS5uYW1lOyBpKyspCi0JCQlwcm9jX25ldF9yZW1vdmUoaXA2dF9wcm9jX2VudHJ5W2ldLm5hbWUpOwotCX0KLSNlbmRpZgorCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZpY21wNl9tYXRjaHN0cnVjdCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X2Vycm9yX3RhcmdldCk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZpcDZ0X3N0YW5kYXJkX3RhcmdldCk7CisJeHRfcHJvdG9fZmluaShBRl9JTkVUNik7CiB9CiAKIC8qCkBAIC0yMTI4LDEwICsxNTA2LDYgQEAKIEVYUE9SVF9TWU1CT0woaXA2dF9yZWdpc3Rlcl90YWJsZSk7CiBFWFBPUlRfU1lNQk9MKGlwNnRfdW5yZWdpc3Rlcl90YWJsZSk7CiBFWFBPUlRfU1lNQk9MKGlwNnRfZG9fdGFibGUpOwotRVhQT1JUX1NZTUJPTChpcDZ0X3JlZ2lzdGVyX21hdGNoKTsKLUVYUE9SVF9TWU1CT0woaXA2dF91bnJlZ2lzdGVyX21hdGNoKTsKLUVYUE9SVF9TWU1CT0woaXA2dF9yZWdpc3Rlcl90YXJnZXQpOwotRVhQT1JUX1NZTUJPTChpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KTsKIEVYUE9SVF9TWU1CT0woaXA2dF9leHRfaGRyKTsKIEVYUE9SVF9TWU1CT0woaXB2Nl9maW5kX2hkcik7CiBFWFBPUlRfU1lNQk9MKGlwNl9tYXNrZWRfYWRkcmNtcCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfSEwuYwppbmRleCA4ZjU1NDliLi4zMDYyMDBjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ITC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X0hMLmMKQEAgLTYyLDcgKzYyLDcgQEAKIH0KIAogc3RhdGljIGludCBpcDZ0X2hsX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQljb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKKwkJY29uc3Qgdm9pZCAqZW50cnksCiAJCXZvaWQgKnRhcmdpbmZvLAogCQl1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQl1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTE9HLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYwppbmRleCBhZTQ2NTNiLi5mYzE5ZDhhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9MT0cuYwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAKIAogc3RhdGljIGludCBpcDZ0X2xvZ19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKKwkJCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKIAkJCSAgICAgICB2b2lkICp0YXJnaW5mbywKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9NQVJLLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9NQVJLLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjhmYjguLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTUFSSy5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogVGhpcyBpcyBhIG1vZHVsZSB3aGljaCBpcyB1c2VkIGZvciBzZXR0aW5nIHRoZSBORk1BUksgZmllbGQgb2YgYW4gc2tiLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9NQVJLLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgdm9pZCAqdXNlcmluZm8pCi17Ci0JY29uc3Qgc3RydWN0IGlwNnRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKLQotCWlmKCgqcHNrYiktPm5mbWFyayAhPSBtYXJraW5mby0+bWFyaykKLQkJKCpwc2tiKS0+bmZtYXJrID0gbWFya2luZm8tPm1hcms7Ci0KLQlyZXR1cm4gSVA2VF9DT05USU5VRTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUsCi0gICAgICAgICAgIHZvaWQgKnRhcmdpbmZvLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAotICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmICh0YXJnaW5mb3NpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfbWFya190YXJnZXRfaW5mbykpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IHRhcmdpbmZvc2l6ZSAldSAhPSAlWnVcbiIsCi0JCSAgICAgICB0YXJnaW5mb3NpemUsCi0JCSAgICAgICBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tYXJrX3RhcmdldF9pbmZvKSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3RyY21wKHRhYmxlbmFtZSwgIm1hbmdsZSIpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gXCJtYW5nbGVcIiB0YWJsZSwgbm90IFwiJXNcIlxuIiwgdGFibGVuYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXA2dF90YXJnZXQgaXA2dF9tYXJrX3JlZyA9IHsgCi0JLm5hbWUJCT0gIk1BUksiLAotCS50YXJnZXQJCT0gdGFyZ2V0LAotCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlwcmludGsoS0VSTl9ERUJVRyAicmVnaXN0ZXJpbmcgaXB2NiBtYXJrIHRhcmdldFxuIik7Ci0JaWYgKGlwNnRfcmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X21hcmtfcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcDZ0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcDZ0X21hcmtfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X05GUVVFVUUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X05GUVVFVUUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlMzczMC4uMDAwMDAwMAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ORlFVRVVFLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKiBpcDZ0YWJsZXMgbW9kdWxlIGZvciB1c2luZyBuZXcgbmV0ZmlsdGVyIG5ldGxpbmsgcXVldWUKLSAqCi0gKiAoQykgMjAwNSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfTkZRVUVVRS5oPgotCi1NT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXA2dGFibGVzIE5GUVVFVUUgdGFyZ2V0Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCi0gICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICAgdW5zaWduZWQgaW50IGhvb2tudW0sCi0gICAgICAgY29uc3Qgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgdm9pZCAqdXNlcmluZm8pCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9ORlFfaW5mbyAqdGluZm8gPSB0YXJnaW5mbzsKLQotCXJldHVybiBORl9RVUVVRV9OUih0aW5mby0+cXVldWVudW0pOwotfQotCi1zdGF0aWMgaW50Ci1jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXA2dF9lbnRyeSAqZSwKLSAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X05GUV9pbmZvKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZRVUVVRTogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKLQkJICAgICAgIHRhcmdpbmZvc2l6ZSwKLQkJICAgICAgIElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfTkZRX2luZm8pKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfdGFyZ2V0IGlwdF9ORlFfcmVnID0gewotCS5uYW1lCQk9ICJORlFVRVVFIiwKLQkudGFyZ2V0CQk9IHRhcmdldCwKLQkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCi0JLm1lCQk9IFRISVNfTU9EVUxFLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQotewotCXJldHVybiBpcDZ0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X05GUV9yZWcpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwNnRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9ORlFfcmVnKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdCk7Ci1tb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X1JFSkVDVC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKaW5kZXggYjAzZTg3YS4uYzc0NTcxNyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKQEAgLTIxOCwxMiArMjE4LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUsCisJCSBjb25zdCB2b2lkICplbnRyeSwKIAkJIHZvaWQgKnRhcmdpbmZvLAogCQkgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkJIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CiAgCWNvbnN0IHN0cnVjdCBpcDZ0X3JlamVjdF9pbmZvICpyZWppbmZvID0gdGFyZ2luZm87CisJY29uc3Qgc3RydWN0IGlwNnRfZW50cnkgKmUgPSBlbnRyeTsKIAogIAlpZiAodGFyZ2luZm9zaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X3JlamVjdF9pbmZvKSkpIHsKICAgCQlERUJVR1AoImlwNnRfUkVKRUNUOiB0YXJnaW5mb3NpemUgJXUgIT0gMFxuIiwgdGFyZ2luZm9zaXplKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jCmluZGV4IGY1YzFhN2ZmLi4yMTlhMzAzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9haC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2FoLmMKQEAgLTk4LDcgKzk4LDcgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisgICAgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAogICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9kc3QuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2RzdC5jCmluZGV4IDQ4Y2Y1ZjkuLjgwZmU4MjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2RzdC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2RzdC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisgICAgICAgICAgY29uc3Qgdm9pZCAqaW5mbywKICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCiAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCiAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2VzcC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXNwLmMKaW5kZXggZTE4MjhmNi4uNzI0Mjg1ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXNwLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXNwLmMKQEAgLTc2LDcgKzc2LDcgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisJICAgY29uc3Qgdm9pZCAqaXAsCiAJICAgdm9pZCAqbWF0Y2hpbmZvLAogCSAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAogCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZXVpNjQuYwppbmRleCA2MTZjMmNiLi5kZGY1ZjU3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ldWk2NC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2V1aTY0LmMKQEAgLTYyLDcgKzYyLDcgQEAKIAogc3RhdGljIGludAogaXA2dF9ldWk2NF9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKwkJICAgY29uc3Qgdm9pZCAgKmlwLAogCQkgICB2b2lkICptYXRjaGluZm8sCiAJCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9mcmFnLmMKaW5kZXggZDE1NDliMi4uYTk5NjRiOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfZnJhZy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2ZyYWcuYwpAQCAtMTE1LDcgKzExNSw3IEBACiAvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAorICAgICAgICAgIGNvbnN0IHZvaWQgKmlwLAogICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hpbmZvc2l6ZSwKICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGJoLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9oYmguYwppbmRleCBlM2JjOGUyLi5lZDhkZWQxOGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hiaC5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIC8qIENhbGxlZCB3aGVuIHVzZXIgdHJpZXMgdG8gaW5zZXJ0IGFuIGVudHJ5IG9mIHRoaXMgdHlwZS4gKi8KIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisgICAgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAogICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaGwuYwppbmRleCAwYmVhZmY1Li5jNWQ5MDc5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9obC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2hsLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKK3N0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsIGNvbnN0IHZvaWQgKmVudHJ5LAogCQkgICAgICB2b2lkICptYXRjaGluZm8sIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9pcHY2aGVhZGVyLmMKaW5kZXggMzJlNjdmMC4uZmRhMWNlYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfaXB2NmhlYWRlci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2lwdjZoZWFkZXIuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAKIHN0YXRpYyBpbnQKIGlwdjZoZWFkZXJfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisJCSAgICAgIGNvbnN0IHZvaWQgKmlwLAogCQkgICAgICB2b2lkICptYXRjaGluZm8sCiAJCSAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9sZW5ndGguYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xlbmd0aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDUzN2QzLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xlbmd0aC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogTGVuZ3RoIE1hdGNoIC0gSVB2NiBQb3J0ICovCi0KLS8qIChDKSAxOTk5LTIwMDEgSmFtZXMgTW9ycmlzIDxqbW9ycm9zQGludGVyY29kZS5jb20uYXU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X2xlbmd0aC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIklQdjYgcGFja2V0IGxlbmd0aCBtYXRjaCIpOwotCi1zdGF0aWMgaW50Ci1tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLSAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLSAgICAgIGludCBvZmZzZXQsCi0gICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKLSAgICAgIGludCAqaG90ZHJvcCkKLXsKLQljb25zdCBzdHJ1Y3QgaXA2dF9sZW5ndGhfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQl1X2ludDE2X3QgcGt0bGVuID0gbnRvaHMoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKLQkKLQlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9sZW5ndGhfaW5mbykpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggbGVuZ3RoX21hdGNoID0gewotCS5uYW1lCQk9ICJsZW5ndGgiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmxlbmd0aF9tYXRjaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZsZW5ndGhfbWF0Y2gpOwotfQotCi1tb2R1bGVfaW5pdChpbml0KTsKLW1vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbGltaXQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X2xpbWl0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzgyZjYuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbGltaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKiBLZXJuZWwgbW9kdWxlIHRvIGNvbnRyb2wgdGhlIHJhdGUKLSAqCi0gKiAyIFNlcHRlbWJlciAxOTk5OiBDaGFuZ2VkIGZyb20gdGhlIHRhcmdldCBSQVRFIHRvIHRoZSBtYXRjaAotICogICAgICAgICAgICAgICAgICAgYGxpbWl0JywgcmVtb3ZlZCBsb2dnaW5nLiAgRGlkIEkgbWVudGlvbiB0aGF0Ci0gKiAgICAgICAgICAgICAgICAgICBBbGV4ZXkgaXMgYSBmdWNraW5nIGdlbml1cz8KLSAqICAgICAgICAgICAgICAgICAgIFJ1c3R5IFJ1c3NlbGwgKHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdSkuICAqLwotCi0vKiAoQykgMTk5OSBK6XL0bWUgZGUgVml2aWUgPGRldml2aWVAaW5mby5lbnNlcmIudS1ib3JkZWF1eC5mcj4KLSAqIChDKSAxOTk5IEhlcnbpIEV5Y2hlbm5lIDxleWNoZW5uZUBpbmZvLmVuc2VyYi51LWJvcmRlYXV4LmZyPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9saW1pdC5oPgotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJIZXJ2ZSBFeWNoZW5uZSA8cnZAd2FsbGZpcmUub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJyYXRlIGxpbWl0aW5nIHdpdGhpbiBpcDZ0YWJsZXMiKTsKLQotLyogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHRoZSBTaW1wbGUgVG9rZW4gQnVja2V0IEZpbHRlciAoVEJGKQotICogc2VlIG5ldC9zY2hlZC9zY2hfdGJmLmMgaW4gdGhlIGxpbnV4IHNvdXJjZSB0cmVlCi0gKi8KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhsaW1pdF9sb2NrKTsKLQotLyogUnVzdHk6IFRoaXMgaXMgbXkgKG5vbi1tYXRoZW1hdGljYWxseS1pbmNsaW5lZCkgdW5kZXJzdGFuZGluZyBvZgotICAgdGhpcyBhbGdvcml0aG0uICBUaGUgYGF2ZXJhZ2UgcmF0ZScgaW4gamlmZmllcyBiZWNvbWVzIHlvdXIgaW5pdGlhbAotICAgYW1vdW50IG9mIGNyZWRpdCBgY3JlZGl0JyBhbmQgdGhlIG1vc3QgY3JlZGl0IHlvdSBjYW4gZXZlciBoYXZlCi0gICBgY3JlZGl0X2NhcCcuICBUaGUgYHBlYWsgcmF0ZScgYmVjb21lcyB0aGUgY29zdCBvZiBwYXNzaW5nIHRoZQotICAgdGVzdCwgYGNvc3QnLgotCi0gICBgcHJldicgdHJhY2tzIHRoZSBsYXN0IHBhY2tldCBoaXQ6IHlvdSBnYWluIG9uZSBjcmVkaXQgcGVyIGppZmZ5LgotICAgSWYgeW91IGdldCBjcmVkaXQgYmFsYW5jZSBtb3JlIHRoYW4gdGhpcywgdGhlIGV4dHJhIGNyZWRpdCBpcwotICAgZGlzY2FyZGVkLiAgRXZlcnkgdGltZSB0aGUgbWF0Y2ggcGFzc2VzLCB5b3UgbG9zZSBgY29zdCcgY3JlZGl0czsKLSAgIGlmIHlvdSBkb24ndCBoYXZlIHRoYXQgbWFueSwgdGhlIHRlc3QgZmFpbHMuCi0KLSAgIFNlZSBBbGV4ZXkncyBmb3JtYWwgZXhwbGFuYXRpb24gaW4gbmV0L3NjaGVkL3NjaF90YmYuYy4KLQotICAgVG8gYXZvaWQgdW5kZXJmbG93LCB3ZSBtdWx0aXBseSBieSAxMjggKGllLiB5b3UgZ2V0IDEyOCBjcmVkaXRzIHBlcgotICAgamlmZnkpLiAgSGVuY2UgYSBjb3N0IG9mIDJeMzItMSwgbWVhbnMgb25lIHBhc3MgcGVyIDMyNzY4IHNlY29uZHMKLSAgIGF0IDEwMjRIWiAob3Igb25lIGV2ZXJ5IDkgaG91cnMpLiAgQSBjb3N0IG9mIDEgbWVhbnMgMTI4MDAgcGFzc2VzCi0gICBwZXIgc2Vjb25kIGF0IDEwMEhaLiAgKi8KLQotI2RlZmluZSBDUkVESVRTX1BFUl9KSUZGWSAxMjgKLQotc3RhdGljIGludAotaXA2dF9saW1pdF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCWNvbnN0IHZvaWQgKm1hdGNoaW5mbywKLQkJaW50IG9mZnNldCwKLQkJdW5zaWduZWQgaW50IHByb3RvZmYsCi0JCWludCAqaG90ZHJvcCkKLXsKLQlzdHJ1Y3QgaXA2dF9yYXRlaW5mbyAqciA9ICgoc3RydWN0IGlwNnRfcmF0ZWluZm8gKiltYXRjaGluZm8pLT5tYXN0ZXI7Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCi0Jc3Bpbl9sb2NrX2JoKCZsaW1pdF9sb2NrKTsKLQlyLT5jcmVkaXQgKz0gKG5vdyAtIHhjaGcoJnItPnByZXYsIG5vdykpICogQ1JFRElUU19QRVJfSklGRlk7Ci0JaWYgKHItPmNyZWRpdCA+IHItPmNyZWRpdF9jYXApCi0JCXItPmNyZWRpdCA9IHItPmNyZWRpdF9jYXA7Ci0KLQlpZiAoci0+Y3JlZGl0ID49IHItPmNvc3QpIHsKLQkJLyogV2UncmUgbm90IGxpbWl0ZWQuICovCi0JCXItPmNyZWRpdCAtPSByLT5jb3N0OwotCQlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7Ci0JCXJldHVybiAxOwotCX0KLQotICAgICAgIAlzcGluX3VubG9ja19iaCgmbGltaXRfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIFByZWNpc2lvbiBzYXZlci4gKi8KLXN0YXRpYyB1X2ludDMyX3QKLXVzZXIyY3JlZGl0cyh1X2ludDMyX3QgdXNlcikKLXsKLQkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLwotCWlmICh1c2VyID4gMHhGRkZGRkZGRiAvIChIWipDUkVESVRTX1BFUl9KSUZGWSkpCi0JCS8qIERpdmlkZSBmaXJzdC4gKi8KLQkJcmV0dXJuICh1c2VyIC8gSVA2VF9MSU1JVF9TQ0FMRSkgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZOwotCi0JcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBJUDZUX0xJTUlUX1NDQUxFOwotfQotCi1zdGF0aWMgaW50Ci1pcDZ0X2xpbWl0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCi0JCSAgICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0JCSAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKLXsKLQlzdHJ1Y3QgaXA2dF9yYXRlaW5mbyAqciA9IG1hdGNoaW5mbzsKLQotCWlmIChtYXRjaHNpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfcmF0ZWluZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICovCi0JaWYgKHItPmJ1cnN0ID09IDAKLQkgICAgfHwgdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KSA8IHVzZXIyY3JlZGl0cyhyLT5hdmcpKSB7Ci0JCXByaW50aygiQ2FsbCBydXN0eTogb3ZlcmZsb3cgaW4gaXA2dF9saW1pdDogJXUvJXVcbiIsCi0JCSAgICAgICByLT5hdmcsIHItPmJ1cnN0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIElQNlRfTElNSVRfU0NBTEU6IGNvbnZlcnQgdG8gamlmZmllcyAqCi0JICAgMTI4LiAqLwotCXItPnByZXYgPSBqaWZmaWVzOwotCXItPmNyZWRpdCA9IHVzZXIyY3JlZGl0cyhyLT5hdmcgKiByLT5idXJzdCk7CSAvKiBDcmVkaXRzIGZ1bGwuICovCi0Jci0+Y3JlZGl0X2NhcCA9IHVzZXIyY3JlZGl0cyhyLT5hdmcgKiByLT5idXJzdCk7IC8qIENyZWRpdHMgZnVsbC4gKi8KLQlyLT5jb3N0ID0gdXNlcjJjcmVkaXRzKHItPmF2Zyk7Ci0KLQkvKiBGb3IgU01QLCB3ZSBvbmx5IHdhbnQgdG8gdXNlIG9uZSBzZXQgb2YgY291bnRlcnMuICovCi0Jci0+bWFzdGVyID0gcjsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IGlwNnRfbWF0Y2ggaXA2dF9saW1pdF9yZWcgPSB7Ci0JLm5hbWUJCT0gImxpbWl0IiwKLQkubWF0Y2gJCT0gaXA2dF9saW1pdF9tYXRjaCwKLQkuY2hlY2tlbnRyeQk9IGlwNnRfbGltaXRfY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JaWYgKGlwNnRfcmVnaXN0ZXJfbWF0Y2goJmlwNnRfbGltaXRfcmVnKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCi17Ci0JaXA2dF91bnJlZ2lzdGVyX21hdGNoKCZpcDZ0X2xpbWl0X3JlZyk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tYWMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQ4MTUyLi4wMDAwMDAwCi0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X21hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBNQUMgYWRkcmVzcyBwYXJhbWV0ZXJzLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCi0gKiAoQykgMjAwMi0yMDA0IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9tYWMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTUFDIGFkZHJlc3MgbWF0Y2hpbmcgbW9kdWxlIGZvciBJUHY2Iik7Ci1NT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4iKTsKLQotc3RhdGljIGludAotbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0gICAgY29uc3Qgc3RydWN0IGlwNnRfbWFjX2luZm8gKmluZm8gPSBtYXRjaGluZm87Ci0KLSAgICAvKiBJcyBtYWMgcG9pbnRlciB2YWxpZD8gKi8KLSAgICByZXR1cm4gKHNrYi0+bWFjLnJhdyA+PSBza2ItPmhlYWQKLQkgICAgJiYgKHNrYi0+bWFjLnJhdyArIEVUSF9ITEVOKSA8PSBza2ItPmRhdGEKLQkgICAgLyogSWYgc28sIGNvbXBhcmUuLi4gKi8KLQkgICAgJiYgKCghY29tcGFyZV9ldGhlcl9hZGRyKGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIGluZm8tPnNyY2FkZHIpKQotCQleIGluZm8tPmludmVydCkpOwotfQotCi1zdGF0aWMgaW50Ci1pcDZ0X21hY19jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKLQkJICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAotCQkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQotewotCWlmIChob29rX21hc2sKLQkgICAgJiB+KCgxIDw8IE5GX0lQNl9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JUDZfTE9DQUxfSU4pCi0JCXwgKDEgPDwgTkZfSVA2X0ZPUldBUkQpKSkgewotCQlwcmludGsoImlwNnRfbWFjOiBvbmx5IHZhbGlkIGZvciBQUkVfUk9VVElORywgTE9DQUxfSU4gb3IiCi0JCSAgICAgICAiIEZPUldBUkRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAobWF0Y2hzaXplICE9IElQNlRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcDZ0X21hY19pbmZvKSkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXA2dF9tYXRjaCBtYWNfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gIm1hYyIsCi0JLm1hdGNoCQk9ICZtYXRjaCwKLQkuY2hlY2tlbnRyeQk9ICZpcDZ0X21hY19jaGVja2VudHJ5LAotCS5tZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKLXsKLQlyZXR1cm4gaXA2dF9yZWdpc3Rlcl9tYXRjaCgmbWFjX21hdGNoKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKLXsKLQlpcDZ0X3VucmVnaXN0ZXJfbWF0Y2goJm1hY19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tYXJrLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tYXJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZmMzZGUuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfbWFyay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBORk1BUksgdmFsdWVzLiAqLwotCi0vKiAoQykgMTk5OS0yMDAxIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X21hcmsuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwNnRhYmxlcyBtYXJrIG1hdGNoIik7Ci0KLXN0YXRpYyBpbnQKLW1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0gICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAotICAgICAgaW50IG9mZnNldCwKLSAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAotICAgICAgaW50ICpob3Rkcm9wKQotewotCWNvbnN0IHN0cnVjdCBpcDZ0X21hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQotCXJldHVybiAoKHNrYi0+bmZtYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCi0gICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9tYXJrX2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIG1hcmtfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gIm1hcmsiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJm1hcmtfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmbWFya19tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tdWx0aXBvcnQuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X211bHRpcG9ydC5jCmluZGV4IDZlMzI0NjEuLjQ5Zjc4MjlkIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tdWx0aXBvcnQuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9tdWx0aXBvcnQuYwpAQCAtODQsMTEgKzg0LDEyIEBACiAvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAorCSAgIGNvbnN0IHZvaWQgKmluZm8sCiAJICAgdm9pZCAqbWF0Y2hpbmZvLAogCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKKwljb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwID0gaW5mbzsKIAljb25zdCBzdHJ1Y3QgaXA2dF9tdWx0aXBvcnQgKm11bHRpaW5mbyA9IG1hdGNoaW5mbzsKIAogCWlmIChtYXRjaHNpemUgIT0gSVA2VF9BTElHTihzaXplb2Yoc3RydWN0IGlwNnRfbXVsdGlwb3J0KSkpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9vd25lci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfb3duZXIuYwppbmRleCA0ZGU0Y2RhLi41NDA5YjM3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9vd25lci5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X293bmVyLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgIGNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAsCisgICAgICAgICAgIGNvbnN0IHZvaWQgICppcCwKICAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcGh5c2Rldi5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcGh5c2Rldi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTUxNWM4Ni4uMDAwMDAwMAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9waHlzZGV2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCB0aGUgYnJpZGdlIHBvcnQgaW4gYW5kCi0gKiBvdXQgZGV2aWNlIGZvciBJUCBwYWNrZXRzIGNvbWluZyBpbnRvIGNvbnRhY3Qgd2l0aCBhIGJyaWRnZS4gKi8KLQotLyogKEMpIDIwMDEtMjAwMyBCYXJ0IERlIFNjaHV5bWVyIDxiZHNjaHV5bUBwYW5kb3JhLmJlPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNnRfcGh5c2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+Ci0jZGVmaW5lIE1BVENIICAgMQotI2RlZmluZSBOT01BVENIIDAKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgYnJpZGdlIHBoeXNpY2FsIGRldmljZSBtYXRjaCBtb2R1bGUiKTsKLQotc3RhdGljIGludAotbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0gICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCi0gICAgICBpbnQgb2Zmc2V0LAotICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCi0gICAgICBpbnQgKmhvdGRyb3ApCi17Ci0JaW50IGk7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgbnVsbGRldm5hbWVbSUZOQU1TSVpdOwotCWNvbnN0IHN0cnVjdCBpcDZ0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OwotCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlOwotCi0JLyogTm90IGEgYnJpZGdlZCBJUCBwYWNrZXQgb3Igbm8gaW5mbyBhdmFpbGFibGUgeWV0OgotCSAqIExPQ0FMX09VVC9tYW5nbGUgYW5kIExPQ0FMX09VVC9uYXQgZG9uJ3Qga25vdyBpZgotCSAqIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2Ugd2lsbCBiZSBhIGJyaWRnZS4gKi8KLQlpZiAoIShuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZSkpIHsKLQkJLyogUmV0dXJuIE1BVENIIGlmIHRoZSBpbnZlcnQgZmxhZ3Mgb2YgdGhlIHVzZWQgb3B0aW9ucyBhcmUgb24gKi8KLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0JSSURHRUQpICYmCi0JCSAgICAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9CUklER0VEKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfSVNJTikgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX0lTSU4pKQotCQkJcmV0dXJuIE5PTUFUQ0g7Ci0JCWlmICgoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9JU09VVCkgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX0lTT1VUKSkKLQkJCXJldHVybiBOT01BVENIOwotCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBJUDZUX1BIWVNERVZfT1BfSU4pICYmCi0JCSAgICAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JTikpCi0JCQlyZXR1cm4gTk9NQVRDSDsKLQkJaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX09VVCkgJiYKLQkJICAgICEoaW5mby0+aW52ZXJ0ICYgSVA2VF9QSFlTREVWX09QX09VVCkpCi0JCQlyZXR1cm4gTk9NQVRDSDsKLQkJcmV0dXJuIE1BVENIOwotCX0KLQotCS8qIFRoaXMgb25seSBtYWtlcyBzZW5zZSBpbiB0aGUgRk9SV0FSRCBhbmQgUE9TVFJPVVRJTkcgY2hhaW5zICovCi0JaWYgKChpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0JSSURHRUQpICYmCi0JICAgICghIShuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRUQpIF4KLQkgICAgIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfQlJJREdFRCkpKQotCQlyZXR1cm4gTk9NQVRDSDsKLQotCWlmICgoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9JU0lOICYmCi0JICAgICghbmZfYnJpZGdlLT5waHlzaW5kZXYgXiAhIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfSVNJTikpKSB8fAotCSAgICAoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9JU09VVCAmJgotCSAgICAoIW5mX2JyaWRnZS0+cGh5c291dGRldiBeICEhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JU09VVCkpKSkKLQkJcmV0dXJuIE5PTUFUQ0g7Ci0KLQlpZiAoIShpbmZvLT5iaXRtYXNrICYgSVA2VF9QSFlTREVWX09QX0lOKSkKLQkJZ290byBtYXRjaF9vdXRkZXY7Ci0JaW5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldiA/IG5mX2JyaWRnZS0+cGh5c2luZGV2LT5uYW1lIDogbnVsbGRldm5hbWU7Ci0JZm9yIChpID0gMCwgcmV0ID0gMDsgaSA8IElGTkFNU0laL3NpemVvZih1bnNpZ25lZCBpbnQpOyBpKyspIHsKLQkJcmV0IHw9ICgoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZGV2KVtpXQotCQkJXiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPnBoeXNpbmRldilbaV0pCi0JCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+aW5fbWFzaylbaV07Ci0JfQotCi0JaWYgKChyZXQgPT0gMCkgXiAhKGluZm8tPmludmVydCAmIElQNlRfUEhZU0RFVl9PUF9JTikpCi0JCXJldHVybiBOT01BVENIOwotCi1tYXRjaF9vdXRkZXY6Ci0JaWYgKCEoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9PVVQpKQotCQlyZXR1cm4gTUFUQ0g7Ci0Jb3V0ZGV2ID0gbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID8KLQkJIG5mX2JyaWRnZS0+cGh5c291dGRldi0+bmFtZSA6IG51bGxkZXZuYW1lOwotCWZvciAoaSA9IDAsIHJldCA9IDA7IGkgPCBJRk5BTVNJWi9zaXplb2YodW5zaWduZWQgaW50KTsgaSsrKSB7Ci0JCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBpbnQgKilvdXRkZXYpW2ldCi0JCQleICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+cGh5c291dGRldilbaV0pCi0JCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+b3V0X21hc2spW2ldOwotCX0KLQotCXJldHVybiAocmV0ICE9IDApIF4gIShpbmZvLT5pbnZlcnQgJiBJUDZUX1BIWVNERVZfT1BfT1VUKTsKLX0KLQotc3RhdGljIGludAotY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgICBjb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwLAotCQkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAotCQkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCi17Ci0JY29uc3Qgc3RydWN0IGlwNnRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwotCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUDZUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2dF9waHlzZGV2X2luZm8pKSkKLQkJcmV0dXJuIDA7Ci0JaWYgKCEoaW5mby0+Yml0bWFzayAmIElQNlRfUEhZU0RFVl9PUF9NQVNLKSB8fAotCSAgICBpbmZvLT5iaXRtYXNrICYgfklQNlRfUEhZU0RFVl9PUF9NQVNLKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcDZ0X21hdGNoIHBoeXNkZXZfbWF0Y2ggPSB7Ci0JLm5hbWUJCT0gInBoeXNkZXYiLAotCS5tYXRjaAkJPSAmbWF0Y2gsCi0JLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCi17Ci0JcmV0dXJuIGlwNnRfcmVnaXN0ZXJfbWF0Y2goJnBoeXNkZXZfbWF0Y2gpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQotewotCWlwNnRfdW5yZWdpc3Rlcl9tYXRjaCgmcGh5c2Rldl9tYXRjaCk7Ci19Ci0KLW1vZHVsZV9pbml0KGluaXQpOwotbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfcnQuYwppbmRleCBjMWU3NzBlLi44NDY1YjQzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ydC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3J0LmMKQEAgLTE4Myw3ICsxODMsNyBAQAogLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLwogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0gICAgICAgICAgY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCwKKyAgICAgICAgICBjb25zdCB2b2lkICplbnRyeSwKICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCiAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCiAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwppbmRleCA0YzAwMjg2Li5jZTRhOTY4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCkBAIC05Nyw2ICs5Nyw3IEBACiAJLnZhbGlkX2hvb2tzCT0gRklMVEVSX1ZBTElEX0hPT0tTLAogCS5sb2NrCQk9IFJXX0xPQ0tfVU5MT0NLRUQsCiAJLm1lCQk9IFRISVNfTU9EVUxFLAorCS5hZgkJPSBBRl9JTkVUNiwKIH07CiAKIC8qIFRoZSB3b3JrIGNvbWVzIGluIGhlcmUgZnJvbSBuZXRmaWx0ZXIuYy4gKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwppbmRleCA4NWMxZTZlLi4zMGE0NjI3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCkBAIC0xMjcsNiArMTI3LDcgQEAKIAkudmFsaWRfaG9va3MJPSBNQU5HTEVfVkFMSURfSE9PS1MsCiAJLmxvY2sJCT0gUldfTE9DS19VTkxPQ0tFRCwKIAkubWUJCT0gVEhJU19NT0RVTEUsCisJLmFmCQk9IEFGX0lORVQ2LAogfTsKIAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3Jhdy5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3Jhdy5jCmluZGV4IGMyOTgyZWYuLmRiMjhiYTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfcmF3LmMKQEAgLTEwNiwxMSArMTA2LDEyIEBACiAJfQogfTsKIAotc3RhdGljIHN0cnVjdCBpcDZ0X3RhYmxlIHBhY2tldF9yYXcgPSB7IAorc3RhdGljIHN0cnVjdCB4dF90YWJsZSBwYWNrZXRfcmF3ID0geyAKIAkubmFtZSA9ICJyYXciLCAKIAkudmFsaWRfaG9va3MgPSBSQVdfVkFMSURfSE9PS1MsIAogCS5sb2NrID0gUldfTE9DS19VTkxPQ0tFRCwgCi0JLm1lID0gVEhJU19NT0RVTEUKKwkubWUgPSBUSElTX01PRFVMRSwKKwkuYWYgPSBBRl9JTkVUNiwKIH07CiAKIC8qIFRoZSB3b3JrIGNvbWVzIGluIGhlcmUgZnJvbSBuZXRmaWx0ZXIuYy4gKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCmluZGV4IGU1N2Q2ZmMuLjkyYWQ1M2QgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwpAQCAtNTg0LDcgKzU4NCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQluZWVkX25mX2Nvbm50cmFjaygpOworCW5lZWRfY29ubnRyYWNrKCk7CiAJcmV0dXJuIGluaXRfb3JfY2xlYW51cCgxKTsKIH0KIApAQCAtNTk1LDkgKzU5NSwzIEBACiAKIG1vZHVsZV9pbml0KGluaXQpOwogbW9kdWxlX2V4aXQoZmluaSk7Ci0KLXZvaWQgbmVlZF9pcDZfY29ubnRyYWNrKHZvaWQpCi17Ci19Ci0KLUVYUE9SVF9TWU1CT0wobmVlZF9pcDZfY29ubnRyYWNrKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcmVhc20uYwppbmRleCBmM2U1ZmZiLi44NGVmOWExIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3JlYXNtLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19yZWFzbS5jCkBAIC03MCw4ICs3MCw4IEBACiAKIHN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZQogewotCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZQkqbmV4dDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxydV9saXN0OwkJLyogbHJ1IGxpc3QgbWVtYmVyCSovCisJc3RydWN0IGhsaXN0X25vZGUJbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxydV9saXN0OwkvKiBscnUgbGlzdCBtZW1iZXIJKi8KIAogCV9fdTMyCQkJaWQ7CQkvKiBmcmFnbWVudCBpZAkJKi8KIAlzdHJ1Y3QgaW42X2FkZHIJCXNhZGRyOwpAQCAtOTAsMTQgKzkwLDEzIEBACiAjZGVmaW5lIEZJUlNUX0lOCQkyCiAjZGVmaW5lIExBU1RfSU4JCQkxCiAJX191MTYJCQluaG9mZnNldDsKLQlzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUJKipwcHJldjsKIH07CiAKIC8qIEhhc2ggdGFibGUuICovCiAKICNkZWZpbmUgRlJBRzZRX0hBU0hTWgk2NAogCi1zdGF0aWMgc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlICpuZl9jdF9mcmFnNl9oYXNoW0ZSQUc2UV9IQVNIU1pdOworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIG5mX2N0X2ZyYWc2X2hhc2hbRlJBRzZRX0hBU0hTWl07CiBzdGF0aWMgREVGSU5FX1JXTE9DSyhuZl9jdF9mcmFnNl9sb2NrKTsKIHN0YXRpYyB1MzIgbmZfY3RfZnJhZzZfaGFzaF9ybmQ7CiBzdGF0aWMgTElTVF9IRUFEKG5mX2N0X2ZyYWc2X2xydV9saXN0KTsKQEAgLTEwNSw5ICsxMDQsNyBAQAogCiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIF9fZnFfdW5saW5rKHN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqZnEpCiB7Ci0JaWYgKGZxLT5uZXh0KQotCQlmcS0+bmV4dC0+cHByZXYgPSBmcS0+cHByZXY7Ci0JKmZxLT5wcHJldiA9IGZxLT5uZXh0OworCWhsaXN0X2RlbCgmZnEtPmxpc3QpOwogCWxpc3RfZGVsKCZmcS0+bHJ1X2xpc3QpOwogCW5mX2N0X2ZyYWc2X25xdWV1ZXMtLTsKIH0KQEAgLTE1OCwyOCArMTU1LDE4IEBACiAJZ2V0X3JhbmRvbV9ieXRlcygmbmZfY3RfZnJhZzZfaGFzaF9ybmQsIHNpemVvZih1MzIpKTsKIAlmb3IgKGkgPSAwOyBpIDwgRlJBRzZRX0hBU0hTWjsgaSsrKSB7CiAJCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqcTsKKwkJc3RydWN0IGhsaXN0X25vZGUgKnAsICpuOwogCi0JCXEgPSBuZl9jdF9mcmFnNl9oYXNoW2ldOwotCQl3aGlsZSAocSkgewotCQkJc3RydWN0IG5mX2N0X2ZyYWc2X3F1ZXVlICpuZXh0ID0gcS0+bmV4dDsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShxLCBwLCBuLCAmbmZfY3RfZnJhZzZfaGFzaFtpXSwgbGlzdCkgewogCQkJdW5zaWduZWQgaW50IGh2YWwgPSBpcDZxaGFzaGZuKHEtPmlkLAogCQkJCQkJICAgICAgICZxLT5zYWRkciwKIAkJCQkJCSAgICAgICAmcS0+ZGFkZHIpOwotCiAJCQlpZiAoaHZhbCAhPSBpKSB7Ci0JCQkJLyogVW5saW5rLiAqLwotCQkJCWlmIChxLT5uZXh0KQotCQkJCQlxLT5uZXh0LT5wcHJldiA9IHEtPnBwcmV2OwotCQkJCSpxLT5wcHJldiA9IHEtPm5leHQ7Ci0KKwkJCQlobGlzdF9kZWwoJnEtPmxpc3QpOwogCQkJCS8qIFJlbGluayB0byBuZXcgaGFzaCBjaGFpbi4gKi8KLQkJCQlpZiAoKHEtPm5leHQgPSBuZl9jdF9mcmFnNl9oYXNoW2h2YWxdKSAhPSBOVUxMKQotCQkJCQlxLT5uZXh0LT5wcHJldiA9ICZxLT5uZXh0OwotCQkJCW5mX2N0X2ZyYWc2X2hhc2hbaHZhbF0gPSBxOwotCQkJCXEtPnBwcmV2ID0gJm5mX2N0X2ZyYWc2X2hhc2hbaHZhbF07CisJCQkJaGxpc3RfYWRkX2hlYWQoJnEtPmxpc3QsCisJCQkJCSAgICAgICAmbmZfY3RfZnJhZzZfaGFzaFtodmFsXSk7CiAJCQl9Ci0KLQkJCXEgPSBuZXh0OwogCQl9CiAJfQogCXdyaXRlX3VubG9jaygmbmZfY3RfZnJhZzZfbG9jayk7CkBAIC0zMTQsMTUgKzMwMSwxNyBAQAogCiAvKiBDcmVhdGlvbiBwcmltaXRpdmVzLiAqLwogCi0KIHN0YXRpYyBzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKm5mX2N0X2ZyYWc2X2ludGVybih1bnNpZ25lZCBpbnQgaGFzaCwKIAkJCQkJICBzdHJ1Y3QgbmZfY3RfZnJhZzZfcXVldWUgKmZxX2luKQogewogCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqZnE7CisjaWZkZWYgQ09ORklHX1NNUAorCXN0cnVjdCBobGlzdF9ub2RlICpuOworI2VuZGlmCiAKIAl3cml0ZV9sb2NrKCZuZl9jdF9mcmFnNl9sb2NrKTsKICNpZmRlZiBDT05GSUdfU01QCi0JZm9yIChmcSA9IG5mX2N0X2ZyYWc2X2hhc2hbaGFzaF07IGZxOyBmcSA9IGZxLT5uZXh0KSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoZnEsIG4sICZuZl9jdF9mcmFnNl9oYXNoW2hhc2hdLCBsaXN0KSB7CiAJCWlmIChmcS0+aWQgPT0gZnFfaW4tPmlkICYmIAogCQkgICAgIWlwdjZfYWRkcl9jbXAoJmZxX2luLT5zYWRkciwgJmZxLT5zYWRkcikgJiYKIAkJICAgICFpcHY2X2FkZHJfY21wKCZmcV9pbi0+ZGFkZHIsICZmcS0+ZGFkZHIpKSB7CkBAIC0zNDAsMTAgKzMyOSw3IEBACiAJCWF0b21pY19pbmMoJmZxLT5yZWZjbnQpOwogCiAJYXRvbWljX2luYygmZnEtPnJlZmNudCk7Ci0JaWYgKChmcS0+bmV4dCA9IG5mX2N0X2ZyYWc2X2hhc2hbaGFzaF0pICE9IE5VTEwpCi0JCWZxLT5uZXh0LT5wcHJldiA9ICZmcS0+bmV4dDsKLQluZl9jdF9mcmFnNl9oYXNoW2hhc2hdID0gZnE7Ci0JZnEtPnBwcmV2ID0gJm5mX2N0X2ZyYWc2X2hhc2hbaGFzaF07CisJaGxpc3RfYWRkX2hlYWQoJmZxLT5saXN0LCAmbmZfY3RfZnJhZzZfaGFzaFtoYXNoXSk7CiAJSU5JVF9MSVNUX0hFQUQoJmZxLT5scnVfbGlzdCk7CiAJbGlzdF9hZGRfdGFpbCgmZnEtPmxydV9saXN0LCAmbmZfY3RfZnJhZzZfbHJ1X2xpc3QpOwogCW5mX2N0X2ZyYWc2X25xdWV1ZXMrKzsKQEAgLTM4NCwxMCArMzcwLDExIEBACiBmcV9maW5kKHUzMiBpZCwgc3RydWN0IGluNl9hZGRyICpzcmMsIHN0cnVjdCBpbjZfYWRkciAqZHN0KQogewogCXN0cnVjdCBuZl9jdF9mcmFnNl9xdWV1ZSAqZnE7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJdW5zaWduZWQgaW50IGhhc2ggPSBpcDZxaGFzaGZuKGlkLCBzcmMsIGRzdCk7CiAKIAlyZWFkX2xvY2soJm5mX2N0X2ZyYWc2X2xvY2spOwotCWZvciAoZnEgPSBuZl9jdF9mcmFnNl9oYXNoW2hhc2hdOyBmcTsgZnEgPSBmcS0+bmV4dCkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZxLCBuLCAmbmZfY3RfZnJhZzZfaGFzaFtoYXNoXSwgbGlzdCkgewogCQlpZiAoZnEtPmlkID09IGlkICYmIAogCQkgICAgIWlwdjZfYWRkcl9jbXAoc3JjLCAmZnEtPnNhZGRyKSAmJgogCQkgICAgIWlwdjZfYWRkcl9jbXAoZHN0LCAmZnEtPmRhZGRyKSkgewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDdkNTVmOWMuLjk5YzBhMGYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTEwMywzICsxMDMsMjYxIEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGEgbmV0bGluay1iYXNlZCB1c2Vyc3BhY2UgaW50ZXJmYWNlCiAKIGVuZG1lbnUKKworY29uZmlnIE5FVEZJTFRFUl9YVEFCTEVTCisJdHJpc3RhdGUgIk5ldGZpbHRlciBYdGFibGVzIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBpcF90YWJsZXMpIgorCWhlbHAKKwkgIFRoaXMgaXMgcmVxdWlyZWQgaWYgeW91IGludGVuZCB0byB1c2UgYW55IG9mIGlwX3RhYmxlcywKKwkgIGlwNl90YWJsZXMgb3IgYXJwX3RhYmxlcy4KKworIyBhbHBoYWJldGljYWxseSBvcmRlcmVkIGxpc3Qgb2YgdGFyZ2V0cworCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9DTEFTU0lGWQorCXRyaXN0YXRlICciQ0xBU1NJRlkiIHRhcmdldCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYENMQVNTSUZZJyB0YXJnZXQsIHdoaWNoIGVuYWJsZXMgdGhlIHVzZXIgdG8gc2V0CisJICB0aGUgcHJpb3JpdHkgb2YgYSBwYWNrZXQuIFNvbWUgcWRpc2NzIGNhbiB1c2UgdGhpcyB2YWx1ZSBmb3IKKwkgIGNsYXNzaWZpY2F0aW9uLCBhbW9uZyB0aGVzZSBhcmU6CisKKyAgCSAgYXRtLCBjYnEsIGRzbWFyaywgcGZpZm9fZmFzdCwgaHRiLCBwcmlvCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9DT05OTUFSSworCXRyaXN0YXRlICAnIkNPTk5NQVJLIiB0YXJnZXQgc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJZGVwZW5kcyBvbiBJUF9ORl9NQU5HTEUgfHwgSVA2X05GX01BTkdMRQorCWRlcGVuZHMgb24gKElQX05GX0NPTk5UUkFDSyAmJiBJUF9ORl9DT05OVFJBQ0tfTUFSSykgfHwgKE5GX0NPTk5UUkFDS19NQVJLICYmIE5GX0NPTk5UUkFDS19JUFY0KQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgQ09OTk1BUksnIHRhcmdldCwgd2hpY2ggYWxsb3dzIG9uZSB0byBtYW5pcHVsYXRlCisJICB0aGUgY29ubmVjdGlvbiBtYXJrIHZhbHVlLiAgU2ltaWxhciB0byB0aGUgTUFSSyB0YXJnZXQsIGJ1dAorCSAgYWZmZWN0cyB0aGUgY29ubmVjdGlvbiBtYXJrIHZhbHVlIHJhdGhlciB0aGFuIHRoZSBwYWNrZXQgbWFyayB2YWx1ZS4KKwkKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgaXB0X0NPTk5NQVJLLm8uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBORVRGSUxURVJfWFRfVEFSR0VUX01BUksKKwl0cmlzdGF0ZSAnIk1BUksiIHRhcmdldCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYE1BUksnIHRhcmdldCwgd2hpY2ggYWxsb3dzIHlvdSB0byBjcmVhdGUgcnVsZXMKKwkgIGluIHRoZSBgbWFuZ2xlJyB0YWJsZSB3aGljaCBhbHRlciB0aGUgbmV0ZmlsdGVyIG1hcmsgKG5mbWFyaykgZmllbGQKKwkgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2V0IHByaW9yIHRvIHJvdXRpbmcuIFRoaXMgY2FuIGNoYW5nZQorCSAgdGhlIHJvdXRpbmcgbWV0aG9kIChzZWUgYFVzZSBuZXRmaWx0ZXIgTUFSSyB2YWx1ZSBhcyByb3V0aW5nCisJICBrZXknKSBhbmQgY2FuIGFsc28gYmUgdXNlZCBieSBvdGhlciBzdWJzeXN0ZW1zIHRvIGNoYW5nZSB0aGVpcgorCSAgYmVoYXZpb3IuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9ORlFVRVVFCisJdHJpc3RhdGUgJyJORlFVRVVFIiB0YXJnZXQgU3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgVGhpcyBUYXJnZXQgcmVwbGFjZWQgdGhlIG9sZCBvYnNvbGV0ZSBRVUVVRSB0YXJnZXQuCisKKwkgIEFzIG9wcG9zZWQgdG8gUVVFVUUsIGl0IHN1cHBvcnRzIDY1NTM1IGRpZmZlcmVudCBxdWV1ZXMsCisJICBub3QganVzdCBvbmUuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX1RBUkdFVF9OT1RSQUNLCisJdHJpc3RhdGUgICciTk9UUkFDSyIgdGFyZ2V0IHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWRlcGVuZHMgb24gSVBfTkZfUkFXIHx8IElQNl9ORl9SQVcKKwlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKKwloZWxwCisJICBUaGUgTk9UUkFDSyB0YXJnZXQgYWxsb3dzIGEgc2VsZWN0IHJ1bGUgdG8gc3BlY2lmeQorCSAgd2hpY2ggcGFja2V0cyAqbm90KiB0byBlbnRlciB0aGUgY29ubnRyYWNrL05BVAorCSAgc3Vic3lzdGVtIHdpdGggYWxsIHRoZSBjb25zZXF1ZW5jZXMgKG5vIElDTVAgZXJyb3IgdHJhY2tpbmcsCisJICBubyBwcm90b2NvbCBoZWxwZXJzIGZvciB0aGUgc2VsZWN0ZWQgcGFja2V0cykuCisJCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UCisJdHJpc3RhdGUgICciY29tbWVudCIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb21tZW50JyBkdW1teS1tYXRjaCwgd2hpY2ggYWxsb3dzIHlvdSB0byBwdXQKKwkgIGNvbW1lbnRzIGluIHlvdXIgaXB0YWJsZXMgcnVsZXNldC4KKworCSAgSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dD4uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTCisJdHJpc3RhdGUgICciY29ubmJ5dGVzIiBwZXItY29ubmVjdGlvbiBjb3VudGVyIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWRlcGVuZHMgb24gKElQX05GX0NPTk5UUkFDSyAmJiBJUF9ORl9DVF9BQ0NUKSB8fCBORl9DVF9BQ0NUCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBjb25uYnl0ZXMnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQorCSAgbnVtYmVyIG9mIGJ5dGVzIGFuZC9vciBwYWNrZXRzIGZvciBlYWNoIGRpcmVjdGlvbiB3aXRoaW4gYSBjb25uZWN0aW9uLgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSworCXRyaXN0YXRlICAnImNvbm5tYXJrIiBjb25uZWN0aW9uIG1hcmsgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJZGVwZW5kcyBvbiAoSVBfTkZfQ09OTlRSQUNLICYmIElQX05GX0NPTk5UUkFDS19NQVJLKSB8fCBORl9DT05OVFJBQ0tfTUFSSworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgY29ubm1hcmsnIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIHRoZQorCSAgY29ubmVjdGlvbiBtYXJrIHZhbHVlIHByZXZpb3VzbHkgc2V0IGZvciB0aGUgc2Vzc2lvbiBieSBgQ09OTk1BUksnLiAKKwkKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgaXB0X2Nvbm5tYXJrLm8uICBJZiB1bnN1cmUsIHNheSBgTicuCisKK2NvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfQ09OTlRSQUNLCisJdHJpc3RhdGUgJyJjb25udHJhY2siIGNvbm5lY3Rpb24gdHJhY2tpbmcgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJZGVwZW5kcyBvbiBJUF9ORl9DT05OVFJBQ0sgfHwgTkZfQ09OTlRSQUNLCisJaGVscAorCSAgVGhpcyBpcyBhIGdlbmVyYWwgY29ubnRyYWNrIG1hdGNoIG1vZHVsZSwgYSBzdXBlcnNldCBvZiB0aGUgc3RhdGUgbWF0Y2guCisKKwkgIEl0IGFsbG93cyBtYXRjaGluZyBvbiBhZGRpdGlvbmFsIGNvbm50cmFjayBpbmZvcm1hdGlvbiwgd2hpY2ggaXMKKwkgIHVzZWZ1bCBpbiBjb21wbGV4IGNvbmZpZ3VyYXRpb25zLCBzdWNoIGFzIE5BVCBnYXRld2F5cyB3aXRoIG11bHRpcGxlCisJICBpbnRlcm5ldCBsaW5rcyBvciB0dW5uZWxzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQCisJdHJpc3RhdGUgICciRENDUCIgcHJvdG9jb2wgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBlbmFibGVkLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgaXB0YWJsZXMKKwkgIGBkY2NwJyBtYXRjaCBpbiBvcmRlciB0byBtYXRjaCBvbiBEQ0NQIHNvdXJjZS9kZXN0aW5hdGlvbiBwb3J0cworCSAgYW5kIERDQ1AgZmxhZ3MuCisKKwkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vbW9kdWxlcy50eHQ+LiAgSWYgdW5zdXJlLCBzYXkgYE4nLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX0hFTFBFUgorCXRyaXN0YXRlICciaGVscGVyIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwlkZXBlbmRzIG9uIElQX05GX0NPTk5UUkFDSyB8fCBORl9DT05OVFJBQ0sKKwloZWxwCisJICBIZWxwZXIgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGluIGR5bmFtaWMgY29ubmVjdGlvbnMKKwkgIHRyYWNrZWQgYnkgYSBjb25udHJhY2staGVscGVyLCBpZS4gaXBfY29ubnRyYWNrX2Z0cAorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEgKKwl0cmlzdGF0ZSAnImxlbmd0aCIgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIGEgcGFja2V0IGFnYWluc3QgYQorCSAgc3BlY2lmaWMgdmFsdWUgb3IgcmFuZ2Ugb2YgdmFsdWVzLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVAorCXRyaXN0YXRlICcibGltaXQiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIGxpbWl0IG1hdGNoaW5nIGFsbG93cyB5b3UgdG8gY29udHJvbCB0aGUgcmF0ZSBhdCB3aGljaCBhIHJ1bGUgY2FuIGJlCisJICBtYXRjaGVkOiBtYWlubHkgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIExPRyB0YXJnZXQgKCJMT0cKKwkgIHRhcmdldCBzdXBwb3J0IiwgYmVsb3cpIGFuZCB0byBhdm9pZCBzb21lIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFja3MuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX01BQworCXRyaXN0YXRlICcibWFjIiBhZGRyZXNzIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWhlbHAKKwkgIE1BQyBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlIHNvdXJjZQorCSAgRXRoZXJuZXQgYWRkcmVzcyBvZiB0aGUgcGFja2V0LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9NQVJLCisJdHJpc3RhdGUgJyJtYXJrIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBOZXRmaWx0ZXIgbWFyayBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIHBhY2tldHMgYmFzZWQgb24gdGhlCisJICBgbmZtYXJrJyB2YWx1ZSBpbiB0aGUgcGFja2V0LiAgVGhpcyBjYW4gYmUgc2V0IGJ5IHRoZSBNQVJLIHRhcmdldAorCSAgKHNlZSBiZWxvdykuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1BIWVNERVYKKwl0cmlzdGF0ZSAnInBoeXNkZXYiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUyAmJiBCUklER0VfTkVURklMVEVSCisJaGVscAorCSAgUGh5c2RldiBwYWNrZXQgbWF0Y2hpbmcgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwaHlzaWNhbCBicmlkZ2UgcG9ydHMKKwkgIHRoZSBJUCBwYWNrZXQgYXJyaXZlZCBvbiBvciB3aWxsIGxlYXZlIGJ5LgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9QS1RUWVBFCisJdHJpc3RhdGUgJyJwa3R0eXBlIiBwYWNrZXQgdHlwZSBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBQYWNrZXQgdHlwZSBtYXRjaGluZyBhbGxvd3MgeW91IHRvIG1hdGNoIGEgcGFja2V0IGJ5CisJICBpdHMgImNsYXNzIiwgZWcuIEJST0FEQ0FTVCwgTVVMVElDQVNULCAuLi4KKworCSAgVHlwaWNhbCB1c2FnZToKKwkgIGlwdGFibGVzIC1BIElOUFVUIC1tIHBrdHR5cGUgLS1wa3QtdHlwZSBicm9hZGNhc3QgLWogTE9HCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1JFQUxNCisJdHJpc3RhdGUgICcicmVhbG0iIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCXNlbGVjdCBORVRfQ0xTX1JPVVRFCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGByZWFsbScgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gdXNlIHRoZSByZWFsbQorCSAga2V5IGZyb20gdGhlIHJvdXRpbmcgc3Vic3lzdGVtIGluc2lkZSBpcHRhYmxlcy4KKwkKKwkgIFRoaXMgbWF0Y2ggcHJldHR5IG11Y2ggcmVzZW1ibGVzIHRoZSBDT05GSUdfTkVUX0NMU19ST1VURTQgb3B0aW9uIAorCSAgaW4gdGMgd29ybGQuCisJCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TQ1RQCisJdHJpc3RhdGUgICcic2N0cCIgcHJvdG9jb2wgbWF0Y2ggc3VwcG9ydCcKKwlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBlbmFibGVkLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHVzZSB0aGUgCisJICBgc2N0cCcgbWF0Y2ggaW4gb3JkZXIgdG8gbWF0Y2ggb24gU0NUUCBzb3VyY2UvZGVzdGluYXRpb24gcG9ydHMKKwkgIGFuZCBTQ1RQIGNodW5rIHR5cGVzLgorCisJICBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0Pi4gIElmIHVuc3VyZSwgc2F5IGBOJy4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TVEFURQorCXRyaXN0YXRlICcic3RhdGUiIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCWRlcGVuZHMgb24gSVBfTkZfQ09OTlRSQUNLIHx8IE5GX0NPTk5UUkFDSworCWhlbHAKKwkgIENvbm5lY3Rpb24gc3RhdGUgbWF0Y2hpbmcgYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIGJhc2VkIG9uIHRoZWlyCisJICByZWxhdGlvbnNoaXAgdG8gYSB0cmFja2VkIGNvbm5lY3Rpb24gKGllLiBwcmV2aW91cyBwYWNrZXRzKS4gIFRoaXMKKwkgIGlzIGEgcG93ZXJmdWwgdG9vbCBmb3IgcGFja2V0IGNsYXNzaWZpY2F0aW9uLgorCisJICBUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkcKKwl0cmlzdGF0ZSAgJyJzdHJpbmciIG1hdGNoIHN1cHBvcnQnCisJZGVwZW5kcyBvbiBORVRGSUxURVJfWFRBQkxFUworCXNlbGVjdCBURVhUU0VBUkNICisJc2VsZWN0IFRFWFRTRUFSQ0hfS01QCisJc2VsZWN0IFRFWFRTRUFSQ0hfQk0KKwlzZWxlY3QgVEVYVFNFQVJDSF9GU00KKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYHN0cmluZycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gbG9vayBmb3IKKwkgIHBhdHRlcm4gbWF0Y2hpbmdzIGluIHBhY2tldHMuCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX1RDUE1TUworCXRyaXN0YXRlICcidGNwbXNzIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIGEgYHRjcG1zcycgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gZXhhbWluZSB0aGUKKwkgIE1TUyB2YWx1ZSBvZiBUQ1AgU1lOIHBhY2tldHMsIHdoaWNoIGNvbnRyb2wgdGhlIG1heGltdW0gcGFja2V0IHNpemUKKwkgIGZvciB0aGF0IGNvbm5lY3Rpb24uCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCBjYjIxODMxLi43NDYxNzJlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTEsNCArMSw1IEBACiBuZXRmaWx0ZXItb2JqcyA6PSBjb3JlLm8gbmZfbG9nLm8gbmZfcXVldWUubyBuZl9zb2Nrb3B0Lm8KK25mX2Nvbm50cmFjay1vYmpzCTo9IG5mX2Nvbm50cmFja19jb3JlLm8gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUubyBuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljLm8gbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fdGNwLm8gbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5vCiAKIG9iai0kKENPTkZJR19ORVRGSUxURVIpID0gbmV0ZmlsdGVyLm8KIApAQCAtNiwxMyArNyw0MyBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX1FVRVVFKSArPSBuZm5ldGxpbmtfcXVldWUubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRykgKz0gbmZuZXRsaW5rX2xvZy5vCiAKLW5mX2Nvbm50cmFjay1vYmpzCTo9IG5mX2Nvbm50cmFja19jb3JlLm8gbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUubyBuZl9jb25udHJhY2tfbDNwcm90b19nZW5lcmljLm8gbmZfY29ubnRyYWNrX3Byb3RvX2dlbmVyaWMubyBuZl9jb25udHJhY2tfcHJvdG9fdGNwLm8gbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5vCi0KKyMgY29ubmVjdGlvbiB0cmFja2luZwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDSykgKz0gbmZfY29ubnRyYWNrLm8KLW9iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfRlRQKSArPSBuZl9jb25udHJhY2tfZnRwLm8KIAogIyBTQ1RQIHByb3RvY29sIGNvbm5lY3Rpb24gdHJhY2tpbmcKIG9iai0kKENPTkZJR19ORl9DVF9QUk9UT19TQ1RQKSArPSBuZl9jb25udHJhY2tfcHJvdG9fc2N0cC5vCiAKICMgbmV0bGluayBpbnRlcmZhY2UgZm9yIG5mX2Nvbm50cmFjawogb2JqLSQoQ09ORklHX05GX0NUX05FVExJTkspICs9IG5mX2Nvbm50cmFja19uZXRsaW5rLm8KKworIyBjb25uZWN0aW9uIHRyYWNraW5nIGhlbHBlcnMKK29iai0kKENPTkZJR19ORl9DT05OVFJBQ0tfRlRQKSArPSBuZl9jb25udHJhY2tfZnRwLm8KKworIyBnZW5lcmljIFggdGFibGVzIAorb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVEFCTEVTKSArPSB4X3RhYmxlcy5vIHh0X3RjcHVkcC5vCisKKyMgdGFyZ2V0cworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfQ0xBU1NJRlkpICs9IHh0X0NMQVNTSUZZLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLKSArPSB4dF9DT05OTUFSSy5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9NQVJLKSArPSB4dF9NQVJLLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUpICs9IHh0X05GUVVFVUUubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTk9UUkFDSykgKz0geHRfTk9UUkFDSy5vCisKKyMgbWF0Y2hlcworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UKSArPSB4dF9jb21tZW50Lm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTKSArPSB4dF9jb25uYnl0ZXMubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OTUFSSykgKz0geHRfY29ubm1hcmsubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0spICs9IHh0X2Nvbm50cmFjay5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1ApICs9IHh0X2RjY3Aubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9IRUxQRVIpICs9IHh0X2hlbHBlci5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0xFTkdUSCkgKz0geHRfbGVuZ3RoLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQpICs9IHh0X2xpbWl0Lm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFDKSArPSB4dF9tYWMubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLKSArPSB4dF9tYXJrLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRSkgKz0geHRfcGt0dHlwZS5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNKSArPSB4dF9yZWFsbS5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFApICs9IHh0X3NjdHAubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURSkgKz0geHRfc3RhdGUubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVFJJTkcpICs9IHh0X3N0cmluZy5vCitvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUykgKz0geHRfdGNwbXNzLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEhZU0RFVikgKz0geHRfcGh5c2Rldi5vCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKaW5kZXggMzUzMWQxNC4uNjE3NTk5YSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwpAQCAtODIxLDcgKzgyMSw3IEBACiAKIC8qIFNvbWUgbW9kdWxlcyBuZWVkIHVzLCBidXQgZG9uJ3QgZGVwZW5kIGRpcmVjdGx5IG9uIGFueSBzeW1ib2wuCiAgICBUaGV5IHNob3VsZCBjYWxsIHRoaXMuICovCi12b2lkIG5lZWRfbmZfY29ubnRyYWNrKHZvaWQpCit2b2lkIG5lZWRfY29ubnRyYWNrKHZvaWQpCiB7CiB9CiAKQEAgLTg0MSw3ICs4NDEsNyBAQAogRVhQT1JUX1NZTUJPTChuZl9jdF9pbnZlcnRfdHVwbGVwcik7CiBFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19hbHRlcl9yZXBseSk7CiBFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19kZXN0cm95ZWQpOwotRVhQT1JUX1NZTUJPTChuZWVkX25mX2Nvbm50cmFjayk7CitFWFBPUlRfU1lNQk9MKG5lZWRfY29ubnRyYWNrKTsKIEVYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX2hlbHBlcl9yZWdpc3Rlcik7CiBFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19oZWxwZXJfdW5yZWdpc3Rlcik7CiBFWFBPUlRfU1lNQk9MKG5mX2N0X2l0ZXJhdGVfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMgYi9uZXQvbmV0ZmlsdGVyL3hfdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4MTdhZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveF90YWJsZXMuYwpAQCAtMCwwICsxLDYyNCBAQAorLyoKKyAqIHhfdGFibGVzIGNvcmUgLSBCYWNrZW5kIGZvciB7aXAsaXA2LGFycH1fdGFibGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDYgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogQmFzZWQgb24gZXhpc3RpbmcgaXBfdGFibGVzIGNvZGUgd2hpY2ggaXMKKyAqICAgQ29weXJpZ2h0IChDKSAxOTk5IFBhdWwgYFJ1c3R5JyBSdXNzZWxsICYgTWljaGFlbCBKLiBOZXVsaW5nCisgKiAgIENvcHlyaWdodCAoQykgMjAwMC0yMDA1IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIltpcCxpcDYsYXJwXV90YWJsZXMgYmFja2VuZCBtb2R1bGUiKTsKKworI2RlZmluZSBTTVBfQUxJR04oeCkgKCgoeCkgKyBTTVBfQ0FDSEVfQllURVMtMSkgJiB+KFNNUF9DQUNIRV9CWVRFUy0xKSkKKworc3RydWN0IHh0X2FmIHsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG11dGV4OworCXN0cnVjdCBsaXN0X2hlYWQgbWF0Y2g7CisJc3RydWN0IGxpc3RfaGVhZCB0YXJnZXQ7CisJc3RydWN0IGxpc3RfaGVhZCB0YWJsZXM7Cit9OworCitzdGF0aWMgc3RydWN0IHh0X2FmICp4dDsKKworI2lmZGVmIERFQlVHX0lQX0ZJUkVXQUxMX1VTRVIKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCitlbnVtIHsKKwlUQUJMRSwKKwlUQVJHRVQsCisJTUFUQ0gsCit9OworCisvKiBSZWdpc3RyYXRpb24gaG9va3MgZm9yIHRhcmdldHMuICovCitpbnQKK3h0X3JlZ2lzdGVyX3RhcmdldChpbnQgYWYsIHN0cnVjdCB4dF90YXJnZXQgKnRhcmdldCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwlsaXN0X2FkZCgmdGFyZ2V0LT5saXN0LCAmeHRbYWZdLnRhcmdldCk7CisJdXAoJnh0W2FmXS5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woeHRfcmVnaXN0ZXJfdGFyZ2V0KTsKKwordm9pZAoreHRfdW5yZWdpc3Rlcl90YXJnZXQoaW50IGFmLCBzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQpCit7CisJZG93bigmeHRbYWZdLm11dGV4KTsKKwlMSVNUX0RFTEVURSgmeHRbYWZdLnRhcmdldCwgdGFyZ2V0KTsKKwl1cCgmeHRbYWZdLm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0woeHRfdW5yZWdpc3Rlcl90YXJnZXQpOworCitpbnQKK3h0X3JlZ2lzdGVyX21hdGNoKGludCBhZiwgc3RydWN0IHh0X21hdGNoICptYXRjaCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCWxpc3RfYWRkKCZtYXRjaC0+bGlzdCwgJnh0W2FmXS5tYXRjaCk7CisJdXAoJnh0W2FmXS5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh4dF9yZWdpc3Rlcl9tYXRjaCk7CisKK3ZvaWQKK3h0X3VucmVnaXN0ZXJfbWF0Y2goaW50IGFmLCBzdHJ1Y3QgeHRfbWF0Y2ggKm1hdGNoKQoreworCWRvd24oJnh0W2FmXS5tdXRleCk7CisJTElTVF9ERUxFVEUoJnh0W2FmXS5tYXRjaCwgbWF0Y2gpOworCXVwKCZ4dFthZl0ubXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTCh4dF91bnJlZ2lzdGVyX21hdGNoKTsKKworCisvKgorICogVGhlc2UgYXJlIHdlaXJkLCBidXQgbW9kdWxlIGxvYWRpbmcgbXVzdCBub3QgYmUgZG9uZSB3aXRoIG11dGV4CisgKiBoZWxkIChzaW5jZSB0aGV5IHdpbGwgcmVnaXN0ZXIpLCBhbmQgd2UgaGF2ZSB0byBoYXZlIGEgc2luZ2xlCisgKiBmdW5jdGlvbiB0byB1c2UgdHJ5X3RoZW5fcmVxdWVzdF9tb2R1bGUoKS4KKyAqLworCisvKiBGaW5kIG1hdGNoLCBncmFicyByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KK3N0cnVjdCB4dF9tYXRjaCAqeHRfZmluZF9tYXRjaChpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uKQoreworCXN0cnVjdCB4dF9tYXRjaCAqbTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnh0W2FmXS5tdXRleCkgIT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobSwgJnh0W2FmXS5tYXRjaCwgbGlzdCkgeworCQlpZiAoc3RyY21wKG0tPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWlmIChtLT5yZXZpc2lvbiA9PSByZXZpc2lvbikgeworCQkJCWlmICh0cnlfbW9kdWxlX2dldChtLT5tZSkpIHsKKwkJCQkJdXAoJnh0W2FmXS5tdXRleCk7CisJCQkJCXJldHVybiBtOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWVyciA9IC1FUFJPVE9UWVBFOyAvKiBGb3VuZCBzb21ldGhpbmcuICovCisJCX0KKwl9CisJdXAoJnh0W2FmXS5tdXRleCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KK0VYUE9SVF9TWU1CT0woeHRfZmluZF9tYXRjaCk7CisKKy8qIEZpbmQgdGFyZ2V0LCBncmFicyByZWYuICBSZXR1cm5zIEVSUl9QVFIoKSBvbiBlcnJvci4gKi8KK3N0cnVjdCB4dF90YXJnZXQgKnh0X2ZpbmRfdGFyZ2V0KGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24pCit7CisJc3RydWN0IHh0X3RhcmdldCAqdDsKKwlpbnQgZXJyID0gMDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnh0W2FmXS5tdXRleCkgIT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJnh0W2FmXS50YXJnZXQsIGxpc3QpIHsKKwkJaWYgKHN0cmNtcCh0LT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlpZiAodC0+cmV2aXNpb24gPT0gcmV2aXNpb24pIHsKKwkJCQlpZiAodHJ5X21vZHVsZV9nZXQodC0+bWUpKSB7CisJCQkJCXVwKCZ4dFthZl0ubXV0ZXgpOworCQkJCQlyZXR1cm4gdDsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQllcnIgPSAtRVBST1RPVFlQRTsgLyogRm91bmQgc29tZXRoaW5nLiAqLworCQl9CisJfQorCXVwKCZ4dFthZl0ubXV0ZXgpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CitFWFBPUlRfU1lNQk9MKHh0X2ZpbmRfdGFyZ2V0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnh0X3ByZWZpeFtOUFJPVE9dID0geworCVtBRl9JTkVUXSAJPSAiaXB0XyVzIiwKKwlbQUZfSU5FVDZdIAk9ICJpcDZ0XyVzIiwKKwlbTkZfQVJQXQk9ICJhcnB0XyVzIiwKK307CisKK3N0cnVjdCB4dF90YXJnZXQgKnh0X3JlcXVlc3RfZmluZF90YXJnZXQoaW50IGFmLCBjb25zdCBjaGFyICpuYW1lLCB1OCByZXZpc2lvbikKK3sKKwlzdHJ1Y3QgeHRfdGFyZ2V0ICp0YXJnZXQ7CisKKwl0YXJnZXQgPSB0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSh4dF9maW5kX3RhcmdldChhZiwgbmFtZSwgcmV2aXNpb24pLAorCQkJCQkgeHRfcHJlZml4W2FmXSwgbmFtZSk7CisJaWYgKElTX0VSUih0YXJnZXQpIHx8ICF0YXJnZXQpCisJCXJldHVybiBOVUxMOworCXJldHVybiB0YXJnZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF9yZXF1ZXN0X2ZpbmRfdGFyZ2V0KTsKKworc3RhdGljIGludCBtYXRjaF9yZXZmbihpbnQgYWYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4IHJldmlzaW9uLCBpbnQgKmJlc3RwKQoreworCXN0cnVjdCB4dF9tYXRjaCAqbTsKKwlpbnQgaGF2ZV9yZXYgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtLCAmeHRbYWZdLm1hdGNoLCBsaXN0KSB7CisJCWlmIChzdHJjbXAobS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKG0tPnJldmlzaW9uID4gKmJlc3RwKQorCQkJCSpiZXN0cCA9IG0tPnJldmlzaW9uOworCQkJaWYgKG0tPnJldmlzaW9uID09IHJldmlzaW9uKQorCQkJCWhhdmVfcmV2ID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gaGF2ZV9yZXY7Cit9CisKK3N0YXRpYyBpbnQgdGFyZ2V0X3JldmZuKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCAqYmVzdHApCit7CisJc3RydWN0IHh0X3RhcmdldCAqdDsKKwlpbnQgaGF2ZV9yZXYgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0LCAmeHRbYWZdLnRhcmdldCwgbGlzdCkgeworCQlpZiAoc3RyY21wKHQtPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCWlmICh0LT5yZXZpc2lvbiA+ICpiZXN0cCkKKwkJCQkqYmVzdHAgPSB0LT5yZXZpc2lvbjsKKwkJCWlmICh0LT5yZXZpc2lvbiA9PSByZXZpc2lvbikKKwkJCQloYXZlX3JldiA9IDE7CisJCX0KKwl9CisJcmV0dXJuIGhhdmVfcmV2OworfQorCisvKiBSZXR1cm5zIHRydWUgb3IgZmFsc2UgKGlmIG5vIHN1Y2ggZXh0ZW5zaW9uIGF0IGFsbCkgKi8KK2ludCB4dF9maW5kX3JldmlzaW9uKGludCBhZiwgY29uc3QgY2hhciAqbmFtZSwgdTggcmV2aXNpb24sIGludCB0YXJnZXQsCisJCSAgICAgaW50ICplcnIpCit7CisJaW50IGhhdmVfcmV2LCBiZXN0ID0gLTE7CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFthZl0ubXV0ZXgpICE9IDApIHsKKwkJKmVyciA9IC1FSU5UUjsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh0YXJnZXQgPT0gMSkKKwkJaGF2ZV9yZXYgPSB0YXJnZXRfcmV2Zm4oYWYsIG5hbWUsIHJldmlzaW9uLCAmYmVzdCk7CisJZWxzZQorCQloYXZlX3JldiA9IG1hdGNoX3JldmZuKGFmLCBuYW1lLCByZXZpc2lvbiwgJmJlc3QpOworCXVwKCZ4dFthZl0ubXV0ZXgpOworCisJLyogTm90aGluZyBhdCBhbGw/ICBSZXR1cm4gMCB0byB0cnkgbG9hZGluZyBtb2R1bGUuICovCisJaWYgKGJlc3QgPT0gLTEpIHsKKwkJKmVyciA9IC1FTk9FTlQ7CisJCXJldHVybiAwOworCX0KKworCSplcnIgPSBiZXN0OworCWlmICghaGF2ZV9yZXYpCisJCSplcnIgPSAtRVBST1RPTk9TVVBQT1JUOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfZmluZF9yZXZpc2lvbik7CisKK3N0cnVjdCB4dF90YWJsZV9pbmZvICp4dF9hbGxvY190YWJsZV9pbmZvKHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpuZXdpbmZvOworCWludCBjcHU7CisKKwkvKiBQZWRhbnRyeTogcHJldmVudCB0aGVtIGZyb20gaGl0dGluZyBCVUcoKSBpbiB2bWFsbG9jLmMgLS1SUiAqLworCWlmICgoU01QX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQpICsgMiA+IG51bV9waHlzcGFnZXMpCisJCXJldHVybiBOVUxMOworCisJbmV3aW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4dF90YWJsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdpbmZvKQorCQlyZXR1cm4gTlVMTDsKKworCW5ld2luZm8tPnNpemUgPSBzaXplOworCisJZm9yX2VhY2hfY3B1KGNwdSkgeworCQlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCisJCQluZXdpbmZvLT5lbnRyaWVzW2NwdV0gPSBrbWFsbG9jX25vZGUoc2l6ZSwKKwkJCQkJCQlHRlBfS0VSTkVMLAorCQkJCQkJCWNwdV90b19ub2RlKGNwdSkpOworCQllbHNlCisJCQluZXdpbmZvLT5lbnRyaWVzW2NwdV0gPSB2bWFsbG9jX25vZGUoc2l6ZSwKKwkJCQkJCQljcHVfdG9fbm9kZShjcHUpKTsKKworCQlpZiAobmV3aW5mby0+ZW50cmllc1tjcHVdID09IE5VTEwpIHsKKwkJCXh0X2ZyZWVfdGFibGVfaW5mbyhuZXdpbmZvKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIG5ld2luZm87Cit9CitFWFBPUlRfU1lNQk9MKHh0X2FsbG9jX3RhYmxlX2luZm8pOworCit2b2lkIHh0X2ZyZWVfdGFibGVfaW5mbyhzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqaW5mbykKK3sKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfY3B1KGNwdSkgeworCQlpZiAoaW5mby0+c2l6ZSA8PSBQQUdFX1NJWkUpCisJCQlrZnJlZShpbmZvLT5lbnRyaWVzW2NwdV0pOworCQllbHNlCisJCQl2ZnJlZShpbmZvLT5lbnRyaWVzW2NwdV0pOworCX0KKwlrZnJlZShpbmZvKTsKK30KK0VYUE9SVF9TWU1CT0woeHRfZnJlZV90YWJsZV9pbmZvKTsKKworLyogRmluZCB0YWJsZSBieSBuYW1lLCBncmFicyBtdXRleCAmIHJlZi4gIFJldHVybnMgRVJSX1BUUigpIG9uIGVycm9yLiAqLworc3RydWN0IHh0X3RhYmxlICp4dF9maW5kX3RhYmxlX2xvY2soaW50IGFmLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB4dF90YWJsZSAqdDsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnh0W2FmXS5tdXRleCkgIT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlRSKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodCwgJnh0W2FmXS50YWJsZXMsIGxpc3QpCisJCWlmIChzdHJjbXAodC0+bmFtZSwgbmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldCh0LT5tZSkpCisJCQlyZXR1cm4gdDsKKwl1cCgmeHRbYWZdLm11dGV4KTsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X2ZpbmRfdGFibGVfbG9jayk7CisKK3ZvaWQgeHRfdGFibGVfdW5sb2NrKHN0cnVjdCB4dF90YWJsZSAqdGFibGUpCit7CisJdXAoJnh0W3RhYmxlLT5hZl0ubXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfdGFibGVfdW5sb2NrKTsKKworCitzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqCit4dF9yZXBsYWNlX3RhYmxlKHN0cnVjdCB4dF90YWJsZSAqdGFibGUsCisJICAgICAgdW5zaWduZWQgaW50IG51bV9jb3VudGVycywKKwkgICAgICBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbywKKwkgICAgICBpbnQgKmVycm9yKQoreworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpvbGRpbmZvLCAqcHJpdmF0ZTsKKworCS8qIERvIHRoZSBzdWJzdGl0dXRpb24uICovCisJd3JpdGVfbG9ja19iaCgmdGFibGUtPmxvY2spOworCXByaXZhdGUgPSB0YWJsZS0+cHJpdmF0ZTsKKwkvKiBDaGVjayBpbnNpZGUgbG9jazogaXMgdGhlIG9sZCBudW1iZXIgY29ycmVjdD8gKi8KKwlpZiAobnVtX2NvdW50ZXJzICE9IHByaXZhdGUtPm51bWJlcikgeworCQlkdXByaW50ZigibnVtX2NvdW50ZXJzICE9IHRhYmxlLT5wcml2YXRlLT5udW1iZXIgKCV1LyV1KVxuIiwKKwkJCSBudW1fY291bnRlcnMsIHByaXZhdGUtPm51bWJlcik7CisJCXdyaXRlX3VubG9ja19iaCgmdGFibGUtPmxvY2spOworCQkqZXJyb3IgPSAtRUFHQUlOOworCQlyZXR1cm4gTlVMTDsKKwl9CisJb2xkaW5mbyA9IHByaXZhdGU7CisJdGFibGUtPnByaXZhdGUgPSBuZXdpbmZvOworCW5ld2luZm8tPmluaXRpYWxfZW50cmllcyA9IG9sZGluZm8tPmluaXRpYWxfZW50cmllczsKKwl3cml0ZV91bmxvY2tfYmgoJnRhYmxlLT5sb2NrKTsKKworCXJldHVybiBvbGRpbmZvOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfcmVwbGFjZV90YWJsZSk7CisKK2ludCB4dF9yZWdpc3Rlcl90YWJsZShzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlLAorCQkgICAgICBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqYm9vdHN0cmFwLAorCQkgICAgICBzdHJ1Y3QgeHRfdGFibGVfaW5mbyAqbmV3aW5mbykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB4dF90YWJsZV9pbmZvICpwcml2YXRlOworCisJcmV0ID0gZG93bl9pbnRlcnJ1cHRpYmxlKCZ4dFt0YWJsZS0+YWZdLm11dGV4KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBEb24ndCBhdXRvbG9hZDogd2UnZCBlYXQgb3VyIHRhaWwuLi4gKi8KKwlpZiAobGlzdF9uYW1lZF9maW5kKCZ4dFt0YWJsZS0+YWZdLnRhYmxlcywgdGFibGUtPm5hbWUpKSB7CisJCXJldCA9IC1FRVhJU1Q7CisJCWdvdG8gdW5sb2NrOworCX0KKworCS8qIFNpbXBsaWZpZXMgcmVwbGFjZV90YWJsZSBjb2RlLiAqLworCXRhYmxlLT5wcml2YXRlID0gYm9vdHN0cmFwOworCWlmICgheHRfcmVwbGFjZV90YWJsZSh0YWJsZSwgMCwgbmV3aW5mbywgJnJldCkpCisJCWdvdG8gdW5sb2NrOworCisJcHJpdmF0ZSA9IHRhYmxlLT5wcml2YXRlOworCWR1cHJpbnRmKCJ0YWJsZS0+cHJpdmF0ZS0+bnVtYmVyID0gJXVcbiIsIHByaXZhdGUtPm51bWJlcik7CisKKwkvKiBzYXZlIG51bWJlciBvZiBpbml0aWFsIGVudHJpZXMgKi8KKwlwcml2YXRlLT5pbml0aWFsX2VudHJpZXMgPSBwcml2YXRlLT5udW1iZXI7CisKKwlyd2xvY2tfaW5pdCgmdGFibGUtPmxvY2spOworCWxpc3RfcHJlcGVuZCgmeHRbdGFibGUtPmFmXS50YWJsZXMsIHRhYmxlKTsKKworCXJldCA9IDA7CisgdW5sb2NrOgorCXVwKCZ4dFt0YWJsZS0+YWZdLm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoeHRfcmVnaXN0ZXJfdGFibGUpOworCit2b2lkICp4dF91bnJlZ2lzdGVyX3RhYmxlKHN0cnVjdCB4dF90YWJsZSAqdGFibGUpCit7CisJc3RydWN0IHh0X3RhYmxlX2luZm8gKnByaXZhdGU7CisKKwlkb3duKCZ4dFt0YWJsZS0+YWZdLm11dGV4KTsKKwlwcml2YXRlID0gdGFibGUtPnByaXZhdGU7CisJTElTVF9ERUxFVEUoJnh0W3RhYmxlLT5hZl0udGFibGVzLCB0YWJsZSk7CisJdXAoJnh0W3RhYmxlLT5hZl0ubXV0ZXgpOworCisJcmV0dXJuIHByaXZhdGU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh4dF91bnJlZ2lzdGVyX3RhYmxlKTsKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgY2hhciAqeHRfcHJvdG9fcHJlZml4W05QUk9UT10gPSB7CisJW0FGX0lORVRdCT0gImlwIiwKKwlbQUZfSU5FVDZdCT0gImlwNiIsCisJW05GX0FSUF0JPSAiYXJwIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICp4dF9nZXRfaWR4KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSBsaXN0LT5uZXh0OworCisJaWYgKCFoZWFkIHx8IGxpc3RfZW1wdHkobGlzdCkpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKHBvcyAmJiAoaGVhZCA9IGhlYWQtPm5leHQpKSB7CisJCWlmIChoZWFkID09IGxpc3QpCisJCQlyZXR1cm4gTlVMTDsKKwkJcG9zLS07CisJfQorCXJldHVybiBwb3MgPyBOVUxMIDogaGVhZDsKK30KKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKnR5cGUybGlzdCh1X2ludDE2X3QgYWYsIHVfaW50MTZfdCB0eXBlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFRBUkdFVDoKKwkJbGlzdCA9ICZ4dFthZl0udGFyZ2V0OworCQlicmVhazsKKwljYXNlIE1BVENIOgorCQlsaXN0ID0gJnh0W2FmXS5tYXRjaDsKKwkJYnJlYWs7CisJY2FzZSBUQUJMRToKKwkJbGlzdCA9ICZ4dFthZl0udGFibGVzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsaXN0ID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGxpc3Q7Cit9CisKK3N0YXRpYyB2b2lkICp4dF90Z3Rfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKikgc2VxLT5wcml2YXRlOworCXVfaW50MTZfdCBhZiA9ICh1bnNpZ25lZCBsb25nKXBkZS0+ZGF0YSAmIDB4ZmZmZjsKKwl1X2ludDE2X3QgdHlwZSA9ICh1bnNpZ25lZCBsb25nKXBkZS0+ZGF0YSA+PiAxNjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJaWYgKGFmID49IE5QUk9UTykKKwkJcmV0dXJuIE5VTEw7CisKKwlsaXN0ID0gdHlwZTJsaXN0KGFmLCB0eXBlKTsKKwlpZiAoIWxpc3QpCisJCXJldHVybiBOVUxMOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmeHRbYWZdLm11dGV4KSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKwkKKwlyZXR1cm4geHRfZ2V0X2lkeChsaXN0LCBzZXEsICpwb3MpOworfQorCitzdGF0aWMgdm9pZCAqeHRfdGd0X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IHNlcS0+cHJpdmF0ZTsKKwl1X2ludDE2X3QgYWYgPSAodW5zaWduZWQgbG9uZylwZGUtPmRhdGEgJiAweGZmZmY7CisJdV9pbnQxNl90IHR5cGUgPSAodW5zaWduZWQgbG9uZylwZGUtPmRhdGEgPj4gMTY7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKworCWlmIChhZiA+PSBOUFJPVE8pCisJCXJldHVybiBOVUxMOworCQorCWxpc3QgPSB0eXBlMmxpc3QoYWYsIHR5cGUpOworCWlmICghbGlzdCkKKwkJcmV0dXJuIE5VTEw7CisKKwkoKnBvcykrKzsKKwlyZXR1cm4geHRfZ2V0X2lkeChsaXN0LCBzZXEsICpwb3MpOworfQorCitzdGF0aWMgdm9pZCB4dF90Z3Rfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGUgPSBzZXEtPnByaXZhdGU7CisJdV9pbnQxNl90IGFmID0gKHVuc2lnbmVkIGxvbmcpcGRlLT5kYXRhICYgMHhmZmZmOworCisJdXAoJnh0W2FmXS5tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgeHRfbmFtZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwljaGFyICpuYW1lID0gKGNoYXIgKil2ICsgc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpOworCisJaWYgKHN0cmxlbihuYW1lKSkKKwkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiJXNcbiIsIG5hbWUpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgeHRfdGd0X3NlcV9vcHMgPSB7CisJLnN0YXJ0CT0geHRfdGd0X3NlcV9zdGFydCwKKwkubmV4dAk9IHh0X3RndF9zZXFfbmV4dCwKKwkuc3RvcAk9IHh0X3RndF9zZXFfc3RvcCwKKwkuc2hvdwk9IHh0X25hbWVfc2VxX3Nob3csCit9OworCitzdGF0aWMgaW50IHh0X3RndF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfb3BlbihmaWxlLCAmeHRfdGd0X3NlcV9vcHMpOworCWlmICghcmV0KSB7CisJCXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZSA9IFBERShpbm9kZSk7CisKKwkJc2VxLT5wcml2YXRlID0gcGRlOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHh0X2ZpbGVfb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkub3BlbgkgPSB4dF90Z3Rfb3BlbiwKKwkucmVhZAkgPSBzZXFfcmVhZCwKKwkubGxzZWVrCSA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAorfTsKKworI2RlZmluZSBGT1JNQVRfVEFCTEVTCSJfdGFibGVzX25hbWVzIgorI2RlZmluZQlGT1JNQVRfTUFUQ0hFUwkiX3RhYmxlc19tYXRjaGVzIgorI2RlZmluZSBGT1JNQVRfVEFSR0VUUyAJIl90YWJsZXNfdGFyZ2V0cyIKKworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK2ludCB4dF9wcm90b19pbml0KGludCBhZikKK3sKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWNoYXIgYnVmW1hUX0ZVTkNUSU9OX01BWE5BTUVMRU5dOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKKyNlbmRpZgorCisJaWYgKGFmID49IE5QUk9UTykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX1RBQkxFUywgc2l6ZW9mKGJ1ZikpOworCXByb2MgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZShidWYsIDA0NDAsICZ4dF9maWxlX29wcyk7CisJaWYgKCFwcm9jKQorCQlnb3RvIG91dDsKKwlwcm9jLT5kYXRhID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBhZiB8IChUQUJMRSA8PCAxNikpOworCisKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjYXQoYnVmLCBGT1JNQVRfTUFUQ0hFUywgc2l6ZW9mKGJ1ZikpOworCXByb2MgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZShidWYsIDA0NDAsICZ4dF9maWxlX29wcyk7CisJaWYgKCFwcm9jKQorCQlnb3RvIG91dF9yZW1vdmVfdGFibGVzOworCXByb2MtPmRhdGEgPSAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGFmIHwgKE1BVENIIDw8IDE2KSk7CisKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjYXQoYnVmLCBGT1JNQVRfVEFSR0VUUywgc2l6ZW9mKGJ1ZikpOworCXByb2MgPSBwcm9jX25ldF9mb3BzX2NyZWF0ZShidWYsIDA0NDAsICZ4dF9maWxlX29wcyk7CisJaWYgKCFwcm9jKQorCQlnb3RvIG91dF9yZW1vdmVfbWF0Y2hlczsKKwlwcm9jLT5kYXRhID0gKHZvaWQgKikgKCh1bnNpZ25lZCBsb25nKSBhZiB8IChUQVJHRVQgPDwgMTYpKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworb3V0X3JlbW92ZV9tYXRjaGVzOgorCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNhdChidWYsIEZPUk1BVF9NQVRDSEVTLCBzaXplb2YoYnVmKSk7CisJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CisKK291dF9yZW1vdmVfdGFibGVzOgorCXN0cmxjcHkoYnVmLCB4dF9wcm90b19wcmVmaXhbYWZdLCBzaXplb2YoYnVmKSk7CisJc3RybGNhdChidWYsIEZPUk1BVF9UQUJMRVMsIHNpemVvZihidWYpKTsKKwlwcm9jX25ldF9yZW1vdmUoYnVmKTsKK291dDoKKwlyZXR1cm4gLTE7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X3Byb3RvX2luaXQpOworCit2b2lkIHh0X3Byb3RvX2ZpbmkoaW50IGFmKQoreworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisJY2hhciBidWZbWFRfRlVOQ1RJT05fTUFYTkFNRUxFTl07CisKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjYXQoYnVmLCBGT1JNQVRfVEFCTEVTLCBzaXplb2YoYnVmKSk7CisJcHJvY19uZXRfcmVtb3ZlKGJ1Zik7CisKKwlzdHJsY3B5KGJ1ZiwgeHRfcHJvdG9fcHJlZml4W2FmXSwgc2l6ZW9mKGJ1ZikpOworCXN0cmxjYXQoYnVmLCBGT1JNQVRfVEFSR0VUUywgc2l6ZW9mKGJ1ZikpOworCXByb2NfbmV0X3JlbW92ZShidWYpOworCisJc3RybGNweShidWYsIHh0X3Byb3RvX3ByZWZpeFthZl0sIHNpemVvZihidWYpKTsKKwlzdHJsY2F0KGJ1ZiwgRk9STUFUX01BVENIRVMsIHNpemVvZihidWYpKTsKKwlwcm9jX25ldF9yZW1vdmUoYnVmKTsKKyNlbmRpZiAvKkNPTkZJR19QUk9DX0ZTKi8KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHh0X3Byb3RvX2ZpbmkpOworCisKK3N0YXRpYyBpbnQgX19pbml0IHh0X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCXh0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHh0X2FmKSAqIE5QUk9UTywgR0ZQX0tFUk5FTCk7CisJaWYgKCF4dCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgTlBST1RPOyBpKyspIHsKKwkJaW5pdF9NVVRFWCgmeHRbaV0ubXV0ZXgpOworCQlJTklUX0xJU1RfSEVBRCgmeHRbaV0udGFyZ2V0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJnh0W2ldLm1hdGNoKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnh0W2ldLnRhYmxlcyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeHRfZmluaSh2b2lkKQoreworCWtmcmVlKHh0KTsKK30KKworbW9kdWxlX2luaXQoeHRfaW5pdCk7Cittb2R1bGVfZXhpdCh4dF9maW5pKTsKKwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTEFTU0lGWS5jIGIvbmV0L25ldGZpbHRlci94dF9DTEFTU0lGWS5jCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xBU1NJRlkuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9DTEFTU0lGWS5jCmluZGV4IGRhYjc4ZDguLjc4ZWUyNjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xBU1NJRlkuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X0NMQVNTSUZZLmMKQEAgLTE1LDEyICsxNSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfQ0xBU1NJRlkuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfQ0xBU1NJRlkuaD4KIAogTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIHFkaXNjIGNsYXNzaWZpY2F0aW9uIHRhcmdldCBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X0NMQVNTSUZZIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCkBAIC0zMCwyNSArMzEsMjUgQEAKICAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKICAgICAgICB2b2lkICp1c2VyaW5mbykKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2NsYXNzaWZ5X3RhcmdldF9pbmZvICpjbGluZm8gPSB0YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8gKmNsaW5mbyA9IHRhcmdpbmZvOwogCi0JaWYoKCpwc2tiKS0+cHJpb3JpdHkgIT0gY2xpbmZvLT5wcmlvcml0eSkgCisJaWYgKCgqcHNrYiktPnByaW9yaXR5ICE9IGNsaW5mby0+cHJpb3JpdHkpCiAJCSgqcHNrYiktPnByaW9yaXR5ID0gY2xpbmZvLT5wcmlvcml0eTsKIAotCXJldHVybiBJUFRfQ09OVElOVUU7CisJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKyAgICAgICAgICAgY29uc3Qgdm9pZCAqZSwKICAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0JaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY2xhc3NpZnlfdGFyZ2V0X2luZm8pKSl7CisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2NsYXNzaWZ5X3RhcmdldF9pbmZvKSkpewogCQlwcmludGsoS0VSTl9FUlIgIkNMQVNTSUZZOiBpbnZhbGlkIHNpemUgKCV1ICE9ICVadSkuXG4iLAogCQkgICAgICAgdGFyZ2luZm9zaXplLAotCQkgICAgICAgSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X2NsYXNzaWZ5X3RhcmdldF9pbmZvKSkpOworCQkgICAgICAgWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jbGFzc2lmeV90YXJnZXRfaW5mbykpKTsKIAkJcmV0dXJuIDA7CiAJfQogCQpAQCAtNjksMjEgKzcwLDM5IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfY2xhc3NpZnlfcmVnID0geyAKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGNsYXNzaWZ5X3JlZyA9IHsgCisJLm5hbWUgCQk9ICJDTEFTU0lGWSIsIAorCS50YXJnZXQgCT0gdGFyZ2V0LAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKKwkubWUgCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGNsYXNzaWZ5Nl9yZWcgPSB7IAogCS5uYW1lIAkJPSAiQ0xBU1NJRlkiLCAKIAkudGFyZ2V0IAk9IHRhcmdldCwKIAkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCiAJLm1lIAkJPSBUSElTX01PRFVMRSwKIH07CiAKKwogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfY2xhc3NpZnlfcmVnKTsKKwlpbnQgcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZjbGFzc2lmeV9yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZjbGFzc2lmeTZfcmVnKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmY2xhc3NpZnlfcmVnKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfY2xhc3NpZnlfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmY2xhc3NpZnlfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmNsYXNzaWZ5Nl9yZWcpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ09OTk1BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYwpzaW1pbGFyaXR5IGluZGV4IDczJQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NPTk5NQVJLLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfQ09OTk1BUksuYwppbmRleCA4YWNhYzVhLi4yMjUwNmUzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NPTk5NQVJLLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9DT05OTUFSSy5jCkBAIC0yNiw5ICsyNiwxMCBAQAogTU9EVUxFX0FVVEhPUigiSGVucmlrIE5vcmRzdHJvbSA8aG5vQG1hcmFzeXRlbXMuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgQ09OTk1BUksgbWF0Y2hpbmcgbW9kdWxlIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9DT05OTUFSSyIpOwogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X0NPTk5NQVJLLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X0NPTk5NQVJLLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKQEAgLTM5LDcgKzQwLDcgQEAKICAgICAgICBjb25zdCB2b2lkICp0YXJnaW5mbywKICAgICAgICB2b2lkICp1c2VyaW5mbykKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2Nvbm5tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25ubWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKIAl1X2ludDMyX3QgZGlmZjsKIAl1X2ludDMyX3QgbmZtYXJrOwogCXVfaW50MzJfdCBuZXdtYXJrOwpAQCAtNDgsMTcgKzQ5LDE3IEBACiAKIAlpZiAoY3RtYXJrKSB7CiAJICAgIHN3aXRjaChtYXJraW5mby0+bW9kZSkgewotCSAgICBjYXNlIElQVF9DT05OTUFSS19TRVQ6CisJICAgIGNhc2UgWFRfQ09OTk1BUktfU0VUOgogCQluZXdtYXJrID0gKCpjdG1hcmsgJiB+bWFya2luZm8tPm1hc2spIHwgbWFya2luZm8tPm1hcms7CiAJCWlmIChuZXdtYXJrICE9ICpjdG1hcmspCiAJCSAgICAqY3RtYXJrID0gbmV3bWFyazsKIAkJYnJlYWs7Ci0JICAgIGNhc2UgSVBUX0NPTk5NQVJLX1NBVkU6CisJICAgIGNhc2UgWFRfQ09OTk1BUktfU0FWRToKIAkJbmV3bWFyayA9ICgqY3RtYXJrICYgfm1hcmtpbmZvLT5tYXNrKSB8ICgoKnBza2IpLT5uZm1hcmsgJiBtYXJraW5mby0+bWFzayk7CiAJCWlmICgqY3RtYXJrICE9IG5ld21hcmspCiAJCSAgICAqY3RtYXJrID0gbmV3bWFyazsKIAkJYnJlYWs7Ci0JICAgIGNhc2UgSVBUX0NPTk5NQVJLX1JFU1RPUkU6CisJICAgIGNhc2UgWFRfQ09OTk1BUktfUkVTVE9SRToKIAkJbmZtYXJrID0gKCpwc2tiKS0+bmZtYXJrOwogCQlkaWZmID0gKCpjdG1hcmsgXiBuZm1hcmspICYgbWFya2luZm8tPm1hc2s7CiAJCWlmIChkaWZmICE9IDApCkBAIC02NywyNSArNjgsMjUgQEAKIAkgICAgfQogCX0KIAotCXJldHVybiBJUFRfQ09OVElOVUU7CisJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2VudHJ5ICplLAorCSAgIGNvbnN0IHZvaWQgKmVudHJ5LAogCSAgIHZvaWQgKnRhcmdpbmZvLAogCSAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlzdHJ1Y3QgaXB0X2Nvbm5tYXJrX3RhcmdldF9pbmZvICptYXRjaGluZm8gPSB0YXJnaW5mbzsKLQlpZiAodGFyZ2luZm9zaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jb25ubWFya190YXJnZXRfaW5mbykpKSB7CisJc3RydWN0IHh0X2Nvbm5tYXJrX3RhcmdldF9pbmZvICptYXRjaGluZm8gPSB0YXJnaW5mbzsKKwlpZiAodGFyZ2luZm9zaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8pKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJDT05OTUFSSzogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKIAkJICAgICAgIHRhcmdpbmZvc2l6ZSwKLQkJICAgICAgIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jb25ubWFya190YXJnZXRfaW5mbykpKTsKKwkJICAgICAgIFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY29ubm1hcmtfdGFyZ2V0X2luZm8pKSk7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChtYXRjaGluZm8tPm1vZGUgPT0gSVBUX0NPTk5NQVJLX1JFU1RPUkUpIHsKKwlpZiAobWF0Y2hpbmZvLT5tb2RlID09IFhUX0NPTk5NQVJLX1JFU1RPUkUpIHsKIAkgICAgaWYgKHN0cmNtcCh0YWJsZW5hbWUsICJtYW5nbGUiKSAhPSAwKSB7CiAJCSAgICBwcmludGsoS0VSTl9XQVJOSU5HICJDT05OTUFSSzogcmVzdG9yZSBjYW4gb25seSBiZSBjYWxsZWQgZnJvbSBcIm1hbmdsZVwiIHRhYmxlLCBub3QgXCIlc1wiXG4iLCB0YWJsZW5hbWUpOwogCQkgICAgcmV0dXJuIDA7CkBAIC0xMDAsNyArMTAxLDEzIEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfY29ubm1hcmtfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgY29ubm1hcmtfcmVnID0geworCS5uYW1lID0gIkNPTk5NQVJLIiwKKwkudGFyZ2V0ID0gJnRhcmdldCwKKwkuY2hlY2tlbnRyeSA9ICZjaGVja2VudHJ5LAorCS5tZSA9IFRISVNfTU9EVUxFCit9Oworc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgY29ubm1hcms2X3JlZyA9IHsKIAkubmFtZSA9ICJDT05OTUFSSyIsCiAJLnRhcmdldCA9ICZ0YXJnZXQsCiAJLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwKQEAgLTEwOSwxMyArMTE2LDI1IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQluZWVkX2lwX2Nvbm50cmFjaygpOwotCXJldHVybiBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfY29ubm1hcmtfcmVnKTsKKwlpbnQgcmV0OworCisJbmVlZF9jb25udHJhY2soKTsKKworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmY29ubm1hcmtfcmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmY29ubm1hcms2X3JlZyk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmNvbm5tYXJrX3JlZyk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX3RhcmdldCgmaXB0X2Nvbm5tYXJrX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmNvbm5tYXJrX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZjb25ubWFyazZfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BUksuYyBiL25ldC9uZXRmaWx0ZXIveHRfTUFSSy5jCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFSSy5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X01BUksuYwppbmRleCA1MmI0ZjJjLi4wYzExZWU5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BUksuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X01BUksuYwpAQCAtMTIsMTIgKzEyLDE0IEBACiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9NQVJLLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X01BUksuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWFyYyBCb3VjaGVyIDxtYXJjQG1ic2kuY2E+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIE1BUksgbW9kaWZpY2F0aW9uIG1vZHVsZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcFs2XXRhYmxlcyBNQVJLIG1vZGlmaWNhdGlvbiBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X01BUksiKTsKK01PRFVMRV9BTElBUygiaXA2dF9NQVJLIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHRhcmdldF92MChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCkBAIC0yNywxMiArMjksMTIgQEAKIAkgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAogCSAgdm9pZCAqdXNlcmluZm8pCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvICptYXJraW5mbyA9IHRhcmdpbmZvOwogCiAJaWYoKCpwc2tiKS0+bmZtYXJrICE9IG1hcmtpbmZvLT5tYXJrKQogCQkoKnBza2IpLT5uZm1hcmsgPSBtYXJraW5mby0+bWFyazsKIAotCXJldHVybiBJUFRfQ09OVElOVUU7CisJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC00MywxOSArNDUsMTkgQEAKIAkgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAogCSAgdm9pZCAqdXNlcmluZm8pCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxICptYXJraW5mbyA9IHRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvX3YxICptYXJraW5mbyA9IHRhcmdpbmZvOwogCWludCBtYXJrID0gMDsKIAogCXN3aXRjaCAobWFya2luZm8tPm1vZGUpIHsKLQljYXNlIElQVF9NQVJLX1NFVDoKKwljYXNlIFhUX01BUktfU0VUOgogCQltYXJrID0gbWFya2luZm8tPm1hcms7CiAJCWJyZWFrOwogCQkKLQljYXNlIElQVF9NQVJLX0FORDoKKwljYXNlIFhUX01BUktfQU5EOgogCQltYXJrID0gKCpwc2tiKS0+bmZtYXJrICYgbWFya2luZm8tPm1hcms7CiAJCWJyZWFrOwogCQkKLQljYXNlIElQVF9NQVJLX09SOgorCWNhc2UgWFRfTUFSS19PUjoKIAkJbWFyayA9ICgqcHNrYiktPm5mbWFyayB8IG1hcmtpbmZvLT5tYXJrOwogCQlicmVhazsKIAl9CkBAIC02MywyMyArNjUsMjMgQEAKIAlpZigoKnBza2IpLT5uZm1hcmsgIT0gbWFyaykKIAkJKCpwc2tiKS0+bmZtYXJrID0gbWFyazsKIAotCXJldHVybiBJUFRfQ09OVElOVUU7CisJcmV0dXJuIFhUX0NPTlRJTlVFOwogfQogCiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnlfdjAoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfZW50cnkgKmUsCisJICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAJICAgICAgdm9pZCAqdGFyZ2luZm8sCiAJICAgICAgdW5zaWduZWQgaW50IHRhcmdpbmZvc2l6ZSwKIAkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCXN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKKwlzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mbyAqbWFya2luZm8gPSB0YXJnaW5mbzsKIAotCWlmICh0YXJnaW5mb3NpemUgIT0gSVBUX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXB0X21hcmtfdGFyZ2V0X2luZm8pKSkgeworCWlmICh0YXJnaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvKSkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKIAkJICAgICAgIHRhcmdpbmZvc2l6ZSwKLQkJICAgICAgIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvKSkpOworCQkgICAgICAgWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvKSkpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTk4LDE3ICsxMDAsMTcgQEAKIAogc3RhdGljIGludAogY2hlY2tlbnRyeV92MShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICAgICBjb25zdCB2b2lkICplbnRyeSwKIAkgICAgICB2b2lkICp0YXJnaW5mbywKIAkgICAgICB1bnNpZ25lZCBpbnQgdGFyZ2luZm9zaXplLAogCSAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0Jc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxICptYXJraW5mbyA9IHRhcmdpbmZvOworCXN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvX3YxICptYXJraW5mbyA9IHRhcmdpbmZvOwogCi0JaWYgKHRhcmdpbmZvc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbWFya190YXJnZXRfaW5mb192MSkpKXsKKwlpZiAodGFyZ2luZm9zaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfbWFya190YXJnZXRfaW5mb192MSkpKXsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUFSSzogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKIAkJICAgICAgIHRhcmdpbmZvc2l6ZSwKLQkJICAgICAgIElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYXJrX3RhcmdldF9pbmZvX3YxKSkpOworCQkgICAgICAgWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9tYXJrX3RhcmdldF9pbmZvX3YxKSkpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTExNyw5ICsxMTksOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAobWFya2luZm8tPm1vZGUgIT0gSVBUX01BUktfU0VUCi0JICAgICYmIG1hcmtpbmZvLT5tb2RlICE9IElQVF9NQVJLX0FORAotCSAgICAmJiBtYXJraW5mby0+bW9kZSAhPSBJUFRfTUFSS19PUikgeworCWlmIChtYXJraW5mby0+bW9kZSAhPSBYVF9NQVJLX1NFVAorCSAgICAmJiBtYXJraW5mby0+bW9kZSAhPSBYVF9NQVJLX0FORAorCSAgICAmJiBtYXJraW5mby0+bW9kZSAhPSBYVF9NQVJLX09SKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1BUks6IHVua25vd24gbW9kZSAldVxuIiwKIAkJICAgICAgIG1hcmtpbmZvLT5tb2RlKTsKIAkJcmV0dXJuIDA7CkBAIC0xMzMsNyArMTM1LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9tYXJrX3JlZ192MCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwdF9tYXJrX3JlZ192MCA9IHsKIAkubmFtZQkJPSAiTUFSSyIsCiAJLnRhcmdldAkJPSB0YXJnZXRfdjAsCiAJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5X3YwLApAQCAtMTQxLDcgKzE0Myw3IEBACiAJLnJldmlzaW9uCT0gMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXB0X3RhcmdldCBpcHRfbWFya19yZWdfdjEgPSB7CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfbWFya19yZWdfdjEgPSB7CiAJLm5hbWUJCT0gIk1BUksiLAogCS50YXJnZXQJCT0gdGFyZ2V0X3YxLAogCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeV92MSwKQEAgLTE0OSwyMyArMTUxLDQwIEBACiAJLnJldmlzaW9uCT0gMSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwNnRfbWFya19yZWdfdjAgPSB7CisJLm5hbWUJCT0gIk1BUksiLAorCS50YXJnZXQJCT0gdGFyZ2V0X3YwLAorCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeV92MCwKKwkubWUJCT0gVEhJU19NT0RVTEUsCisJLnJldmlzaW9uCT0gMCwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gaXB0X3JlZ2lzdGVyX3RhcmdldCgmaXB0X21hcmtfcmVnX3YwKTsKLQlpZiAoIWVycikgewotCQllcnIgPSBpcHRfcmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbWFya19yZWdfdjEpOwotCQlpZiAoZXJyKQotCQkJaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbWFya19yZWdfdjApOworCWVyciA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X21hcmtfcmVnX3YwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfbWFya19yZWdfdjEpOworCWlmIChlcnIpCisJCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfbWFya19yZWdfdjApOworCisJZXJyID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmaXA2dF9tYXJrX3JlZ192MCk7CisJaWYgKGVycikgeworCQl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X21hcmtfcmVnX3YwKTsKKwkJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9tYXJrX3JlZ192MSk7CiAJfQorCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9tYXJrX3JlZ192MCk7Ci0JaXB0X3VucmVnaXN0ZXJfdGFyZ2V0KCZpcHRfbWFya19yZWdfdjEpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfbWFya19yZWdfdjApOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZpcHRfbWFya19yZWdfdjEpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmaXA2dF9tYXJrX3JlZ192MCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X05GUVVFVUUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjc2YjZmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIGlwdGFibGVzIG1vZHVsZSBmb3IgdXNpbmcgbmV3IG5ldGZpbHRlciBuZXRsaW5rIHF1ZXVlCisgKgorICogKEMpIDIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIAorICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKiAKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X05GUVVFVUUuaD4KKworTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIltpcCxpcDYsYXJwXV90YWJsZXMgTkZRVUVVRSB0YXJnZXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X05GUVVFVUUiKTsKK01PRFVMRV9BTElBUygiaXA2dF9ORlFVRVVFIik7CitNT0RVTEVfQUxJQVMoImFycHRfTkZRVUVVRSIpOworCitzdGF0aWMgdW5zaWduZWQgaW50Cit0YXJnZXQoc3RydWN0IHNrX2J1ZmYgKipwc2tiLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgIHVuc2lnbmVkIGludCBob29rbnVtLAorICAgICAgIGNvbnN0IHZvaWQgKnRhcmdpbmZvLAorICAgICAgIHZvaWQgKnVzZXJpbmZvKQoreworCWNvbnN0IHN0cnVjdCB4dF9ORlFfaW5mbyAqdGluZm8gPSB0YXJnaW5mbzsKKworCXJldHVybiBORl9RVUVVRV9OUih0aW5mby0+cXVldWVudW0pOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICBjb25zdCB2b2lkICplbnRyeSwKKyAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJaWYgKHRhcmdpbmZvc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X05GUV9pbmZvKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZRVUVVRTogdGFyZ2luZm9zaXplICV1ICE9ICVadVxuIiwKKwkJICAgICAgIHRhcmdpbmZvc2l6ZSwKKwkJICAgICAgIFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfTkZRX2luZm8pKSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfTkZRX3JlZyA9IHsKKwkubmFtZQkJPSAiTkZRVUVVRSIsCisJLnRhcmdldAkJPSB0YXJnZXQsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGlwNnRfTkZRX3JlZyA9IHsKKwkubmFtZQkJPSAiTkZRVUVVRSIsCisJLnRhcmdldAkJPSB0YXJnZXQsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfdGFyZ2V0IGFycHRfTkZRX3JlZyA9IHsKKwkubmFtZQkJPSAiTkZRVUVVRSIsCisJLnRhcmdldAkJPSB0YXJnZXQsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmaXB0X05GUV9yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmaXA2dF9ORlFfcmVnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9pcDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoTkZfQVJQLCAmYXJwdF9ORlFfcmVnKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9pcDY7CisKKwlyZXR1cm4gcmV0Oworb3V0X2lwNjoKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfTkZRX3JlZyk7CitvdXRfaXA6CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9ORlFfcmVnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoTkZfQVJQLCAmYXJwdF9ORlFfcmVnKTsKKwl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVUNiwgJmlwNnRfTkZRX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJmlwdF9ORlFfcmVnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTk9UUkFDSy5jIGIvbmV0L25ldGZpbHRlci94dF9OT1RSQUNLLmMKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9OT1RSQUNLLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jCmluZGV4IGUzYzY5ZDAuLjI0ZDQ3N2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTk9UUkFDSy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfTk9UUkFDSy5jCkBAIC00LDkgKzQsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KIAotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgogCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9OT1RSQUNLIik7CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHRhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IsCiAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLApAQCAtMTcsNyArMjAsNyBAQAogewogCS8qIFByZXZpb3VzbHkgc2VlbiAobG9vcGJhY2spPyBJZ25vcmUuICovCiAJaWYgKCgqcHNrYiktPm5mY3QgIT0gTlVMTCkKLQkJcmV0dXJuIElQVF9DT05USU5VRTsKKwkJcmV0dXJuIFhUX0NPTlRJTlVFOwogCiAJLyogQXR0YWNoIGZha2UgY29ubnRyYWNrIGVudHJ5LiAKIAkgICBJZiB0aGVyZSBpcyBhIHJlYWwgY3QgZW50cnkgY29ycmVzcG9uZGlnIHRvIHRoaXMgcGFja2V0LCAKQEAgLTI3LDEyICszMCwxMiBAQAogCSgqcHNrYiktPm5mY3RpbmZvID0gSVBfQ1RfTkVXOwogCW5mX2Nvbm50cmFja19nZXQoKCpwc2tiKS0+bmZjdCk7CiAKLQlyZXR1cm4gSVBUX0NPTlRJTlVFOworCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAogc3RhdGljIGludAogY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JICAgY29uc3Qgc3RydWN0IGlwdF9lbnRyeSAqZSwKKwkgICBjb25zdCB2b2lkICplbnRyeSwKICAgICAgICAgICAgdm9pZCAqdGFyZ2luZm8sCiAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnaW5mb3NpemUsCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCkBAIC01MSwyNiArNTQsMzkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfdGFyZ2V0IGlwdF9ub3RyYWNrX3JlZyA9IHsgCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBub3RyYWNrX3JlZyA9IHsgCiAJLm5hbWUgPSAiTk9UUkFDSyIsIAogCS50YXJnZXQgPSB0YXJnZXQsIAogCS5jaGVja2VudHJ5ID0gY2hlY2tlbnRyeSwKLQkubWUgPSBUSElTX01PRFVMRSAKKwkubWUgPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBub3RyYWNrNl9yZWcgPSB7IAorCS5uYW1lID0gIk5PVFJBQ0siLCAKKwkudGFyZ2V0ID0gdGFyZ2V0LCAKKwkuY2hlY2tlbnRyeSA9IGNoZWNrZW50cnksCisJLm1lID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JaWYgKGlwdF9yZWdpc3Rlcl90YXJnZXQoJmlwdF9ub3RyYWNrX3JlZykpCi0JCXJldHVybiAtRUlOVkFMOworCWludCByZXQ7CiAKLQlyZXR1cm4gMDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVCwgJm5vdHJhY2tfcmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQ2LCAmbm90cmFjazZfcmVnKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX3RhcmdldChBRl9JTkVULCAmbm90cmFja19yZWcpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl90YXJnZXQoJmlwdF9ub3RyYWNrX3JlZyk7CisJeHRfdW5yZWdpc3Rlcl90YXJnZXQoQUZfSU5FVDYsICZub3RyYWNrNl9yZWcpOworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0KEFGX0lORVQsICZub3RyYWNrX3JlZyk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwogbW9kdWxlX2V4aXQoZmluaSk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2NvbW1lbnQuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29tbWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYTZmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2NvbW1lbnQuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogSW1wbGVtZW50cyBhIGR1bW15IG1hdGNoIHRvIGFsbG93IGF0dGFjaGluZyBjb21tZW50cyB0byBydWxlcworICoKKyAqIDIwMDMtMDUtMTMgQnJhZCBGaXNoZXIgKGJyYWRAaW5mby1saW5rLm5ldCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2NvbW1lbnQuaD4KKworTU9EVUxFX0FVVEhPUigiQnJhZCBGaXNoZXIgPGJyYWRAaW5mby1saW5rLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgY29tbWVudCBtYXRjaCBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X2NvbW1lbnQiKTsKK01PRFVMRV9BTElBUygiaXA2dF9jb21tZW50Iik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b29mZiwKKyAgICAgIGludCAqaG90ZHJvcCkKK3sKKwkvKiBXZSBhbHdheXMgbWF0Y2ggKi8KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisgICAgICAgICAgIGNvbnN0IHZvaWQgKmlwLAorICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCisgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCisgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJLyogQ2hlY2sgdGhlIHNpemUgKi8KKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY29tbWVudF9pbmZvKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbW1lbnRfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImNvbW1lbnQiLAorCS5tYXRjaAkJPSBtYXRjaCwKKwkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFCit9OworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbW1lbnQ2X21hdGNoID0geworCS5uYW1lCQk9ICJjb21tZW50IiwKKwkubWF0Y2gJCT0gbWF0Y2gsCisJLmNoZWNrZW50cnkJPSBjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmY29tbWVudF9tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmY29tbWVudDZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbW1lbnRfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZjb21tZW50X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmY29tbWVudDZfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25uYnl0ZXMuYyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20gbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25uYnl0ZXMuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYwppbmRleCBkNjhhMDQ4Yi4uMTUwZDJhNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25uYnl0ZXMuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jCkBAIC02LDEzICs2LDE1IEBACiAgKiAJLSBhZGQgZnVuY3Rpb25hbGl0eSB0byBtYXRjaCBudW1iZXIgb2YgcGFja2V0cwogICogCS0gYWRkIGZ1bmN0aW9uYWxpdHkgdG8gbWF0Y2ggYXZlcmFnZSBwYWNrZXQgc2l6ZQogICogCS0gYWRkIHN1cHBvcnQgdG8gbWF0Y2ggZGlyZWN0aW9ucyBzZXBlcmF0ZWx5CisgKiAyMDA1LTEwLTE2IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPgorICogCS0gUG9ydCB0byB4X3RhYmxlcwogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbXBhdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9jb25uYnl0ZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmg+CiAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CkBAIC0yMCw2ICsyMiw3IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWF0Y2ggZm9yIG1hdGNoaW5nIG51bWJlciBvZiBwa3RzL2J5dGVzIHBlciBjb25uZWN0aW9uIik7CitNT0RVTEVfQUxJQVMoImlwdF9jb25uYnl0ZXMiKTsKIAogLyogNjRiaXQgZGl2aXNvciwgZGl2aWRlbmQgYW5kIHJlc3VsdC4gZHluYW1pYyBwcmVjaXNpb24gKi8KIHN0YXRpYyB1X2ludDY0X3QgZGl2NjRfNjQodV9pbnQ2NF90IGRpdmlkZW5kLCB1X2ludDY0X3QgZGl2aXNvcikKQEAgLTQzLDkgKzQ2LDEwIEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotCWNvbnN0IHN0cnVjdCBpcHRfY29ubmJ5dGVzX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25uYnl0ZXNfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CiAJdV9pbnQ2NF90IHdoYXQgPSAwOwkvKiBpbml0aWFsaXplIHRvIG1ha2UgZ2NjIGhhcHB5ICovCiAJY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19jb3VudGVyICpjb3VudGVyczsKIApAQCAtNTMsNDUgKzU3LDQ1IEBACiAJCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLwogCiAJc3dpdGNoIChzaW5mby0+d2hhdCkgewotCWNhc2UgSVBUX0NPTk5CWVRFU19QS1RTOgorCWNhc2UgWFRfQ09OTkJZVEVTX1BLVFM6CiAJCXN3aXRjaCAoc2luZm8tPmRpcmVjdGlvbikgewotCQljYXNlIElQVF9DT05OQllURVNfRElSX09SSUdJTkFMOgorCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6CiAJCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzOwogCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfUkVQTFk6CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKIAkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLnBhY2tldHM7CiAJCQlicmVhazsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9CT1RIOgorCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfQk9USDoKIAkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLnBhY2tldHM7CiAJCQl3aGF0ICs9IGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0czsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgSVBUX0NPTk5CWVRFU19CWVRFUzoKKwljYXNlIFhUX0NPTk5CWVRFU19CWVRFUzoKIAkJc3dpdGNoIChzaW5mby0+ZGlyZWN0aW9uKSB7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTDoKIAkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLmJ5dGVzOwogCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfUkVQTFk6CisJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKIAkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLmJ5dGVzOwogCQkJYnJlYWs7Ci0JCWNhc2UgSVBUX0NPTk5CWVRFU19ESVJfQk9USDoKKwkJY2FzZSBYVF9DT05OQllURVNfRElSX0JPVEg6CiAJCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlczsKIAkJCXdoYXQgKz0gY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5ieXRlczsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgSVBUX0NPTk5CWVRFU19BVkdQS1Q6CisJY2FzZSBYVF9DT05OQllURVNfQVZHUEtUOgogCQlzd2l0Y2ggKHNpbmZvLT5kaXJlY3Rpb24pIHsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTDoKKwkJY2FzZSBYVF9DT05OQllURVNfRElSX09SSUdJTkFMOgogCQkJd2hhdCA9IGRpdjY0XzY0KGNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXMsCiAJCQkJCWNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0ucGFja2V0cyk7CiAJCQlicmVhazsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKKwkJY2FzZSBYVF9DT05OQllURVNfRElSX1JFUExZOgogCQkJd2hhdCA9IGRpdjY0XzY0KGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXMsCiAJCQkJCWNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0cyk7CiAJCQlicmVhazsKLQkJY2FzZSBJUFRfQ09OTkJZVEVTX0RJUl9CT1RIOgorCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfQk9USDoKIAkJCXsKIAkJCQl1X2ludDY0X3QgYnl0ZXM7CiAJCQkJdV9pbnQ2NF90IHBrdHM7CkBAIC0xMTcsMzAgKzEyMSwzNiBAQAogfQogCiBzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgY29uc3Qgdm9pZCAqaXAsCiAJCSB2b2lkICptYXRjaGluZm8sCiAJCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2Nvbm5ieXRlc19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubmJ5dGVzX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOwogCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29ubmJ5dGVzX2luZm8pKSkKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY29ubmJ5dGVzX2luZm8pKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoc2luZm8tPndoYXQgIT0gSVBUX0NPTk5CWVRFU19QS1RTICYmCi0JICAgIHNpbmZvLT53aGF0ICE9IElQVF9DT05OQllURVNfQllURVMgJiYKLQkgICAgc2luZm8tPndoYXQgIT0gSVBUX0NPTk5CWVRFU19BVkdQS1QpCisJaWYgKHNpbmZvLT53aGF0ICE9IFhUX0NPTk5CWVRFU19QS1RTICYmCisJICAgIHNpbmZvLT53aGF0ICE9IFhUX0NPTk5CWVRFU19CWVRFUyAmJgorCSAgICBzaW5mby0+d2hhdCAhPSBYVF9DT05OQllURVNfQVZHUEtUKQogCQlyZXR1cm4gMDsKIAotCWlmIChzaW5mby0+ZGlyZWN0aW9uICE9IElQVF9DT05OQllURVNfRElSX09SSUdJTkFMICYmCi0JICAgIHNpbmZvLT5kaXJlY3Rpb24gIT0gSVBUX0NPTk5CWVRFU19ESVJfUkVQTFkgJiYKLQkgICAgc2luZm8tPmRpcmVjdGlvbiAhPSBJUFRfQ09OTkJZVEVTX0RJUl9CT1RIKQorCWlmIChzaW5mby0+ZGlyZWN0aW9uICE9IFhUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUwgJiYKKwkgICAgc2luZm8tPmRpcmVjdGlvbiAhPSBYVF9DT05OQllURVNfRElSX1JFUExZICYmCisJICAgIHNpbmZvLT5kaXJlY3Rpb24gIT0gWFRfQ09OTkJZVEVTX0RJUl9CT1RIKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBzdGF0ZV9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggY29ubmJ5dGVzX21hdGNoID0geworCS5uYW1lCQk9ICJjb25uYnl0ZXMiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBjb25uYnl0ZXM2X21hdGNoID0gewogCS5uYW1lCQk9ICJjb25uYnl0ZXMiLAogCS5tYXRjaAkJPSAmbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSAmY2hlY2ssCkBAIC0xNDksMTIgKzE1OSwyMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmc3RhdGVfbWF0Y2gpOworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5ieXRlc19tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmY29ubmJ5dGVzNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmY29ubmJ5dGVzX21hdGNoKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZzdGF0ZV9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmY29ubmJ5dGVzX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmY29ubmJ5dGVzNl9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25ubWFyay5jIGIvbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCnNpbWlsYXJpdHkgaW5kZXggNzAlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubm1hcmsuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9jb25ubWFyay5jCmluZGV4IDUzMDZlZjIuLmQwNmU5MjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubm1hcmsuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5tYXJrLmMKQEAgLTI1LDkgKzI1LDEwIEBACiBNT0RVTEVfQVVUSE9SKCJIZW5yaWsgTm9yZHN0cm9tIDxobm9AbWFyYXN5dGVtcy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBjb25ubWFyayBtYXRjaCBtb2R1bGUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X2Nvbm5tYXJrIik7CiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubm1hcmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfY29ubm1hcmsuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21wYXQuaD4KIAogc3RhdGljIGludApAQCAtMzYsOSArMzcsMTAgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9jb25ubWFya19pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25ubWFya19pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCXVfaW50MzJfdCBjdGluZm87CiAJY29uc3QgdV9pbnQzMl90ICpjdG1hcmsgPSBuZl9jdF9nZXRfbWFyayhza2IsICZjdGluZm8pOwogCWlmICghY3RtYXJrKQpAQCAtNDksMTQgKzUxLDE0IEBACiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCSAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCSAgIGNvbnN0IHZvaWQgKmlwLAogCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCiB7Ci0Jc3RydWN0IGlwdF9jb25ubWFya19pbmZvICpjbSA9IAotCQkJCShzdHJ1Y3QgaXB0X2Nvbm5tYXJrX2luZm8gKiltYXRjaGluZm87Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfY29ubm1hcmtfaW5mbykpKQorCXN0cnVjdCB4dF9jb25ubWFya19pbmZvICpjbSA9IAorCQkJCShzdHJ1Y3QgeHRfY29ubm1hcmtfaW5mbyAqKW1hdGNoaW5mbzsKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfY29ubm1hcmtfaW5mbykpKQogCQlyZXR1cm4gMDsKIAogCWlmIChjbS0+bWFyayA+IDB4ZmZmZmZmZmYgfHwgY20tPm1hc2sgPiAweGZmZmZmZmZmKSB7CkBAIC02NywyMSArNjksNDAgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggY29ubm1hcmtfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm5tYXJrX21hdGNoID0geworCS5uYW1lID0gImNvbm5tYXJrIiwKKwkubWF0Y2ggPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwKKwkubWUgPSBUSElTX01PRFVMRQorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggY29ubm1hcms2X21hdGNoID0gewogCS5uYW1lID0gImNvbm5tYXJrIiwKIAkubWF0Y2ggPSAmbWF0Y2gsCiAJLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwKIAkubWUgPSBUSElTX01PRFVMRQogfTsKIAorCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmY29ubm1hcmtfbWF0Y2gpOworCWludCByZXQ7CisKKwluZWVkX2Nvbm50cmFjaygpOworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5tYXJrX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZjb25ubWFyazZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm5tYXJrX21hdGNoKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZjb25ubWFya19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmNvbm5tYXJrNl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmY29ubm1hcmtfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubnRyYWNrLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCnNpbWlsYXJpdHkgaW5kZXggNjMlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfY29ubnRyYWNrLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMKaW5kZXggYzhkMTg3MC4uZmZkZWJjOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9jb25udHJhY2suYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCkBAIC0xOCwxMiArMTgsMTMgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogI2VuZGlmCiAKLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfY29ubnRyYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgY29ubmVjdGlvbiB0cmFja2luZyBtYXRjaCBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X2Nvbm50cmFjayIpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19JUF9ORl9DT05OVFJBQ0tfTU9EVUxFKQogCkBAIC0zMyw5ICszNCwxMCBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2Nvbm50cmFja19pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfY29ubnRyYWNrX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOwogCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXVuc2lnbmVkIGludCBzdGF0ZWJpdDsKQEAgLTQ1LDU4ICs0Nyw1OCBAQAogI2RlZmluZSBGV0lOVihib29sLGludmZsZykgKChib29sKSBeICEhKHNpbmZvLT5pbnZmbGFncyAmIGludmZsZykpCiAKIAlpZiAoY3QgPT0gJmlwX2Nvbm50cmFja191bnRyYWNrZWQpCi0JCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9VTlRSQUNLRUQ7CisJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRDsKIAllbHNlIGlmIChjdCkKLSAJCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9CSVQoY3RpbmZvKTsKKyAJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pOwogIAllbHNlCi0gCQlzdGF0ZWJpdCA9IElQVF9DT05OVFJBQ0tfU1RBVEVfSU5WQUxJRDsKKyAJCXN0YXRlYml0ID0gWFRfQ09OTlRSQUNLX1NUQVRFX0lOVkFMSUQ7CiAgCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19TVEFURSkgeworCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19TVEFURSkgewogCQlpZiAoY3QpIHsKIAkJCWlmKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMuaXAgIT0KIAkJCSAgICBjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwKQotCQkJCXN0YXRlYml0IHw9IElQVF9DT05OVFJBQ0tfU1RBVEVfU05BVDsKKwkJCQlzdGF0ZWJpdCB8PSBYVF9DT05OVFJBQ0tfU1RBVEVfU05BVDsKIAogCQkJaWYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5pcCAhPQogCQkJICAgIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMuaXApCi0JCQkJc3RhdGViaXQgfD0gSVBUX0NPTk5UUkFDS19TVEFURV9ETkFUOworCQkJCXN0YXRlYml0IHw9IFhUX0NPTk5UUkFDS19TVEFURV9ETkFUOwogCQl9CiAKLQkJaWYgKEZXSU5WKChzdGF0ZWJpdCAmIHNpbmZvLT5zdGF0ZW1hc2spID09IDAsIElQVF9DT05OVFJBQ0tfU1RBVEUpKQorCQlpZiAoRldJTlYoKHN0YXRlYml0ICYgc2luZm8tPnN0YXRlbWFzaykgPT0gMCwgWFRfQ09OTlRSQUNLX1NUQVRFKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUFJPVE8pIHsKLQkJaWYgKCFjdCB8fCBGV0lOVihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5wcm90b251bSwgSVBUX0NPTk5UUkFDS19QUk9UTykpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1BST1RPKSB7CisJCWlmICghY3QgfHwgRldJTlYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC5wcm90b251bSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QucHJvdG9udW0sIFhUX0NPTk5UUkFDS19QUk9UTykpCiAgICAgICAgICAgICAgICAgCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfT1JJR1NSQykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLnNyYy5pcCwgSVBUX0NPTk5UUkFDS19PUklHU1JDKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfT1JJR1NSQykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuc3JjLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX09SSUdJTkFMXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLnNyYy5pcCwgWFRfQ09OTlRSQUNLX09SSUdTUkMpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19PUklHRFNUKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LmlwLCBJUFRfQ09OTlRSQUNLX09SSUdEU1QpKQorCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19PUklHRFNUKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LmlwLCBYVF9DT05OVFJBQ0tfT1JJR0RTVCkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1JFUExTUkMpIHsKLQkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5zcmMuaXAsIElQVF9DT05OVFJBQ0tfUkVQTFNSQykpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1JFUExTUkMpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy5pcCZzaW5mby0+c2lwbXNrW0lQX0NUX0RJUl9SRVBMWV0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX1JFUExZXS5zcmMuaXAsIFhUX0NPTk5UUkFDS19SRVBMU1JDKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUkVQTERTVCkgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLmRzdC5pcCwgSVBUX0NPTk5UUkFDS19SRVBMRFNUKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTERTVCkgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LmlwJnNpbmZvLT5kaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLmRzdC5pcCwgWFRfQ09OTlRSQUNLX1JFUExEU1QpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19TVEFUVVMpIHsKLQkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnN0YXR1cyAmIHNpbmZvLT5zdGF0dXNtYXNrKSA9PSAwLCBJUFRfQ09OTlRSQUNLX1NUQVRVUykpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1NUQVRVUykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+c3RhdHVzICYgc2luZm8tPnN0YXR1c21hc2spID09IDAsIFhUX0NPTk5UUkFDS19TVEFUVVMpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19FWFBJUkVTKSB7CisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX0VYUElSRVMpIHsKIAkJdW5zaWduZWQgbG9uZyBleHBpcmVzOwogCiAJCWlmKCFjdCkKQEAgLTEwNCw3ICsxMDYsNyBAQAogCiAJCWV4cGlyZXMgPSB0aW1lcl9wZW5kaW5nKCZjdC0+dGltZW91dCkgPyAoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMDsKIAotCQlpZiAoRldJTlYoIShleHBpcmVzID49IHNpbmZvLT5leHBpcmVzX21pbiAmJiBleHBpcmVzIDw9IHNpbmZvLT5leHBpcmVzX21heCksIElQVF9DT05OVFJBQ0tfRVhQSVJFUykpCisJCWlmIChGV0lOVighKGV4cGlyZXMgPj0gc2luZm8tPmV4cGlyZXNfbWluICYmIGV4cGlyZXMgPD0gc2luZm8tPmV4cGlyZXNfbWF4KSwgWFRfQ09OTlRSQUNLX0VYUElSRVMpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMTgsOSArMTIwLDEwIEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotCWNvbnN0IHN0cnVjdCBpcHRfY29ubnRyYWNrX2luZm8gKnNpbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9jb25udHJhY2tfaW5mbyAqc2luZm8gPSBtYXRjaGluZm87CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCXVuc2lnbmVkIGludCBzdGF0ZWJpdDsKQEAgLTEzMCw1OCArMTMzLDU4IEBACiAjZGVmaW5lIEZXSU5WKGJvb2wsaW52ZmxnKSAoKGJvb2wpIF4gISEoc2luZm8tPmludmZsYWdzICYgaW52ZmxnKSkKIAogCWlmIChjdCA9PSAmbmZfY29ubnRyYWNrX3VudHJhY2tlZCkKLQkJc3RhdGViaXQgPSBJUFRfQ09OTlRSQUNLX1NUQVRFX1VOVFJBQ0tFRDsKKwkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfVU5UUkFDS0VEOwogCWVsc2UgaWYgKGN0KQotIAkJc3RhdGViaXQgPSBJUFRfQ09OTlRSQUNLX1NUQVRFX0JJVChjdGluZm8pOworIAkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfQklUKGN0aW5mbyk7CiAgCWVsc2UKLSAJCXN0YXRlYml0ID0gSVBUX0NPTk5UUkFDS19TVEFURV9JTlZBTElEOworIAkJc3RhdGViaXQgPSBYVF9DT05OVFJBQ0tfU1RBVEVfSU5WQUxJRDsKICAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1NUQVRFKSB7CisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX1NUQVRFKSB7CiAJCWlmIChjdCkgewogCQkJaWYoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy51My5pcCAhPQogCQkJICAgIGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudTMuaXApCi0JCQkJc3RhdGViaXQgfD0gSVBUX0NPTk5UUkFDS19TVEFURV9TTkFUOworCQkJCXN0YXRlYml0IHw9IFhUX0NPTk5UUkFDS19TVEFURV9TTkFUOwogCiAJCQlpZihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnUzLmlwICE9CiAJCQkgICAgY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLnNyYy51My5pcCkKLQkJCQlzdGF0ZWJpdCB8PSBJUFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQ7CisJCQkJc3RhdGViaXQgfD0gWFRfQ09OTlRSQUNLX1NUQVRFX0ROQVQ7CiAJCX0KIAotCQlpZiAoRldJTlYoKHN0YXRlYml0ICYgc2luZm8tPnN0YXRlbWFzaykgPT0gMCwgSVBUX0NPTk5UUkFDS19TVEFURSkpCisJCWlmIChGV0lOVigoc3RhdGViaXQgJiBzaW5mby0+c3RhdGVtYXNrKSA9PSAwLCBYVF9DT05OVFJBQ0tfU1RBVEUpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19QUk9UTykgewotCQlpZiAoIWN0IHx8IEZXSU5WKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5kc3QucHJvdG9udW0gIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uZHN0LnByb3RvbnVtLCBJUFRfQ09OTlRSQUNLX1BST1RPKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUFJPVE8pIHsKKwkJaWYgKCFjdCB8fCBGV0lOVihjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUuZHN0LnByb3RvbnVtICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfT1JJR0lOQUxdLmRzdC5wcm90b251bSwgWFRfQ09OTlRSQUNLX1BST1RPKSkKICAgICAgICAgICAgICAgICAJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19PUklHU1JDKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudTMuaXAmc2luZm8tPnNpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uc3JjLmlwLCBJUFRfQ09OTlRSQUNLX09SSUdTUkMpKQorCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19PUklHU1JDKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX09SSUdJTkFMXS50dXBsZS5zcmMudTMuaXAmc2luZm8tPnNpcG1za1tJUF9DVF9ESVJfT1JJR0lOQUxdLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9PUklHSU5BTF0uc3JjLmlwLCBYVF9DT05OVFJBQ0tfT1JJR1NSQykpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX09SSUdEU1QpIHsKLQkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC51My5pcCZzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QuaXAsIElQVF9DT05OVFJBQ0tfT1JJR0RTVCkpCisJaWYoc2luZm8tPmZsYWdzICYgWFRfQ09OTlRSQUNLX09SSUdEU1QpIHsKKwkJaWYgKCFjdCB8fCBGV0lOVigoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLmRzdC51My5pcCZzaW5mby0+ZGlwbXNrW0lQX0NUX0RJUl9PUklHSU5BTF0uc19hZGRyKSAhPSBzaW5mby0+dHVwbGVbSVBfQ1RfRElSX09SSUdJTkFMXS5kc3QuaXAsIFhUX0NPTk5UUkFDS19PUklHRFNUKSkKIAkJCXJldHVybiAwOwogCX0KIAotCWlmKHNpbmZvLT5mbGFncyAmIElQVF9DT05OVFJBQ0tfUkVQTFNSQykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUzLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLnNyYy5pcCwgSVBUX0NPTk5UUkFDS19SRVBMU1JDKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfUkVQTFNSQykgeworCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUzLmlwJnNpbmZvLT5zaXBtc2tbSVBfQ1RfRElSX1JFUExZXS5zX2FkZHIpICE9IHNpbmZvLT50dXBsZVtJUF9DVF9ESVJfUkVQTFldLnNyYy5pcCwgWFRfQ09OTlRSQUNLX1JFUExTUkMpKQogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYoc2luZm8tPmZsYWdzICYgSVBUX0NPTk5UUkFDS19SRVBMRFNUKSB7Ci0JCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudTMuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfUkVQTFldLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9SRVBMWV0uZHN0LmlwLCBJUFRfQ09OTlRSQUNLX1JFUExEU1QpKQorCWlmKHNpbmZvLT5mbGFncyAmIFhUX0NPTk5UUkFDS19SRVBMRFNUKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5kc3QudTMuaXAmc2luZm8tPmRpcG1za1tJUF9DVF9ESVJfUkVQTFldLnNfYWRkcikgIT0gc2luZm8tPnR1cGxlW0lQX0NUX0RJUl9SRVBMWV0uZHN0LmlwLCBYVF9DT05OVFJBQ0tfUkVQTERTVCkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX1NUQVRVUykgewotCQlpZiAoIWN0IHx8IEZXSU5WKChjdC0+c3RhdHVzICYgc2luZm8tPnN0YXR1c21hc2spID09IDAsIElQVF9DT05OVFJBQ0tfU1RBVFVTKSkKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfU1RBVFVTKSB7CisJCWlmICghY3QgfHwgRldJTlYoKGN0LT5zdGF0dXMgJiBzaW5mby0+c3RhdHVzbWFzaykgPT0gMCwgWFRfQ09OTlRSQUNLX1NUQVRVUykpCiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZihzaW5mby0+ZmxhZ3MgJiBJUFRfQ09OTlRSQUNLX0VYUElSRVMpIHsKKwlpZihzaW5mby0+ZmxhZ3MgJiBYVF9DT05OVFJBQ0tfRVhQSVJFUykgewogCQl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CiAKIAkJaWYoIWN0KQpAQCAtMTg5LDcgKzE5Miw3IEBACiAKIAkJZXhwaXJlcyA9IHRpbWVyX3BlbmRpbmcoJmN0LT50aW1lb3V0KSA/IChjdC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykvSFogOiAwOwogCi0JCWlmIChGV0lOVighKGV4cGlyZXMgPj0gc2luZm8tPmV4cGlyZXNfbWluICYmIGV4cGlyZXMgPD0gc2luZm8tPmV4cGlyZXNfbWF4KSwgSVBUX0NPTk5UUkFDS19FWFBJUkVTKSkKKwkJaWYgKEZXSU5WKCEoZXhwaXJlcyA+PSBzaW5mby0+ZXhwaXJlc19taW4gJiYgZXhwaXJlcyA8PSBzaW5mby0+ZXhwaXJlc19tYXgpLCBYVF9DT05OVFJBQ0tfRVhQSVJFUykpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE5OSwxOCArMjAyLDE4IEBACiAjZW5kaWYgLyogQ09ORklHX05GX0lQX0NPTk5UUkFDSyAqLwogCiBzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkJIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgY29uc3Qgdm9pZCAqaXAsCiAJCSB2b2lkICptYXRjaGluZm8sCiAJCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9jb25udHJhY2tfaW5mbykpKQorCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9jb25udHJhY2tfaW5mbykpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBjb25udHJhY2tfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGNvbm50cmFja19tYXRjaCA9IHsKIAkubmFtZQkJPSAiY29ubnRyYWNrIiwKIAkubWF0Y2gJCT0gJm1hdGNoLAogCS5jaGVja2VudHJ5CT0gJmNoZWNrLApAQCAtMjE5LDEzICsyMjIsMTYgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCW5lZWRfaXBfY29ubnRyYWNrKCk7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmY29ubnRyYWNrX21hdGNoKTsKKwlpbnQgcmV0OworCW5lZWRfY29ubnRyYWNrKCk7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm50cmFja19tYXRjaCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZjb25udHJhY2tfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmNvbm50cmFja19tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9kY2NwLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2RjY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzlmNDJmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9kY2NwLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBpcHRhYmxlcyBtb2R1bGUgZm9yIERDQ1AgcHJvdG9jb2wgaGVhZGVyIG1hdGNoaW5nCisgKgorICogKEMpIDIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2NwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfZGNjcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWF0Y2ggZm9yIERDQ1AgcHJvdG9jb2wgcGFja2V0cyIpOworTU9EVUxFX0FMSUFTKCJpcHRfZGNjcCIpOworCisjZGVmaW5lIERDQ0hFQ0soY29uZCwgb3B0aW9uLCBmbGFnLCBpbnZmbGFnKSAoISgoZmxhZykgJiAob3B0aW9uKSkgXAorCQkgICAgICAgICAgICAgICAgICB8fCAoISEoKGludmZsYWcpICYgKG9wdGlvbikpIF4gKGNvbmQpKSkKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmRjY3Bfb3B0YnVmOworc3RhdGljIERFRklORV9TUElOTE9DSyhkY2NwX2J1ZmxvY2spOworCitzdGF0aWMgaW5saW5lIGludAorZGNjcF9maW5kX29wdGlvbih1X2ludDhfdCBvcHRpb24sCisJCSBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgdW5zaWduZWQgaW50IHByb3RvZmYsCisJCSBjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLAorCQkgaW50ICpob3Rkcm9wKQoreworCS8qIHRjcC5kb2ZmIGlzIG9ubHkgNCBiaXRzLCBpZS4gbWF4IDE1ICogNCBieXRlcyAqLworCXVuc2lnbmVkIGNoYXIgKm9wOworCXVuc2lnbmVkIGludCBvcHRvZmYgPSBfX2RjY3BfaGRyX2xlbihkaCk7CisJdW5zaWduZWQgaW50IG9wdGxlbiA9IGRoLT5kY2NwaF9kb2ZmKjQgLSBfX2RjY3BfaGRyX2xlbihkaCk7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoZGgtPmRjY3BoX2RvZmYgKiA0IDwgX19kY2NwX2hkcl9sZW4oZGgpKSB7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFvcHRsZW4pCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2JoKCZkY2NwX2J1ZmxvY2spOworCW9wID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiArIG9wdG9mZiwgb3B0bGVuLCBkY2NwX29wdGJ1Zik7CisJaWYgKG9wID09IE5VTEwpIHsKKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KKwkJc3Bpbl91bmxvY2tfYmgoJmRjY3BfYnVmbG9jayk7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG9wdGxlbjsgKSB7CisJCWlmIChvcFtpXSA9PSBvcHRpb24pIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZkY2NwX2J1ZmxvY2spOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlpZiAob3BbaV0gPCAyKSAKKwkJCWkrKzsKKwkJZWxzZSAKKwkJCWkgKz0gb3BbaSsxXT86MTsKKwl9CisKKwlzcGluX3VubG9ja19iaCgmZGNjcF9idWZsb2NrKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW5saW5lIGludAorbWF0Y2hfdHlwZXMoY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCwgdV9pbnQxNl90IHR5cGVtYXNrKQoreworCXJldHVybiAodHlwZW1hc2sgJiAoMSA8PCBkaC0+ZGNjcGhfdHlwZSkpOworfQorCitzdGF0aWMgaW5saW5lIGludAorbWF0Y2hfb3B0aW9uKHVfaW50OF90IG9wdGlvbiwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IHByb3RvZmYsCisJICAgICBjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLCBpbnQgKmhvdGRyb3ApCit7CisJcmV0dXJuIGRjY3BfZmluZF9vcHRpb24ob3B0aW9uLCBza2IsIHByb3RvZmYsIGRoLCBob3Rkcm9wKTsKK30KKworc3RhdGljIGludAorbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X2RjY3BfaW5mbyAqaW5mbyA9IAorCQkJCShjb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICopbWF0Y2hpbmZvOworCXN0cnVjdCBkY2NwX2hkciBfZGgsICpkaDsKKworCWlmIChvZmZzZXQpCisJCXJldHVybiAwOworCQorCWRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9kaCksICZfZGgpOworCWlmIChkaCA9PSBOVUxMKSB7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisgICAgICAgCX0KKworCXJldHVybiAgRENDSEVDSygoKG50b2hzKGRoLT5kY2NwaF9zcG9ydCkgPj0gaW5mby0+c3B0c1swXSkgCisJCQkmJiAobnRvaHMoZGgtPmRjY3BoX3Nwb3J0KSA8PSBpbmZvLT5zcHRzWzFdKSksIAorCQkgICAJWFRfRENDUF9TUkNfUE9SVFMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKKwkJJiYgRENDSEVDSygoKG50b2hzKGRoLT5kY2NwaF9kcG9ydCkgPj0gaW5mby0+ZHB0c1swXSkgCisJCQkmJiAobnRvaHMoZGgtPmRjY3BoX2Rwb3J0KSA8PSBpbmZvLT5kcHRzWzFdKSksIAorCQkJWFRfRENDUF9ERVNUX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCisJCSYmIERDQ0hFQ0sobWF0Y2hfdHlwZXMoZGgsIGluZm8tPnR5cGVtYXNrKSwKKwkJCSAgIFhUX0RDQ1BfVFlQRSwgaW5mby0+ZmxhZ3MsIGluZm8tPmludmZsYWdzKQorCQkmJiBEQ0NIRUNLKG1hdGNoX29wdGlvbihpbmZvLT5vcHRpb24sIHNrYiwgcHJvdG9mZiwgZGgsCisJCQkJCWhvdGRyb3ApLAorCQkJICAgWFRfRENDUF9PUFRJT04sIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHZvaWQgKmluZiwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaW5mOworCWNvbnN0IHN0cnVjdCB4dF9kY2NwX2luZm8gKmluZm87CisKKwlpbmZvID0gKGNvbnN0IHN0cnVjdCB4dF9kY2NwX2luZm8gKiltYXRjaGluZm87CisKKwlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fRENDUAorCQkmJiAhKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykKKwkJJiYgbWF0Y2hzaXplID09IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfZGNjcF9pbmZvKSkKKwkJJiYgIShpbmZvLT5mbGFncyAmIH5YVF9EQ0NQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgflhUX0RDQ1BfVkFMSURfRkxBR1MpCisJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+aW5mby0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitjaGVja2VudHJ5Nihjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgY29uc3Qgdm9pZCAqaW5mLAorCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCA9IGluZjsKKwljb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICppbmZvOworCisJaW5mbyA9IChjb25zdCBzdHJ1Y3QgeHRfZGNjcF9pbmZvICopbWF0Y2hpbmZvOworCisJcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX0RDQ1AKKwkJJiYgIShpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2RjY3BfaW5mbykpCisJCSYmICEoaW5mby0+ZmxhZ3MgJiB+WFRfRENDUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5YVF9EQ0NQX1ZBTElEX0ZMQUdTKQorCQkmJiAhKGluZm8tPmludmZsYWdzICYgfmluZm8tPmZsYWdzKTsKK30KKworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGRjY3BfbWF0Y2ggPSAKK3sgCisJLm5hbWUgCQk9ICJkY2NwIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lIAkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGRjY3A2X21hdGNoID0gCit7IAorCS5uYW1lIAkJPSAiZGNjcCIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5NiwKKwkubWUgCQk9IFRISVNfTU9EVUxFLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCS8qIGRvZmYgaXMgOCBiaXRzLCBzbyB0aGUgbWF4aW11bSBvcHRpb24gc2l6ZSBpcyAoNCoyNTYpLiAgRG9uJ3QgcHV0CisJICogdGhpcyBpbiBCU1Mgc2luY2UgRGF2ZU0gaXMgd29ycmllZCBhYm91dCBsb2NrZWQgVExCJ3MgZm9yIGtlcm5lbAorCSAqIEJTUy4gKi8KKwlkY2NwX29wdGJ1ZiA9IGttYWxsb2MoMjU2ICogNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkY2NwX29wdGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmRjY3BfbWF0Y2gpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2tmcmVlOworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmZGNjcDZfbWF0Y2gpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnOworCisJcmV0dXJuIHJldDsKKworb3V0X3VucmVnOgorCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmRjY3BfbWF0Y2gpOworb3V0X2tmcmVlOgorCWtmcmVlKGRjY3Bfb3B0YnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJmRjY3A2X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZkY2NwX21hdGNoKTsKKwlrZnJlZShkY2NwX29wdGJ1Zik7Cit9CisKK21vZHVsZV9pbml0KGluaXQpOworbW9kdWxlX2V4aXQoZmluaSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hlbHBlci5jIGIvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYwpzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2hlbHBlci5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCmluZGV4IGFlZjY0OWUuLjM4YjY3MTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfaGVscGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2lmIGRlZmluZWQoQ09ORklHX0lQX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfSVBfTkZfQ09OTlRSQUNLX01PRFVMRSkKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF9jb25udHJhY2tfY29yZS5oPgpAQCAtMjMsMTIgKzIyLDE0IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5oPgogI2VuZGlmCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2hlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9oZWxwZXIuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWFydGluIEpvc2Vmc3NvbiA8Z2FuZGFsZkBuZXRmaWx0ZXIub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBoZWxwZXIgbWF0Y2ggbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9oZWxwZXIiKTsKK01PRFVMRV9BTElBUygiaXA2dF9oZWxwZXIiKTsKIAogI2lmIDAKICNkZWZpbmUgREVCVUdQIHByaW50awpAQCAtNDMsMjcgKzQ0LDI4IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotCWNvbnN0IHN0cnVjdCBpcHRfaGVscGVyX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2hlbHBlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCXN0cnVjdCBpcF9jb25udHJhY2sgKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCWludCByZXQgPSBpbmZvLT5pbnZlcnQ7CiAJCiAJY3QgPSBpcF9jb25udHJhY2tfZ2V0KChzdHJ1Y3Qgc2tfYnVmZiAqKXNrYiwgJmN0aW5mbyk7CiAJaWYgKCFjdCkgewotCQlERUJVR1AoImlwdF9oZWxwZXI6IEVlayEgaW52YWxpZCBjb25udHJhY2s/XG4iKTsKKwkJREVCVUdQKCJ4dF9oZWxwZXI6IEVlayEgaW52YWxpZCBjb25udHJhY2s/XG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlpZiAoIWN0LT5tYXN0ZXIpIHsKLQkJREVCVUdQKCJpcHRfaGVscGVyOiBjb25udHJhY2sgJXAgaGFzIG5vIG1hc3RlclxuIiwgY3QpOworCQlERUJVR1AoInh0X2hlbHBlcjogY29ubnRyYWNrICVwIGhhcyBubyBtYXN0ZXJcbiIsIGN0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZWFkX2xvY2tfYmgoJmlwX2Nvbm50cmFja19sb2NrKTsKIAlpZiAoIWN0LT5tYXN0ZXItPmhlbHBlcikgewotCQlERUJVR1AoImlwdF9oZWxwZXI6IG1hc3RlciBjdCAlcCBoYXMgbm8gaGVscGVyXG4iLCAKKwkJREVCVUdQKCJ4dF9oZWxwZXI6IG1hc3RlciBjdCAlcCBoYXMgbm8gaGVscGVyXG4iLCAKIAkJCWV4cC0+ZXhwZWN0YW50KTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KQEAgLTg5LDI3ICs5MSwyOCBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJaW50IHJldCA9IGluZm8tPmludmVydDsKIAkKIAljdCA9IG5mX2N0X2dldCgoc3RydWN0IHNrX2J1ZmYgKilza2IsICZjdGluZm8pOwogCWlmICghY3QpIHsKLQkJREVCVUdQKCJpcHRfaGVscGVyOiBFZWshIGludmFsaWQgY29ubnRyYWNrP1xuIik7CisJCURFQlVHUCgieHRfaGVscGVyOiBFZWshIGludmFsaWQgY29ubnRyYWNrP1xuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKCFjdC0+bWFzdGVyKSB7Ci0JCURFQlVHUCgiaXB0X2hlbHBlcjogY29ubnRyYWNrICVwIGhhcyBubyBtYXN0ZXJcbiIsIGN0KTsKKwkJREVCVUdQKCJ4dF9oZWxwZXI6IGNvbm50cmFjayAlcCBoYXMgbm8gbWFzdGVyXG4iLCBjdCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJcmVhZF9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJaWYgKCFjdC0+bWFzdGVyLT5oZWxwZXIpIHsKLQkJREVCVUdQKCJpcHRfaGVscGVyOiBtYXN0ZXIgY3QgJXAgaGFzIG5vIGhlbHBlclxuIiwgCisJCURFQlVHUCgieHRfaGVscGVyOiBtYXN0ZXIgY3QgJXAgaGFzIG5vIGhlbHBlclxuIiwgCiAJCQlleHAtPmV4cGVjdGFudCk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CkBAIC0xMjksMjMgKzEzMiwyOSBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisJCSBjb25zdCB2b2lkICppbmYsCiAJCSB2b2lkICptYXRjaGluZm8sCiAJCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlzdHJ1Y3QgaXB0X2hlbHBlcl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCXN0cnVjdCB4dF9oZWxwZXJfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAogCWluZm8tPm5hbWVbMjldID0gJ1wwJzsKIAogCS8qIHZlcmlmeSBzaXplICovCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfaGVscGVyX2luZm8pKSkKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfaGVscGVyX2luZm8pKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggaGVscGVyX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBoZWxwZXJfbWF0Y2ggPSB7CisJLm5hbWUJCT0gImhlbHBlciIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBoZWxwZXI2X21hdGNoID0gewogCS5uYW1lCQk9ICJoZWxwZXIiLAogCS5tYXRjaAkJPSAmbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSAmY2hlY2ssCkBAIC0xNTQsMTMgKzE2MywyNCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JbmVlZF9pcF9jb25udHJhY2soKTsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZoZWxwZXJfbWF0Y2gpOworCWludCByZXQ7CisJbmVlZF9jb25udHJhY2soKTsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZoZWxwZXJfbWF0Y2gpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZoZWxwZXI2X21hdGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaGVscGVyX21hdGNoKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJmhlbHBlcl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmaGVscGVyX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmaGVscGVyNl9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9sZW5ndGguYyBiL25ldC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2YzcxMAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfbGVuZ3RoLmMKQEAgLTAsMCArMSw5OCBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBwYWNrZXQgbGVuZ3RoLiAqLworLyogKEMpIDE5OTktMjAwMSBKYW1lcyBNb3JyaXMgPGptb3Jyb3NAaW50ZXJjb2RlLmNvbS5hdT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9sZW5ndGguaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKworTU9EVUxFX0FVVEhPUigiSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBwYWNrZXQgbGVuZ3RoIG1hdGNoaW5nIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfbGVuZ3RoIik7CitNT0RVTEVfQUxJQVMoImlwNnRfbGVuZ3RoIik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCB4dF9sZW5ndGhfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwl1X2ludDE2X3QgcGt0bGVuID0gbnRvaHMoc2tiLT5uaC5pcGgtPnRvdF9sZW4pOworCQorCXJldHVybiAocGt0bGVuID49IGluZm8tPm1pbiAmJiBwa3RsZW4gPD0gaW5mby0+bWF4KSBeIGluZm8tPmludmVydDsKK30KKworc3RhdGljIGludAorbWF0Y2g2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgIGludCBvZmZzZXQsCisgICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCB4dF9sZW5ndGhfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwl1X2ludDE2X3QgcGt0bGVuID0gbnRvaHMoc2tiLT5uaC5pcHY2aC0+cGF5bG9hZF9sZW4pICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKKwkKKwlyZXR1cm4gKHBrdGxlbiA+PSBpbmZvLT5taW4gJiYgcGt0bGVuIDw9IGluZm8tPm1heCkgXiBpbmZvLT5pbnZlcnQ7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICBjb25zdCB2b2lkICppcCwKKyAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9sZW5ndGhfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGxlbmd0aF9tYXRjaCA9IHsKKwkubmFtZQkJPSAibGVuZ3RoIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggbGVuZ3RoNl9tYXRjaCA9IHsKKwkubmFtZQkJPSAibGVuZ3RoIiwKKwkubWF0Y2gJCT0gJm1hdGNoNiwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZsZW5ndGhfbWF0Y2gpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZsZW5ndGg2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZsZW5ndGhfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZsZW5ndGhfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZsZW5ndGg2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbGltaXQuYyBiL25ldC9uZXRmaWx0ZXIveHRfbGltaXQuYwpzaW1pbGFyaXR5IGluZGV4IDc4JQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xpbWl0LmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfbGltaXQuYwppbmRleCAwYzI0ZGNjLi4xNWU0MDUwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X2xpbWl0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9saW1pdC5jCkBAIC0xOCwxMiArMTgsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X2xpbWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2xpbWl0Lmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkhlcnZlIEV5Y2hlbm5lIDxydkB3YWxsZmlyZS5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIHJhdGUgbGltaXQgbWF0Y2giKTsKK01PRFVMRV9BTElBUygiaXB0X2xpbWl0Iik7CitNT0RVTEVfQUxJQVMoImlwNnRfbGltaXQiKTsKIAogLyogVGhlIGFsZ29yaXRobSB1c2VkIGlzIHRoZSBTaW1wbGUgVG9rZW4gQnVja2V0IEZpbHRlciAoVEJGKQogICogc2VlIG5ldC9zY2hlZC9zY2hfdGJmLmMgaW4gdGhlIGxpbnV4IHNvdXJjZSB0cmVlCkBAIC02OCw5ICs3MCwxMCBAQAogCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogCQljb25zdCB2b2lkICptYXRjaGluZm8sCiAJCWludCBvZmZzZXQsCisJCXVuc2lnbmVkIGludCBwcm90b2ZmLAogCQlpbnQgKmhvdGRyb3ApCiB7Ci0Jc3RydWN0IGlwdF9yYXRlaW5mbyAqciA9ICgoc3RydWN0IGlwdF9yYXRlaW5mbyAqKW1hdGNoaW5mbyktPm1hc3RlcjsKKwlzdHJ1Y3QgeHRfcmF0ZWluZm8gKnIgPSAoKHN0cnVjdCB4dF9yYXRlaW5mbyAqKW1hdGNoaW5mbyktPm1hc3RlcjsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CiAKIAlzcGluX2xvY2tfYmgoJmxpbWl0X2xvY2spOwpAQCAtOTYsMzIgKzk5LDMyIEBACiAJLyogSWYgbXVsdGlwbHlpbmcgd291bGQgb3ZlcmZsb3cuLi4gKi8KIAlpZiAodXNlciA+IDB4RkZGRkZGRkYgLyAoSFoqQ1JFRElUU19QRVJfSklGRlkpKQogCQkvKiBEaXZpZGUgZmlyc3QuICovCi0JCXJldHVybiAodXNlciAvIElQVF9MSU1JVF9TQ0FMRSkgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZOworCQlyZXR1cm4gKHVzZXIgLyBYVF9MSU1JVF9TQ0FMRSkgKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZOwogCi0JcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBJUFRfTElNSVRfU0NBTEU7CisJcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBYVF9MSU1JVF9TQ0FMRTsKIH0KIAogc3RhdGljIGludAogaXB0X2xpbWl0X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotCQkgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgICAgIGNvbnN0IHZvaWQgKmluZiwKIAkJICAgICB2b2lkICptYXRjaGluZm8sCiAJCSAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCXN0cnVjdCBpcHRfcmF0ZWluZm8gKnIgPSBtYXRjaGluZm87CisJc3RydWN0IHh0X3JhdGVpbmZvICpyID0gbWF0Y2hpbmZvOwogCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcmF0ZWluZm8pKSkKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfcmF0ZWluZm8pKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICovCiAJaWYgKHItPmJ1cnN0ID09IDAKIAkgICAgfHwgdXNlcjJjcmVkaXRzKHItPmF2ZyAqIHItPmJ1cnN0KSA8IHVzZXIyY3JlZGl0cyhyLT5hdmcpKSB7Ci0JCXByaW50aygiT3ZlcmZsb3cgaW4gaXB0X2xpbWl0LCB0cnkgbG93ZXI6ICV1LyV1XG4iLAorCQlwcmludGsoIk92ZXJmbG93IGluIHh0X2xpbWl0LCB0cnkgbG93ZXI6ICV1LyV1XG4iLAogCQkgICAgICAgci0+YXZnLCByLT5idXJzdCk7CiAJCXJldHVybiAwOwogCX0KIAotCS8qIFVzZXIgYXZnIGluIHNlY29uZHMgKiBJUFRfTElNSVRfU0NBTEU6IGNvbnZlcnQgdG8gamlmZmllcyAqCisJLyogVXNlciBhdmcgaW4gc2Vjb25kcyAqIFhUX0xJTUlUX1NDQUxFOiBjb252ZXJ0IHRvIGppZmZpZXMgKgogCSAgIDEyOC4gKi8KIAlyLT5wcmV2ID0gamlmZmllczsKIAlyLT5jcmVkaXQgPSB1c2VyMmNyZWRpdHMoci0+YXZnICogci0+YnVyc3QpOwkgLyogQ3JlZGl0cyBmdWxsLiAqLwpAQCAtMTM0LDcgKzEzNywxMyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBpcHRfbGltaXRfcmVnID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBpcHRfbGltaXRfcmVnID0geworCS5uYW1lCQk9ICJsaW1pdCIsCisJLm1hdGNoCQk9IGlwdF9saW1pdF9tYXRjaCwKKwkuY2hlY2tlbnRyeQk9IGlwdF9saW1pdF9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIGxpbWl0Nl9yZWcgPSB7CiAJLm5hbWUJCT0gImxpbWl0IiwKIAkubWF0Y2gJCT0gaXB0X2xpbWl0X21hdGNoLAogCS5jaGVja2VudHJ5CT0gaXB0X2xpbWl0X2NoZWNrZW50cnksCkBAIC0xNDMsMTQgKzE1MiwyMyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JaWYgKGlwdF9yZWdpc3Rlcl9tYXRjaCgmaXB0X2xpbWl0X3JlZykpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOworCWludCByZXQ7CisJCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmlwdF9saW1pdF9yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZsaW1pdDZfcmVnKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZpcHRfbGltaXRfcmVnKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJmlwdF9saW1pdF9yZWcpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJmlwdF9saW1pdF9yZWcpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZsaW1pdDZfcmVnKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X21hYy5jIGIvbmV0L25ldGZpbHRlci94dF9tYWMuYwpzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X21hYy5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X21hYy5jCmluZGV4IDFiOWJiNDUuLjA0NjFkY2IgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfbWFjLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9tYWMuYwpAQCAtMTMsMTIgKzEzLDE1IEBACiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hYy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X21hYy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJOZXRmaWx0ZXIgQ29yZSBUZWFtIDxjb3JldGVhbUBuZXRmaWx0ZXIub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBtYWMgbWF0Y2hpbmcgbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9tYWMiKTsKK01PRFVMRV9BTElBUygiaXA2dF9tYWMiKTsKIAogc3RhdGljIGludAogbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTI2LDkgKzI5LDEwIEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotICAgIGNvbnN0IHN0cnVjdCBpcHRfbWFjX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisgICAgY29uc3Qgc3RydWN0IHh0X21hY19pbmZvICppbmZvID0gbWF0Y2hpbmZvOwogCiAgICAgLyogSXMgbWFjIHBvaW50ZXIgdmFsaWQ/ICovCiAgICAgcmV0dXJuIChza2ItPm1hYy5yYXcgPj0gc2tiLT5oZWFkCkBAIC00MCw3ICs0NCw3IEBACiAKIHN0YXRpYyBpbnQKIGlwdF9tYWNfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgICBjb25zdCB2b2lkICppbmYsCiAJCSAgIHZvaWQgKm1hdGNoaW5mbywKIAkJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKIAkJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKQEAgLTQ5LDE3ICs1MywyMyBAQAogCWlmIChob29rX21hc2sKIAkgICAgJiB+KCgxIDw8IE5GX0lQX1BSRV9ST1VUSU5HKSB8ICgxIDw8IE5GX0lQX0xPQ0FMX0lOKQogCQl8ICgxIDw8IE5GX0lQX0ZPUldBUkQpKSkgewotCQlwcmludGsoImlwdF9tYWM6IG9ubHkgdmFsaWQgZm9yIFBSRV9ST1VUSU5HLCBMT0NBTF9JTiBvciBGT1JXQVJELlxuIik7CisJCXByaW50aygieHRfbWFjOiBvbmx5IHZhbGlkIGZvciBQUkVfUk9VVElORywgTE9DQUxfSU4gb3IgRk9SV0FSRC5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9tYWNfaW5mbykpKQorCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9tYWNfaW5mbykpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBtYWNfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIG1hY19tYXRjaCA9IHsKKwkubmFtZQkJPSAibWFjIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmlwdF9tYWNfY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBtYWM2X21hdGNoID0gewogCS5uYW1lCQk9ICJtYWMiLAogCS5tYXRjaAkJPSAmbWF0Y2gsCiAJLmNoZWNrZW50cnkJPSAmaXB0X21hY19jaGVja2VudHJ5LApAQCAtNjgsMTIgKzc4LDIyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZtYWNfbWF0Y2gpOworCWludCByZXQ7CisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJm1hY19tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmbWFjNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbWFjX21hdGNoKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7Ci0JaXB0X3VucmVnaXN0ZXJfbWF0Y2goJm1hY19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbWFjX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmbWFjNl9tYXRjaCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tYXJrLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X21hcmsuYwpzaW1pbGFyaXR5IGluZGV4IDYwJQpyZW5hbWUgZnJvbSBuZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X21hcmsuYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9tYXJrLmMKaW5kZXggMDBiZWY2Yy4uMmEwYWM2MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9tYXJrLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9tYXJrLmMKQEAgLTEwLDEyICsxMCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X21hcmsuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbWFyay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJjIEJvdWNoZXIgPG1hcmNAbWJzaS5jYT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgbWFyayBtYXRjaGluZyBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X21hcmsiKTsKK01PRFVMRV9BTElBUygiaXA2dF9tYXJrIik7CiAKIHN0YXRpYyBpbnQKIG1hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCkBAIC0yMywyMyArMjUsMjQgQEAKICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCiAgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCiAgICAgICBpbnQgKmhvdGRyb3ApCiB7Ci0JY29uc3Qgc3RydWN0IGlwdF9tYXJrX2luZm8gKmluZm8gPSBtYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X21hcmtfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAogCXJldHVybiAoKHNrYi0+bmZtYXJrICYgaW5mby0+bWFzaykgPT0gaW5mby0+bWFyaykgXiBpbmZvLT5pbnZlcnQ7CiB9CiAKIHN0YXRpYyBpbnQKIGNoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAotICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKyAgICAgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCiAgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKICAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKICAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQlzdHJ1Y3QgaXB0X21hcmtfaW5mbyAqbWluZm8gPSAoc3RydWN0IGlwdF9tYXJrX2luZm8gKikgbWF0Y2hpbmZvOworCXN0cnVjdCB4dF9tYXJrX2luZm8gKm1pbmZvID0gKHN0cnVjdCB4dF9tYXJrX2luZm8gKikgbWF0Y2hpbmZvOwogCi0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfbWFya19pbmZvKSkpCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X21hcmtfaW5mbykpKQogCQlyZXR1cm4gMDsKIAogCWlmIChtaW5mby0+bWFyayA+IDB4ZmZmZmZmZmYgfHwgbWluZm8tPm1hc2sgPiAweGZmZmZmZmZmKSB7CkBAIC01MCw3ICs1MywxNCBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBtYXJrX21hdGNoID0geworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBtYXJrX21hdGNoID0geworCS5uYW1lCQk9ICJtYXJrIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBtYXJrNl9tYXRjaCA9IHsKIAkubmFtZQkJPSAibWFyayIsCiAJLm1hdGNoCQk9ICZtYXRjaCwKIAkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LApAQCAtNTksMTIgKzY5LDIyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKIHsKLQlyZXR1cm4gaXB0X3JlZ2lzdGVyX21hdGNoKCZtYXJrX21hdGNoKTsKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZtYXJrX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZtYXJrNl9tYXRjaCk7CisJaWYgKHJldCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmbWFya19tYXRjaCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZtYXJrX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZtYXJrX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmbWFyazZfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jIGIvbmV0L25ldGZpbHRlci94dF9waHlzZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliYjU3YwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCkBAIC0wLDAgKzEsMTU1IEBACisvKiBLZXJuZWwgbW9kdWxlIHRvIG1hdGNoIHRoZSBicmlkZ2UgcG9ydCBpbiBhbmQKKyAqIG91dCBkZXZpY2UgZm9yIElQIHBhY2tldHMgY29taW5nIGludG8gY29udGFjdCB3aXRoIGEgYnJpZGdlLiAqLworCisvKiAoQykgMjAwMS0yMDAzIEJhcnQgRGUgU2NodXltZXIgPGJkc2NodXltQHBhbmRvcmEuYmU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CisjZGVmaW5lIE1BVENIICAgMQorI2RlZmluZSBOT01BVENIIDAKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQmFydCBEZSBTY2h1eW1lciA8YmRzY2h1eW1AcGFuZG9yYS5iZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXB0YWJsZXMgYnJpZGdlIHBoeXNpY2FsIGRldmljZSBtYXRjaCBtb2R1bGUiKTsKK01PRFVMRV9BTElBUygiaXB0X3BoeXNkZXYiKTsKK01PRFVMRV9BTElBUygiaXA2dF9waHlzZGV2Iik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWludCBpOworCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXTsKKwljb25zdCBzdHJ1Y3QgeHRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCXVuc2lnbmVkIGludCByZXQ7CisJY29uc3QgY2hhciAqaW5kZXYsICpvdXRkZXY7CisJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2U7CisKKwkvKiBOb3QgYSBicmlkZ2VkIElQIHBhY2tldCBvciBubyBpbmZvIGF2YWlsYWJsZSB5ZXQ6CisJICogTE9DQUxfT1VUL21hbmdsZSBhbmQgTE9DQUxfT1VUL25hdCBkb24ndCBrbm93IGlmCisJICogdGhlIGRlc3RpbmF0aW9uIGRldmljZSB3aWxsIGJlIGEgYnJpZGdlLiAqLworCWlmICghKG5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlKSkgeworCQkvKiBSZXR1cm4gTUFUQ0ggaWYgdGhlIGludmVydCBmbGFncyBvZiB0aGUgdXNlZCBvcHRpb25zIGFyZSBvbiAqLworCQlpZiAoKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0JSSURHRUQpICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfQlJJREdFRCkpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJaWYgKChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9JU0lOKSAmJgorCQkgICAgIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0lTSU4pKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfSVNPVVQpICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSVNPVVQpKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfSU4pICYmCisJCSAgICAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSU4pKQorCQkJcmV0dXJuIE5PTUFUQ0g7CisJCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfT1VUKSAmJgorCQkgICAgIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX09VVCkpCisJCQlyZXR1cm4gTk9NQVRDSDsKKwkJcmV0dXJuIE1BVENIOworCX0KKworCS8qIFRoaXMgb25seSBtYWtlcyBzZW5zZSBpbiB0aGUgRk9SV0FSRCBhbmQgUE9TVFJPVVRJTkcgY2hhaW5zICovCisJaWYgKChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9CUklER0VEKSAmJgorCSAgICAoISEobmZfYnJpZGdlLT5tYXNrICYgQlJORl9CUklER0VEKSBeCisJICAgICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9CUklER0VEKSkpCisJCXJldHVybiBOT01BVENIOworCisJaWYgKChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9JU0lOICYmCisJICAgICghbmZfYnJpZGdlLT5waHlzaW5kZXYgXiAhIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0lTSU4pKSkgfHwKKwkgICAgKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0lTT1VUICYmCisJICAgICghbmZfYnJpZGdlLT5waHlzb3V0ZGV2IF4gISEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9JU09VVCkpKSkKKwkJcmV0dXJuIE5PTUFUQ0g7CisKKwlpZiAoIShpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9JTikpCisJCWdvdG8gbWF0Y2hfb3V0ZGV2OworCWluZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXYgPyBuZl9icmlkZ2UtPnBoeXNpbmRldi0+bmFtZSA6IG51bGxkZXZuYW1lOworCWZvciAoaSA9IDAsIHJldCA9IDA7IGkgPCBJRk5BTVNJWi9zaXplb2YodW5zaWduZWQgaW50KTsgaSsrKSB7CisJCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmRldilbaV0KKwkJCV4gKChjb25zdCB1bnNpZ25lZCBpbnQgKilpbmZvLT5waHlzaW5kZXYpW2ldKQorCQkJJiAoKGNvbnN0IHVuc2lnbmVkIGludCAqKWluZm8tPmluX21hc2spW2ldOworCX0KKworCWlmICgocmV0ID09IDApIF4gIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0lOKSkKKwkJcmV0dXJuIE5PTUFUQ0g7CisKK21hdGNoX291dGRldjoKKwlpZiAoIShpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9PVVQpKQorCQlyZXR1cm4gTUFUQ0g7CisJb3V0ZGV2ID0gbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID8KKwkJIG5mX2JyaWRnZS0+cGh5c291dGRldi0+bmFtZSA6IG51bGxkZXZuYW1lOworCWZvciAoaSA9IDAsIHJldCA9IDA7IGkgPCBJRk5BTVNJWi9zaXplb2YodW5zaWduZWQgaW50KTsgaSsrKSB7CisJCXJldCB8PSAoKChjb25zdCB1bnNpZ25lZCBpbnQgKilvdXRkZXYpW2ldCisJCQleICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+cGh5c291dGRldilbaV0pCisJCQkmICgoY29uc3QgdW5zaWduZWQgaW50ICopaW5mby0+b3V0X21hc2spW2ldOworCX0KKworCXJldHVybiAocmV0ICE9IDApIF4gIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX09VVCk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkgICAgICAgY29uc3Qgdm9pZCAqaXAsCisJCSAgICAgICB2b2lkICptYXRjaGluZm8sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCQkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgeHRfcGh5c2Rldl9pbmZvICppbmZvID0gbWF0Y2hpbmZvOworCisJaWYgKG1hdGNoc2l6ZSAhPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3BoeXNkZXZfaW5mbykpKQorCQlyZXR1cm4gMDsKKwlpZiAoIShpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9NQVNLKSB8fAorCSAgICBpbmZvLT5iaXRtYXNrICYgflhUX1BIWVNERVZfT1BfTUFTSykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcGh5c2Rldl9tYXRjaCA9IHsKKwkubmFtZQkJPSAicGh5c2RldiIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcGh5c2RldjZfbWF0Y2ggPSB7CisJLm5hbWUJCT0gInBoeXNkZXYiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeSwKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZwaHlzZGV2X21hdGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmcGh5c2RldjZfbWF0Y2gpOworCWlmIChyZXQgPCAwKQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZwaHlzZGV2X21hdGNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmcGh5c2Rldl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnBoeXNkZXY2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5jIGIvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIxYjI2MwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIChDKSAxOTk5LTIwMDEgTWljaGFsIEx1ZHZpZyA8bWljaGFsQGxvZ2l4LmN6PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWwgTHVkdmlnIDxtaWNoYWxAbG9naXguY3o+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklQIHRhYmxlcyBtYXRjaCB0byBtYXRjaCBvbiBsaW5rbGF5ZXIgcGFja2V0IHR5cGUiKTsKK01PRFVMRV9BTElBUygiaXB0X3BrdHR5cGUiKTsKK01PRFVMRV9BTElBUygiaXA2dF9wa3R0eXBlIik7CisKK3N0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKyAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisgICAgICBjb25zdCB2b2lkICptYXRjaGluZm8sCisgICAgICBpbnQgb2Zmc2V0LAorICAgICAgdW5zaWduZWQgaW50IHByb3RvZmYsCisgICAgICBpbnQgKmhvdGRyb3ApCit7CisJY29uc3Qgc3RydWN0IHh0X3BrdHR5cGVfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCXJldHVybiAoc2tiLT5wa3RfdHlwZSA9PSBpbmZvLT5wa3R0eXBlKSBeIGluZm8tPmludmVydDsKK30KKworc3RhdGljIGludCBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkJICAgY29uc3Qgdm9pZCAqaXAsCisJCSAgIHZvaWQgKm1hdGNoaW5mbywKKwkJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfcGt0dHlwZV9pbmZvKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcGt0dHlwZV9tYXRjaCA9IHsKKwkubmFtZQkJPSAicGt0dHlwZSIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHBrdHR5cGU2X21hdGNoID0geworCS5uYW1lCQk9ICJwa3R0eXBlIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmcGt0dHlwZV9tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmcGt0dHlwZTZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnBrdHR5cGVfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZwa3R0eXBlX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmcGt0dHlwZTZfbWF0Y2gpOworfQorCittb2R1bGVfaW5pdChpbml0KTsKK21vZHVsZV9leGl0KGZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9yZWFsbS5jIGIvbmV0L25ldGZpbHRlci94dF9yZWFsbS5jCnNpbWlsYXJpdHkgaW5kZXggNzAlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVhbG0uYwpyZW5hbWUgdG8gbmV0L25ldGZpbHRlci94dF9yZWFsbS5jCmluZGV4IDU0YTY4OTcuLjJiN2UxNzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcmVhbG0uYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3JlYWxtLmMKQEAgLTE0LDEyICsxNCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXB0X3JlYWxtLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfcmVhbG0uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KIAogTU9EVUxFX0FVVEhPUigiU2FtcHNhIFJhbnRhIDxzYW1wc2FAbmV0c29uaWMuZmk+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzIHJlYWxtIG1hdGNoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlhfdGFibGVzIHJlYWxtIG1hdGNoIik7CitNT0RVTEVfQUxJQVMoImlwdF9yZWFsbSIpOwogCiBzdGF0aWMgaW50CiBtYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMjcsMTYgKzI5LDE3IEBACiAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAogICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAogICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAogICAgICAgaW50ICpob3Rkcm9wKQogewotCWNvbnN0IHN0cnVjdCBpcHRfcmVhbG1faW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfcmVhbG1faW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2ItPmRzdDsKICAgICAKIAlyZXR1cm4gKGluZm8tPmlkID09IChkc3QtPnRjbGFzc2lkICYgaW5mby0+bWFzaykpIF4gaW5mby0+aW52ZXJ0OwogfQogCiBzdGF0aWMgaW50IGNoZWNrKGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGlwdF9pcCAqaXAsCisgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmlwLAogICAgICAgICAgICAgICAgICB2b2lkICptYXRjaGluZm8sCiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCkBAIC00NCwxOCArNDcsMTggQEAKIAlpZiAoaG9va19tYXNrCiAJICAgICYgfigoMSA8PCBORl9JUF9QT1NUX1JPVVRJTkcpIHwgKDEgPDwgTkZfSVBfRk9SV0FSRCkgfAogCSAgICAgICAgKDEgPDwgTkZfSVBfTE9DQUxfT1VUKSB8ICgxIDw8IE5GX0lQX0xPQ0FMX0lOKSkpIHsKLQkJcHJpbnRrKCJpcHRfcmVhbG06IG9ubHkgdmFsaWQgZm9yIFBPU1RfUk9VVElORywgTE9DQUxfT1VULCAiCisJCXByaW50aygieHRfcmVhbG06IG9ubHkgdmFsaWQgZm9yIFBPU1RfUk9VVElORywgTE9DQUxfT1VULCAiCiAJCSAgICAgICAiTE9DQUxfSU4gb3IgRk9SV0FSRC5cbiIpOwogCQlyZXR1cm4gMDsKIAl9Ci0JaWYgKG1hdGNoc2l6ZSAhPSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfcmVhbG1faW5mbykpKSB7Ci0JCXByaW50aygiaXB0X3JlYWxtOiBpbnZhbGlkIG1hdGNoc2l6ZS5cbiIpOworCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9yZWFsbV9pbmZvKSkpIHsKKwkJcHJpbnRrKCJ4dF9yZWFsbTogaW52YWxpZCBtYXRjaHNpemUuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCByZWFsbV9tYXRjaCA9IHsKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcmVhbG1fbWF0Y2ggPSB7CiAJLm5hbWUJCT0gInJlYWxtIiwKIAkubWF0Y2gJCT0gbWF0Y2gsIAogCS5jaGVja2VudHJ5CT0gY2hlY2ssCkBAIC02NCwxMiArNjcsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQogewotCXJldHVybiBpcHRfcmVnaXN0ZXJfbWF0Y2goJnJlYWxtX21hdGNoKTsKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnJlYWxtX21hdGNoKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmcmVhbG1fbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnJlYWxtX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3NjdHAuYyBiL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfc2N0cC5jCnJlbmFtZSB0byBuZXQvbmV0ZmlsdGVyL3h0X3NjdHAuYwppbmRleCBmZTJiMzI3Li4xMGZiZmM1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3NjdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3NjdHAuYwpAQCAtMSwxMCArMSwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2N0cC5oPgogCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3NjdHAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc2N0cC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiS2lyYW4gS3VtYXIgSW1taWRpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1hdGNoIGZvciBTQ1RQIHByb3RvY29sIHBhY2tldHMiKTsKK01PRFVMRV9BTElBUygiaXB0X3NjdHAiKTsKIAogI2lmZGVmIERFQlVHX1NDVFAKICNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKQEAgLTE2LDcgKzI0LDcgQEAKIAkJCQkJICAgICAgfHwgKCEhKChpbnZmbGFnKSAmIChvcHRpb24pKSBeIChjb25kKSkpCiAKIHN0YXRpYyBpbnQKLW1hdGNoX2ZsYWdzKGNvbnN0IHN0cnVjdCBpcHRfc2N0cF9mbGFnX2luZm8gKmZsYWdfaW5mbywKK21hdGNoX2ZsYWdzKGNvbnN0IHN0cnVjdCB4dF9zY3RwX2ZsYWdfaW5mbyAqZmxhZ19pbmZvLAogCSAgICBjb25zdCBpbnQgZmxhZ19jb3VudCwKIAkgICAgdV9pbnQ4X3QgY2h1bmt0eXBlLAogCSAgICB1X2ludDhfdCBjaHVua2ZsYWdzKQpAQCAtMzIsMTUgKzQwLDE1IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBpbmxpbmUgaW50CiBtYXRjaF9wYWNrZXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsCiAJICAgICBjb25zdCB1X2ludDMyX3QgKmNodW5rbWFwLAogCSAgICAgaW50IGNodW5rX21hdGNoX3R5cGUsCi0JICAgICBjb25zdCBzdHJ1Y3QgaXB0X3NjdHBfZmxhZ19pbmZvICpmbGFnX2luZm8sCisJICAgICBjb25zdCBzdHJ1Y3QgeHRfc2N0cF9mbGFnX2luZm8gKmZsYWdfaW5mbywKIAkgICAgIGNvbnN0IGludCBmbGFnX2NvdW50LAogCSAgICAgaW50ICpob3Rkcm9wKQogewotCWludCBvZmZzZXQ7CiAJdV9pbnQzMl90IGNodW5rbWFwY29weVsyNTYgLyBzaXplb2YgKHVfaW50MzJfdCldOwogCXNjdHBfY2h1bmtoZHJfdCBfc2NoLCAqc2NoOwogCkBAIC01Miw3ICs2MCw2IEBACiAJCVNDVFBfQ0hVTktNQVBfQ09QWShjaHVua21hcGNvcHksIGNodW5rbWFwKTsKIAl9CiAKLQlvZmZzZXQgPSBza2ItPm5oLmlwaC0+aWhsICogNCArIHNpemVvZiAoc2N0cF9zY3RwaGRyX3QpOwogCWRvIHsKIAkJc2NoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX3NjaCksICZfc2NoKTsKIAkJaWYgKHNjaCA9PSBOVUxMKSB7CkBAIC0xMTgsMTkgKzEyNSwyMCBAQAogICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKICAgICAgIGNvbnN0IHZvaWQgKm1hdGNoaW5mbywKICAgICAgIGludCBvZmZzZXQsCisgICAgICB1bnNpZ25lZCBpbnQgcHJvdG9mZiwKICAgICAgIGludCAqaG90ZHJvcCkKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X3NjdHBfaW5mbyAqaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfc2N0cF9pbmZvICppbmZvOwogCXNjdHBfc2N0cGhkcl90IF9zaCwgKnNoOwogCi0JaW5mbyA9IChjb25zdCBzdHJ1Y3QgaXB0X3NjdHBfaW5mbyAqKW1hdGNoaW5mbzsKKwlpbmZvID0gKGNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKiltYXRjaGluZm87CiAKIAlpZiAob2Zmc2V0KSB7CiAJCWR1cHJpbnRmKCJEcm9wcGluZyBub24tZmlyc3QgZnJhZ21lbnQuLiBGSVhNRVxuIik7CiAJCXJldHVybiAwOwogCX0KIAkKLQlzaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHNrYi0+bmguaXBoLT5paGwqNCwgc2l6ZW9mKF9zaCksICZfc2gpOworCXNoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF9zaCksICZfc2gpOwogCWlmIChzaCA9PSBOVUxMKSB7CiAJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MCB0aW55Z3JhbS5cbiIpOwogCQkqaG90ZHJvcCA9IDE7CkBAIC0xNDAsNjQgKzE0OCwxMDMgQEAKIAogCXJldHVybiAgU0NDSEVDSygoKG50b2hzKHNoLT5zb3VyY2UpID49IGluZm8tPnNwdHNbMF0pIAogCQkJJiYgKG50b2hzKHNoLT5zb3VyY2UpIDw9IGluZm8tPnNwdHNbMV0pKSwgCi0JCSAgIAlJUFRfU0NUUF9TUkNfUE9SVFMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKKwkJICAgCVhUX1NDVFBfU1JDX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCiAJCSYmIFNDQ0hFQ0soKChudG9ocyhzaC0+ZGVzdCkgPj0gaW5mby0+ZHB0c1swXSkgCiAJCQkmJiAobnRvaHMoc2gtPmRlc3QpIDw9IGluZm8tPmRwdHNbMV0pKSwgCi0JCQlJUFRfU0NUUF9ERVNUX1BPUlRTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpCi0JCSYmIFNDQ0hFQ0sobWF0Y2hfcGFja2V0KHNrYiwgaW5mby0+Y2h1bmttYXAsIGluZm8tPmNodW5rX21hdGNoX3R5cGUsCisJCQlYVF9TQ1RQX0RFU1RfUE9SVFMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncykKKwkJJiYgU0NDSEVDSyhtYXRjaF9wYWNrZXQoc2tiLCBwcm90b2ZmLAorCQkJCQlpbmZvLT5jaHVua21hcCwgaW5mby0+Y2h1bmtfbWF0Y2hfdHlwZSwKICAJCQkJCWluZm8tPmZsYWdfaW5mbywgaW5mby0+ZmxhZ19jb3VudCwgCiAJCQkJCWhvdGRyb3ApLAotCQkJICAgSVBUX1NDVFBfQ0hVTktfVFlQRVMsIGluZm8tPmZsYWdzLCBpbmZvLT5pbnZmbGFncyk7CisJCQkgICBYVF9TQ1RQX0NIVU5LX1RZUEVTLCBpbmZvLT5mbGFncywgaW5mby0+aW52ZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CiBjaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKLQkgICBjb25zdCBzdHJ1Y3QgaXB0X2lwICppcCwKKwkgICBjb25zdCB2b2lkICppbmYsCiAJICAgdm9pZCAqbWF0Y2hpbmZvLAogCSAgIHVuc2lnbmVkIGludCBtYXRjaHNpemUsCiAJICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKIHsKLQljb25zdCBzdHJ1Y3QgaXB0X3NjdHBfaW5mbyAqaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfc2N0cF9pbmZvICppbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaW5mOwogCi0JaW5mbyA9IChjb25zdCBzdHJ1Y3QgaXB0X3NjdHBfaW5mbyAqKW1hdGNoaW5mbzsKKwlpbmZvID0gKGNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKiltYXRjaGluZm87CiAKIAlyZXR1cm4gaXAtPnByb3RvID09IElQUFJPVE9fU0NUUAotCQkmJiAhKGlwLT5pbnZmbGFncyAmIElQVF9JTlZfUFJPVE8pCi0JCSYmIG1hdGNoc2l6ZSA9PSBJUFRfQUxJR04oc2l6ZW9mKHN0cnVjdCBpcHRfc2N0cF9pbmZvKSkKLQkJJiYgIShpbmZvLT5mbGFncyAmIH5JUFRfU0NUUF9WQUxJRF9GTEFHUykKLQkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5JUFRfU0NUUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pCisJCSYmIG1hdGNoc2l6ZSA9PSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3NjdHBfaW5mbykpCisJCSYmICEoaW5mby0+ZmxhZ3MgJiB+WFRfU0NUUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5YVF9TQ1RQX1ZBTElEX0ZMQUdTKQogCQkmJiAhKGluZm8tPmludmZsYWdzICYgfmluZm8tPmZsYWdzKQotCQkmJiAoKCEoaW5mby0+ZmxhZ3MgJiBJUFRfU0NUUF9DSFVOS19UWVBFUykpIHx8IAorCQkmJiAoKCEoaW5mby0+ZmxhZ3MgJiBYVF9TQ1RQX0NIVU5LX1RZUEVTKSkgfHwgCiAJCQkoaW5mby0+Y2h1bmtfbWF0Y2hfdHlwZSAmCiAJCQkJKFNDVFBfQ0hVTktfTUFUQ0hfQUxMIAogCQkJCXwgU0NUUF9DSFVOS19NQVRDSF9BTlkKIAkJCQl8IFNDVFBfQ0hVTktfTUFUQ0hfT05MWSkpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcHRfbWF0Y2ggc2N0cF9tYXRjaCA9IAorc3RhdGljIGludAorY2hlY2tlbnRyeTYoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHZvaWQgKmluZiwKKwkgICB2b2lkICptYXRjaGluZm8sCisJICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCB4dF9zY3RwX2luZm8gKmluZm87CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcCA9IGluZjsKKworCWluZm8gPSAoY29uc3Qgc3RydWN0IHh0X3NjdHBfaW5mbyAqKW1hdGNoaW5mbzsKKworCXJldHVybiBpcC0+cHJvdG8gPT0gSVBQUk9UT19TQ1RQCisJCSYmICEoaXAtPmludmZsYWdzICYgWFRfSU5WX1BST1RPKQorCQkmJiBtYXRjaHNpemUgPT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9zY3RwX2luZm8pKQorCQkmJiAhKGluZm8tPmZsYWdzICYgflhUX1NDVFBfVkFMSURfRkxBR1MpCisJCSYmICEoaW5mby0+aW52ZmxhZ3MgJiB+WFRfU0NUUF9WQUxJRF9GTEFHUykKKwkJJiYgIShpbmZvLT5pbnZmbGFncyAmIH5pbmZvLT5mbGFncykKKwkJJiYgKCghKGluZm8tPmZsYWdzICYgWFRfU0NUUF9DSFVOS19UWVBFUykpIHx8IAorCQkJKGluZm8tPmNodW5rX21hdGNoX3R5cGUgJgorCQkJCShTQ1RQX0NIVU5LX01BVENIX0FMTCAKKwkJCQl8IFNDVFBfQ0hVTktfTUFUQ0hfQU5ZCisJCQkJfCBTQ1RQX0NIVU5LX01BVENIX09OTFkpKSk7Cit9CisKKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBzY3RwX21hdGNoID0gCiB7IAotCS5saXN0ID0geyBOVUxMLCBOVUxMfSwKIAkubmFtZSA9ICJzY3RwIiwKIAkubWF0Y2ggPSAmbWF0Y2gsCiAJLmNoZWNrZW50cnkgPSAmY2hlY2tlbnRyeSwKLQkuZGVzdHJveSA9IE5VTEwsCisJLm1lID0gVEhJU19NT0RVTEUKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHNjdHA2X21hdGNoID0gCit7IAorCS5uYW1lID0gInNjdHAiLAorCS5tYXRjaCA9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeSA9ICZjaGVja2VudHJ5NiwKIAkubWUgPSBUSElTX01PRFVMRQogfTsKIAorCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmc2N0cF9tYXRjaCk7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmc2N0cF9tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmc2N0cDZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnNjdHBfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKIHsKLQlpcHRfdW5yZWdpc3Rlcl9tYXRjaCgmc2N0cF9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnNjdHA2X21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZzY3RwX21hdGNoKTsKIH0KIAogbW9kdWxlX2luaXQoaW5pdCk7CiBtb2R1bGVfZXhpdChmaW5pKTsKLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FVVEhPUigiS2lyYW4gS3VtYXIgSW1taWRpIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1hdGNoIGZvciBTQ1RQIHByb3RvY29sIHBhY2tldHMiKTsKLQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jIGIvbmV0L25ldGZpbHRlci94dF9zdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2U4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0YXRlLmMKQEAgLTAsMCArMSw5NiBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBjb25uZWN0aW9uIHRyYWNraW5nIGluZm9ybWF0aW9uLiAqLworCisvKiAoQykgMTk5OS0yMDAxIFBhdWwgYFJ1c3R5JyBSdXNzZWxsCisgKiAoQykgMjAwMi0yMDA1IE5ldGZpbHRlciBDb3JlIFRlYW0gPGNvcmV0ZWFtQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3N0YXRlLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlJ1c3R5IFJ1c3NlbGwgPHJ1c3R5QHJ1c3Rjb3JwLmNvbS5hdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiaXBbNl1fdGFibGVzIGNvbm5lY3Rpb24gdHJhY2tpbmcgc3RhdGUgbWF0Y2ggbW9kdWxlIik7CitNT0RVTEVfQUxJQVMoImlwdF9zdGF0ZSIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X3N0YXRlIik7CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCB4dF9zdGF0ZV9pbmZvICpzaW5mbyA9IG1hdGNoaW5mbzsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKwl1bnNpZ25lZCBpbnQgc3RhdGViaXQ7CisKKwlpZiAobmZfY3RfaXNfdW50cmFja2VkKHNrYikpCisJCXN0YXRlYml0ID0gWFRfU1RBVEVfVU5UUkFDS0VEOworCWVsc2UgaWYgKCFuZl9jdF9nZXRfY3RpbmZvKHNrYiwgJmN0aW5mbykpCisJCXN0YXRlYml0ID0gWFRfU1RBVEVfSU5WQUxJRDsKKwllbHNlCisJCXN0YXRlYml0ID0gWFRfU1RBVEVfQklUKGN0aW5mbyk7CisKKwlyZXR1cm4gKHNpbmZvLT5zdGF0ZW1hc2sgJiBzdGF0ZWJpdCk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqdGFibGVuYW1lLAorCQkgY29uc3Qgdm9pZCAqaXAsCisJCSB2b2lkICptYXRjaGluZm8sCisJCSB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCQkgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfc3RhdGVfaW5mbykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHN0YXRlX21hdGNoID0geworCS5uYW1lCQk9ICJzdGF0ZSIsCisJLm1hdGNoCQk9ICZtYXRjaCwKKwkuY2hlY2tlbnRyeQk9ICZjaGVjaywKKwkubWUJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHN0YXRlNl9tYXRjaCA9IHsKKwkubmFtZQkJPSAic3RhdGUiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2ssCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwluZWVkX2Nvbm50cmFjaygpOworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnN0YXRlX21hdGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmc3RhdGU2X21hdGNoKTsKKwlpZiAocmV0IDwgMCkKKwkJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCZzdGF0ZV9tYXRjaCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnN0YXRlX21hdGNoKTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmc3RhdGU2X21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RyaW5nLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0cmluZy5jCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIG5ldC9pcHY0L25ldGZpbHRlci9pcHRfc3RyaW5nLmMKcmVuYW1lIHRvIG5ldC9uZXRmaWx0ZXIveHRfc3RyaW5nLmMKaW5kZXggYjVkZWYyMC4uN2M3ZDVjOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9zdHJpbmcuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0cmluZy5jCkBAIC0xMSwyMyArMTEsMjYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3RleHRzZWFyY2guaD4KIAogTU9EVUxFX0FVVEhPUigiUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQGV1cm9kZXYubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJUCB0YWJsZXMgc3RyaW5nIG1hdGNoIG1vZHVsZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJpcHRfc3RyaW5nIik7CitNT0RVTEVfQUxJQVMoImlwNnRfc3RyaW5nIik7CiAKIHN0YXRpYyBpbnQgbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKIAkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCiAJCSBjb25zdCB2b2lkICptYXRjaGluZm8sCiAJCSBpbnQgb2Zmc2V0LAorCQkgdW5zaWduZWQgaW50IHByb3RvZmYsCiAJCSBpbnQgKmhvdGRyb3ApCiB7CiAJc3RydWN0IHRzX3N0YXRlIHN0YXRlOwotCXN0cnVjdCBpcHRfc3RyaW5nX2luZm8gKmNvbmYgPSAoc3RydWN0IGlwdF9zdHJpbmdfaW5mbyAqKSBtYXRjaGluZm87CisJc3RydWN0IHh0X3N0cmluZ19pbmZvICpjb25mID0gKHN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqKSBtYXRjaGluZm87CiAKIAltZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RydWN0IHRzX3N0YXRlKSk7CiAKQEAgLTM2LDE4ICszOSwxOCBAQAogCQkJICAgICAhPSBVSU5UX01BWCkgJiYgIWNvbmYtPmludmVydDsKIH0KIAotI2RlZmluZSBTVFJJTkdfVEVYVF9QUklWKG0pICgoc3RydWN0IGlwdF9zdHJpbmdfaW5mbyAqKSBtKQorI2RlZmluZSBTVFJJTkdfVEVYVF9QUklWKG0pICgoc3RydWN0IHh0X3N0cmluZ19pbmZvICopIG0pCiAKIHN0YXRpYyBpbnQgY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwLAorCQkgICAgICBjb25zdCB2b2lkICppcCwKIAkJICAgICAgdm9pZCAqbWF0Y2hpbmZvLAogCQkgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAogCQkgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQogewotCXN0cnVjdCBpcHRfc3RyaW5nX2luZm8gKmNvbmYgPSBtYXRjaGluZm87CisJc3RydWN0IHh0X3N0cmluZ19pbmZvICpjb25mID0gbWF0Y2hpbmZvOwogCXN0cnVjdCB0c19jb25maWcgKnRzX2NvbmY7CiAKLQlpZiAobWF0Y2hzaXplICE9IElQVF9BTElHTihzaXplb2Yoc3RydWN0IGlwdF9zdHJpbmdfaW5mbykpKQorCWlmIChtYXRjaHNpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF9zdHJpbmdfaW5mbykpKQogCQlyZXR1cm4gMDsKIAogCS8qIERhbW4sIGNhbid0IGhhbmRsZSB0aGlzIGNhc2UgcHJvcGVybHkgd2l0aCBpcHRhYmxlcy4uLiAqLwpAQCAtNjksNyArNzIsMTQgQEAKIAl0ZXh0c2VhcmNoX2Rlc3Ryb3koU1RSSU5HX1RFWFRfUFJJVihtYXRjaGluZm8pLT5jb25maWcpOwogfQogCi1zdGF0aWMgc3RydWN0IGlwdF9tYXRjaCBzdHJpbmdfbWF0Y2ggPSB7CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHN0cmluZ19tYXRjaCA9IHsKKwkubmFtZSAJCT0gInN0cmluZyIsCisJLm1hdGNoIAkJPSBtYXRjaCwKKwkuY2hlY2tlbnRyeQk9IGNoZWNrZW50cnksCisJLmRlc3Ryb3kgCT0gZGVzdHJveSwKKwkubWUgCQk9IFRISVNfTU9EVUxFCit9Oworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBzdHJpbmc2X21hdGNoID0gewogCS5uYW1lIAkJPSAic3RyaW5nIiwKIAkubWF0Y2ggCQk9IG1hdGNoLAogCS5jaGVja2VudHJ5CT0gY2hlY2tlbnRyeSwKQEAgLTc5LDEyICs4OSwyMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGlwdF9yZWdpc3Rlcl9tYXRjaCgmc3RyaW5nX21hdGNoKTsKKwlpbnQgcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnN0cmluZ19tYXRjaCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnN0cmluZzZfbWF0Y2gpOworCWlmIChyZXQpCisJCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnN0cmluZ19tYXRjaCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmluaSh2b2lkKQogewotCWlwdF91bnJlZ2lzdGVyX21hdGNoKCZzdHJpbmdfbWF0Y2gpOworCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnN0cmluZ19tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnN0cmluZzZfbWF0Y2gpOwogfQogCiBtb2R1bGVfaW5pdChpbml0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfdGNwbXNzLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3RjcG1zcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjdmNTMzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF90Y3Btc3MuYwpAQCAtMCwwICsxLDE3MiBAQAorLyogS2VybmVsIG1vZHVsZSB0byBtYXRjaCBUQ1AgTVNTIHZhbHVlcy4gKi8KKworLyogQ29weXJpZ2h0IChDKSAyMDAwIE1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPgorICogUG9ydGlvbnMgKEMpIDIwMDUgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcG1zcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oPgorCisjZGVmaW5lIFRIX1NZTiAweDAyCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIk1hcmMgQm91Y2hlciA8bWFyY0BtYnNpLmNhPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJpcHRhYmxlcyBUQ1AgTVNTIG1hdGNoIG1vZHVsZSIpOworTU9EVUxFX0FMSUFTKCJpcHRfdGNwbXNzIik7CisKKy8qIFJldHVybnMgMSBpZiB0aGUgbXNzIG9wdGlvbiBpcyBzZXQgYW5kIG1hdGNoZWQgYnkgdGhlIHJhbmdlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQKK21zc29wdGlvbl9tYXRjaCh1X2ludDE2X3QgbWluLCB1X2ludDE2X3QgbWF4LAorCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQl1bnNpZ25lZCBpbnQgcHJvdG9mZiwKKwkJaW50IGludmVydCwKKwkJaW50ICpob3Rkcm9wKQoreworCXN0cnVjdCB0Y3BoZHIgX3RjcGgsICp0aDsKKwkvKiB0Y3AuZG9mZiBpcyBvbmx5IDQgYml0cywgaWUuIG1heCAxNSAqIDQgYnl0ZXMgKi8KKwl1OCBfb3B0WzE1ICogNCAtIHNpemVvZihfdGNwaCldLCAqb3A7CisJdW5zaWduZWQgaW50IGksIG9wdGxlbjsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgdGhlIHdob2xlIGhlYWRlciwgZHJvcCBwYWNrZXQuICovCisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCWlmICh0aCA9PSBOVUxMKQorCQlnb3RvIGRyb3BpdDsKKworCS8qIE1hbGZvcm1lZC4gKi8KKwlpZiAodGgtPmRvZmYqNCA8IHNpemVvZigqdGgpKQorCQlnb3RvIGRyb3BpdDsKKworCW9wdGxlbiA9IHRoLT5kb2ZmKjQgLSBzaXplb2YoKnRoKTsKKwlpZiAoIW9wdGxlbikKKwkJZ290byBvdXQ7CisKKwkvKiBUcnVuY2F0ZWQgb3B0aW9ucy4gKi8KKwlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYgKyBzaXplb2YoKnRoKSwgb3B0bGVuLCBfb3B0KTsKKwlpZiAob3AgPT0gTlVMTCkKKwkJZ290byBkcm9waXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuOyApIHsKKwkJaWYgKG9wW2ldID09IFRDUE9QVF9NU1MKKwkJICAgICYmIChvcHRsZW4gLSBpKSA+PSBUQ1BPTEVOX01TUworCQkgICAgJiYgb3BbaSsxXSA9PSBUQ1BPTEVOX01TUykgeworCQkJdV9pbnQxNl90IG1zc3ZhbDsKKworCQkJbXNzdmFsID0gKG9wW2krMl0gPDwgOCkgfCBvcFtpKzNdOworCQkJCisJCQlyZXR1cm4gKG1zc3ZhbCA+PSBtaW4gJiYgbXNzdmFsIDw9IG1heCkgXiBpbnZlcnQ7CisJCX0KKwkJaWYgKG9wW2ldIDwgMikgaSsrOworCQllbHNlIGkgKz0gb3BbaSsxXT86MTsKKwl9CitvdXQ6CisJcmV0dXJuIGludmVydDsKKworIGRyb3BpdDoKKwkqaG90ZHJvcCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgaW50IG9mZnNldCwKKyAgICAgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorICAgICAgaW50ICpob3Rkcm9wKQoreworCWNvbnN0IHN0cnVjdCB4dF90Y3Btc3NfbWF0Y2hfaW5mbyAqaW5mbyA9IG1hdGNoaW5mbzsKKworCXJldHVybiBtc3NvcHRpb25fbWF0Y2goaW5mby0+bXNzX21pbiwgaW5mby0+bXNzX21heCwgc2tiLCBwcm90b2ZmLAorCQkJICAgICAgIGluZm8tPmludmVydCwgaG90ZHJvcCk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorICAgICAgICAgICBjb25zdCB2b2lkICppcGluZm8sCisgICAgICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKyAgICAgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKyAgICAgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGlwaW5mbzsKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfdGNwbXNzX21hdGNoX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBNdXN0IHNwZWNpZnkgLXAgdGNwICovCisJaWYgKGlwLT5wcm90byAhPSBJUFBST1RPX1RDUCB8fCAoaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpIHsKKwkJcHJpbnRrKCJ0Y3Btc3M6IE9ubHkgd29ya3Mgb24gVENQIHBhY2tldHNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY2hlY2tlbnRyeTYoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgIGNvbnN0IHZvaWQgKmlwaW5mbywKKyAgICAgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorICAgICAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXAgPSBpcGluZm87CisKKwlpZiAobWF0Y2hzaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfdGNwbXNzX21hdGNoX2luZm8pKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBNdXN0IHNwZWNpZnkgLXAgdGNwICovCisJaWYgKGlwLT5wcm90byAhPSBJUFBST1RPX1RDUCB8fCAoaXAtPmludmZsYWdzICYgWFRfSU5WX1BST1RPKSkgeworCQlwcmludGsoInRjcG1zczogT25seSB3b3JrcyBvbiBUQ1AgcGFja2V0c1xuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHRjcG1zc19tYXRjaCA9IHsKKwkubmFtZQkJPSAidGNwbXNzIiwKKwkubWF0Y2gJCT0gJm1hdGNoLAorCS5jaGVja2VudHJ5CT0gJmNoZWNrZW50cnksCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCB0Y3Btc3M2X21hdGNoID0geworCS5uYW1lCQk9ICJ0Y3Btc3MiLAorCS5tYXRjaAkJPSAmbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmY2hlY2tlbnRyeTYsCisJLm1lCQk9IFRISVNfTU9EVUxFLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdGNwbXNzX21hdGNoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZ0Y3Btc3M2X21hdGNoKTsKKwlpZiAocmV0KQorCQl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ0Y3Btc3NfbWF0Y2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdGNwbXNzNl9tYXRjaCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdGNwbXNzX21hdGNoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3RjcHVkcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjg2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3RjcHVkcC5jCkBAIC0wLDAgKzEsMzMzIEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X3RjcHVkcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJ4X3RhYmxlcyBtYXRjaCBmb3IgVENQIGFuZCBVRFAsIHN1cHBvcnRzIElQdjQgYW5kIElQdjYiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygieHRfdGNwIik7CitNT0RVTEVfQUxJQVMoInh0X3VkcCIpOworTU9EVUxFX0FMSUFTKCJpcHRfdWRwIik7CitNT0RVTEVfQUxJQVMoImlwdF90Y3AiKTsKK01PRFVMRV9BTElBUygiaXA2dF91ZHAiKTsKK01PRFVMRV9BTElBUygiaXA2dF90Y3AiKTsKKworI2lmZGVmIERFQlVHX0lQX0ZJUkVXQUxMX1VTRVIKKyNkZWZpbmUgZHVwcmludGYoZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoZm9ybWF0ICwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIGR1cHJpbnRmKGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCisKKy8qIFJldHVybnMgMSBpZiB0aGUgcG9ydCBpcyBtYXRjaGVkIGJ5IHRoZSByYW5nZSwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citwb3J0X21hdGNoKHVfaW50MTZfdCBtaW4sIHVfaW50MTZfdCBtYXgsIHVfaW50MTZfdCBwb3J0LCBpbnQgaW52ZXJ0KQoreworCWludCByZXQ7CisKKwlyZXQgPSAocG9ydCA+PSBtaW4gJiYgcG9ydCA8PSBtYXgpIF4gaW52ZXJ0OworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3RjcF9maW5kX29wdGlvbih1X2ludDhfdCBvcHRpb24sCisJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCXVuc2lnbmVkIGludCBwcm90b2ZmLAorCQl1bnNpZ25lZCBpbnQgb3B0bGVuLAorCQlpbnQgaW52ZXJ0LAorCQlpbnQgKmhvdGRyb3ApCit7CisJLyogdGNwLmRvZmYgaXMgb25seSA0IGJpdHMsIGllLiBtYXggMTUgKiA0IGJ5dGVzICovCisJdV9pbnQ4X3QgX29wdFs2MCAtIHNpemVvZihzdHJ1Y3QgdGNwaGRyKV0sICpvcDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWR1cHJpbnRmKCJ0Y3BfbWF0Y2g6IGZpbmRpbmcgb3B0aW9uXG4iKTsKKworCWlmICghb3B0bGVuKQorCQlyZXR1cm4gaW52ZXJ0OworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgd2hvbGUgaGVhZGVyLCBkcm9wIHBhY2tldC4gKi8KKwlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHByb3RvZmYgKyBzaXplb2Yoc3RydWN0IHRjcGhkciksCisJCQkJb3B0bGVuLCBfb3B0KTsKKwlpZiAob3AgPT0gTlVMTCkgeworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47ICkgeworCQlpZiAob3BbaV0gPT0gb3B0aW9uKSByZXR1cm4gIWludmVydDsKKwkJaWYgKG9wW2ldIDwgMikgaSsrOworCQllbHNlIGkgKz0gb3BbaSsxXT86MTsKKwl9CisKKwlyZXR1cm4gaW52ZXJ0OworfQorCitzdGF0aWMgaW50Cit0Y3BfbWF0Y2goY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICBjb25zdCB2b2lkICptYXRjaGluZm8sCisJICBpbnQgb2Zmc2V0LAorCSAgdW5zaWduZWQgaW50IHByb3RvZmYsCisJICBpbnQgKmhvdGRyb3ApCit7CisJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCWNvbnN0IHN0cnVjdCB4dF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87CisKKwlpZiAob2Zmc2V0KSB7CisJCS8qIFRvIHF1b3RlIEFsYW46CisKKwkJICAgRG9uJ3QgYWxsb3cgYSBmcmFnbWVudCBvZiBUQ1AgOCBieXRlcyBpbi4gTm9ib2R5IG5vcm1hbAorCQkgICBjYXVzZXMgdGhpcy4gSXRzIGEgY3JhY2tlciB0cnlpbmcgdG8gYnJlYWsgaW4gYnkgZG9pbmcgYQorCQkgICBmbGFnIG92ZXJ3cml0ZSB0byBwYXNzIHRoZSBkaXJlY3Rpb24gY2hlY2tzLgorCQkqLworCQlpZiAob2Zmc2V0ID09IDEpIHsKKwkJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFRDUCBvZmZzZXQ9MSBmcmFnLlxuIik7CisJCQkqaG90ZHJvcCA9IDE7CisJCX0KKwkJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisjZGVmaW5lIEZXSU5WVENQKGJvb2wsaW52ZmxnKSAoKGJvb2wpIF4gISEodGNwaW5mby0+aW52ZmxhZ3MgJiBpbnZmbGcpKQorCisJdGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBwcm90b2ZmLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCWlmICh0aCA9PSBOVUxMKSB7CisJCS8qIFdlJ3ZlIGJlZW4gYXNrZWQgdG8gZXhhbWluZSB0aGlzIHBhY2tldCwgYW5kIHdlCisJCSAgIGNhbid0LiAgSGVuY2UsIG5vIGNob2ljZSBidXQgdG8gZHJvcC4gKi8KKwkJZHVwcmludGYoIkRyb3BwaW5nIGV2aWwgVENQIG9mZnNldD0wIHRpbnlncmFtLlxuIik7CisJCSpob3Rkcm9wID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFwb3J0X21hdGNoKHRjcGluZm8tPnNwdHNbMF0sIHRjcGluZm8tPnNwdHNbMV0sCisJCQludG9ocyh0aC0+c291cmNlKSwKKwkJCSEhKHRjcGluZm8tPmludmZsYWdzICYgWFRfVENQX0lOVl9TUkNQVCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXBvcnRfbWF0Y2godGNwaW5mby0+ZHB0c1swXSwgdGNwaW5mby0+ZHB0c1sxXSwKKwkJCW50b2hzKHRoLT5kZXN0KSwKKwkJCSEhKHRjcGluZm8tPmludmZsYWdzICYgWFRfVENQX0lOVl9EU1RQVCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIUZXSU5WVENQKCgoKHVuc2lnbmVkIGNoYXIgKil0aClbMTNdICYgdGNwaW5mby0+ZmxnX21hc2spCisJCSAgICAgID09IHRjcGluZm8tPmZsZ19jbXAsCisJCSAgICAgIFhUX1RDUF9JTlZfRkxBR1MpKQorCQlyZXR1cm4gMDsKKwlpZiAodGNwaW5mby0+b3B0aW9uKSB7CisJCWlmICh0aC0+ZG9mZiAqIDQgPCBzaXplb2YoX3RjcGgpKSB7CisJCQkqaG90ZHJvcCA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXRjcF9maW5kX29wdGlvbih0Y3BpbmZvLT5vcHRpb24sIHNrYiwgcHJvdG9mZiwKKwkJCQkgICAgIHRoLT5kb2ZmKjQgLSBzaXplb2YoX3RjcGgpLAorCQkJCSAgICAgdGNwaW5mby0+aW52ZmxhZ3MgJiBYVF9UQ1BfSU5WX09QVElPTiwKKwkJCQkgICAgIGhvdGRyb3ApKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50Cit0Y3BfY2hlY2tlbnRyeShjb25zdCBjaGFyICp0YWJsZW5hbWUsCisJICAgICAgIGNvbnN0IHZvaWQgKmluZm8sCisJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoc2l6ZSwKKwkgICAgICAgdW5zaWduZWQgaW50IGhvb2tfbWFzaykKK3sKKwljb25zdCBzdHJ1Y3QgaXB0X2lwICppcCA9IGluZm87CisJY29uc3Qgc3RydWN0IHh0X3RjcCAqdGNwaW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBUQ1AsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCisJcmV0dXJuIGlwLT5wcm90byA9PSBJUFBST1RPX1RDUAorCQkmJiAhKGlwLT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykKKwkJJiYgbWF0Y2hzaXplID09IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfdGNwKSkKKwkJJiYgISh0Y3BpbmZvLT5pbnZmbGFncyAmIH5YVF9UQ1BfSU5WX01BU0spOworfQorCisvKiBDYWxsZWQgd2hlbiB1c2VyIHRyaWVzIHRvIGluc2VydCBhbiBlbnRyeSBvZiB0aGlzIHR5cGUuICovCitzdGF0aWMgaW50Cit0Y3A2X2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICplbnRyeSwKKwkgICAgICAgdm9pZCAqbWF0Y2hpbmZvLAorCSAgICAgICB1bnNpZ25lZCBpbnQgbWF0Y2hzaXplLAorCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaXB2NiA9IGVudHJ5OworCWNvbnN0IHN0cnVjdCB4dF90Y3AgKnRjcGluZm8gPSBtYXRjaGluZm87CisKKwkvKiBNdXN0IHNwZWNpZnkgcHJvdG8gPT0gVENQLCBhbmQgbm8gdW5rbm93biBpbnZmbGFncyAqLworCXJldHVybiBpcHY2LT5wcm90byA9PSBJUFBST1RPX1RDUAorCQkmJiAhKGlwdjYtPmludmZsYWdzICYgWFRfSU5WX1BST1RPKQorCQkmJiBtYXRjaHNpemUgPT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF90Y3ApKQorCQkmJiAhKHRjcGluZm8tPmludmZsYWdzICYgflhUX1RDUF9JTlZfTUFTSyk7Cit9CisKKworc3RhdGljIGludAordWRwX21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCisJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgY29uc3Qgdm9pZCAqbWF0Y2hpbmZvLAorCSAgaW50IG9mZnNldCwKKwkgIHVuc2lnbmVkIGludCBwcm90b2ZmLAorCSAgaW50ICpob3Rkcm9wKQoreworCXN0cnVjdCB1ZHBoZHIgX3VkcGgsICp1aDsKKwljb25zdCBzdHJ1Y3QgeHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBub3QgYmUgYSBmcmFnbWVudC4gKi8KKwlpZiAob2Zmc2V0KQorCQlyZXR1cm4gMDsKKworCXVoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgcHJvdG9mZiwgc2l6ZW9mKF91ZHBoKSwgJl91ZHBoKTsKKwlpZiAodWggPT0gTlVMTCkgeworCQkvKiBXZSd2ZSBiZWVuIGFza2VkIHRvIGV4YW1pbmUgdGhpcyBwYWNrZXQsIGFuZCB3ZQorCQkgICBjYW4ndC4gIEhlbmNlLCBubyBjaG9pY2UgYnV0IHRvIGRyb3AuICovCisJCWR1cHJpbnRmKCJEcm9wcGluZyBldmlsIFVEUCB0aW55Z3JhbS5cbiIpOworCQkqaG90ZHJvcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBwb3J0X21hdGNoKHVkcGluZm8tPnNwdHNbMF0sIHVkcGluZm8tPnNwdHNbMV0sCisJCQkgIG50b2hzKHVoLT5zb3VyY2UpLAorCQkJICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIFhUX1VEUF9JTlZfU1JDUFQpKQorCQkmJiBwb3J0X21hdGNoKHVkcGluZm8tPmRwdHNbMF0sIHVkcGluZm8tPmRwdHNbMV0sCisJCQkgICAgICBudG9ocyh1aC0+ZGVzdCksCisJCQkgICAgICAhISh1ZHBpbmZvLT5pbnZmbGFncyAmIFhUX1VEUF9JTlZfRFNUUFQpKTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAordWRwX2NoZWNrZW50cnkoY29uc3QgY2hhciAqdGFibGVuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICppbmZvLAorCSAgICAgICB2b2lkICptYXRjaGluZm8sCisJICAgICAgIHVuc2lnbmVkIGludCBtYXRjaGluZm9zaXplLAorCSAgICAgICB1bnNpZ25lZCBpbnQgaG9va19tYXNrKQoreworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gaW5mbzsKKwljb25zdCBzdHJ1Y3QgeHRfdWRwICp1ZHBpbmZvID0gbWF0Y2hpbmZvOworCisJLyogTXVzdCBzcGVjaWZ5IHByb3RvID09IFVEUCwgYW5kIG5vIHVua25vd24gaW52ZmxhZ3MgKi8KKwlpZiAoaXAtPnByb3RvICE9IElQUFJPVE9fVURQIHx8IChpcC0+aW52ZmxhZ3MgJiBYVF9JTlZfUFJPVE8pKSB7CisJCWR1cHJpbnRmKCJpcHRfdWRwOiBQcm90b2NvbCAldSAhPSAldVxuIiwgaXAtPnByb3RvLAorCQkJIElQUFJPVE9fVURQKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtYXRjaGluZm9zaXplICE9IFhUX0FMSUdOKHNpemVvZihzdHJ1Y3QgeHRfdWRwKSkpIHsKKwkJZHVwcmludGYoImlwdF91ZHA6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKKwkJCSBtYXRjaGluZm9zaXplLCBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3VkcCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh1ZHBpbmZvLT5pbnZmbGFncyAmIH5YVF9VRFBfSU5WX01BU0spIHsKKwkJZHVwcmludGYoImlwdF91ZHA6IHVua25vd24gZmxhZ3MgJVhcbiIsCisJCQkgdWRwaW5mby0+aW52ZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogQ2FsbGVkIHdoZW4gdXNlciB0cmllcyB0byBpbnNlcnQgYW4gZW50cnkgb2YgdGhpcyB0eXBlLiAqLworc3RhdGljIGludAordWRwNl9jaGVja2VudHJ5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKKwkgICAgICAgY29uc3Qgdm9pZCAqZW50cnksCisJICAgICAgIHZvaWQgKm1hdGNoaW5mbywKKwkgICAgICAgdW5zaWduZWQgaW50IG1hdGNoaW5mb3NpemUsCisJICAgICAgIHVuc2lnbmVkIGludCBob29rX21hc2spCit7CisJY29uc3Qgc3RydWN0IGlwNnRfaXA2ICppcHY2ID0gZW50cnk7CisJY29uc3Qgc3RydWN0IHh0X3VkcCAqdWRwaW5mbyA9IG1hdGNoaW5mbzsKKworCS8qIE11c3Qgc3BlY2lmeSBwcm90byA9PSBVRFAsIGFuZCBubyB1bmtub3duIGludmZsYWdzICovCisJaWYgKGlwdjYtPnByb3RvICE9IElQUFJPVE9fVURQIHx8IChpcHY2LT5pbnZmbGFncyAmIFhUX0lOVl9QUk9UTykpIHsKKwkJZHVwcmludGYoImlwNnRfdWRwOiBQcm90b2NvbCAldSAhPSAldVxuIiwgaXB2Ni0+cHJvdG8sCisJCQkgSVBQUk9UT19VRFApOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKG1hdGNoaW5mb3NpemUgIT0gWFRfQUxJR04oc2l6ZW9mKHN0cnVjdCB4dF91ZHApKSkgeworCQlkdXByaW50ZigiaXA2dF91ZHA6IG1hdGNoc2l6ZSAldSAhPSAldVxuIiwKKwkJCSBtYXRjaGluZm9zaXplLCBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X3VkcCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICh1ZHBpbmZvLT5pbnZmbGFncyAmIH5YVF9VRFBfSU5WX01BU0spIHsKKwkJZHVwcmludGYoImlwNnRfdWRwOiB1bmtub3duIGZsYWdzICVYXG4iLAorCQkJIHVkcGluZm8tPmludmZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdGNwX21hdGNoc3RydWN0ID0geworCS5uYW1lCQk9ICJ0Y3AiLAorCS5tYXRjaAkJPSAmdGNwX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJnRjcF9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHRjcDZfbWF0Y2hzdHJ1Y3QgPSB7CisJLm5hbWUJCT0gInRjcCIsCisJLm1hdGNoCQk9ICZ0Y3BfbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmdGNwNl9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggdWRwX21hdGNoc3RydWN0ID0geworCS5uYW1lCQk9ICJ1ZHAiLAorCS5tYXRjaAkJPSAmdWRwX21hdGNoLAorCS5jaGVja2VudHJ5CT0gJnVkcF9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CitzdGF0aWMgc3RydWN0IHh0X21hdGNoIHVkcDZfbWF0Y2hzdHJ1Y3QgPSB7CisJLm5hbWUJCT0gInVkcCIsCisJLm1hdGNoCQk9ICZ1ZHBfbWF0Y2gsCisJLmNoZWNrZW50cnkJPSAmdWRwNl9jaGVja2VudHJ5LAorCS5tZQkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ0Y3BfbWF0Y2hzdHJ1Y3QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB4dF9yZWdpc3Rlcl9tYXRjaChBRl9JTkVUNiwgJnRjcDZfbWF0Y2hzdHJ1Y3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnX3RjcDsKKworCXJldCA9IHh0X3JlZ2lzdGVyX21hdGNoKEFGX0lORVQsICZ1ZHBfbWF0Y2hzdHJ1Y3QpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnX3RjcDY7CisJCisJcmV0ID0geHRfcmVnaXN0ZXJfbWF0Y2goQUZfSU5FVDYsICZ1ZHA2X21hdGNoc3RydWN0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF91bnJlZ191ZHA7CisKKwlyZXR1cm4gcmV0OworCitvdXRfdW5yZWdfdWRwOgorCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcF9tYXRjaHN0cnVjdCk7CitvdXRfdW5yZWdfdGNwNjoKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdGNwNl9tYXRjaHN0cnVjdCk7CitvdXRfdW5yZWdfdGNwOgorCXh0X3VucmVnaXN0ZXJfbWF0Y2goQUZfSU5FVCwgJnRjcF9tYXRjaHN0cnVjdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZpbmkodm9pZCkKK3sKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdWRwNl9tYXRjaHN0cnVjdCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdWRwX21hdGNoc3RydWN0KTsKKwl4dF91bnJlZ2lzdGVyX21hdGNoKEFGX0lORVQ2LCAmdGNwNl9tYXRjaHN0cnVjdCk7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaChBRl9JTkVULCAmdGNwX21hdGNoc3RydWN0KTsKK30KKworbW9kdWxlX2luaXQoaW5pdCk7Cittb2R1bGVfZXhpdChmaW5pKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfaXB0LmMgYi9uZXQvc2NoZWQvYWN0X2lwdC5jCmluZGV4IGI1MDAxOTMuLjM5YTIyYTMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfaXB0LmMKKysrIGIvbmV0L3NjaGVkL2FjdF9pcHQuYwpAQCAtNjIsNyArNjIsNyBAQAogCXN0cnVjdCBpcHRfdGFyZ2V0ICp0YXJnZXQ7CiAJaW50IHJldCA9IDA7CiAKLQl0YXJnZXQgPSBpcHRfZmluZF90YXJnZXQodC0+dS51c2VyLm5hbWUsIHQtPnUudXNlci5yZXZpc2lvbik7CisJdGFyZ2V0ID0geHRfZmluZF90YXJnZXQoQUZfSU5FVCwgdC0+dS51c2VyLm5hbWUsIHQtPnUudXNlci5yZXZpc2lvbik7CiAJaWYgKCF0YXJnZXQpCiAJCXJldHVybiAtRU5PRU5UOwogCg==