ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNwaS1ob3RrZXkudHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDQwZmEuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1kcml2ZXIvYWNwaS9ob3RrZXkuYyBpbXBsZW1lbnQ6Ci0xLiAvcHJvYy9hY3BpL2hvdGtleS9ldmVudF9jb25maWcgCi0oZXZlbnQgYmFzZWQgaG90a2V5IG9yIGV2ZW50IGNvbmZpZyBpbnRlcmZhY2UpOgotYS4gYWRkIGEgIGV2ZW50IGJhc2VkIGhvdGtleShldmVudCkgOiAKLWVjaG8gIjA6YnVzOjphY3Rpb246bWV0aG9kOm51bTpudW0iID4gZXZlbnRfY29uZmlnCi0KLWIuIGRlbGV0ZSBhIGV2ZW50IGJhc2VkIGhvdGtleShldmVudCk6IAotZWNobyAiMTo6Ojo6bnVtOm51bSIgPiBldmVudF9jb25maWcKLQotYy4gIG1vZGlmeSBhIGV2ZW50IGJhc2VkIGhvdGtleShldmVudCk6ICAgIAotZWNobyAiMjpidXM6OmFjdGlvbjptZXRob2Q6bnVtOm51bSIgPiBldmVudF9jb25maWcKLQotMi4gL3Byb2MvYWNwaS9ob3RrZXkvcG9sbF9jb25maWcgCi0ocG9sbGluZyBiYXNlZCBob3RrZXkgb3IgZXZlbnQgY29uZmlnIGludGVyZmFjZSk6Ci1hLmFkZCBhIHBvbGxpbmcgYmFzZWQgaG90a2V5KGV2ZW50KSA6IAkKLWVjaG8gIjA6YnVzOm1ldGhvZDphY3Rpb246bWV0aG9kOm51bSIgPiBwb2xsX2NvbmZpZwotdGhpcyBhZGRpbmcgY29tbWFuZCB3aWxsIGNyZWF0ZSBhIHByb2MgZmlsZSAKLS9wcm9jL2FjcGkvaG90a2V5L21ldGhvZCwgd2hpY2ggaXMgdXNlZCB0byBnZXQgCi1yZXN1bHQgb2YgcG9sbGluZy4KLQotYi5kZWxldGUgYSBwb2xsaW5nIGJhc2VkIGhvdGtleShldmVudCk6IAkKLWVjaG8gIjE6Ojo6Om51bSIgPiBldmVudF9jb25maWcKLQotYy5tb2RpZnkgYSBwb2xsaW5nIGJhc2VkIGhvdGtleShldmVudCk6ICAgIAotZWNobyAiMjpidXM6bWV0aG9kOmFjdGlvbjptZXRob2Q6bnVtIiA+IHBvbGxfY29uZmlnCi0KLTMuL3Byb2MvYWNwaS9ob3RrZXkvYWN0aW9uIAotKGludGVyZmFjZSB0byBjYWxsIGFtbCBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIGEgCi1zcGVjaWZpYyBob3RrZXkoZXZlbnQpKQotZWNobyAiZXZlbnRfbnVtOmV2ZW50X3R5cGU6ZXZlbnRfYXJndW1lbnQiID4gCi0JL3Byb2MvYWNwaS9ob3RrZXkvYWN0aW9uLgotVGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgYW1sIG1ldGhvZCBpcyAKLWF0dGFjaGVkIHRvIC9wcm9jL2FjcGkvaG90a2V5L3BvbGxfbWV0aG9kLCB3aGljaCBpcyBkeW5hbWljYWxseQotY3JlYXRlZC4gIFBsZWFzZSB1c2UgY29tbWFuZCAiY2F0IC9wcm9jL2FjcGkvaG90a2V5L3BvbGxpbmdfbWV0aG9kIiAKLXRvIHJldHJpZXZlIGl0LgotCi1Ob3RlOiBVc2UgY21kbGluZSAiYWNwaV9nZW5lcmljX2hvdGtleSIgdG8gb3Zlci1yaWRlCi1wbGF0Zm9ybS1zcGVjaWZpYyB3aXRoIGdlbmVyaWMgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IGM1ODVhYTguLjI4Zjg5N2YgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTI1MywyOSArMjUzLDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLTw8PDw8PDwgdGVzdDpEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKLVdoYXQ6CUFDUEkgaG90a2V5IGRyaXZlciAoQ09ORklHX0FDUElfSE9US0VZKQotV2hlbjoJMi42LjIxCi1XaHk6CWhvdGtleS5jIHdhcyBhbiBhdHRlbXB0IHRvIGNvbnNvbGlkYXRlIG11bHRpcGxlIGRyaXZlcnMgdGhhdCB1c2UKLQlBQ1BJIHRvIGltcGxlbWVudCBob3RrZXlzLiAgSG93ZXZlciwgaG90a2V5cyBhcmUgbm90IGRvY3VtZW50ZWQKLQlpbiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLCBzbyB0aGUgZHJpdmVycyB1c2VkIHVuZG9jdW1lbnRlZAotCXZlbmRvci1zcGVjaWZpYyBob29rcyBhbmQgdHVybmVkIG91dCB0byBiZSBtb3JlIGRpZmZlcmVudCB0aGFuCi0JdGhlIHNhbWUuCi0KLQlGdXJ0aGVyLCB0aGUga2V5cyBhbmQgdGhlIGZlYXR1cmVzIHN1cHBsaWVkIGJ5IGVhY2ggcGxhdGZvcm0KLQlhcmUgZGlmZmVyZW50LCBzbyB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhIG5lZWQgZm9yCi0JcGxhdGZvcm0tc3BlY2lmaWMgZHJpdmVycy4KLQotCVNvIHRoZSBuZXcgcGxhbiBpcyB0byBkZWxldGUgaG90a2V5LmMgYW5kIGluc3RlYWQsIHdvcmsgb24gdGhlCi0JcGxhdGZvcm0gc3BlY2lmaWMgZHJpdmVycyB0byB0cnkgdG8gbWFrZSB0aGVtIGxvb2sgdGhlIHNhbWUKLQl0byB0aGUgdXNlciB3aGVuIHRoZXkgc3VwcGx5IHRoZSBzYW1lIGZlYXR1cmVzLgotCi0JaG90a2V5LmMgaGFzIGFsd2F5cyBkZXBlbmRlZCBvbiBDT05GSUdfRVhQRVJJTUVOVEFMCi0KLVdobzoJTGVuIEJyb3duIDxsZW4uYnJvd25AaW50ZWwuY29tPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJL3N5cy9maXJtd2FyZS9hY3BpL25hbWVzcGFjZQogV2hlbjoJMi42LjIxCiBXaHk6CVRoZSBBQ1BJIG5hbWVzcGFjZSBpcyBlZmZlY3RpdmVseSB0aGUgc3ltYm9sIGxpc3QgZm9yCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9ncGlvLnR4dAppbmRleCAwOWRkNTEwLi41NzZjZTQ2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2dwaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZ3Bpby50eHQKQEAgLTc4LDcgKzc4LDggQEAKIC0tLS0tLS0tLS0tLS0tLS0tCiBHUElPcyBhcmUgaWRlbnRpZmllZCBieSB1bnNpZ25lZCBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMC4uTUFYX0lOVC4gIFRoYXQKIHJlc2VydmVzICJuZWdhdGl2ZSIgbnVtYmVycyBmb3Igb3RoZXIgcHVycG9zZXMgbGlrZSBtYXJraW5nIHNpZ25hbHMgYXMKLSJub3QgYXZhaWxhYmxlIG9uIHRoaXMgYm9hcmQiLCBvciBpbmRpY2F0aW5nIGZhdWx0cy4KKyJub3QgYXZhaWxhYmxlIG9uIHRoaXMgYm9hcmQiLCBvciBpbmRpY2F0aW5nIGZhdWx0cy4gIENvZGUgdGhhdCBkb2Vzbid0Cit0b3VjaCB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSB0cmVhdHMgdGhlc2UgaW50ZWdlcnMgYXMgb3BhcXVlIGNvb2tpZXMuCiAKIFBsYXRmb3JtcyBkZWZpbmUgaG93IHRoZXkgdXNlIHRob3NlIGludGVnZXJzLCBhbmQgdXN1YWxseSAjZGVmaW5lIHN5bWJvbHMKIGZvciB0aGUgR1BJTyBsaW5lcyBzbyB0aGF0IGJvYXJkLXNwZWNpZmljIHNldHVwIGNvZGUgZGlyZWN0bHkgY29ycmVzcG9uZHMKQEAgLTEzOSwxMCArMTQwLDEwIEBACiBUaGUgZ2V0L3NldCBjYWxscyBoYXZlIG5vIGVycm9yIHJldHVybnMgYmVjYXVzZSAiaW52YWxpZCBHUElPIiBzaG91bGQgaGF2ZQogYmVlbiByZXBvcnRlZCBlYXJsaWVyIGluIGdwaW9fc2V0X2RpcmVjdGlvbigpLiAgSG93ZXZlciwgbm90ZSB0aGF0IG5vdCBhbGwKIHBsYXRmb3JtcyBjYW4gcmVhZCB0aGUgdmFsdWUgb2Ygb3V0cHV0IHBpbnM7IHRob3NlIHRoYXQgY2FuJ3Qgc2hvdWxkIGFsd2F5cwotcmV0dXJuIHplcm8uICBBbHNvLCB0aGVzZSBjYWxscyB3aWxsIGJlIGlnbm9yZWQgZm9yIEdQSU9zIHRoYXQgY2FuJ3Qgc2FmZWx5Ci1iZSBhY2Nlc3NlZCB3aWh0b3V0IHNsZWVwaW5nIChzZWUgYmVsb3cpLgorcmV0dXJuIHplcm8uICBBbHNvLCB1c2luZyB0aGVzZSBjYWxscyBmb3IgR1BJT3MgdGhhdCBjYW4ndCBzYWZlbHkgYmUgYWNjZXNzZWQKK3dpdGhvdXQgc2xlZXBpbmcgKHNlZSBiZWxvdykgaXMgYW4gZXJyb3IuCiAKLVBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byBvcHRpbWlzZSB0aGUgdHdvCitQbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gb3B0aW1pemUgdGhlIHR3bwogY2FsbHMgdG8gYWNjZXNzIHRoZSBHUElPIHZhbHVlIGluIGNhc2VzIHdoZXJlIHRoZSBHUElPIG51bWJlciAoYW5kIGZvcgogb3V0cHV0LCB2YWx1ZSkgYXJlIGNvbnN0YW50LiAgSXQncyBub3JtYWwgZm9yIHRoZW0gdG8gbmVlZCBvbmx5IGEgY291cGxlCiBvZiBpbnN0cnVjdGlvbnMgaW4gc3VjaCBjYXNlcyAocmVhZGluZyBvciB3cml0aW5nIGEgaGFyZHdhcmUgcmVnaXN0ZXIpLApAQCAtMjM5LDcgKzI0MCw4IEBACiBzeXN0ZW0gd2FrZXVwIGNhcGFiaWxpdGllcy4KIAogTm9uLWVycm9yIHZhbHVlcyByZXR1cm5lZCBmcm9tIGlycV90b19ncGlvKCkgd291bGQgbW9zdCBjb21tb25seSBiZSB1c2VkCi13aXRoIGdwaW9fZ2V0X3ZhbHVlKCkuCit3aXRoIGdwaW9fZ2V0X3ZhbHVlKCksIGZvciBleGFtcGxlIHRvIGluaXRpYWxpemUgb3IgdXBkYXRlIGRyaXZlciBzdGF0ZQord2hlbiB0aGUgSVJRIGlzIGVkZ2UtdHJpZ2dlcmVkLgogCiAKIApAQCAtMjYwLDkgKzI2MiwxMCBAQAogVGhlcmUgYXJlIG90aGVyIHN5c3RlbS1zcGVjaWZpYyBtZWNoYW5pc21zIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQgaGVyZSwKIGxpa2UgdGhlIGFmb3JlbWVudGlvbmVkIG9wdGlvbnMgZm9yIGlucHV0IGRlLWdsaXRjaGluZyBhbmQgd2lyZS1PUiBvdXRwdXQuCiBIYXJkd2FyZSBtYXkgc3VwcG9ydCByZWFkaW5nIG9yIHdyaXRpbmcgR1BJT3MgaW4gZ2FuZ3MsIGJ1dCB0aGF0J3MgdXN1YWxseQotY29uZmlndXJhdGlvbiBkZXBlbmRlZG50OiAgZm9yIEdQSU9zIHNoYXJpbmcgdGhlIHNhbWUgYmFuay4gIChHUElPcyBhcmUKK2NvbmZpZ3VyYXRpb24gZGVwZW5kZW50OiAgZm9yIEdQSU9zIHNoYXJpbmcgdGhlIHNhbWUgYmFuay4gIChHUElPcyBhcmUKIGNvbW1vbmx5IGdyb3VwZWQgaW4gYmFua3Mgb2YgMTYgb3IgMzIsIHdpdGggYSBnaXZlbiBTT0MgaGF2aW5nIHNldmVyYWwgc3VjaAotYmFua3MuKSAgQ29kZSByZWx5aW5nIG9uIHN1Y2ggbWVjaGFuaXNtcyB3aWxsIG5lY2Vzc2FyaWx5IGJlIG5vbnBvcnRhYmxlLgorYmFua3MuKSAgU29tZSBzeXN0ZW1zIGNhbiB0cmlnZ2VyIElSUXMgZnJvbSBvdXRwdXQgR1BJT3MuICBDb2RlIHJlbHlpbmcgb24KK3N1Y2ggbWVjaGFuaXNtcyB3aWxsIG5lY2Vzc2FyaWx5IGJlIG5vbnBvcnRhYmxlLgogCiBEeW5hbWljIGRlZmluaXRpb24gb2YgR1BJT3MgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQ7IGZvciBleGFtcGxlLCBhcwogYSBzaWRlIGVmZmVjdCBvZiBjb25maWd1cmluZyBhbiBhZGQtb24gYm9hcmQgd2l0aCBzb21lIEdQSU8gZXhwYW5kZXJzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ocnRpbWVyL3RpbWVyX3N0YXRzLnR4dCBiL0RvY3VtZW50YXRpb24vaHJ0aW1lci90aW1lcl9zdGF0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmNzgyZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHJ0aW1lci90aW1lcl9zdGF0cy50eHQKQEAgLTAsMCArMSw2OCBAQAordGltZXJfc3RhdHMgLSB0aW1lciB1c2FnZSBzdGF0aXN0aWNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGltZXJfc3RhdHMgaXMgYSBkZWJ1Z2dpbmcgZmFjaWxpdHkgdG8gbWFrZSB0aGUgdGltZXIgKGFiKXVzYWdlIGluIGEgTGludXgKK3N5c3RlbSB2aXNpYmxlIHRvIGtlcm5lbCBhbmQgdXNlcnNwYWNlIGRldmVsb3BlcnMuIEl0IGlzIG5vdCBpbnRlbmRlZCBmb3IKK3Byb2R1Y3Rpb24gdXNhZ2UgYXMgaXQgYWRkcyBzaWduaWZpY2FudCBvdmVyaGVhZCB0byB0aGUgKGhyKXRpbWVyIGNvZGUgYW5kIHRoZQorKGhyKXRpbWVyIGRhdGEgc3RydWN0dXJlcy4KKwordGltZXJfc3RhdHMgc2hvdWxkIGJlIHVzZWQgYnkga2VybmVsIGFuZCB1c2Vyc3BhY2UgZGV2ZWxvcGVycyB0byB2ZXJpZnkgdGhhdAordGhlaXIgY29kZSBkb2VzIG5vdCBtYWtlIHVuZHVseSB1c2Ugb2YgdGltZXJzLiBUaGlzIGhlbHBzIHRvIGF2b2lkIHVubmVjZXNzYXJ5Cit3YWtldXBzLCB3aGljaCBzaG91bGQgYmUgYXZvaWRlZCB0byBvcHRpbWl6ZSBwb3dlciBjb25zdW1wdGlvbi4KKworSXQgY2FuIGJlIGVuYWJsZWQgYnkgQ09ORklHX1RJTUVSX1NUQVRTIGluIHRoZSAiS2VybmVsIGhhY2tpbmciIGNvbmZpZ3VyYXRpb24KK3NlY3Rpb24uCisKK3RpbWVyX3N0YXRzIGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0aW1lciBldmVudHMgd2hpY2ggYXJlIGZpcmVkIGluIGEKK0xpbnV4IHN5c3RlbSBvdmVyIGEgc2FtcGxlIHBlcmlvZDoKKworLSB0aGUgcGlkIG9mIHRoZSB0YXNrKHByb2Nlc3MpIHdoaWNoIGluaXRpYWxpemVkIHRoZSB0aW1lcgorLSB0aGUgbmFtZSBvZiB0aGUgcHJvY2VzcyB3aGljaCBpbml0aWFsaXplZCB0aGUgdGltZXIKKy0gdGhlIGZ1bmN0aW9uIHdoZXJlIHRoZSB0aW1lciB3YXMgaW50aWFsaXplZAorLSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgYXNzb2NpYXRlZCB0byB0aGUgdGltZXIKKy0gdGhlIG51bWJlciBvZiBldmVudHMgKGNhbGxiYWNrcykKKwordGltZXJfc3RhdHMgYWRkcyBhbiBlbnRyeSB0byAvcHJvYzogL3Byb2MvdGltZXJfc3RhdHMKKworVGhpcyBlbnRyeSBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIHN0YXRpc3RpY3MgZnVuY3Rpb25hbGl0eSBhbmQgdG8gcmVhZCBvdXQgdGhlCitzYW1wbGVkIGluZm9ybWF0aW9uLgorCitUaGUgdGltZXJfc3RhdHMgZnVuY3Rpb25hbGl0eSBpcyBpbmFjdGl2ZSBvbiBib290dXAuCisKK1RvIGFjdGl2YXRlIGEgc2FtcGxlIHBlcmlvZCBpc3N1ZToKKyMgZWNobyAxID4vcHJvYy90aW1lcl9zdGF0cworCitUbyBzdG9wIGEgc2FtcGxlIHBlcmlvZCBpc3N1ZToKKyMgZWNobyAwID4vcHJvYy90aW1lcl9zdGF0cworCitUaGUgc3RhdGlzdGljcyBjYW4gYmUgcmV0cmlldmVkIGJ5OgorIyBjYXQgL3Byb2MvdGltZXJfc3RhdHMKKworVGhlIHJlYWRvdXQgb2YgL3Byb2MvdGltZXJfc3RhdHMgYXV0b21hdGljYWxseSBkaXNhYmxlcyBzYW1wbGluZy4gVGhlIHNhbXBsZWQKK2luZm9ybWF0aW9uIGlzIGtlcHQgdW50aWwgYSBuZXcgc2FtcGxlIHBlcmlvZCBpcyBzdGFydGVkLiBUaGlzIGFsbG93cyBtdWx0aXBsZQorcmVhZG91dHMuCisKK1NhbXBsZSBvdXRwdXQgb2YgL3Byb2MvdGltZXJfc3RhdHM6CisKK1RpbWVyc3RhdHMgc2FtcGxlIHBlcmlvZDogMy44ODg3NzAgcworICAxMiwgICAgIDAgc3dhcHBlciAgICAgICAgICBocnRpbWVyX3N0b3Bfc2NoZWRfdGljayAoaHJ0aW1lcl9zY2hlZF90aWNrKQorICAxNSwgICAgIDEgc3dhcHBlciAgICAgICAgICBoY2Rfc3VibWl0X3VyYiAocmhfdGltZXJfZnVuYykKKyAgIDQsICAgOTU5IGtlZGFjICAgICAgICAgICAgc2NoZWR1bGVfdGltZW91dCAocHJvY2Vzc190aW1lb3V0KQorICAgMSwgICAgIDAgc3dhcHBlciAgICAgICAgICBwYWdlX3dyaXRlYmFja19pbml0ICh3Yl90aW1lcl9mbikKKyAgMjgsICAgICAwIHN3YXBwZXIgICAgICAgICAgaHJ0aW1lcl9zdG9wX3NjaGVkX3RpY2sgKGhydGltZXJfc2NoZWRfdGljaykKKyAgMjIsICAyOTQ4IElSUSA0ICAgICAgICAgICAgdHR5X2ZsaXBfYnVmZmVyX3B1c2ggKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKyAgIDMsICAzMTAwIGJhc2ggICAgICAgICAgICAgc2NoZWR1bGVfdGltZW91dCAocHJvY2Vzc190aW1lb3V0KQorICAgMSwgICAgIDEgc3dhcHBlciAgICAgICAgICBxdWV1ZV9kZWxheWVkX3dvcmtfb24gKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKyAgIDEsICAgICAxIHN3YXBwZXIgICAgICAgICAgcXVldWVfZGVsYXllZF93b3JrX29uIChkZWxheWVkX3dvcmtfdGltZXJfZm4pCisgICAxLCAgICAgMSBzd2FwcGVyICAgICAgICAgIG5laWdoX3RhYmxlX2luaXRfbm9fbmV0bGluayAobmVpZ2hfcGVyaW9kaWNfdGltZXIpCisgICAxLCAgMjI5MiBpcCAgICAgICAgICAgICAgIF9fbmV0ZGV2X3dhdGNoZG9nX3VwIChkZXZfd2F0Y2hkb2cpCisgICAxLCAgICAyMyBldmVudHMvMSAgICAgICAgIGRvX2NhY2hlX2NsZWFuIChkZWxheWVkX3dvcmtfdGltZXJfZm4pCis5MCB0b3RhbCBldmVudHMsIDMwLjAgZXZlbnRzL3NlYworCitUaGUgZmlyc3QgY29sdW1uIGlzIHRoZSBudW1iZXIgb2YgZXZlbnRzLCB0aGUgc2Vjb25kIGNvbHVtbiB0aGUgcGlkLCB0aGUgdGhpcmQKK2NvbHVtbiBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvY2Vzcy4gVGhlIGZvcnRoIGNvbHVtbiBzaG93cyB0aGUgZnVuY3Rpb24gd2hpY2gKK2luaXRpYWxpemVkIHRoZSB0aW1lciBhbmQgaW4gcGFyYW50aGVzZXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdhcworZXhlY3V0ZWQgb24gZXhwaXJ5LgorCisgICAgVGhvbWFzLCBJbmdvCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHJ0aW1lcnMvaGlnaHJlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2hydGltZXJzL2hpZ2hyZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGU5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hydGltZXJzL2hpZ2hyZXMudHh0CkBAIC0wLDAgKzEsMjQ5IEBACitIaWdoIHJlc29sdXRpb24gdGltZXJzIGFuZCBkeW5hbWljIHRpY2tzIGRlc2lnbiBub3RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIHBhcGVyIG9mIHRoZSBPTFMgMjAwNiB0YWxrICJocnRpbWVycworYW5kIGJleW9uZCIuIFRoZSBwYXBlciBpcyBwYXJ0IG9mIHRoZSBPTFMgMjAwNiBQcm9jZWVkaW5ncyBWb2x1bWUgMSwgd2hpY2ggY2FuCitiZSBmb3VuZCBvbiB0aGUgT0xTIHdlYnNpdGU6CitodHRwOi8vd3d3LmxpbnV4c3ltcG9zaXVtLm9yZy8yMDA2L2xpbnV4c3ltcG9zaXVtX3Byb2N2MS5wZGYKKworVGhlIHNsaWRlcyB0byB0aGlzIHRhbGsgYXJlIGF2YWlsYWJsZSBmcm9tOgoraHR0cDovL3RnbHguZGUvcHJvamVjdHMvaHJ0aW1lcnMvb2xzMjAwNi1ocnRpbWVycy5wZGYKKworVGhlIHNsaWRlcyBjb250YWluIGZpdmUgZmlndXJlcyAocGFnZXMgMiwgMTUsIDE4LCAyMCwgMjIpLCB3aGljaCBpbGx1c3RyYXRlIHRoZQorY2hhbmdlcyBpbiB0aGUgdGltZShyKSByZWxhdGVkIExpbnV4IHN1YnN5c3RlbXMuIEZpZ3VyZSAjMSAocC4gMikgc2hvd3MgdGhlCitkZXNpZ24gb2YgdGhlIExpbnV4IHRpbWUocikgc3lzdGVtIGJlZm9yZSBocnRpbWVycyBhbmQgb3RoZXIgYnVpbGRpbmcgYmxvY2tzCitnb3QgbWVyZ2VkIGludG8gbWFpbmxpbmUuCisKK05vdGU6IHRoZSBwYXBlciBhbmQgdGhlIHNsaWRlcyBhcmUgdGFsa2luZyBhYm91dCAiY2xvY2sgZXZlbnQgc291cmNlIiwgd2hpbGUgd2UKK3N3aXRjaGVkIHRvIHRoZSBuYW1lICJjbG9jayBldmVudCBkZXZpY2VzIiBpbiBtZWFudGltZS4KKworVGhlIGRlc2lnbiBjb250YWlucyB0aGUgZm9sbG93aW5nIGJhc2ljIGJ1aWxkaW5nIGJsb2NrczoKKworLSBocnRpbWVyIGJhc2UgaW5mcmFzdHJ1Y3R1cmUKKy0gdGltZW9mZGF5IGFuZCBjbG9jayBzb3VyY2UgbWFuYWdlbWVudAorLSBjbG9jayBldmVudCBtYW5hZ2VtZW50CistIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBmdW5jdGlvbmFsaXR5CistIGR5bmFtaWMgdGlja3MKKworCitocnRpbWVyIGJhc2UgaW5mcmFzdHJ1Y3R1cmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgaHJ0aW1lciBiYXNlIGluZnJhc3RydWN0dXJlIHdhcyBtZXJnZWQgaW50byB0aGUgMi42LjE2IGtlcm5lbC4gRGV0YWlscyBvZgordGhlIGJhc2UgaW1wbGVtZW50YXRpb24gYXJlIGNvdmVyZWQgaW4gRG9jdW1lbnRhdGlvbi9ocnRpbWVycy9ocnRpbWVyLnR4dC4gU2VlCithbHNvIGZpZ3VyZSAjMiAoT0xTIHNsaWRlcyBwLiAxNSkKKworVGhlIG1haW4gZGlmZmVyZW5jZXMgdG8gdGhlIHRpbWVyIHdoZWVsLCB3aGljaCBob2xkcyB0aGUgYXJtZWQgdGltZXJfbGlzdCB0eXBlCit0aW1lcnMgYXJlOgorICAgICAgIC0gdGltZSBvcmRlcmVkIGVucXVldWVpbmcgaW50byBhIHJiLXRyZWUKKyAgICAgICAtIGluZGVwZW5kZW50IG9mIHRpY2tzICh0aGUgcHJvY2Vzc2luZyBpcyBiYXNlZCBvbiBuYW5vc2Vjb25kcykKKworCit0aW1lb2ZkYXkgYW5kIGNsb2NrIHNvdXJjZSBtYW5hZ2VtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0pvaG4gU3R1bHR6J3MgR2VuZXJpYyBUaW1lIE9mIERheSAoR1RPRCkgZnJhbWV3b3JrIG1vdmVzIGEgbGFyZ2UgcG9ydGlvbiBvZgorY29kZSBvdXQgb2YgdGhlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBhcmVhcyBpbnRvIGEgZ2VuZXJpYyBtYW5hZ2VtZW50CitmcmFtZXdvcmssIGFzIGlsbHVzdHJhdGVkIGluIGZpZ3VyZSAjMyAoT0xTIHNsaWRlcyBwLiAxOCkuIFRoZSBhcmNoaXRlY3R1cmUKK3NwZWNpZmljIHBvcnRpb24gaXMgcmVkdWNlZCB0byB0aGUgbG93IGxldmVsIGhhcmR3YXJlIGRldGFpbHMgb2YgdGhlIGNsb2NrCitzb3VyY2VzLCB3aGljaCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgZnJhbWV3b3JrIGFuZCBzZWxlY3RlZCBvbiBhIHF1YWxpdHkgYmFzZWQKK2RlY2lzaW9uLiBUaGUgbG93IGxldmVsIGNvZGUgcHJvdmlkZXMgaGFyZHdhcmUgc2V0dXAgYW5kIHJlYWRvdXQgcm91dGluZXMgYW5kCitpbml0aWFsaXplcyBkYXRhIHN0cnVjdHVyZXMsIHdoaWNoIGFyZSB1c2VkIGJ5IHRoZSBnZW5lcmljIHRpbWUga2VlcGluZyBjb2RlIHRvCitjb252ZXJ0IHRoZSBjbG9jayB0aWNrcyB0byBuYW5vc2Vjb25kIGJhc2VkIHRpbWUgdmFsdWVzLiBBbGwgb3RoZXIgdGltZSBrZWVwaW5nCityZWxhdGVkIGZ1bmN0aW9uYWxpdHkgaXMgbW92ZWQgaW50byB0aGUgZ2VuZXJpYyBjb2RlLiBUaGUgR1RPRCBiYXNlIHBhdGNoIGdvdAorbWVyZ2VkIGludG8gdGhlIDIuNi4xOCBrZXJuZWwuCisKK0Z1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEdlbmVyaWMgVGltZSBPZiBEYXkgZnJhbWV3b3JrIGlzIGF2YWlsYWJsZSBpbiB0aGUKK09MUyAyMDA1IFByb2NlZWRpbmdzIFZvbHVtZSAxOgoraHR0cDovL3d3dy5saW51eHN5bXBvc2l1bS5vcmcvMjAwNS9saW51eHN5bXBvc2l1bV9wcm9jdjEucGRmCisKK1RoZSBwYXBlciAiV2UgQXJlIE5vdCBHZXR0aW5nIEFueSBZb3VuZ2VyOiBBIE5ldyBBcHByb2FjaCB0byBUaW1lIGFuZAorVGltZXJzIiB3YXMgd3JpdHRlbiBieSBKLiBTdHVsdHosIEQuVi4gSGFydCwgJiBOLiBBcmF2YW11ZGFuLgorCitGaWd1cmUgIzMgKE9MUyBzbGlkZXMgcC4xOCkgaWxsdXN0cmF0ZXMgdGhlIHRyYW5zZm9ybWF0aW9uLgorCisKK2Nsb2NrIGV2ZW50IG1hbmFnZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hpbGUgY2xvY2sgc291cmNlcyBwcm92aWRlIHJlYWQgYWNjZXNzIHRvIHRoZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdGltZQordmFsdWUsIGNsb2NrIGV2ZW50IGRldmljZXMgYXJlIHVzZWQgdG8gc2NoZWR1bGUgdGhlIG5leHQgZXZlbnQKK2ludGVycnVwdChzKS4gVGhlIG5leHQgZXZlbnQgaXMgY3VycmVudGx5IGRlZmluZWQgdG8gYmUgcGVyaW9kaWMsIHdpdGggaXRzCitwZXJpb2QgZGVmaW5lZCBhdCBjb21waWxlIHRpbWUuIFRoZSBzZXR1cCBhbmQgc2VsZWN0aW9uIG9mIHRoZSBldmVudCBkZXZpY2UKK2ZvciB2YXJpb3VzIGV2ZW50IGRyaXZlbiBmdW5jdGlvbmFsaXRpZXMgaXMgaGFyZHdpcmVkIGludG8gdGhlIGFyY2hpdGVjdHVyZQorZGVwZW5kZW50IGNvZGUuIFRoaXMgcmVzdWx0cyBpbiBkdXBsaWNhdGVkIGNvZGUgYWNyb3NzIGFsbCBhcmNoaXRlY3R1cmVzIGFuZAorbWFrZXMgaXQgZXh0cmVtZWx5IGRpZmZpY3VsdCB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHN5c3RlbSB0byB1c2UKK2V2ZW50IGludGVycnVwdCBkZXZpY2VzIG90aGVyIHRoYW4gdGhvc2UgYWxyZWFkeSBidWlsdCBpbnRvIHRoZQorYXJjaGl0ZWN0dXJlLiBBbm90aGVyIGltcGxpY2F0aW9uIG9mIHRoZSBjdXJyZW50IGRlc2lnbiBpcyB0aGF0IGl0IGlzIG5lY2Vzc2FyeQordG8gdG91Y2ggYWxsIHRoZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIGluIG9yZGVyIHRvIHByb3ZpZGUgbmV3CitmdW5jdGlvbmFsaXR5IGxpa2UgaGlnaCByZXNvbHV0aW9uIHRpbWVycyBvciBkeW5hbWljIHRpY2tzLgorCitUaGUgY2xvY2sgZXZlbnRzIHN1YnN5c3RlbSB0cmllcyB0byBhZGRyZXNzIHRoaXMgcHJvYmxlbSBieSBwcm92aWRpbmcgYSBnZW5lcmljCitzb2x1dGlvbiB0byBtYW5hZ2UgY2xvY2sgZXZlbnQgZGV2aWNlcyBhbmQgdGhlaXIgdXNhZ2UgZm9yIHRoZSB2YXJpb3VzIGNsb2NrCitldmVudCBkcml2ZW4ga2VybmVsIGZ1bmN0aW9uYWxpdGllcy4gVGhlIGdvYWwgb2YgdGhlIGNsb2NrIGV2ZW50IHN1YnN5c3RlbSBpcwordG8gbWluaW1pemUgdGhlIGNsb2NrIGV2ZW50IHJlbGF0ZWQgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCBjb2RlIHRvIHRoZSBwdXJlCitoYXJkd2FyZSByZWxhdGVkIGhhbmRsaW5nIGFuZCB0byBhbGxvdyBlYXN5IGFkZGl0aW9uIGFuZCB1dGlsaXphdGlvbiBvZiBuZXcKK2Nsb2NrIGV2ZW50IGRldmljZXMuIEl0IGFsc28gbWluaW1pemVzIHRoZSBkdXBsaWNhdGVkIGNvZGUgYWNyb3NzIHRoZQorYXJjaGl0ZWN0dXJlcyBhcyBpdCBwcm92aWRlcyBnZW5lcmljIGZ1bmN0aW9uYWxpdHkgZG93biB0byB0aGUgaW50ZXJydXB0CitzZXJ2aWNlIGhhbmRsZXIsIHdoaWNoIGlzIGFsbW9zdCBpbmhlcmVudGx5IGhhcmR3YXJlIGRlcGVuZGVudC4KKworQ2xvY2sgZXZlbnQgZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCBlaXRoZXIgYnkgdGhlIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgYm9vdAorY29kZSBvciBhdCBtb2R1bGUgaW5zZXJ0aW9uIHRpbWUuIEVhY2ggY2xvY2sgZXZlbnQgZGV2aWNlIGZpbGxzIGEgZGF0YQorc3RydWN0dXJlIHdpdGggY2xvY2stc3BlY2lmaWMgcHJvcGVydHkgcGFyYW1ldGVycyBhbmQgY2FsbGJhY2sgZnVuY3Rpb25zLiBUaGUKK2Nsb2NrIGV2ZW50IG1hbmFnZW1lbnQgZGVjaWRlcywgYnkgdXNpbmcgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBwYXJhbWV0ZXJzLCB0aGUKK3NldCBvZiBzeXN0ZW0gZnVuY3Rpb25zIGEgY2xvY2sgZXZlbnQgZGV2aWNlIHdpbGwgYmUgdXNlZCB0byBzdXBwb3J0LiBUaGlzCitpbmNsdWRlcyB0aGUgZGlzdGluY3Rpb24gb2YgcGVyLUNQVSBhbmQgcGVyLXN5c3RlbSBnbG9iYWwgZXZlbnQgZGV2aWNlcy4KKworU3lzdGVtLWxldmVsIGdsb2JhbCBldmVudCBkZXZpY2VzIGFyZSB1c2VkIGZvciB0aGUgTGludXggcGVyaW9kaWMgdGljay4gUGVyLUNQVQorZXZlbnQgZGV2aWNlcyBhcmUgdXNlZCB0byBwcm92aWRlIGxvY2FsIENQVSBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgcHJvY2VzcworYWNjb3VudGluZywgcHJvZmlsaW5nLCBhbmQgaGlnaCByZXNvbHV0aW9uIHRpbWVycy4KKworVGhlIG1hbmFnZW1lbnQgbGF5ZXIgYXNzaWduZXMgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxpd2luZyBmdW5jdGlvbnMgdG8gYSBjbG9jaworZXZlbnQgZGV2aWNlOgorICAgICAgLSBzeXN0ZW0gZ2xvYmFsIHBlcmlvZGljIHRpY2sgKGppZmZpZXMgdXBkYXRlKQorICAgICAgLSBjcHUgbG9jYWwgdXBkYXRlX3Byb2Nlc3NfdGltZXMKKyAgICAgIC0gY3B1IGxvY2FsIHByb2ZpbGluZworICAgICAgLSBjcHUgbG9jYWwgbmV4dCBldmVudCBpbnRlcnJ1cHQgKG5vbiBwZXJpb2RpYyBtb2RlKQorCitUaGUgY2xvY2sgZXZlbnQgZGV2aWNlIGRlbGVnYXRlcyB0aGUgc2VsZWN0aW9uIG9mIHRob3NlIHRpbWVyIGludGVycnVwdCByZWxhdGVkCitmdW5jdGlvbnMgY29tcGxldGVseSB0byB0aGUgbWFuYWdlbWVudCBsYXllci4gVGhlIGNsb2NrIG1hbmFnZW1lbnQgbGF5ZXIgc3RvcmVzCithIGZ1bmN0aW9uIHBvaW50ZXIgaW4gdGhlIGRldmljZSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUsIHdoaWNoIGhhcyB0byBiZSBjYWxsZWQKK2Zyb20gdGhlIGhhcmR3YXJlIGxldmVsIGhhbmRsZXIuIFRoaXMgcmVtb3ZlcyBhIGxvdCBvZiBkdXBsaWNhdGVkIGNvZGUgZnJvbSB0aGUKK2FyY2hpdGVjdHVyZSBzcGVjaWZpYyB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlcnMgYW5kIGhhbmRzIHRoZSBjb250cm9sIG92ZXIgdGhlCitjbG9jayBldmVudCBkZXZpY2VzIGFuZCB0aGUgYXNzaWdubWVudCBvZiB0aW1lciBpbnRlcnJ1cHQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5Cit0byB0aGUgY29yZSBjb2RlLgorCitUaGUgY2xvY2sgZXZlbnQgbGF5ZXIgQVBJIGlzIHJhdGhlciBzbWFsbC4gQXNpZGUgZnJvbSB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlCityZWdpc3RyYXRpb24gaW50ZXJmYWNlIGl0IHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBzY2hlZHVsZSB0aGUgbmV4dCBldmVudAoraW50ZXJydXB0LCBjbG9jayBldmVudCBkZXZpY2Ugbm90aWZpY2F0aW9uIHNlcnZpY2UgYW5kIHN1cHBvcnQgZm9yIHN1c3BlbmQgYW5kCityZXN1bWUuCisKK1RoZSBmcmFtZXdvcmsgYWRkcyBhYm91dCA3MDAgbGluZXMgb2YgY29kZSB3aGljaCByZXN1bHRzIGluIGEgMktCIGluY3JlYXNlIG9mCit0aGUga2VybmVsIGJpbmFyeSBzaXplLiBUaGUgY29udmVyc2lvbiBvZiBpMzg2IHJlbW92ZXMgYWJvdXQgMTAwIGxpbmVzIG9mCitjb2RlLiBUaGUgYmluYXJ5IHNpemUgZGVjcmVhc2UgaXMgaW4gdGhlIHJhbmdlIG9mIDQwMCBieXRlLiBXZSBiZWxpZXZlIHRoYXQgdGhlCitpbmNyZWFzZSBvZiBmbGV4aWJpbGl0eSBhbmQgdGhlIGF2b2lkYW5jZSBvZiBkdXBsaWNhdGVkIGNvZGUgYWNyb3NzCithcmNoaXRlY3R1cmVzIGp1c3RpZmllcyB0aGUgc2xpZ2h0IGluY3JlYXNlIG9mIHRoZSBiaW5hcnkgc2l6ZS4KKworVGhlIGNvbnZlcnNpb24gb2YgYW4gYXJjaGl0ZWN0dXJlIGhhcyBubyBmdW5jdGlvbmFsIGltcGFjdCwgYnV0IGFsbG93cyB0bwordXRpbGl6ZSB0aGUgaGlnaCByZXNvbHV0aW9uIGFuZCBkeW5hbWljIHRpY2sgZnVuY3Rpb25hbGl0ZXMgd2l0aG91dCBhbnkgY2hhbmdlCit0byB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlIGFuZCB0aW1lciBpbnRlcnJ1cHQgY29kZS4gQWZ0ZXIgdGhlIGNvbnZlcnNpb24gdGhlCitlbmFibGluZyBvZiBoaWdoIHJlc29sdXRpb24gdGltZXJzIGFuZCBkeW5hbWljIHRpY2tzIGlzIHNpbXBseSBwcm92aWRlZCBieQorYWRkaW5nIHRoZSBrZXJuZWwvdGltZS9LY29uZmlnIGZpbGUgdG8gdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBLY29uZmlnIGFuZAorYWRkaW5nIHRoZSBkeW5hbWljIHRpY2sgc3BlY2lmaWMgY2FsbHMgdG8gdGhlIGlkbGUgcm91dGluZSAoYSB0b3RhbCBvZiAzIGxpbmVzCithZGRlZCB0byB0aGUgaWRsZSBmdW5jdGlvbiBhbmQgdGhlIEtjb25maWcgZmlsZSkKKworRmlndXJlICM0IChPTFMgc2xpZGVzIHAuMjApIGlsbHVzdHJhdGVzIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKworCitoaWdoIHJlc29sdXRpb24gdGltZXIgZnVuY3Rpb25hbGl0eQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRHVyaW5nIHN5c3RlbSBib290IGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lcgorZnVuY3Rpb25hbGl0eSwgd2hpbGUgbWFraW5nIGl0IHBvc3NpYmxlIHdvdWxkIGJlIGRpZmZpY3VsdCBhbmQgd291bGQgc2VydmUgbm8KK3VzZWZ1bCBmdW5jdGlvbi4gVGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjbG9jayBldmVudCBkZXZpY2UgZnJhbWV3b3JrLCB0aGUKK2Nsb2NrIHNvdXJjZSBmcmFtZXdvcmsgKEdUT0QpIGFuZCBocnRpbWVycyBpdHNlbGYgaGFzIHRvIGJlIGRvbmUgYW5kCithcHByb3ByaWF0ZSBjbG9jayBzb3VyY2VzIGFuZCBjbG9jayBldmVudCBkZXZpY2VzIGhhdmUgdG8gYmUgcmVnaXN0ZXJlZCBiZWZvcmUKK3RoZSBoaWdoIHJlc29sdXRpb24gZnVuY3Rpb25hbGl0eSBjYW4gd29yay4gVXAgdG8gdGhlIHBvaW50IHdoZXJlIGhydGltZXJzIGFyZQoraW5pdGlhbGl6ZWQsIHRoZSBzeXN0ZW0gd29ya3MgaW4gdGhlIHVzdWFsIGxvdyByZXNvbHV0aW9uIHBlcmlvZGljIG1vZGUuIFRoZQorY2xvY2sgc291cmNlIGFuZCB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlIGxheWVycyBwcm92aWRlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbnMKK3doaWNoIGluZm9ybSBocnRpbWVycyBhYm91dCBhdmFpbGFiaWxpdHkgb2YgbmV3IGhhcmR3YXJlLiBocnRpbWVycyB2YWxpZGF0ZXMKK3RoZSB1c2FiaWxpdHkgb2YgdGhlIHJlZ2lzdGVyZWQgY2xvY2sgc291cmNlcyBhbmQgY2xvY2sgZXZlbnQgZGV2aWNlcyBiZWZvcmUKK3N3aXRjaGluZyB0byBoaWdoIHJlc29sdXRpb24gbW9kZS4gVGhpcyBlbnN1cmVzIGFsc28gdGhhdCBhIGtlcm5lbCB3aGljaCBpcworY29uZmlndXJlZCBmb3IgaGlnaCByZXNvbHV0aW9uIHRpbWVycyBjYW4gcnVuIG9uIGEgc3lzdGVtIHdoaWNoIGxhY2tzIHRoZQorbmVjZXNzYXJ5IGhhcmR3YXJlIHN1cHBvcnQuCisKK1RoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgY29kZSBkb2VzIG5vdCBzdXBwb3J0IFNNUCBtYWNoaW5lcyB3aGljaCBoYXZlIG9ubHkKK2dsb2JhbCBjbG9jayBldmVudCBkZXZpY2VzLiBUaGUgc3VwcG9ydCBvZiBzdWNoIGhhcmR3YXJlIHdvdWxkIGludm9sdmUgSVBJCitjYWxscyB3aGVuIGFuIGludGVycnVwdCBoYXBwZW5zLiBUaGUgb3ZlcmhlYWQgd291bGQgYmUgbXVjaCBsYXJnZXIgdGhhbiB0aGUKK2JlbmVmaXQuIFRoaXMgaXMgdGhlIHJlYXNvbiB3aHkgd2UgY3VycmVudGx5IGRpc2FibGUgaGlnaCByZXNvbHV0aW9uIGFuZAorZHluYW1pYyB0aWNrcyBvbiBpMzg2IFNNUCBzeXN0ZW1zIHdoaWNoIHN0b3AgdGhlIGxvY2FsIEFQSUMgaW4gQzMgcG93ZXIKK3N0YXRlLiBBIHdvcmthcm91bmQgaXMgYXZhaWxhYmxlIGFzIGFuIGlkZWEsIGJ1dCB0aGUgcHJvYmxlbSBoYXMgbm90IGJlZW4KK3RhY2tsZWQgeWV0LgorCitUaGUgdGltZSBvcmRlcmVkIGluc2VydGlvbiBvZiB0aW1lcnMgcHJvdmlkZXMgYWxsIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBkZWNpZGUKK3doZXRoZXIgdGhlIGV2ZW50IGRldmljZSBoYXMgdG8gYmUgcmVwcm9ncmFtbWVkIHdoZW4gYSB0aW1lciBpcyBhZGRlZC4gVGhlCitkZWNpc2lvbiBpcyBtYWRlIHBlciB0aW1lciBiYXNlIGFuZCBzeW5jaHJvbml6ZWQgYWNyb3NzIHBlci1jcHUgdGltZXIgYmFzZXMgaW4KK2Egc3VwcG9ydCBmdW5jdGlvbi4gVGhlIGRlc2lnbiBhbGxvd3MgdGhlIHN5c3RlbSB0byB1dGlsaXplIHNlcGFyYXRlIHBlci1DUFUKK2Nsb2NrIGV2ZW50IGRldmljZXMgZm9yIHRoZSBwZXItQ1BVIHRpbWVyIGJhc2VzLCBidXQgY3VycmVudGx5IG9ubHkgb25lCityZXByb2dyYW1tYWJsZSBjbG9jayBldmVudCBkZXZpY2UgcGVyLUNQVSBpcyB1dGlsaXplZC4KKworV2hlbiB0aGUgdGltZXIgaW50ZXJydXB0IGhhcHBlbnMsIHRoZSBuZXh0IGV2ZW50IGludGVycnVwdCBoYW5kbGVyIGlzIGNhbGxlZAorZnJvbSB0aGUgY2xvY2sgZXZlbnQgZGlzdHJpYnV0aW9uIGNvZGUgYW5kIG1vdmVzIGV4cGlyZWQgdGltZXJzIGZyb20gdGhlCityZWQtYmxhY2sgdHJlZSB0byBhIHNlcGFyYXRlIGRvdWJsZSBsaW5rZWQgbGlzdCBhbmQgaW52b2tlcyB0aGUgc29mdGlycQoraGFuZGxlci4gQW4gYWRkaXRpb25hbCBtb2RlIGZpZWxkIGluIHRoZSBocnRpbWVyIHN0cnVjdHVyZSBhbGxvd3MgdGhlIHN5c3RlbSB0bworZXhlY3V0ZSBjYWxsYmFjayBmdW5jdGlvbnMgZGlyZWN0bHkgZnJvbSB0aGUgbmV4dCBldmVudCBpbnRlcnJ1cHQgaGFuZGxlci4gVGhpcworaXMgcmVzdHJpY3RlZCB0byBjb2RlIHdoaWNoIGNhbiBzYWZlbHkgYmUgZXhlY3V0ZWQgaW4gdGhlIGhhcmQgaW50ZXJydXB0Citjb250ZXh0LiBUaGlzIGFwcGxpZXMsIGZvciBleGFtcGxlLCB0byB0aGUgY29tbW9uIGNhc2Ugb2YgYSB3YWtldXAgZnVuY3Rpb24gYXMKK3VzZWQgYnkgbmFub3NsZWVwLiBUaGUgYWR2YW50YWdlIG9mIGV4ZWN1dGluZyB0aGUgaGFuZGxlciBpbiB0aGUgaW50ZXJydXB0Citjb250ZXh0IGlzIHRoZSBhdm9pZGFuY2Ugb2YgdXAgdG8gdHdvIGNvbnRleHQgc3dpdGNoZXMgLSBmcm9tIHRoZSBpbnRlcnJ1cHRlZAorY29udGV4dCB0byB0aGUgc29mdGlycSBhbmQgdG8gdGhlIHRhc2sgd2hpY2ggaXMgd29rZW4gdXAgYnkgdGhlIGV4cGlyZWQKK3RpbWVyLgorCitPbmNlIGEgc3lzdGVtIGhhcyBzd2l0Y2hlZCB0byBoaWdoIHJlc29sdXRpb24gbW9kZSwgdGhlIHBlcmlvZGljIHRpY2sgaXMKK3N3aXRjaGVkIG9mZi4gVGhpcyBkaXNhYmxlcyB0aGUgcGVyIHN5c3RlbSBnbG9iYWwgcGVyaW9kaWMgY2xvY2sgZXZlbnQgZGV2aWNlIC0KK2UuZy4gdGhlIFBJVCBvbiBpMzg2IFNNUCBzeXN0ZW1zLgorCitUaGUgcGVyaW9kaWMgdGljayBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5IGFuIHBlci1jcHUgaHJ0aW1lci4gVGhlIGNhbGxiYWNrCitmdW5jdGlvbiBpcyBleGVjdXRlZCBpbiB0aGUgbmV4dCBldmVudCBpbnRlcnJ1cHQgY29udGV4dCBhbmQgdXBkYXRlcyBqaWZmaWVzCithbmQgY2FsbHMgdXBkYXRlX3Byb2Nlc3NfdGltZXMgYW5kIHByb2ZpbGluZy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBocnRpbWVyCitiYXNlZCBwZXJpb2RpYyB0aWNrIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuZGVkIHdpdGggZHluYW1pYyB0aWNrIGZ1bmN0aW9uYWxpdHkuCitUaGlzIGFsbG93cyB0byB1c2UgYSBzaW5nbGUgY2xvY2sgZXZlbnQgZGV2aWNlIHRvIHNjaGVkdWxlIGhpZ2ggcmVzb2x1dGlvbgordGltZXIgYW5kIHBlcmlvZGljIGV2ZW50cyAoamlmZmllcyB0aWNrLCBwcm9maWxpbmcsIHByb2Nlc3MgYWNjb3VudGluZykgb24gVVAKK3N5c3RlbXMuIFRoaXMgaGFzIGJlZW4gcHJvdmVkIHRvIHdvcmsgd2l0aCB0aGUgUElUIG9uIGkzODYgYW5kIHRoZSBJbmNyZW1lbnRlcgorb24gUFBDLgorCitUaGUgc29mdGlycSBmb3IgcnVubmluZyB0aGUgaHJ0aW1lciBxdWV1ZXMgYW5kIGV4ZWN1dGluZyB0aGUgY2FsbGJhY2tzIGhhcyBiZWVuCitzZXBhcmF0ZWQgZnJvbSB0aGUgdGljayBib3VuZCB0aW1lciBzb2Z0aXJxIHRvIGFsbG93IGFjY3VyYXRlIGRlbGl2ZXJ5IG9mIGhpZ2gKK3Jlc29sdXRpb24gdGltZXIgc2lnbmFscyB3aGljaCBhcmUgdXNlZCBieSBpdGltZXIgYW5kIFBPU0lYIGludGVydmFsCit0aW1lcnMuIFRoZSBleGVjdXRpb24gb2YgdGhpcyBzb2Z0aXJxIGNhbiBzdGlsbCBiZSBkZWxheWVkIGJ5IG90aGVyIHNvZnRpcnFzLAorYnV0IHRoZSBvdmVyYWxsIGxhdGVuY2llcyBoYXZlIGJlZW4gc2lnbmlmaWNhbnRseSBpbXByb3ZlZCBieSB0aGlzIHNlcGFyYXRpb24uCisKK0ZpZ3VyZSAjNSAoT0xTIHNsaWRlcyBwLjIyKSBpbGx1c3RyYXRlcyB0aGUgdHJhbnNmb3JtYXRpb24uCisKKworZHluYW1pYyB0aWNrcworLS0tLS0tLS0tLS0tLQorCitEeW5hbWljIHRpY2tzIGFyZSB0aGUgbG9naWNhbCBjb25zZXF1ZW5jZSBvZiB0aGUgaHJ0aW1lciBiYXNlZCBwZXJpb2RpYyB0aWNrCityZXBsYWNlbWVudCAoc2NoZWRfdGljaykuIFRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBzY2hlZF90aWNrIGhydGltZXIgaXMKK2V4dGVuZGVkIGJ5IHRocmVlIGZ1bmN0aW9uczoKKworLSBocnRpbWVyX3N0b3Bfc2NoZWRfdGljaworLSBocnRpbWVyX3Jlc3RhcnRfc2NoZWRfdGljaworLSBocnRpbWVyX3VwZGF0ZV9qaWZmaWVzCisKK2hydGltZXJfc3RvcF9zY2hlZF90aWNrKCkgaXMgY2FsbGVkIHdoZW4gYSBDUFUgZ29lcyBpbnRvIGlkbGUgc3RhdGUuIFRoZSBjb2RlCitldmFsdWF0ZXMgdGhlIG5leHQgc2NoZWR1bGVkIHRpbWVyIGV2ZW50IChmcm9tIGJvdGggaHJ0aW1lcnMgYW5kIHRoZSB0aW1lcgord2hlZWwpIGFuZCBpbiBjYXNlIHRoYXQgdGhlIG5leHQgZXZlbnQgaXMgZnVydGhlciBhd2F5IHRoYW4gdGhlIG5leHQgdGljayBpdAorcmVwcm9ncmFtcyB0aGUgc2NoZWRfdGljayB0byB0aGlzIGZ1dHVyZSBldmVudCwgdG8gYWxsb3cgbG9uZ2VyIGlkbGUgc2xlZXBzCit3aXRob3V0IHdvcnRobGVzcyBpbnRlcnJ1cHRpb24gYnkgdGhlIHBlcmlvZGljIHRpY2suIFRoZSBmdW5jdGlvbiBpcyBhbHNvCitjYWxsZWQgd2hlbiBhbiBpbnRlcnJ1cHQgaGFwcGVucyBkdXJpbmcgdGhlIGlkbGUgcGVyaW9kLCB3aGljaCBkb2VzIG5vdCBjYXVzZSBhCityZXNjaGVkdWxlLiBUaGUgY2FsbCBpcyBuZWNlc3NhcnkgYXMgdGhlIGludGVycnVwdCBoYW5kbGVyIG1pZ2h0IGhhdmUgYXJtZWQgYQorbmV3IHRpbWVyIHdob3NlIGV4cGlyeSB0aW1lIGlzIGJlZm9yZSB0aGUgdGltZSB3aGljaCB3YXMgaWRlbnRpZmllZCBhcyB0aGUKK25lYXJlc3QgZXZlbnQgaW4gdGhlIHByZXZpb3VzIGNhbGwgdG8gaHJ0aW1lcl9zdG9wX3NjaGVkX3RpY2suCisKK2hydGltZXJfcmVzdGFydF9zY2hlZF90aWNrKCkgaXMgY2FsbGVkIHdoZW4gdGhlIENQVSBsZWF2ZXMgdGhlIGlkbGUgc3RhdGUgYmVmb3JlCitpdCBjYWxscyBzY2hlZHVsZSgpLiBocnRpbWVyX3Jlc3RhcnRfc2NoZWRfdGljaygpIHJlc3VtZXMgdGhlIHBlcmlvZGljIHRpY2ssCit3aGljaCBpcyBrZXB0IGFjdGl2ZSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGhydGltZXJfc3RvcF9zY2hlZF90aWNrKCkuCisKK2hydGltZXJfdXBkYXRlX2ppZmZpZXMoKSBpcyBjYWxsZWQgZnJvbSBpcnFfZW50ZXIoKSB3aGVuIGFuIGludGVycnVwdCBoYXBwZW5zCitpbiB0aGUgaWRsZSBwZXJpb2QgdG8gbWFrZSBzdXJlIHRoYXQgamlmZmllcyBhcmUgdXAgdG8gZGF0ZSBhbmQgdGhlIGludGVycnVwdAoraGFuZGxlciBoYXMgbm90IHRvIGRlYWwgd2l0aCBhbiBldmVudHVhbGx5IHN0YWxlIGppZmZ5IHZhbHVlLgorCitUaGUgZHluYW1pYyB0aWNrIGZlYXR1cmUgcHJvdmlkZXMgc3RhdGlzdGljYWwgdmFsdWVzIHdoaWNoIGFyZSBleHBvcnRlZCB0bwordXNlcnNwYWNlIHZpYSAvcHJvYy9zdGF0cyBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIGZvciBlbmhhbmNlZCBwb3dlcgorbWFuYWdlbWVudCBjb250cm9sLgorCitUaGUgaW1wbGVtZW50YXRpb24gbGVhdmVzIHJvb20gZm9yIGZ1cnRoZXIgZGV2ZWxvcG1lbnQgbGlrZSBmdWxsIHRpY2tsZXNzCitzeXN0ZW1zLCB3aGVyZSB0aGUgdGltZSBzbGljZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBzY2hlZHVsZXIsIHZhcmlhYmxlCitmcmVxdWVuY3kgcHJvZmlsaW5nLCBhbmQgYSBjb21wbGV0ZSByZW1vdmFsIG9mIGppZmZpZXMgaW4gdGhlIGZ1dHVyZS4KKworCitBc2lkZSB0aGUgY3VycmVudCBpbml0aWFsIHN1Ym1pc3Npb24gb2YgaTM4NiBzdXBwb3J0LCB0aGUgcGF0Y2hzZXQgaGFzIGJlZW4KK2V4dGVuZGVkIHRvIHg4Nl82NCBhbmQgQVJNIGFscmVhZHkuIEluaXRpYWwgKHdvcmsgaW4gcHJvZ3Jlc3MpIHN1cHBvcnQgaXMgYWxzbworYXZhaWxhYmxlIGZvciBNSVBTIGFuZCBQb3dlclBDLgorCisJICBUaG9tYXMsIEluZ28KKworCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHJ0aW1lcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9ocnRpbWVycy9ocnRpbWVycy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaHJ0aW1lcnMudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2hydGltZXJzL2hydGltZXJzLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCAyMmIxOTk2Li5hYmQ1NzVjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtNjA5LDYgKzYwOSwxMCBAQAogCQkJaGlnaG1lbSBvdGhlcndpc2UuIFRoaXMgYWxzbyB3b3JrcyB0byByZWR1Y2UgaGlnaG1lbQogCQkJc2l6ZSBvbiBiaWdnZXIgYm94ZXMuCiAKKwloaWdocmVzPQlbS05MXSBFbmFibGUvZGlzYWJsZSBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kZS4KKwkJCVZhbGlkIHBhcmFtZXRlcnM6ICJvbiIsICJvZmYiCisJCQlEZWZhdWx0OiAib24iCisKIAloaXNheD0JCVtIVyxJU0ROXQogCQkJU2VlIERvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuSGlTYXguCiAKQEAgLTEwNzgsNiArMTA4MiwxMCBAQAogCQkJaW4gY2VydGFpbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBuZXR3b3JrZWQgc2VydmVycyBvcgogCQkJcmVhbC10aW1lIHN5c3RlbXMuCiAKKwlub2h6PQkJW0tOTF0gQm9vdHRpbWUgZW5hYmxlL2Rpc2FibGUgZHluYW1pYyB0aWNrcworCQkJVmFsaWQgYXJndW1lbnRzOiBvbiwgb2ZmCisJCQlEZWZhdWx0OiBvbgorCiAJbm9pcnFiYWxhbmNlCVtJQS0zMixTTVAsS05MXSBEaXNhYmxlIGtlcm5lbCBpcnEgYmFsYW5jaW5nCiAKIAlub2lycWRlYnVnCVtJQS0zMl0gRGlzYWJsZXMgdGhlIGNvZGUgd2hpY2ggYXR0ZW1wdHMgdG8gZGV0ZWN0IGFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb255LWxhcHRvcC50eHQgYi9Eb2N1bWVudGF0aW9uL3NvbnktbGFwdG9wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQyNmRmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb255LWxhcHRvcC50eHQKQEAgLTAsMCArMSwxMDYgQEAKK1NvbnkgTm90ZWJvb2sgQ29udHJvbCBEcml2ZXIgKFNOQykgUmVhZG1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUNvcHlyaWdodCAoQykgMjAwNC0gMjAwNSBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgorCUNvcHlyaWdodCAoQykgMjAwNyBNYXR0aWEgRG9uZ2lsaSA8bWFsYXR0aWFAbGludXguaXQ+CisKK1RoaXMgbWluaS1kcml2ZXIgZHJpdmVzIHRoZSBTTkMgZGV2aWNlIHByZXNlbnQgaW4gdGhlIEFDUEkgQklPUyBvZgordGhlIFNvbnkgVmFpbyBsYXB0b3BzLgorCitJdCBnaXZlcyBhY2Nlc3MgdG8gc29tZSBleHRyYSBsYXB0b3AgZnVuY3Rpb25hbGl0aWVzLiBJbiBpdHMgY3VycmVudAorZm9ybSwgdGhpcyBkcml2ZXIgbGV0IHRoZSB1c2VyIHNldCBvciBxdWVyeSB0aGUgc2NyZWVuIGJyaWdodG5lc3MKK3Rocm91Z2ggdGhlIGJhY2tsaWdodCBzdWJzeXN0ZW0gYW5kIHJlbW92ZS9hcHBseSBwb3dlciB0byBzb21lIGRldmljZXMuCisKK0JhY2tsaWdodCBjb250cm9sOgorLS0tLS0tLS0tLS0tLS0tLS0tCitJZiB5b3VyIGxhcHRvcCBtb2RlbCBzdXBwb3J0cyBpdCwgeW91IHdpbGwgZmluZCBzeXNmcyBmaWxlcyBpbiB0aGUKKy9zeXMvY2xhc3MvYmFja2xpZ2h0L3NvbnkvCitkaXJlY3RvcnkuIFlvdSB3aWxsIGJlIGFibGUgdG8gcXVlcnkgYW5kIHNldCB0aGUgY3VycmVudCBzY3JlZW4KK2JyaWdodG5lc3M6CisJYnJpZ2h0bmVzcwkJZ2V0L3NldCBzY3JlZW4gYnJpZ2h0bmVzcyAoYW4gaXRlZ2VyCisJCQkJYmV0d2VlbiAwIGFuZCA3KQorCWFjdHVhbF9icmlnaHRuZXNzCXJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgd2lsbCBxdWVyeSB0aGUgSFcKKwkJCQl0byBnZXQgcmVhbCBicmlnaHRuZXNzIHZhbHVlCisJbWF4X2JyaWdodG5lc3MJCXRoZSBtYXhpbXVtIGJyaWdodG5lc3MgdmFsdWUKKworCitQbGF0Zm9ybSBzcGVjaWZpYzoKKy0tLS0tLS0tLS0tLS0tLS0tLQorTG9hZGluZyB0aGUgc29ueS1sYXB0b3AgbW9kdWxlIHdpbGwgY3JlYXRlIGEKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9zb255LWxhcHRvcC8KK2RpcmVjdG9yeSBwb3B1bGF0ZWQgd2l0aCBzb21lIGZpbGVzLgorCitZb3UgdGhlbiByZWFkL3dyaXRlIGludGVnZXIgdmFsdWVzIGZyb20vdG8gdGhvc2UgZmlsZXMgYnkgdXNpbmcKK3N0YW5kYXJkIFVOSVggdG9vbHMuCisKK1RoZSBmaWxlcyBhcmU6CisJYnJpZ2h0bmVzc19kZWZhdWx0CXNjcmVlbiBicmlnaHRuZXNzIHdoaWNoIHdpbGwgYmUgc2V0CisJCQkJd2hlbiB0aGUgbGFwdG9wIHdpbGwgYmUgcmVib290ZWQKKwljZHBvd2VyCQkJcG93ZXIgb24vb2ZmIHRoZSBpbnRlcm5hbCBDRCBkcml2ZQorCWF1ZGlvcG93ZXIJCXBvd2VyIG9uL29mZiB0aGUgaW50ZXJuYWwgc291bmQgY2FyZAorCWxhbnBvd2VyCQlwb3dlciBvbi9vZmYgdGhlIGludGVybmFsIGV0aGVybmV0IGNhcmQKKwkJCQkob25seSBpbiBkZWJ1ZyBtb2RlKQorCitOb3RlIHRoYXQgc29tZSBmaWxlcyBtYXkgYmUgbWlzc2luZyBpZiB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkCitieSB5b3VyIHBhcnRpY3VsYXIgbGFwdG9wIG1vZGVsLgorCitFeGFtcGxlIHVzYWdlOgorCSMgZWNobyAiMSIgPiAvc3lzL2RldmljZXMvcGxhdGZvcm0vc29ueS1sYXB0b3AvYnJpZ2h0bmVzc19kZWZhdWx0CitzZXRzIHRoZSBsb3dlc3Qgc2NyZWVuIGJyaWdodG5lc3MgZm9yIHRoZSBuZXh0IGFuZCBsYXRlciByZWJvb3RzLAorCSMgZWNobyAiOCIgPiAvc3lzL2RldmljZXMvcGxhdGZvcm0vc29ueS1sYXB0b3AvYnJpZ2h0bmVzc19kZWZhdWx0CitzZXRzIHRoZSBoaWdoZXN0IHNjcmVlbiBicmlnaHRuZXNzIGZvciB0aGUgbmV4dCBhbmQgbGF0ZXIgcmVib290cywKKwkjIGNhdCAvc3lzL2RldmljZXMvcGxhdGZvcm0vc29ueS1sYXB0b3AvYnJpZ2h0bmVzc19kZWZhdWx0CityZXRyaWV2ZXMgdGhlIHZhbHVlLgorCisJIyBlY2hvICIwIiA+IC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9zb255LWxhcHRvcC9hdWRpb3Bvd2VyCitwb3dlcnMgb2ZmIHRoZSBzb3VuZCBjYXJkLAorCSMgZWNobyAiMSIgPiAvc3lzL2RldmljZXMvcGxhdGZvcm0vc29ueS1sYXB0b3AvYXVkaW9wb3dlcgorcG93ZXJzIG9uIHRoZSBzb3VuZCBjYXJkLgorCitEZXZlbG9wbWVudDoKKy0tLS0tLS0tLS0tLQorCitJZiB5b3Ugd2FudCB0byBoZWxwIHdpdGggdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyIChhbmQKK3lvdSBhcmUgbm90IGFmcmFpZCBvZiBhbnkgc2lkZSBlZmZlY3RzIGRvaW5nIHN0cmFuZ2UgdGhpbmdzIHdpdGgKK3lvdXIgQUNQSSBCSU9TIGNvdWxkIGhhdmUgb24geW91ciBsYXB0b3ApLCBsb2FkIHRoZSBkcml2ZXIgYW5kCitwYXNzIHRoZSBvcHRpb24gJ2RlYnVnPTEnLgorCitSRVBFQVQ6IERPTidUIERPIFRISVMgSUYgWU9VIERPTidUIExJS0UgUklTS1kgQlVTSU5FU1MuCisKK0luIHlvdXIga2VybmVsIGxvZ3MgeW91IHdpbGwgZmluZCB0aGUgbGlzdCBvZiBhbGwgQUNQSSBtZXRob2RzCit0aGUgU05DIGRldmljZSBoYXMgb24geW91ciBsYXB0b3AuIFlvdSBjYW4gc2VlIHRoZSBHQ0RQL0dDRFAgbWV0aG9kcwordXNlZCB0byBwd2VyIG9uL29mZiB0aGUgQ0QgZHJpdmUsIGJ1dCB0aGVyZSBhcmUgb3RoZXJzLgorCitJIEhBVkUgTk8gSURFQSBXSEFUIFRIT1NFIE1FVEhPRFMgRE8uCisKK1RoZSBzb255LWxhcHRvcCBkcml2ZXIgY3JlYXRlcywgZm9yIHNvbWUgb2YgdGhvc2UgbWV0aG9kcyAodGhlIG1vc3QKK2N1cnJlbnQgb25lcyBmb3VuZCBvbiBzZXZlcmFsIFZhaW8gbW9kZWxzKSwgYW4gZW50cnkgdW5kZXIKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9zb255LWxhcHRvcCwganVzdCBsaWtlIHRoZSAnY2Rwb3dlcicgb25lLgorWW91IGNhbiBjcmVhdGUgb3RoZXIgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHlvdXIgb3duIGxhcHRvcCBtZXRob2RzIGJ5CitmdXJ0aGVyIGVkaXRpbmcgdGhlIHNvdXJjZSAoc2VlIHRoZSAnc29ueV9hY3BpX3ZhbHVlcycgdGFibGUsIGFuZCBhZGQgYSBuZXcKK2VudHJ5IHRvIHRoaXMgdGFibGUgd2l0aCB5b3VyIGdldC9zZXQgbWV0aG9kIG5hbWVzIHVzaW5nIHRoZQorSEFORExFX05BTUVTIG1hY3JvKS4KKworWW91ciBtaXNzaW9uLCBzaG91bGQgeW91IGFjY2VwdCBpdCwgaXMgdG8gdHJ5IGZpbmRpbmcgb3V0IHdoYXQKK3Rob3NlIGVudHJpZXMgYXJlIGZvciwgYnkgcmVhZGluZy93cml0aW5nIHJhbmRvbSB2YWx1ZXMgZnJvbS90byB0aG9zZQorZmlsZXMgYW5kIGZpbmQgb3V0IHdoYXQgaXMgdGhlIGltcGFjdCBvbiB5b3VyIGxhcHRvcC4KKworU2hvdWxkIHlvdSBmaW5kIGFueXRoaW5nIGludGVyZXN0aW5nLCBwbGVhc2UgcmVwb3J0IGl0IGJhY2sgdG8gbWUsCitJIHdpbGwgbm90IGRpc2F2b3cgYWxsIGtub3dsZWRnZSBvZiB5b3VyIGFjdGlvbnMgOikKKworQnVncy9MaW1pdGF0aW9uczoKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogVGhpcyBkcml2ZXIgaXMgbm90IGJhc2VkIG9uIG9mZmljaWFsIGRvY3VtZW50YXRpb24gZnJvbSBTb255CisgIChiZWNhdXNlIHRoZXJlIGlzIG5vbmUpLCBzbyB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhpcyBkcml2ZXIKKyAgd2lsbCB3b3JrIGF0IGFsbCwgb3IgZG8gdGhlIHJpZ2h0IHRoaW5nLiBBbHRob3VnaCB0aGlzIGhhc24ndAorICBoYXBwZW5lZCB0byBtZSwgdGhpcyBkcml2ZXIgY291bGQgZG8gdmVyeSBiYWQgdGhpbmdzIHRvIHlvdXIKKyAgbGFwdG9wLCBpbmNsdWRpbmcgcGVybWFuZW50IGRhbWFnZS4KKworKiBUaGUgc29ueS1sYXB0b3AgYW5kIHNvbnlwaSBkcml2ZXJzIGRvIG5vdCBpbnRlcmFjdCBhdCBhbGwuIEluIHRoZQorICBmdXR1cmUsIHNvbnlwaSBjb3VsZCB1c2Ugc29ueS1sYXB0b3AgdG8gZG8gKHBhcnQgb2YpIGl0cyBidXNpbmVzcy4KKworKiBzcGljY3RybCwgd2hpY2ggaXMgdGhlIHVzZXJzcGFjZSB0b29sIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKKyAgc29ueXBpIGRyaXZlciAodGhyb3VnaCAvZGV2L3NvbnlwaSkgZG9lcyBub3QgdHJ5IHRvIHVzZSB0aGUKKyAgc29ueS1sYXB0b3AgZHJpdmVyLiBJbiB0aGUgZnV0dXJlLCBzcGljY3RybCBjb3VsZCB0cnkgc29ueXBpIGZpcnN0LAorICBhbmQgaWYgaXQgaXNuJ3QgcHJlc2VudCwgdHJ5IHNvbnktbGFwdG9wIGluc3RlYWQuCisKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggYjBmZDcxYi4uYTM4NDU1MSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTI0Nyw2ICsyNDcsMTMgQEAKIFc6CWh0dHA6Ly9hY3BpLnNvdXJjZWZvcmdlLm5ldC8KIFM6CVN1cHBvcnRlZAogCitBQ1BJIFZJREVPIERSSVZFUgorUDoJTHVtaW5nIFl1CitNOglsdW1pbmcueXVAaW50ZWwuY29tCitMOglsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL2FjcGkuc291cmNlZm9yZ2UubmV0LworUzoJU3VwcG9ydGVkCisKIEFEMTgxNiBTT1VORCBEUklWRVIKIFA6CVRob3JzdGVuIEtuYWJlCiBNOglUaG9yc3RlbiBLbmFiZSA8bGludXhAdGhvcnN0ZW4ta25hYmUuZGU+CkBAIC0zMDYxLDYgKzMwNjgsOCBAQAogU09OWSBWQUlPIENPTlRST0wgREVWSUNFIERSSVZFUgogUDoJU3RlbGlhbiBQb3AKIE06CXN0ZWxpYW5AcG9waWVzLm5ldAorUDoJTWF0dGlhIERvbmdpbGkKK006CW1hbGF0dGlhQGxpbnV4Lml0CiBXOglodHRwOi8vcG9waWVzLm5ldC9zb255cGkvCiBTOglNYWludGFpbmVkCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9pcnEuYyBiL2FyY2gvYXJtL2tlcm5lbC9pcnEuYwppbmRleCBlYzAxZjA4Li5lMTAxODQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2lycS5jCkBAIC0xNTksOCArMTU5LDcgQEAKIAlpbnQgaXJxOwogCiAJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykKLQkJaXJxX2Rlc2NbaXJxXS5zdGF0dXMgfD0gSVJRX05PUkVRVUVTVCB8IElSUV9ERUxBWUVEX0RJU0FCTEUgfAotCQkJSVJRX05PUFJPQkU7CisJCWlycV9kZXNjW2lycV0uc3RhdHVzIHw9IElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRTsKIAogI2lmZGVmIENPTkZJR19TTVAKIAliYWRfaXJxX2Rlc2MuYWZmaW5pdHkgPSBDUFVfTUFTS19BTEw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMKaW5kZXggNDAwMzliMi4uMjcwM2E3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3RpbWUuYwpAQCAtODcsNyArODcsNyBAQAogCS5yZWFkCQk9IGlteF9nZXRfY3ljbGVzLAogCS5tYXNrCQk9IDB4RkZGRkZGRkYsCiAJLnNoaWZ0IAkJPSAyMCwKLQkuaXNfY29udGludW91cyAJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGlteF9jbG9ja3NvdXJjZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCmluZGV4IDJlYzlhOWUuLjQ1MDY4YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCkBAIC0zOTUsNyArMzk1LDcgQEAKIAkucmVhZAkJPSBpeHA0eHhfZ2V0X2N5Y2xlcywKIAkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKIAkuc2hpZnQgCQk9IDIwLAotCS5pc19jb250aW51b3VzIAk9IDEsCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAogdW5zaWduZWQgbG9uZyBpeHA0eHhfdGltZXJfZnJlcSA9IEZSRVE7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3RpbWUuYwppbmRleCA1NzczYjU1Li43ZTEzMmZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAkucmVhZAkJPSBuZXR4X2dldF9jeWNsZXMsCiAJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCiAJLnNoaWZ0IAkJPSAyMCwKLQkuaXNfY29udGludW91cyAJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMKaW5kZXggZWUyYmViNC4uZmMzYjgyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJLnJlYWQgICAgICAgICAgID0gcHhhX2dldF9jeWNsZXMsCiAJLm1hc2sgICAgICAgICAgID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCiAJLnNoaWZ0ICAgICAgICAgID0gMjAsCi0JLmlzX2NvbnRpbnVvdXMgID0gMSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgcHhhX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYwppbmRleCBkNDdlMzlmLi41OTc0NzY4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCkBAIC04LDcgKzgsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM2LDEyICszNSwxMSBAQAogc3RhdGljIHN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhIGV0aF9kYXRhWzJdOwogZXh0ZXJuIHN0cnVjdCBsY2RjX3BsYXRmb3JtX2RhdGEgYXRzdGsxMDAwX2ZiMF9kYXRhOwogCi1zdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHNwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gc3BpMF9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKIAl7CisJCS8qIFFWR0EgZGlzcGxheSAqLwogCQkubW9kYWxpYXMJPSAibHR2MzUwcXYiLAotCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKilHUElPX1BJTl9QQSg0KSwKIAkJLm1heF9zcGVlZF9oegk9IDE2MDAwMDAwLAotCQkuYnVzX251bQk9IDAsCiAJCS5jaGlwX3NlbGVjdAk9IDEsCiAJfSwKIH07CkBAIC0xNDksOCArMTQ3LDcgQEAKIAogCXNldF9od19hZGRyKGF0MzJfYWRkX2RldmljZV9ldGgoMCwgJmV0aF9kYXRhWzBdKSk7CiAKLQlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhzcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShzcGlfYm9hcmRfaW5mbykpOwotCWF0MzJfYWRkX2RldmljZV9zcGkoMCk7CisJYXQzMl9hZGRfZGV2aWNlX3NwaSgwLCBzcGkwX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoc3BpMF9ib2FyZF9pbmZvKSk7CiAJYXQzMl9hZGRfZGV2aWNlX2xjZGMoMCwgJmF0c3RrMTAwMF9mYjBfZGF0YSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGxfdGFibGUuUyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGxfdGFibGUuUwppbmRleCBkYjhmOGI1Li43YzI3OTU4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCkBAIC04LDE0ICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpZiAhZGVmaW5lZChDT05GSUdfTkZTRCkgJiYgIWRlZmluZWQoQ09ORklHX05GU0RfTU9EVUxFKQotI2RlZmluZSBzeXNfbmZzc2VydmN0bCBzeXNfbmlfc3lzY2FsbAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChDT05GSUdfU1lTVl9JUEMpCi0jIGRlZmluZSBzeXNfaXBjCXN5c19uaV9zeXNjYWxsCi0jZW5kaWYKLQogCS5zZWN0aW9uIC5yb2RhdGEsImEiLEBwcm9nYml0cwogCS50eXBlCXN5c19jYWxsX3RhYmxlLEBvYmplY3QKIAkuZ2xvYmFsCXN5c19jYWxsX3RhYmxlCkBAIC0xMjksNyArMTIxLDcgQEAKIAkubG9uZwlzeXNfZ2V0aXRpbWVyCQkvKiAxMDUgKi8KIAkubG9uZwlzeXNfc3dhcG9mZgogCS5sb25nCXN5c19zeXNpbmZvCi0JLmxvbmcJc3lzX2lwYworCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX2lwYyBicmllZmx5ICovCiAJLmxvbmcJc3lzX3NlbmRmaWxlCiAJLmxvbmcJc3lzX3NldGRvbWFpbm5hbWUJLyogMTEwICovCiAJLmxvbmcJc3lzX25ld3VuYW1lCkBAIC0yODcsNCArMjc5LDE2IEBACiAJLmxvbmcJc3lzX3RlZQogCS5sb25nCXN5c192bXNwbGljZQogCS5sb25nCV9fc3lzX2Vwb2xsX3B3YWl0CS8qIDI2NSAqLworCS5sb25nCXN5c19tc2dnZXQKKwkubG9uZwlzeXNfbXNnc25kCisJLmxvbmcJc3lzX21zZ3JjdgorCS5sb25nCXN5c19tc2djdGwKKwkubG9uZwlzeXNfc2VtZ2V0CQkvKiAyNzAgKi8KKwkubG9uZwlzeXNfc2Vtb3AKKwkubG9uZwlzeXNfc2VtY3RsCisJLmxvbmcJc3lzX3NlbXRpbWVkb3AKKwkubG9uZwlzeXNfc2htYXQKKwkubG9uZwlzeXNfc2htZ2V0CQkvKiAyNzUgKi8KKwkubG9uZwlzeXNfc2htZHQKKwkubG9uZwlzeXNfc2htY3RsCiAJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIHI4IGlzIHNhdHVyYXRlZCBhdCBucl9zeXNjYWxscyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jCmluZGV4IGEyZjc0YWYuLmMxMDgzM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90aW1lLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAkucmVhZAkJPSByZWFkX2N5Y2xlX2NvdW50LAogCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAogCS5zaGlmdAkJPSAxNiwKLQkuaXNfY29udGludW91cwk9IDEsCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAwMC5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMKaW5kZXggYzFlNDc3ZS4uYmMyMzU1MCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCkBAIC0zMTAsOCArMzExLDYgQEAKIHsKIAl1MzIgY29udHJvbDsKIAotCUJVR19PTihjbGstPmluZGV4ID4gNyk7Ci0KIAljb250cm9sID0gc21fcmVhZGwoJnN5c3RlbV9tYW5hZ2VyLCBQTV9HQ0NUUkwgKyA0ICogY2xrLT5pbmRleCk7CiAJaWYgKGVuYWJsZWQpCiAJCWNvbnRyb2wgfD0gU01fQklUKENFTik7CkBAIC0zMjUsMTEgKzMyNCw2IEBACiAJdTMyIGNvbnRyb2w7CiAJdW5zaWduZWQgbG9uZyBkaXYgPSAxOwogCi0JQlVHX09OKGNsay0+aW5kZXggPiA3KTsKLQotCWlmICghY2xrLT5wYXJlbnQpCi0JCXJldHVybiAwOwotCiAJY29udHJvbCA9IHNtX3JlYWRsKCZzeXN0ZW1fbWFuYWdlciwgUE1fR0NDVFJMICsgNCAqIGNsay0+aW5kZXgpOwogCWlmIChjb250cm9sICYgU01fQklUKERJVkVOKSkKIAkJZGl2ID0gMiAqIChTTV9CRkVYVChESVYsIGNvbnRyb2wpICsgMSk7CkBAIC0zNDIsMTEgKzMzNiw2IEBACiAJdTMyIGNvbnRyb2w7CiAJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSwgYWN0dWFsX3JhdGUsIGRpdjsKIAotCUJVR19PTihjbGstPmluZGV4ID4gNyk7Ci0KLQlpZiAoIWNsay0+cGFyZW50KQotCQlyZXR1cm4gMDsKLQogCXBhcmVudF9yYXRlID0gY2xrLT5wYXJlbnQtPmdldF9yYXRlKGNsay0+cGFyZW50KTsKIAljb250cm9sID0gc21fcmVhZGwoJnN5c3RlbV9tYW5hZ2VyLCBQTV9HQ0NUUkwgKyA0ICogY2xrLT5pbmRleCk7CiAKQEAgLTM3MywxMSArMzYyLDggQEAKIHsKIAl1MzIgY29udHJvbDsKIAotCUJVR19PTihjbGstPmluZGV4ID4gNyk7Ci0KIAlwcmludGsoImNsayAlczogbmV3IHBhcmVudCAlcyAod2FzICVzKVxuIiwKLQkgICAgICAgY2xrLT5uYW1lLCBwYXJlbnQtPm5hbWUsCi0JICAgICAgIGNsay0+cGFyZW50ID8gY2xrLT5wYXJlbnQtPm5hbWUgOiAiKG51bGwpIik7CisJICAgICAgIGNsay0+bmFtZSwgcGFyZW50LT5uYW1lLCBjbGstPnBhcmVudC0+bmFtZSk7CiAKIAljb250cm9sID0gc21fcmVhZGwoJnN5c3RlbV9tYW5hZ2VyLCBQTV9HQ0NUUkwgKyA0ICogY2xrLT5pbmRleCk7CiAKQEAgLTM5OSw2ICszODUsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IGdlbmNsa19pbml0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIGNvbnRyb2w7CisJc3RydWN0IGNsayAqcGFyZW50OworCisJQlVHX09OKGNsay0+aW5kZXggPiA3KTsKKworCWNvbnRyb2wgPSBzbV9yZWFkbCgmc3lzdGVtX21hbmFnZXIsIFBNX0dDQ1RSTCArIDQgKiBjbGstPmluZGV4KTsKKwlpZiAoY29udHJvbCAmIFNNX0JJVChPU0NTRUwpKQorCQlwYXJlbnQgPSAoY29udHJvbCAmIFNNX0JJVChQTExTRUwpKSA/ICZwbGwxIDogJm9zYzE7CisJZWxzZQorCQlwYXJlbnQgPSAoY29udHJvbCAmIFNNX0JJVChQTExTRUwpKSA/ICZwbGwwIDogJm9zYzA7CisKKwljbGstPnBhcmVudCA9IHBhcmVudDsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBTeXN0ZW0gcGVyaXBoZXJhbHMKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03NTAsOCArNzUyLDQxIEBACiBERUZJTkVfREVWKGF0bWVsX3NwaSwgMSk7CiBERVZfQ0xLKHNwaV9jbGssIGF0bWVsX3NwaTEsIHBiYSwgMSk7CiAKLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBhdDMyX2FkZF9kZXZpY2Vfc3BpKHVuc2lnbmVkIGludCBpZCkKK3N0YXRpYyB2b2lkCithdDMyX3NwaV9zZXR1cF9zbGF2ZXModW5zaWduZWQgaW50IGJ1c19udW0sIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyAqYiwKKwkJICAgICAgdW5zaWduZWQgaW50IG4sIGNvbnN0IHU4ICpwaW5zKQogeworCXVuc2lnbmVkIGludCBwaW4sIG1vZGU7CisKKwlmb3IgKDsgbjsgbi0tLCBiKyspIHsKKwkJYi0+YnVzX251bSA9IGJ1c19udW07CisJCWlmIChiLT5jaGlwX3NlbGVjdCA+PSA0KQorCQkJY29udGludWU7CisJCXBpbiA9ICh1bnNpZ25lZCliLT5jb250cm9sbGVyX2RhdGE7CisJCWlmICghcGluKSB7CisJCQlwaW4gPSBwaW5zW2ItPmNoaXBfc2VsZWN0XTsKKwkJCWItPmNvbnRyb2xsZXJfZGF0YSA9ICh2b2lkICopcGluOworCQl9CisJCW1vZGUgPSBBVDMyX0dQSU9GX09VVFBVVDsKKwkJaWYgKCEoYi0+bW9kZSAmIFNQSV9DU19ISUdIKSkKKwkJCW1vZGUgfD0gQVQzMl9HUElPRl9ISUdIOworCQlhdDMyX3NlbGVjdF9ncGlvKHBpbiwgbW9kZSk7CisJfQorfQorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQKK2F0MzJfYWRkX2RldmljZV9zcGkodW5zaWduZWQgaW50IGlkLCBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCBuKQoreworCS8qCisJICogTWFuYWdlIHRoZSBjaGlwc2VsZWN0cyBhcyBHUElPcywgbm9ybWFsbHkgdXNpbmcgdGhlIHNhbWUgcGlucworCSAqIHRoZSBTUEkgY29udHJvbGxlciBleHBlY3RzOyBidXQgYm9hcmRzIGNhbiB1c2Ugb3RoZXIgcGlucy4KKwkgKi8KKwlzdGF0aWMgdTggX19pbml0ZGF0YSBzcGkwX3BpbnNbXSA9CisJCXsgR1BJT19QSU5fUEEoMyksIEdQSU9fUElOX1BBKDQpLAorCQkgIEdQSU9fUElOX1BBKDUpLCBHUElPX1BJTl9QQSgyMCksIH07CisJc3RhdGljIHU4IF9faW5pdGRhdGEgc3BpMV9waW5zW10gPQorCQl7IEdQSU9fUElOX1BCKDIpLCBHUElPX1BJTl9QQigzKSwKKwkJICBHUElPX1BJTl9QQig0KSwgR1BJT19QSU5fUEEoMjcpLCB9OwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKIAlzd2l0Y2ggKGlkKSB7CkBAIC03NjAsMTQgKzc5NSw3IEBACiAJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDApLCAgUEVSSVBIX0EsIDApOwkvKiBNSVNPCSAqLwogCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgxKSwgIFBFUklQSF9BLCAwKTsJLyogTU9TSQkgKi8KIAkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMiksICBQRVJJUEhfQSwgMCk7CS8qIFNDSwkgKi8KLQotCQkvKiBOUENTWzI6MF0gKi8KLQkJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQSgzKSwKLQkJCQkgQVQzMl9HUElPRl9PVVRQVVQgfCBBVDMyX0dQSU9GX0hJR0gpOwotCQlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BBKDQpLAotCQkJCSBBVDMyX0dQSU9GX09VVFBVVCB8IEFUMzJfR1BJT0ZfSElHSCk7Ci0JCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEEoNSksCi0JCQkJIEFUMzJfR1BJT0ZfT1VUUFVUIHwgQVQzMl9HUElPRl9ISUdIKTsKKwkJYXQzMl9zcGlfc2V0dXBfc2xhdmVzKDAsIGIsIG4sIHNwaTBfcGlucyk7CiAJCWJyZWFrOwogCiAJY2FzZSAxOgpAQCAtNzc1LDIwICs4MDMsMTQgQEAKIAkJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMCksICBQRVJJUEhfQiwgMCk7CS8qIE1JU08gICovCiAJCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDEpLCAgUEVSSVBIX0IsIDApOwkvKiBNT1NJICAqLwogCQlzZWxlY3RfcGVyaXBoZXJhbChQQig1KSwgIFBFUklQSF9CLCAwKTsJLyogU0NLICAgKi8KLQotCQkvKiBOUENTWzI6MF0gKi8KLQkJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQigyKSwKLQkJCQkgQVQzMl9HUElPRl9PVVRQVVQgfCBBVDMyX0dQSU9GX0hJR0gpOwotCQlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BCKDMpLAotCQkJCSBBVDMyX0dQSU9GX09VVFBVVCB8IEFUMzJfR1BJT0ZfSElHSCk7Ci0JCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEIoNCksCi0JCQkJIEFUMzJfR1BJT0ZfT1VUUFVUIHwgQVQzMl9HUElPRl9ISUdIKTsKKwkJYXQzMl9zcGlfc2V0dXBfc2xhdmVzKDEsIGIsIG4sIHNwaTFfcGlucyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5VTEw7CiAJfQogCisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oYiwgbik7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBkZXYpOwogCXJldHVybiBwZGV2OwogfQpAQCAtODcyLDYgKzg5NCw1MCBAQAogCXJldHVybiBwZGV2OwogfQogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEdDTEsKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3RydWN0IGNsayBnY2xrMCA9IHsKKwkubmFtZQkJPSAiZ2NsazAiLAorCS5tb2RlCQk9IGdlbmNsa19tb2RlLAorCS5nZXRfcmF0ZQk9IGdlbmNsa19nZXRfcmF0ZSwKKwkuc2V0X3JhdGUJPSBnZW5jbGtfc2V0X3JhdGUsCisJLnNldF9wYXJlbnQJPSBnZW5jbGtfc2V0X3BhcmVudCwKKwkuaW5kZXgJCT0gMCwKK307CitzdGF0aWMgc3RydWN0IGNsayBnY2xrMSA9IHsKKwkubmFtZQkJPSAiZ2NsazEiLAorCS5tb2RlCQk9IGdlbmNsa19tb2RlLAorCS5nZXRfcmF0ZQk9IGdlbmNsa19nZXRfcmF0ZSwKKwkuc2V0X3JhdGUJPSBnZW5jbGtfc2V0X3JhdGUsCisJLnNldF9wYXJlbnQJPSBnZW5jbGtfc2V0X3BhcmVudCwKKwkuaW5kZXgJCT0gMSwKK307CitzdGF0aWMgc3RydWN0IGNsayBnY2xrMiA9IHsKKwkubmFtZQkJPSAiZ2NsazIiLAorCS5tb2RlCQk9IGdlbmNsa19tb2RlLAorCS5nZXRfcmF0ZQk9IGdlbmNsa19nZXRfcmF0ZSwKKwkuc2V0X3JhdGUJPSBnZW5jbGtfc2V0X3JhdGUsCisJLnNldF9wYXJlbnQJPSBnZW5jbGtfc2V0X3BhcmVudCwKKwkuaW5kZXgJCT0gMiwKK307CitzdGF0aWMgc3RydWN0IGNsayBnY2xrMyA9IHsKKwkubmFtZQkJPSAiZ2NsazMiLAorCS5tb2RlCQk9IGdlbmNsa19tb2RlLAorCS5nZXRfcmF0ZQk9IGdlbmNsa19nZXRfcmF0ZSwKKwkuc2V0X3JhdGUJPSBnZW5jbGtfc2V0X3JhdGUsCisJLnNldF9wYXJlbnQJPSBnZW5jbGtfc2V0X3BhcmVudCwKKwkuaW5kZXgJCT0gMywKK307CitzdGF0aWMgc3RydWN0IGNsayBnY2xrNCA9IHsKKwkubmFtZQkJPSAiZ2NsazQiLAorCS5tb2RlCQk9IGdlbmNsa19tb2RlLAorCS5nZXRfcmF0ZQk9IGdlbmNsa19nZXRfcmF0ZSwKKwkuc2V0X3JhdGUJPSBnZW5jbGtfc2V0X3JhdGUsCisJLnNldF9wYXJlbnQJPSBnZW5jbGtfc2V0X3BhcmVudCwKKwkuaW5kZXgJCT0gNCwKK307CisKIHN0cnVjdCBjbGsgKmF0MzJfY2xvY2tfbGlzdFtdID0gewogCSZvc2MzMmssCiAJJm9zYzAsCkBAIC05MDgsNiArOTc0LDExIEBACiAJJmF0bWVsX3NwaTFfc3BpX2NsaywKIAkmbGNkYzBfaGNsaywKIAkmbGNkYzBfcGl4Y2xrLAorCSZnY2xrMCwKKwkmZ2NsazEsCisJJmdjbGsyLAorCSZnY2xrMywKKwkmZ2NsazQsCiB9OwogdW5zaWduZWQgaW50IGF0MzJfbnJfY2xvY2tzID0gQVJSQVlfU0laRShhdDMyX2Nsb2NrX2xpc3QpOwogCkBAIC05MzYsNiArMTAwNywxMyBAQAogCWlmIChzbV9yZWFkbChzbSwgUE1fUExMMSkgJiBTTV9CSVQoUExMT1NDKSkKIAkJcGxsMS5wYXJlbnQgPSAmb3NjMTsKIAorCWdlbmNsa19pbml0X3BhcmVudCgmZ2NsazApOworCWdlbmNsa19pbml0X3BhcmVudCgmZ2NsazEpOworCWdlbmNsa19pbml0X3BhcmVudCgmZ2NsazIpOworCWdlbmNsa19pbml0X3BhcmVudCgmZ2NsazMpOworCWdlbmNsa19pbml0X3BhcmVudCgmZ2NsazQpOworCWdlbmNsa19pbml0X3BhcmVudCgmbGNkYzBfcGl4Y2xrKTsKKwogCS8qCiAJICogVHVybiBvbiBhbGwgY2xvY2tzIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgdXNlciBhbHJlYWR5LCBhbmQKIAkgKiB0dXJuIG9mZiBldmVyeXRoaW5nIGVsc2UuIFdlIG9ubHkgZG8gdGhpcyBmb3IgbW9kdWxlCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMKaW5kZXggM2QwZDEwOS4uNDllN2IxMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYwpAQCAtNjMsNyArNjMsMTEgQEAKIAogc3RhdGljIHZvaWQgX19jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JQlVHX09OKGNsay0+dXNlcnMgPT0gMCk7CisJaWYgKGNsay0+dXNlcnMgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtaXNtYXRjaGVkIGRpc2FibGVcbiIsIGNsay0+bmFtZSk7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoLS1jbGstPnVzZXJzID09IDAgJiYgY2xrLT5tb2RlKQogCQljbGstPm1vZGUoY2xrLCAwKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKaW5kZXggNTk1ZmI3Ny4uMWRmNGExZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcKKysrIGIvYXJjaC9pMzg2L0tjb25maWcKQEAgLTE4LDYgKzE4LDE4IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQ0xPQ0tTT1VSQ0VfV0FUQ0hET0cKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKKwlib29sCisJZGVmYXVsdCB5CisKIGNvbmZpZyBMT0NLREVQX1NVUFBPUlQKIAlib29sCiAJZGVmYXVsdCB5CkBAIC03NCw2ICs4Niw4IEBACiAKIG1lbnUgIlByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcyIKIAorc291cmNlICJrZXJuZWwvdGltZS9LY29uZmlnIgorCiBjb25maWcgU01QCiAJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKIAktLS1oZWxwLS0tCkBAIC0yMDUsNyArMjE5LDcgQEAKIAogY29uZmlnIFZNSQogCWJvb2wgIlZNSSBQYXJhdmlydC1vcHMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBBUkFWSVJUCisJZGVwZW5kcyBvbiBQQVJBVklSVCAmJiAhTk9fSFoKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBWTUkgcHJvdmlkZXMgYSBwYXJhdmlydHVhbGl6ZWQgaW50ZXJmYWNlIHRvIG11bHRpcGxlIGh5cGVydmlzb3JzCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZQppbmRleCBjYmU0ZTYwLi40YWUzZGNmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKQEAgLTE4LDcgKzE4LDcgQEAKIG9iai0kKENPTkZJR19YODZfQ1BVSUQpCQkrPSBjcHVpZC5vCiBvYmotJChDT05GSUdfTUlDUk9DT0RFKQkJKz0gbWljcm9jb2RlLm8KIG9iai0kKENPTkZJR19BUE0pCQkrPSBhcG0ubwotb2JqLSQoQ09ORklHX1g4Nl9TTVApCQkrPSBzbXAubyBzbXBib290Lm8KK29iai0kKENPTkZJR19YODZfU01QKQkJKz0gc21wLm8gc21wYm9vdC5vIHRzY19zeW5jLm8KIG9iai0kKENPTkZJR19YODZfVFJBTVBPTElORSkJKz0gdHJhbXBvbGluZS5vCiBvYmotJChDT05GSUdfWDg2X01QUEFSU0UpCSs9IG1wcGFyc2Uubwogb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkrPSBhcGljLm8gbm1pLm8KQEAgLTMyLDcgKzMyLDYgQEAKIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KIG9iai15CQkJCSs9IHN5c2VudGVyLm8gdnN5c2NhbGwubwogb2JqLSQoQ09ORklHX0FDUElfU1JBVCkgCSs9IHNyYXQubwotb2JqLSQoQ09ORklHX0hQRVRfVElNRVIpIAkrPSB0aW1lX2hwZXQubwogb2JqLSQoQ09ORklHX0VGSSkgCQkrPSBlZmkubyBlZmlfc3R1Yi5vCiBvYmotJChDT05GSUdfRE9VQkxFRkFVTFQpIAkrPSBkb3VibGVmYXVsdC5vCiBvYmotJChDT05GSUdfVk04NikJCSs9IHZtODYubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKaW5kZXggZTk0YWZmNi4uZTVlYjk3YSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGlfcG10bXIuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC02MTUsNiArNjE2LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9ocGV0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiB7CkBAIC02NDUsMjQgKzY0NywxMSBAQAogCQlocGV0X3Jlcy0+ZW5kID0gKDEgKiAxMDI0KSAtIDE7CiAJfQogCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCXZ4dGltZS5ocGV0X2FkZHJlc3MgPSBocGV0X3RibC0+YWRkcmVzcy5hZGRyZXNzOwotCisJaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHJlc3MuYWRkcmVzczsKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSFBFVCBpZDogJSN4IGJhc2U6ICUjbHhcbiIsCi0JCWhwZXRfdGJsLT5pZCwgdnh0aW1lLmhwZXRfYWRkcmVzcyk7CisJICAgICAgIGhwZXRfdGJsLT5pZCwgaHBldF9hZGRyZXNzKTsKIAotCXJlc19zdGFydCA9IHZ4dGltZS5ocGV0X2FkZHJlc3M7Ci0jZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWDg2ICovCi0JewotCQlleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7Ci0KLQkJaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHJlc3MuYWRkcmVzczsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkhQRVQgaWQ6ICUjeCBiYXNlOiAlI2x4XG4iLAotCQkJaHBldF90YmwtPmlkLCBocGV0X2FkZHJlc3MpOwotCi0JCXJlc19zdGFydCA9IGhwZXRfYWRkcmVzczsKLQl9Ci0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogWDg2ICovCisJcmVzX3N0YXJ0ID0gaHBldF9hZGRyZXNzOwogCiAJaWYgKGhwZXRfcmVzKSB7CiAJCWhwZXRfcmVzLT5zdGFydCA9IHJlc19zdGFydDsKQEAgLTY3NiwxMCArNjY1LDYgQEAKICNkZWZpbmUJYWNwaV9wYXJzZV9ocGV0CU5VTEwKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgotZXh0ZXJuIHUzMiBwbXRtcl9pb3BvcnQ7Ci0jZW5kaWYKLQogc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9mYWR0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiB7CiAKQEAgLTg2NSwxMCArODUwLDkgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBhY3BpX3Byb2Nlc3NfbWFkdCh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCWludCBjb3VudCwgZXJyb3I7CisJaW50IGVycm9yOwogCi0JY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX01BRFQsIGFjcGlfcGFyc2VfbWFkdCk7Ci0JaWYgKGNvdW50ID49IDEpIHsKKwlpZiAoIWFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfTUFEVCwgYWNwaV9wYXJzZV9tYWR0KSkgewogCiAJCS8qCiAJCSAqIFBhcnNlIE1BRFQgTEFQSUMgZW50cmllcwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMgYi9hcmNoL2kzODYva2VybmVsL2FwaWMuYwppbmRleCBmNDE1OWUwLi45NjU1YzIzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FwaWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwaWMuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGlfcG10bXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KQEAgLTQ1LDEyOCArNDcsNTQ5IEBACiAjaW5jbHVkZSAiaW9fcG9ydHMuaCIKIAogLyoKLSAqIGNwdV9tYXNrIHRoYXQgZGVub3RlcyB0aGUgQ1BVcyB0aGF0IG5lZWRzIHRpbWVyIGludGVycnVwdCBjb21pbmcgaW4gYXMKLSAqIElQSXMgaW4gcGxhY2Ugb2YgbG9jYWwgQVBJQyB0aW1lcnMKKyAqIFNhbml0eSBjaGVjawogICovCi1zdGF0aWMgY3B1bWFza190IHRpbWVyX2JjYXN0X2lwaTsKKyNpZiAoU1BVUklPVVNfQVBJQ19WRUNUT1IgJiAweDBGKSAhPSAweDBGCisjIGVycm9yIFNQVVJJT1VTX0FQSUNfVkVDVE9SIGRlZmluaXRpb24gZXJyb3IKKyNlbmRpZgogCiAvKgogICogS25vYiB0byBjb250cm9sIG91ciB3aWxsaW5nbmVzcyB0byBlbmFibGUgdGhlIGxvY2FsIEFQSUMuCisgKgorICogLTE9Zm9yY2UtZGlzYWJsZSwgKzE9Zm9yY2UtZW5hYmxlCiAgKi8KLXN0YXRpYyBpbnQgZW5hYmxlX2xvY2FsX2FwaWMgX19pbml0ZGF0YSA9IDA7IC8qIC0xPWZvcmNlLWRpc2FibGUsICsxPWZvcmNlLWVuYWJsZSAqLworc3RhdGljIGludCBlbmFibGVfbG9jYWxfYXBpYyBfX2luaXRkYXRhID0gMDsKIAotc3RhdGljIGlubGluZSB2b2lkIGxhcGljX2Rpc2FibGUodm9pZCkKLXsKLQllbmFibGVfbG9jYWxfYXBpYyA9IC0xOwotCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxhcGljX2VuYWJsZSh2b2lkKQotewotCWVuYWJsZV9sb2NhbF9hcGljID0gMTsKLX0KKy8qIExvY2FsIEFQSUMgdGltZXIgdmVyaWZpY2F0aW9uIG9rICovCitzdGF0aWMgaW50IGxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rOwogCiAvKgotICogRGVidWcgbGV2ZWwKKyAqIERlYnVnIGxldmVsLCBleHBvcnRlZCBmb3IgaW9fYXBpYy5jCiAgKi8KIGludCBhcGljX3ZlcmJvc2l0eTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBjYWxpYnJhdGlvbl9yZXN1bHQ7CiAKK3N0YXRpYyBpbnQgbGFwaWNfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGRlbHRhLAorCQkJICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCk7CitzdGF0aWMgdm9pZCBsYXBpY190aW1lcl9zZXR1cChlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCk7CitzdGF0aWMgdm9pZCBsYXBpY190aW1lcl9icm9hZGNhc3QoY3B1bWFza190IG1hc2spOwogc3RhdGljIHZvaWQgYXBpY19wbV9hY3RpdmF0ZSh2b2lkKTsKIAotc3RhdGljIGludCBtb2Rlcm5fYXBpYyh2b2lkKQorLyoKKyAqIFRoZSBsb2NhbCBhcGljIHRpbWVyIGNhbiBiZSB1c2VkIGZvciBhbnkgZnVuY3Rpb24gd2hpY2ggaXMgQ1BVIGxvY2FsLgorICovCitzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBsYXBpY19jbG9ja2V2ZW50ID0geworCS5uYW1lCQk9ICJsYXBpYyIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9UCisJCQl8IENMT0NLX0VWVF9GRUFUX0MzU1RPUCB8IENMT0NLX0VWVF9GRUFUX0RVTU1ZLAorCS5zaGlmdAkJPSAzMiwKKwkuc2V0X21vZGUJPSBsYXBpY190aW1lcl9zZXR1cCwKKwkuc2V0X25leHRfZXZlbnQJPSBsYXBpY19uZXh0X2V2ZW50LAorCS5icm9hZGNhc3QJPSBsYXBpY190aW1lcl9icm9hZGNhc3QsCisJLnJhdGluZwkJPSAxMDAsCisJLmlycQkJPSAtMSwKK307CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSwgbGFwaWNfZXZlbnRzKTsKKworLyogTG9jYWwgQVBJQyB3YXMgZGlzYWJsZWQgYnkgdGhlIEJJT1MgYW5kIGVuYWJsZWQgYnkgdGhlIGtlcm5lbCAqLworc3RhdGljIGludCBlbmFibGVkX3ZpYV9hcGljYmFzZTsKKworLyoKKyAqIEdldCB0aGUgTEFQSUMgdmVyc2lvbgorICovCitzdGF0aWMgaW5saW5lIGludCBsYXBpY19nZXRfdmVyc2lvbih2b2lkKQogewotCXVuc2lnbmVkIGludCBsdnIsIHZlcnNpb247Ci0JLyogQU1EIHN5c3RlbXMgdXNlIG9sZCBBUElDIHZlcnNpb25zLCBzbyBjaGVjayB0aGUgQ1BVICovCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCAmJgotCQlib290X2NwdV9kYXRhLng4NiA+PSAweGYpCi0JCXJldHVybiAxOwotCWx2ciA9IGFwaWNfcmVhZChBUElDX0xWUik7Ci0JdmVyc2lvbiA9IEdFVF9BUElDX1ZFUlNJT04obHZyKTsKLQlyZXR1cm4gdmVyc2lvbiA+PSAweDE0OworCXJldHVybiBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOwogfQogCiAvKgotICogJ3doYXQgc2hvdWxkIHdlIGRvIGlmIHdlIGdldCBhIGh3IGlycSBldmVudCBvbiBhbiBpbGxlZ2FsIHZlY3RvcicuCi0gKiBlYWNoIGFyY2hpdGVjdHVyZSBoYXMgdG8gYW5zd2VyIHRoaXMgdGhlbXNlbHZlcy4KKyAqIENoZWNrLCBpZiB0aGUgQVBJQyBpcyBpbnRlZ3JhdGVkIG9yIGEgc2VwZXJhdGUgY2hpcAogICovCi12b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgaW5saW5lIGludCBsYXBpY19pc19pbnRlZ3JhdGVkKHZvaWQpCiB7Ci0JcHJpbnRrKCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOwotCS8qCi0JICogQ3VycmVudGx5IHVuZXhwZWN0ZWQgdmVjdG9ycyBoYXBwZW4gb25seSBvbiBTTVAgYW5kIEFQSUMuCi0JICogV2UgX211c3RfIGFjayB0aGVzZSBiZWNhdXNlIGV2ZXJ5IGxvY2FsIEFQSUMgaGFzIG9ubHkgTgotCSAqIGlycSBzbG90cyBwZXIgcHJpb3JpdHkgbGV2ZWwsIGFuZCBhICdoYW5naW5nLCB1bmFja2VkJyBJUlEKLQkgKiBob2xkcyB1cCBhbiBpcnEgc2xvdCAtIGluIGV4Y2Vzc2l2ZSBjYXNlcyAod2hlbiBtdWx0aXBsZQotCSAqIHVuZXhwZWN0ZWQgdmVjdG9ycyBvY2N1cikgdGhhdCBtaWdodCBsb2NrIHVwIHRoZSBBUElDCi0JICogY29tcGxldGVseS4KLQkgKiBCdXQgb25seSBhY2sgd2hlbiB0aGUgQVBJQyBpcyBlbmFibGVkIC1BSwotCSAqLwotCWlmIChjcHVfaGFzX2FwaWMpCi0JCWFja19BUElDX2lycSgpOworCXJldHVybiBBUElDX0lOVEVHUkFURUQobGFwaWNfZ2V0X3ZlcnNpb24oKSk7CiB9CiAKLXZvaWQgX19pbml0IGFwaWNfaW50cl9pbml0KHZvaWQpCisvKgorICogQ2hlY2ssIHdoZXRoZXIgdGhpcyBpcyBhIG1vZGVybiBvciBhIGZpcnN0IGdlbmVyYXRpb24gQVBJQworICovCitzdGF0aWMgaW50IG1vZGVybl9hcGljKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX1NNUAotCXNtcF9pbnRyX2luaXQoKTsKLSNlbmRpZgotCS8qIHNlbGYgZ2VuZXJhdGVkIElQSSBmb3IgbG9jYWwgQVBJQyB0aW1lciAqLwotCXNldF9pbnRyX2dhdGUoTE9DQUxfVElNRVJfVkVDVE9SLCBhcGljX3RpbWVyX2ludGVycnVwdCk7Ci0KLQkvKiBJUEkgdmVjdG9ycyBmb3IgQVBJQyBzcHVyaW91cyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLwotCXNldF9pbnRyX2dhdGUoU1BVUklPVVNfQVBJQ19WRUNUT1IsIHNwdXJpb3VzX2ludGVycnVwdCk7Ci0Jc2V0X2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKLQotCS8qIHRoZXJtYWwgbW9uaXRvciBMVlQgaW50ZXJydXB0ICovCi0jaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCi0Jc2V0X2ludHJfZ2F0ZShUSEVSTUFMX0FQSUNfVkVDVE9SLCB0aGVybWFsX2ludGVycnVwdCk7Ci0jZW5kaWYKKwkvKiBBTUQgc3lzdGVtcyB1c2Ugb2xkIEFQSUMgdmVyc2lvbnMsIHNvIGNoZWNrIHRoZSBDUFUgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EICYmCisJICAgIGJvb3RfY3B1X2RhdGEueDg2ID49IDB4ZikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGxhcGljX2dldF92ZXJzaW9uKCkgPj0gMHgxNDsKIH0KIAotLyogVXNpbmcgQVBJQyB0byBnZW5lcmF0ZSBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0PyAqLwotaW50IHVzaW5nX2FwaWNfdGltZXIgX19yZWFkX21vc3RseSA9IDA7Ci0KLXN0YXRpYyBpbnQgZW5hYmxlZF92aWFfYXBpY2Jhc2U7Ci0KKy8qKgorICogZW5hYmxlX05NSV90aHJvdWdoX0xWVDAgLSBlbmFibGUgTk1JIHRocm91Z2ggbG9jYWwgdmVjdG9yIHRhYmxlIDAKKyAqLwogdm9pZCBlbmFibGVfTk1JX3Rocm91Z2hfTFZUMCAodm9pZCAqIGR1bW15KQogewotCXVuc2lnbmVkIGludCB2LCB2ZXI7CisJdW5zaWduZWQgaW50IHYgPSBBUElDX0RNX05NSTsKIAotCXZlciA9IGFwaWNfcmVhZChBUElDX0xWUik7Ci0JdmVyID0gR0VUX0FQSUNfVkVSU0lPTih2ZXIpOwotCXYgPSBBUElDX0RNX05NSTsJCQkvKiB1bm1hc2sgYW5kIHNldCB0byBOTUkgKi8KLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQkJLyogODI0ODlEWCAqLworCS8qIExldmVsIHRyaWdnZXJlZCBmb3IgODI0ODlEWCAqLworCWlmICghbGFwaWNfaXNfaW50ZWdyYXRlZCgpKQogCQl2IHw9IEFQSUNfTFZUX0xFVkVMX1RSSUdHRVI7CiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2KTsKIH0KIAorLyoqCisgKiBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0IC0gR2V0IG51bWJlciBvZiBwaHlzaWNhbCBicm9hZGNhc3QgSURzCisgKi8KIGludCBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KHZvaWQpCiB7Ci0JaWYgKG1vZGVybl9hcGljKCkpCi0JCXJldHVybiAweGZmOwotCWVsc2UKLQkJcmV0dXJuIDB4ZjsKKwlyZXR1cm4gbW9kZXJuX2FwaWMoKSA/IDB4ZmYgOiAweGY7CiB9CiAKLWludCBnZXRfbWF4bHZ0KHZvaWQpCisvKioKKyAqIGxhcGljX2dldF9tYXhsdnQgLSBnZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZlY3RvciB0YWJsZSBlbnRyaWVzCisgKi8KK2ludCBsYXBpY19nZXRfbWF4bHZ0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IHYsIHZlciwgbWF4bHZ0OworCXVuc2lnbmVkIGludCB2ID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKIAotCXYgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwotCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odik7CiAJLyogODI0ODlEWHMgZG8gbm90IHJlcG9ydCAjIG9mIExWVCBlbnRyaWVzLiAqLwotCW1heGx2dCA9IEFQSUNfSU5URUdSQVRFRCh2ZXIpID8gR0VUX0FQSUNfTUFYTFZUKHYpIDogMjsKLQlyZXR1cm4gbWF4bHZ0OworCXJldHVybiBBUElDX0lOVEVHUkFURUQoR0VUX0FQSUNfVkVSU0lPTih2KSkgPyBHRVRfQVBJQ19NQVhMVlQodikgOiAyOwogfQogCisvKgorICogTG9jYWwgQVBJQyB0aW1lcgorICovCisKKy8qIENsb2NrIGRpdmlzb3IgaXMgc2V0IHRvIDE2ICovCisjZGVmaW5lIEFQSUNfRElWSVNPUiAxNgorCisvKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBsb2NhbCBBUElDIHRpbWVyLCB3aXRoIGEgdGltZW91dCBvZgorICogJ2Nsb2NrcycgQVBJQyBidXMgY2xvY2suIER1cmluZyBjYWxpYnJhdGlvbiB3ZSBhY3R1YWxseSBjYWxsCisgKiB0aGlzIGZ1bmN0aW9uIHR3aWNlIG9uIHRoZSBib290IENQVSwgb25jZSB3aXRoIGEgYm9ndXMgdGltZW91dAorICogdmFsdWUsIHNlY29uZCB0aW1lIGZvciByZWFsLiBUaGUgb3RoZXIgKG5vbmNhbGlicmF0aW5nKSBDUFVzCisgKiBjYWxsIHRoaXMgZnVuY3Rpb24gb25seSBvbmNlLCB3aXRoIHRoZSByZWFsLCBjYWxpYnJhdGVkIHZhbHVlLgorICoKKyAqIFdlIGRvIHJlYWRzIGJlZm9yZSB3cml0ZXMgZXZlbiBpZiB1bm5lY2Vzc2FyeSwgdG8gZ2V0IGFyb3VuZCB0aGUKKyAqIFA1IEFQSUMgZG91YmxlIHdyaXRlIGJ1Zy4KKyAqLworc3RhdGljIHZvaWQgX19zZXR1cF9BUElDX0xWVFQodW5zaWduZWQgaW50IGNsb2NrcywgaW50IG9uZXNob3QsIGludCBpcnFlbikKK3sKKwl1bnNpZ25lZCBpbnQgbHZ0dF92YWx1ZSwgdG1wX3ZhbHVlOworCisJbHZ0dF92YWx1ZSA9IExPQ0FMX1RJTUVSX1ZFQ1RPUjsKKwlpZiAoIW9uZXNob3QpCisJCWx2dHRfdmFsdWUgfD0gQVBJQ19MVlRfVElNRVJfUEVSSU9ESUM7CisJaWYgKCFsYXBpY19pc19pbnRlZ3JhdGVkKCkpCisJCWx2dHRfdmFsdWUgfD0gU0VUX0FQSUNfVElNRVJfQkFTRShBUElDX1RJTUVSX0JBU0VfRElWKTsKKworCWlmICghaXJxZW4pCisJCWx2dHRfdmFsdWUgfD0gQVBJQ19MVlRfTUFTS0VEOworCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCBsdnR0X3ZhbHVlKTsKKworCS8qCisJICogRGl2aWRlIFBJQ0xLIGJ5IDE2CisJICovCisJdG1wX3ZhbHVlID0gYXBpY19yZWFkKEFQSUNfVERDUik7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19URENSLCAodG1wX3ZhbHVlCisJCQkJJiB+KEFQSUNfVERSX0RJVl8xIHwgQVBJQ19URFJfRElWX1RNQkFTRSkpCisJCQkJfCBBUElDX1REUl9ESVZfMTYpOworCisJaWYgKCFvbmVzaG90KQorCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1RNSUNULCBjbG9ja3MvQVBJQ19ESVZJU09SKTsKK30KKworLyoKKyAqIFByb2dyYW0gdGhlIG5leHQgZXZlbnQsIHJlbGF0aXZlIHRvIG5vdworICovCitzdGF0aWMgaW50IGxhcGljX25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKKwkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19UTUlDVCwgZGVsdGEpOworCXJldHVybiAwOworfQorCisvKgorICogU2V0dXAgdGhlIGxhcGljIHRpbWVyIGluIHBlcmlvZGljIG9yIG9uZXNob3QgbW9kZQorICovCitzdGF0aWMgdm9pZCBsYXBpY190aW1lcl9zZXR1cChlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB2OworCisJLyogTGFwaWMgdXNlZCBmb3IgYnJvYWRjYXN0ID8gKi8KKwlpZiAoIWxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwkJX19zZXR1cF9BUElDX0xWVFQoY2FsaWJyYXRpb25fcmVzdWx0LAorCQkJCSAgbW9kZSAhPSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQywgMSk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwkJdiB8PSAoQVBJQ19MVlRfTUFTS0VEIHwgTE9DQUxfVElNRVJfVkVDVE9SKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2KTsKKwkJYnJlYWs7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogTG9jYWwgQVBJQyB0aW1lciBicm9hZGNhc3QgZnVuY3Rpb24KKyAqLworc3RhdGljIHZvaWQgbGFwaWNfdGltZXJfYnJvYWRjYXN0KGNwdW1hc2tfdCBtYXNrKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlzZW5kX0lQSV9tYXNrKG1hc2ssIExPQ0FMX1RJTUVSX1ZFQ1RPUik7CisjZW5kaWYKK30KKworLyoKKyAqIFNldHVwIHRoZSBsb2NhbCBBUElDIHRpbWVyIGZvciB0aGlzIENQVS4gQ29weSB0aGUgaW5pdGlsaXplZCB2YWx1ZXMKKyAqIG9mIHRoZSBib290IENQVSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrIGV2ZW50IGluIHRoZSBmcmFtZXdvcmsuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXR1cF9BUElDX3RpbWVyKHZvaWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbGV2dCA9ICZfX2dldF9jcHVfdmFyKGxhcGljX2V2ZW50cyk7CisKKwltZW1jcHkobGV2dCwgJmxhcGljX2Nsb2NrZXZlbnQsIHNpemVvZigqbGV2dCkpOworCWxldnQtPmNwdW1hc2sgPSBjcHVtYXNrX29mX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGxldnQpOworfQorCisvKgorICogSW4gdGhpcyBmdW5jdGlvbnMgd2UgY2FsaWJyYXRlIEFQSUMgYnVzIGNsb2NrcyB0byB0aGUgZXh0ZXJuYWwgdGltZXIuCisgKgorICogV2Ugd2FudCB0byBkbyB0aGUgY2FsaWJyYXRpb24gb25seSBvbmNlIHNpbmNlIHdlIHdhbnQgdG8gaGF2ZSBsb2NhbCB0aW1lcgorICogaXJxcyBzeW5jcm9uLiBDUFVzIGNvbm5lY3RlZCBieSB0aGUgc2FtZSBBUElDIGJ1cyBoYXZlIHRoZSB2ZXJ5IHNhbWUgYnVzCisgKiBmcmVxdWVuY3kuCisgKgorICogVGhpcyB3YXMgcHJldmlvdXNseSBkb25lIGJ5IHJlYWRpbmcgdGhlIFBJVC9IUEVUIGFuZCB3YWl0aW5nIGZvciBhIHdyYXAKKyAqIGFyb3VuZCB0byBmaW5kIG91dCwgdGhhdCBhIHRpY2sgaGFzIGVsYXBzZWQuIEkgaGF2ZSBhIGJveCwgd2hlcmUgdGhlIFBJVAorICogcmVhZG91dCBpcyBicm9rZW4sIHNvIGl0IG5ldmVyIGdldHMgb3V0IG9mIHRoZSB3YWl0IGxvb3AgYWdhaW4uIFRoaXMgd2FzCisgKiBhbHNvIHJlcG9ydGVkIGJ5IG90aGVycy4KKyAqCisgKiBNb25pdG9yaW5nIHRoZSBqaWZmaWVzIHZhbHVlIGlzIGluYWNjdXJhdGUgYW5kIHRoZSBjbG9ja2V2ZW50cworICogaW5mcmFzdHJ1Y3R1cmUgYWxsb3dzIHVzIHRvIGRvIGEgc2ltcGxlIHN1YnN0aXR1dGlvbiBvZiB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyLgorICoKKyAqIFRoZSBjYWxpYnJhdGlvbiByb3V0aW5lIGFsc28gdXNlcyB0aGUgcG1fdGltZXIgd2hlbiBwb3NzaWJsZSwgYXMgdGhlIFBJVAorICogaGFwcGVucyB0byBydW4gd2F5IHRvbyBzbG93IChmYWN0b3IgMi4zIG9uIG15IFZBSU8gQ29yZUR1bywgd2hpY2ggZ29lcworICogYmFjayB0byBub3JtYWwgbGF0ZXIgaW4gdGhlIGJvb3QgcHJvY2VzcykuCisgKi8KKworI2RlZmluZSBMQVBJQ19DQUxfTE9PUFMJCShIWi8xMCkKKworc3RhdGljIF9faW5pdGRhdGEgdm9sYXRpbGUgaW50IGxhcGljX2NhbF9sb29wcyA9IC0xOworc3RhdGljIF9faW5pdGRhdGEgbG9uZyBsYXBpY19jYWxfdDEsIGxhcGljX2NhbF90MjsKK3N0YXRpYyBfX2luaXRkYXRhIHVuc2lnbmVkIGxvbmcgbG9uZyBsYXBpY19jYWxfdHNjMSwgbGFwaWNfY2FsX3RzYzI7CitzdGF0aWMgX19pbml0ZGF0YSB1bnNpZ25lZCBsb25nIGxhcGljX2NhbF9wbTEsIGxhcGljX2NhbF9wbTI7CitzdGF0aWMgX19pbml0ZGF0YSB1bnNpZ25lZCBsb25nIGxhcGljX2NhbF9qMSwgbGFwaWNfY2FsX2oyOworCisvKgorICogVGVtcG9yYXJ5IGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbGFwaWNfY2FsX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0c2MgPSAwOworCWxvbmcgdGFwaWMgPSBhcGljX3JlYWQoQVBJQ19UTUNDVCk7CisJdW5zaWduZWQgbG9uZyBwbSA9IGFjcGlfcG1fcmVhZF9lYXJseSgpOworCisJaWYgKGNwdV9oYXNfdHNjKQorCQlyZHRzY2xsKHRzYyk7CisKKwlzd2l0Y2ggKGxhcGljX2NhbF9sb29wcysrKSB7CisJY2FzZSAwOgorCQlsYXBpY19jYWxfdDEgPSB0YXBpYzsKKwkJbGFwaWNfY2FsX3RzYzEgPSB0c2M7CisJCWxhcGljX2NhbF9wbTEgPSBwbTsKKwkJbGFwaWNfY2FsX2oxID0gamlmZmllczsKKwkJYnJlYWs7CisKKwljYXNlIExBUElDX0NBTF9MT09QUzoKKwkJbGFwaWNfY2FsX3QyID0gdGFwaWM7CisJCWxhcGljX2NhbF90c2MyID0gdHNjOworCQlpZiAocG0gPCBsYXBpY19jYWxfcG0xKQorCQkJcG0gKz0gQUNQSV9QTV9PVlJSVU47CisJCWxhcGljX2NhbF9wbTIgPSBwbTsKKwkJbGFwaWNfY2FsX2oyID0gamlmZmllczsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogU2V0dXAgdGhlIGJvb3QgQVBJQworICoKKyAqIENhbGlicmF0ZSBhbmQgdmVyaWZ5IHRoZSByZXN1bHQuCisgKi8KK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RfQVBJQ19jbG9jayh2b2lkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmxldnQgPSAmX19nZXRfY3B1X3ZhcihsYXBpY19ldmVudHMpOworCWNvbnN0IGxvbmcgcG1fMTAwbXMgPSBQTVRNUl9USUNLU19QRVJfU0VDLzEwOworCWNvbnN0IGxvbmcgcG1fdGhyZXNoID0gcG1fMTAwbXMvMTAwOworCXZvaWQgKCpyZWFsX2hhbmRsZXIpKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CisJdW5zaWduZWQgbG9uZyBkZWx0YWo7CisJbG9uZyBkZWx0YSwgZGVsdGFwbTsKKworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIlVzaW5nIGxvY2FsIEFQSUMgdGltZXIgaW50ZXJydXB0cy5cbiIKKwkJICAgICJjYWxpYnJhdGluZyBBUElDIHRpbWVyIC4uLlxuIik7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogUmVwbGFjZSB0aGUgZ2xvYmFsIGludGVycnVwdCBoYW5kbGVyICovCisJcmVhbF9oYW5kbGVyID0gZ2xvYmFsX2Nsb2NrX2V2ZW50LT5ldmVudF9oYW5kbGVyOworCWdsb2JhbF9jbG9ja19ldmVudC0+ZXZlbnRfaGFuZGxlciA9IGxhcGljX2NhbF9oYW5kbGVyOworCisJLyoKKwkgKiBTZXR1cCB0aGUgQVBJQyBjb3VudGVyIHRvIDFlOS4gVGhlcmUgaXMgbm8gd2F5IHRoZSBsYXBpYworCSAqIGNhbiB1bmRlcmZsb3cgaW4gdGhlIDEwMG1zIGRldGVjdGlvbiB0aW1lIGZyYW1lCisJICovCisJX19zZXR1cF9BUElDX0xWVFQoMTAwMDAwMDAwMCwgMCwgMCk7CisKKwkvKiBMZXQgdGhlIGludGVycnVwdHMgcnVuICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJd2hpbGUobGFwaWNfY2FsX2xvb3BzIDw9IExBUElDX0NBTF9MT09QUyk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogUmVzdG9yZSB0aGUgcmVhbCBldmVudCBoYW5kbGVyICovCisJZ2xvYmFsX2Nsb2NrX2V2ZW50LT5ldmVudF9oYW5kbGVyID0gcmVhbF9oYW5kbGVyOworCisJLyogQnVpbGQgZGVsdGEgdDEtdDIgYXMgYXBpYyB0aW1lciBjb3VudHMgZG93biAqLworCWRlbHRhID0gbGFwaWNfY2FsX3QxIC0gbGFwaWNfY2FsX3QyOworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLiBsYXBpYyBkZWx0YSA9ICVsZFxuIiwgZGVsdGEpOworCisJLyogQ2hlY2ssIGlmIHRoZSBQTSB0aW1lciBpcyBhdmFpbGFibGUgKi8KKwlkZWx0YXBtID0gbGFwaWNfY2FsX3BtMiAtIGxhcGljX2NhbF9wbTE7CisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIFBNIHRpbWVyIGRlbHRhID0gJWxkXG4iLCBkZWx0YXBtKTsKKworCWlmIChkZWx0YXBtKSB7CisJCXVuc2lnbmVkIGxvbmcgbXVsdDsKKwkJdTY0IHJlczsKKworCQltdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChQTVRNUl9USUNLU19QRVJfU0VDLCAyMik7CisKKwkJaWYgKGRlbHRhcG0gPiAocG1fMTAwbXMgLSBwbV90aHJlc2gpICYmCisJCSAgICBkZWx0YXBtIDwgKHBtXzEwMG1zICsgcG1fdGhyZXNoKSkgeworCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIFBNIHRpbWVyIHJlc3VsdCBva1xuIik7CisJCX0gZWxzZSB7CisJCQlyZXMgPSAoKCh1NjQpIGRlbHRhcG0pICogIG11bHQpID4+IDIyOworCQkJZG9fZGl2KHJlcywgMTAwMDAwMCk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBUElDIGNhbGlicmF0aW9uIG5vdCBjb25zaXN0ZW50ICIKKwkJCSAgICAgICAid2l0aCBQTSBUaW1lcjogJWxkbXMgaW5zdGVhZCBvZiAxMDBtc1xuIiwKKwkJCSAgICAgICAobG9uZylyZXMpOworCQkJLyogQ29ycmVjdCB0aGUgbGFwaWMgY291bnRlciB2YWx1ZSAqLworCQkJcmVzID0gKCgodTY0KSBkZWx0YSApICogcG1fMTAwbXMpOworCQkJZG9fZGl2KHJlcywgZGVsdGFwbSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJBUElDIGRlbHRhIGFkanVzdGVkIHRvIFBNLVRpbWVyOiAiCisJCQkgICAgICAgIiVsdSAoJWxkKVxuIiwgKHVuc2lnbmVkIGxvbmcpIHJlcywgZGVsdGEpOworCQkJZGVsdGEgPSAobG9uZykgcmVzOworCQl9CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSBzY2FsZWQgbWF0aCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgKi8KKwlsYXBpY19jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoZGVsdGEsIFRJQ0tfTlNFQyAqIExBUElDX0NBTF9MT09QUywgMzIpOworCWxhcGljX2Nsb2NrZXZlbnQubWF4X2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweDdGRkZGRiwgJmxhcGljX2Nsb2NrZXZlbnQpOworCWxhcGljX2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweEYsICZsYXBpY19jbG9ja2V2ZW50KTsKKworCWNhbGlicmF0aW9uX3Jlc3VsdCA9IChkZWx0YSAqIEFQSUNfRElWSVNPUikgLyBMQVBJQ19DQUxfTE9PUFM7CisKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4uLiBkZWx0YSAlbGRcbiIsIGRlbHRhKTsKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4uLiBtdWx0OiAlbGRcbiIsIGxhcGljX2Nsb2NrZXZlbnQubXVsdCk7CisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uLi4gY2FsaWJyYXRpb24gcmVzdWx0OiAldVxuIiwKKwkJICAgIGNhbGlicmF0aW9uX3Jlc3VsdCk7CisKKwlpZiAoY3B1X2hhc190c2MpIHsKKwkJZGVsdGEgPSAobG9uZykobGFwaWNfY2FsX3RzYzIgLSBsYXBpY19jYWxfdHNjMSk7CisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLi4uIENQVSBjbG9jayBzcGVlZCBpcyAiCisJCQkgICAgIiVsZC4lMDRsZCBNSHouXG4iLAorCQkJICAgIChkZWx0YSAvIExBUElDX0NBTF9MT09QUykgLyAoMTAwMDAwMCAvIEhaKSwKKwkJCSAgICAoZGVsdGEgLyBMQVBJQ19DQUxfTE9PUFMpICUgKDEwMDAwMDAgLyBIWikpOworCX0KKworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLi4uIGhvc3QgYnVzIGNsb2NrIHNwZWVkIGlzICIKKwkJICAgICIldS4lMDR1IE1Iei5cbiIsCisJCSAgICBjYWxpYnJhdGlvbl9yZXN1bHQgLyAoMTAwMDAwMCAvIEhaKSwKKwkJICAgIGNhbGlicmF0aW9uX3Jlc3VsdCAlICgxMDAwMDAwIC8gSFopKTsKKworCisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIHZlcmlmeSBBUElDIHRpbWVyXG4iKTsKKworCS8qCisJICogU2V0dXAgdGhlIGFwaWMgdGltZXIgbWFudWFsbHkKKwkgKi8KKwlsb2NhbF9hcGljX3RpbWVyX3ZlcmlmeV9vayA9IDE7CisJbGV2dC0+ZXZlbnRfaGFuZGxlciA9IGxhcGljX2NhbF9oYW5kbGVyOworCWxhcGljX3RpbWVyX3NldHVwKENMT0NLX0VWVF9NT0RFX1BFUklPRElDLCBsZXZ0KTsKKwlsYXBpY19jYWxfbG9vcHMgPSAtMTsKKworCS8qIExldCB0aGUgaW50ZXJydXB0cyBydW4gKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwl3aGlsZShsYXBpY19jYWxfbG9vcHMgPD0gTEFQSUNfQ0FMX0xPT1BTKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBTdG9wIHRoZSBsYXBpYyB0aW1lciAqLworCWxhcGljX3RpbWVyX3NldHVwKENMT0NLX0VWVF9NT0RFX1NIVVRET1dOLCBsZXZ0KTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCS8qIEppZmZpZXMgZGVsdGEgKi8KKwlkZWx0YWogPSBsYXBpY19jYWxfajIgLSBsYXBpY19jYWxfajE7CisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIGppZmZpZXMgZGVsdGEgPSAlbHVcbiIsIGRlbHRhaik7CisKKwkvKiBDaGVjaywgaWYgdGhlIFBNIHRpbWVyIGlzIGF2YWlsYWJsZSAqLworCWRlbHRhcG0gPSBsYXBpY19jYWxfcG0yIC0gbGFwaWNfY2FsX3BtMTsKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4gUE0gdGltZXIgZGVsdGEgPSAlbGRcbiIsIGRlbHRhcG0pOworCisJbG9jYWxfYXBpY190aW1lcl92ZXJpZnlfb2sgPSAwOworCisJaWYgKGRlbHRhcG0pIHsKKwkJaWYgKGRlbHRhcG0gPiAocG1fMTAwbXMgLSBwbV90aHJlc2gpICYmCisJCSAgICBkZWx0YXBtIDwgKHBtXzEwMG1zICsgcG1fdGhyZXNoKSkgeworCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIFBNIHRpbWVyIHJlc3VsdCBva1xuIik7CisJCQkvKiBDaGVjaywgaWYgdGhlIGppZmZpZXMgcmVzdWx0IGlzIGNvbnNpc3RlbnQgKi8KKwkJCWlmIChkZWx0YWogPCBMQVBJQ19DQUxfTE9PUFMtMiB8fAorCQkJICAgIGRlbHRhaiA+IExBUElDX0NBTF9MT09QUysyKSB7CisJCQkJLyoKKwkJCQkgKiBOb3Qgc3VyZSwgd2hhdCB3ZSBjYW4gZG8gYWJvdXQgdGhpcyBvbmUuCisJCQkJICogV2hlbiBoaWdoIHJlc3VsdGlvbiB0aW1lcnMgYXJlIGFjdGl2ZQorCQkJCSAqIGFuZCB0aGUgbGFwaWMgdGltZXIgZG9lcyBub3Qgc3RvcCBpbiBDMworCQkJCSAqIHdlIGFyZSBmaW5lLiBPdGhlcndpc2UgbW9yZSB0cm91YmxlIG1pZ2h0CisJCQkJICogYmUgd2FpdGluZy4gLS0gdGdseAorCQkJCSAqLworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdsb2JhbCBldmVudCBkZXZpY2UgJXMgIgorCQkJCSAgICAgICAiaGFzIHdyb25nIGZyZXF1ZW5jeSAiCisJCQkJICAgICAgICIoJWx1IHRpY2tzIGluc3RlYWQgb2YgJWQpXG4iLAorCQkJCSAgICAgICBnbG9iYWxfY2xvY2tfZXZlbnQtPm5hbWUsIGRlbHRhaiwKKwkJCQkgICAgICAgTEFQSUNfQ0FMX0xPT1BTKTsKKwkJCX0KKwkJCWxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIENoZWNrLCBpZiB0aGUgamlmZmllcyByZXN1bHQgaXMgY29uc2lzdGVudCAqLworCQlpZiAoZGVsdGFqID49IExBUElDX0NBTF9MT09QUy0yICYmCisJCSAgICBkZWx0YWogPD0gTEFQSUNfQ0FMX0xPT1BTKzIpIHsKKwkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLiBqaWZmaWVzIHJlc3VsdCBva1xuIik7CisJCQlsb2NhbF9hcGljX3RpbWVyX3ZlcmlmeV9vayA9IDE7CisJCX0KKwl9CisKKwlpZiAoIWxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJBUElDIHRpbWVyIGRpc2FibGVkIGR1ZSB0byB2ZXJpZmljYXRpb24gZmFpbHVyZS5cbiIpOworCQkvKiBObyBicm9hZGNhc3Qgb24gVVAgISAqLworCQlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA9PSAxKQorCQkJcmV0dXJuOworCX0gZWxzZQorCQlsYXBpY19jbG9ja2V2ZW50LmZlYXR1cmVzICY9IH5DTE9DS19FVlRfRkVBVF9EVU1NWTsKKworCS8qIFNldHVwIHRoZSBsYXBpYyBvciByZXF1ZXN0IHRoZSBicm9hZGNhc3QgKi8KKwlzZXR1cF9BUElDX3RpbWVyKCk7Cit9CisKK3ZvaWQgX19kZXZpbml0IHNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrKHZvaWQpCit7CisJc2V0dXBfQVBJQ190aW1lcigpOworfQorCisvKgorICogVGhlIGd1dHMgb2YgdGhlIGFwaWMgdGltZXIgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkIGxvY2FsX2FwaWNfdGltZXJfaW50ZXJydXB0KHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAmcGVyX2NwdShsYXBpY19ldmVudHMsIGNwdSk7CisKKwkvKgorCSAqIE5vcm1hbGx5IHdlIHNob3VsZCBub3QgYmUgaGVyZSB0aWxsIExBUElDIGhhcyBiZWVuIGluaXRpYWxpemVkIGJ1dAorCSAqIGluIHNvbWUgY2FzZXMgbGlrZSBrZHVtcCwgaXRzIHBvc3NpYmxlIHRoYXQgdGhlcmUgaXMgYSBwZW5kaW5nIExBUElDCisJICogdGltZXIgaW50ZXJydXB0IGZyb20gcHJldmlvdXMga2VybmVsJ3MgY29udGV4dCBhbmQgaXMgZGVsaXZlcmVkIGluCisJICogbmV3IGtlcm5lbCB0aGUgbW9tZW50IGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisJICoKKwkgKiBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGVhcmx5IGFuZCBMQVBJQyBpcyBzZXR1cCBtdWNoIGxhdGVyLCBoZW5jZQorCSAqIGl0cyBwb3NzaWJsZSB0aGF0IHdoZW4gd2UgZ2V0IGhlcmUgZXZ0LT5ldmVudF9oYW5kbGVyIGlzIE5VTEwuCisJICogQ2hlY2sgZm9yIGV2ZW50X2hhbmRsZXIgYmVpbmcgTlVMTCBhbmQgZGlzY2FyZCB0aGUgaW50ZXJydXB0IGFzCisJICogc3B1cmlvdXMuCisJICovCisJaWYgKCFldnQtPmV2ZW50X2hhbmRsZXIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlNwdXJpb3VzIExBUElDIHRpbWVyIGludGVycnVwdCBvbiBjcHUgJWRcbiIsIGNwdSk7CisJCS8qIFN3aXRjaCBpdCBvZmYgKi8KKwkJbGFwaWNfdGltZXJfc2V0dXAoQ0xPQ0tfRVZUX01PREVfU0hVVERPV04sIGV2dCk7CisJCXJldHVybjsKKwl9CisKKwlwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxcysrOworCisJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7Cit9CisKKy8qCisgKiBMb2NhbCBBUElDIHRpbWVyIGludGVycnVwdC4gVGhpcyBpcyB0aGUgbW9zdCBuYXR1cmFsIHdheSBmb3IgZG9pbmcKKyAqIGxvY2FsIGludGVycnVwdHMsIGJ1dCBsb2NhbCB0aW1lciBpbnRlcnJ1cHRzIGNhbiBiZSBlbXVsYXRlZCBieQorICogYnJvYWRjYXN0IGludGVycnVwdHMgdG9vLiBbaW4gY2FzZSB0aGUgaHcgZG9lc24ndCBzdXBwb3J0IEFQSUMgdGltZXJzXQorICoKKyAqIFsgaWYgYSBzaW5nbGUtQ1BVIHN5c3RlbSBydW5zIGFuIFNNUCBrZXJuZWwgdGhlbiB3ZSBjYWxsIHRoZSBsb2NhbAorICogICBpbnRlcnJ1cHQgYXMgd2VsbC4gVGh1cyB3ZSBjYW5ub3QgaW5saW5lIHRoZSBsb2NhbCBpcnEgLi4uIF0KKyAqLworCit2b2lkIGZhc3RjYWxsIHNtcF9hcGljX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CisKKwkvKgorCSAqIE5PVEUhIFdlJ2QgYmV0dGVyIEFDSyB0aGUgaXJxIGltbWVkaWF0ZWx5LAorCSAqIGJlY2F1c2UgdGltZXIgaGFuZGxpbmcgY2FuIGJlIHNsb3cuCisJICovCisJYWNrX0FQSUNfaXJxKCk7CisJLyoKKwkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIGV4cGVjdHMgdXMgdG8gaGF2ZSBkb25lIGlycV9lbnRlcigpLgorCSAqIEJlc2lkZXMsIGlmIHdlIGRvbid0IHRpbWVyIGludGVycnVwdHMgaWdub3JlIHRoZSBnbG9iYWwKKwkgKiBpbnRlcnJ1cHQgbG9jaywgd2hpY2ggaXMgdGhlIFdyb25nVGhpbmcgKHRtKSB0byBkby4KKwkgKi8KKwlleGl0X2lkbGUoKTsKKwlpcnFfZW50ZXIoKTsKKwlsb2NhbF9hcGljX3RpbWVyX2ludGVycnVwdCgpOworCWlycV9leGl0KCk7CisKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOworfQorCitpbnQgc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQoreworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogTG9jYWwgQVBJQyBzdGFydCBhbmQgc2h1dGRvd24KKyAqLworCisvKioKKyAqIGNsZWFyX2xvY2FsX0FQSUMgLSBzaHV0ZG93biB0aGUgbG9jYWwgQVBJQworICoKKyAqIFRoaXMgaXMgY2FsbGVkLCB3aGVuIGEgQ1BVIGlzIGRpc2FibGVkIGFuZCBiZWZvcmUgcmVib290aW5nLCBzbyB0aGUgc3RhdGUgb2YKKyAqIHRoZSBsb2NhbCBBUElDIGhhcyBubyBkYW5nbGluZyBsZWZ0b3ZlcnMuIEFsc28gdXNlZCB0byBjbGVhbm91dCBhbnkgQklPUworICogbGVmdG92ZXJzIGR1cmluZyBib290LgorICovCiB2b2lkIGNsZWFyX2xvY2FsX0FQSUModm9pZCkKIHsKLQlpbnQgbWF4bHZ0OworCWludCBtYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CiAJdW5zaWduZWQgbG9uZyB2OwogCi0JbWF4bHZ0ID0gZ2V0X21heGx2dCgpOwotCiAJLyoKIAkgKiBNYXNraW5nIGFuIExWVCBlbnRyeSBjYW4gdHJpZ2dlciBhIGxvY2FsIEFQSUMgZXJyb3IKIAkgKiBpZiB0aGUgdmVjdG9yIGlzIHplcm8uIE1hc2sgTFZURVJSIGZpcnN0IHRvIHByZXZlbnQgdGhpcy4KQEAgLTE5MCw3ICs2MTMsNyBAQAogCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFBDLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKIAl9CiAKLS8qIGxldHMgbm90IHRvdWNoIHRoaXMgaWYgd2UgZGlkbid0IGZyb2IgaXQgKi8KKwkvKiBsZXRzIG5vdCB0b3VjaCB0aGlzIGlmIHdlIGRpZG4ndCBmcm9iIGl0ICovCiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCiAJaWYgKG1heGx2dCA+PSA1KSB7CiAJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUSE1SKTsKQEAgLTIxMiw4NSArNjM1LDE4IEBACiAJaWYgKG1heGx2dCA+PSA1KQogCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFRITVIsIEFQSUNfTFZUX01BU0tFRCk7CiAjZW5kaWYKLQl2ID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKLQlpZiAoQVBJQ19JTlRFR1JBVEVEKHYpKSB7CS8qICE4MjQ4OURYICovCi0JCWlmIChtYXhsdnQgPiAzKQkJLyogRHVlIHRvIFBlbnRpdW0gZXJyYXRhIDNBUCBhbmQgMTFBUC4gKi8KKwkvKiBJbnRlZ3JhdGVkIEFQSUMgKCE4MjQ4OURYKSA/ICovCisJaWYgKGxhcGljX2lzX2ludGVncmF0ZWQoKSkgeworCQlpZiAobWF4bHZ0ID4gMykKKwkJCS8qIENsZWFyIEVTUiBkdWUgdG8gUGVudGl1bSBlcnJhdGEgM0FQIGFuZCAxMUFQICovCiAJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAkJYXBpY19yZWFkKEFQSUNfRVNSKTsKIAl9CiB9CiAKLXZvaWQgX19pbml0IGNvbm5lY3RfYnNwX0FQSUModm9pZCkKLXsKLQlpZiAocGljX21vZGUpIHsKLQkJLyoKLQkJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KLQkJICovCi0JCWNsZWFyX2xvY2FsX0FQSUMoKTsKLQkJLyoKLQkJICogUElDIG1vZGUsIGVuYWJsZSBBUElDIG1vZGUgaW4gdGhlIElNQ1IsIGkuZS4KLQkJICogY29ubmVjdCBCU1AncyBsb2NhbCBBUElDIHRvIElOVCBhbmQgTk1JIGxpbmVzLgotCQkgKi8KLQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibGVhdmluZyBQSUMgbW9kZSwgIgotCQkJCSJlbmFibGluZyBBUElDIG1vZGUuXG4iKTsKLQkJb3V0YigweDcwLCAweDIyKTsKLQkJb3V0YigweDAxLCAweDIzKTsKLQl9Ci0JZW5hYmxlX2FwaWNfbW9kZSgpOwotfQotCi12b2lkIGRpc2Nvbm5lY3RfYnNwX0FQSUMoaW50IHZpcnRfd2lyZV9zZXR1cCkKLXsKLQlpZiAocGljX21vZGUpIHsKLQkJLyoKLQkJICogUHV0IHRoZSBib2FyZCBiYWNrIGludG8gUElDIG1vZGUgKGhhcyBhbiBlZmZlY3QKLQkJICogb25seSBvbiBjZXJ0YWluIG9sZGVyIGJvYXJkcykuICBOb3RlIHRoYXQgQVBJQwotCQkgKiBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcgSVBJcywgd29uJ3Qgd29yayBiZXlvbmQKLQkJICogdGhpcyBwb2ludCEgIFRoZSBvbmx5IGV4Y2VwdGlvbiBhcmUgSU5JVCBJUElzLgotCQkgKi8KLQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiZGlzYWJsaW5nIEFQSUMgbW9kZSwgIgotCQkJCSJlbnRlcmluZyBQSUMgbW9kZS5cbiIpOwotCQlvdXRiKDB4NzAsIDB4MjIpOwotCQlvdXRiKDB4MDAsIDB4MjMpOwotCX0KLQllbHNlIHsKLQkJLyogR28gYmFjayB0byBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCi0JCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLQkJLyogRm9yIHRoZSBzcHVyaW91cyBpbnRlcnJ1cHQgdXNlIHZlY3RvciBGLCBhbmQgZW5hYmxlIGl0ICovCi0JCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7Ci0JCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOwotCQl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOwotCQl2YWx1ZSB8PSAweGY7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfU1BJViwgdmFsdWUpOwotCi0JCWlmICghdmlydF93aXJlX3NldHVwKSB7Ci0JCQkvKiBGb3IgTFZUMCBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgZXh0ZXJuYWwgYW5kIGVuYWJsZWQgKi8KLQkJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7Ci0JCQl2YWx1ZSAmPSB+KEFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAotCQkJCUFQSUNfSU5QVVRfUE9MQVJJVFkgfCBBUElDX0xWVF9SRU1PVEVfSVJSIHwKLQkJCQlBUElDX0xWVF9MRVZFTF9UUklHR0VSIHwgQVBJQ19MVlRfTUFTS0VEICk7Ci0JCQl2YWx1ZSB8PSBBUElDX0xWVF9SRU1PVEVfSVJSIHwgQVBJQ19TRU5EX1BFTkRJTkc7Ci0JCQl2YWx1ZSA9IFNFVF9BUElDX0RFTElWRVJZX01PREUodmFsdWUsIEFQSUNfTU9ERV9FWFRJTlQpOwotCQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2YWx1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBEaXNhYmxlIExWVDAgKi8KLQkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEKTsKLQkJfQotCi0JCS8qIEZvciBMVlQxIG1ha2UgaXQgZWRnZSB0cmlnZ2VyZWQsIGFjdGl2ZSBoaWdoLCBubWkgYW5kIGVuYWJsZWQgKi8KLQkJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKLQkJdmFsdWUgJj0gfigKLQkJCUFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAotCQkJQVBJQ19JTlBVVF9QT0xBUklUWSB8IEFQSUNfTFZUX1JFTU9URV9JUlIgfAotCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCk7Ci0JCXZhbHVlIHw9IEFQSUNfTFZUX1JFTU9URV9JUlIgfCBBUElDX1NFTkRfUEVORElORzsKLQkJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfTk1JKTsKLQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQxLCB2YWx1ZSk7Ci0JfQotfQotCisvKioKKyAqIGRpc2FibGVfbG9jYWxfQVBJQyAtIGNsZWFyIGFuZCBkaXNhYmxlIHRoZSBsb2NhbCBBUElDCisgKi8KIHZvaWQgZGlzYWJsZV9sb2NhbF9BUElDKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKQEAgLTMwNSw4ICs2NjEsMTMgQEAKIAl2YWx1ZSAmPSB+QVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKIAlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1NQSVYsIHZhbHVlKTsKIAorCS8qCisJICogV2hlbiBMQVBJQyB3YXMgZGlzYWJsZWQgYnkgdGhlIEJJT1MgYW5kIGVuYWJsZWQgYnkgdGhlIGtlcm5lbCwKKwkgKiByZXN0b3JlIHRoZSBkaXNhYmxlZCBzdGF0ZS4KKwkgKi8KIAlpZiAoZW5hYmxlZF92aWFfYXBpY2Jhc2UpIHsKIAkJdW5zaWduZWQgaW50IGwsIGg7CisKIAkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOwogCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9FTkFCTEU7CiAJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKQEAgLTMxNCw2ICs2NzUsMjggQEAKIH0KIAogLyoKKyAqIElmIExpbnV4IGVuYWJsZWQgdGhlIExBUElDIGFnYWluc3QgdGhlIEJJT1MgZGVmYXVsdCBkaXNhYmxlIGl0IGRvd24gYmVmb3JlCisgKiByZS1lbnRlcmluZyB0aGUgQklPUyBvbiBzaHV0ZG93bi4gIE90aGVyd2lzZSB0aGUgQklPUyBtYXkgZ2V0IGNvbmZ1c2VkIGFuZAorICogbm90IHBvd2VyLW9mZi4gIEFkZGl0aW9uYWxseSBjbGVhciBhbGwgTFZUIGVudHJpZXMgYmVmb3JlIGRpc2FibGVfbG9jYWxfQVBJQworICogZm9yIHRoZSBjYXNlIHdoZXJlIExpbnV4IGRpZG4ndCBlbmFibGUgdGhlIExBUElDLgorICovCit2b2lkIGxhcGljX3NodXRkb3duKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghY3B1X2hhc19hcGljKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY2xlYXJfbG9jYWxfQVBJQygpOworCisJaWYgKGVuYWJsZWRfdmlhX2FwaWNiYXNlKQorCQlkaXNhYmxlX2xvY2FsX0FQSUMoKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKICAqIFRoaXMgaXMgdG8gdmVyaWZ5IHRoYXQgd2UncmUgbG9va2luZyBhdCBhIHJlYWwgbG9jYWwgQVBJQy4KICAqIENoZWNrIHRoZXNlIGFnYWluc3QgeW91ciBib2FyZCBpZiB0aGUgQ1BVcyBhcmVuJ3QgZ2V0dGluZwogICogc3RhcnRlZCBmb3Igbm8gYXBwYXJlbnQgcmVhc29uLgpAQCAtMzQ1LDcgKzcyOCw3IEBACiAJcmVnMSA9IEdFVF9BUElDX1ZFUlNJT04ocmVnMCk7CiAJaWYgKHJlZzEgPT0gMHgwMCB8fCByZWcxID09IDB4ZmYpCiAJCXJldHVybiAwOwotCXJlZzEgPSBnZXRfbWF4bHZ0KCk7CisJcmVnMSA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAlpZiAocmVnMSA8IDB4MDIgfHwgcmVnMSA9PSAweGZmKQogCQlyZXR1cm4gMDsKIApAQCAtMzY4LDEwICs3NTEsMTUgQEAKIAlyZXR1cm4gMTsKIH0KIAorLyoqCisgKiBzeW5jX0FyYl9JRHMgLSBzeW5jaHJvbml6ZSBBUElDIGJ1cyBhcmJpdHJhdGlvbiBJRHMKKyAqLwogdm9pZCBfX2luaXQgc3luY19BcmJfSURzKHZvaWQpCiB7Ci0JLyogVW5zdXBwb3J0ZWQgb24gUDQgLSBzZWUgSW50ZWwgRGV2LiBNYW51YWwgVm9sLiAzLCBDaC4gOC42LjEKLQkgICBBbmQgbm90IG5lZWRlZCBvbiBBTUQgKi8KKwkvKgorCSAqIFVuc3VwcG9ydGVkIG9uIFA0IC0gc2VlIEludGVsIERldi4gTWFudWFsIFZvbC4gMywgQ2guIDguNi4xIEFuZCBub3QKKwkgKiBuZWVkZWQgb24gQU1ELgorCSAqLwogCWlmIChtb2Rlcm5fYXBpYygpKQogCQlyZXR1cm47CiAJLyoKQEAgLTM4NCwxNCArNzcyLDEyIEBACiAJCQkJfCBBUElDX0RNX0lOSVQpOwogfQogCi1leHRlcm4gdm9pZCBfX2Vycm9yX2luX2FwaWNfYyAodm9pZCk7Ci0KIC8qCiAgKiBBbiBpbml0aWFsIHNldHVwIG9mIHRoZSB2aXJ0dWFsIHdpcmUgbW9kZS4KICAqLwogdm9pZCBfX2luaXQgaW5pdF9ic3BfQVBJQyh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdmFsdWUsIHZlcjsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOwogCiAJLyoKIAkgKiBEb24ndCBkbyB0aGUgc2V0dXAgbm93IGlmIHdlIGhhdmUgYSBTTVAgQklPUyBhcyB0aGUKQEAgLTQwMCw5ICs3ODYsNiBAQAogCWlmIChzbXBfZm91bmRfY29uZmlnIHx8ICFjcHVfaGFzX2FwaWMpCiAJCXJldHVybjsKIAotCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKLQl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKHZhbHVlKTsKLQogCS8qCiAJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KIAkgKi8KQEAgLTQxNCw5ICs3OTcsMTAgQEAKIAl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX1NQSVYpOwogCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOwogCXZhbHVlIHw9IEFQSUNfU1BJVl9BUElDX0VOQUJMRUQ7Ci0JCisKIAkvKiBUaGlzIGJpdCBpcyByZXNlcnZlZCBvbiBQNC9YZW9uIGFuZCBzaG91bGQgYmUgY2xlYXJlZCAqLwotCWlmICgoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpICYmIChib290X2NwdV9kYXRhLng4NiA9PSAxNSkpCisJaWYgKChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgJiYKKwkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKIAkJdmFsdWUgJj0gfkFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKIAllbHNlCiAJCXZhbHVlIHw9IEFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKQEAgLTQyOCwxNCArODEyLDE3IEBACiAJICovCiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0RNX0VYVElOVCk7CiAJdmFsdWUgPSBBUElDX0RNX05NSTsKLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQkJLyogODI0ODlEWCAqLworCWlmICghbGFwaWNfaXNfaW50ZWdyYXRlZCgpKQkJLyogODI0ODlEWCAqLwogCQl2YWx1ZSB8PSBBUElDX0xWVF9MRVZFTF9UUklHR0VSOwogCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMSwgdmFsdWUpOwogfQogCisvKioKKyAqIHNldHVwX2xvY2FsX0FQSUMgLSBzZXR1cCB0aGUgbG9jYWwgQVBJQworICovCiB2b2lkIF9fZGV2aW5pdCBzZXR1cF9sb2NhbF9BUElDKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBvbGR2YWx1ZSwgdmFsdWUsIHZlciwgbWF4bHZ0OworCXVuc2lnbmVkIGxvbmcgb2xkdmFsdWUsIHZhbHVlLCBtYXhsdnQsIGludGVncmF0ZWQ7CiAJaW50IGksIGo7CiAKIAkvKiBQb3VuZCB0aGUgRVNSIHJlYWxseSBoYXJkIG92ZXIgdGhlIGhlYWQgd2l0aCBhIGJpZyBoYW1tZXIgLSBtYmxpZ2ggKi8KQEAgLTQ0NiwxMSArODMzLDcgQEAKIAkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CiAJfQogCi0JdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwotCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odmFsdWUpOwotCi0JaWYgKChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIDB4MGYpICE9IDB4MGYpCi0JCV9fZXJyb3JfaW5fYXBpY19jKCk7CisJaW50ZWdyYXRlZCA9IGxhcGljX2lzX2ludGVncmF0ZWQoKTsKIAogCS8qCiAJICogRG91YmxlLWNoZWNrIHdoZXRoZXIgdGhpcyBBUElDIGlzIHJlYWxseSByZWdpc3RlcmVkLgpAQCAtNTIxLDEzICs5MDQsMTAgQEAKIAkgKiBsaWtlIExSVSB0aGFuIE1SVSAodGhlIHNob3J0LXRlcm0gbG9hZCBpcyBtb3JlIGV2ZW4gYWNyb3NzIENQVXMpLgogCSAqIFNlZSBhbHNvIHRoZSBjb21tZW50IGluIGVuZF9sZXZlbF9pb2FwaWNfaXJxKCkuICAtLW1hY3JvCiAJICovCi0jaWYgMQorCiAJLyogRW5hYmxlIGZvY3VzIHByb2Nlc3NvciAoYml0PT0wKSAqLwogCXZhbHVlICY9IH5BUElDX1NQSVZfRk9DVVNfRElTQUJMRUQ7Ci0jZWxzZQotCS8qIERpc2FibGUgZm9jdXMgcHJvY2Vzc29yIChiaXQ9PTEpICovCi0JdmFsdWUgfD0gQVBJQ19TUElWX0ZPQ1VTX0RJU0FCTEVEOwotI2VuZGlmCisKIAkvKgogCSAqIFNldCBzcHVyaW91cyBJUlEgdmVjdG9yCiAJICovCkBAIC01NjMsMTcgKzk0MywxOCBAQAogCQl2YWx1ZSA9IEFQSUNfRE1fTk1JOwogCWVsc2UKIAkJdmFsdWUgPSBBUElDX0RNX05NSSB8IEFQSUNfTFZUX01BU0tFRDsKLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQkJLyogODI0ODlEWCAqLworCWlmICghaW50ZWdyYXRlZCkJCS8qIDgyNDg5RFggKi8KIAkJdmFsdWUgfD0gQVBJQ19MVlRfTEVWRUxfVFJJR0dFUjsKIAlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKIAotCWlmIChBUElDX0lOVEVHUkFURUQodmVyKSAmJiAhZXNyX2Rpc2FibGUpIHsJCS8qICE4MjQ4OURYICovCi0JCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKwlpZiAoaW50ZWdyYXRlZCAmJiAhZXNyX2Rpc2FibGUpIHsJCS8qICE4MjQ4OURYICovCisJCW1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAkJaWYgKG1heGx2dCA+IDMpCQkvKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuICovCiAJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAkJb2xkdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19FU1IpOwogCi0JCXZhbHVlID0gRVJST1JfQVBJQ19WRUNUT1I7ICAgICAgLy8gZW5hYmxlcyBzZW5kaW5nIGVycm9ycworCQkvKiBlbmFibGVzIHNlbmRpbmcgZXJyb3JzICovCisJCXZhbHVlID0gRVJST1JfQVBJQ19WRUNUT1I7CiAJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZURVJSLCB2YWx1ZSk7CiAJCS8qCiAJCSAqIHNwZWMgc2F5cyBjbGVhciBlcnJvcnMgYWZ0ZXIgZW5hYmxpbmcgdmVjdG9yLgpAQCAtNTg2LDQ1ICs5NjcsNDE3IEBACiAJCQkJInZlY3RvcjogMHglMDhseCAgYWZ0ZXI6IDB4JTA4bHhcbiIsCiAJCQkJb2xkdmFsdWUsIHZhbHVlKTsKIAl9IGVsc2UgewotCQlpZiAoZXNyX2Rpc2FibGUpCQotCQkJLyogCi0JCQkgKiBTb21ldGhpbmcgdW50cmFjZWJsZSBpcyBjcmVhdGluZyBiYWQgaW50ZXJydXB0cyBvbiAKKwkJaWYgKGVzcl9kaXNhYmxlKQorCQkJLyoKKwkJCSAqIFNvbWV0aGluZyB1bnRyYWNlYmxlIGlzIGNyZWF0aW5nIGJhZCBpbnRlcnJ1cHRzIG9uCiAJCQkgKiBzZWNvbmRhcnkgcXVhZHMgLi4uIGZvciB0aGUgbW9tZW50LCBqdXN0IGxlYXZlIHRoZQogCQkJICogRVNSIGRpc2FibGVkIC0gd2UgY2FuJ3QgZG8gYW55dGhpbmcgdXNlZnVsIHdpdGggdGhlCiAJCQkgKiBlcnJvcnMgYW55d2F5IC0gbWJsaWdoCiAJCQkgKi8KLQkJCXByaW50aygiTGVhdmluZyBFU1IgZGlzYWJsZWQuXG4iKTsKLQkJZWxzZSAKLQkJCXByaW50aygiTm8gRVNSIGZvciA4MjQ4OURYLlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJMZWF2aW5nIEVTUiBkaXNhYmxlZC5cbiIpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJObyBFU1IgZm9yIDgyNDg5RFguXG4iKTsKIAl9CiAKKwkvKiBEaXNhYmxlIHRoZSBsb2NhbCBhcGljIHRpbWVyICovCisJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwl2YWx1ZSB8PSAoQVBJQ19MVlRfTUFTS0VEIHwgTE9DQUxfVElNRVJfVkVDVE9SKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIHZhbHVlKTsKKwogCXNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKE5VTEwpOwogCWFwaWNfcG1fYWN0aXZhdGUoKTsKIH0KIAogLyoKLSAqIElmIExpbnV4IGVuYWJsZWQgdGhlIExBUElDIGFnYWluc3QgdGhlIEJJT1MgZGVmYXVsdAotICogZGlzYWJsZSBpdCBkb3duIGJlZm9yZSByZS1lbnRlcmluZyB0aGUgQklPUyBvbiBzaHV0ZG93bi4KLSAqIE90aGVyd2lzZSB0aGUgQklPUyBtYXkgZ2V0IGNvbmZ1c2VkIGFuZCBub3QgcG93ZXItb2ZmLgotICogQWRkaXRpb25hbGx5IGNsZWFyIGFsbCBMVlQgZW50cmllcyBiZWZvcmUgZGlzYWJsZV9sb2NhbF9BUElDCi0gKiBmb3IgdGhlIGNhc2Ugd2hlcmUgTGludXggZGlkbid0IGVuYWJsZSB0aGUgTEFQSUMuCisgKiBEZXRlY3QgYW5kIGluaXRpYWxpemUgQVBJQwogICovCi12b2lkIGxhcGljX3NodXRkb3duKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBkZXRlY3RfaW5pdF9BUElDICh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGgsIGwsIGZlYXR1cmVzOwogCi0JaWYgKCFjcHVfaGFzX2FwaWMpCi0JCXJldHVybjsKKwkvKiBEaXNhYmxlZCBieSBrZXJuZWwgb3B0aW9uPyAqLworCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCisJCXJldHVybiAtMTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQljbGVhcl9sb2NhbF9BUElDKCk7CisJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwljYXNlIFg4Nl9WRU5ET1JfQU1EOgorCQlpZiAoKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAxKSB8fAorCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKKwkJCWJyZWFrOworCQlnb3RvIG5vX2FwaWM7CisJY2FzZSBYODZfVkVORE9SX0lOVEVMOgorCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNiB8fCBib290X2NwdV9kYXRhLng4NiA9PSAxNSB8fAorCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDUgJiYgY3B1X2hhc19hcGljKSkKKwkJCWJyZWFrOworCQlnb3RvIG5vX2FwaWM7CisJZGVmYXVsdDoKKwkJZ290byBub19hcGljOworCX0KIAotCWlmIChlbmFibGVkX3ZpYV9hcGljYmFzZSkKLQkJZGlzYWJsZV9sb2NhbF9BUElDKCk7CisJaWYgKCFjcHVfaGFzX2FwaWMpIHsKKwkJLyoKKwkJICogT3Zlci1yaWRlIEJJT1MgYW5kIHRyeSB0byBlbmFibGUgdGhlIGxvY2FsIEFQSUMgb25seSBpZgorCQkgKiAibGFwaWMiIHNwZWNpZmllZC4KKwkJICovCisJCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJMb2NhbCBBUElDIGRpc2FibGVkIGJ5IEJJT1MgLS0gIgorCQkJICAgICAgICJ5b3UgY2FuIGVuYWJsZSBpdCB3aXRoIFwibGFwaWNcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyoKKwkJICogU29tZSBCSU9TZXMgZGlzYWJsZSB0aGUgbG9jYWwgQVBJQyBpbiB0aGUgQVBJQ19CQVNFCisJCSAqIE1TUi4gVGhpcyBjYW4gb25seSBiZSBkb25lIGluIHNvZnR3YXJlIGZvciBJbnRlbCBQNiBvciBsYXRlcgorCQkgKiBhbmQgQU1EIEs3IChNb2RlbCA+IDEpIG9yIGxhdGVyLgorCQkgKi8KKwkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCQlpZiAoIShsICYgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJMb2NhbCBBUElDIGRpc2FibGVkIGJ5IEJJT1MgLS0gcmVlbmFibGluZy5cbiIpOworCQkJbCAmPSB+TVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKwkJCWwgfD0gTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFIHwgQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKKwkJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKKwkJCWVuYWJsZWRfdmlhX2FwaWNiYXNlID0gMTsKKwkJfQorCX0KKwkvKgorCSAqIFRoZSBBUElDIGZlYXR1cmUgYml0IHNob3VsZCBub3cgYmUgZW5hYmxlZAorCSAqIGluIGBjcHVpZCcKKwkgKi8KKwlmZWF0dXJlcyA9IGNwdWlkX2VkeCgxKTsKKwlpZiAoIShmZWF0dXJlcyAmICgxIDw8IFg4Nl9GRUFUVVJFX0FQSUMpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZCBub3QgZW5hYmxlIEFQSUMhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZXRfYml0KFg4Nl9GRUFUVVJFX0FQSUMsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCW1wX2xhcGljX2FkZHIgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFOwogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCS8qIFRoZSBCSU9TIG1heSBoYXZlIHNldCB1cCB0aGUgQVBJQyBhdCBzb21lIG90aGVyIGFkZHJlc3MgKi8KKwlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJaWYgKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpCisJCW1wX2xhcGljX2FkZHIgPSBsICYgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKworCWlmIChubWlfd2F0Y2hkb2cgIT0gTk1JX05PTkUpCisJCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgYW5kIGVuYWJsZWQgbG9jYWwgQVBJQyFcbiIpOworCisJYXBpY19wbV9hY3RpdmF0ZSgpOworCisJcmV0dXJuIDA7CisKK25vX2FwaWM6CisJcHJpbnRrKEtFUk5fSU5GTyAiTm8gbG9jYWwgQVBJQyBwcmVzZW50IG9yIGhhcmR3YXJlIGRpc2FibGVkXG4iKTsKKwlyZXR1cm4gLTE7CiB9CiAKKy8qKgorICogaW5pdF9hcGljX21hcHBpbmdzIC0gaW5pdGlhbGl6ZSBBUElDIG1hcHBpbmdzCisgKi8KK3ZvaWQgX19pbml0IGluaXRfYXBpY19tYXBwaW5ncyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYXBpY19waHlzOworCisJLyoKKwkgKiBJZiBubyBsb2NhbCBBUElDIGNhbiBiZSBmb3VuZCB0aGVuIHNldCB1cCBhIGZha2UgYWxsCisJICogemVyb2VzIHBhZ2UgdG8gc2ltdWxhdGUgdGhlIGxvY2FsIEFQSUMgYW5kIGFub3RoZXIKKwkgKiBvbmUgZm9yIHRoZSBJTy1BUElDLgorCSAqLworCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiBkZXRlY3RfaW5pdF9BUElDKCkpIHsKKwkJYXBpY19waHlzID0gKHVuc2lnbmVkIGxvbmcpIGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKKwkJYXBpY19waHlzID0gX19wYShhcGljX3BoeXMpOworCX0gZWxzZQorCQlhcGljX3BoeXMgPSBtcF9sYXBpY19hZGRyOworCisJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9BUElDX0JBU0UsIGFwaWNfcGh5cyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1hcHBlZCBBUElDIHRvICUwOGx4ICglMDhseClcbiIsIEFQSUNfQkFTRSwKKwkgICAgICAgYXBpY19waHlzKTsKKworCS8qCisJICogRmV0Y2ggdGhlIEFQSUMgSUQgb2YgdGhlIEJTUCBpbiBjYXNlIHdlIGhhdmUgYQorCSAqIGRlZmF1bHQgY29uZmlndXJhdGlvbiAob3IgdGhlIE1QIHRhYmxlIGlzIGJyb2tlbikuCisJICovCisJaWYgKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9PSAtMVUpCisJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IEdFVF9BUElDX0lEKGFwaWNfcmVhZChBUElDX0lEKSk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwl7CisJCXVuc2lnbmVkIGxvbmcgaW9hcGljX3BoeXMsIGlkeCA9IEZJWF9JT19BUElDX0JBU0VfMDsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY3M7IGkrKykgeworCQkJaWYgKHNtcF9mb3VuZF9jb25maWcpIHsKKwkJCQlpb2FwaWNfcGh5cyA9IG1wX2lvYXBpY3NbaV0ubXBjX2FwaWNhZGRyOworCQkJCWlmICghaW9hcGljX3BoeXMpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSAgICAgICAiV0FSTklORzogYm9ndXMgemVybyBJTy1BUElDICIKKwkJCQkJICAgICAgICJhZGRyZXNzIGZvdW5kIGluIE1QVEFCTEUsICIKKwkJCQkJICAgICAgICJkaXNhYmxpbmcgSU8vQVBJQyBzdXBwb3J0IVxuIik7CisJCQkJCXNtcF9mb3VuZF9jb25maWcgPSAwOworCQkJCQlza2lwX2lvYXBpY19zZXR1cCA9IDE7CisJCQkJCWdvdG8gZmFrZV9pb2FwaWNfcGFnZTsKKwkJCQl9CisJCQl9IGVsc2UgeworZmFrZV9pb2FwaWNfcGFnZToKKwkJCQlpb2FwaWNfcGh5cyA9ICh1bnNpZ25lZCBsb25nKQorCQkJCQkgICAgICBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7CisJCQkJaW9hcGljX3BoeXMgPSBfX3BhKGlvYXBpY19waHlzKTsKKwkJCX0KKwkJCXNldF9maXhtYXBfbm9jYWNoZShpZHgsIGlvYXBpY19waHlzKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtYXBwZWQgSU9BUElDIHRvICUwOGx4ICglMDhseClcbiIsCisJCQkgICAgICAgX19maXhfdG9fdmlydChpZHgpLCBpb2FwaWNfcGh5cyk7CisJCQlpZHgrKzsKKwkJfQorCX0KKyNlbmRpZgorfQorCisvKgorICogVGhpcyBpbml0aWFsaXplcyB0aGUgSU8tQVBJQyBhbmQgQVBJQyBoYXJkd2FyZSBpZiB0aGlzIGlzCisgKiBhIFVQIGtlcm5lbC4KKyAqLworaW50IF9faW5pdCBBUElDX2luaXRfdW5pcHJvY2Vzc29yICh2b2lkKQoreworCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKworCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiAhY3B1X2hhc19hcGljKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIENvbXBsYWluIGlmIHRoZSBCSU9TIHByZXRlbmRzIHRoZXJlIGlzIG9uZS4KKwkgKi8KKwlpZiAoIWNwdV9oYXNfYXBpYyAmJgorCSAgICBBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklPUyBidWcsIGxvY2FsIEFQSUMgIyVkIG5vdCBkZXRlY3RlZCEuLi5cbiIsCisJCSAgICAgICBib290X2NwdV9waHlzaWNhbF9hcGljaWQpOworCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl2ZXJpZnlfbG9jYWxfQVBJQygpOworCisJY29ubmVjdF9ic3BfQVBJQygpOworCisJLyoKKwkgKiBIYWNrOiBJbiBjYXNlIG9mIGtkdW1wLCBhZnRlciBhIGNyYXNoLCBrZXJuZWwgbWlnaHQgYmUgYm9vdGluZworCSAqIG9uIGEgY3B1IHdpdGggbm9uLXplcm8gbGFwaWMgaWQuIEJ1dCBib290X2NwdV9waHlzaWNhbF9hcGljaWQKKwkgKiBtaWdodCBiZSB6ZXJvIGlmIHJlYWQgZnJvbSBNUCB0YWJsZXMuIEdldCBpdCBmcm9tIExBUElDLgorCSAqLworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKKyNlbmRpZgorCXBoeXNfY3B1X3ByZXNlbnRfbWFwID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CisKKwlzZXR1cF9sb2NhbF9BUElDKCk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwlpZiAoc21wX2ZvdW5kX2NvbmZpZykKKwkJaWYgKCFza2lwX2lvYXBpY19zZXR1cCAmJiBucl9pb2FwaWNzKQorCQkJc2V0dXBfSU9fQVBJQygpOworI2VuZGlmCisJc2V0dXBfYm9vdF9jbG9jaygpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBUElDIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2xhcGljKGNoYXIgKmFyZykKK3sKKwllbmFibGVfbG9jYWxfYXBpYyA9IDE7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibGFwaWMiLCBwYXJzZV9sYXBpYyk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX25vbGFwaWMoY2hhciAqYXJnKQoreworCWVuYWJsZV9sb2NhbF9hcGljID0gLTE7CisJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX0FQSUMsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm5vbGFwaWMiLCBwYXJzZV9ub2xhcGljKTsKKworc3RhdGljIGludCBfX2luaXQgYXBpY19zZXRfdmVyYm9zaXR5KGNoYXIgKnN0cikKK3sKKwlpZiAoc3RyY21wKCJkZWJ1ZyIsIHN0cikgPT0gMCkKKwkJYXBpY192ZXJib3NpdHkgPSBBUElDX0RFQlVHOworCWVsc2UgaWYgKHN0cmNtcCgidmVyYm9zZSIsIHN0cikgPT0gMCkKKwkJYXBpY192ZXJib3NpdHkgPSBBUElDX1ZFUkJPU0U7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFwaWM9IiwgYXBpY19zZXRfdmVyYm9zaXR5KTsKKworCisvKgorICogTG9jYWwgQVBJQyBpbnRlcnJ1cHRzCisgKi8KKworLyoKKyAqIFRoaXMgaW50ZXJydXB0IHNob3VsZCBfbmV2ZXJfIGhhcHBlbiB3aXRoIG91ciBBUElDL1NNUCBhcmNoaXRlY3R1cmUKKyAqLwordm9pZCBzbXBfc3B1cmlvdXNfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKworCWV4aXRfaWRsZSgpOworCWlycV9lbnRlcigpOworCS8qCisJICogQ2hlY2sgaWYgdGhpcyByZWFsbHkgaXMgYSBzcHVyaW91cyBpbnRlcnJ1cHQgYW5kIEFDSyBpdAorCSAqIGlmIGl0IGlzIGEgdmVjdG9yZWQgb25lLiAgSnVzdCBpbiBjYXNlLi4uCisJICogU3B1cmlvdXMgaW50ZXJydXB0cyBzaG91bGQgbm90IGJlIEFDS2VkLgorCSAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19JU1IgKyAoKFNQVVJJT1VTX0FQSUNfVkVDVE9SICYgfjB4MWYpID4+IDEpKTsKKwlpZiAodiAmICgxIDw8IChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIDB4MWYpKSkKKwkJYWNrX0FQSUNfaXJxKCk7CisKKwkvKiBzZWUgc3ctZGV2LW1hbiB2b2wgMywgY2hhcHRlciA3LjQuMTMuNSAqLworCXByaW50ayhLRVJOX0lORk8gInNwdXJpb3VzIEFQSUMgaW50ZXJydXB0IG9uIENQVSMlZCwgIgorCSAgICAgICAic2hvdWxkIG5ldmVyIGhhcHBlbi5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJaXJxX2V4aXQoKTsKK30KKworLyoKKyAqIFRoaXMgaW50ZXJydXB0IHNob3VsZCBuZXZlciBoYXBwZW4gd2l0aCBvdXIgQVBJQy9TTVAgYXJjaGl0ZWN0dXJlCisgKi8KK3ZvaWQgc21wX2Vycm9yX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHYsIHYxOworCisJZXhpdF9pZGxlKCk7CisJaXJxX2VudGVyKCk7CisJLyogRmlyc3QgdGlja2xlIHRoZSBoYXJkd2FyZSwgb25seSB0aGVuIHJlcG9ydCB3aGF0IHdlbnQgb24uIC0tIFJFVyAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19FU1IpOworCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCXYxID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKwlhY2tfQVBJQ19pcnEoKTsKKwlhdG9taWNfaW5jKCZpcnFfZXJyX2NvdW50KTsKKworCS8qIEhlcmUgaXMgd2hhdCB0aGUgQVBJQyBlcnJvciBiaXRzIG1lYW46CisJICAgMDogU2VuZCBDUyBlcnJvcgorCSAgIDE6IFJlY2VpdmUgQ1MgZXJyb3IKKwkgICAyOiBTZW5kIGFjY2VwdCBlcnJvcgorCSAgIDM6IFJlY2VpdmUgYWNjZXB0IGVycm9yCisJICAgNDogUmVzZXJ2ZWQKKwkgICA1OiBTZW5kIGlsbGVnYWwgdmVjdG9yCisJICAgNjogUmVjZWl2ZWQgaWxsZWdhbCB2ZWN0b3IKKwkgICA3OiBJbGxlZ2FsIHJlZ2lzdGVyIGFkZHJlc3MKKwkqLworCXByaW50ayAoS0VSTl9ERUJVRyAiQVBJQyBlcnJvciBvbiBDUFUlZDogJTAybHgoJTAybHgpXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIHYgLCB2MSk7CisJaXJxX2V4aXQoKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgQVBJQyBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQgX19pbml0IGFwaWNfaW50cl9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9pbnRyX2luaXQoKTsKKyNlbmRpZgorCS8qIHNlbGYgZ2VuZXJhdGVkIElQSSBmb3IgbG9jYWwgQVBJQyB0aW1lciAqLworCXNldF9pbnRyX2dhdGUoTE9DQUxfVElNRVJfVkVDVE9SLCBhcGljX3RpbWVyX2ludGVycnVwdCk7CisKKwkvKiBJUEkgdmVjdG9ycyBmb3IgQVBJQyBzcHVyaW91cyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLworCXNldF9pbnRyX2dhdGUoU1BVUklPVVNfQVBJQ19WRUNUT1IsIHNwdXJpb3VzX2ludGVycnVwdCk7CisJc2V0X2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKKworCS8qIHRoZXJtYWwgbW9uaXRvciBMVlQgaW50ZXJydXB0ICovCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCisJc2V0X2ludHJfZ2F0ZShUSEVSTUFMX0FQSUNfVkVDVE9SLCB0aGVybWFsX2ludGVycnVwdCk7CisjZW5kaWYKK30KKworLyoqCisgKiBjb25uZWN0X2JzcF9BUElDIC0gYXR0YWNoIHRoZSBBUElDIHRvIHRoZSBpbnRlcnJ1cHQgc3lzdGVtCisgKi8KK3ZvaWQgX19pbml0IGNvbm5lY3RfYnNwX0FQSUModm9pZCkKK3sKKwlpZiAocGljX21vZGUpIHsKKwkJLyoKKwkJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KKwkJICovCisJCWNsZWFyX2xvY2FsX0FQSUMoKTsKKwkJLyoKKwkJICogUElDIG1vZGUsIGVuYWJsZSBBUElDIG1vZGUgaW4gdGhlIElNQ1IsIGkuZS4gIGNvbm5lY3QgQlNQJ3MKKwkJICogbG9jYWwgQVBJQyB0byBJTlQgYW5kIE5NSSBsaW5lcy4KKwkJICovCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgImxlYXZpbmcgUElDIG1vZGUsICIKKwkJCQkiZW5hYmxpbmcgQVBJQyBtb2RlLlxuIik7CisJCW91dGIoMHg3MCwgMHgyMik7CisJCW91dGIoMHgwMSwgMHgyMyk7CisJfQorCWVuYWJsZV9hcGljX21vZGUoKTsKK30KKworLyoqCisgKiBkaXNjb25uZWN0X2JzcF9BUElDIC0gZGV0YWNoIHRoZSBBUElDIGZyb20gdGhlIGludGVycnVwdCBzeXN0ZW0KKyAqIEB2aXJ0X3dpcmVfc2V0dXA6CWluZGljYXRlcywgd2hldGhlciB2aXJ0dWFsIHdpcmUgbW9kZSBpcyBzZWxlY3RlZAorICoKKyAqIFZpcnR1YWwgd2lyZSBtb2RlIGlzIG5lY2Vzc2FyeSB0byBkZWxpdmVyIGxlZ2FjeSBpbnRlcnJ1cHRzIGV2ZW4gd2hlbiB0aGUKKyAqIEFQSUMgaXMgZGlzYWJsZWQuCisgKi8KK3ZvaWQgZGlzY29ubmVjdF9ic3BfQVBJQyhpbnQgdmlydF93aXJlX3NldHVwKQoreworCWlmIChwaWNfbW9kZSkgeworCQkvKgorCQkgKiBQdXQgdGhlIGJvYXJkIGJhY2sgaW50byBQSUMgbW9kZSAoaGFzIGFuIGVmZmVjdCBvbmx5IG9uCisJCSAqIGNlcnRhaW4gb2xkZXIgYm9hcmRzKS4gIE5vdGUgdGhhdCBBUElDIGludGVycnVwdHMsIGluY2x1ZGluZworCQkgKiBJUElzLCB3b24ndCB3b3JrIGJleW9uZCB0aGlzIHBvaW50ISAgVGhlIG9ubHkgZXhjZXB0aW9uIGFyZQorCQkgKiBJTklUIElQSXMuCisJCSAqLworCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJkaXNhYmxpbmcgQVBJQyBtb2RlLCAiCisJCQkJImVudGVyaW5nIFBJQyBtb2RlLlxuIik7CisJCW91dGIoMHg3MCwgMHgyMik7CisJCW91dGIoMHgwMCwgMHgyMyk7CisJfSBlbHNlIHsKKwkJLyogR28gYmFjayB0byBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCisJCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkJLyogRm9yIHRoZSBzcHVyaW91cyBpbnRlcnJ1cHQgdXNlIHZlY3RvciBGLCBhbmQgZW5hYmxlIGl0ICovCisJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7CisJCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOworCQl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOworCQl2YWx1ZSB8PSAweGY7CisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfU1BJViwgdmFsdWUpOworCisJCWlmICghdmlydF93aXJlX3NldHVwKSB7CisJCQkvKgorCQkJICogRm9yIExWVDAgbWFrZSBpdCBlZGdlIHRyaWdnZXJlZCwgYWN0aXZlIGhpZ2gsCisJCQkgKiBleHRlcm5hbCBhbmQgZW5hYmxlZAorCQkJICovCisJCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCQkJdmFsdWUgJj0gfihBUElDX01PREVfTUFTSyB8IEFQSUNfU0VORF9QRU5ESU5HIHwKKwkJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8CisJCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCApOworCQkJdmFsdWUgfD0gQVBJQ19MVlRfUkVNT1RFX0lSUiB8IEFQSUNfU0VORF9QRU5ESU5HOworCQkJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfRVhUSU5UKTsKKwkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdmFsdWUpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBMVlQwICovCisJCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCk7CisJCX0KKworCQkvKgorCQkgKiBGb3IgTFZUMSBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgbm1pIGFuZAorCQkgKiBlbmFibGVkCisJCSAqLworCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDEpOworCQl2YWx1ZSAmPSB+KAorCQkJQVBJQ19NT0RFX01BU0sgfCBBUElDX1NFTkRfUEVORElORyB8CisJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8CisJCQlBUElDX0xWVF9MRVZFTF9UUklHR0VSIHwgQVBJQ19MVlRfTUFTS0VEKTsKKwkJdmFsdWUgfD0gQVBJQ19MVlRfUkVNT1RFX0lSUiB8IEFQSUNfU0VORF9QRU5ESU5HOworCQl2YWx1ZSA9IFNFVF9BUElDX0RFTElWRVJZX01PREUodmFsdWUsIEFQSUNfTU9ERV9OTUkpOworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKKwl9Cit9CisKKy8qCisgKiBQb3dlciBtYW5hZ2VtZW50CisgKi8KICNpZmRlZiBDT05GSUdfUE0KIAogc3RhdGljIHN0cnVjdCB7CkBAIC02NTMsNyArMTQwNiw3IEBACiAJaWYgKCFhcGljX3BtX3N0YXRlLmFjdGl2ZSkKIAkJcmV0dXJuIDA7CiAKLQltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisJbWF4bHZ0ID0gbGFwaWNfZ2V0X21heGx2dCgpOwogCiAJYXBpY19wbV9zdGF0ZS5hcGljX2lkID0gYXBpY19yZWFkKEFQSUNfSUQpOwogCWFwaWNfcG1fc3RhdGUuYXBpY190YXNrcHJpID0gYXBpY19yZWFkKEFQSUNfVEFTS1BSSSk7CkBAIC02NzIsNyArMTQyNSw3IEBACiAJaWYgKG1heGx2dCA+PSA1KQogCQlhcGljX3BtX3N0YXRlLmFwaWNfdGhtciA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOwogI2VuZGlmCi0JCisKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJZGlzYWJsZV9sb2NhbF9BUElDKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtNjg4LDcgKzE0NDEsNyBAQAogCWlmICghYXBpY19wbV9zdGF0ZS5hY3RpdmUpCiAJCXJldHVybiAwOwogCi0JbWF4bHZ0ID0gZ2V0X21heGx2dCgpOworCW1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIApAQCAtNzcwLDY1MSArMTUyMywzIEBACiBzdGF0aWMgdm9pZCBhcGljX3BtX2FjdGl2YXRlKHZvaWQpIHsgfQogCiAjZW5kaWYJLyogQ09ORklHX1BNICovCi0KLS8qCi0gKiBEZXRlY3QgYW5kIGVuYWJsZSBsb2NhbCBBUElDcyBvbiBub24tU01QIGJvYXJkcy4KLSAqIE9yaWdpbmFsIGNvZGUgd3JpdHRlbiBieSBLZWlyIEZyYXNlci4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBhcGljX3NldF92ZXJib3NpdHkoY2hhciAqc3RyKQotewotCWlmIChzdHJjbXAoImRlYnVnIiwgc3RyKSA9PSAwKQotCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfREVCVUc7Ci0JZWxzZSBpZiAoc3RyY21wKCJ2ZXJib3NlIiwgc3RyKSA9PSAwKQotCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfVkVSQk9TRTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgiYXBpYz0iLCBhcGljX3NldF92ZXJib3NpdHkpOwotCi1zdGF0aWMgaW50IF9faW5pdCBkZXRlY3RfaW5pdF9BUElDICh2b2lkKQotewotCXUzMiBoLCBsLCBmZWF0dXJlczsKLQotCS8qIERpc2FibGVkIGJ5IGtlcm5lbCBvcHRpb24/ICovCi0JaWYgKGVuYWJsZV9sb2NhbF9hcGljIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0Jc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKLQljYXNlIFg4Nl9WRU5ET1JfQU1EOgotCQlpZiAoKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAxKSB8fAotCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkJICAgIAotCQkJYnJlYWs7Ci0JCWdvdG8gbm9fYXBpYzsKLQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6Ci0JCWlmIChib290X2NwdV9kYXRhLng4NiA9PSA2IHx8IGJvb3RfY3B1X2RhdGEueDg2ID09IDE1IHx8Ci0JCSAgICAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNSAmJiBjcHVfaGFzX2FwaWMpKQotCQkJYnJlYWs7Ci0JCWdvdG8gbm9fYXBpYzsKLQlkZWZhdWx0OgotCQlnb3RvIG5vX2FwaWM7Ci0JfQotCi0JaWYgKCFjcHVfaGFzX2FwaWMpIHsKLQkJLyoKLQkJICogT3Zlci1yaWRlIEJJT1MgYW5kIHRyeSB0byBlbmFibGUgdGhlIGxvY2FsCi0JCSAqIEFQSUMgb25seSBpZiAibGFwaWMiIHNwZWNpZmllZC4KLQkJICovCi0JCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8PSAwKSB7Ci0JCQlwcmludGsoIkxvY2FsIEFQSUMgZGlzYWJsZWQgYnkgQklPUyAtLSAiCi0JCQkgICAgICAgInlvdSBjYW4gZW5hYmxlIGl0IHdpdGggXCJsYXBpY1wiXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkvKgotCQkgKiBTb21lIEJJT1NlcyBkaXNhYmxlIHRoZSBsb2NhbCBBUElDIGluIHRoZQotCQkgKiBBUElDX0JBU0UgTVNSLiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgaW4KLQkJICogc29mdHdhcmUgZm9yIEludGVsIFA2IG9yIGxhdGVyIGFuZCBBTUQgSzcKLQkJICogKE1vZGVsID4gMSkgb3IgbGF0ZXIuCi0JCSAqLwotCQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7Ci0JCWlmICghKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpKSB7Ci0JCQlwcmludGsoIkxvY2FsIEFQSUMgZGlzYWJsZWQgYnkgQklPUyAtLSByZWVuYWJsaW5nLlxuIik7Ci0JCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9CQVNFOwotCQkJbCB8PSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUgfCBBUElDX0RFRkFVTFRfUEhZU19CQVNFOwotCQkJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOwotCQkJZW5hYmxlZF92aWFfYXBpY2Jhc2UgPSAxOwotCQl9Ci0JfQotCS8qCi0JICogVGhlIEFQSUMgZmVhdHVyZSBiaXQgc2hvdWxkIG5vdyBiZSBlbmFibGVkCi0JICogaW4gYGNwdWlkJwotCSAqLwotCWZlYXR1cmVzID0gY3B1aWRfZWR4KDEpOwotCWlmICghKGZlYXR1cmVzICYgKDEgPDwgWDg2X0ZFQVRVUkVfQVBJQykpKSB7Ci0JCXByaW50aygiQ291bGQgbm90IGVuYWJsZSBBUElDIVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2V0X2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLQltcF9sYXBpY19hZGRyID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKLQotCS8qIFRoZSBCSU9TIG1heSBoYXZlIHNldCB1cCB0aGUgQVBJQyBhdCBzb21lIG90aGVyIGFkZHJlc3MgKi8KLQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7Ci0JaWYgKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpCi0JCW1wX2xhcGljX2FkZHIgPSBsICYgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKLQotCWlmIChubWlfd2F0Y2hkb2cgIT0gTk1JX05PTkUpCi0JCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOwotCi0JcHJpbnRrKCJGb3VuZCBhbmQgZW5hYmxlZCBsb2NhbCBBUElDIVxuIik7Ci0KLQlhcGljX3BtX2FjdGl2YXRlKCk7Ci0KLQlyZXR1cm4gMDsKLQotbm9fYXBpYzoKLQlwcmludGsoIk5vIGxvY2FsIEFQSUMgcHJlc2VudCBvciBoYXJkd2FyZSBkaXNhYmxlZFxuIik7Ci0JcmV0dXJuIC0xOwotfQotCi12b2lkIF9faW5pdCBpbml0X2FwaWNfbWFwcGluZ3Modm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGFwaWNfcGh5czsKLQotCS8qCi0JICogSWYgbm8gbG9jYWwgQVBJQyBjYW4gYmUgZm91bmQgdGhlbiBzZXQgdXAgYSBmYWtlIGFsbAotCSAqIHplcm9lcyBwYWdlIHRvIHNpbXVsYXRlIHRoZSBsb2NhbCBBUElDIGFuZCBhbm90aGVyCi0JICogb25lIGZvciB0aGUgSU8tQVBJQy4KLQkgKi8KLQlpZiAoIXNtcF9mb3VuZF9jb25maWcgJiYgZGV0ZWN0X2luaXRfQVBJQygpKSB7Ci0JCWFwaWNfcGh5cyA9ICh1bnNpZ25lZCBsb25nKSBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7Ci0JCWFwaWNfcGh5cyA9IF9fcGEoYXBpY19waHlzKTsKLQl9IGVsc2UKLQkJYXBpY19waHlzID0gbXBfbGFwaWNfYWRkcjsKLQotCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQVBJQ19CQVNFLCBhcGljX3BoeXMpOwotCXByaW50ayhLRVJOX0RFQlVHICJtYXBwZWQgQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLCBBUElDX0JBU0UsCi0JICAgICAgIGFwaWNfcGh5cyk7Ci0KLQkvKgotCSAqIEZldGNoIHRoZSBBUElDIElEIG9mIHRoZSBCU1AgaW4gY2FzZSB3ZSBoYXZlIGEKLQkgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKG9yIHRoZSBNUCB0YWJsZSBpcyBicm9rZW4pLgotCSAqLwotCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPT0gLTFVKQotCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCi0JewotCQl1bnNpZ25lZCBsb25nIGlvYXBpY19waHlzLCBpZHggPSBGSVhfSU9fQVBJQ19CQVNFXzA7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspIHsKLQkJCWlmIChzbXBfZm91bmRfY29uZmlnKSB7Ci0JCQkJaW9hcGljX3BoeXMgPSBtcF9pb2FwaWNzW2ldLm1wY19hcGljYWRkcjsKLQkJCQlpZiAoIWlvYXBpY19waHlzKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkgICAgICAgIldBUk5JTkc6IGJvZ3VzIHplcm8gSU8tQVBJQyAiCi0JCQkJCSAgICAgICAiYWRkcmVzcyBmb3VuZCBpbiBNUFRBQkxFLCAiCi0JCQkJCSAgICAgICAiZGlzYWJsaW5nIElPL0FQSUMgc3VwcG9ydCFcbiIpOwotCQkJCQlzbXBfZm91bmRfY29uZmlnID0gMDsKLQkJCQkJc2tpcF9pb2FwaWNfc2V0dXAgPSAxOwotCQkJCQlnb3RvIGZha2VfaW9hcGljX3BhZ2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLWZha2VfaW9hcGljX3BhZ2U6Ci0JCQkJaW9hcGljX3BoeXMgPSAodW5zaWduZWQgbG9uZykKLQkJCQkJICAgICAgYWxsb2NfYm9vdG1lbV9wYWdlcyhQQUdFX1NJWkUpOwotCQkJCWlvYXBpY19waHlzID0gX19wYShpb2FwaWNfcGh5cyk7Ci0JCQl9Ci0JCQlzZXRfZml4bWFwX25vY2FjaGUoaWR4LCBpb2FwaWNfcGh5cyk7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAibWFwcGVkIElPQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLAotCQkJICAgICAgIF9fZml4X3RvX3ZpcnQoaWR4KSwgaW9hcGljX3BoeXMpOwotCQkJaWR4Kys7Ci0JCX0KLQl9Ci0jZW5kaWYKLX0KLQotLyoKLSAqIFRoaXMgcGFydCBzZXRzIHVwIHRoZSBBUElDIDMyIGJpdCBjbG9jayBpbiBMVlRUMSwgd2l0aCBIWiBpbnRlcnJ1cHRzCi0gKiBwZXIgc2Vjb25kLiBXZSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IHNldCB1cCB0aGUgbG9jYWwKLSAqIEFQSUMuCi0gKgotICogVGhlIEFQSUMgdGltZXIgaXMgbm90IGV4YWN0bHkgc3luYyB3aXRoIHRoZSBleHRlcm5hbCB0aW1lciBjaGlwLCBpdAotICogY2xvc2VseSBmb2xsb3dzIGJ1cyBjbG9ja3MuCi0gKi8KLQotLyoKLSAqIFRoZSB0aW1lciBjaGlwIGlzIGFscmVhZHkgc2V0IHVwIGF0IEhaIGludGVycnVwdHMgcGVyIHNlY29uZCBoZXJlLAotICogYnV0IHdlIGRvIG5vdCBhY2NlcHQgdGltZXIgaW50ZXJydXB0cyB5ZXQuIFdlIG9ubHkgYWxsb3cgdGhlIEJQCi0gKiB0byBjYWxpYnJhdGUuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGdldF84MjU0X3RpbWVyX2NvdW50KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXVuc2lnbmVkIGludCBjb3VudDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7Ci0KLQlvdXRiX3AoMHgwMCwgUElUX01PREUpOwotCWNvdW50ID0gaW5iX3AoUElUX0NIMCk7Ci0JY291bnQgfD0gaW5iX3AoUElUX0NIMCkgPDwgODsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotLyogbmV4dCB0aWNrIGluIDgyNTQgY2FuIGJlIGNhdWdodCBieSBjYXRjaGluZyB0aW1lciB3cmFwYXJvdW5kICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgd2FpdF84MjU0X3dyYXBhcm91bmQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgY3Vycl9jb3VudCwgcHJldl9jb3VudDsKLQotCWN1cnJfY291bnQgPSBnZXRfODI1NF90aW1lcl9jb3VudCgpOwotCWRvIHsKLQkJcHJldl9jb3VudCA9IGN1cnJfY291bnQ7Ci0JCWN1cnJfY291bnQgPSBnZXRfODI1NF90aW1lcl9jb3VudCgpOwotCi0JCS8qIHdvcmthcm91bmQgZm9yIGJyb2tlbiBNZXJjdXJ5L05lcHR1bmUgKi8KLQkJaWYgKHByZXZfY291bnQgPj0gY3Vycl9jb3VudCArIDB4MTAwKQotCQkJY3Vycl9jb3VudCA9IGdldF84MjU0X3RpbWVyX2NvdW50KCk7Ci0KLQl9IHdoaWxlIChwcmV2X2NvdW50ID49IGN1cnJfY291bnQpOwotfQotCi0vKgotICogRGVmYXVsdCBpbml0aWFsaXphdGlvbiBmb3IgODI1NCB0aW1lcnMuIElmIHdlIHVzZSBvdGhlciB0aW1lcnMgbGlrZSBIUEVULAotICogd2Ugb3ZlcnJpZGUgdGhpcyBsYXRlcgotICovCi12b2lkICgqd2FpdF90aW1lcl90aWNrKSh2b2lkKSBfX2RldmluaXRkYXRhID0gd2FpdF84MjU0X3dyYXBhcm91bmQ7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIGxvY2FsIEFQSUMgdGltZXIsIHdpdGggYSB0aW1lb3V0IG9mCi0gKiAnY2xvY2tzJyBBUElDIGJ1cyBjbG9jay4gRHVyaW5nIGNhbGlicmF0aW9uIHdlIGFjdHVhbGx5IGNhbGwKLSAqIHRoaXMgZnVuY3Rpb24gdHdpY2Ugb24gdGhlIGJvb3QgQ1BVLCBvbmNlIHdpdGggYSBib2d1cyB0aW1lb3V0Ci0gKiB2YWx1ZSwgc2Vjb25kIHRpbWUgZm9yIHJlYWwuIFRoZSBvdGhlciAobm9uY2FsaWJyYXRpbmcpIENQVXMKLSAqIGNhbGwgdGhpcyBmdW5jdGlvbiBvbmx5IG9uY2UsIHdpdGggdGhlIHJlYWwsIGNhbGlicmF0ZWQgdmFsdWUuCi0gKgotICogV2UgZG8gcmVhZHMgYmVmb3JlIHdyaXRlcyBldmVuIGlmIHVubmVjZXNzYXJ5LCB0byBnZXQgYXJvdW5kIHRoZQotICogUDUgQVBJQyBkb3VibGUgd3JpdGUgYnVnLgotICovCi0KLSNkZWZpbmUgQVBJQ19ESVZJU09SIDE2Ci0KLXN0YXRpYyB2b2lkIF9fc2V0dXBfQVBJQ19MVlRUKHVuc2lnbmVkIGludCBjbG9ja3MpCi17Ci0JdW5zaWduZWQgaW50IGx2dHRfdmFsdWUsIHRtcF92YWx1ZSwgdmVyOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOwotCWx2dHRfdmFsdWUgPSBBUElDX0xWVF9USU1FUl9QRVJJT0RJQyB8IExPQ0FMX1RJTUVSX1ZFQ1RPUjsKLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQotCQlsdnR0X3ZhbHVlIHw9IFNFVF9BUElDX1RJTUVSX0JBU0UoQVBJQ19USU1FUl9CQVNFX0RJVik7Ci0KLQlpZiAoY3B1X2lzc2V0KGNwdSwgdGltZXJfYmNhc3RfaXBpKSkKLQkJbHZ0dF92YWx1ZSB8PSBBUElDX0xWVF9NQVNLRUQ7Ci0KLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIGx2dHRfdmFsdWUpOwotCi0JLyoKLQkgKiBEaXZpZGUgUElDTEsgYnkgMTYKLQkgKi8KLQl0bXBfdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19URENSKTsKLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1REQ1IsICh0bXBfdmFsdWUKLQkJCQkmIH4oQVBJQ19URFJfRElWXzEgfCBBUElDX1REUl9ESVZfVE1CQVNFKSkKLQkJCQl8IEFQSUNfVERSX0RJVl8xNik7Ci0KLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1RNSUNULCBjbG9ja3MvQVBJQ19ESVZJU09SKTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHNldHVwX0FQSUNfdGltZXIodW5zaWduZWQgaW50IGNsb2NrcykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyoKLQkgKiBXYWl0IGZvciBJUlEwJ3Mgc2xpY2U6Ci0JICovCi0Jd2FpdF90aW1lcl90aWNrKCk7Ci0KLQlfX3NldHVwX0FQSUNfTFZUVChjbG9ja3MpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKgotICogSW4gdGhpcyBmdW5jdGlvbiB3ZSBjYWxpYnJhdGUgQVBJQyBidXMgY2xvY2tzIHRvIHRoZSBleHRlcm5hbAotICogdGltZXIuIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHVzZSBqaWZmaWVzIGFuZCB0aGUgdGltZXIgaXJxCi0gKiB0byBjYWxpYnJhdGUsIHNpbmNlIHNvbWUgbGF0ZXIgYm9vdHVwIGNvZGUgZGVwZW5kcyBvbiBnZXR0aW5nCi0gKiB0aGUgZmlyc3QgaXJxPyBVZ2guCi0gKgotICogV2Ugd2FudCB0byBkbyB0aGUgY2FsaWJyYXRpb24gb25seSBvbmNlIHNpbmNlIHdlCi0gKiB3YW50IHRvIGhhdmUgbG9jYWwgdGltZXIgaXJxcyBzeW5jcm9uLiBDUFVzIGNvbm5lY3RlZAotICogYnkgdGhlIHNhbWUgQVBJQyBidXMgaGF2ZSB0aGUgdmVyeSBzYW1lIGJ1cyBmcmVxdWVuY3kuCi0gKiBBbmQgd2Ugd2FudCB0byBoYXZlIGlycXMgb2ZmIGFueXdheXMsIG5vIGFjY2lkZW50YWwKLSAqIEFQSUMgaXJxIHRoYXQgd2F5LgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGNhbGlicmF0ZV9BUElDX2Nsb2NrKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHQxID0gMCwgdDIgPSAwOwotCWxvbmcgdHQxLCB0dDI7Ci0JbG9uZyByZXN1bHQ7Ci0JaW50IGk7Ci0JY29uc3QgaW50IExPT1BTID0gSFovMTA7Ci0KLQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJjYWxpYnJhdGluZyBBUElDIHRpbWVyIC4uLlxuIik7Ci0KLQkvKgotCSAqIFB1dCB3aGF0ZXZlciBhcmJpdHJhcnkgKGJ1dCBsb25nIGVub3VnaCkgdGltZW91dAotCSAqIHZhbHVlIGludG8gdGhlIEFQSUMgY2xvY2ssIHdlIGp1c3Qgd2FudCB0byBnZXQgdGhlCi0JICogY291bnRlciBydW5uaW5nIGZvciBjYWxpYnJhdGlvbi4KLQkgKi8KLQlfX3NldHVwX0FQSUNfTFZUVCgxMDAwMDAwMDAwKTsKLQotCS8qCi0JICogVGhlIHRpbWVyIGNoaXAgY291bnRzIGRvd24gdG8gemVyby4gTGV0J3Mgd2FpdAotCSAqIGZvciBhIHdyYXBhcm91bmQgdG8gc3RhcnQgZXhhY3QgbWVhc3VyZW1lbnQ6Ci0JICogKHRoZSBjdXJyZW50IHRpY2sgbWlnaHQgaGF2ZSBiZWVuIGFscmVhZHkgaGFsZiBkb25lKQotCSAqLwotCi0Jd2FpdF90aW1lcl90aWNrKCk7Ci0KLQkvKgotCSAqIFdlIHdyYXBwZWQgYXJvdW5kIGp1c3Qgbm93LiBMZXQncyBzdGFydDoKLQkgKi8KLQlpZiAoY3B1X2hhc190c2MpCi0JCXJkdHNjbGwodDEpOwotCXR0MSA9IGFwaWNfcmVhZChBUElDX1RNQ0NUKTsKLQotCS8qCi0JICogTGV0J3Mgd2FpdCBMT09QUyB3cmFwcm91bmRzOgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBMT09QUzsgaSsrKQotCQl3YWl0X3RpbWVyX3RpY2soKTsKLQotCXR0MiA9IGFwaWNfcmVhZChBUElDX1RNQ0NUKTsKLQlpZiAoY3B1X2hhc190c2MpCi0JCXJkdHNjbGwodDIpOwotCi0JLyoKLQkgKiBUaGUgQVBJQyBidXMgY2xvY2sgY291bnRlciBpcyAzMiBiaXRzIG9ubHksIGl0Ci0JICogbWlnaHQgaGF2ZSBvdmVyZmxvd24sIGJ1dCBub3RlIHRoYXQgd2UgdXNlIHNpZ25lZAotCSAqIGxvbmdzLCB0aHVzIG5vIGV4dHJhIGNhcmUgbmVlZGVkLgotCSAqCi0JICogdW5kZXJmbG93biB0byBiZSBleGFjdCwgYXMgdGhlIHRpbWVyIGNvdW50cyBkb3duIDspCi0JICovCi0KLQlyZXN1bHQgPSAodHQxLXR0MikqQVBJQ19ESVZJU09SL0xPT1BTOwotCi0JaWYgKGNwdV9oYXNfdHNjKQotCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4uLiBDUFUgY2xvY2sgc3BlZWQgaXMgIgotCQkJIiVsZC4lMDRsZCBNSHouXG4iLAotCQkJKChsb25nKSh0Mi10MSkvTE9PUFMpLygxMDAwMDAwL0haKSwKLQkJCSgobG9uZykodDItdDEpL0xPT1BTKSUoMTAwMDAwMC9IWikpOwotCi0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uLi4gaG9zdCBidXMgY2xvY2sgc3BlZWQgaXMgIgotCQkiJWxkLiUwNGxkIE1Iei5cbiIsCi0JCXJlc3VsdC8oMTAwMDAwMC9IWiksCi0JCXJlc3VsdCUoMTAwMDAwMC9IWikpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjYWxpYnJhdGlvbl9yZXN1bHQ7Ci0KLXZvaWQgX19pbml0IHNldHVwX2Jvb3RfQVBJQ19jbG9jayh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiVXNpbmcgbG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHRzLlxuIik7Ci0JdXNpbmdfYXBpY190aW1lciA9IDE7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQljYWxpYnJhdGlvbl9yZXN1bHQgPSBjYWxpYnJhdGVfQVBJQ19jbG9jaygpOwotCS8qCi0JICogTm93IHNldCB1cCB0aGUgdGltZXIgZm9yIHJlYWwuCi0JICovCi0Jc2V0dXBfQVBJQ190aW1lcihjYWxpYnJhdGlvbl9yZXN1bHQpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi12b2lkIF9fZGV2aW5pdCBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jayh2b2lkKQotewotCXNldHVwX0FQSUNfdGltZXIoY2FsaWJyYXRpb25fcmVzdWx0KTsKLX0KLQotdm9pZCBkaXNhYmxlX0FQSUNfdGltZXIodm9pZCkKLXsKLQlpZiAodXNpbmdfYXBpY190aW1lcikgewotCQl1bnNpZ25lZCBsb25nIHY7Ci0KLQkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOwotCQkvKgotCQkgKiBXaGVuIGFuIGlsbGVnYWwgdmVjdG9yIHZhbHVlICgwLTE1KSBpcyB3cml0dGVuIHRvIGFuIExWVAotCQkgKiBlbnRyeSBhbmQgZGVsaXZlcnkgbW9kZSBpcyBGaXhlZCwgdGhlIEFQSUMgbWF5IHNpZ25hbCBhbgotCQkgKiBpbGxlZ2FsIHZlY3RvciBlcnJvciwgd2l0aCBvdXQgcmVnYXJkIHRvIHdoZXRoZXIgdGhlIG1hc2sKLQkJICogYml0IGlzIHNldCBvciB3aGV0aGVyIGFuIGludGVycnVwdCBpcyBhY3R1YWxseSBzZWVuIG9uIGlucHV0LgotCQkgKgotCQkgKiBCb290IHNlcXVlbmNlIG1pZ2h0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBMVlRUIGhhcwotCQkgKiAnMCcgdmVjdG9yIHZhbHVlLiBTbyBtYWtlIHN1cmUgdmVjdG9yIGZpZWxkIGlzIHNldCB0bwotCQkgKiB2YWxpZCB2YWx1ZS4KLQkJICovCi0JCXYgfD0gKEFQSUNfTFZUX01BU0tFRCB8IExPQ0FMX1RJTUVSX1ZFQ1RPUik7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVCwgdik7Ci0JfQotfQotCi12b2lkIGVuYWJsZV9BUElDX3RpbWVyKHZvaWQpCi17Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWlmICh1c2luZ19hcGljX3RpbWVyICYmCi0JICAgICFjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdjsKLQotCQl2ID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVCwgdiAmIH5BUElDX0xWVF9NQVNLRUQpOwotCX0KLX0KLQotdm9pZCBzd2l0Y2hfQVBJQ190aW1lcl90b19pcGkodm9pZCAqY3B1bWFzaykKLXsKLQljcHVtYXNrX3QgbWFzayA9ICooY3B1bWFza190ICopY3B1bWFzazsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JaWYgKGNwdV9pc3NldChjcHUsIG1hc2spICYmCi0JICAgICFjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7Ci0JCWRpc2FibGVfQVBJQ190aW1lcigpOwotCQljcHVfc2V0KGNwdSwgdGltZXJfYmNhc3RfaXBpKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKHN3aXRjaF9BUElDX3RpbWVyX3RvX2lwaSk7Ci0KLXZvaWQgc3dpdGNoX2lwaV90b19BUElDX3RpbWVyKHZvaWQgKmNwdW1hc2spCi17Ci0JY3B1bWFza190IG1hc2sgPSAqKGNwdW1hc2tfdCAqKWNwdW1hc2s7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWlmIChjcHVfaXNzZXQoY3B1LCBtYXNrKSAmJgotCSAgICBjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7Ci0JCWNwdV9jbGVhcihjcHUsIHRpbWVyX2JjYXN0X2lwaSk7Ci0JCWVuYWJsZV9BUElDX3RpbWVyKCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIpOwotCi0jdW5kZWYgQVBJQ19ESVZJU09SCi0KLS8qCi0gKiBMb2NhbCB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlci4gSXQgZG9lcyBib3RoIHByb2ZpbGluZyBhbmQKLSAqIHByb2Nlc3Mgc3RhdGlzdGljcy9yZXNjaGVkdWxpbmcuCi0gKgotICogV2UgZG8gcHJvZmlsaW5nIGluIGV2ZXJ5IGxvY2FsIHRpY2ssIHN0YXRpc3RpY3MvcmVzY2hlZHVsaW5nCi0gKiBoYXBwZW4gb25seSBldmVyeSAncHJvZmlsaW5nIG11bHRpcGxpZXInIHRpY2tzLiBUaGUgZGVmYXVsdAotICogbXVsdGlwbGllciBpcyAxIGFuZCBpdCBjYW4gYmUgY2hhbmdlZCBieSB3cml0aW5nIHRoZSBuZXcgbXVsdGlwbGllcgotICogdmFsdWUgaW50byAvcHJvYy9wcm9maWxlLgotICovCi0KLWlubGluZSB2b2lkIHNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQodm9pZCkKLXsKLQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Ci0jaWZkZWYgQ09ORklHX1NNUAotCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZV92bShnZXRfaXJxX3JlZ3MoKSkpOwotI2VuZGlmCi0KLQkvKgotCSAqIFdlIHRha2UgdGhlICdsb25nJyByZXR1cm4gcGF0aCwgYW5kIHRoZXJlIGV2ZXJ5IHN1YnN5c3RlbQotCSAqIGdyYWJzIHRoZSBhcHJvcHJpYXRlIGxvY2tzIChrZXJuZWwgbG9jay8gaXJxIGxvY2spLgotCSAqCi0JICogd2UgbWlnaHQgd2FudCB0byBkZWNvdXBsZSBwcm9maWxpbmcgZnJvbSB0aGUgJ2xvbmcgcGF0aCcsCi0JICogYW5kIGRvIHRoZSBwcm9maWxpbmcgdG90YWxseSBpbiBhc3NlbWJseS4KLQkgKgotCSAqIEN1cnJlbnRseSB0aGlzIGlzbid0IHRvbyBtdWNoIG9mIGFuIGlzc3VlIChwZXJmb3JtYW5jZSB3aXNlKSwKLQkgKiB3ZSBjYW4gdGFrZSBtb3JlIHRoYW4gMTAwSyBsb2NhbCBpcnFzIHBlciBzZWNvbmQgb24gYSAxMDAgTUh6IFA1LgotCSAqLwotfQotCi0vKgotICogTG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHQuIFRoaXMgaXMgdGhlIG1vc3QgbmF0dXJhbCB3YXkgZm9yIGRvaW5nCi0gKiBsb2NhbCBpbnRlcnJ1cHRzLCBidXQgbG9jYWwgdGltZXIgaW50ZXJydXB0cyBjYW4gYmUgZW11bGF0ZWQgYnkKLSAqIGJyb2FkY2FzdCBpbnRlcnJ1cHRzIHRvby4gW2luIGNhc2UgdGhlIGh3IGRvZXNuJ3Qgc3VwcG9ydCBBUElDIHRpbWVyc10KLSAqCi0gKiBbIGlmIGEgc2luZ2xlLUNQVSBzeXN0ZW0gcnVucyBhbiBTTVAga2VybmVsIHRoZW4gd2UgY2FsbCB0aGUgbG9jYWwKLSAqICAgaW50ZXJydXB0IGFzIHdlbGwuIFRodXMgd2UgY2Fubm90IGlubGluZSB0aGUgbG9jYWwgaXJxIC4uLiBdCi0gKi8KLQotZmFzdGNhbGwgdm9pZCBzbXBfYXBpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQkvKgotCSAqIHRoZSBOTUkgZGVhZGxvY2stZGV0ZWN0b3IgdXNlcyB0aGlzLgotCSAqLwotCXBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuYXBpY190aW1lcl9pcnFzKys7Ci0KLQkvKgotCSAqIE5PVEUhIFdlJ2QgYmV0dGVyIEFDSyB0aGUgaXJxIGltbWVkaWF0ZWx5LAotCSAqIGJlY2F1c2UgdGltZXIgaGFuZGxpbmcgY2FuIGJlIHNsb3cuCi0JICovCi0JYWNrX0FQSUNfaXJxKCk7Ci0JLyoKLQkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIGV4cGVjdHMgdXMgdG8gaGF2ZSBkb25lIGlycV9lbnRlcigpLgotCSAqIEJlc2lkZXMsIGlmIHdlIGRvbid0IHRpbWVyIGludGVycnVwdHMgaWdub3JlIHRoZSBnbG9iYWwKLQkgKiBpbnRlcnJ1cHQgbG9jaywgd2hpY2ggaXMgdGhlIFdyb25nVGhpbmcgKHRtKSB0byBkby4KLQkgKi8KLQlleGl0X2lkbGUoKTsKLQlpcnFfZW50ZXIoKTsKLQlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KCk7Ci0JaXJxX2V4aXQoKTsKLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwotfQotCi0jaWZuZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIHVwX2FwaWNfdGltZXJfaW50ZXJydXB0X2NhbGwodm9pZCkKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JLyoKLQkgKiB0aGUgTk1JIGRlYWRsb2NrLWRldGVjdG9yIHVzZXMgdGhpcy4KLQkgKi8KLQlwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxcysrOwotCi0Jc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdCgpOwotfQotI2VuZGlmCi0KLXZvaWQgc21wX3NlbmRfdGltZXJfYnJvYWRjYXN0X2lwaSh2b2lkKQotewotCWNwdW1hc2tfdCBtYXNrOwotCi0JY3B1c19hbmQobWFzaywgY3B1X29ubGluZV9tYXAsIHRpbWVyX2JjYXN0X2lwaSk7Ci0JaWYgKCFjcHVzX2VtcHR5KG1hc2spKSB7Ci0jaWZkZWYgQ09ORklHX1NNUAotCQlzZW5kX0lQSV9tYXNrKG1hc2ssIExPQ0FMX1RJTUVSX1ZFQ1RPUik7Ci0jZWxzZQotCQkvKgotCQkgKiBXZSBjYW4gZGlyZWN0bHkgY2FsbCB0aGUgYXBpYyB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlcgotCQkgKiBpbiBVUCBjYXNlLiBNaW51cyBhbGwgaXJxIHJlbGF0ZWQgZnVuY3Rpb25zCi0JCSAqLwotCQl1cF9hcGljX3RpbWVyX2ludGVycnVwdF9jYWxsKCk7Ci0jZW5kaWYKLQl9Ci19Ci0KLWludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qCi0gKiBUaGlzIGludGVycnVwdCBzaG91bGQgX25ldmVyXyBoYXBwZW4gd2l0aCBvdXIgQVBJQy9TTVAgYXJjaGl0ZWN0dXJlCi0gKi8KLWZhc3RjYWxsIHZvaWQgc21wX3NwdXJpb3VzX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIHY7Ci0KLQlleGl0X2lkbGUoKTsKLQlpcnFfZW50ZXIoKTsKLQkvKgotCSAqIENoZWNrIGlmIHRoaXMgcmVhbGx5IGlzIGEgc3B1cmlvdXMgaW50ZXJydXB0IGFuZCBBQ0sgaXQKLQkgKiBpZiBpdCBpcyBhIHZlY3RvcmVkIG9uZS4gIEp1c3QgaW4gY2FzZS4uLgotCSAqIFNwdXJpb3VzIGludGVycnVwdHMgc2hvdWxkIG5vdCBiZSBBQ0tlZC4KLQkgKi8KLQl2ID0gYXBpY19yZWFkKEFQSUNfSVNSICsgKChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIH4weDFmKSA+PiAxKSk7Ci0JaWYgKHYgJiAoMSA8PCAoU1BVUklPVVNfQVBJQ19WRUNUT1IgJiAweDFmKSkpCi0JCWFja19BUElDX2lycSgpOwotCi0JLyogc2VlIHN3LWRldi1tYW4gdm9sIDMsIGNoYXB0ZXIgNy40LjEzLjUgKi8KLQlwcmludGsoS0VSTl9JTkZPICJzcHVyaW91cyBBUElDIGludGVycnVwdCBvbiBDUFUjJWQsIHNob3VsZCBuZXZlciBoYXBwZW4uXG4iLAotCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlpcnFfZXhpdCgpOwotfQotCi0vKgotICogVGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5ldmVyIGhhcHBlbiB3aXRoIG91ciBBUElDL1NNUCBhcmNoaXRlY3R1cmUKLSAqLwotCi1mYXN0Y2FsbCB2b2lkIHNtcF9lcnJvcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyB2LCB2MTsKLQotCWV4aXRfaWRsZSgpOwotCWlycV9lbnRlcigpOwotCS8qIEZpcnN0IHRpY2tsZSB0aGUgaGFyZHdhcmUsIG9ubHkgdGhlbiByZXBvcnQgd2hhdCB3ZW50IG9uLiAtLSBSRVcgKi8KLQl2ID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKLQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKLQl2MSA9IGFwaWNfcmVhZChBUElDX0VTUik7Ci0JYWNrX0FQSUNfaXJxKCk7Ci0JYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCk7Ci0KLQkvKiBIZXJlIGlzIHdoYXQgdGhlIEFQSUMgZXJyb3IgYml0cyBtZWFuOgotCSAgIDA6IFNlbmQgQ1MgZXJyb3IKLQkgICAxOiBSZWNlaXZlIENTIGVycm9yCi0JICAgMjogU2VuZCBhY2NlcHQgZXJyb3IKLQkgICAzOiBSZWNlaXZlIGFjY2VwdCBlcnJvcgotCSAgIDQ6IFJlc2VydmVkCi0JICAgNTogU2VuZCBpbGxlZ2FsIHZlY3RvcgotCSAgIDY6IFJlY2VpdmVkIGlsbGVnYWwgdmVjdG9yCi0JICAgNzogSWxsZWdhbCByZWdpc3RlciBhZGRyZXNzCi0JKi8KLQlwcmludGsgKEtFUk5fREVCVUcgIkFQSUMgZXJyb3Igb24gQ1BVJWQ6ICUwMmx4KCUwMmx4KVxuIiwKLQkgICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgdiAsIHYxKTsKLQlpcnFfZXhpdCgpOwotfQotCi0vKgotICogVGhpcyBpbml0aWFsaXplcyB0aGUgSU8tQVBJQyBhbmQgQVBJQyBoYXJkd2FyZSBpZiB0aGlzIGlzCi0gKiBhIFVQIGtlcm5lbC4KLSAqLwotaW50IF9faW5pdCBBUElDX2luaXRfdW5pcHJvY2Vzc29yICh2b2lkKQotewotCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCi0JCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLQotCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiAhY3B1X2hhc19hcGljKQotCQlyZXR1cm4gLTE7Ci0KLQkvKgotCSAqIENvbXBsYWluIGlmIHRoZSBCSU9TIHByZXRlbmRzIHRoZXJlIGlzIG9uZS4KLQkgKi8KLQlpZiAoIWNwdV9oYXNfYXBpYyAmJiBBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQklPUyBidWcsIGxvY2FsIEFQSUMgIyVkIG5vdCBkZXRlY3RlZCEuLi5cbiIsCi0JCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQpOwotCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl2ZXJpZnlfbG9jYWxfQVBJQygpOwotCi0JY29ubmVjdF9ic3BfQVBJQygpOwotCi0JLyoKLQkgKiBIYWNrOiBJbiBjYXNlIG9mIGtkdW1wLCBhZnRlciBhIGNyYXNoLCBrZXJuZWwgbWlnaHQgYmUgYm9vdGluZwotCSAqIG9uIGEgY3B1IHdpdGggbm9uLXplcm8gbGFwaWMgaWQuIEJ1dCBib290X2NwdV9waHlzaWNhbF9hcGljaWQKLQkgKiBtaWdodCBiZSB6ZXJvIGlmIHJlYWQgZnJvbSBNUCB0YWJsZXMuIEdldCBpdCBmcm9tIExBUElDLgotCSAqLwotI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCi0JYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKLSNlbmRpZgotCXBoeXNfY3B1X3ByZXNlbnRfbWFwID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7Ci0KLQlzZXR1cF9sb2NhbF9BUElDKCk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQlpZiAoc21wX2ZvdW5kX2NvbmZpZykKLQkJaWYgKCFza2lwX2lvYXBpY19zZXR1cCAmJiBucl9pb2FwaWNzKQotCQkJc2V0dXBfSU9fQVBJQygpOwotI2VuZGlmCi0Jc2V0dXBfYm9vdF9jbG9jaygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2xhcGljKGNoYXIgKmFyZykKLXsKLQlsYXBpY19lbmFibGUoKTsKLQlyZXR1cm4gMDsKLX0KLWVhcmx5X3BhcmFtKCJsYXBpYyIsIHBhcnNlX2xhcGljKTsKLQotc3RhdGljIGludCBfX2luaXQgcGFyc2Vfbm9sYXBpYyhjaGFyICphcmcpCi17Ci0JbGFwaWNfZGlzYWJsZSgpOwotCXJldHVybiAwOwotfQotZWFybHlfcGFyYW0oIm5vbGFwaWMiLCBwYXJzZV9ub2xhcGljKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKaW5kZXggZjliYTBhZi4uMDY0YmJmMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCkBAIC0yMzYsNyArMjM2LDYgQEAKIAogI2luY2x1ZGUgImlvX3BvcnRzLmgiCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNoaW5lX3JlYWxfcmVzdGFydCh1bnNpZ25lZCBjaGFyICosIGludCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19BUE1fRElTUExBWV9CTEFOSykgJiYgZGVmaW5lZChDT05GSUdfVlQpCkBAIC0xMTc2LDI4ICsxMTc1LDYgQEAKIAlzcGluX3VubG9jaygmdXNlcl9saXN0X2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfdGltZSh2b2lkKQotewotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQlpZiAoZ290X2Nsb2NrX2RpZmYpIHsJLyogTXVzdCBrbm93IHRpbWUgem9uZSBpbiBvcmRlciB0byBzZXQgY2xvY2sgKi8KLQkJdHMudHZfc2VjID0gZ2V0X2Ntb3NfdGltZSgpICsgY2xvY2tfY21vc19kaWZmOwotCQl0cy50dl9uc2VjID0gMDsKLQkJZG9fc2V0dGltZW9mZGF5KCZ0cyk7Ci0JfSAKLX0KLQotc3RhdGljIHZvaWQgZ2V0X3RpbWVfZGlmZih2b2lkKQotewotI2lmbmRlZiBDT05GSUdfQVBNX1JUQ19JU19HTVQKLQkvKgotCSAqIEVzdGltYXRlIHRpbWUgem9uZSBzbyB0aGF0IHNldF90aW1lIGNhbiB1cGRhdGUgdGhlIGNsb2NrCi0JICovCi0JY2xvY2tfY21vc19kaWZmID0gLWdldF9jbW9zX3RpbWUoKTsKLQljbG9ja19jbW9zX2RpZmYgKz0gZ2V0X3NlY29uZHMoKTsKLQlnb3RfY2xvY2tfZGlmZiA9IDE7Ci0jZW5kaWYKLX0KLQogc3RhdGljIHZvaWQgcmVpbml0X3RpbWVyKHZvaWQpCiB7CiAjaWZkZWYgSU5JVF9USU1FUl9BRlRFUl9TVVNQRU5ECkBAIC0xMjM3LDE5ICsxMjE0LDYgQEAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWRldmljZV9wb3dlcl9kb3duKFBNU0dfU1VTUEVORCk7CiAKLQkvKiBzZXJpYWxpemUgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0ICovCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0KLQkvKiBwcm90ZWN0IGFnYWluc3QgYWNjZXNzIHRvIHRpbWVyIGNoaXAgcmVnaXN0ZXJzICovCi0Jc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKLQotCWdldF90aW1lX2RpZmYoKTsKLQkvKgotCSAqIElycSBzcGlubG9jayBtdXN0IGJlIGRyb3BwZWQgYXJvdW5kIHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUuCi0JICogV2UnbGwgdW5kbyBhbnkgdGltZXIgY2hhbmdlcyBkdWUgdG8gaW50ZXJydXB0cyBiZWxvdy4KLQkgKi8KLQlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7Ci0Jd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlzYXZlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwpAQCAtMTI1OCw3ICsxMjIyLDYgQEAKIAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlzZXRfdGltZSgpOwogCXJlaW5pdF90aW1lcigpOwogCiAJaWYgKGVyciA9PSBBUE1fTk9fRVJST1IpCkBAIC0xMjg4LDExICsxMjUxLDYgQEAKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJZGV2aWNlX3Bvd2VyX2Rvd24oUE1TR19TVVNQRU5EKTsKLQkvKiBzZXJpYWxpemUgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0ICovCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0JLyogSWYgbmVlZGVkLCBub3RpZnkgZHJpdmVycyBoZXJlICovCi0JZ2V0X3RpbWVfZGlmZigpOwotCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJZXJyID0gc2V0X3N5c3RlbV9wb3dlcl9zdGF0ZShBUE1fU1RBVEVfU1RBTkRCWSk7CkBAIC0xMzg2LDcgKzEzNDQsNiBAQAogCQkJaWdub3JlX2JvdW5jZSA9IDE7CiAJCQlpZiAoKGV2ZW50ICE9IEFQTV9OT1JNQUxfUkVTVU1FKQogCQkJICAgIHx8IChpZ25vcmVfbm9ybWFsX3Jlc3VtZSA9PSAwKSkgewotCQkJCXNldF90aW1lKCk7CiAJCQkJZGV2aWNlX3Jlc3VtZSgpOwogCQkJCXBtX3NlbmRfYWxsKFBNX1JFU1VNRSwgKHZvaWQgKikwKTsKIAkJCQlxdWV1ZV9ldmVudChldmVudCwgTlVMTCk7CkBAIC0xNDAyLDcgKzEzNTksNiBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBBUE1fVVBEQVRFX1RJTUU6Ci0JCQlzZXRfdGltZSgpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBUE1fQ1JJVElDQUxfU1VTUEVORDoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZwppbmRleCA1Mjk5YzViLi42YzUyMTgyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCkBAIC0yMTcsNiArMjE3LDE1IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAorY29uZmlnIFg4Nl9FX1BPV0VSU0FWRVIKKwl0cmlzdGF0ZSAiVklBIEM3IEVuaGFuY2VkIFBvd2VyU2F2ZXIgKEVYUEVSSU1FTlRBTCkiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBWSUEgQzcgcHJvY2Vzc29ycy4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCiBjb21tZW50ICJzaGFyZWQgb3B0aW9ucyIKIAogY29uZmlnIFg4Nl9BQ1BJX0NQVUZSRVFfUFJPQ19JTlRGCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9NYWtlZmlsZQppbmRleCA4ZGUzYWJlLi41NjBmNzc2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvTWFrZWZpbGUKQEAgLTIsNiArMiw3IEBACiBvYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s3KQkJKz0gcG93ZXJub3ctazcubwogb2JqLSQoQ09ORklHX1g4Nl9QT1dFUk5PV19LOCkJCSs9IHBvd2Vybm93LWs4Lm8KIG9iai0kKENPTkZJR19YODZfTE9OR0hBVUwpCQkrPSBsb25naGF1bC5vCitvYmotJChDT05GSUdfWDg2X0VfUE9XRVJTQVZFUikJCSs9IGVfcG93ZXJzYXZlci5vCiBvYmotJChDT05GSUdfRUxBTl9DUFVGUkVRKQkJKz0gZWxhbmZyZXEubwogb2JqLSQoQ09ORklHX1NDNTIwX0NQVUZSRVEpCQkrPSBzYzUyMF9mcmVxLm8KIG9iai0kKENPTkZJR19YODZfTE9OR1JVTikJCSs9IGxvbmdydW4ubyAgCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2VfcG93ZXJzYXZlci5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDNkOThlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqICBCYXNlZCBvbiBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGJ5IERhdmUgSm9uZXMuIFRoYW5rcyEKKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3RzYy5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorCisjZGVmaW5lIEVQU19CUkFORF9DN00JMAorI2RlZmluZSBFUFNfQlJBTkRfQzcJMQorI2RlZmluZSBFUFNfQlJBTkRfRURFTgkyCisjZGVmaW5lIEVQU19CUkFORF9DMwkzCisKK3N0cnVjdCBlcHNfY3B1X2RhdGEgeworCXUzMiBmc2I7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGZyZXFfdGFibGVbXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXBzX2NwdV9kYXRhICplcHNfY3B1W05SX0NQVVNdOworCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXBzX2dldCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBlcHNfY3B1X2RhdGEgKmNlbnRhdXI7CisJdTMyIGxvLCBoaTsKKworCWlmIChjcHUpCisJCXJldHVybiAwOworCWNlbnRhdXIgPSBlcHNfY3B1W2NwdV07CisJaWYgKGNlbnRhdXIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZXR1cm4gY3VycmVudCBmcmVxdWVuY3kgKi8KKwlyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbG8sIGhpKTsKKwlyZXR1cm4gY2VudGF1ci0+ZnNiICogKChsbyA+PiA4KSAmIDB4ZmYpOworfQorCitzdGF0aWMgaW50IGVwc19zZXRfc3RhdGUoc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1ciwKKwkJCSB1bnNpZ25lZCBpbnQgY3B1LAorCQkJIHUzMiBkZXN0X3N0YXRlKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCXUzMiBsbywgaGk7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisKKwlmcmVxcy5vbGQgPSBlcHNfZ2V0KGNwdSk7CisJZnJlcXMubmV3ID0gY2VudGF1ci0+ZnNiICogKChkZXN0X3N0YXRlID4+IDgpICYgMHhmZik7CisJZnJlcXMuY3B1ID0gY3B1OworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwkvKiBXYWl0IHdoaWxlIENQVSBpcyBidXN5ICovCisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJaSA9IDA7CisJd2hpbGUgKGxvICYgKCgxIDw8IDE2KSB8ICgxIDw8IDE3KSkpIHsKKwkJdWRlbGF5KDE2KTsKKwkJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJCWkrKzsKKwkJaWYgKHVubGlrZWx5KGkgPiA2NCkpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIHBvc3RjaGFuZ2U7CisJCX0KKwl9CisJLyogU2V0IG5ldyBtdWx0aXBsaWVyIGFuZCB2b2x0YWdlICovCisJd3Jtc3IoTVNSX0lBMzJfUEVSRl9DVEwsIGRlc3Rfc3RhdGUgJiAweGZmZmYsIDApOworCS8qIFdhaXQgdW50aWwgdHJhbnNpdGlvbiBlbmQgKi8KKwlpID0gMDsKKwlkbyB7CisJCXVkZWxheSgxNik7CisJCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOworCQlpKys7CisJCWlmICh1bmxpa2VseShpID4gNjQpKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBwb3N0Y2hhbmdlOworCQl9CisJfSB3aGlsZSAobG8gJiAoKDEgPDwgMTYpIHwgKDEgPDwgMTcpKSk7CisKKwkvKiBSZXR1cm4gY3VycmVudCBmcmVxdWVuY3kgKi8KK3Bvc3RjaGFuZ2U6CisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJZnJlcXMubmV3ID0gY2VudGF1ci0+ZnNiICogKChsbyA+PiA4KSAmIDB4ZmYpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBlcHNfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwl1bnNpZ25lZCBpbnQgbmV3c3RhdGUgPSAwOworCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKKwl1bnNpZ25lZCBpbnQgZGVzdF9zdGF0ZTsKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KGVwc19jcHVbY3B1XSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2VudGF1ciA9IGVwc19jcHVbY3B1XTsKKworCWlmICh1bmxpa2VseShjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LAorCQkJJmVwc19jcHVbY3B1XS0+ZnJlcV90YWJsZVswXSwKKwkJCXRhcmdldF9mcmVxLAorCQkJcmVsYXRpb24sCisJCQkmbmV3c3RhdGUpKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBNYWtlIGZyZXF1ZW5jeSB0cmFuc2l0aW9uICovCisJZGVzdF9zdGF0ZSA9IGNlbnRhdXItPmZyZXFfdGFibGVbbmV3c3RhdGVdLmluZGV4ICYgMHhmZmZmOworCXJldCA9IGVwc19zZXRfc3RhdGUoY2VudGF1ciwgY3B1LCBkZXN0X3N0YXRlKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgImVwczogVGltZW91dCFcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXBzX3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwKKwkJCSZlcHNfY3B1W3BvbGljeS0+Y3B1XS0+ZnJlcV90YWJsZVswXSk7Cit9CisKK3N0YXRpYyBpbnQgZXBzX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiBsbywgaGk7CisJdTY0IHZhbDsKKwl1OCBjdXJyZW50X211bHRpcGxpZXIsIGN1cnJlbnRfdm9sdGFnZTsKKwl1OCBtYXhfbXVsdGlwbGllciwgbWF4X3ZvbHRhZ2U7CisJdTggbWluX211bHRpcGxpZXIsIG1pbl92b2x0YWdlOworCXU4IGJyYW5kOworCXUzMiBmc2I7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZfdGFibGU7CisJaW50IGssIHN0ZXAsIHZvbHRhZ2U7CisJaW50IHJldDsKKwlpbnQgc3RhdGVzOworCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgYnJhbmQgKi8KKwlwcmludGsoImVwczogRGV0ZWN0ZWQgVklBICIpOworCXJkbXNyKDB4MTE1MywgbG8sIGhpKTsKKwlicmFuZCA9ICgoKGxvID4+IDIpIF4gbG8pID4+IDE4KSAmIDM7CisJc3dpdGNoKGJyYW5kKSB7CisJY2FzZSBFUFNfQlJBTkRfQzdNOgorCQlwcmludGsoIkM3LU1cbiIpOworCQlicmVhazsKKwljYXNlIEVQU19CUkFORF9DNzoKKwkJcHJpbnRrKCJDN1xuIik7CisJCWJyZWFrOworCWNhc2UgRVBTX0JSQU5EX0VERU46CisJCXByaW50aygiRWRlblxuIik7CisJCWJyZWFrOworCWNhc2UgRVBTX0JSQU5EX0MzOgorCQlwcmludGsoIkMzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCX0KKwkvKiBFbmFibGUgRW5oYW5jZWQgUG93ZXJTYXZlciAqLworCXJkbXNybChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgdmFsKTsKKwlpZiAoISh2YWwgJiAxIDw8IDE2KSkgeworCQl2YWwgfD0gMSA8PCAxNjsKKwkJd3Jtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCB2YWwpOworCQkvKiBDYW4gYmUgbG9ja2VkIGF0IDAgKi8KKwkJcmRtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCB2YWwpOworCQlpZiAoISh2YWwgJiAxIDw8IDE2KSkgeworCQkJcHJpbnRrKCJlcHM6IENhbid0IGVuYWJsZSBFbmhhbmNlZCBQb3dlclNhdmVyXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyogUHJpbnQgdm9sdGFnZSBhbmQgbXVsdGlwbGllciAqLworCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOworCWN1cnJlbnRfdm9sdGFnZSA9IGxvICYgMHhmZjsKKwlwcmludGsoImVwczogQ3VycmVudCB2b2x0YWdlID0gJWRtVlxuIiwgY3VycmVudF92b2x0YWdlICogMTYgKyA3MDApOworCWN1cnJlbnRfbXVsdGlwbGllciA9IChsbyA+PiA4KSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IEN1cnJlbnQgbXVsdGlwbGllciA9ICVkXG4iLCBjdXJyZW50X211bHRpcGxpZXIpOworCisJLyogUHJpbnQgbGltaXRzICovCisJbWF4X3ZvbHRhZ2UgPSBoaSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IEhpZ2hlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1heF92b2x0YWdlICogMTYgKyA3MDApOworCW1heF9tdWx0aXBsaWVyID0gKGhpID4+IDgpICYgMHhmZjsKKwlwcmludGsoImVwczogSGlnaGVzdCBtdWx0aXBsaWVyID0gJWRcbiIsIG1heF9tdWx0aXBsaWVyKTsKKwltaW5fdm9sdGFnZSA9IChoaSA+PiAxNikgJiAweGZmOworCXByaW50aygiZXBzOiBMb3dlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1pbl92b2x0YWdlICogMTYgKyA3MDApOworCW1pbl9tdWx0aXBsaWVyID0gKGhpID4+IDI0KSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IExvd2VzdCBtdWx0aXBsaWVyID0gJWRcbiIsIG1pbl9tdWx0aXBsaWVyKTsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoY3VycmVudF9tdWx0aXBsaWVyID09IDAgfHwgbWF4X211bHRpcGxpZXIgPT0gMAorCSAgICB8fCBtaW5fbXVsdGlwbGllciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY3VycmVudF9tdWx0aXBsaWVyID4gbWF4X211bHRpcGxpZXIKKwkgICAgfHwgbWF4X211bHRpcGxpZXIgPD0gbWluX211bHRpcGxpZXIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjdXJyZW50X3ZvbHRhZ2UgPiAweDFjIHx8IG1heF92b2x0YWdlID4gMHgxYykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG1heF92b2x0YWdlIDwgbWluX3ZvbHRhZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2FsYyBGU0Igc3BlZWQgKi8KKwlmc2IgPSBjcHVfa2h6IC8gY3VycmVudF9tdWx0aXBsaWVyOworCS8qIENhbGMgbnVtYmVyIG9mIHAtc3RhdGVzIHN1cHBvcnRlZCAqLworCWlmIChicmFuZCA9PSBFUFNfQlJBTkRfQzdNKQorCQlzdGF0ZXMgPSBtYXhfbXVsdGlwbGllciAtIG1pbl9tdWx0aXBsaWVyICsgMTsKKwllbHNlCisJCXN0YXRlcyA9IDI7CisKKwkvKiBBbGxvY2F0ZSBwcml2YXRlIGRhdGEgYW5kIGZyZXF1ZW5jeSB0YWJsZSBmb3IgY3VycmVudCBjcHUgKi8KKwljZW50YXVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVwc19jcHVfZGF0YSkKKwkJICAgICsgKHN0YXRlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSksCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNlbnRhdXIpCisJCXJldHVybiAtRU5PTUVNOworCWVwc19jcHVbMF0gPSBjZW50YXVyOworCisJLyogQ29weSBiYXNpYyB2YWx1ZXMgKi8KKwljZW50YXVyLT5mc2IgPSBmc2I7CisKKwkvKiBGaWxsIGZyZXF1ZW5jeSBhbmQgTVNSIHZhbHVlIHRhYmxlICovCisJZl90YWJsZSA9ICZjZW50YXVyLT5mcmVxX3RhYmxlWzBdOworCWlmIChicmFuZCAhPSBFUFNfQlJBTkRfQzdNKSB7CisJCWZfdGFibGVbMF0uZnJlcXVlbmN5ID0gZnNiICogbWluX211bHRpcGxpZXI7CisJCWZfdGFibGVbMF0uaW5kZXggPSAobWluX211bHRpcGxpZXIgPDwgOCkgfCBtaW5fdm9sdGFnZTsKKwkJZl90YWJsZVsxXS5mcmVxdWVuY3kgPSBmc2IgKiBtYXhfbXVsdGlwbGllcjsKKwkJZl90YWJsZVsxXS5pbmRleCA9IChtYXhfbXVsdGlwbGllciA8PCA4KSB8IG1heF92b2x0YWdlOworCQlmX3RhYmxlWzJdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCX0gZWxzZSB7CisJCWsgPSAwOworCQlzdGVwID0gKChtYXhfdm9sdGFnZSAtIG1pbl92b2x0YWdlKSAqIDI1NikKKwkJCS8gKG1heF9tdWx0aXBsaWVyIC0gbWluX211bHRpcGxpZXIpOworCQlmb3IgKGkgPSBtaW5fbXVsdGlwbGllcjsgaSA8PSBtYXhfbXVsdGlwbGllcjsgaSsrKSB7CisJCQl2b2x0YWdlID0gKGsgKiBzdGVwKSAvIDI1NiArIG1pbl92b2x0YWdlOworCQkJZl90YWJsZVtrXS5mcmVxdWVuY3kgPSBmc2IgKiBpOworCQkJZl90YWJsZVtrXS5pbmRleCA9IChpIDw8IDgpIHwgdm9sdGFnZTsKKwkJCWsrKzsKKwkJfQorCQlmX3RhYmxlW2tdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCX0KKworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDE0MDAwMDsgLyogODQ0bVYgLT4gNzAwbVYgaW4gbnMgKi8KKwlwb2xpY3ktPmN1ciA9IGZzYiAqIGN1cnJlbnRfbXVsdGlwbGllcjsKKworCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCAmY2VudGF1ci0+ZnJlcV90YWJsZVswXSk7CisJaWYgKHJldCkgeworCQlrZnJlZShjZW50YXVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cigmY2VudGF1ci0+ZnJlcV90YWJsZVswXSwgcG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVwc19jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gcG9saWN5LT5jcHU7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwl1MzIgbG8sIGhpOworCisJaWYgKGVwc19jcHVbY3B1XSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljZW50YXVyID0gZXBzX2NwdVtjcHVdOworCisJLyogR2V0IG1heCBmcmVxdWVuY3kgKi8KKwlyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbG8sIGhpKTsKKwkvKiBTZXQgbWF4IGZyZXF1ZW5jeSAqLworCWVwc19zZXRfc3RhdGUoY2VudGF1ciwgY3B1LCBoaSAmIDB4ZmZmZik7CisJLyogQnllICovCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCWtmcmVlKGVwc19jcHVbY3B1XSk7CisJZXBzX2NwdVtjcHVdID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIGVwc19hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGVwc19kcml2ZXIgPSB7CisJLnZlcmlmeQkJPSBlcHNfdmVyaWZ5LAorCS50YXJnZXQJCT0gZXBzX3RhcmdldCwKKwkuaW5pdAkJPSBlcHNfY3B1X2luaXQsCisJLmV4aXQJCT0gZXBzX2NwdV9leGl0LAorCS5nZXQJCT0gZXBzX2dldCwKKwkubmFtZQkJPSAiZV9wb3dlcnNhdmVyIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gZXBzX2F0dHIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlcHNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCisJLyogVGhpcyBkcml2ZXIgd2lsbCB3b3JrIG9ubHkgb24gQ2VudGF1ciBDNyBwcm9jZXNzb3JzIHdpdGgKKwkgKiBFbmhhbmNlZCBTcGVlZFN0ZXAvUG93ZXJTYXZlciByZWdpc3RlcnMgKi8KKwlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0NFTlRBVVIKKwkgICAgfHwgYy0+eDg2ICE9IDYgfHwgYy0+eDg2X21vZGVsICE9IDEwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmVwc19kcml2ZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVwc19leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmZXBzX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlJhZmGzIEJpbHNraSA8cmFmYWxiaWxza2lAaW50ZXJpYS5wbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRW5oYW5jZWQgUG93ZXJTYXZlciBkcml2ZXIgZm9yIFZJQSBDNyBDUFUncy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoZXBzX2luaXQpOworbW9kdWxlX2V4aXQoZXBzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCmluZGV4IGEzZGI5MzMuLmI1OTg3OGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKQEAgLTgsMTIgKzgsMTEgQEAKICAqICBWSUEgaGF2ZSBjdXJyZW50bHkgMyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgTG9uZ2hhdWwuCiAgKiAgVmVyc2lvbiAxIChMb25naGF1bCkgdXNlcyB0aGUgQkNSMiBNU1IgYXQgMHgxMTQ3LgogICogICBJdCBpcyBwcmVzZW50IG9ubHkgaW4gU2FtdWVsIDEgKEM1QSksIFNhbXVlbCAyIChDNUIpIHN0ZXBwaW5nIDAuCi0gKiAgVmVyc2lvbiAyIG9mIGxvbmdoYXVsIGlzIHRoZSBzYW1lIGFzIHYxLCBidXQgYWRkcyB2b2x0YWdlIHNjYWxpbmcuCi0gKiAgIFByZXNlbnQgaW4gU2FtdWVsIDIgKHN0ZXBwaW5ncyAxLTcgb25seSkgKEM1QiksIGFuZCBFenJhIChDNUMpCi0gKiAgIHZvbHRhZ2Ugc2NhbGluZyBzdXBwb3J0IGhhcyBjdXJyZW50bHkgYmVlbiBkaXNhYmxlZCBpbiB0aGlzIGRyaXZlcgotICogICB1bnRpbCB3ZSBoYXZlIGNvZGUgdGhhdCBnZXRzIGl0IHJpZ2h0LgorICogIFZlcnNpb24gMiBvZiBsb25naGF1bCBpcyBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggdjEsIGJ1dCBhZGRzCisgKiAgIExPTkdIQVVMIE1TUiBmb3IgcHVycG9zZSBvZiBib3RoIGZyZXF1ZW5jeSBhbmQgdm9sdGFnZSBzY2FsaW5nLgorICogICBQcmVzZW50IGluIFNhbXVlbCAyIChzdGVwcGluZ3MgMS03IG9ubHkpIChDNUIpLCBhbmQgRXpyYSAoQzVDKS4KICAqICBWZXJzaW9uIDMgb2YgbG9uZ2hhdWwgZ290IHJlbmFtZWQgdG8gUG93ZXJzYXZlciBhbmQgcmVkZXNpZ25lZAotICogICB0byB1c2UgdGhlIFBPV0VSU0FWRVIgTVNSIGF0IDB4MTEwYS4KKyAqICAgdG8gdXNlIG9ubHkgdGhlIFBPV0VSU0FWRVIgTVNSIGF0IDB4MTEwYS4KICAqICAgSXQgaXMgcHJlc2VudCBpbiBFenJhLVQgKEM1TSksIE5laGVtaWFoIChDNVgpIGFuZCBhYm92ZS4KICAqICAgSXQncyBwcmV0dHkgbXVjaCB0aGUgc2FtZSBmZWF0dXJlIHdpc2UgdG8gbG9uZ2hhdWwgdjIsIHRob3VnaAogICogICB0aGVyZSBpcyBwcm92aXNpb24gZm9yIHNjYWxpbmcgRlNCIHRvbywgYnV0IHRoaXMgZG9lc24ndCB3b3JrCkBAIC01MSwxMCArNTAsMTIgQEAKICNkZWZpbmUJQ1BVX0VaUkEJMwogI2RlZmluZQlDUFVfRVpSQV9UCTQKICNkZWZpbmUJQ1BVX05FSEVNSUFICTUKKyNkZWZpbmUJQ1BVX05FSEVNSUFIX0MJNgogCiAvKiBGbGFncyAqLwogI2RlZmluZSBVU0VfQUNQSV9DMwkJKDEgPDwgMSkKICNkZWZpbmUgVVNFX05PUlRIQlJJREdFCQkoMSA8PCAyKQorI2RlZmluZSBVU0VfVlQ4MjM1CQkoMSA8PCAzKQogCiBzdGF0aWMgaW50IGNwdV9tb2RlbDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtc2NhbGVzPTE2OwpAQCAtNjMsNyArNjQsOCBAQAogc3RhdGljIHN0cnVjdCBtVl9wb3MgKnZybV9tVl90YWJsZTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICptVl92cm1fdGFibGU7CiBzdHJ1Y3QgZl9tc3IgewotCXVuc2lnbmVkIGNoYXIgdnJtOworCXU4IHZybTsKKwl1OCBwb3M7CiB9Owogc3RhdGljIHN0cnVjdCBmX21zciBmX21zcl90YWJsZVszMl07CiAKQEAgLTczLDEwICs3NSwxMCBAQAogc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSBOVUxMOwogc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3ggPSBOVUxMOwogc3RhdGljIHU4IGxvbmdoYXVsX2ZsYWdzOworc3RhdGljIHU4IGxvbmdoYXVsX3BvczsKIAogLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KIHN0YXRpYyBpbnQgc2NhbGVfdm9sdGFnZTsKLXN0YXRpYyBpbnQgaWdub3JlX2xhdGVuY3k7CiAKICNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAibG9uZ2hhdWwiLCBtc2cpCiAKQEAgLTE2NCwyNiArMTY2LDQ3IEBACiBzdGF0aWMgdm9pZCBkb19wb3dlcnNhdmVyKGludCBjeF9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgY2xvY2tfcmF0aW9faW5kZXgpCiB7CiAJdW5pb24gbXNyX2xvbmdoYXVsIGxvbmdoYXVsOworCXU4IGRlc3RfcG9zOwogCXUzMiB0OwogCisJZGVzdF9wb3MgPSBmX21zcl90YWJsZVtjbG9ja19yYXRpb19pbmRleF0ucG9zOworCiAJcmRtc3JsKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLnZhbCk7CisJLyogU2V0dXAgbmV3IGZyZXF1ZW5jeSAqLwogCWxvbmdoYXVsLmJpdHMuUmV2aXNpb25LZXkgPSBsb25naGF1bC5iaXRzLlJldmlzaW9uSUQ7CiAJbG9uZ2hhdWwuYml0cy5Tb2Z0QnVzUmF0aW8gPSBjbG9ja19yYXRpb19pbmRleCAmIDB4ZjsKIAlsb25naGF1bC5iaXRzLlNvZnRCdXNSYXRpbzQgPSAoY2xvY2tfcmF0aW9faW5kZXggJiAweDEwKSA+PiA0OwotCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMTsKLQotCWlmIChjYW5fc2NhbGVfdm9sdGFnZSkgeworCS8qIFNldHVwIG5ldyB2b2x0YWdlICovCisJaWYgKGNhbl9zY2FsZV92b2x0YWdlKQogCQlsb25naGF1bC5iaXRzLlNvZnRWSUQgPSBmX21zcl90YWJsZVtjbG9ja19yYXRpb19pbmRleF0udnJtOwotCQlsb25naGF1bC5iaXRzLkVuYWJsZVNvZnRWSUQgPSAxOwotCX0KLQogCS8qIFN5bmMgdG8gdGltZXIgdGljayAqLwogCXNhZmVfaGFsdCgpOworCS8qIFJhaXNlIHZvbHRhZ2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGNhbl9zY2FsZV92b2x0YWdlICYmIGxvbmdoYXVsX3BvcyA8IGRlc3RfcG9zKSB7CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDE7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQkvKiBDaGFuZ2Ugdm9sdGFnZSAqLworCQlpZiAoIWN4X2FkZHJlc3MpIHsKKwkJCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CisJCQloYWx0KCk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOworCQkJLyogSW52b2tlIEMzICovCisJCQlpbmIoY3hfYWRkcmVzcyk7CisJCQkvKiBEdW1teSBvcCAtIG11c3QgZG8gc29tZXRoaW5nIHVzZWxlc3MgYWZ0ZXIgUF9MVkwzCisJCQkgKiByZWFkICovCisJCQl0ID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOworCQl9CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDA7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQlsb25naGF1bF9wb3MgPSBkZXN0X3BvczsKKwl9CisKIAkvKiBDaGFuZ2UgZnJlcXVlbmN5IG9uIG5leHQgaGFsdCBvciBzbGVlcCAqLworCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMTsKIAl3cm1zcmwoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwudmFsKTsKIAlpZiAoIWN4X2FkZHJlc3MpIHsKIAkJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKLQkJLyogSW52b2tlIEMxICovCiAJCWhhbHQoKTsKIAl9IGVsc2UgewogCQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOwpAQCAtMTkzLDEyICsyMTYsMjkgQEAKIAkJdCA9IGlubChhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jay5hZGRyZXNzKTsKIAl9CiAJLyogRGlzYWJsZSBidXMgcmF0aW8gYml0ICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlsb25naGF1bC5iaXRzLlJldmlzaW9uS2V5ID0gbG9uZ2hhdWwuYml0cy5SZXZpc2lvbklEOwogCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMDsKLQlsb25naGF1bC5iaXRzLkVuYWJsZVNvZnRCU0VMID0gMDsKLQlsb25naGF1bC5iaXRzLkVuYWJsZVNvZnRWSUQgPSAwOwogCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCisJLyogUmVkdWNlIHZvbHRhZ2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGNhbl9zY2FsZV92b2x0YWdlICYmIGxvbmdoYXVsX3BvcyA+IGRlc3RfcG9zKSB7CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDE7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQkvKiBDaGFuZ2Ugdm9sdGFnZSAqLworCQlpZiAoIWN4X2FkZHJlc3MpIHsKKwkJCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CisJCQloYWx0KCk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOworCQkJLyogSW52b2tlIEMzICovCisJCQlpbmIoY3hfYWRkcmVzcyk7CisJCQkvKiBEdW1teSBvcCAtIG11c3QgZG8gc29tZXRoaW5nIHVzZWxlc3MgYWZ0ZXIgUF9MVkwzCisJCQkgKiByZWFkICovCisJCQl0ID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOworCQl9CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDA7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQlsb25naGF1bF9wb3MgPSBkZXN0X3BvczsKKwl9CiB9CiAKIC8qKgpAQCAtMjU3LDI2ICsyOTcsMTkgQEAKIAkvKgogCSAqIExvbmdoYXVsIHYxLiAoU2FtdWVsW0M1QV0gYW5kIFNhbXVlbDIgc3RlcHBpbmcgMFtDNUJdKQogCSAqIFNvZnR3YXJlIGNvbnRyb2xsZWQgbXVsdGlwbGllcnMgb25seS4KLQkgKgotCSAqICpOQiogVW50aWwgd2UgZ2V0IHZvbHRhZ2Ugc2NhbGluZyB3b3JraW5nIHYxICYgdjIgYXJlIHRoZSBzYW1lIGNvZGUuCi0JICogTG9uZ2hhdWwgdjIgYXBwZWFycyBpbiBTYW11ZWwyIFN0ZXBwaW5ncyAxLT43IFtDNWJdIGFuZCBFenJhIFtDNUNdCiAJICovCiAJY2FzZSBUWVBFX0xPTkdIQVVMX1YxOgotCWNhc2UgVFlQRV9MT05HSEFVTF9WMjoKIAkJZG9fbG9uZ2hhdWwxKGNsb2NrX3JhdGlvX2luZGV4KTsKIAkJYnJlYWs7CiAKIAkvKgorCSAqIExvbmdoYXVsIHYyIGFwcGVhcnMgaW4gU2FtdWVsMiBTdGVwcGluZ3MgMS0+NyBbQzVCXSBhbmQgRXpyYSBbQzVDXQorCSAqCiAJICogTG9uZ2hhdWwgdjMgKGFrYSBQb3dlcnNhdmVyKS4gKEV6cmEtVCBbQzVNXSAmIE5laGVtaWFoIFtDNU5dKQotCSAqIFdlIGNhbiBzY2FsZSB2b2x0YWdlIHdpdGggdGhpcyB0b28sIGJ1dCB0aGF0J3MgY3VycmVudGx5Ci0JICogZGlzYWJsZWQgdW50aWwgd2UgY29tZSB1cCB3aXRoIGEgZGVjZW50ICdtYXRjaCBmcmVxIHRvIHZvbHRhZ2UnCi0JICogYWxnb3JpdGhtLgotCSAqIFdoZW4gd2UgYWRkIHZvbHRhZ2Ugc2NhbGluZywgd2Ugd2lsbCBhbHNvIG5lZWQgdG8gZG8gdGhlCi0JICogdm9sdGFnZS9mcmVxIHNldHRpbmcgaW4gb3JkZXIgZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24KLQkgKiBvZiBzY2FsaW5nIChsaWtlIHdlIGRvIGluIHBvd2Vybm93LWs3LmMpCiAJICogTmVoZW1pYWggY2FuIGRvIEZTQiBzY2FsaW5nIHRvbywgYnV0IHRoaXMgaGFzIG5ldmVyIGJlZW4gcHJvdmVuCiAJICogdG8gd29yayBpbiBwcmFjdGljZS4KIAkgKi8KKwljYXNlIFRZUEVfTE9OR0hBVUxfVjI6CiAJY2FzZSBUWVBFX1BPV0VSU0FWRVI6CiAJCWlmIChsb25naGF1bF9mbGFncyAmIFVTRV9BQ1BJX0MzKSB7CiAJCQkvKiBEb24ndCBhbGxvdyB3YWtldXAgKi8KQEAgLTMwMSw2ICszMzQsNyBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogCisJZnJlcXMubmV3ID0gY2FsY19zcGVlZChsb25naGF1bF9nZXRfY3B1X211bHQoKSk7CiAJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CiB9CiAKQEAgLTMxNSwzMSArMzQ5LDE5IEBACiAKICNkZWZpbmUgUk9VTkRJTkcJMHhmCiAKLXN0YXRpYyBpbnQgX2d1ZXNzKGludCBndWVzcywgaW50IG11bHQpCi17Ci0JaW50IHRhcmdldDsKLQotCXRhcmdldCA9ICgobXVsdC8xMCkqZ3Vlc3MpOwotCWlmIChtdWx0JTEwICE9IDApCi0JCXRhcmdldCArPSAoZ3Vlc3MvMik7Ci0JdGFyZ2V0ICs9IFJPVU5ESU5HLzI7Ci0JdGFyZ2V0ICY9IH5ST1VORElORzsKLQlyZXR1cm4gdGFyZ2V0OwotfQotCi0KIHN0YXRpYyBpbnQgZ3Vlc3NfZnNiKGludCBtdWx0KQogewotCWludCBzcGVlZCA9IChjcHVfa2h6LzEwMDApOworCWludCBzcGVlZCA9IGNwdV9raHogLyAxMDAwOwogCWludCBpOwotCWludCBzcGVlZHNbXSA9IHsgNjYsIDEwMCwgMTMzLCAyMDAgfTsKKwlpbnQgc3BlZWRzW10gPSB7IDY2NiwgMTAwMCwgMTMzMywgMjAwMCB9OworCWludCBmX21heCwgZl9taW47CiAKLQlzcGVlZCArPSBST1VORElORy8yOwotCXNwZWVkICY9IH5ST1VORElORzsKLQotCWZvciAoaT0wOyBpPDQ7IGkrKykgewotCQlpZiAoX2d1ZXNzKHNwZWVkc1tpXSwgbXVsdCkgPT0gc3BlZWQpCi0JCQlyZXR1cm4gc3BlZWRzW2ldOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZl9tYXggPSAoKHNwZWVkc1tpXSAqIG11bHQpICsgNTApIC8gMTAwOworCQlmX21heCArPSAoUk9VTkRJTkcgLyAyKTsKKwkJZl9taW4gPSBmX21heCAtIFJPVU5ESU5HOworCQlpZiAoKHNwZWVkIDw9IGZfbWF4KSAmJiAoc3BlZWQgPj0gZl9taW4pKQorCQkJcmV0dXJuIHNwZWVkc1tpXSAvIDEwOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM0Nyw2NyArMzY5LDQwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGxvbmdoYXVsX2dldF9yYW5nZXModm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGludmFsdWU7Ci0JdW5zaWduZWQgaW50IGV6cmFfdF9tdWx0aXBsaWVyc1szMl09IHsKLQkJCTkwLCAgMzAsICA0MCwgMTAwLCAgNTUsICAzNSwgIDQ1LCAgOTUsCi0JCQk1MCwgIDcwLCAgODAsICA2MCwgMTIwLCAgNzUsICA4NSwgIDY1LAotCQkJLTEsIDExMCwgMTIwLCAgLTEsIDEzNSwgMTE1LCAxMjUsIDEwNSwKLQkJCTEzMCwgMTUwLCAxNjAsIDE0MCwgIC0xLCAxNTUsICAtMSwgMTQ1IH07CiAJdW5zaWduZWQgaW50IGosIGsgPSAwOwotCXVuaW9uIG1zcl9sb25naGF1bCBsb25naGF1bDsKLQlpbnQgbXVsdCA9IDA7CisJaW50IG11bHQ7CiAKLQlzd2l0Y2ggKGxvbmdoYXVsX3ZlcnNpb24pIHsKLQljYXNlIFRZUEVfTE9OR0hBVUxfVjE6Ci0JY2FzZSBUWVBFX0xPTkdIQVVMX1YyOgotCQkvKiBVZ2gsIExvbmdoYXVsIHYxIGRpZG4ndCBoYXZlIHRoZSBtaW4vbWF4IE1TUnMuCi0JCSAgIEFzc3VtZSBtaW49My4weCAmIG1heCA9IHdoYXRldmVyIHdlIGJvb3RlZCBhdC4gKi8KLQkJbWlubXVsdCA9IDMwOwotCQltYXhtdWx0ID0gbXVsdCA9IGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpOwotCQlicmVhazsKLQotCWNhc2UgVFlQRV9QT1dFUlNBVkVSOgotCQkvKiBFenJhLVQgKi8KLQkJaWYgKGNwdV9tb2RlbD09Q1BVX0VaUkFfVCkgewotCQkJbWlubXVsdCA9IDMwOwotCQkJcmRtc3JsIChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOwotCQkJaW52YWx1ZSA9IGxvbmdoYXVsLmJpdHMuTWF4TUh6QlI7Ci0JCQlpZiAobG9uZ2hhdWwuYml0cy5NYXhNSHpCUjQpCi0JCQkJaW52YWx1ZSArPSAxNjsKLQkJCW1heG11bHQgPSBtdWx0ID0gZXpyYV90X211bHRpcGxpZXJzW2ludmFsdWVdOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBOZWhlbWlhaCAqLwotCQlpZiAoY3B1X21vZGVsPT1DUFVfTkVIRU1JQUgpIHsKLQkJCXJkbXNybCAoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwudmFsKTsKLQotCQkJLyoKLQkJCSAqIFRPRE86IFRoaXMgY29kZSB3b3JrcywgYnV0IHJhaXNlcyBhIGxvdCBvZiBxdWVzdGlvbnMuCi0JCQkgKiAtIFNvbWUgTmVoZW1pYWgncyBzZWVtIHRvIGhhdmUgYnJva2VuIE1pbi9NYXhNSHpCUidzLgotCQkJICogICBXZSBnZXQgYXJvdW5kIHRoaXMgYnkgdXNpbmcgYSBoYXJkY29kZWQgbXVsdGlwbGllciBvZiA0LjB4Ci0JCQkgKiAgIGZvciB0aGUgbWluaW1pbXVtIHNwZWVkLCBhbmQgdGhlIHNwZWVkIHdlIGJvb3RlZCB1cCBhdCBmb3IgdGhlIG1heC4KLQkJCSAqICAgVGhpcyBpcyBkb25lIGluIGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpIGJ5IHJlYWRpbmcgdGhlIEVCTENSIHJlZ2lzdGVyLgotCQkJICogLSBBY2NvcmRpbmcgdG8gc29tZSBWSUEgZG9jdW1lbnRhdGlvbiBFQkxDUiBpcyBvbmx5Ci0JCQkgKiAgIGluIHByZS1OZWhlbWlhaCBDM3MuIEhvdyB0aGlzIHN0aWxsIHdvcmtzIGlzIGEgbXlzdGVyeS4KLQkJCSAqICAgV2UncmUgcG9zc2libHkgdXNpbmcgc29tZXRoaW5nIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCi0JCQkgKiAgIEJ1dCBpdCB3b3Jrcywgc28gd2UgZG9uJ3QgZ3J1bWJsZS4KLQkJCSAqLwotCQkJbWlubXVsdD00MDsKLQkJCW1heG11bHQgPSBtdWx0ID0gbG9uZ2hhdWxfZ2V0X2NwdV9tdWx0KCk7Ci0JCQlicmVhazsKLQkJfQorCS8qIEdldCBjdXJyZW50IGZyZXF1ZW5jeSAqLworCW11bHQgPSBsb25naGF1bF9nZXRfY3B1X211bHQoKTsKKwlpZiAobXVsdCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiSW52YWxpZCAocmVzZXJ2ZWQpIG11bHRpcGxpZXIhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWZzYiA9IGd1ZXNzX2ZzYihtdWx0KTsKKwlpZiAoZnNiID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkludmFsaWQgKHJlc2VydmVkKSBGU0IhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIEdldCBtYXggbXVsdGlwbGllciAtIGFzIHdlIGFsd2F5cyBkaWQuCisJICogTG9uZ2hhdWwgTVNSIGlzIHVzZWZ1bGwgb25seSB3aGVuIHZvbHRhZ2Ugc2NhbGluZyBpcyBlbmFibGVkLgorCSAqIEMzIGlzIGJvb3RpbmcgYXQgbWF4IGFueXdheS4gKi8KKwltYXhtdWx0ID0gbXVsdDsKKwkvKiBHZXQgbWluIG11bHRpcGxpZXIgKi8KKwlzd2l0Y2ggKGNwdV9tb2RlbCkgeworCWNhc2UgQ1BVX05FSEVNSUFIOgorCQltaW5tdWx0ID0gNTA7CisJCWJyZWFrOworCWNhc2UgQ1BVX05FSEVNSUFIX0M6CisJCW1pbm11bHQgPSA0MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWlubXVsdCA9IDMwOworCQlicmVhazsKKwl9CiAKIAlkcHJpbnRrICgiTWluTXVsdDolZC4lZHggTWF4TXVsdDolZC4lZHhcbiIsCiAJCSBtaW5tdWx0LzEwLCBtaW5tdWx0JTEwLCBtYXhtdWx0LzEwLCBtYXhtdWx0JTEwKTsKIAotCWlmIChmc2IgPT0gMCkgewotCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkludmFsaWQgKHJlc2VydmVkKSBGU0IhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJaGlnaGVzdF9zcGVlZCA9IGNhbGNfc3BlZWQobWF4bXVsdCk7CiAJbG93ZXN0X3NwZWVkID0gY2FsY19zcGVlZChtaW5tdWx0KTsKIAlkcHJpbnRrICgiRlNCOiVkTUh6ICBMb3dlc3Qgc3BlZWQ6ICVzICAgSGlnaGVzdCBzcGVlZDolc1xuIiwgZnNiLApAQCAtNDU1LDYgKzQ1MCw3IEBACiAJdW5pb24gbXNyX2xvbmdoYXVsIGxvbmdoYXVsOwogCXN0cnVjdCBtVl9wb3MgbWludmlkLCBtYXh2aWQ7CiAJdW5zaWduZWQgaW50IGosIHNwZWVkLCBwb3MsIGtIel9zdGVwLCBudW12c2NhbGVzOworCWludCBtaW5fdmlkX3NwZWVkOwogCiAJcmRtc3JsKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLnZhbCk7CiAJaWYgKCEobG9uZ2hhdWwuYml0cy5SZXZpc2lvbklEICYgMSkpIHsKQEAgLTQ2OCwxNCArNDY0LDE0IEBACiAJCW1WX3ZybV90YWJsZSA9ICZtVl92cm04NVswXTsKIAl9IGVsc2UgewogCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIk1vYmlsZSBWUk1cbiIpOworCQlpZiAoY3B1X21vZGVsIDwgQ1BVX05FSEVNSUFIKQorCQkJcmV0dXJuOwogCQl2cm1fbVZfdGFibGUgPSAmbW9iaWxldnJtX21WWzBdOwogCQltVl92cm1fdGFibGUgPSAmbVZfbW9iaWxldnJtWzBdOwogCX0KIAogCW1pbnZpZCA9IHZybV9tVl90YWJsZVtsb25naGF1bC5iaXRzLk1pbmltdW1WSURdOwogCW1heHZpZCA9IHZybV9tVl90YWJsZVtsb25naGF1bC5iaXRzLk1heGltdW1WSURdOwotCW51bXZzY2FsZXMgPSBtYXh2aWQucG9zIC0gbWludmlkLnBvcyArIDE7Ci0Ja0h6X3N0ZXAgPSAoaGlnaGVzdF9zcGVlZCAtIGxvd2VzdF9zcGVlZCkgLyBudW12c2NhbGVzOwogCiAJaWYgKG1pbnZpZC5tViA9PSAwIHx8IG1heHZpZC5tViA9PSAwIHx8IG1pbnZpZC5tViA+IG1heHZpZC5tVikgewogCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkJvZ3VzIHZhbHVlcyBNaW46JWQuJTAzZCBNYXg6JWQuJTAzZC4gIgpAQCAtNDkxLDIwICs0ODcsNTkgQEAKIAkJcmV0dXJuOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gUEZYICJNYXggVklEPSVkLiUwM2QgIE1pbiBWSUQ9JWQuJTAzZCwgJWQgcG9zc2libGUgdm9sdGFnZSBzY2FsZXNcbiIsCisJLyogSG93IG1hbnkgdm9sdGFnZSBzdGVwcyAqLworCW51bXZzY2FsZXMgPSBtYXh2aWQucG9zIC0gbWludmlkLnBvcyArIDE7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlgKKwkJIk1heCBWSUQ9JWQuJTAzZCAgIgorCQkiTWluIFZJRD0lZC4lMDNkLCAiCisJCSIlZCBwb3NzaWJsZSB2b2x0YWdlIHNjYWxlc1xuIiwKIAkJbWF4dmlkLm1WLzEwMDAsIG1heHZpZC5tViUxMDAwLAogCQltaW52aWQubVYvMTAwMCwgbWludmlkLm1WJTEwMDAsCiAJCW51bXZzY2FsZXMpOwogCisJLyogQ2FsY3VsYXRlIG1heCBmcmVxdWVuY3kgYXQgbWluIHZvbHRhZ2UgKi8KKwlqID0gbG9uZ2hhdWwuYml0cy5NaW5NSHpCUjsKKwlpZiAobG9uZ2hhdWwuYml0cy5NaW5NSHpCUjQpCisJCWogKz0gMTY7CisJbWluX3ZpZF9zcGVlZCA9IGVibGNyX3RhYmxlW2pdOworCWlmIChtaW5fdmlkX3NwZWVkID09IC0xKQorCQlyZXR1cm47CisJc3dpdGNoIChsb25naGF1bC5iaXRzLk1pbk1IekZTQikgeworCWNhc2UgMDoKKwkJbWluX3ZpZF9zcGVlZCAqPSAxMzMzMzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltaW5fdmlkX3NwZWVkICo9IDEwMDAwOworCQlicmVhazsKKwljYXNlIDM6CisJCW1pbl92aWRfc3BlZWQgKj0gNjY2NjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCQlicmVhazsKKwl9CisJaWYgKG1pbl92aWRfc3BlZWQgPj0gaGlnaGVzdF9zcGVlZCkKKwkJcmV0dXJuOworCS8qIENhbGN1bGF0ZSBrSHogZm9yIG9uZSB2b2x0YWdlIHN0ZXAgKi8KKwlrSHpfc3RlcCA9IChoaWdoZXN0X3NwZWVkIC0gbWluX3ZpZF9zcGVlZCkgLyBudW12c2NhbGVzOworCisKIAlqID0gMDsKIAl3aGlsZSAobG9uZ2hhdWxfdGFibGVbal0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EKSB7CiAJCXNwZWVkID0gbG9uZ2hhdWxfdGFibGVbal0uZnJlcXVlbmN5OwotCQlwb3MgPSAoc3BlZWQgLSBsb3dlc3Rfc3BlZWQpIC8ga0h6X3N0ZXAgKyBtaW52aWQucG9zOworCQlpZiAoc3BlZWQgPiBtaW5fdmlkX3NwZWVkKQorCQkJcG9zID0gKHNwZWVkIC0gbWluX3ZpZF9zcGVlZCkgLyBrSHpfc3RlcCArIG1pbnZpZC5wb3M7CisJCWVsc2UKKwkJCXBvcyA9IG1pbnZpZC5wb3M7CiAJCWZfbXNyX3RhYmxlW2xvbmdoYXVsX3RhYmxlW2pdLmluZGV4XS52cm0gPSBtVl92cm1fdGFibGVbcG9zXTsKKwkJZl9tc3JfdGFibGVbbG9uZ2hhdWxfdGFibGVbal0uaW5kZXhdLnBvcyA9IHBvczsKIAkJaisrOwogCX0KIAorCWxvbmdoYXVsX3BvcyA9IG1heHZpZC5wb3M7CiAJY2FuX3NjYWxlX3ZvbHRhZ2UgPSAxOworCXByaW50ayhLRVJOX0lORk8gUEZYICJWb2x0YWdlIHNjYWxpbmcgZW5hYmxlZC4gIgorCQkiVXNlIG9mIFwiY29uc2VydmF0aXZlXCIgZ292ZXJub3IgaXMgaGlnaGx5IHJlY29tbWVuZGVkLlxuIik7CiB9CiAKIApAQCAtNTczLDIwICs2MDgsNTEgQEAKIAlpZiAoZGV2ICE9IE5VTEwpIHsKIAkJLyogRW5hYmxlIGFjY2VzcyB0byBwb3J0IDB4MjIgKi8KIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCByZWcsICZwY2lfY21kKTsKLQkJaWYgKCAhKHBjaV9jbWQgJiAxPDw3KSApIHsKKwkJaWYgKCEocGNpX2NtZCAmIDE8PDcpKSB7CiAJCQlwY2lfY21kIHw9IDE8PDc7CiAJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCByZWcsIHBjaV9jbWQpOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCByZWcsICZwY2lfY21kKTsKKwkJCWlmICghKHBjaV9jbWQgJiAxPDw3KSkgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkJIkNhbid0IGVuYWJsZSBhY2Nlc3MgdG8gcG9ydCAweDIyLlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CiAJCX0KIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGxvbmdoYXVsX3NldHVwX3Z0ODIzNSh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJdTggcGNpX2NtZDsKKworCS8qIEZpbmQgVlQ4MjM1IHNvdXRoYnJpZGdlICovCisJZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjM1LCBOVUxMKTsKKwlpZiAoZGV2ICE9IE5VTEwpIHsKKwkJLyogU2V0IHRyYW5zaXRpb24gdGltZSB0byBtYXggKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGVjLCAmcGNpX2NtZCk7CisJCXBjaV9jbWQgJj0gfigxIDw8IDIpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGVjLCBwY2lfY21kKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGU0LCAmcGNpX2NtZCk7CisJCXBjaV9jbWQgJj0gfigxIDw8IDcpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGU0LCBwY2lfY21kKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGU1LCAmcGNpX2NtZCk7CisJCXBjaV9jbWQgfD0gMSA8PCA3OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGU1LCBwY2lfY21kKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBsb25naGF1bF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKIAljaGFyICpjcHVuYW1lPU5VTEw7CiAJaW50IHJldDsKKwl1MzIgbG8sIGhpOworCWludCB2dDgyMzVfcHJlc2VudDsKIAogCS8qIENoZWNrIHdoYXQgd2UgaGF2ZSBvbiB0aGlzIG1vdGhlcmJvYXJkICovCiAJc3dpdGNoIChjLT54ODZfbW9kZWwpIHsKQEAgLTU5OSwxNiArNjY1LDIwIEBACiAJCWJyZWFrOwogCiAJY2FzZSA3OgotCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9MT05HSEFVTF9WMTsKIAkJc3dpdGNoIChjLT54ODZfbWFzaykgewogCQljYXNlIDA6CisJCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9MT05HSEFVTF9WMTsKIAkJCWNwdV9tb2RlbCA9IENQVV9TQU1VRUwyOwogCQkJY3B1bmFtZSA9ICJDMyAnU2FtdWVsIDInIFtDNUJdIjsKLQkJCS8qIE5vdGUsIHRoaXMgaXMgbm90IGEgdHlwbywgZWFybHkgU2FtdWVsMidzIGhhZCBTYW11ZWwxIHJhdGlvcy4gKi8KLQkJCW1lbWNweSAoY2xvY2tfcmF0aW8sIHNhbXVlbDFfY2xvY2tfcmF0aW8sIHNpemVvZihzYW11ZWwxX2Nsb2NrX3JhdGlvKSk7Ci0JCQltZW1jcHkgKGVibGNyX3RhYmxlLCBzYW11ZWwyX2VibGNyLCBzaXplb2Yoc2FtdWVsMl9lYmxjcikpOworCQkJLyogTm90ZSwgdGhpcyBpcyBub3QgYSB0eXBvLCBlYXJseSBTYW11ZWwyJ3MgaGFkCisJCQkgKiBTYW11ZWwxIHJhdGlvcy4gKi8KKwkJCW1lbWNweShjbG9ja19yYXRpbywgc2FtdWVsMV9jbG9ja19yYXRpbywKKwkJCQlzaXplb2Yoc2FtdWVsMV9jbG9ja19yYXRpbykpOworCQkJbWVtY3B5KGVibGNyX3RhYmxlLCBzYW11ZWwyX2VibGNyLAorCQkJCXNpemVvZihzYW11ZWwyX2VibGNyKSk7CiAJCQlicmVhazsKIAkJY2FzZSAxIC4uLiAxNToKKwkJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX0xPTkdIQVVMX1YyOwogCQkJaWYgKGMtPng4Nl9tYXNrIDwgOCkgewogCQkJCWNwdV9tb2RlbCA9IENQVV9TQU1VRUwyOwogCQkJCWNwdW5hbWUgPSAiQzMgJ1NhbXVlbCAyJyBbQzVCXSI7CkBAIC02MTYsOCArNjg2LDEwIEBACiAJCQkJY3B1X21vZGVsID0gQ1BVX0VaUkE7CiAJCQkJY3B1bmFtZSA9ICJDMyAnRXpyYScgW0M1Q10iOwogCQkJfQotCQkJbWVtY3B5IChjbG9ja19yYXRpbywgZXpyYV9jbG9ja19yYXRpbywgc2l6ZW9mKGV6cmFfY2xvY2tfcmF0aW8pKTsKLQkJCW1lbWNweSAoZWJsY3JfdGFibGUsIGV6cmFfZWJsY3IsIHNpemVvZihlenJhX2VibGNyKSk7CisJCQltZW1jcHkoY2xvY2tfcmF0aW8sIGV6cmFfY2xvY2tfcmF0aW8sCisJCQkJc2l6ZW9mKGV6cmFfY2xvY2tfcmF0aW8pKTsKKwkJCW1lbWNweShlYmxjcl90YWJsZSwgZXpyYV9lYmxjciwKKwkJCQlzaXplb2YoZXpyYV9lYmxjcikpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC02MzIsMjQgKzcwNCwyNCBAQAogCQlicmVhazsKIAogCWNhc2UgOToKLQkJY3B1X21vZGVsID0gQ1BVX05FSEVNSUFIOwogCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9QT1dFUlNBVkVSOwotCQludW1zY2FsZXM9MzI7CisJCW51bXNjYWxlcyA9IDMyOworCQltZW1jcHkoY2xvY2tfcmF0aW8sCisJCSAgICAgICBuZWhlbWlhaF9jbG9ja19yYXRpbywKKwkJICAgICAgIHNpemVvZihuZWhlbWlhaF9jbG9ja19yYXRpbykpOworCQltZW1jcHkoZWJsY3JfdGFibGUsIG5laGVtaWFoX2VibGNyLCBzaXplb2YobmVoZW1pYWhfZWJsY3IpKTsKIAkJc3dpdGNoIChjLT54ODZfbWFzaykgewogCQljYXNlIDAgLi4uIDE6Ci0JCQljcHVuYW1lID0gIkMzICdOZWhlbWlhaCBBJyBbQzVOXSI7Ci0JCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBuZWhlbWlhaF9hX2Nsb2NrX3JhdGlvLCBzaXplb2YobmVoZW1pYWhfYV9jbG9ja19yYXRpbykpOwotCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgbmVoZW1pYWhfYV9lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2FfZWJsY3IpKTsKKwkJCWNwdV9tb2RlbCA9IENQVV9ORUhFTUlBSDsKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEEnIFtDNVhMT0VdIjsKIAkJCWJyZWFrOwogCQljYXNlIDIgLi4uIDQ6Ci0JCQljcHVuYW1lID0gIkMzICdOZWhlbWlhaCBCJyBbQzVOXSI7Ci0JCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBuZWhlbWlhaF9iX2Nsb2NrX3JhdGlvLCBzaXplb2YobmVoZW1pYWhfYl9jbG9ja19yYXRpbykpOwotCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgbmVoZW1pYWhfYl9lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2JfZWJsY3IpKTsKKwkJCWNwdV9tb2RlbCA9IENQVV9ORUhFTUlBSDsKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEInIFtDNVhMT0hdIjsKIAkJCWJyZWFrOwogCQljYXNlIDUgLi4uIDE1OgotCQkJY3B1bmFtZSA9ICJDMyAnTmVoZW1pYWggQycgW0M1Tl0iOwotCQkJbWVtY3B5IChjbG9ja19yYXRpbywgbmVoZW1pYWhfY19jbG9ja19yYXRpbywgc2l6ZW9mKG5laGVtaWFoX2NfY2xvY2tfcmF0aW8pKTsKLQkJCW1lbWNweSAoZWJsY3JfdGFibGUsIG5laGVtaWFoX2NfZWJsY3IsIHNpemVvZihuZWhlbWlhaF9jX2VibGNyKSk7CisJCQljcHVfbW9kZWwgPSBDUFVfTkVIRU1JQUhfQzsKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEMnIFtDNVBdIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtNjU4LDYgKzczMCwxMyBAQAogCQljcHVuYW1lID0gIlVua25vd24iOwogCQlicmVhazsKIAl9CisJLyogQ2hlY2sgTG9uZ2hhdWwgdmVyLiAyICovCisJaWYgKGxvbmdoYXVsX3ZlcnNpb24gPT0gVFlQRV9MT05HSEFVTF9WMikgeworCQlyZG1zcihNU1JfVklBX0xPTkdIQVVMLCBsbywgaGkpOworCQlpZiAobG8gPT0gMCAmJiBoaSA9PSAwKQorCQkJLyogTG9va3MgbGlrZSBNU1IgaXNuJ3QgcHJlc2VudCAqLworCQkJbG9uZ2hhdWxfdmVyc2lvbiA9IFRZUEVfTE9OR0hBVUxfVjE7CisJfQogCiAJcHJpbnRrIChLRVJOX0lORk8gUEZYICJWSUEgJXMgQ1BVIGRldGVjdGVkLiAgIiwgY3B1bmFtZSk7CiAJc3dpdGNoIChsb25naGF1bF92ZXJzaW9uKSB7CkBAIC02NzAsMTUgKzc0OSwxOCBAQAogCQlicmVhazsKIAl9OwogCisJLyogRG9lc24ndCBodXJ0ICovCisJdnQ4MjM1X3ByZXNlbnQgPSBsb25naGF1bF9zZXR1cF92dDgyMzUoKTsKKwogCS8qIEZpbmQgQUNQSSBkYXRhIGZvciBwcm9jZXNzb3IgKi8KLQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9QUk9DRVNTT1IsIEFDUElfUk9PVF9PQkpFQ1QsIEFDUElfVUlOVDMyX01BWCwKLQkJCSAgICAmbG9uZ2hhdWxfd2Fsa19jYWxsYmFjaywgTlVMTCwgKHZvaWQgKikmcHIpOworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX1BST0NFU1NPUiwgQUNQSV9ST09UX09CSkVDVCwKKwkJCQlBQ1BJX1VJTlQzMl9NQVgsICZsb25naGF1bF93YWxrX2NhbGxiYWNrLAorCQkJCU5VTEwsICh2b2lkICopJnByKTsKIAogCS8qIENoZWNrIEFDUEkgc3VwcG9ydCBmb3IgQzMgc3RhdGUgKi8KLQlpZiAoKHByICE9IE5VTEwpICYmIChsb25naGF1bF92ZXJzaW9uID09IFRZUEVfUE9XRVJTQVZFUikpIHsKKwlpZiAocHIgIT0gTlVMTCAmJiBsb25naGF1bF92ZXJzaW9uICE9IFRZUEVfTE9OR0hBVUxfVjEpIHsKIAkJY3ggPSAmcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MzXTsKLQkJaWYgKGN4LT5hZGRyZXNzID4gMCAmJgotCQkgICAoY3gtPmxhdGVuY3kgPD0gMTAwMCB8fCBpZ25vcmVfbGF0ZW5jeSAhPSAwKSApIHsKKwkJaWYgKGN4LT5hZGRyZXNzID4gMCAmJiBjeC0+bGF0ZW5jeSA8PSAxMDAwKSB7CiAJCQlsb25naGF1bF9mbGFncyB8PSBVU0VfQUNQSV9DMzsKIAkJCWdvdG8gcHJpbnRfc3VwcG9ydF90eXBlOwogCQl9CkBAIC02ODgsOCArNzcwLDExIEBACiAJCWxvbmdoYXVsX2ZsYWdzIHw9IFVTRV9OT1JUSEJSSURHRTsKIAkJZ290byBwcmludF9zdXBwb3J0X3R5cGU7CiAJfQotCi0JLyogTm8gQUNQSSBDMyBvciB3ZSBjYW4ndCB1c2UgaXQgKi8KKwkvKiBVc2UgVlQ4MjM1IHNvdXRoYnJpZGdlIGlmIHByZXNlbnQgKi8KKwlpZiAobG9uZ2hhdWxfdmVyc2lvbiA9PSBUWVBFX1BPV0VSU0FWRVIgJiYgdnQ4MjM1X3ByZXNlbnQpIHsKKwkJbG9uZ2hhdWxfZmxhZ3MgfD0gVVNFX1ZUODIzNTsKKwkJZ290byBwcmludF9zdXBwb3J0X3R5cGU7CisJfQogCS8qIENoZWNrIEFDUEkgc3VwcG9ydCBmb3IgYnVzIG1hc3RlciBhcmJpdGVyIGRpc2FibGUgKi8KIAlpZiAoKHByID09IE5VTEwpIHx8ICEocHItPmZsYWdzLmJtX2NvbnRyb2wpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlgKQEAgLTY5OCwxOCArNzgzLDE4IEBACiAJfQogCiBwcmludF9zdXBwb3J0X3R5cGU6Ci0JaWYgKCEobG9uZ2hhdWxfZmxhZ3MgJiBVU0VfTk9SVEhCUklER0UpKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgQUNQSSBzdXBwb3J0LlxuIik7Ci0JfSBlbHNlIHsKKwlpZiAobG9uZ2hhdWxfZmxhZ3MgJiBVU0VfTk9SVEhCUklER0UpCiAJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgbm9ydGhicmlkZ2Ugc3VwcG9ydC5cbiIpOwotCX0KKwllbHNlIGlmIChsb25naGF1bF9mbGFncyAmIFVTRV9WVDgyMzUpCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgVlQ4MjM1IHN1cHBvcnQuXG4iKTsKKwllbHNlCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgQUNQSSBzdXBwb3J0LlxuIik7CiAKIAlyZXQgPSBsb25naGF1bF9nZXRfcmFuZ2VzKCk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKChsb25naGF1bF92ZXJzaW9uPT1UWVBFX0xPTkdIQVVMX1YyIHx8IGxvbmdoYXVsX3ZlcnNpb249PVRZUEVfUE9XRVJTQVZFUikgJiYKLQkJIChzY2FsZV92b2x0YWdlICE9IDApKQorCWlmICgobG9uZ2hhdWxfdmVyc2lvbiAhPSBUWVBFX0xPTkdIQVVMX1YxKSAmJiAoc2NhbGVfdm9sdGFnZSAhPSAwKSkKIAkJbG9uZ2hhdWxfc2V0dXBfdm9sdGFnZXNjYWxpbmcoKTsKIAogCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CkBAIC03OTcsOCArODgyLDYgQEAKIAogbW9kdWxlX3BhcmFtIChzY2FsZV92b2x0YWdlLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzY2FsZV92b2x0YWdlLCAiU2NhbGUgdm9sdGFnZSBvZiBwcm9jZXNzb3IiKTsKLW1vZHVsZV9wYXJhbShpZ25vcmVfbGF0ZW5jeSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2xhdGVuY3ksICJTa2lwIEFDUEkgQzMgbGF0ZW5jeSB0ZXN0Iik7CiAKIE1PRFVMRV9BVVRIT1IgKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKIE1PRFVMRV9ERVNDUklQVElPTiAoIkxvbmdoYXVsIGRyaXZlciBmb3IgVklBIEN5cml4IHByb2Nlc3NvcnMuIik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmgKaW5kZXggYmM0NjgyYS4uYmIwYTA0YiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaApAQCAtMjM1LDQ5ICsyMzUsMTQgQEAKIC8qCiAgKiBWSUEgQzMgTmVoZW1pYWggKi8KIAotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2FfY2xvY2tfcmF0aW9bMzJdID0geworc3RhdGljIGludCBfX2luaXRkYXRhICBuZWhlbWlhaF9jbG9ja19yYXRpb1szMl0gPSB7CiAJMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCiAJMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCi0JLTEsICAvKiAwMDEwIC0+ICBSRVNFUlZFRCAqLworCTQwLCAgLyogMDAxMCAtPiAgNC4weCAqLwogCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLwogCTk1LCAgLyogMDEwMCAtPiAgOS41eCAqLwogCS0xLCAgLyogMDEwMSAtPiAgUkVTRVJWRUQgKi8KLQktMSwgIC8qIDAxMTAgLT4gIFJFU0VSVkVEICovCi0JNTUsICAvKiAwMTExIC0+ICA1LjV4ICovCi0JNjAsICAvKiAxMDAwIC0+ICA2LjB4ICovCi0JNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCi0JODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCi0JNTAsICAvKiAxMDExIC0+ICA1LjB4ICovCi0JNjUsICAvKiAxMTAwIC0+ICA2LjV4ICovCi0JNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCi0JODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCi0JMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCi0JMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCi0JLTEsICAvKiAwMDAxIC0+IFJFU0VSVkVEICovCi0JMTIwLCAvKiAwMDEwIC0+IDEyLjB4ICovCi0JOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCi0JMTA1LCAvKiAwMTAwIC0+IDEwLjV4ICovCi0JMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCi0JMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCi0JMTM1LCAvKiAwMTExIC0+IDEzLjV4ICovCi0JMTQwLCAvKiAxMDAwIC0+IDE0LjB4ICovCi0JMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCi0JMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCi0JMTMwLCAvKiAxMDExIC0+IDEzLjB4ICovCi0JMTQ1LCAvKiAxMTAwIC0+IDE0LjV4ICovCi0JMTU1LCAvKiAxMTAxIC0+IDE1LjV4ICovCi0JLTEsICAvKiAxMTEwIC0+IFJFU0VSVkVEICgxMy4weCkgKi8KLQkxMjAsIC8qIDExMTEgLT4gMTIuMHggKi8KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSAgbmVoZW1pYWhfYl9jbG9ja19yYXRpb1szMl0gPSB7Ci0JMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCi0JMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCi0JLTEsICAvKiAwMDEwIC0+ICBSRVNFUlZFRCAqLwotCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLwotCTk1LCAgLyogMDEwMCAtPiAgOS41eCAqLwotCS0xLCAgLyogMDEwMSAtPiAgUkVTRVJWRUQgKi8KLQktMSwgIC8qIDAxMTAgLT4gIFJFU0VSVkVEICovCisJNDUsICAvKiAwMTEwIC0+ICA0LjV4ICovCiAJNTUsICAvKiAwMTExIC0+ICA1LjV4ICovCiAJNjAsICAvKiAxMDAwIC0+ICA2LjB4ICovCiAJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCkBAIC0zMDUsODQgKzI3MCwxNCBAQAogCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLwogfTsKIAotc3RhdGljIGludCBfX2luaXRkYXRhICBuZWhlbWlhaF9jX2Nsb2NrX3JhdGlvWzMyXSA9IHsKLQkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KLQkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KLQk0MCwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCi0JOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCi0JOTUsICAvKiAwMTAwIC0+ICA5LjV4ICovCi0JLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLwotCTQ1LCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KLQk1NSwgIC8qIDAxMTEgLT4gIDUuNXggKi8KLQk2MCwgIC8qIDEwMDAgLT4gIDYuMHggKi8KLQk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KLQk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KLQk1MCwgIC8qIDEwMTEgLT4gIDUuMHggKi8KLQk2NSwgIC8qIDExMDAgLT4gIDYuNXggKi8KLQk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KLQk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KLQkxMjAsIC8qIDExMTEgLT4gMTIuMHggKi8KLQkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KLQkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KLQkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KLQk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KLQkxMDUsIC8qIDAxMDAgLT4gMTAuNXggKi8KLQkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KLQkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KLQkxMzUsIC8qIDAxMTEgLT4gMTMuNXggKi8KLQkxNDAsIC8qIDEwMDAgLT4gMTQuMHggKi8KLQkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KLQkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KLQkxMzAsIC8qIDEwMTEgLT4gMTMuMHggKi8KLQkxNDUsIC8qIDExMDAgLT4gMTQuNXggKi8KLQkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KLQktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLwotCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLwotfTsKLQotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2FfZWJsY3JbMzJdID0geworc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2VibGNyWzMyXSA9IHsKIAk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KIAkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KLQktMSwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCisJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCiAJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCiAJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCiAJLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLwotCS0xLCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KLQk5NSwgIC8qIDAxMTEgLT4gIDkuNXggKi8KLQk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KLQk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KLQk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KLQk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KLQkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KLQk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KLQk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KLQk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KLQk5MCwgIC8qIDAwMDAgLT4gIDkuMHggKi8KLQktMSwgIC8qIDAwMDEgLT4gUkVTRVJWRUQgKi8KLQkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KLQkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KLQkxMzUsIC8qIDAxMDAgLT4gMTMuNXggKi8KLQkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KLQkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KLQkxMDUsIC8qIDAxMTEgLT4gMTAuNXggKi8KLQkxMzAsIC8qIDEwMDAgLT4gMTMuMHggKi8KLQkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KLQkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KLQkxNDAsIC8qIDEwMTEgLT4gMTQuMHggKi8KLQkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KLQkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KLQktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLwotCTE0NSAvKiAxMTExIC0+IDE0LjV4ICovCi0gICAvKiBlbmQgb2YgdGFibGUgICovCi19Owotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2JfZWJsY3JbMzJdID0gewotCTUwLCAgLyogMDAwMCAtPiAgNS4weCAqLwotCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLwotCS0xLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KLQkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KLQk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KLQktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCi0JLTEsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLworCTQ1LCAgLyogMDExMCAtPiAgNC41eCAqLwogCTk1LCAgLyogMDExMSAtPiAgOS41eCAqLwogCTkwLCAgLyogMTAwMCAtPiAgOS4weCAqLwogCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLwpAQCAtNDA4LDQyICszMDMsNiBAQAogCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLwogCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCiAJMTQ1IC8qIDExMTEgLT4gMTQuNXggKi8KLQkgICAvKiBlbmQgb2YgdGFibGUgICovCi19Owotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2NfZWJsY3JbMzJdID0gewotCTUwLCAgLyogMDAwMCAtPiAgNS4weCAqLwotCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLwotCTQwLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KLQkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KLQk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KLQktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCi0JNDUsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLwotCTk1LCAgLyogMDExMSAtPiAgOS41eCAqLwotCTkwLCAgLyogMTAwMCAtPiAgOS4weCAqLwotCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLwotCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLwotCTYwLCAgLyogMTAxMSAtPiAgNi4weCAqLwotCTEyMCwgLyogMTEwMCAtPiAxMi4weCAqLwotCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLwotCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLwotCTY1LCAgLyogMTExMSAtPiAgNi41eCAqLwotCTkwLCAgLyogMDAwMCAtPiAgOS4weCAqLwotCTExMCwgLyogMDAwMSAtPiAxMS4weCAqLwotCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLwotCTEwMCwgLyogMDAxMSAtPiAxMC4weCAqLwotCTEzNSwgLyogMDEwMCAtPiAxMy41eCAqLwotCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLwotCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLwotCTEwNSwgLyogMDExMSAtPiAxMC41eCAqLwotCTEzMCwgLyogMTAwMCAtPiAxMy4weCAqLwotCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLwotCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLwotCTE0MCwgLyogMTAxMSAtPiAxNC4weCAqLwotCTEyMCwgLyogMTEwMCAtPiAxMi4weCAqLwotCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLwotCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCi0JMTQ1IC8qIDExMTEgLT4gMTQuNXggKi8KLQkgIC8qIGVuZCBvZiB0YWJsZSAgKi8KIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKaW5kZXggMmQ2NDkxNi4uZmUzYjY3MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtMTI4OSw3ICsxMjg5LDExIEBACiAJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQogCQlnb3RvIG91dDsKIAotCWtoeiA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CisJaWYgKGNwdV9mYW1pbHkgPT0gQ1BVX0hXX1BTVEFURSkKKwkJa2h6ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZGRpZChkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJyZGlkKTsKKwllbHNlCisJCWtoeiA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CisKIAogb3V0OgogCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgb2xkbWFzayk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCmluZGV4IDBiMjlkNDEuLmUxMDA2YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaHBldC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTYsMTcgKzcsMjc4IEBACiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAorZXh0ZXJuIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmdsb2JhbF9jbG9ja19ldmVudDsKKwogI2RlZmluZSBIUEVUX01BU0sJQ0xPQ0tTT1VSQ0VfTUFTSygzMikKICNkZWZpbmUgSFBFVF9TSElGVAkyMgogCiAvKiBGU0VDID0gMTBeLTE1IE5TRUMgPSAxMF4tOSAqLwogI2RlZmluZSBGU0VDX1BFUl9OU0VDCTEwMDAwMDAKIAotc3RhdGljIHZvaWQgX19pb21lbSAqaHBldF9wdHI7CisvKgorICogSFBFVCBhZGRyZXNzIGlzIHNldCBpbiBhY3BpL2Jvb3QuYywgd2hlbiBhbiBBQ1BJIGVudHJ5IGV4aXN0cworICovCit1bnNpZ25lZCBsb25nIGhwZXRfYWRkcmVzczsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBocGV0X3ZpcnRfYWRkcmVzczsKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhwZXRfcmVhZGwodW5zaWduZWQgbG9uZyBhKQoreworCXJldHVybiByZWFkbChocGV0X3ZpcnRfYWRkcmVzcyArIGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHBldF93cml0ZWwodW5zaWduZWQgbG9uZyBkLCB1bnNpZ25lZCBsb25nIGEpCit7CisJd3JpdGVsKGQsIGhwZXRfdmlydF9hZGRyZXNzICsgYSk7Cit9CisKKy8qCisgKiBIUEVUIGNvbW1hbmQgbGluZSBlbmFibGUgLyBkaXNhYmxlCisgKi8KK3N0YXRpYyBpbnQgYm9vdF9ocGV0X2Rpc2FibGU7CisKK3N0YXRpYyBpbnQgX19pbml0IGhwZXRfc2V0dXAoY2hhciogc3RyKQoreworCWlmIChzdHIpIHsKKwkJaWYgKCFzdHJuY21wKCJkaXNhYmxlIiwgc3RyLCA3KSkKKwkJCWJvb3RfaHBldF9kaXNhYmxlID0gMTsKKwl9CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJocGV0PSIsIGhwZXRfc2V0dXApOworCitzdGF0aWMgaW5saW5lIGludCBpc19ocGV0X2NhcGFibGUodm9pZCkKK3sKKwlyZXR1cm4gKCFib290X2hwZXRfZGlzYWJsZSAmJiBocGV0X2FkZHJlc3MpOworfQorCisvKgorICogSFBFVCB0aW1lciBpbnRlcnJ1cHQgZW5hYmxlIC8gZGlzYWJsZQorICovCitzdGF0aWMgaW50IGhwZXRfbGVnYWN5X2ludF9lbmFibGVkOworCisvKioKKyAqIGlzX2hwZXRfZW5hYmxlZCAtIGNoZWNrIHdoZXRoZXIgdGhlIGhwZXQgdGltZXIgaW50ZXJydXB0IGlzIGVuYWJsZWQKKyAqLworaW50IGlzX2hwZXRfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiBpc19ocGV0X2NhcGFibGUoKSAmJiBocGV0X2xlZ2FjeV9pbnRfZW5hYmxlZDsKK30KKworLyoKKyAqIFdoZW4gdGhlIGhwZXQgZHJpdmVyICgvZGV2L2hwZXQpIGlzIGVuYWJsZWQsIHdlIG5lZWQgdG8gcmVzZXJ2ZQorICogdGltZXIgMCBhbmQgdGltZXIgMSBpbiBjYXNlIG9mIFJUQyBlbXVsYXRpb24uCisgKi8KKyNpZmRlZiBDT05GSUdfSFBFVAorc3RhdGljIHZvaWQgaHBldF9yZXNlcnZlX3BsYXRmb3JtX3RpbWVycyh1bnNpZ25lZCBsb25nIGlkKQoreworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwZXQgPSBocGV0X3ZpcnRfYWRkcmVzczsKKwlzdHJ1Y3QgaHBldF90aW1lciBfX2lvbWVtICp0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsKKwl1bnNpZ25lZCBpbnQgbnJ0aW1lcnMsIGk7CisJc3RydWN0IGhwZXRfZGF0YSBoZDsKKworCW5ydGltZXJzID0gKChpZCAmIEhQRVRfSURfTlVNQkVSKSA+PiBIUEVUX0lEX05VTUJFUl9TSElGVCkgKyAxOworCisJbWVtc2V0KCZoZCwgMCwgc2l6ZW9mIChoZCkpOworCWhkLmhkX3BoeXNfYWRkcmVzcyA9IGhwZXRfYWRkcmVzczsKKwloZC5oZF9hZGRyZXNzID0gaHBldF92aXJ0X2FkZHJlc3M7CisJaGQuaGRfbmlycXMgPSBucnRpbWVyczsKKwloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKKwlocGV0X3Jlc2VydmVfdGltZXIoJmhkLCAwKTsKKworI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCisJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7CisjZW5kaWYKKworCWhkLmhkX2lycVswXSA9IEhQRVRfTEVHQUNZXzgyNTQ7CisJaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOworCisJZm9yIChpID0gMjsgaSA8IG5ydGltZXJzOyB0aW1lcisrLCBpKyspCisJCWhkLmhkX2lycVtpXSA9ICh0aW1lci0+aHBldF9jb25maWcgJiBUbl9JTlRfUk9VVEVfQ05GX01BU0spID4+CisJCQlUbl9JTlRfUk9VVEVfQ05GX1NISUZUOworCisJaHBldF9hbGxvYygmaGQpOworCit9CisjZWxzZQorc3RhdGljIHZvaWQgaHBldF9yZXNlcnZlX3BsYXRmb3JtX3RpbWVycyh1bnNpZ25lZCBsb25nIGlkKSB7IH0KKyNlbmRpZgorCisvKgorICogQ29tbW9uIGhwZXQgaW5mbworICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsKKworc3RhdGljIHZvaWQgaHBldF9zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KTsKK3N0YXRpYyBpbnQgaHBldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsCisJCQkgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpOworCisvKgorICogVGhlIGhwZXQgY2xvY2sgZXZlbnQgZGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGhwZXRfY2xvY2tldmVudCA9IHsKKwkubmFtZQkJPSAiaHBldCIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCS5zZXRfbW9kZQk9IGhwZXRfc2V0X21vZGUsCisJLnNldF9uZXh0X2V2ZW50ID0gaHBldF9uZXh0X2V2ZW50LAorCS5zaGlmdAkJPSAzMiwKKwkuaXJxCQk9IDAsCit9OworCitzdGF0aWMgdm9pZCBocGV0X3N0YXJ0X2NvdW50ZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOworCisJY2ZnICY9IH5IUEVUX0NGR19FTkFCTEU7CisJaHBldF93cml0ZWwoY2ZnLCBIUEVUX0NGRyk7CisJaHBldF93cml0ZWwoMCwgSFBFVF9DT1VOVEVSKTsKKwlocGV0X3dyaXRlbCgwLCBIUEVUX0NPVU5URVIgKyA0KTsKKwljZmcgfD0gSFBFVF9DRkdfRU5BQkxFOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOworfQorCitzdGF0aWMgdm9pZCBocGV0X2VuYWJsZV9pbnQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOworCisJY2ZnIHw9IEhQRVRfQ0ZHX0xFR0FDWTsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKKwlocGV0X2xlZ2FjeV9pbnRfZW5hYmxlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGhwZXRfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmZywgY21wLCBub3c7CisJdWludDY0X3QgZGVsdGE7CisKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CisJCWRlbHRhID0gKCh1aW50NjRfdCkoTlNFQ19QRVJfU0VDL0haKSkgKiBocGV0X2Nsb2NrZXZlbnQubXVsdDsKKwkJZGVsdGEgPj49IGhwZXRfY2xvY2tldmVudC5zaGlmdDsKKwkJbm93ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCQljbXAgPSBub3cgKyAodW5zaWduZWQgbG9uZykgZGVsdGE7CisJCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DRkcpOworCQljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROX1BFUklPRElDIHwKKwkJICAgICAgIEhQRVRfVE5fU0VUVkFMIHwgSFBFVF9UTl8zMkJJVDsKKwkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QwX0NGRyk7CisJCS8qCisJCSAqIFRoZSBmaXJzdCB3cml0ZSBhZnRlciB3cml0aW5nIFROX1NFVFZBTCB0byB0aGUKKwkJICogY29uZmlnIHJlZ2lzdGVyIHNldHMgdGhlIGNvdW50ZXIgdmFsdWUsIHRoZSBzZWNvbmQKKwkJICogd3JpdGUgc2V0cyB0aGUgcGVyaW9kLgorCQkgKi8KKwkJaHBldF93cml0ZWwoY21wLCBIUEVUX1QwX0NNUCk7CisJCXVkZWxheSgxKTsKKwkJaHBldF93cml0ZWwoKHVuc2lnbmVkIGxvbmcpIGRlbHRhLCBIUEVUX1QwX0NNUCk7CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ0ZHKTsKKwkJY2ZnICY9IH5IUEVUX1ROX1BFUklPRElDOworCQljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOworCQlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDBfQ0ZHKTsKKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgorCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ0ZHKTsKKwkJY2ZnICY9IH5IUEVUX1ROX0VOQUJMRTsKKwkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QwX0NGRyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBocGV0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKKwkJCSAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGNudDsKKworCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwljbnQgKz0gZGVsdGE7CisJaHBldF93cml0ZWwoY250LCBIUEVUX1QwX0NNUCk7CisKKwlyZXR1cm4gKChsb25nKShocGV0X3JlYWRsKEhQRVRfQ09VTlRFUikgLSBjbnQgKSA+IDApOworfQorCisvKgorICogVHJ5IHRvIHNldHVwIHRoZSBIUEVUIHRpbWVyCisgKi8KK2ludCBfX2luaXQgaHBldF9lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlkOworCXVpbnQ2NF90IGhwZXRfZnJlcTsKKworCWlmICghaXNfaHBldF9jYXBhYmxlKCkpCisJCXJldHVybiAwOworCisJaHBldF92aXJ0X2FkZHJlc3MgPSBpb3JlbWFwX25vY2FjaGUoaHBldF9hZGRyZXNzLCBIUEVUX01NQVBfU0laRSk7CisKKwkvKgorCSAqIFJlYWQgdGhlIHBlcmlvZCBhbmQgY2hlY2sgZm9yIGEgc2FuZSB2YWx1ZToKKwkgKi8KKwlocGV0X3BlcmlvZCA9IGhwZXRfcmVhZGwoSFBFVF9QRVJJT0QpOworCWlmIChocGV0X3BlcmlvZCA8IEhQRVRfTUlOX1BFUklPRCB8fCBocGV0X3BlcmlvZCA+IEhQRVRfTUFYX1BFUklPRCkKKwkJZ290byBvdXRfbm9ocGV0OworCisJLyoKKwkgKiBUaGUgcGVyaW9kIGlzIGEgZmVtdG8gc2Vjb25kcyB2YWx1ZS4gV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlCisJICogc2NhbGVkIG1hdGggbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBuYW5vc2Vjb25kIHRvIGhwZXQgdGljaworCSAqIGNvbnZlcnNpb24uCisJICovCisJaHBldF9mcmVxID0gMTAwMDAwMDAwMDAwMDAwMFVMTDsKKwlkb19kaXYoaHBldF9mcmVxLCBocGV0X3BlcmlvZCk7CisJaHBldF9jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoKHVuc2lnbmVkIGxvbmcpIGhwZXRfZnJlcSwKKwkJCQkgICAgICBOU0VDX1BFUl9TRUMsIDMyKTsKKwkvKiBDYWxjdWxhdGUgdGhlIG1pbiAvIG1heCBkZWx0YSAqLworCWhwZXRfY2xvY2tldmVudC5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4N0ZGRkZGRkYsCisJCQkJCQkJICAgJmhwZXRfY2xvY2tldmVudCk7CisJaHBldF9jbG9ja2V2ZW50Lm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHgzMCwKKwkJCQkJCQkgICAmaHBldF9jbG9ja2V2ZW50KTsKKworCS8qCisJICogUmVhZCB0aGUgSFBFVCBJRCByZWdpc3RlciB0byByZXRyaWV2ZSB0aGUgSVJRIHJvdXRpbmcKKwkgKiBpbmZvcm1hdGlvbiBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscworCSAqLworCWlkID0gaHBldF9yZWFkbChIUEVUX0lEKTsKKworI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCisJLyoKKwkgKiBUaGUgbGVnYWN5IHJvdXRpbmcgbW9kZSBuZWVkcyBhdCBsZWFzdCB0d28gY2hhbm5lbHMsIHRpY2sgdGltZXIKKwkgKiBhbmQgdGhlIHJ0YyBlbXVsYXRpb24gY2hhbm5lbC4KKwkgKi8KKwlpZiAoIShpZCAmIEhQRVRfSURfTlVNQkVSKSkKKwkJZ290byBvdXRfbm9ocGV0OworI2VuZGlmCisKKwkvKiBTdGFydCB0aGUgY291bnRlciAqLworCWhwZXRfc3RhcnRfY291bnRlcigpOworCisJaWYgKGlkICYgSFBFVF9JRF9MRUdTVVApIHsKKwkJaHBldF9lbmFibGVfaW50KCk7CisJCWhwZXRfcmVzZXJ2ZV9wbGF0Zm9ybV90aW1lcnMoaWQpOworCQkvKgorCQkgKiBTdGFydCBocGV0IHdpdGggdGhlIGJvb3QgY3B1IG1hc2sgYW5kIG1ha2UgaXQKKwkJICogZ2xvYmFsIGFmdGVyIHRoZSBJT19BUElDIGhhcyBiZWVuIGluaXRpYWxpemVkLgorCQkgKi8KKwkJaHBldF9jbG9ja2V2ZW50LmNwdW1hc2sgPWNwdW1hc2tfb2ZfY3B1KDApOworCQljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJmhwZXRfY2xvY2tldmVudCk7CisJCWdsb2JhbF9jbG9ja19ldmVudCA9ICZocGV0X2Nsb2NrZXZlbnQ7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKworb3V0X25vaHBldDoKKwlpb3VubWFwKGhwZXRfdmlydF9hZGRyZXNzKTsKKwlocGV0X3ZpcnRfYWRkcmVzcyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbG9jayBzb3VyY2UgcmVsYXRlZCBjb2RlCisgKi8KIHN0YXRpYyBjeWNsZV90IHJlYWRfaHBldCh2b2lkKQogewotCXJldHVybiAoY3ljbGVfdClyZWFkbChocGV0X3B0cik7CisJcmV0dXJuIChjeWNsZV90KWhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9ocGV0ID0gewpAQCAtMjQsMjggKzI4NiwxNyBAQAogCS5yYXRpbmcJCT0gMjUwLAogCS5yZWFkCQk9IHJlYWRfaHBldCwKIAkubWFzawkJPSBIUEVUX01BU0ssCi0JLm11bHQJCT0gMCwgLyogc2V0IGJlbG93ICovCiAJLnNoaWZ0CQk9IEhQRVRfU0hJRlQsCi0JLmlzX2NvbnRpbnVvdXMJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaHBldF9jbG9ja3NvdXJjZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7Ci0Jdm9pZCBfX2lvbWVtKiBocGV0X2Jhc2U7CiAJdTY0IHRtcDsKLQlpbnQgZXJyOwogCi0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwlpZiAoIWhwZXRfdmlydF9hZGRyZXNzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIGNhbGN1bGF0ZSB0aGUgaHBldCBhZGRyZXNzOiAqLwotCWhwZXRfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShocGV0X2FkZHJlc3MsIEhQRVRfTU1BUF9TSVpFKTsKLQlocGV0X3B0ciA9IGhwZXRfYmFzZSArIEhQRVRfQ09VTlRFUjsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5OiAqLwotCWhwZXRfcGVyaW9kID0gcmVhZGwoaHBldF9iYXNlICsgSFBFVF9QRVJJT0QpOwotCiAJLyoKIAkgKiBocGV0IHBlcmlvZCBpcyBpbiBmZW10byBzZWNvbmRzIHBlciBjeWNsZQogCSAqIHNvIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHRvIG5zL2N5YyB1bml0cwpAQCAtNjEsMTEgKzMxMiwyMTggQEAKIAlkb19kaXYodG1wLCBGU0VDX1BFUl9OU0VDKTsKIAljbG9ja3NvdXJjZV9ocGV0Lm11bHQgPSAodTMyKXRtcDsKIAotCWVyciA9IGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9ocGV0KTsKLQlpZiAoZXJyKQotCQlpb3VubWFwKGhwZXRfYmFzZSk7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfaHBldCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXRfaHBldF9jbG9ja3NvdXJjZSk7CisKKyNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworCisvKiBIUEVUIGluIExlZ2FjeVJlcGxhY2VtZW50IE1vZGUgZWF0cyB1cCBSVEMgaW50ZXJydXB0IGxpbmUuIFdoZW4sIEhQRVQKKyAqIGlzIGVuYWJsZWQsIHdlIHN1cHBvcnQgUlRDIGludGVycnVwdCBmdW5jdGlvbmFsaXR5IGluIHNvZnR3YXJlLgorICogUlRDIGhhcyAzIGtpbmRzIG9mIGludGVycnVwdHM6CisgKiAxKSBVcGRhdGUgSW50ZXJydXB0IC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0LCBldmVyeSBzZWMsIHdoZW4gUlRDIGNsb2NrCisgKiAgICBpcyB1cGRhdGVkCisgKiAyKSBBbGFybSBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgYXQgYSBzcGVjaWZpYyB0aW1lIG9mIGRheQorICogMykgUGVyaW9kaWMgSW50ZXJydXB0IC0gZ2VuZXJhdGUgcGVyaW9kaWMgaW50ZXJydXB0LCB3aXRoIGZyZXF1ZW5jaWVzCisgKiAgICAySHotODE5Mkh6ICgySHotNjRIeiBmb3Igbm9uLXJvb3QgdXNlcikgKGFsbCBmcmVxcyBpbiBwb3dlcnMgb2YgMikKKyAqICgxKSBhbmQgKDIpIGFib3ZlIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBwb2xsaW5nIGF0IGEgZnJlcXVlbmN5IG9mCisgKiA2NCBIei4gVGhlIGV4YWN0IGZyZXF1ZW5jeSBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gYWNjdXJhY3kgYW5kIGludGVycnVwdAorICogb3ZlcmhlYWQuIChERUZBVUxUX1JUQ19JTlRfRlJFUSkKKyAqIEZvciAoMyksIHdlIHVzZSBpbnRlcnJ1cHRzIGF0IDY0SHogb3IgdXNlciBzcGVjaWZpZWQgcGVyaW9kaWMKKyAqIGZyZXF1ZW5jeSwgd2hpY2hldmVyIGlzIGhpZ2hlci4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNkZWZpbmUgREVGQVVMVF9SVENfSU5UX0ZSRVEJNjQKKyNkZWZpbmUgREVGQVVMVF9SVENfU0hJRlQJNgorI2RlZmluZSBSVENfTlVNX0lOVFMJCTEKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9ydGNfZmxhZ3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3ByZXZfdXBkYXRlX3NlYzsKK3N0YXRpYyBzdHJ1Y3QgcnRjX3RpbWUgaHBldF9hbGFybV90aW1lOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9waWVfY291bnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3QxX2NtcDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfZGVmYXVsdF9kZWx0YTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfcGllX2RlbHRhOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9waWVfbGltaXQ7CisKKy8qCisgKiBUaW1lciAxIGZvciBSVEMgZW11bGF0aW9uLiBXZSB1c2Ugb25lIHNob3QgbW9kZSwgYXMgcGVyaW9kaWMgbW9kZQorICogaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgSFBFVCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRpbWVyIDEuCisgKgorICogaHBldF9ydGNfdGltZXJfaW5pdCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBydGMgaXMgaW5pdGlhbGl6ZWQuCisgKi8KK2ludCBocGV0X3J0Y190aW1lcl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjZmcsIGNudCwgZGVsdGEsIGZsYWdzOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWhwZXRfZGVmYXVsdF9kZWx0YSkgeworCQl1aW50NjRfdCBjbGM7CisKKwkJY2xjID0gKHVpbnQ2NF90KSBocGV0X2Nsb2NrZXZlbnQubXVsdCAqIE5TRUNfUEVSX1NFQzsKKwkJY2xjID4+PSBocGV0X2Nsb2NrZXZlbnQuc2hpZnQgKyBERUZBVUxUX1JUQ19TSElGVDsKKwkJaHBldF9kZWZhdWx0X2RlbHRhID0gKHVuc2lnbmVkIGxvbmcpIGNsYzsKKwl9CisKKwlpZiAoIShocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUpIHx8IGhwZXRfcGllX2xpbWl0KQorCQlkZWx0YSA9IGhwZXRfZGVmYXVsdF9kZWx0YTsKKwllbHNlCisJCWRlbHRhID0gaHBldF9waWVfZGVsdGE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljbnQgPSBkZWx0YSArIGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwlocGV0X3dyaXRlbChjbnQsIEhQRVRfVDFfQ01QKTsKKwlocGV0X3QxX2NtcCA9IGNudDsKKworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOworCWNmZyAmPSB+SFBFVF9UTl9QRVJJT0RJQzsKKwljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBjYWxsZWQgZnJvbSBydGMgZHJpdmVyLgorICogUmV0dXJuIDAgaWYgSFBFVCBpcyBub3QgYmVpbmcgdXNlZC4KKyAqIE90aGVyd2lzZSBkbyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgYW5kIHJldHVybiAxLgorICovCitpbnQgaHBldF9tYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCit7CisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlocGV0X3J0Y19mbGFncyAmPSB+Yml0X21hc2s7CisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKQoreworCXVuc2lnbmVkIGxvbmcgb2xkYml0cyA9IGhwZXRfcnRjX2ZsYWdzOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlocGV0X3J0Y19mbGFncyB8PSBiaXRfbWFzazsKKworCWlmICghb2xkYml0cykKKwkJaHBldF9ydGNfdGltZXJfaW5pdCgpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9hbGFybV90aW1lKHVuc2lnbmVkIGNoYXIgaHJzLCB1bnNpZ25lZCBjaGFyIG1pbiwKKwkJCXVuc2lnbmVkIGNoYXIgc2VjKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJaHBldF9hbGFybV90aW1lLnRtX2hvdXIgPSBocnM7CisJaHBldF9hbGFybV90aW1lLnRtX21pbiA9IG1pbjsKKwlocGV0X2FsYXJtX3RpbWUudG1fc2VjID0gc2VjOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9wZXJpb2RpY19mcmVxKHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwl1aW50NjRfdCBjbGM7CisKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmIChmcmVxIDw9IERFRkFVTFRfUlRDX0lOVF9GUkVRKQorCQlocGV0X3BpZV9saW1pdCA9IERFRkFVTFRfUlRDX0lOVF9GUkVRIC8gZnJlcTsKKwllbHNlIHsKKwkJY2xjID0gKHVpbnQ2NF90KSBocGV0X2Nsb2NrZXZlbnQubXVsdCAqIE5TRUNfUEVSX1NFQzsKKwkJZG9fZGl2KGNsYywgZnJlcSk7CisJCWNsYyA+Pj0gaHBldF9jbG9ja2V2ZW50LnNoaWZ0OworCQlocGV0X3BpZV9kZWx0YSA9ICh1bnNpZ25lZCBsb25nKSBjbGM7CisJfQorCXJldHVybiAxOworfQorCitpbnQgaHBldF9ydGNfZHJvcHBlZF9pcnEodm9pZCkKK3sKKwlyZXR1cm4gaXNfaHBldF9lbmFibGVkKCk7Cit9CisKK3N0YXRpYyB2b2lkIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY2ZnLCBkZWx0YTsKKwlpbnQgbG9zdF9pbnRzID0gLTE7CisKKwlpZiAodW5saWtlbHkoIWhwZXRfcnRjX2ZsYWdzKSkgeworCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDFfQ0ZHKTsKKwkJY2ZnICY9IH5IUEVUX1ROX0VOQUJMRTsKKwkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QxX0NGRyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUpIHx8IGhwZXRfcGllX2xpbWl0KQorCQlkZWx0YSA9IGhwZXRfZGVmYXVsdF9kZWx0YTsKKwllbHNlCisJCWRlbHRhID0gaHBldF9waWVfZGVsdGE7CisKKwkvKgorCSAqIEluY3JlbWVudCB0aGUgY29tcGFyYXRvciB2YWx1ZSB1bnRpbCB3ZSBhcmUgYWhlYWQgb2YgdGhlCisJICogY3VycmVudCBjb3VudC4KKwkgKi8KKwlkbyB7CisJCWhwZXRfdDFfY21wICs9IGRlbHRhOworCQlocGV0X3dyaXRlbChocGV0X3QxX2NtcCwgSFBFVF9UMV9DTVApOworCQlsb3N0X2ludHMrKzsKKwl9IHdoaWxlICgobG9uZykoaHBldF9yZWFkbChIUEVUX0NPVU5URVIpIC0gaHBldF90MV9jbXApID4gMCk7CisKKwlpZiAobG9zdF9pbnRzKSB7CisJCWlmIChocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUpCisJCQlocGV0X3BpZV9jb3VudCArPSBsb3N0X2ludHM7CisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3QgJWQgaW50ZXJydXB0c1xuIiwKKwkJCQlsb3N0X2ludHMpOworCX0KK30KKworaXJxcmV0dXJuX3QgaHBldF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgY3Vycl90aW1lOworCXVuc2lnbmVkIGxvbmcgcnRjX2ludF9mbGFnID0gMDsKKworCWhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpOworCisJaWYgKGhwZXRfcnRjX2ZsYWdzICYgKFJUQ19VSUUgfCBSVENfQUlFKSkKKwkJcnRjX2dldF9ydGNfdGltZSgmY3Vycl90aW1lKTsKKworCWlmIChocGV0X3J0Y19mbGFncyAmIFJUQ19VSUUgJiYKKwkgICAgY3Vycl90aW1lLnRtX3NlYyAhPSBocGV0X3ByZXZfdXBkYXRlX3NlYykgeworCQlydGNfaW50X2ZsYWcgPSBSVENfVUY7CisJCWhwZXRfcHJldl91cGRhdGVfc2VjID0gY3Vycl90aW1lLnRtX3NlYzsKKwl9CisKKwlpZiAoaHBldF9ydGNfZmxhZ3MgJiBSVENfUElFICYmCisJICAgICsraHBldF9waWVfY291bnQgPj0gaHBldF9waWVfbGltaXQpIHsKKwkJcnRjX2ludF9mbGFnIHw9IFJUQ19QRjsKKwkJaHBldF9waWVfY291bnQgPSAwOworCX0KKworCWlmIChocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUgJiYKKwkgICAgKGN1cnJfdGltZS50bV9zZWMgPT0gaHBldF9hbGFybV90aW1lLnRtX3NlYykgJiYKKwkgICAgKGN1cnJfdGltZS50bV9taW4gPT0gaHBldF9hbGFybV90aW1lLnRtX21pbikgJiYKKwkgICAgKGN1cnJfdGltZS50bV9ob3VyID09IGhwZXRfYWxhcm1fdGltZS50bV9ob3VyKSkKKwkJCXJ0Y19pbnRfZmxhZyB8PSBSVENfQUY7CisKKwlpZiAocnRjX2ludF9mbGFnKSB7CisJCXJ0Y19pbnRfZmxhZyB8PSAoUlRDX0lSUUYgfCAoUlRDX05VTV9JTlRTIDw8IDgpKTsKKwkJcnRjX2ludGVycnVwdChydGNfaW50X2ZsYWcsIGRldl9pZCk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1My5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1My5jCmluZGV4IDlhMDA2MGIuLmE2YmM3YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2k4MjUzLmMKQEAgLTIsNyArMiw3IEBACiAgKiBpODI1My5jICA4MjUzL1BJVCBmdW5jdGlvbnMKICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KQEAgLTE5LDIwICsxOSwxMDAgQEAKIERFRklORV9TUElOTE9DSyhpODI1M19sb2NrKTsKIEVYUE9SVF9TWU1CT0woaTgyNTNfbG9jayk7CiAKLXZvaWQgc2V0dXBfcGl0X3RpbWVyKHZvaWQpCisvKgorICogSFBFVCByZXBsYWNlcyB0aGUgUElULCB3aGVuIGVuYWJsZWQuIFNvIHdlIG5lZWQgdG8ga25vdywgd2hpY2ggb2YKKyAqIHRoZSB0d28gdGltZXJzIGlzIHVzZWQKKyAqLworc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZ2xvYmFsX2Nsb2NrX2V2ZW50OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgUElUIHRpbWVyLgorICoKKyAqIFRoaXMgaXMgYWxzbyBjYWxsZWQgYWZ0ZXIgcmVzdW1lIHRvIGJyaW5nIHRoZSBQSVQgaW50byBvcGVyYXRpb24gYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcGl0X3RpbWVyKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOwotCW91dGJfcCgweDM0LFBJVF9NT0RFKTsJCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCi0JdWRlbGF5KDEwKTsKLQlvdXRiX3AoTEFUQ0ggJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLwotCXVkZWxheSgxMCk7Ci0Jb3V0YihMQVRDSCA+PiA4ICwgUElUX0NIMCk7CS8qIE1TQiAqLworCisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCQkvKiBiaW5hcnksIG1vZGUgMiwgTFNCL01TQiwgY2ggMCAqLworCQlvdXRiX3AoMHgzNCwgUElUX01PREUpOworCQl1ZGVsYXkoMTApOworCQlvdXRiX3AoTEFUQ0ggJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLworCQl1ZGVsYXkoMTApOworCQlvdXRiKExBVENIID4+IDggLCBQSVRfQ0gwKTsJLyogTVNCICovCisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJY2FzZSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ6CisJCS8qIE9uZSBzaG90IHNldHVwICovCisJCW91dGJfcCgweDM4LCBQSVRfTU9ERSk7CisJCXVkZWxheSgxMCk7CisJCWJyZWFrOworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1M19sb2NrLCBmbGFncyk7CiB9CiAKIC8qCisgKiBQcm9ncmFtIHRoZSBuZXh0IGV2ZW50IGluIG9uZXNob3QgbW9kZQorICoKKyAqIERlbHRhIGlzIGdpdmVuIGluIFBJVCB0aWNrcworICovCitzdGF0aWMgaW50IHBpdF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKwlvdXRiX3AoZGVsdGEgJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLworCW91dGIoZGVsdGEgPj4gOCAsIFBJVF9DSDApOwkvKiBNU0IgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1M19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE9uIFVQIHRoZSBQSVQgY2FuIHNlcnZlIGFsbCBvZiB0aGUgcG9zc2libGUgdGltZXIgZnVuY3Rpb25zLiBPbiBTTVAgc3lzdGVtcworICogaXQgY2FuIGJlIHNvbGVseSB1c2VkIGZvciB0aGUgZ2xvYmFsIHRpY2suCisgKgorICogVGhlIHByb2ZpbGluZyBhbmQgdXBkYXRlIGNhcGFiaWxpdGVzIGFyZSBzd2l0Y2hlZCBvZmYgb25jZSB0aGUgbG9jYWwgYXBpYyBpcworICogcmVnaXN0ZXJlZC4gVGhpcyBtZWNoYW5pc20gcmVwbGFjZXMgdGhlIHByZXZpb3VzICNpZmRlZiBMT0NBTF9BUElDIC0KKyAqICF1c2luZ19hcGljX3RpbWVyIGRlY2lzaW9ucyBpbiBkb190aW1lcl9pbnRlcnJ1cHRfaG9vaygpCisgKi8KK3N0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgcGl0X2Nsb2NrZXZlbnQgPSB7CisJLm5hbWUJCT0gInBpdCIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCS5zZXRfbW9kZQk9IGluaXRfcGl0X3RpbWVyLAorCS5zZXRfbmV4dF9ldmVudCA9IHBpdF9uZXh0X2V2ZW50LAorCS5zaGlmdAkJPSAzMiwKKwkuaXJxCQk9IDAsCit9OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgY29udmVyc2lvbiBmYWN0b3IgYW5kIHRoZSBtaW4vbWF4IGRlbHRhcyBvZiB0aGUgY2xvY2sgZXZlbnQKKyAqIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrIGV2ZW50IHNvdXJjZSB3aXRoIHRoZSBmcmFtZXdvcmsuCisgKi8KK3ZvaWQgX19pbml0IHNldHVwX3BpdF90aW1lcih2b2lkKQoreworCS8qCisJICogU3RhcnQgcGl0IHdpdGggdGhlIGJvb3QgY3B1IG1hc2sgYW5kIG1ha2UgaXQgZ2xvYmFsIGFmdGVyIHRoZQorCSAqIElPX0FQSUMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisJICovCisJcGl0X2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdW1hc2tfb2ZfY3B1KDApOworCXBpdF9jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoQ0xPQ0tfVElDS19SQVRFLCBOU0VDX1BFUl9TRUMsIDMyKTsKKwlwaXRfY2xvY2tldmVudC5tYXhfZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4N0ZGRiwgJnBpdF9jbG9ja2V2ZW50KTsKKwlwaXRfY2xvY2tldmVudC5taW5fZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4RiwgJnBpdF9jbG9ja2V2ZW50KTsKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJnBpdF9jbG9ja2V2ZW50KTsKKwlnbG9iYWxfY2xvY2tfZXZlbnQgPSAmcGl0X2Nsb2NrZXZlbnQ7Cit9CisKKy8qCiAgKiBTaW5jZSB0aGUgUElUIG92ZXJmbG93cyBldmVyeSB0aWNrLCBpdHMgbm90IHZlcnkgdXNlZnVsCiAgKiB0byBqdXN0IHJlYWQgYnkgaXRzZWxmLiBTbyB1c2UgamlmZmllcyB0byBlbXVsYXRlIGEgZnJlZQogICogcnVubmluZyBjb3VudGVyOgpAQCAtNDYsNyArMTI2LDcgQEAKIAlzdGF0aWMgdTMyIG9sZF9qaWZzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKLSAgICAgICAgLyoKKwkvKgogCSAqIEFsdGhvdWdoIG91ciBjYWxsZXIgbWF5IGhhdmUgdGhlIHJlYWQgc2lkZSBvZiB4dGltZV9sb2NrLAogCSAqIHRoaXMgaXMgbm93IGEgc2VxbG9jaywgYW5kIHdlIGFyZSBjaGVhdGluZyBpbiB0aGlzIHJvdXRpbmUKIAkgKiBieSBoYXZpbmcgc2lkZSBlZmZlY3RzIG9uIHN0YXRlIHRoYXQgd2UgY2Fubm90IHVuZG8gaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYwppbmRleCBjOGQ0NTgyLi4wM2FiZmRiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCkBAIC00MSw2ICs0MSw3IEBACiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGk4MjU5QV9jaGlwID0gewogCS5uYW1lCQk9ICJYVC1QSUMiLAogCS5tYXNrCQk9IGRpc2FibGVfODI1OUFfaXJxLAorCS5kaXNhYmxlCT0gZGlzYWJsZV84MjU5QV9pcnEsCiAJLnVubWFzawkJPSBlbmFibGVfODI1OUFfaXJxLAogCS5tYXNrX2Fjawk9IG1hc2tfYW5kX2Fja184MjU5QSwKIH07CkBAIC00MTAsMTIgKzQxMSw2IEBACiAJaW50cl9pbml0X2hvb2soKTsKIAogCS8qCi0JICogU2V0IHRoZSBjbG9jayB0byBIWiBIeiwgd2UgYWxyZWFkeSBoYXZlIGEgdmFsaWQKLQkgKiB2ZWN0b3Igbm93OgotCSAqLwotCXNldHVwX3BpdF90aW1lcigpOwotCi0JLyoKIAkgKiBFeHRlcm5hbCBGUFU/IFNldCB1cCBpcnExMyBpZiBzbywgZm9yCiAJICogb3JpZ2luYWwgYnJhaW5kYW1hZ2VkIElCTSBGRVJSIGNvdXBsaW5nLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYwppbmRleCBlMzBjY2VkLi40Y2NlYmQ0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYwpAQCAtNDgyLDggKzQ4Miw4IEBACiAJCXBhY2thZ2VfaW5kZXggPSBDUFVfVE9fUEFDS0FHRUlOREVYKGkpOwogCQlmb3IgKGogPSAwOyBqIDwgTlJfSVJRUzsgaisrKSB7CiAJCQl1bnNpZ25lZCBsb25nIHZhbHVlX25vdywgZGVsdGE7Ci0JCQkvKiBJcyB0aGlzIGFuIGFjdGl2ZSBJUlE/ICovCi0JCQlpZiAoIWlycV9kZXNjW2pdLmFjdGlvbikKKwkJCS8qIElzIHRoaXMgYW4gYWN0aXZlIElSUSBvciBiYWxhbmNpbmcgZGlzYWJsZWQgPyAqLworCQkJaWYgKCFpcnFfZGVzY1tqXS5hY3Rpb24gfHwgaXJxX2JhbGFuY2luZ19kaXNhYmxlZChqKSkKIAkJCQljb250aW51ZTsKIAkJCWlmICggcGFja2FnZV9pbmRleCA9PSBpICkKIAkJCQlJUlFfREVMVEEocGFja2FnZV9pbmRleCxqKSA9IDA7CkBAIC0xMjgxLDExICsxMjgxLDkgQEAKIAkJCXRyaWdnZXIgPT0gSU9BUElDX0xFVkVMKQogCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpb2FwaWNfY2hpcCwKIAkJCQkJIGhhbmRsZV9mYXN0ZW9pX2lycSwgImZhc3Rlb2kiKTsKLQllbHNlIHsKLQkJaXJxX2Rlc2NbaXJxXS5zdGF0dXMgfD0gSVJRX0RFTEFZRURfRElTQUJMRTsKKwllbHNlCiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmlvYXBpY19jaGlwLAogCQkJCQkgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOwotCX0KIAlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W2lycV0pOwogfQogCkBAIC0xNTg4LDcgKzE1ODYsNyBAQAogCXYgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwogCXByaW50ayhLRVJOX0lORk8gIi4uLiBBUElDIFZFUlNJT046ICUwOHhcbiIsIHYpOwogCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odik7Ci0JbWF4bHZ0ID0gZ2V0X21heGx2dCgpOworCW1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAogCXYgPSBhcGljX3JlYWQoQVBJQ19UQVNLUFJJKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgVEFTS1BSSTogJTA4eCAoJTAyeClcbiIsIHYsIHYgJiBBUElDX1RQUklfTUFTSyk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lycS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYwppbmRleCA1Nzg1ZDg0Li4wZjJjYTU5MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCkBAIC0xMCw3ICsxMCw2IEBACiAgKiBpb19hcGljLmMuKQogICovCiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0yMSwxOSArMjAsMzQgQEAKIAogI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAKKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKIERFRklORV9QRVJfQ1BVKGlycV9jcHVzdGF0X3QsIGlycV9zdGF0KSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGlycV9zdGF0KTsKIAotI2lmbmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIC8qCiAgKiAnd2hhdCBzaG91bGQgd2UgZG8gaWYgd2UgZ2V0IGEgaHcgaXJxIGV2ZW50IG9uIGFuIGlsbGVnYWwgdmVjdG9yJy4KICAqIGVhY2ggYXJjaGl0ZWN0dXJlIGhhcyB0byBhbnN3ZXIgdGhpcyB0aGVtc2VsdmVzLgogICovCiB2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JcHJpbnRrKCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOwotfQorCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBJUlEgdHJhcCBhdCB2ZWN0b3IgJTAyeFxuIiwgaXJxKTsKKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCS8qCisJICogQ3VycmVudGx5IHVuZXhwZWN0ZWQgdmVjdG9ycyBoYXBwZW4gb25seSBvbiBTTVAgYW5kIEFQSUMuCisJICogV2UgX211c3RfIGFjayB0aGVzZSBiZWNhdXNlIGV2ZXJ5IGxvY2FsIEFQSUMgaGFzIG9ubHkgTgorCSAqIGlycSBzbG90cyBwZXIgcHJpb3JpdHkgbGV2ZWwsIGFuZCBhICdoYW5naW5nLCB1bmFja2VkJyBJUlEKKwkgKiBob2xkcyB1cCBhbiBpcnEgc2xvdCAtIGluIGV4Y2Vzc2l2ZSBjYXNlcyAod2hlbiBtdWx0aXBsZQorCSAqIHVuZXhwZWN0ZWQgdmVjdG9ycyBvY2N1cikgdGhhdCBtaWdodCBsb2NrIHVwIHRoZSBBUElDCisJICogY29tcGxldGVseS4KKwkgKiBCdXQgb25seSBhY2sgd2hlbiB0aGUgQVBJQyBpcyBlbmFibGVkIC1BSworCSAqLworCWlmIChjcHVfaGFzX2FwaWMpCisJCWFja19BUElDX2lycSgpOwogI2VuZGlmCit9CiAKICNpZmRlZiBDT05GSUdfNEtTVEFDS1MKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL25taS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYwppbmRleCA1ZDhhMDdjLi44MjFkZjM0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL25taS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgpAQCAtOTczLDkgKzk3NCwxMyBAQAogCQljcHVfY2xlYXIoY3B1LCBiYWNrdHJhY2VfbWFzayk7CiAJfQogCi0Jc3VtID0gcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5hcGljX3RpbWVyX2lycXM7CisJLyoKKwkgKiBUYWtlIHRoZSBsb2NhbCBhcGljIHRpbWVyIGFuZCBQSVQvSFBFVCBpbnRvIGFjY291bnQuIFdlIGRvbid0CisJICoga25vdyB3aGljaCBvbmUgaXMgYWN0aXZlLCB3aGVuIHdlIGhhdmUgaGlnaHJlcy9keW50aWNrIG9uCisJICovCisJc3VtID0gcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5hcGljX3RpbWVyX2lycXMgKyBrc3RhdF9pcnFzKDApOwogCi0JLyogaWYgdGhlIGFwaWMgdGltZXIgaXNuJ3QgZmlyaW5nLCB0aGlzIGNwdSBpc24ndCBkb2luZyBtdWNoICovCisJLyogaWYgdGhlIG5vbmUgb2YgdGhlIHRpbWVycyBpc24ndCBmaXJpbmcsIHRoaXMgY3B1IGlzbid0IGRvaW5nIG11Y2ggKi8KIAlpZiAoIXRvdWNoZWQgJiYgbGFzdF9pcnFfc3Vtc1tjcHVdID09IHN1bSkgewogCQkvKgogCQkgKiBBeWllZSwgbG9va3MgbGlrZSB0aGlzIENQVSBpcyBzdHVjayAuLi4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNzg0NWQ0OC4uYmVhMzA0ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTIxMSw2ICsyMTIsNyBAQAogCiAJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KIAl3aGlsZSAoMSkgeworCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKCk7CiAJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKIAkJCXZvaWQgKCppZGxlKSh2b2lkKTsKIApAQCAtMjM4LDYgKzI0MCw3IEBACiAJCQlpZGxlKCk7CiAJCQlfX2V4aXRfaWRsZSgpOwogCQl9CisJCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCQlzY2hlZHVsZSgpOwogCQlwcmVlbXB0X2Rpc2FibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggZjQ2YTRkMC4uNDhiZmNhYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCkBAIC05NCwxMiArOTQsNiBAQAogRVhQT1JUX1NZTUJPTChjcHVfcG9zc2libGVfbWFwKTsKIHN0YXRpYyBjcHVtYXNrX3Qgc21wX2NvbW1lbmNlZF9tYXNrOwogCi0vKiBUU0MncyB1cHBlciAzMiBiaXRzIGNhbid0IGJlIHdyaXR0ZW4gaW4gZWFyaWxlciBDUFUgKGJlZm9yZSBwcmVzY290dCksIHRoZXJlCi0gKiBpcyBubyB3YXkgdG8gcmVzeW5jIG9uZSBBUCBhZ2FpbnN0IEJQLiBUQkQ6IGZvciBwcmVzY290dCBhbmQgYWJvdmUsIHdlCi0gKiBzaG91bGQgdXNlIElBNjQncyBhbGdvcml0aG0KLSAqLwotc3RhdGljIGludCBfX2RldmluaXRkYXRhIHRzY19zeW5jX2Rpc2FibGVkOwotCiAvKiBQZXIgQ1BVIGJvZ29taXBzIGFuZCBvdGhlciBwYXJhbWV0ZXJzICovCiBzdHJ1Y3QgY3B1aW5mb194ODYgY3B1X2RhdGFbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKIEVYUE9SVF9TWU1CT0woY3B1X2RhdGEpOwpAQCAtMjE2LDE1MSArMjEwLDYgQEAKIAk7CiB9CiAKLS8qCi0gKiBUU0Mgc3luY2hyb25pemF0aW9uLgotICoKLSAqIFdlIGZpcnN0IGNoZWNrIHdoZXRoZXIgYWxsIENQVXMgaGF2ZSB0aGVpciBUU0MncyBzeW5jaHJvbml6ZWQsCi0gKiB0aGVuIHdlIHByaW50IGEgd2FybmluZyBpZiBub3QsIGFuZCBhbHdheXMgcmVzeW5jLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWF0b21pY190IHN0YXJ0X2ZsYWc7Ci0JYXRvbWljX3QgY291bnRfc3RhcnQ7Ci0JYXRvbWljX3QgY291bnRfc3RvcDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWVzW05SX0NQVVNdOwotfSB0c2MgX19jcHVpbml0ZGF0YSA9IHsKLQkuc3RhcnRfZmxhZyA9IEFUT01JQ19JTklUKDApLAotCS5jb3VudF9zdGFydCA9IEFUT01JQ19JTklUKDApLAotCS5jb3VudF9zdG9wID0gQVRPTUlDX0lOSVQoMCksCi19OwotCi0jZGVmaW5lIE5SX0xPT1BTIDUKLQotc3RhdGljIHZvaWQgX19pbml0IHN5bmNocm9uaXplX3RzY19icCh2b2lkKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgbG9uZyB0MDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgc3VtLCBhdmc7Ci0JbG9uZyBsb25nIGRlbHRhOwotCXVuc2lnbmVkIGludCBvbmVfdXNlYzsKLQlpbnQgYnVnZ3kgPSAwOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiY2hlY2tpbmcgVFNDIHN5bmNocm9uaXphdGlvbiBhY3Jvc3MgJXUgQ1BVczogIiwgbnVtX2Jvb3RpbmdfY3B1cygpKTsKLQotCS8qIGNvbnZlcnQgZnJvbSBrY3ljL3NlYyB0byBjeWMvdXNlYyAqLwotCW9uZV91c2VjID0gY3B1X2toeiAvIDEwMDA7Ci0KLQlhdG9taWNfc2V0KCZ0c2Muc3RhcnRfZmxhZywgMSk7Ci0Jd21iKCk7Ci0KLQkvKgotCSAqIFdlIGxvb3AgYSBmZXcgdGltZXMgdG8gZ2V0IGEgcHJpbWVkIGluc3RydWN0aW9uIGNhY2hlLAotCSAqIHRoZW4gdGhlIGxhc3QgcGFzcyBpcyBtb3JlIG9yIGxlc3Mgc3luY2hyb25pemVkIGFuZAotCSAqIHRoZSBCUCBhbmQgQVBzIHNldCB0aGVpciBjeWNsZSBjb3VudGVycyB0byB6ZXJvIGFsbCBhdAotCSAqIG9uY2UuIFRoaXMgcmVkdWNlcyB0aGUgY2hhbmNlIG9mIGhhdmluZyByYW5kb20gb2Zmc2V0cwotCSAqIGJldHdlZW4gdGhlIHByb2Nlc3NvcnMsIGFuZCBndWFyYW50ZWVzIHRoYXQgdGhlIG1heGltdW0KLQkgKiBkZWxheSBiZXR3ZWVuIHRoZSBjeWNsZSBjb3VudGVycyBpcyBuZXZlciBiaWdnZXIgdGhhbgotCSAqIHRoZSBsYXRlbmN5IG9mIGluZm9ybWF0aW9uLXBhc3NpbmcgKGNhY2hlbGluZXMpIGJldHdlZW4KLQkgKiB0d28gQ1BVcy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlJfTE9PUFM7IGkrKykgewotCQkvKgotCQkgKiBhbGwgQVBzIHN5bmNocm9uaXplIGJ1dCB0aGV5IGxvb3Agb24gJz09IG51bV9jcHVzJwotCQkgKi8KLQkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2MuY291bnRfc3RhcnQpICE9IG51bV9ib290aW5nX2NwdXMoKS0xKQotCQkJY3B1X3JlbGF4KCk7Ci0JCWF0b21pY19zZXQoJnRzYy5jb3VudF9zdG9wLCAwKTsKLQkJd21iKCk7Ci0JCS8qCi0JCSAqIHRoaXMgbGV0cyB0aGUgQVBzIHNhdmUgdGhlaXIgY3VycmVudCBUU0M6Ci0JCSAqLwotCQlhdG9taWNfaW5jKCZ0c2MuY291bnRfc3RhcnQpOwotCi0JCXJkdHNjbGwodHNjLnZhbHVlc1tzbXBfcHJvY2Vzc29yX2lkKCldKTsKLQkJLyoKLQkJICogV2UgY2xlYXIgdGhlIFRTQyBpbiB0aGUgbGFzdCBsb29wOgotCQkgKi8KLQkJaWYgKGkgPT0gTlJfTE9PUFMtMSkKLQkJCXdyaXRlX3RzYygwLCAwKTsKLQotCQkvKgotCQkgKiBXYWl0IGZvciBhbGwgQVBzIHRvIGxlYXZlIHRoZSBzeW5jaHJvbml6YXRpb24gcG9pbnQ6Ci0JCSAqLwotCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzYy5jb3VudF9zdG9wKSAhPSBudW1fYm9vdGluZ19jcHVzKCktMSkKLQkJCWNwdV9yZWxheCgpOwotCQlhdG9taWNfc2V0KCZ0c2MuY291bnRfc3RhcnQsIDApOwotCQl3bWIoKTsKLQkJYXRvbWljX2luYygmdHNjLmNvdW50X3N0b3ApOwotCX0KLQotCXN1bSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgewotCQlpZiAoY3B1X2lzc2V0KGksIGNwdV9jYWxsb3V0X21hcCkpIHsKLQkJCXQwID0gdHNjLnZhbHVlc1tpXTsKLQkJCXN1bSArPSB0MDsKLQkJfQotCX0KLQlhdmcgPSBzdW07Ci0JZG9fZGl2KGF2ZywgbnVtX2Jvb3RpbmdfY3B1cygpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKLQkJaWYgKCFjcHVfaXNzZXQoaSwgY3B1X2NhbGxvdXRfbWFwKSkKLQkJCWNvbnRpbnVlOwotCQlkZWx0YSA9IHRzYy52YWx1ZXNbaV0gLSBhdmc7Ci0JCWlmIChkZWx0YSA8IDApCi0JCQlkZWx0YSA9IC1kZWx0YTsKLQkJLyoKLQkJICogV2UgcmVwb3J0IGJpZ2dlciB0aGFuIDIgbWljcm9zZWNvbmRzIGNsb2NrIGRpZmZlcmVuY2VzLgotCQkgKi8KLQkJaWYgKGRlbHRhID4gMipvbmVfdXNlYykgewotCQkJbG9uZyBsb25nIHJlYWxkZWx0YTsKLQotCQkJaWYgKCFidWdneSkgewotCQkJCWJ1Z2d5ID0gMTsKLQkJCQlwcmludGsoIlxuIik7Ci0JCQl9Ci0JCQlyZWFsZGVsdGEgPSBkZWx0YTsKLQkJCWRvX2RpdihyZWFsZGVsdGEsIG9uZV91c2VjKTsKLQkJCWlmICh0c2MudmFsdWVzW2ldIDwgYXZnKQotCQkJCXJlYWxkZWx0YSA9IC1yZWFsZGVsdGE7Ci0KLQkJCWlmIChyZWFsZGVsdGEpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIyVkIGhhZCAlTGQgdXNlY3MgVFNDICIKLQkJCQkJInNrZXcsIGZpeGVkIGl0IHVwLlxuIiwgaSwgcmVhbGRlbHRhKTsKLQkJfQotCX0KLQlpZiAoIWJ1Z2d5KQotCQlwcmludGsoInBhc3NlZC5cbiIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgc3luY2hyb25pemVfdHNjX2FwKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIE5vdCBldmVyeSBjcHUgaXMgb25saW5lIGF0IHRoZSB0aW1lCi0JICogdGhpcyBnZXRzIGNhbGxlZCwgc28gd2UgZmlyc3Qgd2FpdCBmb3IgdGhlIEJQIHRvCi0JICogZmluaXNoIFNNUCBpbml0aWFsaXphdGlvbjoKLQkgKi8KLQl3aGlsZSAoIWF0b21pY19yZWFkKCZ0c2Muc3RhcnRfZmxhZykpCi0JCWNwdV9yZWxheCgpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX0xPT1BTOyBpKyspIHsKLQkJYXRvbWljX2luYygmdHNjLmNvdW50X3N0YXJ0KTsKLQkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2MuY291bnRfc3RhcnQpICE9IG51bV9ib290aW5nX2NwdXMoKSkKLQkJCWNwdV9yZWxheCgpOwotCi0JCXJkdHNjbGwodHNjLnZhbHVlc1tzbXBfcHJvY2Vzc29yX2lkKCldKTsKLQkJaWYgKGkgPT0gTlJfTE9PUFMtMSkKLQkJCXdyaXRlX3RzYygwLCAwKTsKLQotCQlhdG9taWNfaW5jKCZ0c2MuY291bnRfc3RvcCk7Ci0JCXdoaWxlIChhdG9taWNfcmVhZCgmdHNjLmNvdW50X3N0b3ApICE9IG51bV9ib290aW5nX2NwdXMoKSkKLQkJCWNwdV9yZWxheCgpOwotCX0KLX0KLSN1bmRlZiBOUl9MT09QUwotCiBleHRlcm4gdm9pZCBjYWxpYnJhdGVfZGVsYXkodm9pZCk7CiAKIHN0YXRpYyBhdG9taWNfdCBpbml0X2RlYXNzZXJ0ZWQ7CkBAIC00MzgsMjAgKzI4NywxMiBAQAogCS8qCiAJICogU2F2ZSBvdXIgcHJvY2Vzc29yIHBhcmFtZXRlcnMKIAkgKi8KLSAJc21wX3N0b3JlX2NwdV9pbmZvKGNwdWlkKTsKLQotCWRpc2FibGVfQVBJQ190aW1lcigpOworCXNtcF9zdG9yZV9jcHVfaW5mbyhjcHVpZCk7CiAKIAkvKgogCSAqIEFsbG93IHRoZSBtYXN0ZXIgdG8gY29udGludWUuCiAJICovCiAJY3B1X3NldChjcHVpZCwgY3B1X2NhbGxpbl9tYXApOwotCi0JLyoKLQkgKiAgICAgIFN5bmNocm9uaXplIHRoZSBUU0Mgd2l0aCB0aGUgQlAKLQkgKi8KLQlpZiAoY3B1X2hhc190c2MgJiYgY3B1X2toeiAmJiAhdHNjX3N5bmNfZGlzYWJsZWQpCi0JCXN5bmNocm9uaXplX3RzY19hcCgpOwogfQogCiBzdGF0aWMgaW50IGNwdWNvdW50OwpAQCAtNTU0LDEzICszOTUsMTcgQEAKIAlzbXBfY2FsbGluKCk7CiAJd2hpbGUgKCFjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBzbXBfY29tbWVuY2VkX21hc2spKQogCQlyZXBfbm9wKCk7CisJLyoKKwkgKiBDaGVjayBUU0Mgc3luY2hyb25pemF0aW9uIHdpdGggdGhlIEJQOgorCSAqLworCWNoZWNrX3RzY19zeW5jX3RhcmdldCgpOworCiAJc2V0dXBfc2Vjb25kYXJ5X2Nsb2NrKCk7CiAJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfSU9fQVBJQykgewogCQlkaXNhYmxlXzgyNTlBX2lycSgwKTsKIAkJZW5hYmxlX05NSV90aHJvdWdoX0xWVDAoTlVMTCk7CiAJCWVuYWJsZV84MjU5QV9pcnEoMCk7CiAJfQotCWVuYWJsZV9BUElDX3RpbWVyKCk7CiAJLyoKIAkgKiBsb3ctbWVtb3J5IG1hcHBpbmdzIGhhdmUgYmVlbiBjbGVhcmVkLCBmbHVzaCB0aGVtIGZyb20KIAkgKiB0aGUgbG9jYWwgVExCcyB0b28uCkBAIC03NTIsNyArNTk3LDcgQEAKIAkvKgogCSAqIER1ZSB0byB0aGUgUGVudGl1bSBlcnJhdHVtIDNBUC4KIAkgKi8KLQltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisJbWF4bHZ0ID0gbGFwaWNfZ2V0X21heGx2dCgpOwogCWlmIChtYXhsdnQgPiAzKSB7CiAJCWFwaWNfcmVhZF9hcm91bmQoQVBJQ19TUElWKTsKIAkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CkBAIC04NDksNyArNjk0LDcgQEAKIAkgKi8KIAlEcHJpbnRrKCIjc3RhcnR1cCBsb29wczogJWQuXG4iLCBudW1fc3RhcnRzKTsKIAotCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKwltYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CiAKIAlmb3IgKGogPSAxOyBqIDw9IG51bV9zdGFydHM7IGorKykgewogCQlEcHJpbnRrKCJTZW5kaW5nIFNUQVJUVVAgIyVkLlxuIixqKTsKQEAgLTExMjUsOCArOTcwLDYgQEAKIAlpbmZvLmNwdSA9IGNwdTsKIAlJTklUX1dPUksoJmluZm8udGFzaywgZG9fd2FybV9ib290X2NwdSk7CiAKLQl0c2Nfc3luY19kaXNhYmxlZCA9IDE7Ci0KIAkvKiBpbml0IGxvdyBtZW0gbWFwcGluZyAqLwogCWNsb25lX3BnZF9yYW5nZShzd2FwcGVyX3BnX2Rpciwgc3dhcHBlcl9wZ19kaXIgKyBVU0VSX1BHRF9QVFJTLAogCQkJbWluX3QodW5zaWduZWQgbG9uZywgS0VSTkVMX1BHRF9QVFJTLCBVU0VSX1BHRF9QVFJTKSk7CkBAIC0xMTM0LDcgKzk3Nyw2IEBACiAJc2NoZWR1bGVfd29yaygmaW5mby50YXNrKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lKTsKIAotCXRzY19zeW5jX2Rpc2FibGVkID0gMDsKIAl6YXBfbG93X21hcHBpbmdzKCk7CiAJcmV0ID0gMDsKIGV4aXQ6CkBAIC0xMzMxLDEyICsxMTczLDYgQEAKIAlzbXBib290X3NldHVwX2lvX2FwaWMoKTsKIAogCXNldHVwX2Jvb3RfY2xvY2soKTsKLQotCS8qCi0JICogU3luY2hyb25pemUgdGhlIFRTQyB3aXRoIHRoZSBBUAotCSAqLwotCWlmIChjcHVfaGFzX3RzYyAmJiBjcHVjb3VudCAmJiBjcHVfa2h6KQotCQlzeW5jaHJvbml6ZV90c2NfYnAoKTsKIH0KIAogLyogVGhlc2UgYXJlIHdyYXBwZXJzIHRvIGludGVyZmFjZSB0byB0aGUgbmV3IGJvb3QgcHJvY2Vzcy4gIFNvbWVvbmUKQEAgLTE0NzEsOSArMTMwNywxNiBAQAogCX0KIAogCWxvY2FsX2lycV9lbmFibGUoKTsKKwogCXBlcl9jcHUoY3B1X3N0YXRlLCBjcHUpID0gQ1BVX1VQX1BSRVBBUkU7CiAJLyogVW5sZWFzaCB0aGUgQ1BVISAqLwogCWNwdV9zZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spOworCisJLyoKKwkgKiBDaGVjayBUU0Mgc3luY2hyb25pemF0aW9uIHdpdGggdGhlIEFQOgorCSAqLworCWNoZWNrX3RzY19zeW5jX3NvdXJjZShjcHUpOworCiAJd2hpbGUgKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCiAJCWNwdV9yZWxheCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCmluZGV4IGE0ZjY3YTYuLmE1MzUwMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCkBAIC0xNTksMTUgKzE1OSw2IEBACiAgKi8KIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JLyoKLQkgKiBIZXJlIHdlIGFyZSBpbiB0aGUgdGltZXIgaXJxIGhhbmRsZXIuIFdlIGp1c3QgaGF2ZSBpcnFzIGxvY2FsbHkKLQkgKiBkaXNhYmxlZCBidXQgd2UgZG9uJ3Qga25vdyBpZiB0aGUgdGltZXJfYmggaXMgcnVubmluZyBvbiB0aGUgb3RoZXIKLQkgKiBDUFUuIFdlIG5lZWQgdG8gYXZvaWQgdG8gU01QIHJhY2Ugd2l0aCBpdC4gTk9URTogd2UgZG9uJyB0IG5lZWQKLQkgKiB0aGUgaXJxIHZlcnNpb24gb2Ygd3JpdGVfbG9jayBiZWNhdXNlIGFzIGp1c3Qgc2FpZCB3ZSBoYXZlIGlycQotCSAqIGxvY2FsbHkgZGlzYWJsZWQuIC1hcmNhCi0JICovCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0KICNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIAlpZiAodGltZXJfYWNrKSB7CiAJCS8qCkBAIC0xODYsNyArMTc3LDYgQEAKIAogCWRvX3RpbWVyX2ludGVycnVwdF9ob29rKCk7CiAKLQogCWlmIChNQ0FfYnVzKSB7CiAJCS8qIFRoZSBQUy8yIHVzZXMgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdHMuICBZb3UgY2FuJ3QKIAkJdHVybiB0aGVtIG9mZiwgbm9yIHdvdWxkIHlvdSB3YW50IHRvIChhbnkgYXR0ZW1wdCB0bwpAQCAtMjAxLDE4ICsxOTEsMTEgQEAKIAkJb3V0Yl9wKCBpcnFfdnwweDgwLCAweDYxICk7CS8qIHJlc2V0IHRoZSBJUlEgKi8KIAl9CiAKLQl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0JaWYgKHVzaW5nX2FwaWNfdGltZXIpCi0JCXNtcF9zZW5kX3RpbWVyX2Jyb2FkY2FzdF9pcGkoKTsKLSNlbmRpZgotCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiAvKiBub3Qgc3RhdGljOiBuZWVkZWQgYnkgQVBNICovCi11bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCkKK3Vuc2lnbmVkIGxvbmcgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyByZXR2YWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTIyNSw3ICsyMDgsNiBAQAogCiAJcmV0dXJuIHJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0woZ2V0X2Ntb3NfdGltZSk7CiAKIHN0YXRpYyB2b2lkIHN5bmNfY21vc19jbG9jayh1bnNpZ25lZCBsb25nIGR1bW15KTsKIApAQCAtMjc4LDExNCArMjYwLDE2IEBACiAJCW1vZF90aW1lcigmc3luY19jbW9zX3RpbWVyLCBqaWZmaWVzICsgMSk7CiB9CiAKLXN0YXRpYyBsb25nIGNsb2NrX2Ntb3NfZGlmZjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNsZWVwX3N0YXJ0OwotCi1zdGF0aWMgaW50IHRpbWVyX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCS8qCi0JICogRXN0aW1hdGUgdGltZSB6b25lIHNvIHRoYXQgc2V0X3RpbWUgY2FuIHVwZGF0ZSB0aGUgY2xvY2sKLQkgKi8KLQl1bnNpZ25lZCBsb25nIGN0aW1lID0gIGdldF9jbW9zX3RpbWUoKTsKLQotCWNsb2NrX2Ntb3NfZGlmZiA9IC1jdGltZTsKLQljbG9ja19jbW9zX2RpZmYgKz0gZ2V0X3NlY29uZHMoKTsKLQlzbGVlcF9zdGFydCA9IGN0aW1lOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRpbWVyX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBzZWM7Ci0JdW5zaWduZWQgbG9uZyBjdGltZSA9IGdldF9jbW9zX3RpbWUoKTsKLQlsb25nIHNsZWVwX2xlbmd0aCA9IChjdGltZSAtIHNsZWVwX3N0YXJ0KSAqIEhaOwotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQotCWlmIChzbGVlcF9sZW5ndGggPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkNNT1MgY2xvY2sgc2tldyBkZXRlY3RlZCBpbiB0aW1lciByZXN1bWUhXG4iKTsKLQkJLyogVGhlIHRpbWUgYWZ0ZXIgdGhlIHJlc3VtZSBtdXN0IG5vdCBiZSBlYXJsaWVyIHRoYW4gdGhlIHRpbWUKLQkJICogYmVmb3JlIHRoZSBzdXNwZW5kIG9yIHNvbWUgbmFzdHkgdGhpbmdzIHdpbGwgaGFwcGVuCi0JCSAqLwotCQlzbGVlcF9sZW5ndGggPSAwOwotCQljdGltZSA9IHNsZWVwX3N0YXJ0OwotCX0KLSNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgotCWlmIChpc19ocGV0X2VuYWJsZWQoKSkKLQkJaHBldF9yZWVuYWJsZSgpOwotI2VuZGlmCi0Jc2V0dXBfcGl0X3RpbWVyKCk7Ci0KLQlzZWMgPSBjdGltZSArIGNsb2NrX2Ntb3NfZGlmZjsKLQl0cy50dl9zZWMgPSBzZWM7Ci0JdHMudHZfbnNlYyA9IDA7Ci0JZG9fc2V0dGltZW9mZGF5KCZ0cyk7Ci0Jd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7Ci0JamlmZmllc182NCArPSBzbGVlcF9sZW5ndGg7Ci0Jd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKLQl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHRpbWVyX3N5c2NsYXNzID0gewotCS5yZXN1bWUgPSB0aW1lcl9yZXN1bWUsCi0JLnN1c3BlbmQgPSB0aW1lcl9zdXNwZW5kLAotCXNldF9rc2V0X25hbWUoInRpbWVyIiksCi19OwotCi0KLS8qIFhYWCB0aGlzIGRyaXZlcmZzIHN0dWZmIHNob3VsZCBwcm9iYWJseSBnbyBlbHNld2hlcmUgbGF0ZXIgLWpvaG4gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfdGltZXIgPSB7Ci0JLmlkCT0gMCwKLQkuY2xzCT0gJnRpbWVyX3N5c2NsYXNzLAotfTsKLQotc3RhdGljIGludCB0aW1lX2luaXRfZGV2aWNlKHZvaWQpCi17Ci0JaW50IGVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZ0aW1lcl9zeXNjbGFzcyk7Ci0JaWYgKCFlcnJvcikKLQkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV90aW1lcik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1kZXZpY2VfaW5pdGNhbGwodGltZV9pbml0X2RldmljZSk7Ci0KLSNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgogZXh0ZXJuIHZvaWQgKCpsYXRlX3RpbWVfaW5pdCkodm9pZCk7CiAvKiBEdXBsaWNhdGUgb2YgdGltZV9pbml0KCkgYmVsb3csIHdpdGggaHBldF9lbmFibGUgcGFydCBhZGRlZCAqLwogc3RhdGljIHZvaWQgX19pbml0IGhwZXRfdGltZV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzOwotCXRzLnR2X3NlYyA9IGdldF9jbW9zX3RpbWUoKTsKLQl0cy50dl9uc2VjID0gKElOSVRJQUxfSklGRklFUyAlIEhaKSAqIChOU0VDX1BFUl9TRUMgLyBIWik7Ci0KLQlkb19zZXR0aW1lb2ZkYXkoJnRzKTsKLQotCWlmICgoaHBldF9lbmFibGUoKSA+PSAwKSAmJiBocGV0X3VzZV90aW1lcikgewotCQlwcmludGsoIlVzaW5nIEhQRVQgZm9yIGJhc2UtdGltZXJcbiIpOwotCX0KLQorCWlmICghaHBldF9lbmFibGUoKSkKKwkJc2V0dXBfcGl0X3RpbWVyKCk7CiAJZG9fdGltZV9pbml0KCk7CiB9Ci0jZW5kaWYKIAogdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzOwotI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCi0JaWYgKGlzX2hwZXRfY2FwYWJsZSgpKSB7Ci0JCS8qCi0JCSAqIEhQRVQgaW5pdGlhbGl6YXRpb24gbmVlZHMgdG8gZG8gbWVtb3J5LW1hcHBlZCBpby4gU28sIGxldAotCQkgKiB1cyBkbyBhIGxhdGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgbWVtX2luaXQoKS4KLQkJICovCi0JCWxhdGVfdGltZV9pbml0ID0gaHBldF90aW1lX2luaXQ7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQl0cy50dl9zZWMgPSBnZXRfY21vc190aW1lKCk7Ci0JdHMudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOwotCi0JZG9fc2V0dGltZW9mZGF5KCZ0cyk7Ci0KLQlkb190aW1lX2luaXQoKTsKKwlsYXRlX3RpbWVfaW5pdCA9IGhwZXRfdGltZV9pbml0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDcwMmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMKLSAqICBUaGlzIGNvZGUgbGFyZ2VseSBjb3BpZWQgZnJvbSBhcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCi0gKiAgU2VlIHRoYXQgZmlsZSBmb3IgY3JlZGl0cy4KLSAqCi0gKiAgMjAwMy0wNi0zMCAgICBWZW5rYXRlc2ggUGFsbGlwYWRpIC0gQWRkaXRpb25hbCBjaGFuZ2VzIGZvciBIUEVUIHN1cHBvcnQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLQotI2luY2x1ZGUgPGFzbS90aW1lci5oPgotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotCi0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLQotI2luY2x1ZGUgPGFzbS9ocGV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaHBldC5oPgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsJLyogZnNlY3MgLyBIUEVUIGNsb2NrICovCi11bnNpZ25lZCBsb25nIGhwZXRfdGljazsJCS8qIGhwZXQgY2xrcyBjb3VudCBwZXIgdGljayAqLwotdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CQkvKiBocGV0IG1lbW9yeSBtYXAgcGh5c2ljYWwgYWRkcmVzcyAqLwotaW50IGhwZXRfdXNlX3RpbWVyOwotCi1zdGF0aWMgaW50IHVzZV9ocGV0OyAJCS8qIGNhbiBiZSB1c2VkIGZvciBydW50aW1lIGNoZWNrIG9mIGhwZXQgKi8KLXN0YXRpYyBpbnQgYm9vdF9ocGV0X2Rpc2FibGU7IAkvKiBib290dGltZSBvdmVycmlkZSBmb3IgSFBFVCB0aW1lciAqLwotc3RhdGljIHZvaWQgX19pb21lbSAqIGhwZXRfdmlydF9hZGRyZXNzOwkvKiBocGV0IGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgKi8KLQotI2RlZmluZSBGU0VDX1RPX1VTRUMgKDEwMDAwMDAwMDBVTCkKLQotaW50IGhwZXRfcmVhZGwodW5zaWduZWQgbG9uZyBhKQotewotCXJldHVybiByZWFkbChocGV0X3ZpcnRfYWRkcmVzcyArIGEpOwotfQotCi1zdGF0aWMgdm9pZCBocGV0X3dyaXRlbCh1bnNpZ25lZCBsb25nIGQsIHVuc2lnbmVkIGxvbmcgYSkKLXsKLQl3cml0ZWwoZCwgaHBldF92aXJ0X2FkZHJlc3MgKyBhKTsKLX0KLQotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotLyoKLSAqIEhQRVQgY291bnRlcnMgZG9udCB3cmFwIGFyb3VuZCBvbiBldmVyeSB0aWNrLiBUaGV5IGp1c3QgY2hhbmdlIHRoZQotICogY29tcGFyYXRvciB2YWx1ZSBhbmQgY29udGludWUuIE5leHQgdGljayBjYW4gYmUgY2F1Z2h0IGJ5IGNoZWNraW5nCi0gKiBmb3IgYSBjaGFuZ2UgaW4gdGhlIGNvbXBhcmF0b3IgdmFsdWUuIFVzZWQgaW4gYXBpYy5jLgotICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgd2FpdF9ocGV0X3RpY2sodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgc3RhcnRfY21wX3ZhbCwgZW5kX2NtcF92YWw7Ci0KLQlzdGFydF9jbXBfdmFsID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCk7Ci0JZG8gewotCQllbmRfY21wX3ZhbCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApOwotCX0gd2hpbGUgKHN0YXJ0X2NtcF92YWwgPT0gZW5kX2NtcF92YWwpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaHBldF90aW1lcl9zdG9wX3NldF9nbyh1bnNpZ25lZCBsb25nIHRpY2spCi17Ci0JdW5zaWduZWQgaW50IGNmZzsKLQotCS8qCi0JICogU3RvcCB0aGUgdGltZXJzIGFuZCByZXNldCB0aGUgbWFpbiBjb3VudGVyLgotCSAqLwotCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOwotCWNmZyAmPSB+SFBFVF9DRkdfRU5BQkxFOwotCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOwotCWhwZXRfd3JpdGVsKDAsIEhQRVRfQ09VTlRFUik7Ci0JaHBldF93cml0ZWwoMCwgSFBFVF9DT1VOVEVSICsgNCk7Ci0KLQlpZiAoaHBldF91c2VfdGltZXIpIHsKLQkJLyoKLQkJICogU2V0IHVwIHRpbWVyIDAsIGFzIHBlcmlvZGljIHdpdGggZmlyc3QgaW50ZXJydXB0IHRvIGhhcHBlbiBhdAotCQkgKiBocGV0X3RpY2ssIGFuZCBwZXJpb2QgYWxzbyBocGV0X3RpY2suCi0JCSAqLwotCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ0ZHKTsKLQkJY2ZnIHw9IEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl9QRVJJT0RJQyB8Ci0JCSAgICAgICBIUEVUX1ROX1NFVFZBTCB8IEhQRVRfVE5fMzJCSVQ7Ci0JCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMF9DRkcpOwotCi0JCS8qCi0JCSAqIFRoZSBmaXJzdCB3cml0ZSBhZnRlciB3cml0aW5nIFROX1NFVFZBTCB0byB0aGUgY29uZmlnIHJlZ2lzdGVyIHNldHMKLQkJICogdGhlIGNvdW50ZXIgdmFsdWUsIHRoZSBzZWNvbmQgd3JpdGUgc2V0cyB0aGUgdGhyZXNob2xkLgotCQkgKi8KLQkJaHBldF93cml0ZWwodGljaywgSFBFVF9UMF9DTVApOwotCQlocGV0X3dyaXRlbCh0aWNrLCBIUEVUX1QwX0NNUCk7Ci0JfQotCS8qCi0gCSAqIEdvIQotIAkgKi8KLQljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKLQlpZiAoaHBldF91c2VfdGltZXIpCi0JCWNmZyB8PSBIUEVUX0NGR19MRUdBQ1k7Ci0JY2ZnIHw9IEhQRVRfQ0ZHX0VOQUJMRTsKLQlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ2hlY2sgd2hldGhlciBIUEVUIHdhcyBmb3VuZCBieSBBQ1BJIGJvb3QgcGFyc2UuIElmIHllcyBzZXR1cCBIUEVUCi0gKiBjb3VudGVyIDAgZm9yIGtlcm5lbCBiYXNlIHRpbWVyLgotICovCi1pbnQgX19pbml0IGhwZXRfZW5hYmxlKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGlkOwotCXVuc2lnbmVkIGxvbmcgdGlja19mc2VjX2xvdywgdGlja19mc2VjX2hpZ2g7IC8qIHRpY2sgaW4gZmVtdG8gc2VjICovCi0JdW5zaWduZWQgbG9uZyBocGV0X3RpY2tfcmVtOwotCi0JaWYgKGJvb3RfaHBldF9kaXNhYmxlKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoIWhwZXRfYWRkcmVzcykgewotCQlyZXR1cm4gLTE7Ci0JfQotCWhwZXRfdmlydF9hZGRyZXNzID0gaW9yZW1hcF9ub2NhY2hlKGhwZXRfYWRkcmVzcywgSFBFVF9NTUFQX1NJWkUpOwotCS8qCi0JICogUmVhZCB0aGUgcGVyaW9kLCBjb21wdXRlIHRpY2sgYW5kIHF1b3RpZW50LgotCSAqLwotCWlkID0gaHBldF9yZWFkbChIUEVUX0lEKTsKLQotCS8qCi0JICogV2UgYXJlIGNoZWNraW5nIGZvciB2YWx1ZSAnMScgb3IgbW9yZSBpbiBudW1iZXIgZmllbGQgaWYKLQkgKiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQyBpcyBzZXQgYmVjYXVzZSB3ZSB3aWxsIG5lZWQgYW4KLQkgKiBhZGRpdGlvbmFsIHRpbWVyIGZvciBSVEMgZW11bGF0aW9uLgotCSAqIEhvd2V2ZXIsIHdlIGNhbiBkbyB3aXRoIG9uZSB0aW1lciBvdGhlcndpc2UgdXNpbmcgdGhlCi0JICogdGhlIHNpbmdsZSBIUEVUIHRpbWVyIGZvciBzeXN0ZW0gdGltZS4KLQkgKi8KLSNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwotCWlmICghKGlkICYgSFBFVF9JRF9OVU1CRVIpKSB7Ci0JCWlvdW5tYXAoaHBldF92aXJ0X2FkZHJlc3MpOwotCQlocGV0X3ZpcnRfYWRkcmVzcyA9IE5VTEw7Ci0JCXJldHVybiAtMTsKLQl9Ci0jZW5kaWYKLQotCi0JaHBldF9wZXJpb2QgPSBocGV0X3JlYWRsKEhQRVRfUEVSSU9EKTsKLQlpZiAoKGhwZXRfcGVyaW9kIDwgSFBFVF9NSU5fUEVSSU9EKSB8fCAoaHBldF9wZXJpb2QgPiBIUEVUX01BWF9QRVJJT0QpKSB7Ci0JCWlvdW5tYXAoaHBldF92aXJ0X2FkZHJlc3MpOwotCQlocGV0X3ZpcnRfYWRkcmVzcyA9IE5VTEw7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIDY0IGJpdCBtYXRoCi0JICogRmlyc3QgY2hhbmdpbmcgdGljayBpbnRvIGZzZWMKLQkgKiBUaGVuIDY0IGJpdCBkaXYgdG8gZmluZCBudW1iZXIgb2YgaHBldCBjbGsgcGVyIHRpY2sKLQkgKi8KLQlBU01fTVVMNjRfUkVHKHRpY2tfZnNlY19sb3csIHRpY2tfZnNlY19oaWdoLAotCQkJS0VSTkVMX1RJQ0tfVVNFQywgRlNFQ19UT19VU0VDKTsKLQlBU01fRElWNjRfUkVHKGhwZXRfdGljaywgaHBldF90aWNrX3JlbSwKLQkJCWhwZXRfcGVyaW9kLCB0aWNrX2ZzZWNfbG93LCB0aWNrX2ZzZWNfaGlnaCk7Ci0KLQlpZiAoaHBldF90aWNrX3JlbSA+IChocGV0X3BlcmlvZCA+PiAxKSkKLQkJaHBldF90aWNrKys7IC8qIHJvdW5kaW5nIHRoZSByZXN1bHQgKi8KLQotCWhwZXRfdXNlX3RpbWVyID0gaWQgJiBIUEVUX0lEX0xFR1NVUDsKLQotCWlmIChocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljaykpIHsKLQkJaW91bm1hcChocGV0X3ZpcnRfYWRkcmVzcyk7Ci0JCWhwZXRfdmlydF9hZGRyZXNzID0gTlVMTDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXVzZV9ocGV0ID0gMTsKLQotI2lmZGVmCUNPTkZJR19IUEVUCi0JewotCQlzdHJ1Y3QgaHBldF9kYXRhCWhkOwotCQl1bnNpZ25lZCBpbnQgCQludGltZXI7Ci0KLQkJbWVtc2V0KCZoZCwgMCwgc2l6ZW9mIChoZCkpOwotCi0JCW50aW1lciA9IGhwZXRfcmVhZGwoSFBFVF9JRCk7Ci0JCW50aW1lciA9IChudGltZXIgJiBIUEVUX0lEX05VTUJFUikgPj4gSFBFVF9JRF9OVU1CRVJfU0hJRlQ7Ci0JCW50aW1lcisrOwotCi0JCS8qCi0JCSAqIFJlZ2lzdGVyIHdpdGggZHJpdmVyLgotCQkgKiBUaW1lcjAgYW5kIFRpbWVyMSBpcyB1c2VkIGJ5IHBsYXRmb3JtLgotCQkgKi8KLQkJaGQuaGRfcGh5c19hZGRyZXNzID0gaHBldF9hZGRyZXNzOwotCQloZC5oZF9hZGRyZXNzID0gaHBldF92aXJ0X2FkZHJlc3M7Ci0JCWhkLmhkX25pcnFzID0gbnRpbWVyOwotCQloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKLQkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMCk7Ci0jaWZkZWYJQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKLQkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7Ci0jZW5kaWYKLQkJaGQuaGRfaXJxWzBdID0gSFBFVF9MRUdBQ1lfODI1NDsKLQkJaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOwotCQlpZiAobnRpbWVyID4gMikgewotCQkJc3RydWN0IGhwZXQgX19pb21lbQkqaHBldDsKLQkJCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOwotCQkJaW50CQkJaTsKLQotCQkJaHBldCA9IGhwZXRfdmlydF9hZGRyZXNzOwotCi0JCQlmb3IgKGkgPSAyLCB0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsgaSA8IG50aW1lcjsKLQkJCQl0aW1lcisrLCBpKyspCi0JCQkJaGQuaGRfaXJxW2ldID0gKHRpbWVyLT5ocGV0X2NvbmZpZyAmCi0JCQkJCVRuX0lOVF9ST1VURV9DTkZfTUFTSykgPj4KLQkJCQkJVG5fSU5UX1JPVVRFX0NORl9TSElGVDsKLQotCQl9Ci0KLQkJaHBldF9hbGxvYygmaGQpOwotCX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0JaWYgKGhwZXRfdXNlX3RpbWVyKQotCQl3YWl0X3RpbWVyX3RpY2sgPSB3YWl0X2hwZXRfdGljazsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi1pbnQgaHBldF9yZWVuYWJsZSh2b2lkKQotewotCXJldHVybiBocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljayk7Ci19Ci0KLWludCBpc19ocGV0X2VuYWJsZWQodm9pZCkKLXsKLQlyZXR1cm4gdXNlX2hwZXQ7Ci19Ci0KLWludCBpc19ocGV0X2NhcGFibGUodm9pZCkKLXsKLQlpZiAoIWJvb3RfaHBldF9kaXNhYmxlICYmIGhwZXRfYWRkcmVzcykKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGhwZXRfc2V0dXAoY2hhciogc3RyKQotewotCWlmIChzdHIpIHsKLQkJaWYgKCFzdHJuY21wKCJkaXNhYmxlIiwgc3RyLCA3KSkKLQkJCWJvb3RfaHBldF9kaXNhYmxlID0gMTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoImhwZXQ9IiwgaHBldF9zZXR1cCk7Ci0KLSNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwotLyogSFBFVCBpbiBMZWdhY3lSZXBsYWNlbWVudCBNb2RlIGVhdHMgdXAgUlRDIGludGVycnVwdCBsaW5lLiBXaGVuLCBIUEVUCi0gKiBpcyBlbmFibGVkLCB3ZSBzdXBwb3J0IFJUQyBpbnRlcnJ1cHQgZnVuY3Rpb25hbGl0eSBpbiBzb2Z0d2FyZS4KLSAqIFJUQyBoYXMgMyBraW5kcyBvZiBpbnRlcnJ1cHRzOgotICogMSkgVXBkYXRlIEludGVycnVwdCAtIGdlbmVyYXRlIGFuIGludGVycnVwdCwgZXZlcnkgc2VjLCB3aGVuIFJUQyBjbG9jawotICogICAgaXMgdXBkYXRlZAotICogMikgQWxhcm0gSW50ZXJydXB0IC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0IGF0IGEgc3BlY2lmaWMgdGltZSBvZiBkYXkKLSAqIDMpIFBlcmlvZGljIEludGVycnVwdCAtIGdlbmVyYXRlIHBlcmlvZGljIGludGVycnVwdCwgd2l0aCBmcmVxdWVuY2llcwotICogICAgMkh6LTgxOTJIeiAoMkh6LTY0SHogZm9yIG5vbi1yb290IHVzZXIpIChhbGwgZnJlcXMgaW4gcG93ZXJzIG9mIDIpCi0gKiAoMSkgYW5kICgyKSBhYm92ZSBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgcG9sbGluZyBhdCBhIGZyZXF1ZW5jeSBvZgotICogNjQgSHouIFRoZSBleGFjdCBmcmVxdWVuY3kgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIGFjY3VyYWN5IGFuZCBpbnRlcnJ1cHQKLSAqIG92ZXJoZWFkLiAoREVGQVVMVF9SVENfSU5UX0ZSRVEpCi0gKiBGb3IgKDMpLCB3ZSB1c2UgaW50ZXJydXB0cyBhdCA2NEh6IG9yIHVzZXIgc3BlY2lmaWVkIHBlcmlvZGljCi0gKiBmcmVxdWVuY3ksIHdoaWNoZXZlciBpcyBoaWdoZXIuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgotI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgotCi0jZGVmaW5lIERFRkFVTFRfUlRDX0lOVF9GUkVRIAk2NAotI2RlZmluZSBSVENfTlVNX0lOVFMgCQkxCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIFVJRV9vbjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHByZXZfdXBkYXRlX3NlYzsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgQUlFX29uOwotc3RhdGljIHN0cnVjdCBydGNfdGltZSBhbGFybV90aW1lOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfb247Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROwotc3RhdGljIHVuc2lnbmVkIGxvbmcgUElFX2NvdW50OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3J0Y19pbnRfZnJlcTsgLyogUlRDIGludGVycnVwdCBmcmVxdWVuY3kgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaHBldF90MV9jbXA7IC8qIGNhY2hlZCBjb21wYXJhdG9yIHJlZ2lzdGVyICovCi0KLS8qCi0gKiBUaW1lciAxIGZvciBSVEMsIHdlIGRvIG5vdCB1c2UgcGVyaW9kaWMgaW50ZXJydXB0IGZlYXR1cmUsCi0gKiBldmVuIGlmIEhQRVQgc3VwcG9ydHMgcGVyaW9kaWMgaW50ZXJydXB0cyBvbiBUaW1lciAxLgotICogVGhlIHJlYXNvbiBiZWluZywgdG8gc2V0IHVwIGEgcGVyaW9kaWMgaW50ZXJydXB0IGluIEhQRVQsIHdlIG5lZWQgdG8KLSAqIHN0b3AgdGhlIG1haW4gY291bnRlci4gQW5kIGlmIHdlIGRvIHRoYXQgZXZlcnl0aW1lIHNvbWVvbmUgZGlhYmxlcy9lbmFibGVzCi0gKiBSVEMsIHdlIHdpbGwgaGF2ZSBhZHZlcnNlIGVmZmVjdCBvbiBtYWluIGtlcm5lbCB0aW1lciBydW5uaW5nIG9uIFRpbWVyIDAuCi0gKiBTbywgZm9yIHRoZSB0aW1lIGJlaW5nLCBzaW11bGF0ZSB0aGUgcGVyaW9kaWMgaW50ZXJydXB0IGluIHNvZnR3YXJlLgotICoKLSAqIGhwZXRfcnRjX3RpbWVyX2luaXQoKSBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBkdXJpbmcgc3Vic2VxdWVudAotICogaW50ZXJ1cHB0cyByZWluaXQgaGFwcGVucyB0aHJvdWdoIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpLgotICovCi1pbnQgaHBldF9ydGNfdGltZXJfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBjZmcsIGNudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0JLyoKLQkgKiBTZXQgdGhlIGNvdW50ZXIgMSBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHRzLgotCSAqLwotCWlmIChQSUVfb24gJiYgKFBJRV9mcmVxID4gREVGQVVMVF9SVENfSU5UX0ZSRVEpKQotCQlocGV0X3J0Y19pbnRfZnJlcSA9IFBJRV9mcmVxOwotCWVsc2UKLQkJaHBldF9ydGNfaW50X2ZyZXEgPSBERUZBVUxUX1JUQ19JTlRfRlJFUTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQljbnQgKz0gKChocGV0X3RpY2sqSFopL2hwZXRfcnRjX2ludF9mcmVxKTsKLQlocGV0X3dyaXRlbChjbnQsIEhQRVRfVDFfQ01QKTsKLQlocGV0X3QxX2NtcCA9IGNudDsKLQotCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOwotCWNmZyAmPSB+SFBFVF9UTl9QRVJJT0RJQzsKLQljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOwotCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBjZmcsIGNudCwgdGlja3NfcGVyX2ludCwgbG9zdF9pbnRzOwotCi0JaWYgKHVubGlrZWx5KCEoUElFX29uIHwgQUlFX29uIHwgVUlFX29uKSkpIHsKLQkJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7Ci0JCWNmZyAmPSB+SFBFVF9UTl9FTkFCTEU7Ci0JCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKFBJRV9vbiAmJiAoUElFX2ZyZXEgPiBERUZBVUxUX1JUQ19JTlRfRlJFUSkpCi0JCWhwZXRfcnRjX2ludF9mcmVxID0gUElFX2ZyZXE7Ci0JZWxzZQotCQlocGV0X3J0Y19pbnRfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROwotCi0JLyogSXQgaXMgbW9yZSBhY2N1cmF0ZSB0byB1c2UgdGhlIGNvbXBhcmF0b3IgdmFsdWUgdGhhbiBjdXJyZW50IGNvdW50LiovCi0JdGlja3NfcGVyX2ludCA9IGhwZXRfdGljayAqIEhaIC8gaHBldF9ydGNfaW50X2ZyZXE7Ci0JaHBldF90MV9jbXAgKz0gdGlja3NfcGVyX2ludDsKLQlocGV0X3dyaXRlbChocGV0X3QxX2NtcCwgSFBFVF9UMV9DTVApOwotCi0JLyoKLQkgKiBJZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2FzIGRlbGF5ZWQgdG9vIGxvbmcsIHRoZSB3cml0ZSBhYm92ZSB0cmllcwotCSAqIHRvIHNjaGVkdWxlIHRoZSBuZXh0IGludGVycnVwdCBpbiB0aGUgcGFzdCBhbmQgdGhlIGhhcmR3YXJlIHdvdWxkCi0JICogbm90IGludGVycnVwdCB1bnRpbCB0aGUgY291bnRlciBoYWQgd3JhcHBlZCBhcm91bmQuCi0JICogU28gd2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBjb21wYXJhdG9yIHdhc24ndCBzZXQgdG8gYSBwYXN0IHRpbWUuCi0JICovCi0JY250ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCWlmICh1bmxpa2VseSgoaW50KShjbnQgLSBocGV0X3QxX2NtcCkgPiAwKSkgewotCQlsb3N0X2ludHMgPSAoY250IC0gaHBldF90MV9jbXApIC8gdGlja3NfcGVyX2ludCArIDE7Ci0JCS8qIE1ha2Ugc3VyZSB0aGF0LCBldmVuIHdpdGggdGhlIHRpbWUgbmVlZGVkIHRvIGV4ZWN1dGUKLQkJICogdGhpcyBjb2RlLCB0aGUgbmV4dCBzY2hlZHVsZWQgaW50ZXJydXB0IGhhcyBiZWVuIG1vdmVkCi0JCSAqIGJhY2sgdG8gdGhlIGZ1dHVyZTogKi8KLQkJbG9zdF9pbnRzKys7Ci0KLQkJaHBldF90MV9jbXAgKz0gbG9zdF9pbnRzICogdGlja3NfcGVyX2ludDsKLQkJaHBldF93cml0ZWwoaHBldF90MV9jbXAsIEhQRVRfVDFfQ01QKTsKLQotCQlpZiAoUElFX29uKQotCQkJUElFX2NvdW50ICs9IGxvc3RfaW50czsKLQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3Qgc29tZSBpbnRlcnJ1cHRzIGF0ICVsZEh6LlxuIiwKLQkJICAgICAgIGhwZXRfcnRjX2ludF9mcmVxKTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBjYWxsZWQgZnJvbSBydGMgZHJpdmVyLgotICogUmV0dXJuIDAgaWYgSFBFVCBpcyBub3QgYmVpbmcgdXNlZC4KLSAqIE90aGVyd2lzZSBkbyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgYW5kIHJldHVybiAxLgotICovCi1pbnQgaHBldF9tYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYml0X21hc2sgJiBSVENfVUlFKQotCQlVSUVfb24gPSAwOwotCWlmIChiaXRfbWFzayAmIFJUQ19QSUUpCi0JCVBJRV9vbiA9IDA7Ci0JaWYgKGJpdF9tYXNrICYgUlRDX0FJRSkKLQkJQUlFX29uID0gMDsKLQotCXJldHVybiAxOwotfQotCi1pbnQgaHBldF9zZXRfcnRjX2lycV9iaXQodW5zaWduZWQgbG9uZyBiaXRfbWFzaykKLXsKLQlpbnQgdGltZXJfaW5pdF9yZXFkID0gMDsKLQotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JaWYgKCEoUElFX29uIHwgQUlFX29uIHwgVUlFX29uKSkKLQkJdGltZXJfaW5pdF9yZXFkID0gMTsKLQotCWlmIChiaXRfbWFzayAmIFJUQ19VSUUpIHsKLQkJVUlFX29uID0gMTsKLQl9Ci0JaWYgKGJpdF9tYXNrICYgUlRDX1BJRSkgewotCQlQSUVfb24gPSAxOwotCQlQSUVfY291bnQgPSAwOwotCX0KLQlpZiAoYml0X21hc2sgJiBSVENfQUlFKSB7Ci0JCUFJRV9vbiA9IDE7Ci0JfQotCi0JaWYgKHRpbWVyX2luaXRfcmVxZCkKLQkJaHBldF9ydGNfdGltZXJfaW5pdCgpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBocGV0X3NldF9hbGFybV90aW1lKHVuc2lnbmVkIGNoYXIgaHJzLCB1bnNpZ25lZCBjaGFyIG1pbiwgdW5zaWduZWQgY2hhciBzZWMpCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlhbGFybV90aW1lLnRtX2hvdXIgPSBocnM7Ci0JYWxhcm1fdGltZS50bV9taW4gPSBtaW47Ci0JYWxhcm1fdGltZS50bV9zZWMgPSBzZWM7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGhwZXRfc2V0X3BlcmlvZGljX2ZyZXEodW5zaWduZWQgbG9uZyBmcmVxKQotewotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JUElFX2ZyZXEgPSBmcmVxOwotCVBJRV9jb3VudCA9IDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGhwZXRfcnRjX2Ryb3BwZWRfaXJxKHZvaWQpCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaXJxcmV0dXJuX3QgaHBldF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgY3Vycl90aW1lOwotCXVuc2lnbmVkIGxvbmcgcnRjX2ludF9mbGFnID0gMDsKLQlpbnQgY2FsbF9ydGNfaW50ZXJydXB0ID0gMDsKLQotCWhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpOwotCi0JaWYgKFVJRV9vbiB8IEFJRV9vbikgewotCQlydGNfZ2V0X3J0Y190aW1lKCZjdXJyX3RpbWUpOwotCX0KLQlpZiAoVUlFX29uKSB7Ci0JCWlmIChjdXJyX3RpbWUudG1fc2VjICE9IHByZXZfdXBkYXRlX3NlYykgewotCQkJLyogU2V0IHVwZGF0ZSBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLwotCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKLQkJCXJ0Y19pbnRfZmxhZyA9IFJUQ19VRjsKLQkJCXByZXZfdXBkYXRlX3NlYyA9IGN1cnJfdGltZS50bV9zZWM7Ci0JCX0KLQl9Ci0JaWYgKFBJRV9vbikgewotCQlQSUVfY291bnQrKzsKLQkJaWYgKFBJRV9jb3VudCA+PSBocGV0X3J0Y19pbnRfZnJlcS9QSUVfZnJlcSkgewotCQkJLyogU2V0IHBlcmlvZGljIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCi0JCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOwotCQkJcnRjX2ludF9mbGFnIHw9IFJUQ19QRjsKLQkJCVBJRV9jb3VudCA9IDA7Ci0JCX0KLQl9Ci0JaWYgKEFJRV9vbikgewotCQlpZiAoKGN1cnJfdGltZS50bV9zZWMgPT0gYWxhcm1fdGltZS50bV9zZWMpICYmCi0JCSAgICAoY3Vycl90aW1lLnRtX21pbiA9PSBhbGFybV90aW1lLnRtX21pbikgJiYKLQkJICAgIChjdXJyX3RpbWUudG1faG91ciA9PSBhbGFybV90aW1lLnRtX2hvdXIpKSB7Ci0JCQkvKiBTZXQgYWxhcm0gaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KLQkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7Ci0JCQlydGNfaW50X2ZsYWcgfD0gUlRDX0FGOwotCQl9Ci0JfQotCWlmIChjYWxsX3J0Y19pbnRlcnJ1cHQpIHsKLQkJcnRjX2ludF9mbGFnIHw9IChSVENfSVJRRiB8IChSVENfTlVNX0lOVFMgPDwgOCkpOwotCQlydGNfaW50ZXJydXB0KHJ0Y19pbnRfZmxhZywgZGV2X2lkKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMgYi9hcmNoL2kzODYva2VybmVsL3RzYy5jCmluZGV4IDQ2Zjc1MmEuLjMwODJhNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90c2MuYwpAQCAtNjAsMTIgKzYwLDYgQEAKIAlyZXR1cm4gdHNjX3Vuc3RhYmxlOwogfQogCi12b2lkIG1hcmtfdHNjX3Vuc3RhYmxlKHZvaWQpCi17Ci0JdHNjX3Vuc3RhYmxlID0gMTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG1hcmtfdHNjX3Vuc3RhYmxlKTsKLQogLyogQWNjZWxsZXJhdG9ycyBmb3Igc2NoZWRfY2xvY2soKQogICogY29udmVydCBmcm9tIGN5Y2xlcyg2NGJpdHMpID0+IG5hbm9zZWNvbmRzICg2NGJpdHMpCiAgKiAgYmFzaWMgZXF1YXRpb246CkBAIC0yMjIsMzQgKzIxNiw2IEBACiAKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIAotc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfaW5pdCA9IDA7Ci1zdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGNwdWZyZXFfZGVsYXllZF9nZXRfd29yazsKLQotc3RhdGljIHZvaWQgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXVuc2lnbmVkIGludCBjcHU7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJY3B1ZnJlcV9nZXQoY3B1KTsKLQotCWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMDsKLX0KLQotLyoKLSAqIGlmIHdlIG5vdGljZSBjcHVmcmVxIG9kZG5lc3MsIHNjaGVkdWxlIGEgY2FsbCB0byBjcHVmcmVxX2dldCgpIGFzIGl0IHRyaWVzCi0gKiB0byB2ZXJpZnkgdGhlIENQVSBmcmVxdWVuY3kgdGhlIHRpbWluZyBjb3JlIHRoaW5rcyB0aGUgQ1BVIGlzIHJ1bm5pbmcKLSAqIGF0IGlzIHN0aWxsIGNvcnJlY3QuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpCi17Ci0JaWYgKGNwdWZyZXFfaW5pdCAmJiAhY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQpIHsKLQkJY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAxOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hlY2tpbmcgaWYgQ1BVIGZyZXF1ZW5jeSBjaGFuZ2VkLlxuIik7Ci0JCXNjaGVkdWxlX3dvcmsoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yayk7Ci0JfQotfQotCiAvKgogICogaWYgdGhlIENQVSBmcmVxdWVuY3kgaXMgc2NhbGVkLCBUU0MtYmFzZWQgZGVsYXlzIHdpbGwgbmVlZCBhIGRpZmZlcmVudAogICogbG9vcHNfcGVyX2ppZmZ5IHZhbHVlIHRvIGZ1bmN0aW9uIHByb3Blcmx5LgpAQCAtMzEzLDE3ICsyNzksOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3RzYyh2b2lkKQogewotCWludCByZXQ7Ci0KLQlJTklUX1dPUksoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yaywgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQpOwotCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKLQkJCQkJQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKLQlpZiAoIXJldCkKLQkJY3B1ZnJlcV9pbml0ID0gMTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKKwkJCQkJIENQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CiB9Ci0KIGNvcmVfaW5pdGNhbGwoY3B1ZnJlcV90c2MpOwogCiAjZW5kaWYKQEAgLTMzMSw3ICsyODksNiBAQAogLyogY2xvY2sgc291cmNlIGNvZGUgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VycmVudF90c2Nfa2h6ID0gMDsKLXN0YXRpYyBpbnQgdHNjX3VwZGF0ZV9jYWxsYmFjayh2b2lkKTsKIAogc3RhdGljIGN5Y2xlX3QgcmVhZF90c2Modm9pZCkKIHsKQEAgLTM0OSwzNyArMzA2LDI4IEBACiAJLm1hc2sJCQk9IENMT0NLU09VUkNFX01BU0soNjQpLAogCS5tdWx0CQkJPSAwLCAvKiB0byBiZSBzZXQgKi8KIAkuc2hpZnQJCQk9IDIyLAotCS51cGRhdGVfY2FsbGJhY2sJPSB0c2NfdXBkYXRlX2NhbGxiYWNrLAotCS5pc19jb250aW51b3VzCQk9IDEsCisJLmZsYWdzCQkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUyB8CisJCQkJICBDTE9DS19TT1VSQ0VfTVVTVF9WRVJJRlksCiB9OwogCi1zdGF0aWMgaW50IHRzY191cGRhdGVfY2FsbGJhY2sodm9pZCkKK3ZvaWQgbWFya190c2NfdW5zdGFibGUodm9pZCkKIHsKLQlpbnQgY2hhbmdlID0gMDsKLQotCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgc3dpdGNoIHRvIHRoZSBzYWZlIGNsb2Nrc291cmNlOiAqLwotCWlmIChjbG9ja3NvdXJjZV90c2MucmF0aW5nICE9IDAgJiYgY2hlY2tfdHNjX3Vuc3RhYmxlKCkpIHsKLQkJY2xvY2tzb3VyY2VfdHNjLnJhdGluZyA9IDA7Ci0JCWNsb2Nrc291cmNlX3Jlc2VsZWN0KCk7Ci0JCWNoYW5nZSA9IDE7CisJaWYgKCF0c2NfdW5zdGFibGUpIHsKKwkJdHNjX3Vuc3RhYmxlID0gMTsKKwkJLyogQ2FuIGJlIGNhbGxlZCBiZWZvcmUgcmVnaXN0cmF0aW9uICovCisJCWlmIChjbG9ja3NvdXJjZV90c2MubXVsdCkKKwkJCWNsb2Nrc291cmNlX2NoYW5nZV9yYXRpbmcoJmNsb2Nrc291cmNlX3RzYywgMCk7CisJCWVsc2UKKwkJCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSAwOwogCX0KLQotCS8qIG9ubHkgdXBkYXRlIGlmIHRzY19raHogaGFzIGNoYW5nZWQ6ICovCi0JaWYgKGN1cnJlbnRfdHNjX2toeiAhPSB0c2Nfa2h6KSB7Ci0JCWN1cnJlbnRfdHNjX2toeiA9IHRzY19raHo7Ci0JCWNsb2Nrc291cmNlX3RzYy5tdWx0ID0gY2xvY2tzb3VyY2Vfa2h6Mm11bHQoY3VycmVudF90c2Nfa2h6LAotCQkJCQkJCWNsb2Nrc291cmNlX3RzYy5zaGlmdCk7Ci0JCWNoYW5nZSA9IDE7Ci0JfQotCi0JcmV0dXJuIGNoYW5nZTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hcmtfdHNjX3Vuc3RhYmxlKTsKIAogc3RhdGljIGludCBfX2luaXQgZG1pX21hcmtfdHNjX3Vuc3RhYmxlKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQogewogCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IG1hcmtpbmcgVFNDIHVuc3RhYmxlLlxuIiwKIAkJICAgICAgIGQtPmlkZW50KTsKLQltYXJrX3RzY191bnN0YWJsZSgpOworCXRzY191bnN0YWJsZSA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM5Niw2NiArMzQ0LDQ1IEBACiAJIHt9CiB9OwogCi0jZGVmaW5lIFRTQ19GUkVRX0NIRUNLX0lOVEVSVkFMICgxMCpNU0VDX1BFUl9TRUMpIC8qIDEwc2VjIGluIE1TICovCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdmVyaWZ5X3RzY19mcmVxX3RpbWVyOwotCi0vKiBYWFggLSBQcm9iYWJseSBzaG91bGQgYWRkIGxvY2tpbmcgKi8KLXN0YXRpYyB2b2lkIHZlcmlmeV90c2NfZnJlcSh1bnNpZ25lZCBsb25nIHVudXNlZCkKLXsKLQlzdGF0aWMgdTY0IGxhc3RfdHNjOwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKLQotCXU2NCBub3dfdHNjLCBpbnRlcnZhbF90c2M7Ci0JdW5zaWduZWQgbG9uZyBub3dfamlmZmllcywgaW50ZXJ2YWxfamlmZmllczsKLQotCi0JaWYgKGNoZWNrX3RzY191bnN0YWJsZSgpKQotCQlyZXR1cm47Ci0KLQlyZHRzY2xsKG5vd190c2MpOwotCW5vd19qaWZmaWVzID0gamlmZmllczsKLQotCWlmICghbGFzdF9qaWZmaWVzKSB7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWludGVydmFsX2ppZmZpZXMgPSBub3dfamlmZmllcyAtIGxhc3RfamlmZmllczsKLQlpbnRlcnZhbF90c2MgPSBub3dfdHNjIC0gbGFzdF90c2M7Ci0JaW50ZXJ2YWxfdHNjICo9IEhaOwotCWRvX2RpdihpbnRlcnZhbF90c2MsIGNwdV9raHoqMTAwMCk7Ci0KLQlpZiAoaW50ZXJ2YWxfdHNjIDwgKGludGVydmFsX2ppZmZpZXMgKiAzIC8gNCkpIHsKLQkJcHJpbnRrKCJUU0MgYXBwZWFycyB0byBiZSBydW5uaW5nIHNsb3dseS4gIgotCQkJIk1hcmtpbmcgaXQgYXMgdW5zdGFibGVcbiIpOwotCQltYXJrX3RzY191bnN0YWJsZSgpOwotCQlyZXR1cm47Ci0JfQotCi1vdXQ6Ci0JbGFzdF90c2MgPSBub3dfdHNjOwotCWxhc3RfamlmZmllcyA9IG5vd19qaWZmaWVzOwotCS8qIHNldCB1cyB1cCB0byBnbyBvZmYgb24gdGhlIG5leHQgaW50ZXJ2YWw6ICovCi0JbW9kX3RpbWVyKCZ2ZXJpZnlfdHNjX2ZyZXFfdGltZXIsCi0JCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFRTQ19GUkVRX0NIRUNLX0lOVEVSVkFMKSk7Ci19Ci0KIC8qCiAgKiBNYWtlIGFuIGVkdWNhdGVkIGd1ZXNzIGlmIHRoZSBUU0MgaXMgdHJ1c3R3b3J0aHkgYW5kIHN5bmNocm9uaXplZAogICogb3ZlciBhbGwgQ1BVcy4KICAqLwotc3RhdGljIF9faW5pdCBpbnQgdW5zeW5jaHJvbml6ZWRfdHNjKHZvaWQpCitfX2NwdWluaXQgaW50IHVuc3luY2hyb25pemVkX3RzYyh2b2lkKQogeworCWlmICghY3B1X2hhc190c2MgfHwgdHNjX3Vuc3RhYmxlKQorCQlyZXR1cm4gMTsKIAkvKgogCSAqIEludGVsIHN5c3RlbXMgYXJlIG5vcm1hbGx5IGFsbCBzeW5jaHJvbml6ZWQuCiAJICogRXhjZXB0aW9ucyBtdXN0IG1hcmsgVFNDIGFzIHVuc3RhYmxlOgogCSAqLwotCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkKLSAJCXJldHVybiAwOwotCi0JLyogYXNzdW1lIG11bHRpIHNvY2tldCBzeXN0ZW1zIGFyZSBub3Qgc3luY2hyb25pemVkOiAqLwotIAlyZXR1cm4gbnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDE7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMKSB7CisJCS8qIGFzc3VtZSBtdWx0aSBzb2NrZXQgc3lzdGVtcyBhcmUgbm90IHN5bmNocm9uaXplZDogKi8KKwkJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPiAxKQorCQkJdHNjX3Vuc3RhYmxlID0gMTsKKwl9CisJcmV0dXJuIHRzY191bnN0YWJsZTsKIH0KIAorLyoKKyAqIEdlb2RlX0xYIC0gdGhlIE9MUEMgQ1BVIGhhcyBhIHBvc3NpYmx5IGEgdmVyeSByZWxpYWJsZSBUU0MKKyAqLworI2lmZGVmIENPTkZJR19NR0VPREVfTFgKKy8qIFJUU0MgY291bnRzIGR1cmluZyBzdXNwZW5kICovCisjZGVmaW5lIFJUU0NfU1VTUCAweDEwMAorCitzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfZ2VvZGVfdHNjX3JlbGlhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlyZG1zcmwoTVNSX0dFT0RFX0JVU0NPTlRfQ09ORjAsIHZhbCk7CisJaWYgKCh2YWwgJiBSVFNDX1NVU1ApKQorCQljbG9ja3NvdXJjZV90c2MuZmxhZ3MgJj0gfkNMT0NLX1NPVVJDRV9NVVNUX1ZFUklGWTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfZ2VvZGVfdHNjX3JlbGlhYmxlKHZvaWQpIHsgfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfdHNjX2Nsb2Nrc291cmNlKHZvaWQpCiB7CiAKQEAgLTQ2MywyMCArMzkwLDE2IEBACiAJCS8qIGNoZWNrIGJsYWNrbGlzdCAqLwogCQlkbWlfY2hlY2tfc3lzdGVtKGJhZF90c2NfZG1pX3RhYmxlKTsKIAotCQlpZiAodW5zeW5jaHJvbml6ZWRfdHNjKCkpIC8qIG1hcmsgdW5zdGFibGUgaWYgdW5zeW5jZWQgKi8KLQkJCW1hcmtfdHNjX3Vuc3RhYmxlKCk7CisJCXVuc3luY2hyb25pemVkX3RzYygpOworCQljaGVja19nZW9kZV90c2NfcmVsaWFibGUoKTsKIAkJY3VycmVudF90c2Nfa2h6ID0gdHNjX2toejsKIAkJY2xvY2tzb3VyY2VfdHNjLm11bHQgPSBjbG9ja3NvdXJjZV9raHoybXVsdChjdXJyZW50X3RzY19raHosCiAJCQkJCQkJY2xvY2tzb3VyY2VfdHNjLnNoaWZ0KTsKIAkJLyogbG93ZXIgdGhlIHJhdGluZyBpZiB3ZSBhbHJlYWR5IGtub3cgaXRzIHVuc3RhYmxlOiAqLwotCQlpZiAoY2hlY2tfdHNjX3Vuc3RhYmxlKCkpCisJCWlmIChjaGVja190c2NfdW5zdGFibGUoKSkgewogCQkJY2xvY2tzb3VyY2VfdHNjLnJhdGluZyA9IDA7Ci0KLQkJaW5pdF90aW1lcigmdmVyaWZ5X3RzY19mcmVxX3RpbWVyKTsKLQkJdmVyaWZ5X3RzY19mcmVxX3RpbWVyLmZ1bmN0aW9uID0gdmVyaWZ5X3RzY19mcmVxOwotCQl2ZXJpZnlfdHNjX2ZyZXFfdGltZXIuZXhwaXJlcyA9Ci0JCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhUU0NfRlJFUV9DSEVDS19JTlRFUlZBTCk7Ci0JCWFkZF90aW1lcigmdmVyaWZ5X3RzY19mcmVxX3RpbWVyKTsKKwkJCWNsb2Nrc291cmNlX3RzYy5mbGFncyAmPSB+Q0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVM7CisJCX0KIAogCQlyZXR1cm4gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX3RzYyk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90c2Nfc3luYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90c2Nfc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNDI0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RzY19zeW5jLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3g4Nl82NC9rZXJuZWwvdHNjX3N5bmMuYyIKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1pdGltZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC92bWl0aW1lLmMKaW5kZXggMmUyZDhkYi4uNzZkMmFkYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC92bWl0aW1lLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92bWl0aW1lLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCS5tYXNrCQkJPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKIAkubXVsdAkJCT0gMCwgLyogdG8gYmUgc2V0ICovCiAJLnNoaWZ0CQkJPSAyMiwKLQkuaXNfY29udGludW91cwkJPSAxLAorCS5mbGFncwkJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYyBiL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYwppbmRleCBjYzJmNTE5Li5jNzg4MTYyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jCkBAIC03OSw3ICs3OSwxMiBAQAogewogfQogCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnEwICA9IHsgdGltZXJfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCBDUFVfTUFTS19OT05FLCAidGltZXIiLCBOVUxMLCBOVUxMfTsKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgID0geworCS5oYW5kbGVyID0gdGltZXJfaW50ZXJydXB0LAorCS5mbGFncyA9IElSUUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HLAorCS5tYXNrID0gQ1BVX01BU0tfTk9ORSwKKwkubmFtZSA9ICJ0aW1lciIKK307CiAKIC8qKgogICogdGltZV9pbml0X2hvb2sgLSBkbyBhbnkgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb25zIGZvciB0aGUgc3lzdGVtIHRpbWVyLgpAQCAtOTAsNiArOTUsNyBAQAogICoqLwogdm9pZCBfX2luaXQgdGltZV9pbml0X2hvb2sodm9pZCkKIHsKKwlpcnEwLm1hc2sgPSBjcHVtYXNrX29mX2NwdSgwKTsKIAlzZXR1cF9pcnEoMCwgJmlycTApOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvS2NvbmZpZyBiL2FyY2gvaWE2NC9LY29uZmlnCmluZGV4IGRiMTg1ZjMuLmQ1MWYwZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9LY29uZmlnCkBAIC0yMiw2ICsyMiw3IEBACiAKIGNvbmZpZyA2NEJJVAogCWJvb2wKKwlzZWxlY3QgQVRBX05PTlNUQU5EQVJEIGlmIEFUQQogCWRlZmF1bHQgeQogCiBjb25maWcgWk9ORV9ETUEKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKaW5kZXggOTE5N2Q3Yi4uMzU0OWM5NCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKQEAgLTY1MSw3ICs2NTEsNyBAQAogCSAqIGluZm9ybWF0aW9uIC0tIHRoZSBzdWNjZXNzb3IgdG8gTVBTIHRhYmxlcy4KIAkgKi8KIAotCWlmIChhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX01BRFQsIGFjcGlfcGFyc2VfbWFkdCkgPCAxKSB7CisJaWYgKGFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfTUFEVCwgYWNwaV9wYXJzZV9tYWR0KSkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDYW4ndCBmaW5kIE1BRFRcbiIpOwogCQlnb3RvIHNraXBfbWFkdDsKIAl9CkBAIC03MDIsNyArNzAyLDcgQEAKIAkgKiBnZXRzIGludGVycnVwdHMgc3VjaCBhcyBwb3dlciBhbmQgc2xlZXAgYnV0dG9ucy4gIElmIGl0J3Mgbm90CiAJICogb24gYSBMZWdhY3kgaW50ZXJydXB0LCBpdCBuZWVkcyB0byBiZSBzZXR1cC4KIAkgKi8KLQlpZiAoYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19GQURULCBhY3BpX3BhcnNlX2ZhZHQpIDwgMSkKKwlpZiAoYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19GQURULCBhY3BpX3BhcnNlX2ZhZHQpKQogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDYW4ndCBmaW5kIEZBRFRcbiIpOwogCiAjaWZkZWYgQ09ORklHX1NNUApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMgYi9hcmNoL21pcHMva2VybmVsL3RpbWUuYwppbmRleCA1NDVmY2JjLi5lNWU1NmJkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RpbWUuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfbWlwcyA9IHsKIAkubmFtZQkJPSAiTUlQUyIsCiAJLm1hc2sJCT0gMHhmZmZmZmZmZiwKLQkuaXNfY29udGludW91cwk9IDEsCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGluaXRfbWlwc19jbG9ja3NvdXJjZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKaW5kZXggMzlkYjEyOC4uNWU1YzBlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCkBAIC0zMDUsOCArMzA1LDYgQEAKIAlsZXZlbCA9ICEhKGxldmVsX21hc2tbaHcgPj4gNV0gJiAoMVVMIDw8IChodyAmIDB4MWYpKSk7CiAJaWYgKGxldmVsKQogCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0xFVkVMOwotCWVsc2UKLQkJZGVzYy0+c3RhdHVzIHw9IElSUV9ERUxBWUVEX0RJU0FCTEU7CiAJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZwbWFjX3BpYywgbGV2ZWwgPwogCQkJCSBoYW5kbGVfbGV2ZWxfaXJxIDogaGFuZGxlX2VkZ2VfaXJxKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKaW5kZXggM2I5MWYyNy4uZWU5ZmQ3YiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCS5tYXNrCQk9IC0xVUxMLAogCS5tdWx0CQk9IDEwMDAsCiAJLnNoaWZ0CQk9IDEyLAotCS5pc19jb250aW51b3VzCT0gMSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCA0ZjM4OTEyLi40ZDE2ZDg5IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC0xMzUsMTIgKzEzNSw2IEBACiAJICBNb3JlIGluZm9ybWF0aW9uIChoYXJkd2FyZSBvbmx5KSBhdAogCSAgPGh0dHA6Ly93d3cuaHAuY29tL2pvcm5hZGEvPi4KIAotY29uZmlnIFNIX0VDMzEwNAotCWJvb2wgIkVDMzEwNCIKLQloZWxwCi0JICBTZWxlY3QgRUMzMTA0IGlmIGNvbmZpZ3VyaW5nIGZvciBhIHN5c3RlbSB3aXRoIGFuIEVjbGlwc2UKLQkgIEludGVybmF0aW9uYWwgRUMzMTA0IGNoaXAsIGUuZy4gdGhlIEhhcnJpcyBBRDIwMDAuCi0KIGNvbmZpZyBTSF9TQVRVUk4KIAlib29sICJTYXR1cm4iCiAJc2VsZWN0IENQVV9TVUJUWVBFX1NINzYwNApAQCAtMTU2LDkgKzE1MCw2IEBACiAJICA8aHR0cDovL3d3dy5tMTduLm9yZy9saW51eC1zaC9kcmVhbWNhc3QvPi4gIFRoZXJlIGlzIGEKIAkgIERyZWFtY2FzdCBwcm9qZWN0IGlzIGF0IDxodHRwOi8vbGludXhkYy5zb3VyY2Vmb3JnZS5uZXQvPi4KIAotY29uZmlnIFNIX0JJR1NVUgotCWJvb2wgIkJpZ1N1ciIKLQogY29uZmlnIFNIX01QQzEyMTEKIAlib29sICJJbnRlcmZhY2UgTVBDMTIxMSIKIAloZWxwCkBAIC00ODEsNiArNDcyLDcgQEAKIAogY29uZmlnIFNIX0NMS19NRAogCWludCAiQ1BVIE1vZGUgUGluIFNldHRpbmciCisJZGVmYXVsdCAwCiAJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc2MTkgfHwgQ1BVX1NVQlRZUEVfU0g3MjA2CiAJaGVscAogCSAgTUQyIC0gTUQwIHBpbiBzZXR0aW5nLgpAQCAtNTEwLDggKzUwMiw5IEBACiBjb25maWcgSEVBUlRCRUFUCiAJYm9vbCAiSGVhcnRiZWF0IExFRCIKIAlkZXBlbmRzIG9uIFNIX01QQzEyMTEgfHwgU0hfU0gwMyB8fCBcCi0JCSAgIFNIX0JJR1NVUiB8fCBTT0xVVElPTl9FTkdJTkUgfHwgXAotCQkgICBTSF9SVFM3NzUxUjJEIHx8IFNIX1NINDIwMl9NSUNST0RFViB8fCBTSF9MQU5ESVNLCisJCSAgIFNPTFVUSU9OX0VOR0lORSB8fCBcCisJCSAgIFNIX1JUUzc3NTFSMkQgfHwgU0hfU0g0MjAyX01JQ1JPREVWIHx8IFNIX0xBTkRJU0sgfHwgXAorCQkgICBTSF9SNzc4MFJQCiAJaGVscAogCSAgVXNlIHRoZSBwb3dlci1vbiBMRUQgb24geW91ciBtYWNoaW5lIGFzIGEgbG9hZCBtZXRlci4gIFRoZSBleGFjdAogCSAgYmVoYXZpb3IgaXMgcGxhdGZvcm0tZGVwZW5kZW50LCBidXQgbm9ybWFsbHkgdGhlIGZsYXNoIGZyZXF1ZW5jeSBpcwpAQCAtNTk2LDYgKzU4OSw4IEBACiBjb25maWcgWkVST19QQUdFX09GRlNFVAogCWhleCAiWmVybyBwYWdlIG9mZnNldCIKIAlkZWZhdWx0ICIweDAwMDA0MDAwIiBpZiBTSF9NUEMxMjExIHx8IFNIX1NIMDMKKwlkZWZhdWx0ICIweDAwMDEwMDAwIiBpZiBQQUdFX1NJWkVfNjRLQgorCWRlZmF1bHQgIjB4MDAwMDIwMDAiIGlmIFBBR0VfU0laRV84S0IKIAlkZWZhdWx0ICIweDAwMDAxMDAwIgogCWhlbHAKIAkgIFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBvZmZzZXQgb2YgemVybyBwYWdlLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggYzFkYmVmMi4uYmQ5YjE3MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC0zNSw2ICszNSw3IEBACiBlbmRpZgogCiBjZmxhZ3MtJChDT05GSUdfQ1BVX1NIMikJCTo9IC1tMgorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDJBKQkJOj0gLW0yYSAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEtbm9mcHUsKQogY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAtbTMKIGNmbGFncy0kKENPTkZJR19DUFVfU0g0KQkJOj0gLW00IFwKIAkkKGNhbGwgY2Mtb3B0aW9uLC1tbm8taW1wbGljaXQtZnAsLW00LW5vZnB1KQpAQCAtOTMsMTAgKzk0LDggQEAKIG1hY2hkaXItJChDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczNDMKIG1hY2hkaXItJChDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83MzE4MAogbWFjaGRpci0kKENPTkZJR19TSF9IUDZYWCkJCQk6PSBocDZ4eAotbWFjaGRpci0kKENPTkZJR19TSF9FQzMxMDQpCQkJOj0gZWMzMTA0CiBtYWNoZGlyLSQoQ09ORklHX1NIX1NBVFVSTikJCQk6PSBzYXR1cm4KIG1hY2hkaXItJChDT05GSUdfU0hfRFJFQU1DQVNUKQkJCTo9IGRyZWFtY2FzdAotbWFjaGRpci0kKENPTkZJR19TSF9CSUdTVVIpCQkJOj0gYmlnc3VyCiBtYWNoZGlyLSQoQ09ORklHX1NIX01QQzEyMTEpCQkJOj0gbXBjMTIxMQogbWFjaGRpci0kKENPTkZJR19TSF9TSDAzKQkJCTo9IHNoMDMKIG1hY2hkaXItJChDT05GSUdfU0hfU0VDVVJFRURHRTU0MTApCQk6PSBzbmFwZ2VhcgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY5NDk3Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIEJpZ1N1ciBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCi0jCi0KLW9iai15CSA6PSBzZXR1cC5vIGlvLm8gaXJxLm8gbGVkLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lvLmMgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwNzFmOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lvLmMKLSAqCi0gKiBCeSBEdXN0aW4gTWNJbnRpcmUgKGR1c3RpbkBzZW5zb3JpYS5jb20pIChjKTIwMDEKLSAqIERlcml2ZWQgZnJvbSBpb19oZDY0NDY1LmgsIHdoaWNoIGJvcmUgdGhlIG1lc3NhZ2U6Ci0gKiBCeSBHcmVnIEJhbmtzIDxnYmFua3NAcG9ja2V0cGVuZ3VpbnMuY29tPgotICogKGMpIDIwMDAgUG9ja2V0UGVuZ3VpbnMgSW5jLiAKLSAqIGFuZCBmcm9tIGlvX2hkNjQ0NjEuaCwgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqIENvcHlyaWdodCAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBJTyBmdW5jdGlvbnMgZm9yIGEgSGl0YWNoaSBCaWcgU3VyIEV2YWx1YXRpb24gQm9hcmQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2JpZ3N1ci9iaWdzdXIuaD4KLQotLyogTG93IGlvbWFwIG1hcHMgcG9ydCAwLTFLIHRvIGFkZHJlc3NlcyBpbiA4Ynl0ZSBjaHVua3MgKi8KLSNkZWZpbmUgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCAweDQwMAotI2RlZmluZSBCSUdTVVJfSU9NQVBfTE9fU0hJRlQJMwotI2RlZmluZSBCSUdTVVJfSU9NQVBfTE9fTUFTSwkoKDE8PEJJR1NVUl9JT01BUF9MT19TSElGVCktMSkKLSNkZWZpbmUgQklHU1VSX0lPTUFQX0xPX05NQVAJKEJJR1NVUl9JT01BUF9MT19USFJFU0g+PkJJR1NVUl9JT01BUF9MT19TSElGVCkKLXN0YXRpYyB1MzIgYmlnc3VyX2lvbWFwX2xvW0JJR1NVUl9JT01BUF9MT19OTUFQXTsKLXN0YXRpYyB1OCBiaWdzdXJfaW9tYXBfbG9fc2hpZnRbQklHU1VSX0lPTUFQX0xPX05NQVBdOwotCi0vKiBIaWdoIGlvbWFwIG1hcHMgcG9ydCAxSy02NEsgdG8gYWRkcmVzc2VzIGluIDFLIGNodW5rcyAqLwotI2RlZmluZSBCSUdTVVJfSU9NQVBfSElfVEhSRVNIIDB4MTAwMDAKLSNkZWZpbmUgQklHU1VSX0lPTUFQX0hJX1NISUZUCTEwCi0jZGVmaW5lIEJJR1NVUl9JT01BUF9ISV9NQVNLCSgoMTw8QklHU1VSX0lPTUFQX0hJX1NISUZUKS0xKQotI2RlZmluZSBCSUdTVVJfSU9NQVBfSElfTk1BUAkoQklHU1VSX0lPTUFQX0hJX1RIUkVTSD4+QklHU1VSX0lPTUFQX0hJX1NISUZUKQotc3RhdGljIHUzMiBiaWdzdXJfaW9tYXBfaGlbQklHU1VSX0lPTUFQX0hJX05NQVBdOwotc3RhdGljIHU4IGJpZ3N1cl9pb21hcF9oaV9zaGlmdFtCSUdTVVJfSU9NQVBfSElfTk1BUF07Ci0KLXZvaWQgYmlnc3VyX3BvcnRfbWFwKHUzMiBiYXNlcG9ydCwgdTMyIG5wb3J0cywgdTMyIGFkZHIsIHU4IHNoaWZ0KQotewotCXUzMiBwb3J0LCBlbmRwb3J0ID0gYmFzZXBvcnQgKyBucG9ydHM7Ci0KLQlwcl9kZWJ1ZygiYmlnc3VyX3BvcnRfbWFwKGJhc2U9MHglMHgsIG49MHglMHgsIGFkZHI9MHglMDh4KVxuIiwKLQkJIGJhc2Vwb3J0LCBucG9ydHMsIGFkZHIpOwotCSAgICAKLQlmb3IgKHBvcnQgPSBiYXNlcG9ydCA7Ci0JICAgICBwb3J0IDwgZW5kcG9ydCAmJiBwb3J0IDwgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCA7Ci0JICAgICBwb3J0ICs9ICgxPDxCSUdTVVJfSU9NQVBfTE9fU0hJRlQpKSB7Ci0JICAgIAlwcl9kZWJ1ZygiICAgIG1hcGxvWzB4JXhdID0gMHglMDh4XG4iLCBwb3J0LCBhZGRyKTsKLSAgICAJICAgIGJpZ3N1cl9pb21hcF9sb1twb3J0Pj5CSUdTVVJfSU9NQVBfTE9fU0hJRlRdID0gYWRkcjsKLSAgICAJICAgIGJpZ3N1cl9pb21hcF9sb19zaGlmdFtwb3J0Pj5CSUdTVVJfSU9NQVBfTE9fU0hJRlRdID0gc2hpZnQ7Ci0JICAgIAlhZGRyICs9ICgxPDwoQklHU1VSX0lPTUFQX0xPX1NISUZUKSk7Ci0JfQotCi0JZm9yIChwb3J0ID0gbWF4X3QodTMyLCBiYXNlcG9ydCwgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCk7Ci0JICAgICBwb3J0IDwgZW5kcG9ydCAmJiBwb3J0IDwgQklHU1VSX0lPTUFQX0hJX1RIUkVTSCA7Ci0JICAgICBwb3J0ICs9ICgxPDxCSUdTVVJfSU9NQVBfSElfU0hJRlQpKSB7Ci0JICAgIAlwcl9kZWJ1ZygiICAgIG1hcGhpWzB4JXhdID0gMHglMDh4XG4iLCBwb3J0LCBhZGRyKTsKLSAgICAJICAgIGJpZ3N1cl9pb21hcF9oaVtwb3J0Pj5CSUdTVVJfSU9NQVBfSElfU0hJRlRdID0gYWRkcjsKLSAgICAJICAgIGJpZ3N1cl9pb21hcF9oaV9zaGlmdFtwb3J0Pj5CSUdTVVJfSU9NQVBfSElfU0hJRlRdID0gc2hpZnQ7Ci0JICAgIAlhZGRyICs9ICgxPDwoQklHU1VSX0lPTUFQX0hJX1NISUZUKSk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChiaWdzdXJfcG9ydF9tYXApOwotCi12b2lkIGJpZ3N1cl9wb3J0X3VubWFwKHUzMiBiYXNlcG9ydCwgdTMyIG5wb3J0cykKLXsKLQl1MzIgcG9ydCwgZW5kcG9ydCA9IGJhc2Vwb3J0ICsgbnBvcnRzOwotCQotCXByX2RlYnVnKCJiaWdzdXJfcG9ydF91bm1hcChiYXNlPTB4JTB4LCBuPTB4JTB4KVxuIiwgYmFzZXBvcnQsIG5wb3J0cyk7Ci0KLQlmb3IgKHBvcnQgPSBiYXNlcG9ydCA7Ci0JICAgICBwb3J0IDwgZW5kcG9ydCAmJiBwb3J0IDwgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCA7Ci0JICAgICBwb3J0ICs9ICgxPDxCSUdTVVJfSU9NQVBfTE9fU0hJRlQpKSB7Ci0JCWJpZ3N1cl9pb21hcF9sb1twb3J0Pj5CSUdTVVJfSU9NQVBfTE9fU0hJRlRdID0gMDsKLQl9Ci0KLQlmb3IgKHBvcnQgPSBtYXhfdCh1MzIsIGJhc2Vwb3J0LCBCSUdTVVJfSU9NQVBfTE9fVEhSRVNIKTsKLQkgICAgIHBvcnQgPCBlbmRwb3J0ICYmIHBvcnQgPCBCSUdTVVJfSU9NQVBfSElfVEhSRVNIIDsKLQkgICAgIHBvcnQgKz0gKDE8PEJJR1NVUl9JT01BUF9ISV9TSElGVCkpIHsKLQkJYmlnc3VyX2lvbWFwX2hpW3BvcnQ+PkJJR1NVUl9JT01BUF9ISV9TSElGVF0gPSAwOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woYmlnc3VyX3BvcnRfdW5tYXApOwotCi11bnNpZ25lZCBsb25nIGJpZ3N1cl9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSAwOwotCXVuc2lnbmVkIGNoYXIgc2hpZnQ7Ci0KLQkvKiBQaHlzaWNhbCBhZGRyZXNzIG5vdCBpbiBQMCwgZG8gbm90aGluZyAqLwotCWlmIChQWFNFRyhwb3J0KSkgewotCQlhZGRyID0gcG9ydDsKLQkvKiBwaHlzaWNhbCBhZGRyZXNzIGluIFAwLCBtYXAgdG8gUDIgKi8KLQl9IGVsc2UgaWYgKHBvcnQgPj0gMHgzMDAwMCkgewotCQlhZGRyID0gUDJTRUdBRERSKHBvcnQpOwotCS8qIEJpZyBTdXIgSS9PICsgSEQ2NDQ2NSByZWdpc3RlcnMgMHgxMDAwMC0weDMwMDAwICovCi0JfSBlbHNlIGlmIChwb3J0ID49IEJJR1NVUl9JT01BUF9ISV9USFJFU0gpIHsKLQkJYWRkciA9IEJJR1NVUl9JTlRFUk5BTF9CQVNFICsgKHBvcnQgLSBCSUdTVVJfSU9NQVBfSElfVEhSRVNIKTsKLQkvKiBIYW5kbGUgcmVtYXBwaW5nIG9mIGhpZ2ggSU8vUENJIElPIHBvcnRzICovCi0JfSBlbHNlIGlmIChwb3J0ID49IEJJR1NVUl9JT01BUF9MT19USFJFU0gpIHsKLQkJYWRkciA9IGJpZ3N1cl9pb21hcF9oaVtwb3J0ID4+IEJJR1NVUl9JT01BUF9ISV9TSElGVF07Ci0JCXNoaWZ0ID0gYmlnc3VyX2lvbWFwX2hpX3NoaWZ0W3BvcnQgPj4gQklHU1VSX0lPTUFQX0hJX1NISUZUXTsKLQotCQlpZiAoYWRkciAhPSAwKQotCQkJYWRkciArPSAocG9ydCAmIEJJR1NVUl9JT01BUF9ISV9NQVNLKSA8PCBzaGlmdDsKLQl9IGVsc2UgewotCQkvKiBIYW5kbGUgcmVtYXBwaW5nIG9mIGxvdyBJTyBwb3J0cyAqLwotCQlhZGRyID0gYmlnc3VyX2lvbWFwX2xvW3BvcnQgPj4gQklHU1VSX0lPTUFQX0xPX1NISUZUXTsKLQkJc2hpZnQgPSBiaWdzdXJfaW9tYXBfbG9fc2hpZnRbcG9ydCA+PiBCSUdTVVJfSU9NQVBfTE9fU0hJRlRdOwotCi0JCWlmIChhZGRyICE9IDApCi0JCQlhZGRyICs9IChwb3J0ICYgQklHU1VSX0lPTUFQX0xPX01BU0spIDw8IHNoaWZ0OwotCX0KLQotCXByX2RlYnVnKCIlcygweCUwOGx4KSA9IDB4JTA4bHhcbiIsIF9fRlVOQ1RJT05fXywgcG9ydCwgYWRkcik7Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWIwNGRhLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKgotICoKLSAqIEJ5IER1c3RpbiBNY0ludGlyZSAoZHVzdGluQHNlbnNvcmlhLmNvbSkgKGMpMjAwMQotICoKLSAqIFNldHVwIGFuZCBJUlEgaGFuZGxpbmcgY29kZSBmb3IgdGhlIEhENjQ0NjUgY29tcGFuaW9uIGNoaXAuCi0gKiBieSBHcmVnIEJhbmtzIDxnYmFua3NAcG9ja2V0cGVuZ3VpbnMuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDAwIFBvY2tldFBlbmd1aW5zIEluYwotICoKLSAqIERlcml2ZWQgZnJvbSBzZXR1cF9oZDY0NDY1LmMgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqIEdyZWcgQmFua3MgPGdiYW5rc0Bwb2NrZXRwZW5ndWlucy5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgUG9ja2V0UGVuZ3VpbnMgSW5jIGFuZAotICogQ29weXJpZ2h0IChDKSAyMDAwIFlBRUdBU0hJIFRha2VzaGkKLSAqIGFuZCBzZXR1cF9jcXJlZWsuYyB3aGljaCBib3JlIG1lc3NhZ2U6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgIE5paWJlIFl1dGFrYQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBJUlEgZnVuY3Rpb25zIGZvciBhIEhpdGFjaGkgQmlnIFN1ciBFdmFsdWF0aW9uIEJvYXJkLgotICoKLSAqLwotI3VuZGVmIERFQlVHCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jaW5jbHVkZSA8YXNtL2JpZ3N1ci9pby5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDY1L2hkNjQ0NjUuaD4KLSNpbmNsdWRlIDxhc20vYmlnc3VyL2JpZ3N1ci5oPgotCi0vLyNkZWZpbmUgQklHU1VSX0RFQlVHIDMKLSN1bmRlZiBCSUdTVVJfREVCVUcKLQotI2lmZGVmIEJJR1NVUl9ERUJVRwotI2RlZmluZSBESVBSSU5USyhuLCBhcmdzLi4uKSAgICBpZiAoQklHU1VSX0RFQlVHPihuKSkgcHJpbnRrKGFyZ3MpCi0jZWxzZQotI2RlZmluZSBESVBSSU5USyhuLCBhcmdzLi4uKQotI2VuZGlmIC8qIEJJR1NVUl9ERUJVRyAqLwotCi0jaWZkZWYgQ09ORklHX0hENjQ0NjUKLWV4dGVybiBpbnQgaGQ2NDQ2NV9pcnFfZGVtdXgoaW50IGlycSk7Ci0jZW5kaWYgLyogQ09ORklHX0hENjQ0NjUgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8vICAgICAgICAgICAgICBCaWcgU3VyIENQTEQgSVJRIFJvdXRpbmVzCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyogTGV2ZWwgMSBJUlEgcm91dGluZXMgKi8KLXN0YXRpYyB2b2lkIGRpc2FibGVfYmlnc3VyX2wxaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbWFzazsKLSAgICAgICAgdW5zaWduZWQgaW50IG1hc2tfcG9ydCA9ICgoaXJxIC0gQklHU1VSX0lSUV9MT1cpLzgpID8gQklHU1VSX0lSTE1SMSA6IEJJR1NVUl9JUkxNUjA7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgYml0ID0gICgxIDw8ICgoaXJxIC0gTUdBVEVfSVJRX0xPVyklOCkgKTsKLQotICAgICAgICBpZihpcnEgPj0gQklHU1VSX0lSUV9MT1cgJiYgaXJxIDwgQklHU1VSX0lSUV9ISUdIKSB7Ci0gICAgICAgICAgICAgICAgcHJfZGVidWcoIkRpc2FibGUgTDEgSVJRICVkXG4iLCBpcnEpOwotICAgICAgICAgICAgICAgIERJUFJJTlRLKDIsImRpc2FibGVfYmlnc3VyX2wxaXJxOiBJTVI9MHglMDh4IG1hc2s9MHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcG9ydCwgYml0KTsKLQotICAgICAgICAgICAgICAgIC8qIERpc2FibGUgSVJRIC0gc2V0IG1hc2sgYml0ICovCi0gICAgICAgICAgICAgICAgbWFzayA9IGluYihtYXNrX3BvcnQpIHwgYml0OwotICAgICAgICAgICAgICAgIG91dGIobWFzaywgbWFza19wb3J0KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcHJfZGVidWcoImRpc2FibGVfYmlnc3VyX2wxaXJxOiBJbnZhbGlkIElSUSAlZFxuIiwgaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX2JpZ3N1cl9sMWlycSh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICB1bnNpZ25lZCBjaGFyIG1hc2s7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtYXNrX3BvcnQgPSAoKGlycSAtIEJJR1NVUl9JUlFfTE9XKS84KSA/IEJJR1NVUl9JUkxNUjEgOiBCSUdTVVJfSVJMTVIwOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGJpdCA9ICAoMSA8PCAoKGlycSAtIE1HQVRFX0lSUV9MT1cpJTgpICk7Ci0KLSAgICAgICAgaWYoaXJxID49IEJJR1NVUl9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl9JUlFfSElHSCkgewotICAgICAgICAgICAgICAgIHByX2RlYnVnKCJFbmFibGUgTDEgSVJRICVkXG4iLCBpcnEpOwotICAgICAgICAgICAgICAgIERJUFJJTlRLKDIsImVuYWJsZV9iaWdzdXJfbDFpcnE6IElNUj0weCUwOHggbWFzaz0weCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFza19wb3J0LCBiaXQpOwotICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBMMSBJUlEgLSBjbGVhciBtYXNrIGJpdCAqLwotICAgICAgICAgICAgICAgIG1hc2sgPSBpbmIobWFza19wb3J0KSAmIH5iaXQ7Ci0gICAgICAgICAgICAgICAgb3V0YihtYXNrLCBtYXNrX3BvcnQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwcl9kZWJ1ZygiZW5hYmxlX2JpZ3N1cl9sMWlycTogSW52YWxpZCBJUlEgJWRcbiIsIGlycSk7Ci19Ci0KLQotLyogTGV2ZWwgMiBpcnEgbWFza3MgYW5kIHJlZ2lzdGVycyBmb3IgTDIgZGVjb2RpbmcgKi8KLS8qIExldmVsMiBiaXRtYXNrcyBmb3IgZWFjaCBsZXZlbCAxIElSUSAqLwotY29uc3QgdTMyIGJpZ3N1cl9sMmlycV9tYXNrW10gPQotICAgIHsweDQwLDB4ODAsMHgwOCwweDAxLDB4MDEsMHgzQywweDNFLDB4RkYsMHg0MCwweDgwLDB4MDYsMHgwM307Ci0vKiBMZXZlbDIgdG8gSVNSW25dIG1hcCBmb3IgZWFjaCBsZXZlbCAxIElSUSAqLwotY29uc3QgdTMyIGJpZ3N1cl9sMmlycV9yZWdbXSAgPQotICAgIHsgICAyLCAgIDIsICAgMywgICAzLCAgIDEsICAgMiwgICAxLCAgIDAsICAgMSwgICAxLCAgIDMsICAgMn07Ci0vKiBMZXZlbDIgdG8gTGV2ZWwgMSBJUlEgbWFwICovCi1jb25zdCB1MzIgYmlnc3VyX2wyX2wxX21hcFtdICA9Ci0gICAgezcsNyw3LDcsNyw3LDcsNywgNCw2LDYsNiw2LDYsOCw5LCAxMSwxMSw1LDUsNSw1LDAsMSwgMywxMCwxMCwyLC0xLC0xLC0xLC0xfTsKLS8qIElSUSBpbmFjdGl2ZSBsZXZlbCAoaGlnaCBvciBsb3cpICovCi1jb25zdCB1MzIgYmlnc3VyX2wyX2luYWN0dl9zdGF0ZVtdICA9ICAgezB4MDAsIDB4QkUsIDB4RkMsIDB4Rjd9OwotCi0vKiBDUExEIGV4dGVybmFsIHN0YXR1cyBhbmQgbWFzayByZWdpc3RlcnMgYmFzZSBhbmQgb2Zmc2V0cyAqLwotc3RhdGljIGNvbnN0IHUzMiBpc3JfYmFzZSA9IEJJR1NVUl9JUlEwOwotc3RhdGljIGNvbnN0IHUzMiBpc3Jfb2Zmc2V0ID0gQklHU1VSX0lSUTAgLSBCSUdTVVJfSVJRMTsKLXN0YXRpYyBjb25zdCB1MzIgaW1yX2Jhc2UgPSBCSUdTVVJfSU1SMDsKLXN0YXRpYyBjb25zdCB1MzIgaW1yX29mZnNldCA9IEJJR1NVUl9JTVIwIC0gQklHU1VSX0lNUjE7Ci0KLSNkZWZpbmUgUkVHX05VTShpcnEpICAoKGlycS1CSUdTVVJfMk5ETFZMX0lSUV9MT1cpLzggKQotCi0vKiBMZXZlbCAyIElSUSByb3V0aW5lcyAqLwotc3RhdGljIHZvaWQgZGlzYWJsZV9iaWdzdXJfbDJpcnEodW5zaWduZWQgaW50IGlycSkKLXsKLSAgICAgICAgdW5zaWduZWQgY2hhciBtYXNrOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGJpdCA9IDEgPDwgKChpcnEtQklHU1VSXzJORExWTF9JUlFfTE9XKSU4KTsKLSAgICAgICAgdW5zaWduZWQgaW50IG1hc2tfcG9ydCA9IGltcl9iYXNlIC0gUkVHX05VTShpcnEpKmltcl9vZmZzZXQ7Ci0KLQlpZihpcnEgPj0gQklHU1VSXzJORExWTF9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl8yTkRMVkxfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICBwcl9kZWJ1ZygiRGlzYWJsZSBMMiBJUlEgJWRcbiIsIGlycSk7Ci0gICAgICAgICAgICAgICAgRElQUklOVEsoMiwiZGlzYWJsZV9iaWdzdXJfbDJpcnE6IElNUj0weCUwOHggbWFzaz0weCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFza19wb3J0LCBiaXQpOwotCi0gICAgICAgICAgICAgICAgLyogRGlzYWJsZSBMMiBJUlEgLSBzZXQgbWFzayBiaXQgKi8KLSAgICAgICAgICAgICAgICBtYXNrID0gaW5iKG1hc2tfcG9ydCkgfCBiaXQ7Ci0gICAgICAgICAgICAgICAgb3V0YihtYXNrLCBtYXNrX3BvcnQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwcl9kZWJ1ZygiZGlzYWJsZV9iaWdzdXJfbDJpcnE6IEludmFsaWQgSVJRICVkXG4iLCBpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfYmlnc3VyX2wyaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbWFzazsKLSAgICAgICAgdW5zaWduZWQgY2hhciBiaXQgPSAxIDw8ICgoaXJxLUJJR1NVUl8yTkRMVkxfSVJRX0xPVyklOCk7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtYXNrX3BvcnQgPSBpbXJfYmFzZSAtIFJFR19OVU0oaXJxKSppbXJfb2Zmc2V0OwotCi0JaWYoaXJxID49IEJJR1NVUl8yTkRMVkxfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfMk5ETFZMX0lSUV9ISUdIKSB7Ci0gICAgICAgICAgICAgICAgcHJfZGVidWcoIkVuYWJsZSBMMiBJUlEgJWRcbiIsIGlycSk7Ci0gICAgICAgICAgICAgICAgRElQUklOVEsoMiwiZW5hYmxlX2JpZ3N1cl9sMmlycTogSU1SPTB4JTA4eCBtYXNrPTB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3BvcnQsIGJpdCk7Ci0KLSAgICAgICAgICAgICAgICAvKiBFbmFibGUgTDIgSVJRIC0gY2xlYXIgbWFzayBiaXQgKi8KLSAgICAgICAgICAgICAgICBtYXNrID0gaW5iKG1hc2tfcG9ydCkgJiB+Yml0OwotICAgICAgICAgICAgICAgIG91dGIobWFzaywgbWFza19wb3J0KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcHJfZGVidWcoImVuYWJsZV9iaWdzdXJfbDJpcnE6IEludmFsaWQgSVJRICVkXG4iLCBpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfYmlnc3VyKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHByX2RlYnVnKCJtYXNrX2FuZF9hY2tfYmlnc3VyIElSUSAlZFxuIiwgaXJxKTsKLSAgICAgICAgaWYoaXJxID49IEJJR1NVUl9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl9JUlFfSElHSCkKLSAgICAgICAgICAgICAgICBkaXNhYmxlX2JpZ3N1cl9sMWlycShpcnEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGlzYWJsZV9iaWdzdXJfbDJpcnEoaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgZW5kX2JpZ3N1cl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLSAgICAgICAgcHJfZGVidWcoImVuZF9iaWdzdXJfaXJxIElSUSAlZFxuIiwgaXJxKTsKLSAgICAgICAgaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpIHsKLSAgICAgICAgICAgICAgICBpZihpcnEgPj0gQklHU1VSX0lSUV9MT1cgJiYgaXJxIDwgQklHU1VSX0lSUV9ISUdIKQotICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2JpZ3N1cl9sMWlycShpcnEpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZV9iaWdzdXJfbDJpcnEoaXJxKTsKLSAgICAgICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfYmlnc3VyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICB1OCBtYXNrOwotICAgICAgICB1MzIgcmVnOwotCi0gICAgICAgIHByX2RlYnVnKCJzdGFydHVwX2JpZ3N1cl9pcnEgSVJRICVkXG4iLCBpcnEpOwotCi0gICAgICAgIGlmKGlycSA+PSBCSUdTVVJfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICAvKiBFbmFibGUgdGhlIEwxIElSUSAqLwotICAgICAgICAgICAgICAgIGVuYWJsZV9iaWdzdXJfbDFpcnEoaXJxKTsKLSAgICAgICAgICAgICAgICAvKiBFbmFibGUgYWxsIEwyIElSUXMgaW4gdGhpcyBMMSBJUlEgKi8KLSAgICAgICAgICAgICAgICBtYXNrID0gfihiaWdzdXJfbDJpcnFfbWFza1tpcnEtQklHU1VSX0lSUV9MT1ddKTsKLSAgICAgICAgICAgICAgICByZWcgPSBpbXJfYmFzZSAtIGJpZ3N1cl9sMmlycV9yZWdbaXJxLUJJR1NVUl9JUlFfTE9XXSAqIGltcl9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbWFzayAmPSBpbmIocmVnKTsKLSAgICAgICAgICAgICAgICBvdXRiKG1hc2sscmVnKTsKLSAgICAgICAgICAgICAgICBESVBSSU5USygyLCJzdGFydHVwX2JpZ3N1cl9pcnE6IElNUj0weCUwOHggbWFzaz0weCV4XG4iLHJlZyxpbmIocmVnKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogRW5hYmxlIHRoZSBMMiBJUlEgLSBjbGVhciBtYXNrIGJpdCAqLwotICAgICAgICAgICAgICAgIGVuYWJsZV9iaWdzdXJfbDJpcnEoaXJxKTsKLSAgICAgICAgICAgICAgICAvKiBFbmFibGUgdGhlIEwxIGJpdCBtYXNraW5nIHRoaXMgTDIgSVJRICovCi0gICAgICAgICAgICAgICAgZW5hYmxlX2JpZ3N1cl9sMWlycShiaWdzdXJfbDJfbDFfbWFwW2lycS1CSUdTVVJfMk5ETFZMX0lSUV9MT1ddKTsKLSAgICAgICAgICAgICAgICBESVBSSU5USygyLCJzdGFydHVwX2JpZ3N1cl9pcnE6IEwxPSVkIEwyPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYmlnc3VyX2wyX2wxX21hcFtpcnEtQklHU1VSXzJORExWTF9JUlFfTE9XXSxpcnEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaHV0ZG93bl9iaWdzdXJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHByX2RlYnVnKCJzaHV0ZG93bl9iaWdzdXJfaXJxIElSUSAlZFxuIiwgaXJxKTsKLSAgICAgICAgaWYoaXJxID49IEJJR1NVUl9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl9JUlFfSElHSCkKLSAgICAgICAgICAgICAgICBkaXNhYmxlX2JpZ3N1cl9sMWlycShpcnEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGlzYWJsZV9iaWdzdXJfbDJpcnEoaXJxKTsKLX0KLQotLyogRGVmaW5lIHRoZSBJUlEgc3RydWN0dXJlcyBmb3IgdGhlIEwxIGFuZCBMMiBJUlEgdHlwZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgYmlnc3VyX2wxaXJxX3R5cGUgPSB7Ci0JLnR5cGVuYW1lICA9ICJCaWdTdXItQ1BMRC1MZXZlbDEtSVJRIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfYmlnc3VyX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9iaWdzdXJfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfYmlnc3VyX2wxaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9iaWdzdXJfbDFpcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja19iaWdzdXIsCi0JLmVuZCA9IGVuZF9iaWdzdXJfaXJxCi19OwotCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGJpZ3N1cl9sMmlycV90eXBlID0gewotCS50eXBlbmFtZSAgPSAiQmlnU3VyLUNQTEQtTGV2ZWwyLUlSUSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2JpZ3N1cl9pcnEsCi0JLnNodXRkb3duICA9c2h1dGRvd25fYmlnc3VyX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX2JpZ3N1cl9sMmlycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfYmlnc3VyX2wyaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfYmlnc3VyLAotCS5lbmQgPSBlbmRfYmlnc3VyX2lycQotfTsKLQotCi1zdGF0aWMgdm9pZCBtYWtlX2JpZ3N1cl9sMWlzcih1bnNpZ25lZCBpbnQgaXJxKSB7Ci0KLSAgICAgICAgLyogc2FuaXR5IGNoZWNrIGZpcnN0ICovCi0gICAgICAgIGlmKGlycSA+PSBCSUdTVVJfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBoYW5kbGVyIGluIHRoZSBtYWluIGRlc2NyaXB0aW9uIHRhYmxlICovCi0gICAgICAgICAgICAgICAgaXJxX2Rlc2NbaXJxXS5jaGlwID0gJmJpZ3N1cl9sMWlycV90eXBlOwotICAgICAgICAgICAgICAgIGlycV9kZXNjW2lycV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotICAgICAgICAgICAgICAgIGlycV9kZXNjW2lycV0uYWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBpcnFfZGVzY1tpcnFdLmRlcHRoID0gMTsKLQotICAgICAgICAgICAgICAgIGRpc2FibGVfYmlnc3VyX2wxaXJxKGlycSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHByX2RlYnVnKCJtYWtlX2JpZ3N1cl9sMWlzcjogYmFkIGlycSwgJWRcbiIsIGlycSk7Ci0gICAgICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgbWFrZV9iaWdzdXJfbDJpc3IodW5zaWduZWQgaW50IGlycSkgewotCi0gICAgICAgIC8qIHNhbml0eSBjaGVjayBmaXJzdCAqLwotICAgICAgICBpZihpcnEgPj0gQklHU1VSXzJORExWTF9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl8yTkRMVkxfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBoYW5kbGVyIGluIHRoZSBtYWluIGRlc2NyaXB0aW9uIHRhYmxlICovCi0gICAgICAgICAgICAgICAgaXJxX2Rlc2NbaXJxXS5jaGlwID0gJmJpZ3N1cl9sMmlycV90eXBlOwotICAgICAgICAgICAgICAgIGlycV9kZXNjW2lycV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotICAgICAgICAgICAgICAgIGlycV9kZXNjW2lycV0uYWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBpcnFfZGVzY1tpcnFdLmRlcHRoID0gMTsKLQotICAgICAgICAgICAgICAgIGRpc2FibGVfYmlnc3VyX2wyaXJxKGlycSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHByX2RlYnVnKCJtYWtlX2JpZ3N1cl9sMmlzcjogYmFkIGlycSwgJWRcbiIsIGlycSk7Ci0gICAgICAgIHJldHVybjsKLX0KLQotLyogVGhlIElSUSdzIHdpbGwgYmUgZGVjb2RlZCBhcyBmb2xsb3dzOgotICogSWYgYSBsZXZlbCAyIGhhbmRsZXIgZXhpc3RzIGFuZCB0aGVyZSBpcyBhbiB1bm1hc2tlZCBhY3RpdmUKLSAqIElSUSwgdGhlIDJuZCBsZXZlbCBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkLgotICogSWYgYSBsZXZlbCAyIGhhbmRsZXIgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSBhY3RpdmUgSVJRCi0gKiB0aGUgMXN0IGxldmVsIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQuCi0gKi8KLQotaW50IGJpZ3N1cl9pcnFfZGVtdXgoaW50IGlycSkKLXsKLSAgICAgICAgaW50IGRtdXhfaXJxID0gaXJxOwotICAgICAgICB1OCBtYXNrLCBhY3R2X2lycXM7Ci0gICAgICAgIHUzMiByZWdfbnVtOwotCi0gICAgICAgIERJUFJJTlRLKDMsImJpZ3N1cl9pcnFfZGVtdXgsIGlycT0lZFxuIiwgaXJxKTsKLSAgICAgICAgLyogZGVjb2RlIHRoZSAxc3QgbGV2ZWwgSVJRICovCi0gICAgICAgIGlmKGlycSA+PSBCSUdTVVJfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICAvKiBHZXQgY29ycmVzcG9uZGluZyBMMiBJU1IgYml0bWFzayBhbmQgSVNSIG51bWJlciAqLwotICAgICAgICAgICAgICAgIG1hc2sgPSBiaWdzdXJfbDJpcnFfbWFza1tpcnEtQklHU1VSX0lSUV9MT1ddOwotICAgICAgICAgICAgICAgIHJlZ19udW0gPSBiaWdzdXJfbDJpcnFfcmVnW2lycS1CSUdTVVJfSVJRX0xPV107Ci0gICAgICAgICAgICAgICAgLyogZmluZCB0aGUgYWN0aXZlIElSUSdzIChYT1Igd2l0aCBpbmFjdGl2ZSBsZXZlbCkqLwotICAgICAgICAgICAgICAgIGFjdHZfaXJxcyA9IGluYihpc3JfYmFzZS1yZWdfbnVtKmlzcl9vZmZzZXQpIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWdzdXJfbDJfaW5hY3R2X3N0YXRlW3JlZ19udW1dOwotICAgICAgICAgICAgICAgIC8qIGRlY29kZSBhY3RpdmUgSVJRJ3MgKi8KLSAgICAgICAgICAgICAgICBhY3R2X2lycXMgPSBhY3R2X2lycXMgJiBtYXNrICYgfihpbmIoaW1yX2Jhc2UtcmVnX251bSppbXJfb2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAgLyogaWYgTkVaIHRoZW4gd2UgaGF2ZSBhbiBhY3RpdmUgTDIgSVJRICovCi0gICAgICAgICAgICAgICAgaWYoYWN0dl9pcnFzKSBkbXV4X2lycSA9IGZmeih+YWN0dl9pcnFzKSArIHJlZ19udW0qOCtCSUdTVVJfMk5ETFZMX0lSUV9MT1c7Ci0gICAgICAgICAgICAgICAgLyogaWYgbm8gMm5kIGxldmVsIElSUSBhY3Rpb24sIGJ1dCBoYXMgMXN0IGxldmVsLCB1c2UgMXN0IGxldmVsIGhhbmRsZXIgKi8KLSAgICAgICAgICAgICAgICBpZighaXJxX2Rlc2NbZG11eF9pcnFdLmFjdGlvbiAmJiBpcnFfZGVzY1tpcnFdLmFjdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIGRtdXhfaXJxID0gaXJxOwotICAgICAgICAgICAgICAgIERJUFJJTlRLKDEsImJpZ3N1cl9pcnFfZGVtdXg6IGlycT0lZCBkbXV4X2lycT0lZCBtYXNrPTB4JTA0eCByZWc9JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpcnEsIGRtdXhfaXJxLCBtYXNrLCByZWdfbnVtKTsKLSAgICAgICAgfQotI2lmZGVmIENPTkZJR19IRDY0NDY1Ci0gICAgICAgIGRtdXhfaXJxID0gaGQ2NDQ2NV9pcnFfZGVtdXgoZG11eF9pcnEpOwotI2VuZGlmIC8qIENPTkZJR19IRDY0NDY1ICovCi0gICAgICAgIERJUFJJTlRLKDMsImJpZ3N1cl9pcnFfZGVtdXgsIGRlbXV4X2lycT0lZFxuIiwgZG11eF9pcnEpOwotCi0gICAgICAgIHJldHVybiBkbXV4X2lycTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vLyAgICAgICAgICAgICAgQmlnIFN1ciBJbml0IFJvdXRpbmVzCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXZvaWQgX19pbml0IGluaXRfYmlnc3VyX0lSUSh2b2lkKQotewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBpZiAoIU1BQ0hfQklHU1VSKSByZXR1cm47Ci0KLSAgICAgICAgLyogQ3JlYXRlIElTUidzIGZvciBCaWcgU3VyIENQTEQgSVJRJ3MgKi8KLSAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0gICAgICAgIGZvcihpPUJJR1NVUl9JUlFfTE9XO2k8QklHU1VSX0lSUV9ISUdIO2krKykKLSAgICAgICAgICAgICAgICBtYWtlX2JpZ3N1cl9sMWlzcihpKTsKLQotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJCaWcgU3VyIENQTEQgTDEgaW50ZXJydXB0cyAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgQklHU1VSX0lSUV9MT1csQklHU1VSX0lSUV9ISUdIKTsKLQotICAgICAgICBmb3IoaT1CSUdTVVJfMk5ETFZMX0lSUV9MT1c7aTxCSUdTVVJfMk5ETFZMX0lSUV9ISUdIO2krKykKLSAgICAgICAgICAgICAgICBtYWtlX2JpZ3N1cl9sMmlzcihpKTsKLQotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJCaWcgU3VyIENQTEQgTDIgaW50ZXJydXB0cyAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgQklHU1VSXzJORExWTF9JUlFfTE9XLEJJR1NVUl8yTkRMVkxfSVJRX0hJR0gpOwotCi19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvbGVkLmMgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvbGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjE0MzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2xlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9sZWQuYwotICoKLSAqIEJ5IER1c3RpbiBNY0ludGlyZSAoZHVzdGluQHNlbnNvcmlhLmNvbSkgKGMpMjAwMQotICogRGVyaXZlZCBmcm9tIGxlZF9zZS5jIGFuZCBsZWQuYywgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqIENvcHlyaWdodCAoQykgMjAwMCBTdHVhcnQgTWVuZWZ5IDxzdHVhcnQubWVuZWZ5QHN0LmNvbT4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIEJpZyBTdXIgc3BlY2lmaWMgTEVEIGNvZGUuCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9iaWdzdXIvYmlnc3VyLmg+Ci0KLXN0YXRpYyB2b2lkIG1hY2hfbGVkKGludCBwb3NpdGlvbiwgaW50IHZhbHVlKQotewotCWludCB3b3JkOwotCQotCXdvcmQgPSBiaWdzdXJfaW5sKEJJR1NVUl9DU0xSKTsKLQlpZiAodmFsdWUpIHsKLQkJYmlnc3VyX291dGwod29yZCAmIH5CSUdTVVJfTEVELCBCSUdTVVJfQ1NMUik7Ci0JfSBlbHNlIHsKLQkJYmlnc3VyX291dGwod29yZCB8IEJJR1NVUl9MRUQsIEJJR1NVUl9DU0xSKTsKLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0vKiBDeWNsZSB0aGUgTEVEIG9uL29mZiAqLwotdm9pZCBoZWFydGJlYXRfYmlnc3VyKHZvaWQpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGNudCA9IDAsIHBlcmlvZCA9IDAsIGRpc3QgPSAwOwotCi0JaWYgKGNudCA9PSAwIHx8IGNudCA9PSBkaXN0KQotCQltYWNoX2xlZCggLTEsIDEpOwotCWVsc2UgaWYgKGNudCA9PSA3IHx8IGNudCA9PSBkaXN0KzcpCi0JCW1hY2hfbGVkKCAtMSwgMCk7Ci0KLQlpZiAoKytjbnQgPiBwZXJpb2QpIHsKLQkJY250ID0gMDsKLQkJLyogVGhlIGh5cGVyYm9saWMgZnVuY3Rpb24gYmVsb3cgbW9kaWZpZXMgdGhlIGhlYXJ0YmVhdCBwZXJpb2QKLQkJICogbGVuZ3RoIGluIGRlcGVuZGVuY3kgb2YgdGhlIGN1cnJlbnQgKDVtaW4pIGxvYWQuIEl0IGdvZXMKLQkJICogdGhyb3VnaCB0aGUgcG9pbnRzIGYoMCk9MTI2LCBmKDEpPTg2LCBmKDUpPTUxLAotCQkgKiBmKGluZiktPjMwLiAqLwotCQlwZXJpb2QgPSAoKDY3Mjw8RlNISUZUKS8oNSphdmVucnVuWzBdKyg3PDxGU0hJRlQpKSkgKyAzMDsKLQkJZGlzdCA9IHBlcmlvZCAvIDQ7Ci0JfQotfQotI2VuZGlmIC8qIENPTkZJR19IRUFSVEJFQVQgKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxMWMyMC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKgotICogQnkgRHVzdGluIE1jSW50aXJlIChkdXN0aW5Ac2Vuc29yaWEuY29tKSAoYykyMDAxCi0gKiAKLSAqIFNldHVwIGFuZCBJUlEgaGFuZGxpbmcgY29kZSBmb3IgdGhlIEhENjQ0NjUgY29tcGFuaW9uIGNoaXAuCi0gKiBieSBHcmVnIEJhbmtzIDxnYmFua3NAcG9ja2V0cGVuZ3VpbnMuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDAwIFBvY2tldFBlbmd1aW5zIEluYwotICoKLSAqIERlcml2ZWQgZnJvbSBzZXR1cF9oZDY0NDY1LmMgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqIEdyZWcgQmFua3MgPGdiYW5rc0Bwb2NrZXRwZW5ndWlucy5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgUG9ja2V0UGVuZ3VpbnMgSW5jIGFuZAotICogQ29weXJpZ2h0IChDKSAyMDAwIFlBRUdBU0hJIFRha2VzaGkKLSAqIGFuZCBzZXR1cF9jcXJlZWsuYyB3aGljaCBib3JlIG1lc3NhZ2U6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgIE5paWJlIFl1dGFrYQotICogCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogU2V0dXAgZnVuY3Rpb25zIGZvciBhIEhpdGFjaGkgQmlnIFN1ciBFdmFsdWF0aW9uIEJvYXJkLgotICogCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vYmlnc3VyL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hkNjQ0NjUvaGQ2NDQ2NS5oPgotI2luY2x1ZGUgPGFzbS9iaWdzdXIvYmlnc3VyLmg+Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLy8JCUJpZyBTdXIgSW5pdCBSb3V0aW5lcwkKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgYmlnc3VyX3NldHVwKGNoYXIgKipjbWRsaW5lX3ApCi17Ci0JLyogTWFzayBhbGwgMm5kIGxldmVsIElSUSdzICovCi0Jb3V0YigtMSxCSUdTVVJfSU1SMCk7Ci0Jb3V0YigtMSxCSUdTVVJfSU1SMSk7Ci0Jb3V0YigtMSxCSUdTVVJfSU1SMik7Ci0Jb3V0YigtMSxCSUdTVVJfSU1SMyk7Ci0KLQkvKiBNYXNrIDFzdCBsZXZlbCBpbnRlcnJ1cHRzICovCi0Jb3V0YigtMSxCSUdTVVJfSVJMTVIwKTsKLQlvdXRiKC0xLEJJR1NVUl9JUkxNUjEpOwotCi0jaWYgZGVmaW5lZCAoQ09ORklHX0hENjQ0NjUpICYmIGRlZmluZWQgKENPTkZJR19TRVJJQUwpIAotCS8qIHJlbWFwIElPIHBvcnRzIGZvciBmaXJzdCBJU0Egc2VyaWFsIHBvcnQgdG8gSEQ2NDQ2NSBVQVJUICovCi0JYmlnc3VyX3BvcnRfbWFwKDB4M2Y4LCA4LCBDT05GSUdfSEQ2NDQ2NV9JT0JBU0UgKyAweDgwMDAsIDEpOwotI2VuZGlmIC8qIENPTkZJR19IRDY0NDY1ICYmIENPTkZJR19TRVJJQUwgKi8KLQkvKiBUT0RPOiBzZXR1cCBJREUgcmVnaXN0ZXJzICovCi0JYmlnc3VyX3BvcnRfbWFwKEJJR1NVUl9JREVDVExfSU9QT1JULCAyLCBCSUdTVVJfSUNUTCwgOCk7Ci0JLyogU2V0dXAgdGhlIEV0aGVybmV0IHBvcnQgdG8gQklHU1VSX0VUSEVSX0lPUE9SVCAqLwotCWJpZ3N1cl9wb3J0X21hcChCSUdTVVJfRVRIRVJfSU9QT1JULCAxNiwgQklHU1VSX0VUSFIrQklHU1VSX0VUSEVSX0lPUE9SVCwgMCk7Ci0JLyogc2V0IHBhZ2UgdG8gMSAqLwotCW91dHcoMSwgQklHU1VSX0VUSFIrMHhlKTsKLQkvKiBzZXQgdGhlIElPIHBvcnQgdG8gQklHU1VSX0VUSEVSX0lPUE9SVCAqLwotCW91dHcoQklHU1VSX0VUSEVSX0lPUE9SVDw8MywgQklHU1VSX0VUSFIrMHgyKTsKLX0KLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi1leHRlcm4gdm9pZCBoZWFydGJlYXRfYmlnc3VyKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdF9iaWdzdXJfSVJRKHZvaWQpOwotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfYmlnc3VyIF9faW5pdG12ID0gewotCS5tdl9uYW1lCQk9ICJCaWcgU3VyIiwKLQkubXZfc2V0dXAJCT0gYmlnc3VyX3NldHVwLAotCi0JLm12X2lzYV9wb3J0MmFkZHIJPSBiaWdzdXJfaXNhX3BvcnQyYWRkciwKLQkubXZfaXJxX2RlbXV4ICAgICAgIAk9IGJpZ3N1cl9pcnFfZGVtdXgsCi0KLQkubXZfaW5pdF9pcnEJCT0gaW5pdF9iaWdzdXJfSVJRLAotI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKLQkubXZfaGVhcnRiZWF0CQk9IGhlYXJ0YmVhdF9iaWdzdXIsCi0jZW5kaWYKLX07Ci1BTElBU19NVihiaWdzdXIpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9lYzMxMDQvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9lYzMxMDQvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ODg5MTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgRUMzMTA0IHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKLSMKLQotb2JqLXkJIDo9IHNldHVwLm8gaW8ubyBpcnEubwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9lYzMxMDQvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL2VjMzEwNC9pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjg2Mzk0Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL2VjMzEwNC9pby5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL2VjMzEwNC9pby5jCi0gKiAgRUMzMTA0IGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQHR1eC5vcmc+Ci0gKgotICovCi0vKiBFQzMxMDQgbm90ZToKLSAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB3aXRob3V0IGFueSBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBFQzMxMDQgY2hpcC4gIFdoaWxlCi0gKiBJIGhvcGUgSSBnb3QgbW9zdCBvZiB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSByaWdodCwgdGhlIHJlZ2lzdGVyIG5hbWVzIEkgdXNlCi0gKiBhcmUgbW9zdCBsaWtlbHkgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB0aG9zZSBpbiB0aGUgY2hpcCBkb2N1bWVudGF0aW9uLgotICoKLSAqIElmIHlvdSBoYXZlIGFueSBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBFQzMxMDQsIHBsZWFzZSB0ZWxsIG1lCi0gKiAocHJ1bXBmQHR1eC5vcmcpLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2VjMzEwNC9lYzMxMDQuaD4KLQotLyoKLSAqIEVDMzEwNCBoYXMgYSByZWFsIElTQSBidXMgd2hpY2ggd2UgcmVkaXJlY3QgbG93IHBvcnQgYWNjZXNzZXMgdG8gKHRoZQotICogYWN0dWFsIGRldmljZSBvbiBtaW5lIGlzIGEgRVNTIDE4NjgsIGFuZCBJIGRvbid0IHdhbnQgdG8gaGFjayB0aGUgZHJpdmVyCi0gKiBtb3JlIHRoYW4gc3RyaWN0bHkgbmVjZXNzYXJ5KS4gIEkgYW0gbm90IGdvaW5nIHRvIGR1cGxpY2F0ZSB0aGUKLSAqIGhhcmQgY29kaW5nIG9mIFBDIGFkZHJlc3NlcyAoZm9yIHRoZSAxNjU1MHMgYXNvKSBoZXJlIHRob3VnaDsgIGl0J3MganVzdAotICogdG9vIHVnbHkuCi0gKi8KLQotI2RlZmluZSBsb3dfcG9ydChwb3J0KSAoKHBvcnQpIDwgMHgxMDAwMCkKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvcnQyYWRkcih1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0Jc3dpdGNoKHBvcnQgPj4gMTYpIHsKLQljYXNlIDA6Ci0JCXJldHVybiBFQzMxMDRfSVNBX0JBU0UgKyBwb3J0ICogMjsKLQotCQkvKiBYWFggaGFjay4gaXQncyB1bmNsZWFyIHdoYXQgdG8gZG8gYWJvdXQgdGhlIHNlcmlhbCBwb3J0cyAqLwotCWNhc2UgMToKLQkJcmV0dXJuIEVDMzEwNF9CQVNFICsgKHBvcnQmMHhmZmZmKSAqIDQ7Ci0KLQlkZWZhdWx0OgotCQkvKiBYWFggUENNQ0lBICovCi0JCXJldHVybiAwOwotCX0KLX0KLQotdW5zaWduZWQgY2hhciBlYzMxMDRfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQl1OCByZXQ7Ci0KLQlyZXQgPSAqKHZvbGF0aWxlIHU4ICopcG9ydDJhZGRyKHBvcnQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdW5zaWduZWQgc2hvcnQgZWMzMTA0X2ludyh1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JQlVHKCk7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgZWMzMTA0X2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JQlVHKCk7Ci19Ci0KLXZvaWQgZWMzMTA0X291dGIodW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JKih2b2xhdGlsZSB1OCAqKXBvcnQyYWRkcihwb3J0KSA9IGRhdGE7Ci19Ci0KLXZvaWQgZWMzMTA0X291dHcodW5zaWduZWQgc2hvcnQgZGF0YSwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCUJVRygpOwotfQotCi12b2lkIGVjMzEwNF9vdXRsKHVuc2lnbmVkIGxvbmcgZGF0YSwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCUJVRygpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L2lycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE0ZmYxLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL2VjMzEwNC9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L2lycS5jCi0gKiBFQzMxMDQgY29tcGFuaW9uIGNoaXAgc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAdHV4Lm9yZz4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vZWMzMTA0L2VjMzEwNC5oPgotCi0vKiBUaGlzIGlzIGZvciBkZWJ1Z2dpbmcgbW9zdGx5OyAgaGVyZSdzIHRoZSB0YWJsZSB0aGF0IEkgaW50ZW5kIHRvIGtlZXAKLSAqIGluIGhlcmU6Ci0gKgotICogICBpbmRleCAgICAgIGZ1bmN0aW9uICAgICAgICBiYXNlIGFkZHIgICAgICAgcG93ZXIgICAgICAgICAgIGludGVycnVwdCBiaXQKLSAqICAgICAgIDAgICAgICBwb3dlciAgICAgICAgICAgYjBlYzAwMDAgICAgICAgIC0tLSAgICAgICAgICAgICAwMDAwMDAwMSAodW51c2VkKQotICogICAgICAgMSAgICAgIGlycXMgICAgICAgICAgICBiMGVjMTAwMCAgICAgICAgLS0tICAgICAgICAgICAgIDAwMDAwMDAyICh1bnVzZWQpCi0gKiAgICAgICAyICAgICAgPz8gICAgICAgICAgICAgIGIwZWMyMDAwICAgICAgICBiMGVjMDAwOCAgICAgICAgMDAwMDAwMDQKLSAqICAgICAgIDMgICAgICBQUzIgKDEpICAgICAgICAgYjBlYzMwMDAgICAgICAgIGIwZWMwMDBjICAgICAgICAwMDAwMDAwOAotICogICAgICAgNCAgICAgIFBTMiAoMikgICAgICAgICBiMGVjNDAwMCAgICAgICAgYjBlYzAwMTAgICAgICAgIDAwMDAwMDEwCi0gKiAgICAgICA1ICAgICAgPz8gICAgICAgICAgICAgIGIwZWM1MDAwICAgICAgICBiMGVjMDAxNCAgICAgICAgMDAwMDAwMjAKLSAqICAgICAgIDYgICAgICBJMkMgICAgICAgICAgICAgYjBlYzYwMDAgICAgICAgIGIwZWMwMDE4ICAgICAgICAwMDAwMDA0MAotICogICAgICAgNyAgICAgIHNlcmlhbCAoMSkgICAgICBiMGVjNzAwMCAgICAgICAgYjBlYzAwMWMgICAgICAgIDAwMDAwMDgwCi0gKiAgICAgICA4ICAgICAgc2VyaWFsICgyKSAgICAgIGIwZWM4MDAwICAgICAgICBiMGVjMDAyMCAgICAgICAgMDAwMDAxMDAKLSAqICAgICAgIDkgICAgICBzZXJpYWwgKDMpICAgICAgYjBlYzkwMDAgICAgICAgIGIwZWMwMDI0ICAgICAgICAwMDAwMDIwMAotICogICAgICAxMCAgICAgIHNlcmlhbCAoNCkgICAgICBiMGVjYTAwMCAgICAgICAgYjBlYzAwMjggICAgICAgIDAwMDAwNDAwCi0gKiAgICAgIDEyICAgICAgR1BJTyAoMSkgICAgICAgIGIwZWNjMDAwICAgICAgICBiMGVjMDAzMAotICogICAgICAxMyAgICAgIEdQSU8gKDIpICAgICAgICBiMGVjYzAwMCAgICAgICAgYjBlYzAwMzAKLSAqICAgICAgMTYgICAgICBwY21jaWEgKDEpICAgICAgYjBlZDAwMDAgICAgICAgIGIwZWMwMDQwICAgICAgICAwMDAxMDAwMAotICogICAgICAxNyAgICAgIHBjbWNpYSAoMikgICAgICBiMGVkMTAwMCAgICAgICAgYjBlYzAwNDQgICAgICAgIDAwMDIwMDAwCi0gKi8KLQotLyogSSB1c2VkIHRoZSByZWdpc3RlciBuYW1lcyBmcm9tIGFub3RoZXIgaW50ZXJydXB0IGNvbnRyb2xsZXIgSSB3b3JrZWQgd2l0aCwKLSAqIHNpbmNlIGl0IHNlZW1zIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgZWMzMTA0IGV4Y2VwdCB0aGF0IGFsbCBiaXRzIGFyZQotICogaW52ZXJ0ZWQ6Ci0gKgotICogSVJSOiBJbnRlcnJ1cHQgUmVxdWVzdCBSZWdpc3RlciAocGVuZGluZyBhbmQgZW5hYmxlZCBpbnRlcnJ1cHRzKQotICogSU1SOiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAod2hpY2ggaW50ZXJydXB0cyBhcmUgZW5hYmxlZCkKLSAqIElQUjogSW50ZXJydXB0IFBlbmRpbmcgUmVnaXN0ZXIgKHBlbmRpbmcgaW50ZXJydXB0cywgZXZlbiBkaXNhYmxlZCBvbmVzKQotICoKLSAqIDAgYml0cyBtZWFuIHBlbmRpbmcgb3IgZW5hYmxlZCwgMSBiaXRzIG1lYW4gbm90IHBlbmRpbmcgb3IgZGlzYWJsZWQuICBhbGwKLSAqIElSUXMgc2VlbSB0byBiZSBsZXZlbC10cmlnZ2VyZWQuCi0gKi8KLQotI2RlZmluZSBFQzMxMDRfSVJSIChFQzMxMDRfQkFTRSArIDB4MTAwMCkKLSNkZWZpbmUgRUMzMTA0X0lNUiAoRUMzMTA0X0JBU0UgKyAweDEwMDQpCi0jZGVmaW5lIEVDMzEwNF9JUFIgKEVDMzEwNF9CQVNFICsgMHgxMDA4KQotCi0jZGVmaW5lIGN0cmxfcmVhZGwoYWRkcikgKCoodm9sYXRpbGUgdTMyICopKGFkZHIpKQotI2RlZmluZSBjdHJsX3dyaXRlbChkYXRhLGFkZHIpICgqKHZvbGF0aWxlIHUzMiAqKShhZGRyKSA9IChkYXRhKSkKLSNkZWZpbmUgY3RybF9yZWFkYihhZGRyKSAoKih2b2xhdGlsZSB1OCAqKShhZGRyKSkKLQotc3RhdGljIGNoYXIgKmVjMzEwNF9uYW1lKHVuc2lnbmVkIGluZGV4KQotewotICAgICAgICBzd2l0Y2goaW5kZXgpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHJldHVybiAicG93ZXIgbWFuYWdlbWVudCI7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gImludGVycnVwdHMiOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJQUzIgKDEpIjsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHJldHVybiAiUFMyICgyKSI7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkkyQyAoMSkiOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJJMkMgKDIpIjsKLSAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIHJldHVybiAic2VyaWFsICgxKSI7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICByZXR1cm4gInNlcmlhbCAoMikiOwotICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJzZXJpYWwgKDMpIjsKLSAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInNlcmlhbCAoNCkiOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgIHJldHVybiAicGNtY2lhICgxKSI7Ci0gICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJwY21jaWEgKDIpIjsKLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0KLSAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgInVua25vd24gKCVkKSIsIGluZGV4KTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBidWY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci19Ci0KLWludCBnZXRfcGVuZGluZ19pbnRlcnJ1cHRzKGNoYXIgKmJ1ZikKLXsKLSAgICAgICAgdTMyIGlwcjsKLSAgICAgICAgdTMyIGJpdDsKLSAgICAgICAgY2hhciAqcCA9IGJ1ZjsKLQotICAgICAgICBwICs9IHNwcmludGYocCwgInBlbmRpbmc6ICgiKTsKLQotICAgICAgICBpcHIgPSBjdHJsX2lubChFQzMxMDRfSVBSKTsKLQotICAgICAgICBmb3IgKGJpdCA9IDE7IGJpdCA8IDMyOyBiaXQrKykKLSAgICAgICAgICAgICAgICBpZiAoIShpcHIgJiAoMTw8Yml0KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBwICs9IHNwcmludGYocCwgIiVzICIsIGVjMzEwNF9uYW1lKGJpdCkpOwotCi0gICAgICAgIHAgKz0gc3ByaW50ZihwLCAiKVxuIik7Ci0KLSAgICAgICAgcmV0dXJuIHAgLSBidWY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGVjMzEwNF9pcnEybWFzayh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICByZXR1cm4gKDEgPDwgKGlycSAtIEVDMzEwNF9JUlFCQVNFKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrX2VjMzEwNF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLSAgICAgICAgdTMyIG1hc2s7Ci0KLSAgICAgICAgbWFzayA9IGN0cmxfcmVhZGwoRUMzMTA0X0lNUik7Ci0KLSAgICAgICAgbWFzayB8PSBlYzMxMDRfaXJxMm1hc2soaXJxKTsKLQotICAgICAgICBjdHJsX3dyaXRlbChtYXNrLCBFQzMxMDRfSU1SKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHVubWFza19lYzMxMDRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHUzMiBtYXNrOwotCi0gICAgICAgIG1hc2sgPSBjdHJsX3JlYWRsKEVDMzEwNF9JTVIpOwotCi0gICAgICAgIG1hc2sgJj0gfmVjMzEwNF9pcnEybWFzayhpcnEpOwotCi0gICAgICAgIGN0cmxfd3JpdGVsKG1hc2ssIEVDMzEwNF9JTVIpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2VjMzEwNF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLSAgICAgICAgbWFza19lYzMxMDRfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9lYzMxMDRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHVubWFza19lYzMxMDRfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19lYzMxMDRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIG1hc2tfZWMzMTA0X2lycShpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfZWMzMTA0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICBpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKLSAgICAgICAgICAgICAgICB1bm1hc2tfZWMzMTA0X2lycShpcnEpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfZWMzMTA0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICB1bm1hc2tfZWMzMTA0X2lycShpcnEpOwotCi0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaHV0ZG93bl9lYzMxMDRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIG1hc2tfZWMzMTA0X2lycShpcnEpOwotCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgZWMzMTA0X2ludCA9IHsKLSAgICAgICAgLnR5cGVuYW1lICAgICAgID0gIkVDMzEwNCIsCi0gICAgICAgIC5lbmFibGUgICAgICAgICA9IGVuYWJsZV9lYzMxMDRfaXJxLAotICAgICAgICAuZGlzYWJsZSAgICAgICAgPSBkaXNhYmxlX2VjMzEwNF9pcnEsCi0gICAgICAgIC5hY2sgICAgICAgICAgICA9IG1hc2tfYW5kX2Fja19lYzMxMDRfaXJxLAotICAgICAgICAuZW5kICAgICAgICAgICAgPSBlbmRfZWMzMTA0X2lycSwKLSAgICAgICAgLnN0YXJ0dXAgICAgICAgID0gc3RhcnR1cF9lYzMxMDRfaXJxLAotICAgICAgICAuc2h1dGRvd24gICAgICAgPSBzaHV0ZG93bl9lYzMxMDRfaXJxLAotfTsKLQotLyogWXVjay4gIHRoZSBfZGVtdXggQVBJIGlzIHVnbHkgKi8KLWludCBlYzMxMDRfaXJxX2RlbXV4KGludCBpcnEpCi17Ci0gICAgICAgIGlmIChpcnEgPT0gRUMzMTA0X0lSUSkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXNrOwotCi0gICAgICAgICAgICAgICAgbWFzayA9IGN0cmxfcmVhZGwoRUMzMTA0X0lSUik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWFzayA9PSAweGZmZmZmZmZmKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVDMzEwNF9JUlE7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVDMzEwNF9JUlFCQVNFICsgZmZ6KG1hc2spOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlycTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2VjMzEwNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMmJjOTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L3NldHVwLmMKLSAqICBFQzMxMDQgY29tcGFuaW9uIGNoaXAgc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAdHV4Lm9yZz4KLSAqCi0gKi8KLS8qIEVDMzEwNCBub3RlOgotICogVGhpcyBjb2RlIHdhcyB3cml0dGVuIHdpdGhvdXQgYW55IGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIEVDMzEwNCBjaGlwLiAgV2hpbGUKLSAqIEkgaG9wZSBJIGdvdCBtb3N0IG9mIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IHJpZ2h0LCB0aGUgcmVnaXN0ZXIgbmFtZXMgSSB1c2UKLSAqIGFyZSBtb3N0IGxpa2VseSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmcm9tIHRob3NlIGluIHRoZSBjaGlwIGRvY3VtZW50YXRpb24uCi0gKgotICogSWYgeW91IGhhdmUgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEVDMzEwNCwgcGxlYXNlIHRlbGwgbWUKLSAqIChwcnVtcGZAdHV4Lm9yZykuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9lYzMxMDQuaD4KLQotc3RhdGljIHZvaWQgX19pbml0IGVjMzEwNF9zZXR1cChjaGFyICoqY21kbGluZV9wKQotewotCWNoYXIgc3RyWzhdOwotCWludCBpOwotCi0JZm9yIChpPTA7IGk8ODsgaSsrKQotCQlzdHJbaV0gPSBjdHJsX3JlYWRiKEVDMzEwNF9CQVNFICsgaSk7Ci0KLQlmb3IgKGkgPSBFQzMxMDRfSVJRQkFTRTsgaSA8IEVDMzEwNF9JUlFCQVNFICsgMzI7IGkrKykKLQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZlYzMxMDRfaW50OwotCi0JcHJpbnRrKCJpbml0aWFsaXppbmcgRUMzMTA0IFwiJS44c1wiIGF0ICUwOHgsIElSUSAlZCwgSVJRIGJhc2UgJWRcbiIsCi0JICAgICAgIHN0ciwgRUMzMTA0X0JBU0UsIEVDMzEwNF9JUlEsIEVDMzEwNF9JUlFCQVNFKTsKLQotCS8qIG1hc2sgYWxsIGludGVycnVwdHMuICB0aGlzIHNob3VsZCBoYXZlIGJlZW4gZG9uZSBieSB0aGUgYm9vdAotCSAqIGxvYWRlciBmb3IgdXMgYnV0IHdlIHdhbnQgdG8gYmUgc3VyZSAuLi4gKi8KLQljdHJsX3dyaXRlbCgweGZmZmZmZmZmLCBFQzMxMDRfSU1SKTsKLX0KLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfZWMzMTA0IF9faW5pdG12ID0gewotCS5tdl9uYW1lCT0gIkVDMzEwNCIsCi0JLm12X3NldHVwCT0gZWMzMTA0X3NldHVwLAotCS5tdl9ucl9pcnFzCT0gOTYsCi0KLQkubXZfaW5iCQk9IGVjMzEwNF9pbmIsCi0JLm12X2ludwkJPSBlYzMxMDRfaW53LAotCS5tdl9pbmwJCT0gZWMzMTA0X2lubCwKLQkubXZfb3V0Ygk9IGVjMzEwNF9vdXRiLAotCS5tdl9vdXR3CT0gZWMzMTA0X291dHcsCi0JLm12X291dGwJPSBlYzMxMDRfb3V0bCwKLQotCS5tdl9pcnFfZGVtdXgJPSBlYzMxMDRfaXJxX2RlbXV4LAotfTsKLUFMSUFTX01WKGVjMzEwNCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL01ha2VmaWxlCmluZGV4IDE2NDRlYmUuLjhjZDMxYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBJbnRlcmZhY2UgKENUUC9QQ0kvTVBDLVNIMDIpIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKICMKIAotb2JqLXkJIDo9IHNldHVwLm8gcnRjLm8gbGVkLm8KK29iai15CSA6PSBzZXR1cC5vIHJ0Yy5vCiAKIG9iai0kKENPTkZJR19QQ0kpICs9IHBjaS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvbGVkLmMgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL2xlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGYxNTkxLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9sZWQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAgU2FpdG8uSyAmIEplYW5uZQotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBJbnRlcmZhY2UgTVBDLTEyMTEgc3BlY2lmaWMgTEVEIGNvZGUuCi0gKi8KLQotCi1zdGF0aWMgdm9pZCBtYWNoX2xlZChpbnQgcG9zaXRpb24sIGludCB2YWx1ZSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKTB4YTIwMDAwMDA7Ci0KLQlpZiAodmFsdWUpIHsKLQkJKnAgfD0gMTsKLQl9IGVsc2UgewotCQkqcCAmPSB+MTsKLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0vKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWRlci9TdW4gcGF0dGVybiAqLwotdm9pZCBoZWFydGJlYXRfbXBjMTIxMSh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKTB4YTIwMDAwMDA7Ci0Jc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCi0JICovCi0JcGVyaW9kID0gMTEwIC0gKCAoMzAwPDxGU0hJRlQpLwotCQkJICgoYXZlbnJ1blswXS81KSArICgzPDxGU0hJRlQpKSApOwotCi0JaWYgKHVwKSB7Ci0JCWlmIChiaXQgPT0gNykgewotCQkJYml0LS07Ci0JCQl1cD0wOwotCQl9IGVsc2UgewotCQkJYml0ICsrOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGJpdCA9PSAwKSB7Ci0JCQliaXQrKzsKLQkJCXVwPTE7Ci0JCX0gZWxzZSB7Ci0JCQliaXQtLTsKLQkJfQotCX0KLQkqcCA9IDE8PGJpdDsKLQotfQotI2VuZGlmIC8qIENPTkZJR19IRUFSVEJFQVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYwppbmRleCA3YzNkMWQzLi4xYTA2MDRiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9tcGMxMjExL21wYzEyMTEuaD4KQEAgLTI4MSw2ICsyODIsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoZWFydGJlYXRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweGEyMDAwMDAwLAorCQkuZW5kCT0gMHhhMjAwMDAwMCArIDggLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGVhcnRiZWF0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiaGVhcnRiZWF0IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbXBjMTIxMV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaGVhcnRiZWF0X2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1wYzEyMTFfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhtcGMxMjExX2RldmljZXMsCisJCQkJICAgIEFSUkFZX1NJWkUobXBjMTIxMV9kZXZpY2VzKSk7Cit9CitfX2luaXRjYWxsKG1wYzEyMTFfZGV2aWNlc19zZXR1cCk7CisKIC8qIGFyY2gvc2gvYm9hcmRzL21wYzEyMTEvcnRjLmMgKi8KIHZvaWQgbXBjMTIxMV90aW1lX2luaXQodm9pZCk7CiAKQEAgLTMxNyw5ICszNDQsNSBAQAogCS5tdl9ucl9pcnFzCQk9IDQ4LAogCS5tdl9pcnFfZGVtdXgJCT0gbXBjMTIxMV9pcnFfZGVtdXgsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfbXBjMTIxMV9JUlEsCi0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfbXBjMTIxMSwKLSNlbmRpZgogfTsKIEFMSUFTX01WKG1wYzEyMTEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvTWFrZWZpbGUKaW5kZXggNTc0YjAzMS4uM2M5MzAxMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9NYWtlZmlsZQpAQCAtNCw1ICs0LDQgQEAKIAogb2JqLXkJIDo9IHNldHVwLm8gaW8ubyBpcnEubwogCi1vYmotJChDT05GSUdfSEVBUlRCRUFUKQkJKz0gbGVkLm8KIG9iai0kKENPTkZJR19QVVNIX1NXSVRDSCkJKz0gcHN3Lm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9pby5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMKaW5kZXggMzExY2NjYy4uZjc0ZDJmZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMKQEAgLTExLDIyICsxMSw5IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9yNzc4MHJwLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9ydDJhZHIodW5zaWduZWQgaW50IHBvcnQpCi17Ci0JaWYgKCgweDFmMCA8PSBwb3J0ICYmIHBvcnQgPCAweDFmOCkgfHwgcG9ydCA9PSAweDNmNikKLQkJaWYgKHBvcnQgPT0gMHgzZjYpCi0JCQlyZXR1cm4gKFBBX0FSRUE1X0lPICsgMHg4MGMpOwotCQllbHNlCi0JCQlyZXR1cm4gKFBBX0FSRUE1X0lPICsgMHgxMDAwICsgKChwb3J0LTB4MWYwKSA8PCAxKSk7Ci0JZWxzZQotCQltYXliZWJhZGlvKCh1bnNpZ25lZCBsb25nKXBvcnQpOwotCi0JcmV0dXJuIHBvcnQ7Ci19CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwb3J0ODg3OTZsKHVuc2lnbmVkIGludCBwb3J0LCBpbnQgZmxhZykKIHsKQEAgLTQwLDE4ICsyNyw2IEBACiAJcmV0dXJuIGFkZHI7CiB9CiAKLS8qIFRoZSA3NzgwIFI3NzgwUlAtMSBzZWVtcyB0byBoYXZlIGV2ZXJ5dGhpbmcgaG9va2VkICovCi0vKiB1cCBwcmV0dHkgbm9ybWFsbHkgKG5vdGhpbmcgb24gaGlnaC1ieXRlcyBvbmx5Li4uKSBzbyB0aGlzICovCi0vKiBzaG91bGRuJ3QgYmUgbmVlZGVkICovCi1zdGF0aWMgaW5saW5lIGludCBzaGlmdGVkX3BvcnQodW5zaWduZWQgbG9uZyBwb3J0KQotewotCS8qIEZvciBJREUgcmVnaXN0ZXJzLCB2YWx1ZSBpcyBub3Qgc2hpZnRlZCAqLwotCWlmICgoMHgxZjAgPD0gcG9ydCAmJiBwb3J0IDwgMHgxZjgpIHx8IHBvcnQgPT0gMHgzZjYpCi0JCXJldHVybiAwOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci19Ci0KICNpZiBkZWZpbmVkKENPTkZJR19ORTIwMDApIHx8IGRlZmluZWQoQ09ORklHX05FMjAwMF9NT0RVTEUpCiAjZGVmaW5lIENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkgXAogICAoKHBvcnQgPj0gQVg4ODc5NkxfSU9fQkFTRSkgJiYgKHBvcnQgPCAoQVg4ODc5NkxfSU9fQkFTRSsweDIwKSkpCkBAIC03MCwxMiArNDUsMTAgQEAKIHsKIAlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKIAkJcmV0dXJuIGN0cmxfaW53KHBvcnQ4ODc5NmwocG9ydCwgMCkpICYgMHhmZjsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJcmV0dXJuIGN0cmxfaW5iKHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCiAJCXJldHVybiBjdHJsX2luYihwY2lfaW9hZGRyKHBvcnQpKTsKIAotCXJldHVybiBjdHJsX2ludyhwb3J0MmFkcihwb3J0KSkgJiAweGZmOworCXJldHVybiBjdHJsX2ludyhwb3J0KSAmIDB4ZmY7CiB9CiAKIHU4IHI3NzgwcnBfaW5iX3AodW5zaWduZWQgbG9uZyBwb3J0KQpAQCAtODQsMTIgKzU3LDEwIEBACiAKIAlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKIAkJdiA9IGN0cmxfaW53KHBvcnQ4ODc5NmwocG9ydCwgMCkpICYgMHhmZjsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJdiA9IGN0cmxfaW5iKHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCiAJCXYgPSBjdHJsX2luYihwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCXYgPSBjdHJsX2ludyhwb3J0MmFkcihwb3J0KSkgJiAweGZmOworCQl2ID0gY3RybF9pbncocG9ydCkgJiAweGZmOwogCiAJY3RybF9kZWxheSgpOwogCkBAIC05OCw4MCArNjksNTYgQEAKIAogdTE2IHI3NzgwcnBfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKLQlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJbWF5YmViYWRpbyhwb3J0KTsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJcmV0dXJuIGN0cmxfaW53KHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQogCQlyZXR1cm4gY3RybF9pbncocGNpX2lvYWRkcihwb3J0KSk7Ci0JZWxzZQotCQltYXliZWJhZGlvKHBvcnQpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGN0cmxfaW53KHBvcnQpOwogfQogCiB1MzIgcjc3ODBycF9pbmwodW5zaWduZWQgbG9uZyBwb3J0KQogewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQlyZXR1cm4gY3RybF9pbmwocG9ydCk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCiAJCXJldHVybiBjdHJsX2lubChwY2lfaW9hZGRyKHBvcnQpKTsKLQllbHNlCi0JCW1heWJlYmFkaW8ocG9ydCk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gY3RybF9pbmwocG9ydCk7CiB9CiAKIHZvaWQgcjc3ODBycF9vdXRiKHU4IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDg4Nzk2bChwb3J0LCAwKSk7Ci0JZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCWN0cmxfb3V0Yih2YWx1ZSwgcG9ydCk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKIAkJY3RybF9vdXRiKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDJhZHIocG9ydCkpOworCQljdHJsX291dGIodmFsdWUsIHBvcnQpOwogfQogCiB2b2lkIHI3NzgwcnBfb3V0Yl9wKHU4IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDg4Nzk2bChwb3J0LCAwKSk7Ci0JZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCWN0cmxfb3V0Yih2YWx1ZSwgcG9ydCk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKIAkJY3RybF9vdXRiKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDJhZHIocG9ydCkpOworCQljdHJsX291dGIodmFsdWUsIHBvcnQpOwogCiAJY3RybF9kZWxheSgpOwogfQogCiB2b2lkIHI3NzgwcnBfb3V0dyh1MTYgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKLQlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJbWF5YmViYWRpbyhwb3J0KTsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJY3RybF9vdXR3KHZhbHVlLCBwb3J0KTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwlpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKIAkJY3RybF9vdXR3KHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCW1heWJlYmFkaW8ocG9ydCk7CisJCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydCk7CiB9CiAKIHZvaWQgcjc3ODBycF9vdXRsKHUzMiB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQogewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQljdHJsX291dGwodmFsdWUsIHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQogCQljdHJsX291dGwodmFsdWUsIHBjaV9pb2FkZHIocG9ydCkpOwogCWVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKKwkJY3RybF9vdXRsKHZhbHVlLCBwb3J0KTsKIH0KIAogdm9pZCByNzc4MHJwX2luc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCkBAIC0xODMsMTYgKzEzMCwxMyBAQAogCQlwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQ4ODc5NmwocG9ydCwgMCk7CiAJCXdoaWxlIChjb3VudC0tKQogCQkJKmJ1ZisrID0gKnAgJiAweGZmOwotCX0gZWxzZSBpZiAoUFhTRUcocG9ydCkpIHsKLQkJd2hpbGUgKGNvdW50LS0pCi0JCQkqYnVmKysgPSAqKHZvbGF0aWxlIHU4ICopcG9ydDsKLQl9IGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7CisJfSBlbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKSB7CiAJCXZvbGF0aWxlIHU4ICpicCA9ICh2b2xhdGlsZSB1OCAqKXBjaV9pb2FkZHIocG9ydCk7CiAKIAkJd2hpbGUgKGNvdW50LS0pCiAJCQkqYnVmKysgPSAqYnA7CiAJfSBlbHNlIHsKLQkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0MmFkcihwb3J0KTsKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0OwogCQl3aGlsZSAoY291bnQtLSkKIAkJCSpidWYrKyA9ICpwICYgMHhmZjsKIAl9CkBAIC0yMDUsMzAgKzE0OSwyNiBAQAogCiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDg4Nzk2bChwb3J0LCAxKTsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0OwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCiAJCXAgPSAodm9sYXRpbGUgdTE2ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCi0JCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDJhZHIocG9ydCk7CisJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDsKIAogCXdoaWxlIChjb3VudC0tKQogCQkqYnVmKysgPSAqcDsKKworCWZsdXNoX2RjYWNoZV9hbGwoKTsKIH0KIAogdm9pZCByNzc4MHJwX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JdTMyICpidWYgPSBkc3Q7Ci0KLQlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJbWF5YmViYWRpbyhwb3J0KTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkgeworCWlmIChpc19wY2lfaW9hZGRyKHBvcnQpKSB7CiAJCXZvbGF0aWxlIHUzMiAqcCA9ICh2b2xhdGlsZSB1MzIgKilwY2lfaW9hZGRyKHBvcnQpOworCQl1MzIgKmJ1ZiA9IGRzdDsKIAogCQl3aGlsZSAoY291bnQtLSkKIAkJCSpidWYrKyA9ICpwOwotCX0gZWxzZQotCQltYXliZWJhZGlvKHBvcnQpOworCX0KIH0KIAogdm9pZCByNzc4MHJwX291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQpAQCAtMjQwLDE5ICsxODAsMTQgQEAKIAkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0ODg3OTZsKHBvcnQsIDApOwogCQl3aGlsZSAoY291bnQtLSkKIAkJCSpwID0gKmJ1ZisrOwotCX0gZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCXdoaWxlIChjb3VudC0tKQotCQkJY3RybF9vdXRiKCpidWYrKywgcG9ydCk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKKwl9IGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpIHsKIAkJdm9sYXRpbGUgdTggKmJwID0gKHZvbGF0aWxlIHU4ICopcGNpX2lvYWRkcihwb3J0KTsKIAogCQl3aGlsZSAoY291bnQtLSkKIAkJCSpicCA9ICpidWYrKzsKLQl9IGVsc2UgewotCQlwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQyYWRyKHBvcnQpOworCX0gZWxzZQogCQl3aGlsZSAoY291bnQtLSkKLQkJCSpwID0gKmJ1ZisrOwotCX0KKwkJCWN0cmxfb3V0YigqYnVmKyssIHBvcnQpOwogfQogCiB2b2lkIHI3NzgwcnBfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCkBAIC0yNjIsNDAgKzE5NywzNyBAQAogCiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDg4Nzk2bChwb3J0LCAxKTsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0OwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCiAJCXAgPSAodm9sYXRpbGUgdTE2ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCi0JCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDJhZHIocG9ydCk7CisJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDsKIAogCXdoaWxlIChjb3VudC0tKQogCQkqcCA9ICpidWYrKzsKKworCWZsdXNoX2RjYWNoZV9hbGwoKTsKIH0KIAogdm9pZCByNzc4MHJwX291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCWNvbnN0IHUzMiAqYnVmID0gc3JjOworCXUzMiAqcDsKIAotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7Ci0JCXZvbGF0aWxlIHUzMiAqcCA9ICh2b2xhdGlsZSB1MzIgKilwY2lfaW9hZGRyKHBvcnQpOworCWlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorCQlwID0gKHUzMiAqKXBjaV9pb2FkZHIocG9ydCk7CisJZWxzZQorCQlwID0gKHUzMiAqKXBvcnQ7CiAKLQkJd2hpbGUgKGNvdW50LS0pCi0JCQkqcCA9ICpidWYrKzsKLQl9IGVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKKwl3aGlsZSAoY291bnQtLSkKKwkJY3RybF9vdXRsKCpidWYrKywgKHVuc2lnbmVkIGxvbmcpcCk7CiB9CiAKIHZvaWQgX19pb21lbSAqcjc3ODBycF9pb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCXJldHVybiAodm9pZCBfX2lvbWVtICopcG9ydDg4Nzk2bChwb3J0LCBzaXplID4gMSk7Ci0JZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCXJldHVybiAodm9pZCBfX2lvbWVtICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQogCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXBjaV9pb2FkZHIocG9ydCk7CiAKLQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXBvcnQyYWRyKHBvcnQpOworCXJldHVybiAodm9pZCBfX2lvbWVtICopcG9ydDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9sZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwMGEyNS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgUmVuZXNhcyBTb2x1dGlvbnMgSElHSExBTkRFUiBSNzc4MFJQLTEgc3BlY2lmaWMgTEVEIGNvZGUuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9yNzc4MHJwL3I3NzgwcnAuaD4KLQotLyogQ3ljbGUgdGhlIExFRCdzIGluIHRoZSBjbGFzaWMgS25pZ2h0cmlnZXIvU3VuIHBhdHRlcm4gKi8KLXZvaWQgaGVhcnRiZWF0X3I3NzgwcnAodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilQQV9PQkxFRDsKLQlzdGF0aWMgdW5zaWduZWQgYml0ID0gMCwgdXAgPSAxOwotCXVuc2lnbmVkIGJpdF9wb3NbXSA9IHsyLCAxLCAwLCAzLCA2LCA1LCA0LCA3fTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpCi0JCXJldHVybjsKLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LCBmKGludCktPjExMAotCSAqLwotCXBlcmlvZCA9IDExMCAtICgoMzAwIDw8IEZTSElGVCkvKChhdmVucnVuWzBdLzUpICsgKDM8PEZTSElGVCkpKTsKLQotCSpwID0gMSA8PCBiaXRfcG9zW2JpdF07Ci0JaWYgKHVwKQotCQlpZiAoYml0ID09IDcpIHsKLQkJCWJpdC0tOwotCQkJdXAgPSAwOwotCQl9IGVsc2UKLQkJCWJpdCsrOwotCWVsc2UgaWYgKGJpdCA9PSAwKQotCQl1cCA9IDE7Ci0JZWxzZQotCQliaXQtLTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKaW5kZXggOWY4OWM4ZC4uMGQ3NGRiOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKQEAgLTIsNyArMiw3IEBACiAgKiBhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA3IFBhdWwgTXVuZHQKICAqCiAgKiBSZW5lc2FzIFNvbHV0aW9ucyBIaWdobGFuZGVyIFI3NzgwUlAtMSBTdXBwb3J0LgogICoKQEAgLTEyLDEyICsxMiwxMiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9yNzc4MHJwLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLWV4dGVybiB2b2lkIGhlYXJ0YmVhdF9yNzc4MHJwKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdF9yNzc4MHJwX0lSUSh2b2lkKTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtNjY1OTZfdXNiX2hvc3RfcmVzb3VyY2VzW10gPSB7CkBAIC00NiwxNCArNDYsMTQgQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjZl9pZGVfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSAweDFmMCwKLQkJLmVuZAk9IDB4MWYwICsgOCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKKwkJLnN0YXJ0CT0gUEFfQVJFQTVfSU8gKyAweDEwMDAsCisJCS5lbmQJPSBQQV9BUkVBNV9JTyArIDB4MTAwMCArIDB4MDggLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKLQkJLnN0YXJ0CT0gMHgxZjAgKyAweDIwNiwKLQkJLmVuZAk9IDB4MWYwICsgOCArIDB4MjA2ICsgOCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKKwkJLnN0YXJ0CT0gUEFfQVJFQTVfSU8gKyAweDgwYywKKwkJLmVuZAk9IFBBX0FSRUE1X0lPICsgMHg4MGMgKyAweDE2IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMl0gPSB7CiAjaWZkZWYgQ09ORklHX1NIX1I3NzgwTVAKQEAgLTY1LDE2ICs2NSw0NCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHBhdGFfcGxhdGZvcm1faW5mbyBwYXRhX2luZm8gPSB7CisJLmlvcG9ydF9zaGlmdAk9IDEsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjZl9pZGVfZGV2aWNlICA9IHsKIAkubmFtZQkJPSAicGF0YV9wbGF0Zm9ybSIsCiAJLmlkCQk9IC0xLAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjZl9pZGVfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBjZl9pZGVfcmVzb3VyY2VzLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnBhdGFfaW5mbywKKwl9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhcnRiZWF0X2JpdF9wb3NbXSA9IHsgMiwgMSwgMCwgMywgNiwgNSwgNCwgNyB9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGhlYXJ0YmVhdF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFBBX09CTEVELAorCQkuZW5kCT0gUEFfT0JMRUQgKyBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9iaXRfcG9zKSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoZWFydGJlYXRfZGV2aWNlID0geworCS5uYW1lCQk9ICJoZWFydGJlYXQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9IGhlYXJ0YmVhdF9iaXRfcG9zLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcjc3ODBycF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmbTY2NTk2X3VzYl9ob3N0X2RldmljZSwKIAkmY2ZfaWRlX2RldmljZSwKKwkmaGVhcnRiZWF0X2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHI3NzgwcnBfZGV2aWNlc19zZXR1cCh2b2lkKQpAQCAtMTQ4LDcgKzE3Niw3IEBACiAjaWZuZGVmIENPTkZJR19TSF9SNzc4ME1QCiAJY3RybF9vdXR3KDB4MDAwMSwgUEFfU0RQT1cpOwkvKiBTRCBQb3dlciBPTiAqLwogI2VuZGlmCi0JY3RybF9vdXR3KGN0cmxfaW53KFBBX0lWRFJDVEwpIHwgMHgwMTAwLCBQQV9JVkRSQ1RMKTsJLyogU2kxMzExMiAqLworCWN0cmxfb3V0dyhjdHJsX2ludyhQQV9JVkRSQ1RMKSB8IDB4MDEsIFBBX0lWRFJDVEwpOwkvKiBTaTEzMTEyICovCiAKIAlwbV9wb3dlcl9vZmYgPSByNzc4MHJwX3Bvd2VyX29mZjsKIH0KQEAgLTE4NSw4ICsyMTMsNSBAQAogCiAJLm12X2lvcG9ydF9tYXAJCT0gcjc3ODBycF9pb3BvcnRfbWFwLAogCS5tdl9pbml0X2lycQkJPSBpbml0X3I3NzgwcnBfSVJRLAotI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKLQkubXZfaGVhcnRiZWF0CQk9IGhlYXJ0YmVhdF9yNzc4MHJwLAotI2VuZGlmCiB9OwogQUxJQVNfTVYocjc3ODBycCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9NYWtlZmlsZQppbmRleCA2ODZmYzllLi4wZDRjNzVhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL01ha2VmaWxlCkBAIC0yLDUgKzIsNCBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIFJUUzc3NTFSMkQgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAogIwogCi1vYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCi1vYmotJChDT05GSUdfSEVBUlRCRUFUKSArPSBsZWQubworb2JqLXkJIDo9IHNldHVwLm8gaXJxLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTA3YTguLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAgSWFuIGRhIFNpbHZhLCBKZXJlbXkgU2llZ2VsCi0gKiBCYXNlZCBsYXJnZWx5IG9uIGlvX3NlLmMuCi0gKgotICogSS9PIHJvdXRpbmUgZm9yIFJlbmVzYXMgVGVjaG5vbG9neSBzYWxlcyBSVFM3NzUxUjJELgotICoKLSAqIEluaXRpYWwgdmVyc2lvbiBvbmx5IHRvIHN1cHBvcnQgTEFOIGFjY2Vzczsgc29tZQotICogcGxhY2Vob2xkZXIgY29kZSBmcm9tIGlvX3J0czc3NTFyMmQuYyBsZWZ0IGluIHdpdGggdGhlCi0gKiBleHBlY3RhdGlvbiBvZiBsYXRlciBTdXBlcklPIGFuZCBQQ01DSUEgYWNjZXNzLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGFzbS9ydHM3NzUxcjJkLmg+Ci0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotCi0vKgotICogVGhlIDc3NTFSIFJUUzc3NTFSMkQgdXNlcyB0aGUgYnVpbHQtaW4gUENJIGNvbnRyb2xsZXIgKFBDSUMpCi0gKiBvZiB0aGUgNzc1MVIgcHJvY2Vzc29yLCBhbmQgaGFzIGEgU3VwZXJJTyBhY2Nlc3NpYmxlIHZpYSB0aGUgUENJLgotICogVGhlIGJvYXJkIGFsc28gaW5jbHVkZXMgYSBQQ01DSUEgY29udHJvbGxlciBvbiBpdHMgbWVtb3J5IGJ1cywKLSAqIGxpa2UgdGhlIG90aGVyIFNvbHV0aW9uIEVuZ2luZSBib2FyZHMuCi0gKi8KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvcnQyYWRyKHVuc2lnbmVkIGludCBwb3J0KQotewotCWlmICgoMHgxZjAgPD0gcG9ydCAmJiBwb3J0IDwgMHgxZjgpIHx8IHBvcnQgPT0gMHgzZjYpCi0JCWlmIChwb3J0ID09IDB4M2Y2KQotCQkJcmV0dXJuIChQQV9BUkVBNV9JTyArIDB4ODBjKTsKLQkJZWxzZQotCQkJcmV0dXJuIChQQV9BUkVBNV9JTyArIDB4MTAwMCArICgocG9ydC0weDFmMCkgPDwgMSkpOwotCWVsc2UKLQkJbWF5YmViYWRpbygodW5zaWduZWQgbG9uZylwb3J0KTsKLQotCXJldHVybiBwb3J0OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9ydDg4Nzk2bCh1bnNpZ25lZCBpbnQgcG9ydCwgaW50IGZsYWcpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCi0JaWYgKGZsYWcpCi0JCWFkZHIgPSBQQV9BWDg4Nzk2TCArICgocG9ydCAtIEFYODg3OTZMX0lPX0JBU0UpIDw8IDEpOwotCWVsc2UKLQkJYWRkciA9IFBBX0FYODg3OTZMICsgKChwb3J0IC0gQVg4ODc5NkxfSU9fQkFTRSkgPDwgMSkgKyAweDEwMDA7Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLQotLyogVGhlIDc3NTFSIFJUUzc3NTFSMkQgc2VlbXMgdG8gaGF2ZSBldmVyeXRoaW5nIGhvb2tlZCAqLwotLyogdXAgcHJldHR5IG5vcm1hbGx5IChub3RoaW5nIG9uIGhpZ2gtYnl0ZXMgb25seS4uLikgc28gdGhpcyAqLwotLyogc2hvdWxkbid0IGJlIG5lZWRlZCAqLwotc3RhdGljIGlubGluZSBpbnQgc2hpZnRlZF9wb3J0KHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQkvKiBGb3IgSURFIHJlZ2lzdGVycywgdmFsdWUgaXMgbm90IHNoaWZ0ZWQgKi8KLQlpZiAoKDB4MWYwIDw9IHBvcnQgJiYgcG9ydCA8IDB4MWY4KSB8fCBwb3J0ID09IDB4M2Y2KQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAxOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfTkUyMDAwKSB8fCBkZWZpbmVkKENPTkZJR19ORTIwMDBfTU9EVUxFKQotI2RlZmluZSBDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpIFwKLSAgKChwb3J0ID49IEFYODg3OTZMX0lPX0JBU0UpICYmIChwb3J0IDwgKEFYODg3OTZMX0lPX0JBU0UrMHgyMCkpKQotI2Vsc2UKLSNkZWZpbmUgQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSAoMCkKLSNlbmRpZgotCi0vKgotICogR2VuZXJhbCBvdXRsaW5lOiByZW1hcCByZWFsbHkgbG93IHN0dWZmIFtldmVudHVhbGx5XSB0byBTdXBlcklPLAotICogc3R1ZmYgaW4gUENJIElPIHNwYWNlIChhdCBvciBhYm92ZSB3aW5kb3cgYXQgcGNpLmg6UENJQklPU19NSU5fSU8pCi0gKiBpcyBtYXBwZWQgdGhyb3VnaCB0aGUgUENJIElPIHdpbmRvdy4gIFN0dWZmIHdpdGggaGlnaCBiaXRzIChQWFNFRykKLSAqIHNob3VsZCBiZSB3YXkgYmV5b25kIHRoZSB3aW5kb3csIGFuZCBpcyB1c2VkICB3L28gdHJhbnNsYXRpb24gZm9yCi0gKiBjb21wYXRpYmlsaXR5LgotICovCi11bnNpZ25lZCBjaGFyIHJ0czc3NTFyMmRfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJcmV0dXJuICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDg4Nzk2bChwb3J0LCAwKSkgJiAweGZmOwotCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JZWxzZQotCQlyZXR1cm4gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KSAmIDB4ZmYpOwotfQotCi11bnNpZ25lZCBjaGFyIHJ0czc3NTFyMmRfaW5iX3AodW5zaWduZWQgbG9uZyBwb3J0KQotewotCXVuc2lnbmVkIGNoYXIgdjsKLQotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQl2ID0gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDApKSAmIDB4ZmY7Ci0gICAgICAgIGVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQl2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JZWxzZQotCQl2ID0gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KSAmIDB4ZmYpOwotCi0JY3RybF9kZWxheSgpOwotCi0JcmV0dXJuIHY7Ci19Ci0KLXVuc2lnbmVkIHNob3J0IHJ0czc3NTFyMmRfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJbWF5YmViYWRpbyhwb3J0KTsKLSAgICAgICAgZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwY2lfaW9hZGRyKHBvcnQpOwotCWVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKLQotCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBpbnQgcnRzNzc1MXIyZF9pbmwodW5zaWduZWQgbG9uZyBwb3J0KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotICAgICAgICBlbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXBvcnQ7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCi0JCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilwY2lfaW9hZGRyKHBvcnQpOwotCWVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHJ0czc3NTFyMmRfb3V0Yih1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCi0JCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDg4Nzk2bChwb3J0LCAwKSkgPSB2YWx1ZTsKLSAgICAgICAgZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcGNpX2lvYWRkcihwb3J0KSA9IHZhbHVlOwotCWVsc2UKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQyYWRyKHBvcnQpID0gdmFsdWU7Ci19Ci0KLXZvaWQgcnRzNzc1MXIyZF9vdXRiX3AodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQkqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQ4ODc5NmwocG9ydCwgMCkpID0gdmFsdWU7Ci0gICAgICAgIGVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCi0JCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBjaV9pb2FkZHIocG9ydCkgPSB2YWx1ZTsKLQllbHNlCi0JCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KSA9IHZhbHVlOwotCi0JY3RybF9kZWxheSgpOwotfQotCi12b2lkIHJ0czc3NTFyMmRfb3V0dyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotICAgICAgICBlbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBjaV9pb2FkZHIocG9ydCkgPSB2YWx1ZTsKLQllbHNlCi0JCW1heWJlYmFkaW8ocG9ydCk7Ci19Ci0KLXZvaWQgcnRzNzc1MXIyZF9vdXRsKHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotICAgICAgICBlbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopcG9ydCA9IHZhbHVlOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilwY2lfaW9hZGRyKHBvcnQpID0gdmFsdWU7Ci0JZWxzZQotCQltYXliZWJhZGlvKHBvcnQpOwotfQotCi12b2lkIHJ0czc3NTFyMmRfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyBhID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKLQl2b2xhdGlsZSBfX3U4ICpicDsKLQl2b2xhdGlsZSBfX3UxNiAqcDsKLQotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKSB7Ci0JCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDApOwotCQl3aGlsZSAoY291bnQtLSkKLQkJCWN0cmxfb3V0YigqcCAmIDB4ZmYsIGErKyk7Ci0JfSBlbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJd2hpbGUgKGNvdW50LS0pCi0JCQljdHJsX291dGIoY3RybF9pbmIocG9ydCksIGErKyk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKLQkJYnAgPSAoX191OCAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JCXdoaWxlIChjb3VudC0tKQotCQkJY3RybF9vdXRiKCpicCwgYSsrKTsKLQl9IGVsc2UgewotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7Ci0JCXdoaWxlIChjb3VudC0tKQotCQkJY3RybF9vdXRiKCpwICYgMHhmZiwgYSsrKTsKLQl9Ci19Ci0KLXZvaWQgcnRzNzc1MXIyZF9pbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIGEgPSAodW5zaWduZWQgbG9uZylhZGRyOwotCXZvbGF0aWxlIF9fdTE2ICpwOwotCi0JaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCi0JCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDEpOwotCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JZWxzZQotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7Ci0Jd2hpbGUgKGNvdW50LS0pCi0JCWN0cmxfb3V0dygqcCwgYSsrKTsKLX0KLQotdm9pZCBydHM3NzUxcjJkX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7Ci0KLQkJd2hpbGUgKGNvdW50LS0pIHsKLQkJCWN0cmxfb3V0bChjdHJsX2lubChwY2lfaW9hZGRyKHBvcnQpKSwgYSk7Ci0JCQlhICs9IDQ7Ci0JCX0KLQl9IGVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKLX0KLQotdm9pZCBydHM3NzUxcjJkX291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIGEgPSAodW5zaWduZWQgbG9uZylhZGRyOwotCXZvbGF0aWxlIF9fdTggKmJwOwotCXZvbGF0aWxlIF9fdTE2ICpwOwotCi0JaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpIHsKLQkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQ4ODc5NmwocG9ydCwgMCk7Ci0JCXdoaWxlIChjb3VudC0tKQotCQkJKnAgPSBjdHJsX2luYihhKyspOwotCX0gZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCXdoaWxlIChjb3VudC0tKQotCQkJY3RybF9vdXRiKGErKywgcG9ydCk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKLQkJYnAgPSAoX191OCAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JCXdoaWxlIChjb3VudC0tKQotCQkJKmJwID0gY3RybF9pbmIoYSsrKTsKLQl9IGVsc2UgewotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7Ci0JCXdoaWxlIChjb3VudC0tKQotCQkJKnAgPSBjdHJsX2luYihhKyspOwotCX0KLX0KLQotdm9pZCBydHM3NzUxcjJkX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIGEgPSAodW5zaWduZWQgbG9uZylhZGRyOwotCXZvbGF0aWxlIF9fdTE2ICpwOwotCi0JaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCi0JCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDEpOwotCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JZWxzZQotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7Ci0KLQl3aGlsZSAoY291bnQtLSkgewotCQljdHJsX291dHcoKnAsIGEpOwotCQlhICs9IDI7Ci0JfQotfQotCi12b2lkIHJ0czc3NTFyMmRfb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7Ci0KLQkJd2hpbGUgKGNvdW50LS0pIHsKLQkJCWN0cmxfb3V0bChjdHJsX2lubChhKSwgcGNpX2lvYWRkcihwb3J0KSk7Ci0JCQlhICs9IDQ7Ci0JCX0KLQl9IGVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKLX0KLQotdW5zaWduZWQgbG9uZyBydHM3NzUxcjJkX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JcmV0dXJuIHBvcnQyYWRyKG9mZnNldCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaXJxLmMKaW5kZXggY2IwZWIyMC4uMGJhZTkwNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pcnEuYwpAQCAtOSw3ICs5LDkgQEAKICAqIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLiAyMDAyLgogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQuaD4KIApAQCAtMjIsNzkgKzI0LDMxIEBACiBleHRlcm4gaW50IHZveWFnZXJneF9pcnFfZGVtdXgoaW50IGlycSk7CiBleHRlcm4gdm9pZCBzZXR1cF92b3lhZ2VyZ3hfaXJxKHZvaWQpOwogCi1zdGF0aWMgdm9pZCBlbmFibGVfcnRzNzc1MXIyZF9pcnEodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCBkaXNhYmxlX3J0czc3NTFyMmRfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi0vKiBzaHV0ZG93biBpcyBzYW1lIGFzICJkaXNhYmxlIiAqLwotI2RlZmluZSBzaHV0ZG93bl9ydHM3NzUxcjJkX2lycSBkaXNhYmxlX3J0czc3NTFyMmRfaXJxCi0KLXN0YXRpYyB2b2lkIGFja19ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIGVuZF9ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3J0czc3NTFyMmRfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBlbmFibGVfcnRzNzc1MXIyZF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQllbmFibGVfcnRzNzc1MXIyZF9pcnEoaXJxKTsKLQlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLworCS8qIFNldCBwcmlvcml0eSBpbiBJUFIgYmFjayB0byBvcmlnaW5hbCB2YWx1ZSAqLworCWN0cmxfb3V0dyhjdHJsX2ludyhJUkxDTlRSMSkgfCAoMSA8PCBtYXNrX3Bvc1tpcnFdKSwgSVJMQ05UUjEpOwogfQogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3J0czc3NTFyMmRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsOwotCXVuc2lnbmVkIHNob3J0IG1hc2sgPSAweGZmZmYgXiAoMHgwMDAxIDw8IG1hc2tfcG9zW2lycV0pOwotCiAJLyogU2V0IHRoZSBwcmlvcml0eSBpbiBJUFIgdG8gMCAqLwotCXZhbCA9IGN0cmxfaW53KElSTENOVFIxKTsKLQl2YWwgJj0gbWFzazsKLQljdHJsX291dHcodmFsLCBJUkxDTlRSMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIHNob3J0IHZhbDsKLQl1bnNpZ25lZCBzaG9ydCB2YWx1ZSA9ICgweDAwMDEgPDwgbWFza19wb3NbaXJxXSk7Ci0KLQkvKiBTZXQgcHJpb3JpdHkgaW4gSVBSIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KLQl2YWwgPSBjdHJsX2ludyhJUkxDTlRSMSk7Ci0JdmFsIHw9IHZhbHVlOwotCWN0cmxfb3V0dyh2YWwsIElSTENOVFIxKTsKKwljdHJsX291dHcoY3RybF9pbncoSVJMQ05UUjEpICYgKDB4ZmZmZiBeICgxIDw8IG1hc2tfcG9zW2lycV0pKSwKKwkJICBJUkxDTlRSMSk7CiB9CiAKIGludCBydHM3NzUxcjJkX2lycV9kZW11eChpbnQgaXJxKQogewotCWludCBkZW11eF9pcnE7Ci0KLQlkZW11eF9pcnEgPSB2b3lhZ2VyZ3hfaXJxX2RlbXV4KGlycSk7Ci0JcmV0dXJuIGRlbXV4X2lycTsKKwlyZXR1cm4gdm95YWdlcmd4X2lycV9kZW11eChpcnEpOwogfQogCi1zdGF0aWMgdm9pZCBhY2tfcnRzNzc1MXIyZF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlkaXNhYmxlX3J0czc3NTFyMmRfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZF9ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQotCQllbmFibGVfcnRzNzc1MXIyZF9pcnEoaXJxKTsKLX0KLQotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBydHM3NzUxcjJkX2lycV90eXBlID0gewotCS50eXBlbmFtZSA9ICJSVFM3NzUxUjJEIElSUSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX3J0czc3NTFyMmRfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX3J0czc3NTFyMmRfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfcnRzNzc1MXIyZF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX3J0czc3NTFyMmRfaXJxLAotCS5hY2sgPSBhY2tfcnRzNzc1MXIyZF9pcnEsCi0JLmVuZCA9IGVuZF9ydHM3NzUxcjJkX2lycSwKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcnRzNzc1MXIyZF9pcnFfY2hpcCBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJydHM3NzUxcjJkIiwKKwkubWFzawkJPSBkaXNhYmxlX3J0czc3NTFyMmRfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX3J0czc3NTFyMmRfaXJxLAorCS5tYXNrX2Fjawk9IGRpc2FibGVfcnRzNzc1MXIyZF9pcnEsCiB9OwogCi1zdGF0aWMgdm9pZCBtYWtlX3J0czc3NTFyMmRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JaXJxX2Rlc2NbaXJxXS5jaGlwID0gJnJ0czc3NTFyMmRfaXJxX3R5cGU7Ci0JZGlzYWJsZV9ydHM3NzUxcjJkX2lycShpcnEpOwotfQotCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCkBAIC0xMTksOCArNzMsMTIgQEAKIAkgKiBJUkwxND1FeHRlbnRpb24gIzMKIAkgKi8KIAotCWZvciAoaT0wOyBpPDE1OyBpKyspCi0JCW1ha2VfcnRzNzc1MXIyZF9pcnEoaSk7CisJZm9yIChpPTA7IGk8MTU7IGkrKykgeworCQlkaXNhYmxlX2lycV9ub3N5bmMoaSk7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGksICZydHM3NzUxcjJkX2lycV9jaGlwLAorCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKKwkJZW5hYmxlX3J0czc3NTFyMmRfaXJxKGkpOworCX0KIAogCXNldHVwX3ZveWFnZXJneF9pcnEoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9sZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5ZjU0OC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2xlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgUmVuZXNhcyBUZWNobm9sb2d5IFNhbGVzIFJUUzc3NTFSMkQgc3BlY2lmaWMgTEVEIGNvZGUuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQuaD4KLQotLyogQ3ljbGUgdGhlIExFRCdzIGluIHRoZSBjbGFzaWMgS25pZ2h0cmlnZXIvU3VuIHBhdHRlcm4gKi8KLXZvaWQgaGVhcnRiZWF0X3J0czc3NTFyMmQodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilQQV9PVVRQT1JUOwotCXN0YXRpYyB1bnNpZ25lZCBiaXQgPSAwLCB1cCA9IDE7Ci0KLQljbnQgKz0gMTsKLQlpZiAoY250IDwgcGVyaW9kKQotCQlyZXR1cm47Ci0KLQljbnQgPSAwOwotCi0JLyogR28gdGhyb3VnaCB0aGUgcG9pbnRzIChyb3VnaGx5ISk6Ci0JICogZigwKT0xMCwgZigxKT0xNiwgZigyKT0yMCwgZig1KT0zNSwgZihpbnQpLT4xMTAKLQkgKi8KLQlwZXJpb2QgPSAxMTAgLSAoKDMwMCA8PCBGU0hJRlQpLygoYXZlbnJ1blswXS81KSArICgzPDxGU0hJRlQpKSk7Ci0KLQkqcCA9IDEgPDwgYml0OwotCWlmICh1cCkKLQkJaWYgKGJpdCA9PSA3KSB7Ci0JCQliaXQtLTsKLQkJCXVwID0gMDsKLQkJfSBlbHNlCi0JCQliaXQrKzsKLQllbHNlIGlmIChiaXQgPT0gMCkKLQkJdXAgPSAxOwotCWVsc2UKLQkJYml0LS07Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCmluZGV4IDVjMDQyZDMuLjQ0YjQyMDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIFJlbmVzYXMgVGVjaG5vbG9neSBTYWxlcyBSVFM3NzUxUjJEIFN1cHBvcnQuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgotICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNiBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA2IEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNyBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTEwLDMzICsxMCwxMyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9ydHM3NzUxcjJkLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQuaD4KICNpbmNsdWRlIDxhc20vdm95YWdlcmd4Lmg+Ci0KLWV4dGVybiB2b2lkIGhlYXJ0YmVhdF9ydHM3NzUxcjJkKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdF9ydHM3NzUxcjJkX0lSUSh2b2lkKTsKLWV4dGVybiBpbnQgcnRzNzc1MXIyZF9pcnFfZGVtdXgoaW50IGlycSk7Ci0KLWV4dGVybiB2b2lkICp2b3lhZ2VyZ3hfY29uc2lzdGVudF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgZG1hX2FkZHJfdCAqLCBnZnBfdCk7Ci1leHRlcm4gaW50IHZveWFnZXJneF9jb25zaXN0ZW50X2ZyZWUoc3RydWN0IGRldmljZSAqLCBzaXplX3QsIHZvaWQgKiwgZG1hX2FkZHJfdCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgdWFydF9wbGF0Zm9ybV9kYXRhW10gPSB7Ci0JewotCQkubWVtYmFzZQk9ICh2b2lkICopVk9ZQUdFUl9VQVJUX0JBU0UsCi0JCS5tYXBiYXNlCT0gVk9ZQUdFUl9VQVJUX0JBU0UsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5pcnEJCT0gVk9ZQUdFUl9VQVJUMF9JUlEsCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJLnJlZ3NoaWZ0CT0gMiwKLQkJLnVhcnRjbGsJPSAoOTYwMCAqIDE2KSwKLQl9LCB7Ci0JCS5mbGFncwkJPSAwLAotCX0sCi19OworI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgdm9pZCBfX2luaXQgdm95YWdlcmd4X3NlcmlhbF9pbml0KHZvaWQpCiB7CkBAIC00NSwzMiArMjUsOTYgQEAKIAkvKgogCSAqIEdQSU8gQ29udHJvbAogCSAqLwotCXZhbCA9IGlubChHUElPX01VWF9ISUdIKTsKKwl2YWwgPSByZWFkbCgodm9pZCBfX2lvbWVtICopR1BJT19NVVhfSElHSCk7CiAJdmFsIHw9IDB4MDAwMDFmZTA7Ci0Jb3V0bCh2YWwsIEdQSU9fTVVYX0hJR0gpOworCXdyaXRlbCh2YWwsICh2b2lkIF9faW9tZW0gKilHUElPX01VWF9ISUdIKTsKIAogCS8qCiAJICogUG93ZXIgTW9kZSBHYXRlCiAJICovCi0JdmFsID0gaW5sKFBPV0VSX01PREUwX0dBVEUpOworCXZhbCA9IHJlYWRsKCh2b2lkIF9faW9tZW0gKilQT1dFUl9NT0RFMF9HQVRFKTsKIAl2YWwgfD0gKFBPV0VSX01PREUwX0dBVEVfVTAgfCBQT1dFUl9NT0RFMF9HQVRFX1UxKTsKLQlvdXRsKHZhbCwgUE9XRVJfTU9ERTBfR0FURSk7CisJd3JpdGVsKHZhbCwgKHZvaWQgX19pb21lbSAqKVBPV0VSX01PREUwX0dBVEUpOwogCi0JdmFsID0gaW5sKFBPV0VSX01PREUxX0dBVEUpOworCXZhbCA9IHJlYWRsKCh2b2lkIF9faW9tZW0gKilQT1dFUl9NT0RFMV9HQVRFKTsKIAl2YWwgfD0gKFBPV0VSX01PREUxX0dBVEVfVTAgfCBQT1dFUl9NT0RFMV9HQVRFX1UxKTsKLQlvdXRsKHZhbCwgUE9XRVJfTU9ERTFfR0FURSk7CisJd3JpdGVsKHZhbCwgKHZvaWQgX19pb21lbSAqKVBPV0VSX01PREUxX0dBVEUpOwogfQogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNmX2lkZV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFBBX0FSRUE1X0lPICsgMHgxMDAwLAorCQkuZW5kCT0gUEFfQVJFQTVfSU8gKyAweDEwMDAgKyAweDA4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IFBBX0FSRUE1X0lPICsgMHg4MGMsCisJCS5lbmQJPSBQQV9BUkVBNV9JTyArIDB4ODBjICsgMHgxNiAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzJdID0geworI2lmZGVmIENPTkZJR19SVFM3NzUxUjJEX1JFVjExCisJCS5zdGFydAk9IDEsCisjZWxzZQorCQkuc3RhcnQJPSAyLAorI2VuZGlmCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBhdGFfcGxhdGZvcm1faW5mbyBwYXRhX2luZm8gPSB7CisJLmlvcG9ydF9zaGlmdAk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjZl9pZGVfZGV2aWNlICA9IHsKKwkubmFtZQkJPSAicGF0YV9wbGF0Zm9ybSIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjZl9pZGVfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBjZl9pZGVfcmVzb3VyY2VzLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnBhdGFfaW5mbywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCB1YXJ0X3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tZW1iYXNlCT0gKHZvaWQgX19pb21lbSAqKVZPWUFHRVJfVUFSVF9CQVNFLAorCQkubWFwYmFzZQk9IFZPWUFHRVJfVUFSVF9CQVNFLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkuaXJxCQk9IFZPWUFHRVJfVUFSVDBfSVJRLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCQkucmVnc2hpZnQJPSAyLAorCQkudWFydGNsawk9ICg5NjAwICogMTYpLAorCX0KK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHVhcnRfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCT0gLTEsCisJLmlkCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKIAkuZGV2CQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSB1YXJ0X3BsYXRmb3JtX2RhdGEsCiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaGVhcnRiZWF0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUEFfT1VUUE9SVCwKKwkJLmVuZAk9IFBBX09VVFBPUlQgKyA4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGhlYXJ0YmVhdF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImhlYXJ0YmVhdCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZWFydGJlYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoZWFydGJlYXRfcmVzb3VyY2VzLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnJ0czc3NTFyMmRfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnVhcnRfZGV2aWNlLAorCSZoZWFydGJlYXRfZGV2aWNlLAorCSZjZl9pZGVfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcnRzNzc1MXIyZF9kZXZpY2VzX3NldHVwKHZvaWQpCkBAIC03OCw2ICsxMjIsNyBAQAogCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhydHM3NzUxcjJkX2RldmljZXMsCiAJCQkJICAgIEFSUkFZX1NJWkUocnRzNzc1MXIyZF9kZXZpY2VzKSk7CiB9CitfX2luaXRjYWxsKHJ0czc3NTFyMmRfZGV2aWNlc19zZXR1cCk7CiAKIHN0YXRpYyB2b2lkIHJ0czc3NTFyMmRfcG93ZXJfb2ZmKHZvaWQpCiB7CkBAIC04OSwxNCArMTM0LDE3IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBydHM3NzUxcjJkX3NldHVwKGNoYXIgKipjbWRsaW5lX3ApCiB7Ci0JZGV2aWNlX2luaXRjYWxsKHJ0czc3NTFyMmRfZGV2aWNlc19zZXR1cCk7CisJdTE2IHZlciA9IGN0cmxfaW53KFBBX1ZFUlJFRyk7CisKKwlwcmludGsoS0VSTl9JTkZPICJSZW5lc2FzIFRlY2hub2xvZ3kgU2FsZXMgUlRTNzc1MVIyRCBzdXBwb3J0LlxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICJGUEdBIHZlcnNpb246JWQgKHJldmlzaW9uOiVkKVxuIiwKKwkJCQkJKHZlciA+PiA0KSAmIDB4ZiwgdmVyICYgMHhmKTsKIAogCWN0cmxfb3V0dygweDAwMDAsIFBBX09VVFBPUlQpOwogCXBtX3Bvd2VyX29mZiA9IHJ0czc3NTFyMmRfcG93ZXJfb2ZmOwogCiAJdm95YWdlcmd4X3NlcmlhbF9pbml0KCk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJSZW5lc2FzIFRlY2hub2xvZ3kgU2FsZXMgUlRTNzc1MVIyRCBzdXBwb3J0LlxuIik7CiB9CiAKIC8qCkBAIC0xMDcsMzEgKzE1NSw3IEBACiAJLm12X3NldHVwCQk9IHJ0czc3NTFyMmRfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCiAKLQkubXZfaW5iCQkJPSBydHM3NzUxcjJkX2luYiwKLQkubXZfaW53CQkJPSBydHM3NzUxcjJkX2ludywKLQkubXZfaW5sCQkJPSBydHM3NzUxcjJkX2lubCwKLQkubXZfb3V0YgkJPSBydHM3NzUxcjJkX291dGIsCi0JLm12X291dHcJCT0gcnRzNzc1MXIyZF9vdXR3LAotCS5tdl9vdXRsCQk9IHJ0czc3NTFyMmRfb3V0bCwKLQotCS5tdl9pbmJfcAkJPSBydHM3NzUxcjJkX2luYl9wLAotCS5tdl9pbndfcAkJPSBydHM3NzUxcjJkX2ludywKLQkubXZfaW5sX3AJCT0gcnRzNzc1MXIyZF9pbmwsCi0JLm12X291dGJfcAkJPSBydHM3NzUxcjJkX291dGJfcCwKLQkubXZfb3V0d19wCQk9IHJ0czc3NTFyMmRfb3V0dywKLQkubXZfb3V0bF9wCQk9IHJ0czc3NTFyMmRfb3V0bCwKLQotCS5tdl9pbnNiCQk9IHJ0czc3NTFyMmRfaW5zYiwKLQkubXZfaW5zdwkJPSBydHM3NzUxcjJkX2luc3csCi0JLm12X2luc2wJCT0gcnRzNzc1MXIyZF9pbnNsLAotCS5tdl9vdXRzYgkJPSBydHM3NzUxcjJkX291dHNiLAotCS5tdl9vdXRzdwkJPSBydHM3NzUxcjJkX291dHN3LAotCS5tdl9vdXRzbAkJPSBydHM3NzUxcjJkX291dHNsLAotCiAJLm12X2luaXRfaXJxCQk9IGluaXRfcnRzNzc1MXIyZF9JUlEsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gaGVhcnRiZWF0X3J0czc3NTFyMmQsCi0jZW5kaWYKIAkubXZfaXJxX2RlbXV4CQk9IHJ0czc3NTFyMmRfaXJxX2RlbXV4LAogCiAjaWZkZWYgQ09ORklHX1VTQl9TTTUwMQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvTWFrZWZpbGUKaW5kZXggNjM5NTBmNGYuLjYzZTdlZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9NYWtlZmlsZQpAQCAtMyw1ICszLDMgQEAKICMKIAogb2JqLXkJIDo9IHNldHVwLm8gaW8ubyBpcnEubwotb2JqLSQoQ09ORklHX0hFQVJUQkVBVCkgKz0gbGVkLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvbGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzk0NjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9sZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9sZWRfc2UuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBTdHVhcnQgTWVuZWZ5IDxzdHVhcnQubWVuZWZ5QHN0LmNvbT4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIFNvbHV0aW9uIEVuZ2luZSBzcGVjaWZpYyBMRUQgY29kZS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNtL3NlNzIwNi5oPgotCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotLyogQ3ljbGUgdGhlIExFRCdzIGluIHRoZSBjbGFzaWMgS25pZ2h0cmlkZXIvU3VuIHBhdHRlcm4gKi8KLXZvaWQgaGVhcnRiZWF0X3NlKHZvaWQpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBjbnQgPSAwLCBwZXJpb2QgPSAwOwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KiBwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KilQQV9MRUQ7Ci0Jc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCi0JICovCi0JcGVyaW9kID0gMTEwIC0gKCAoMzAwPDxGU0hJRlQpLwotCQkJICgoYXZlbnJ1blswXS81KSArICgzPDxGU0hJRlQpKSApOwotCi0JaWYgKHVwKSB7Ci0JCWlmIChiaXQgPT0gNykgewotCQkJYml0LS07Ci0JCQl1cD0wOwotCQl9IGVsc2UgewotCQkJYml0ICsrOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGJpdCA9PSAwKSB7Ci0JCQliaXQrKzsKLQkJCXVwPTE7Ci0JCX0gZWxzZSB7Ci0JCQliaXQtLTsKLQkJfQotCX0KLQkqcCA9IDE8PChiaXQrOCk7Ci0KLX0KLSNlbmRpZiAvKiBDT05GSUdfSEVBUlRCRUFUICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMKaW5kZXggMGY0MmU5MS4uY2E3MTQ4NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvc2V0dXAuYwpAQCAtMyw2ICszLDcgQEAKICAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvc2V0dXAuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwNiAgWW9zaGlub3JpIFNhdG8KKyAqIENvcHlyaWdodCAoQykgMjAwNyAgUGF1bCBNdW5kdAogICoKICAqIEhpdGFjaGkgNzIwNiBTb2x1dGlvbkVuZ2luZSBTdXBwb3J0LgogICoKQEAgLTM0LDE1ICszNSwzNyBAQAogCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgdW5zaWduZWQgY2hhciBoZWFydGJlYXRfYml0X3Bvc1tdID0geyA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaGVhcnRiZWF0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUEFfTEVELAorCQkuZW5kCT0gUEFfTEVEICsgQVJSQVlfU0laRShoZWFydGJlYXRfYml0X3BvcykgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGVhcnRiZWF0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiaGVhcnRiZWF0IiwKKwkuaWQJCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBoZWFydGJlYXRfYml0X3BvcywKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZWFydGJlYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoZWFydGJlYXRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNlNzIwNl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc21jOTF4X2RldmljZSwKKwkmaGVhcnRiZWF0X2RldmljZSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHNlNzIwNl9kZXZpY2VzX3NldHVwKHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc21jOTF4X2RldmljZSk7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNlNzIwNl9kZXZpY2VzLCBBUlJBWV9TSVpFKHNlNzIwNl9kZXZpY2VzKSk7CiB9Ci0KIF9faW5pdGNhbGwoc2U3MjA2X2RldmljZXNfc2V0dXApOwogCi12b2lkIGhlYXJ0YmVhdF9zZSh2b2lkKTsKLQogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCkBAIC03Miw4ICs5NSw1IEBACiAJLm12X291dHNsCQk9IHNlNzIwNl9vdXRzbCwKIAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NlNzIwNl9JUlEsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gaGVhcnRiZWF0X3NlLAotI2VuZGlmCiB9OwogQUxJQVNfTVYoc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9NYWtlZmlsZQppbmRleCAwZmJkNGY0Li40NjI0NzM2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvTWFrZWZpbGUKQEAgLTMsNSArMywzIEBACiAjCiAKIG9iai15CSA6PSBzZXR1cC5vIGlvLm8gaXJxLm8KLQotb2JqLSQoQ09ORklHX0hFQVJUQkVBVCkgKz0gbGVkLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvbGVkLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL2xlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDAzYmI3Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9sZWQuYwotICoKLSAqIERlcml2ZWQgZnJvbSBsaW51eC9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2xlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgPHN0dWFydC5tZW5lZnlAc3QuY29tPgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgU29sdXRpb24gRW5naW5lIHNwZWNpZmljIExFRCBjb2RlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZTczMDAuaD4KLQotLyogQ3ljbGUgdGhlIExFRCdzIGluIHRoZSBjbGFzaWMgS25pZ2h0cmlkZXIvU3VuIHBhdHRlcm4gKi8KLXZvaWQgaGVhcnRiZWF0XzczMDBzZSh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBQQV9MRUQ7Ci0Jc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCi0JICovCi0JcGVyaW9kID0gMTEwIC0gKCgzMDAgPDwgRlNISUZUKSAvICgoYXZlbnJ1blswXSAvIDUpICsgKDMgPDwgRlNISUZUKSkpOwotCi0JaWYgKHVwKSB7Ci0JCWlmIChiaXQgPT0gNykgewotCQkJYml0LS07Ci0JCQl1cCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQliaXQrKzsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChiaXQgPT0gMCkgewotCQkJYml0Kys7Ci0JCQl1cCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQliaXQtLTsKLQkJfQotCX0KLQkqcCA9IDEgPDwgKGJpdCArIDgpOwotCi19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYwppbmRleCA2ZjA4MmE3Mi4uZjE5NjA5NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYwpAQCAtNiwxNCArNiw0MyBAQAogICogU0gtTW9iaWxlIFNvbHV0aW9uRW5naW5lIDczMDAgU3VwcG9ydC4KICAqCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9zZTczMDAuaD4KIAotdm9pZCBoZWFydGJlYXRfNzMwMHNlKHZvaWQpOwogdm9pZCBpbml0XzczMDBzZV9JUlEodm9pZCk7CiAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYXJ0YmVhdF9iaXRfcG9zW10gPSB7IDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoZWFydGJlYXRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBQQV9MRUQsCisJCS5lbmQJPSBQQV9MRUQgKyBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9iaXRfcG9zKSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoZWFydGJlYXRfZGV2aWNlID0geworCS5uYW1lCQk9ICJoZWFydGJlYXQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9IGhlYXJ0YmVhdF9iaXRfcG9zLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2U3MzAwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZoZWFydGJlYXRfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2U3MzAwX2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2U3MzAwX2RldmljZXMsIEFSUkFZX1NJWkUoc2U3MzAwX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2U3MzAwX2RldmljZXNfc2V0dXApOworCiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KQEAgLTQyLDggKzcxLDUgQEAKIAkubXZfb3V0c2wgPSBzaDczMDBzZV9vdXRzbCwKIAogCS5tdl9pbml0X2lycSA9IGluaXRfNzMwMHNlX0lSUSwKLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdCA9IGhlYXJ0YmVhdF83MzAwc2UsCi0jZW5kaWYKIH07CiBBTElBU19NVig3MzAwc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL01ha2VmaWxlCmluZGV4IDhmNjM4ODYuLmU3YzA5OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL01ha2VmaWxlCkBAIC0zLDUgKzMsMyBAQAogIwogCiBvYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCi0KLW9iai0kKENPTkZJR19IRUFSVEJFQVQpICs9IGxlZC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2xlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjcyZTlhLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2xlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIGFyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2xlZC5jCi0gKgotICogRGVyaXZlZCBmcm9tIGFyY2gvc2gvYm9hcmRzL3NlLzc3MHgvbGVkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3R1YXJ0IE1lbmVmeSA8c3R1YXJ0Lm1lbmVmeUBzdC5jb20+Ci0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBTb2x1dGlvbiBFbmdpbmUgc3BlY2lmaWMgTEVEIGNvZGUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvc2U3MzE4MC5oPgotCi0vKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWRlci9TdW4gcGF0dGVybiAqLwotdm9pZCBoZWFydGJlYXRfNzMxODBzZSh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBQQV9MRUQ7Ci0Jc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCi0JICovCi0JcGVyaW9kID0gMTEwIC0gKCgzMDAgPDwgRlNISUZUKSAvICgoYXZlbnJ1blswXSAvIDUpICsgKDMgPDwgRlNISUZUKSkpOwotCi0JaWYgKHVwKSB7Ci0JCWlmIChiaXQgPT0gNykgewotCQkJYml0LS07Ci0JCQl1cCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQliaXQrKzsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChiaXQgPT0gMCkgewotCQkJYml0Kys7Ci0JCQl1cCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQliaXQtLTsKLQkJfQotCX0KLQkqcCA9IDEgPDwgKGJpdCArIExFRF9TSElGVCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jCmluZGV4IGIzOGVmNTAuLjkxMWNlMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvc2V0dXAuYwpAQCAtMTAsMTMgKzEwLDM5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9zZTczMTgwLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCi12b2lkIGhlYXJ0YmVhdF83MzE4MHNlKHZvaWQpOwogdm9pZCBpbml0XzczMTgwc2VfSVJRKHZvaWQpOwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGhlYXJ0YmVhdF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFBBX0xFRCwKKwkJLmVuZAk9IFBBX0xFRCArIDggLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGVhcnRiZWF0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiaGVhcnRiZWF0IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2U3MzE4MF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaGVhcnRiZWF0X2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNlNzMxODBfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDczNDNzZV9wbGF0Zm9ybV9kZXZpY2VzLAorCQkJCSAgICBBUlJBWV9TSVpFKHNoNzM0M3NlX3BsYXRmb3JtX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2U3MzE4MF9kZXZpY2VzX3NldHVwKTsKKwogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCkBAIC00Niw4ICs3Miw1IEBACiAKIAkubXZfaW5pdF9pcnEgPSBpbml0XzczMTgwc2VfSVJRLAogCS5tdl9pcnFfZGVtdXggPSBzaG1zZV9pcnFfZGVtdXgsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQgPSBoZWFydGJlYXRfNzMxODBzZSwKLSNlbmRpZgogfTsKIEFMSUFTX01WKDczMTgwc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9NYWtlZmlsZQppbmRleCA0MjkxMDY5Li4zMDI0Nzk2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvTWFrZWZpbGUKQEAgLTMsNSArMywzIEBACiAjCiAKIG9iai15CSA6PSBzZXR1cC5vIGlvLm8gaXJxLm8KLQotb2JqLSQoQ09ORklHX0hFQVJUQkVBVCkgKz0gbGVkLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvbGVkLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL2xlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM5ZTE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9sZWQuYwotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvc2U3MzQzLmg+Ci0KLS8qIEN5Y2xlIHRoZSBMRUQncyBpbiB0aGUgY2xhc2ljIEtuaWdodHJpZGVyL1N1biBwYXR0ZXJuICovCi12b2lkIGhlYXJ0YmVhdF83MzQzc2Uodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgUEFfTEVEOwotCXN0YXRpYyB1bnNpZ25lZCBiaXQgPSAwLCB1cCA9IDE7Ci0KLQljbnQgKz0gMTsKLQlpZiAoY250IDwgcGVyaW9kKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQljbnQgPSAwOwotCi0JLyogR28gdGhyb3VnaCB0aGUgcG9pbnRzIChyb3VnaGx5ISk6Ci0JICogZigwKT0xMCwgZigxKT0xNiwgZigyKT0yMCwgZig1KT0zNSxmKGluZiktPjExMAotCSAqLwotCXBlcmlvZCA9IDExMCAtICgoMzAwIDw8IEZTSElGVCkgLyAoKGF2ZW5ydW5bMF0gLyA1KSArICgzIDw8IEZTSElGVCkpKTsKLQotCWlmICh1cCkgewotCQlpZiAoYml0ID09IDcpIHsKLQkJCWJpdC0tOwotCQkJdXAgPSAwOwotCQl9IGVsc2UgewotCQkJYml0Kys7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoYml0ID09IDApIHsKLQkJCWJpdCsrOwotCQkJdXAgPSAxOwotCQl9IGVsc2UgewotCQkJYml0LS07Ci0JCX0KLQl9Ci0JKnAgPSAxIDw8IChiaXQgKyBMRURfU0hJRlQpOwotCi19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL3NldHVwLmMKaW5kZXggYzdkMTdmZS4uM2ZkYjE2ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvc2V0dXAuYwpAQCAtNCw3ICs0LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9zZTczNDMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLXZvaWQgaGVhcnRiZWF0XzczNDNzZSh2b2lkKTsKIHZvaWQgaW5pdF83MzQzc2VfSVJRKHZvaWQpOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKQEAgLTMxLDE0ICszMCwzMCBAQAogCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21jOTF4X3BsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoZWFydGJlYXRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBQQV9MRUQsCisJCS5lbmQJPSBQQV9MRUQgKyA4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGhlYXJ0YmVhdF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImhlYXJ0YmVhdCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZWFydGJlYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoZWFydGJlYXRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzM0M3NlX3BsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzbWM5MXhfZGV2aWNlLAorCSZoZWFydGJlYXRfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2g3MzQzc2VfZGV2aWNlc19zZXR1cCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWM5MXhfcGxhdGZvcm1fZGV2aWNlcywKLQkJCQkgICAgQVJSQVlfU0laRShzbWM5MXhfcGxhdGZvcm1fZGV2aWNlcykpOworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDczNDNzZV9wbGF0Zm9ybV9kZXZpY2VzLAorCQkJCSAgICBBUlJBWV9TSVpFKHNoNzM0M3NlX3BsYXRmb3JtX2RldmljZXMpKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHNoNzM0M3NlX3NldHVwKGNoYXIgKipjbWRsaW5lX3ApCkBAIC03Niw4ICs5MSw1IEBACiAKIAkubXZfaW5pdF9pcnEgPSBpbml0XzczNDNzZV9JUlEsCiAJLm12X2lycV9kZW11eCA9IHNobXNlX2lycV9kZW11eCwKLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdCA9IGhlYXJ0YmVhdF83MzQzc2UsCi0jZW5kaWYKIH07CiBBTElBU19NVig3MzQzc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9NYWtlZmlsZQppbmRleCA5YTUwMzVmLi44ZTYyNGIwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvTWFrZWZpbGUKQEAgLTMsNCArMywzIEBACiAjCiAKIG9iai15CSA6PSBzZXR1cC5vIGlvLm8gaXJxLm8KLW9iai0kKENPTkZJR19IRUFSVEJFQVQpICs9IGxlZC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYwppbmRleCBmY2Q3Y2Q3Li4zMDdjYTVkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKQEAgLTIsNTYgKzIsOTYgQEAKICAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEthenVtb3RvIEtvamltYQorICogQ29weXJpZ2h0IChDKSAyMDA2ICBOb2J1aGlybyBJd2FtYXRzdQogICoKICAqIEhpdGFjaGkgU29sdXRpb25FbmdpbmUgU3VwcG9ydC4KICAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlLmg+CiAKKy8qIAorICogSWYgdGhlIHByb2JsZW0gb2YgbWFrZV9pcHJfaXJxIGlzIHNvbHZlZCwgCisgKiB0aGlzIGNvZGUgd2lsbCBiZWNvbWUgdW5uZWNlc3NhcnkuIDotKSAKKyAqLworc3RhdGljIHZvaWQgc2U3NzB4X2Rpc2FibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisKKwljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBwLT5zaGlmdCkpLCBwLT5hZGRyKTsKK30KKworc3RhdGljIHZvaWQgc2U3NzB4X2VuYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKworCWN0cmxfb3V0dyhjdHJsX2ludyhwLT5hZGRyKSB8IChwLT5wcmlvcml0eSA8PCBwLT5zaGlmdCksIHAtPmFkZHIpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHNlNzcweF9pcnFfY2hpcCA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiTVM3NzB4U0UtRlBHQSIsCisJLm1hc2sgICAgICAgICAgID0gc2U3NzB4X2Rpc2FibGVfaXByX2lycSwKKwkudW5tYXNrICAgICAgICAgPSBzZTc3MHhfZW5hYmxlX2lwcl9pcnEsCisJLm1hc2tfYWNrICAgICAgID0gc2U3NzB4X2Rpc2FibGVfaXByX2lycSwKK307CisKK3ZvaWQgbWFrZV9zZTc3MHhfaXJxKHN0cnVjdCBpcHJfZGF0YSAqdGFibGUsIHVuc2lnbmVkIGludCBucl9pcnFzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgaXJxID0gdGFibGVbaV0uaXJxOworCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmc2U3NzB4X2lycV9jaGlwLAorCQkJaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7CisJCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgJnRhYmxlW2ldKTsKKwkJc2U3NzB4X2VuYWJsZV9pcHJfaXJxKGlycSk7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNlNzcweF9pcHJfbWFwW10gPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQogCS8qIFRoaXMgaXMgZGVmYXVsdCB2YWx1ZSAqLwotCXsgMHhmLTB4MiwgQkNSX0lMQ1JBLCAyLCAweDIgfSwKLQl7IDB4Zi0weGEsIEJDUl9JTENSQSwgMSwgMHhhIH0sCi0JeyAweGYtMHg1LCBCQ1JfSUxDUkIsIDAsIDB4NSB9LAotCXsgMHhmLTB4OCwgQkNSX0lMQ1JDLCAxLCAweDggfSwKLQl7IDB4Zi0weGMsIEJDUl9JTENSQywgMCwgMHhjIH0sCi0JeyAweGYtMHhlLCBCQ1JfSUxDUkQsIDMsIDB4ZSB9LAotCXsgMHhmLTB4MywgQkNSX0lMQ1JELCAxLCAweDMgfSwgLyogTEFOICovCi0JeyAweGYtMHhkLCBCQ1JfSUxDUkUsIDIsIDB4ZCB9LAotCXsgMHhmLTB4OSwgQkNSX0lMQ1JFLCAxLCAweDkgfSwKLQl7IDB4Zi0weDEsIEJDUl9JTENSRSwgMCwgMHgxIH0sCi0JeyAweGYtMHhmLCBCQ1JfSUxDUkYsIDMsIDB4ZiB9LAotCXsgMHhmLTB4YiwgQkNSX0lMQ1JGLCAxLCAweGIgfSwKLQl7IDB4Zi0weDcsIEJDUl9JTENSRywgMywgMHg3IH0sCi0JeyAweGYtMHg2LCBCQ1JfSUxDUkcsIDIsIDB4NiB9LAotCXsgMHhmLTB4NCwgQkNSX0lMQ1JHLCAxLCAweDQgfSwKKwl7IDB4Zi0weDIsIDAsIDgsICAweDIgLCBCQ1JfSUxDUkF9LAorCXsgMHhmLTB4YSwgMCwgNCwgIDB4YSAsIEJDUl9JTENSQX0sCisJeyAweGYtMHg1LCAwLCAwLCAgMHg1ICwgQkNSX0lMQ1JCfSwKKwl7IDB4Zi0weDgsIDAsIDQsICAweDggLCBCQ1JfSUxDUkN9LAorCXsgMHhmLTB4YywgMCwgMCwgIDB4YyAsIEJDUl9JTENSQ30sCisJeyAweGYtMHhlLCAwLCAxMiwgMHhlICwgQkNSX0lMQ1JEfSwKKwl7IDB4Zi0weDMsIDAsIDQsICAweDMgLCBCQ1JfSUxDUkR9LCAvKiBMQU4gKi8KKwl7IDB4Zi0weGQsIDAsIDgsICAweGQgLCBCQ1JfSUxDUkV9LAorCXsgMHhmLTB4OSwgMCwgNCwgIDB4OSAsIEJDUl9JTENSRX0sCisJeyAweGYtMHgxLCAwLCAwLCAgMHgxICwgQkNSX0lMQ1JFfSwKKwl7IDB4Zi0weGYsIDAsIDEyLCAweGYgLCBCQ1JfSUxDUkZ9LAorCXsgMHhmLTB4YiwgMCwgNCwgIDB4YiAsIEJDUl9JTENSRn0sCisJeyAweGYtMHg3LCAwLCAxMiwgMHg3ICwgQkNSX0lMQ1JHfSwKKwl7IDB4Zi0weDYsIDAsIDgsICAweDYgLCBCQ1JfSUxDUkd9LAorCXsgMHhmLTB4NCwgMCwgNCwgIDB4NCAsIEJDUl9JTENSR30sCiAjZWxzZQotCXsgMTQsIEJDUl9JTENSQSwgMiwgMHgwZi0xNCB9LAotCXsgMTIsIEJDUl9JTENSQSwgMSwgMHgwZi0xMiB9LAotCXsgIDgsIEJDUl9JTENSQiwgMSwgMHgwZi0gOCB9LAotCXsgIDYsIEJDUl9JTENSQywgMywgMHgwZi0gNiB9LAotCXsgIDUsIEJDUl9JTENSQywgMiwgMHgwZi0gNSB9LAotCXsgIDQsIEJDUl9JTENSQywgMSwgMHgwZi0gNCB9LAotCXsgIDMsIEJDUl9JTENSQywgMCwgMHgwZi0gMyB9LAotCXsgIDEsIEJDUl9JTENSRCwgMywgMHgwZi0gMSB9LAotCi0JeyAxMCwgQkNSX0lMQ1JELCAxLCAweDBmLTEwIH0sIC8qIExBTiAqLwotCi0JeyAgMCwgQkNSX0lMQ1JFLCAzLCAweDBmLSAwIH0sIC8qIFBDSVJRMyAqLwotCXsgMTEsIEJDUl9JTENSRSwgMiwgMHgwZi0xMSB9LCAvKiBQQ0lSUTIgKi8KLQl7ICA5LCBCQ1JfSUxDUkUsIDEsIDB4MGYtIDkgfSwgLyogUENJUlExICovCi0JeyAgNywgQkNSX0lMQ1JFLCAwLCAweDBmLSA3IH0sIC8qIFBDSVJRMCAqLwotCisJeyAxNCwgMCwgIDgsIDB4MGYtMTQgLEJDUl9JTENSQX0sCisJeyAxMiwgMCwgIDQsIDB4MGYtMTIgLEJDUl9JTENSQX0sCisJeyAgOCwgMCwgIDQsIDB4MGYtIDggLEJDUl9JTENSQn0sCisJeyAgNiwgMCwgMTIsIDB4MGYtIDYgLEJDUl9JTENSQ30sCisJeyAgNSwgMCwgIDgsIDB4MGYtIDUgLEJDUl9JTENSQ30sCisJeyAgNCwgMCwgIDQsIDB4MGYtIDQgLEJDUl9JTENSQ30sCisJeyAgMywgMCwgIDAsIDB4MGYtIDMgLEJDUl9JTENSQ30sCisJeyAgMSwgMCwgMTIsIDB4MGYtIDEgLEJDUl9JTENSRH0sCisJLyogU1QgTklDICovCisJeyAxMCwgMCwgIDQsIDB4MGYtMTAgLEJDUl9JTENSRH0sIAkvKiBMQU4gKi8KKwkvKiBNUlNIUEMgSVJRcyBzZXR0aW5nICovCisJeyAgMCwgMCwgMTIsIDB4MGYtIDAgLEJDUl9JTENSRX0sCS8qIFBDSVJRMyAqLworCXsgMTEsIDAsICA4LCAweDBmLTExICxCQ1JfSUxDUkV9LCAJLyogUENJUlEyICovCisJeyAgOSwgMCwgIDQsIDB4MGYtIDkgLEJDUl9JTENSRX0sIAkvKiBQQ0lSUTEgKi8KKwl7ICA3LCAwLCAgMCwgMHgwZi0gNyAsQkNSX0lMQ1JFfSwgCS8qIFBDSVJRMCAqLwogCS8qICMyLCAjMTMgYXJlIGFsbG9jYXRlZCBmb3IgU0xPVCBJUlEgIzEgYW5kICMyIChmb3Igbm93KSAqLwogCS8qIE5PVEU6ICMyIGFuZCAjMTMgYXJlIG5vdCB1c2VkIG9uIFBDICovCi0JeyAxMywgQkNSX0lMQ1JHLCAxLCAweDBmLTEzIH0sIC8qIFNMT1RJUlEyICovCi0JeyAgMiwgQkNSX0lMQ1JHLCAwLCAweDBmLSAyIH0sIC8qIFNMT1RJUlExICovCisJeyAxMywgMCwgIDQsIDB4MGYtMTMgLEJDUl9JTENSR30sIAkvKiBTTE9USVJRMiAqLworCXsgIDIsIDAsICAwLCAweDBmLSAyICxCQ1JfSUxDUkd9LCAJLyogU0xPVElSUTEgKi8KICNlbmRpZgogfTsKIApAQCAtODEsNSArMTIxLDUgQEAKIAljdHJsX291dHcoMCwgQkNSX0lMQ1JGKTsKIAljdHJsX291dHcoMCwgQkNSX0lMQ1JHKTsKICNlbmRpZgotCW1ha2VfaXByX2lycShzZTc3MHhfaXByX21hcCwgQVJSQVlfU0laRShzZTc3MHhfaXByX21hcCkpOworCW1ha2Vfc2U3NzB4X2lycShzZTc3MHhfaXByX21hcCwgQVJSQVlfU0laRShzZTc3MHhfaXByX21hcCkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvbGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5M2RkODMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9sZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2xlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgPHN0dWFydC5tZW5lZnlAc3QuY29tPgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgU29sdXRpb24gRW5naW5lIHNwZWNpZmljIExFRCBjb2RlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZS5oPgotCi0vKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWRlci9TdW4gcGF0dGVybiAqLwotdm9pZCBoZWFydGJlYXRfc2Uodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqIHAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqKVBBX0xFRDsKLQlzdGF0aWMgdW5zaWduZWQgYml0ID0gMCwgdXAgPSAxOwotCi0JY250ICs9IDE7Ci0JaWYgKGNudCA8IHBlcmlvZCkgewotCQlyZXR1cm47Ci0JfQotCi0JY250ID0gMDsKLQotCS8qIEdvIHRocm91Z2ggdGhlIHBvaW50cyAocm91Z2hseSEpOgotCSAqIGYoMCk9MTAsIGYoMSk9MTYsIGYoMik9MjAsIGYoNSk9MzUsZihpbmYpLT4xMTAKLQkgKi8KLQlwZXJpb2QgPSAxMTAgLSAoICgzMDA8PEZTSElGVCkvCi0JCQkgKChhdmVucnVuWzBdLzUpICsgKDM8PEZTSElGVCkpICk7Ci0KLQlpZiAodXApIHsKLQkJaWYgKGJpdCA9PSA3KSB7Ci0JCQliaXQtLTsKLQkJCXVwPTA7Ci0JCX0gZWxzZSB7Ci0JCQliaXQgKys7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoYml0ID09IDApIHsKLQkJCWJpdCsrOwotCQkJdXA9MTsKLQkJfSBlbHNlIHsKLQkJCWJpdC0tOwotCQl9Ci0JfQotCSpwID0gMTw8KGJpdCs4KTsKLQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jCmluZGV4IGExZDUxZDUuLjQ1Y2JjMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L3NldHVwLmMKQEAgLTEsNSArMSw0IEBACi0vKiAkSWQ6IHNldHVwLmMsdiAxLjEuMi40IDIwMDIvMDMvMDIgMjE6NTc6MDcgbGV0aGFsIEV4cCAkCi0gKgorLyoKICAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMCAgS2F6dW1vdG8gS29qaW1hCkBAIC04LDEyICs3LDEyIEBACiAgKgogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3NlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NtYzM3YzkzeC5oPgogCi12b2lkIGhlYXJ0YmVhdF9zZSh2b2lkKTsKIHZvaWQgaW5pdF9zZV9JUlEodm9pZCk7CiAKIC8qCkBAIC0zNiwxMSArMzUsNiBAQAogCXNtc2NfY29uZmlnKEFDVElWQVRFX0lOREVYLCAweDAxKTsKIAlzbXNjX2NvbmZpZyhJUlFfU0VMRUNUX0lOREVYLCA2KTsgLyogSVJRNiAqLwogCi0JLyogSURFMSAqLwotCXNtc2NfY29uZmlnKENVUlJFTlRfTEROX0lOREVYLCBMRE5fSURFMSk7Ci0Jc21zY19jb25maWcoQUNUSVZBVEVfSU5ERVgsIDB4MDEpOwotCXNtc2NfY29uZmlnKElSUV9TRUxFQ1RfSU5ERVgsIDE0KTsgLyogSVJRMTQgKi8KLQogCS8qIEFVWElPIChHUElPKTogdG8gdXNlIElERTEgKi8KIAlzbXNjX2NvbmZpZyhDVVJSRU5UX0xETl9JTkRFWCwgTEROX0FVWElPKTsKIAlzbXNjX2NvbmZpZyhHUElPNDZfSU5ERVgsIDB4MDApOyAvKiBuSU9ST1AgKi8KQEAgLTY5LDYgKzYzLDM2IEBACiAJb3V0Yl9wKENPTkZJR19FWElULCBDT05GSUdfUE9SVCk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYXJ0YmVhdF9iaXRfcG9zW10gPSB7IDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoZWFydGJlYXRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBQQV9MRUQsCisJCS5lbmQJPSBQQV9MRUQgKyBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9iaXRfcG9zKSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoZWFydGJlYXRfZGV2aWNlID0geworCS5uYW1lCQk9ICJoZWFydGJlYXQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9IGhlYXJ0YmVhdF9iaXRfcG9zLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2VfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmhlYXJ0YmVhdF9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZV9kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNlX2RldmljZXMsIEFSUkFZX1NJWkUoc2VfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzZV9kZXZpY2VzX3NldHVwKTsKKwogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCkBAIC0xMDcsOCArMTMxLDUgQEAKIAkubXZfb3V0c2wJCT0gc2Vfb3V0c2wsCiAKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9zZV9JUlEsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gaGVhcnRiZWF0X3NlLAotI2VuZGlmCiB9OwogQUxJQVNfTVYoc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9NYWtlZmlsZQppbmRleCAxODg5MDBjLi5kYmMyOWYzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvTWFrZWZpbGUKQEAgLTUsNCArNSwzIEBACiBvYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCiAKIG9iai0kKENPTkZJR19QQ0kpICs9IHBjaS5vCi1vYmotJChDT05GSUdfSEVBUlRCRUFUKSArPSBsZWQubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvbGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDE5NGQuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9sZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2xlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgPHN0dWFydC5tZW5lZnlAc3QuY29tPgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgU29sdXRpb24gRW5naW5lIHNwZWNpZmljIExFRCBjb2RlLgotICovCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vc2U3NzUxLmg+Ci0KLS8qIEN5Y2xlIHRoZSBMRUQncyBpbiB0aGUgY2xhc2ljIEtuaWdodHJpZGVyL1N1biBwYXR0ZXJuICovCi12b2lkIGhlYXJ0YmVhdF83NzUxc2Uodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqIHAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqKVBBX0xFRDsKLQlzdGF0aWMgdW5zaWduZWQgYml0ID0gMCwgdXAgPSAxOwotCi0JY250ICs9IDE7Ci0JaWYgKGNudCA8IHBlcmlvZCkgewotCQlyZXR1cm47Ci0JfQotCi0JY250ID0gMDsKLQotCS8qIEdvIHRocm91Z2ggdGhlIHBvaW50cyAocm91Z2hseSEpOgotCSAqIGYoMCk9MTAsIGYoMSk9MTYsIGYoMik9MjAsIGYoNSk9MzUsZihpbmYpLT4xMTAKLQkgKi8KLQlwZXJpb2QgPSAxMTAgLSAoICgzMDA8PEZTSElGVCkvCi0JCQkgKChhdmVucnVuWzBdLzUpICsgKDM8PEZTSElGVCkpICk7Ci0KLQlpZiAodXApIHsKLQkJaWYgKGJpdCA9PSA3KSB7Ci0JCQliaXQtLTsKLQkJCXVwPTA7Ci0JCX0gZWxzZSB7Ci0JCQliaXQgKys7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoYml0ID09IDApIHsKLQkJCWJpdCsrOwotCQkJdXA9MTsKLQkJfSBlbHNlIHsKLQkJCWJpdC0tOwotCQl9Ci0JfQotCSpwID0gMTw8KGJpdCs4KTsKLQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jCmluZGV4IGY3ZTFkZDMuLmUzZmVhZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL3NldHVwLmMKQEAgLTksMTEgKzksMTEgQEAKICAqIElhbiBkYSBTaWx2YSBhbmQgSmVyZW15IFNpZWdlbCwgMjAwMS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9zZTc3NTEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotdm9pZCBoZWFydGJlYXRfNzc1MXNlKHZvaWQpOwogdm9pZCBpbml0Xzc3NTFzZV9JUlEodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfU0hfS0dEQgpAQCAtMTYxLDExICsxNjEsNDAgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfU0hfS0dEQiAqLwogCitzdGF0aWMgdW5zaWduZWQgY2hhciBoZWFydGJlYXRfYml0X3Bvc1tdID0geyA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaGVhcnRiZWF0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUEFfTEVELAorCQkuZW5kCT0gUEFfTEVEICsgQVJSQVlfU0laRShoZWFydGJlYXRfYml0X3BvcykgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGVhcnRiZWF0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiaGVhcnRiZWF0IiwKKwkuaWQJCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBoZWFydGJlYXRfYml0X3BvcywKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZWFydGJlYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoZWFydGJlYXRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNlNzc1MV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc21jOTF4X2RldmljZSwKKwkmaGVhcnRiZWF0X2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNlNzc1MV9kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNlNzc1MV9kZXZpY2VzLCBBUlJBWV9TSVpFKHNlNzc1MV9kZXZpY2VzKSk7Cit9CitfX2luaXRjYWxsKHNlNzc1MV9kZXZpY2VzX3NldHVwKTsKIAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi0KIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83NzUxc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIjc3NTEgU29sdXRpb25FbmdpbmUiLAogCS5tdl9zZXR1cAkJPSBzaDc3NTFzZV9zZXR1cCwKQEAgLTE4OSw4ICsyMTgsNSBAQAogCS5tdl9vdXRzbAkJPSBzaDc3NTFzZV9vdXRzbCwKIAogCS5tdl9pbml0X2lycQkJPSBpbml0Xzc3NTFzZV9JUlEsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gaGVhcnRiZWF0Xzc3NTFzZSwKLSNlbmRpZgogfTsKIEFMSUFTX01WKDc3NTFzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NoMDMvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL01ha2VmaWxlCmluZGV4IDMyMWJlNTAuLjQwMDMwNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NoMDMvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2gwMy9NYWtlZmlsZQpAQCAtMyw0ICszLDMgQEAKICMKIAogb2JqLXkJIDo9IHNldHVwLm8gcnRjLm8KLW9iai0kKENPTkZJR19IRUFSVEJFQVQpICs9IGxlZC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaDAzL2xlZC5jIGIvYXJjaC9zaC9ib2FyZHMvc2gwMy9sZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4NTYyYS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zaDAzL2xlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NoMDMvbGVkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgIFNhaXRvLksgSW50ZXJmYWNlIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBJbnRlcmZhY2UgQ1RQL1BDSS1TSDAzIHNwZWNpZmljIExFRCBjb2RlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0vKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWRlci9TdW4gcGF0dGVybiAqLwotdm9pZCBoZWFydGJlYXRfc2gwMyh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKTB4YTA4MDAwMDA7Ci0Jc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCi0JICovCi0JcGVyaW9kID0gMTEwIC0gKCAoMzAwPDxGU0hJRlQpLwotCQkJICgoYXZlbnJ1blswXS81KSArICgzPDxGU0hJRlQpKSApOwotCi0JaWYgKHVwKSB7Ci0JCWlmIChiaXQgPT0gNykgewotCQkJYml0LS07Ci0JCQl1cD0wOwotCQl9IGVsc2UgewotCQkJYml0ICsrOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGJpdCA9PSAwKSB7Ci0JCQliaXQrKzsKLQkJCXVwPTE7Ci0JCX0gZWxzZSB7Ci0JCQliaXQtLTsKLQkJfQotCX0KLQkqcCA9IDE8PGJpdDsKLQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jCmluZGV4IDVhZDFlMTkuLmMwNjljNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9ydGMuaD4KICNpbmNsdWRlIDxhc20vc2gwMy9pby5oPgpAQCAtNDgsMTUgKzQ5LDM2IEBACiAJYm9hcmRfdGltZV9pbml0ID0gc2gwM190aW1lX2luaXQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaGVhcnRiZWF0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHhhMDgwMDAwMCwKKwkJLmVuZAk9IDB4YTA4MDAwMDAgKyA4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGhlYXJ0YmVhdF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImhlYXJ0YmVhdCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZWFydGJlYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoZWFydGJlYXRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoMDNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmhlYXJ0YmVhdF9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDAzX2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2gwM19kZXZpY2VzLCBBUlJBWV9TSVpFKHNoMDNfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzaDAzX2RldmljZXNfc2V0dXApOworCiBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2gwMyBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiSW50ZXJmYWNlIChDVFAvUENJLVNIMDMpIiwKIAkubXZfc2V0dXAJCT0gc2gwM19zZXR1cCwKIAkubXZfbnJfaXJxcwkJPSA0OCwKIAkubXZfaW9wb3J0X21hcAkJPSBzaDAzX2lvcG9ydF9tYXAsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc2gwM19JUlEsCi0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfc2gwMywKLSNlbmRpZgogfTsKIEFMSUFTX01WKHNoMDMpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2htaW4vc2V0dXAuYwppbmRleCBhMzFhMWQxLi40YTlkZjRhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMKQEAgLTEyLDEyICsxMiwyMiBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2RlZmluZSBQRkNfUEhDUgkweGE0MDAwMTBlCisjZGVmaW5lIFBGQ19QSENSCTB4YTQwMDAxMGVVTAorI2RlZmluZSBJTlRDX0lDUjEJMHhhNDAwMDAxMFVMCisjZGVmaW5lIElOVENfSVBSQwkweGE0MDAwMDE2VUwKKworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaG1pbl9pcHJfbWFwW10gPSB7CisJeyAuaXJxPTMyLCAuYWRkcj1JTlRDX0lQUkMsIC5zaGlmdD0gMCwgLnByaW9yaXR5PTAgfSwKKwl7IC5pcnE9MzMsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PSA0LCAucHJpb3JpdHk9MCB9LAorCXsgLmlycT0zNCwgLmFkZHI9SU5UQ19JUFJDLCAuc2hpZnQ9IDgsIC5wcmlvcml0eT04IH0sCisJeyAuaXJxPTM1LCAuYWRkcj1JTlRDX0lQUkMsIC5zaGlmdD0xMiwgLnByaW9yaXR5PTAgfSwKK307CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3NobWluX2lycSh2b2lkKQogewogCWN0cmxfb3V0dygweDJhMDAsIFBGQ19QSENSKTsJLy8gSVJRMC0zPUlSUQogCWN0cmxfb3V0dygweDBhYWEsIElOVENfSUNSMSk7CS8vIElSUTAtMz1JUlEtbW9kZSxMb3ctYWN0aXZlLgorCW1ha2VfaXByX2lycShzaG1pbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNobWluX2lwcl9tYXApKTsKIH0KIAogc3RhdGljIHZvaWQgX19pb21lbSAqc2htaW5faW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBzaXplKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jIGIvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jCmluZGV4IGY3ZWE3MDAuLjcwZjEyOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9pcnEuYworKysgYi9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvaXJxLmMKQEAgLTI4LDIxICsyOCwyMSBAQAogCXVuc2lnbmVkIGxvbmcgdmFsOwogCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKGlycSAtIFZPWUFHRVJfSVJRX0JBU0UpOwogCi0gICAgCXByX2RlYnVnKCJkaXNhYmxlX3ZveWFnZXJneF9pcnEoJWQpOiBtYXNrPSVseFxuIiwgaXJxLCBtYXNrKTsKLSAgICAgICAgdmFsID0gaW5sKFZPWUFHRVJfSU5UX01BU0spOwotICAgICAgICB2YWwgJj0gfm1hc2s7Ci0gICAgICAgIG91dGwodmFsLCBWT1lBR0VSX0lOVF9NQVNLKTsKKwlwcl9kZWJ1ZygiZGlzYWJsZV92b3lhZ2VyZ3hfaXJxKCVkKTogbWFzaz0leFxuIiwgaXJxLCBtYXNrKTsKKwl2YWwgPSByZWFkbCgodm9pZCBfX2lvbWVtICopVk9ZQUdFUl9JTlRfTUFTSyk7CisJdmFsICY9IH5tYXNrOworCXdyaXRlbCh2YWwsICh2b2lkIF9faW9tZW0gKilWT1lBR0VSX0lOVF9NQVNLKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX3ZveWFnZXJneF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKGlycSAtIFZPWUFHRVJfSVJRX0JBU0UpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKGlycSAtIFZPWUFHRVJfSVJRX0JBU0UpOwogCi0gICAgICAgIHByX2RlYnVnKCJkaXNhYmxlX3ZveWFnZXJneF9pcnEoJWQpOiBtYXNrPSVseFxuIiwgaXJxLCBtYXNrKTsKLSAgICAgICAgdmFsID0gaW5sKFZPWUFHRVJfSU5UX01BU0spOwotICAgICAgICB2YWwgfD0gbWFzazsKLSAgICAgICAgb3V0bCh2YWwsIFZPWUFHRVJfSU5UX01BU0spOworCXByX2RlYnVnKCJkaXNhYmxlX3ZveWFnZXJneF9pcnEoJWQpOiBtYXNrPSV4XG4iLCBpcnEsIG1hc2spOworCXZhbCA9IHJlYWRsKCh2b2lkIF9faW9tZW0gKilWT1lBR0VSX0lOVF9NQVNLKTsKKwl2YWwgfD0gbWFzazsKKwl3cml0ZWwodmFsLCAodm9pZCBfX2lvbWVtICopVk9ZQUdFUl9JTlRfTUFTSyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja192b3lhZ2VyZ3godW5zaWduZWQgaW50IGlycSkKQEAgLTY4LDIwICs2OCwyMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHZveWFnZXJneF9pcnFfdHlwZSA9IHsKLQkudHlwZW5hbWUgPSAiVk9ZQUdFUkdYLUlSUSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX3ZveWFnZXJneF9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fdm95YWdlcmd4X2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX3ZveWFnZXJneF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX3ZveWFnZXJneF9pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja192b3lhZ2VyZ3gsCi0JLmVuZCA9IGVuZF92b3lhZ2VyZ3hfaXJxLAorCS50eXBlbmFtZQk9ICJWT1lBR0VSR1gtSVJRIiwKKwkuc3RhcnR1cAk9IHN0YXJ0dXBfdm95YWdlcmd4X2lycSwKKwkuc2h1dGRvd24JPSBzaHV0ZG93bl92b3lhZ2VyZ3hfaXJxLAorCS5lbmFibGUJCT0gZW5hYmxlX3ZveWFnZXJneF9pcnEsCisJLmRpc2FibGUJPSBkaXNhYmxlX3ZveWFnZXJneF9pcnEsCisJLmFjawkJPSBtYXNrX2FuZF9hY2tfdm95YWdlcmd4LAorCS5lbmQJCT0gZW5kX3ZveWFnZXJneF9pcnEsCiB9OwogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgdm95YWdlcmd4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTwogCSAgICAgICAiVm95YWdlckdYOiBzcHVyaW91cyBpbnRlcnJ1cHQsIHN0YXR1czogMHgleFxuIiwKLQkgICAgICAgCQlpbmwoSU5UX1NUQVRVUykpOworCQkJKHVuc2lnbmVkIGludClyZWFkbCgodm9pZCBfX2lvbWVtICopSU5UX1NUQVRVUykpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtOTMsMTMgKzkzLDEzIEBACiB2b2lkIHZveWFnZXJneF9yZWdpc3Rlcl9pcnFfZGVtdXgoaW50IGlycSwKIAkJaW50ICgqZGVtdXgpKGludCBpcnEsIHZvaWQgKmRldiksIHZvaWQgKmRldikKIHsKLSAgICAJdm95YWdlcmd4X2RlbXV4W2lycSAtIFZPWUFHRVJfSVJRX0JBU0VdLmZ1bmMgPSBkZW11eDsKLSAgICAJdm95YWdlcmd4X2RlbXV4W2lycSAtIFZPWUFHRVJfSVJRX0JBU0VdLmRldiA9IGRldjsKKwl2b3lhZ2VyZ3hfZGVtdXhbaXJxIC0gVk9ZQUdFUl9JUlFfQkFTRV0uZnVuYyA9IGRlbXV4OworCXZveWFnZXJneF9kZW11eFtpcnEgLSBWT1lBR0VSX0lSUV9CQVNFXS5kZXYgPSBkZXY7CiB9CiAKIHZvaWQgdm95YWdlcmd4X3VucmVnaXN0ZXJfaXJxX2RlbXV4KGludCBpcnEpCiB7Ci0gICAgCXZveWFnZXJneF9kZW11eFtpcnEgLSBWT1lBR0VSX0lSUV9CQVNFXS5mdW5jID0gMDsKKwl2b3lhZ2VyZ3hfZGVtdXhbaXJxIC0gVk9ZQUdFUl9JUlFfQkFTRV0uZnVuYyA9IDA7CiB9CiAKIGludCB2b3lhZ2VyZ3hfaXJxX2RlbXV4KGludCBpcnEpCkBAIC0xMDcsMzEgKzEwNywyNSBAQAogCiAJaWYgKGlycSA9PSBJUlFfVk9ZQUdFUiApIHsKIAkJdW5zaWduZWQgbG9uZyBpID0gMCwgYml0IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKLQkJdW5zaWduZWQgbG9uZyB2YWwgID0gaW5sKElOVF9TVEFUVVMpOwotI2lmIDEKLQkJaWYgKCB2YWwgJiAoIDEgPDwgMSApKXsKKwkJdW5zaWduZWQgbG9uZyB2YWwgID0gcmVhZGwoKHZvaWQgX19pb21lbSAqKUlOVF9TVEFUVVMpOworCisJCWlmICh2YWwgJiAoMSA8PCAxKSkKIAkJCWkgPSAxOwotCQl9IGVsc2UgaWYgKCB2YWwgJiAoIDEgPDwgMiApKXsKKwkJZWxzZSBpZiAodmFsICYgKDEgPDwgMikpCiAJCQlpID0gMjsKLQkJfSBlbHNlIGlmICggdmFsICYgKCAxIDw8IDYgKSl7CisJCWVsc2UgaWYgKHZhbCAmICgxIDw8IDYpKQogCQkJaSA9IDY7Ci0JCX0gZWxzZSBpZiggdmFsICYgKCAxIDw8IDEwICkpeworCQllbHNlIGlmICh2YWwgJiAoMSA8PCAxMCkpCiAJCQlpID0gMTA7Ci0JCX0gZWxzZSBpZiggdmFsICYgKCAxIDw8IDExICkpeworCQllbHNlIGlmICh2YWwgJiAoMSA8PCAxMSkpCiAJCQlpID0gMTE7Ci0JCX0gZWxzZSBpZiggdmFsICYgKCAxIDw8IDEyICkpeworCQllbHNlIGlmICh2YWwgJiAoMSA8PCAxMikpCiAJCQlpID0gMTI7Ci0JCX0gZWxzZSBpZiggdmFsICYgKCAxIDw8IDE3ICkpeworCQllbHNlIGlmICh2YWwgJiAoMSA8PCAxNykpCiAJCQlpID0gMTc7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCXByaW50aygiVW5leHBlY3RlZCBJUlEgaXJxID0gJWQgc3RhdHVzID0gMHglMDhseFxuIiwgaXJxLCB2YWwpOwotCQl9Ci0JCXByX2RlYnVnKCJ2b3lhZ2VyZ3hfaXJxX2RlbXV4ICVsZFxuIiwgaSk7Ci0jZWxzZQotCQlmb3IgKGJpdCA9IDEsIGkgPSAwIDsgaSA8IFZPWUFHRVJfSVJRX05VTSA7IGJpdCA8PD0gMSwgaSsrKQotCQkJaWYgKHZhbCAmIGJpdCkKLQkJCQlicmVhazsKLSNlbmRpZgorCQlwcl9kZWJ1Zygidm95YWdlcmd4X2lycV9kZW11eCAlZCBcbiIsIGkpOwogICAgIAkgICAgCWlmIChpIDwgVk9ZQUdFUl9JUlFfTlVNKSB7CiAJCQlpcnEgPSBWT1lBR0VSX0lSUV9CQVNFICsgaTsKICAgICAJICAgIAkJaWYgKHZveWFnZXJneF9kZW11eFtpXS5mdW5jICE9IDApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvc2V0dXAuYyBiL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9zZXR1cC5jCmluZGV4IDY2YjJmZWQuLjMzZjAzMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9zZXR1cC5jCkBAIC0xOSw3ICsxOSw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKLQl2YWwgPSBpbmwoRFJBTV9DVFJMKTsKKwl2YWwgPSByZWFkbCgodm9pZCBfX2lvbWVtICopRFJBTV9DVFJMKTsKIAl2YWwgfD0gKERSQU1fQ1RSTF9DUFVfQ09MVU1OX1NJWkVfMjU2CXwKIAkJRFJBTV9DVFJMX0NQVV9BQ1RJVkVfUFJFQ0hBUkdFCXwKIAkJRFJBTV9DVFJMX0NQVV9SRVNFVAkJfApAQCAtMjksNyArMjksNyBAQAogCQlEUkFNX0NUUkxfQUNUSVZFX1BSRUNIQVJHRQl8CiAJCURSQU1fQ1RSTF9SRVNFVAkJCXwKIAkJRFJBTV9DVFJMX1JFTUFJTl9BQ1RJVkUpOwotCW91dGwodmFsLCBEUkFNX0NUUkwpOworCXdyaXRlbCh2YWwsICh2b2lkIF9faW9tZW0gKilEUkFNX0NUUkwpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvcnRzNzc1MXIyZF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvcnRzNzc1MXIyZF9kZWZjb25maWcKaW5kZXggMDk5ZTk4Zi4uZGI2YTAyZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3J0czc3NTFyMmRfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9ydHM3NzUxcjJkX2RlZmNvbmZpZwpAQCAtMSwxNSArMSwyMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4Ci0jIFR1ZSBPY3QgIDMgMTE6Mzg6MzYgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIwCisjIFRodSBGZWIgMTUgMTc6MTc6MjkgMjAwNwogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKKyMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0zMyw4ICszOSw4IEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVEw9eQogQ09ORklHX0VNQkVEREVEPXkKQEAgLTk3LDEwICsxMDMsOCBAQAogIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FQzMxMDQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9CSUdTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0hfTVBDMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TSDAzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwIGlzIG5vdCBzZXQKQEAgLTExMyw2ICsxMTcsOSBAQAogIyBDT05GSUdfU0hfTEFORElTSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9USVRBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TSE1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9BU0RBUDMxMCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKIAogIwpAQCAtMTI0LDYgKzEzMSwxMiBAQAogIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0CiAjCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKworIworIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKIAogIwogIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CkBAIC0xNTksMTIgKzE3MiwxNCBAQAogIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAogCiAjCiAjIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAogIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC0xNzQsNiArMTg5LDkgQEAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDQwMDAwMDAKIENPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfUEFHRV9TSVpFXzRLQj15CisjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKQEAgLTE4Myw2ICsyMDEsNyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKIAogIwogIyBDYWNoZSBjb25maWd1cmF0aW9uCkBAIC0xOTUsMTEgKzIxNCwxNCBAQAogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfRlBVPXkKICMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVE9SRV9RVUVVRVMgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfSU5URVZUPXkKK0NPTkZJR19DUFVfSEFTX0lQUl9JUlE9eQogQ09ORklHX0NQVV9IQVNfU1JfUkI9eQorQ09ORklHX0NQVV9IQVNfUFRFQT15CiAKICMKICMgVGltZXIgc3VwcG9ydApAQCAtMjEwLDYgKzIzMiw4IEBACiAjIFJUUzc3NTFSMkQgb3B0aW9ucwogIwogQ09ORklHX1JUUzc3NTFSMkRfUkVWMTE9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgorIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfUENMS19GUkVRPTYwMDAwMDAwCiAKICMKQEAgLTIzMiwxMCArMjU2LDE2IEBACiBDT05GSUdfSEVBUlRCRUFUPXkKIAogIworIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAorCisjCiAjIEtlcm5lbCBmZWF0dXJlcwogIwogIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKIENPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldApAQCAtMjUxLDcgKzI4MSw3IEBACiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiAjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9Im1lbT02NE0gY29uc29sZT10dHlTQzAsMTE1MjAwIHJvb3Q9L2Rldi9oZGExIgorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MwLDExNTIwMCByb290PS9kZXYvc2RhMSIKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtMjYwLDcgKzI5MCw2IEBACiBDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKIENPTkZJR19QQ0lfQVVUTz15CiBDT05GSUdfUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUz15Ci0jIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKQEAgLTMwMiw2ICszMzEsNyBAQAogQ09ORklHX1hGUk09eQogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzE5LDExICszNDksMTMgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKQEAgLTM4MCw3ICs0MTIsNyBAQAogIwogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKK0NPTkZJR19GV19MT0FERVI9bQogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogCiAjCkBAIC00MjIsNDQgKzQ1NCwxNDUgQEAKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorCisjCiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKICMKLUNPTkZJR19JREU9eQotQ09ORklHX0lERV9NQVhfSFdJRlM9NAotQ09ORklHX0JMS19ERVZfSURFPXkKLQotIwotIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRElTSz15Ci0jIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotCi0jCi0jIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKLSMKLUNPTkZJR19JREVfR0VORVJJQz15Ci0jIENPTkZJR19CTEtfREVWX0lERVBDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIGRldmljZSBzdXBwb3J0CiAjCiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAogCiAjCiAjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwogIwotIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NWVyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTlYgaXMgbm90IHNldAorIyBDT05GSUdfUERDX0FETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1BST01JU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TWDQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1VMSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJVEVTU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9JTklDMTYyWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorQ09ORklHX1BBVEFfUExBVEZPUk09eQogCiAjCiAjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCkBAIC00NzAsNiArNjAzLDkgQEAKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKQEAgLTU0MCw2ICs2NzYsNyBAQAogIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAogIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKQEAgLTU1OSwxNCArNjk2LDE3IEBACiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDEgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwMCBNYml0KQogIwogIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19DSEVMU0lPX1QzIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKIAogIwogIyBUb2tlbiBSaW5nIGRldmljZXMKQEAgLTYxMSw2ICs3NTEsNyBAQAogIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldApAQCAtNjQ2LDE0ICs3ODcsMjMgQEAKICMKICMgU2VyaWFsIGRyaXZlcnMKICMKLSMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MD15CisjIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MF9QQ0k9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKIAogIwogIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CiAjCi0jIENPTkZJR19TRVJJQUxfU0hfU0NJIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfU0hfU0NJPXkKK0NPTkZJR19TRVJJQUxfU0hfU0NJX05SX1VBUlRTPTEKK0NPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKICMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAotIyBDT05GSUdfVU5JWDk4X1BUWVMgaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKIApAQCAtNjcxLDEwICs4MjEsNiBAQAogIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKQEAgLTY4Miw3ICs4MjgsNiBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CiAKICMKICMgSTJDIHN1cHBvcnQKQEAgLTY5OCw2ICs4NDMsNyBAQAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAKICMKICMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CkBAIC03MDYsMTggKzg1MiwxNCBAQAogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAKICMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotQ09ORklHX1ZJREVPX1Y0TDI9eQogCiAjCiAjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKQEAgLTc1OSw3ICs5MDEsNiBAQAogQ09ORklHX1NORF9NUFU0MDFfVUFSVD1tCiBDT05GSUdfU05EX09QTDNfTElCPW0KIENPTkZJR19TTkRfQUM5N19DT0RFQz1tCi1DT05GSUdfU05EX0FDOTdfQlVTPW0KICMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldApAQCAtNzgyLDYgKzkyMywxOCBAQAogIyBDT05GSUdfU05EX0NNSVBDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfQ1M0MjgxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9DUzQ2WFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RBUkxBMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dJTkEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTEFZTEEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREFSTEEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfR0lOQTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9MQVlMQTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NT05BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NSUEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VDSE8zRyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTkRJR09JTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPREogaXMgbm90IHNldAogIyBDT05GSUdfU05EX0VNVTEwSzEgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0VNVTEwSzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKQEAgLTgwMSw2ICs5NTQsNyBAQAogIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1BDWEhSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9SSVBUSURFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9STUUzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfUk1FOTYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1JNRTk2NTIgaXMgbm90IHNldApAQCAtODEzLDE3ICs5NjcsMjIgQEAKICMgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUgaXMgbm90IHNldAogCiAjCisjIFNvQyBhdWRpbyBzdXBwb3J0CisjCisjIENPTkZJR19TTkRfU09DIGlzIG5vdCBzZXQKKworIwogIyBPcGVuIFNvdW5kIFN5c3RlbQogIwogQ09ORklHX1NPVU5EX1BSSU1FPW0KLSMgQ09ORklHX09TU19PQlNPTEVURV9EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfT0JTT0xFVEVfT1NTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0VTMTM3MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9JQ0ggaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CitDT05GSUdfQUM5N19CVVM9bQogCiAjCiAjIFVTQiBzdXBwb3J0CkBAIC04NzIsNyArMTAzMSwyOSBAQAogIwogIyBSZWFsIFRpbWUgQ2xvY2sKICMKLSMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKworIworIyBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfU0g9eQorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAogCiAjCiAjIERNQSBFbmdpbmUgc3VwcG9ydApAQCAtODg4LDE2ICsxMDY5LDI2IEBACiAjCiAKICMKKyMgQXV4aWxpYXJ5IERpc3BsYXkgc3VwcG9ydAorIworCisjCisjIFZpcnR1YWxpemF0aW9uCisjCisKKyMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19NSU5JWF9GUz15CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC05MzIsNyArMTEyMyw4IEBACiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfUFJPQ19TWVNDVEw9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQpAQCAtMTAxOCw2ICsxMjEwLDExIEBACiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CiAKICMKKyMgRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyCisjCisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCiAjIFByb2ZpbGluZyBzdXBwb3J0CiAjCiBDT05GSUdfUFJPRklMSU5HPXkKQEAgLTEwMjYsMTYgKzEyMjMsMjAgQEAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFPXkKK0NPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEVfUE9SVD0weGZmZTgwMDAwCitDT05GSUdfRUFSTFlfUFJJTlRLPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldAogCiAjCkBAIC0xMDUyLDggKzEyNTMsMTEgQEAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIworQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzc1MF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUwX2RlZmNvbmZpZwppbmRleCA1ZDM1N2Q2Li40ZTZlNzdmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUwX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOAotIyBUdWUgT2N0ICAzIDExOjQ5OjAxIDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMC1yYzIKKyMgVGh1IERlYyAyOCAyMzoxNTo0OSAyMDA2CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTEwLDYgKzEwLDExIEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKKyMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0zNSw2ICs0MCw3IEBACiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTExNiw2ICsxMjIsOCBAQAogIyBDT05GSUdfU0hfTEFORElTSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9USVRBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TSE1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKIAogIwpAQCAtMTI3LDYgKzEzNSwxMiBAQAogIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0CiAjCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKworIworIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKIAogIwogIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CkBAIC0xNjIsMTIgKzE3NiwxNCBAQAogIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAogCiAjCiAjIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAogIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC0xNzcsNiArMTkzLDkgQEAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDIwMDAwMDAKIENPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfUEFHRV9TSVpFXzRLQj15CisjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKQEAgLTIwMiwxNyArMjIxLDIyIEBACiAjIFByb2Nlc3NvciBmZWF0dXJlcwogIwogQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19TSF9GUFU9eQogIyBDT05GSUdfU0hfRFNQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUT1JFX1FVRVVFUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfSVBSX0lSUT15CiBDT05GSUdfQ1BVX0hBU19TUl9SQj15CitDT05GSUdfQ1BVX0hBU19QVEVBPXkKIAogIwogIyBUaW1lciBzdXBwb3J0CiAjCiBDT05GSUdfU0hfVE1VPXkKLUNPTkZJR19TSF9QQ0xLX0ZSRVE9NTAwMDAwMDAKK0NPTkZJR19TSF9USU1FUl9JUlE9MTYKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAorQ09ORklHX1NIX1BDTEtfRlJFUT0zMzMzMzMzMwogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjMxLDEwICsyNTUsMTYgQEAKIENPTkZJR19IRUFSVEJFQVQ9eQogCiAjCisjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19QVVNIX1NXSVRDSCBpcyBub3Qgc2V0CisKKyMKICMgS2VybmVsIGZlYXR1cmVzCiAjCiAjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAogQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCiAjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CkBAIC0yNDksOCArMjc5LDcgQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKICMgQ09ORklHX1VCQ19XQUtFVVAgaXMgbm90IHNldAotQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzEsMzg0MDAgcm9vdD0vZGV2L25mcyBpcD1ib290cCIKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKQEAgLTMxMywxMSArMzQyLDEzIEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CkBAIC00ODAsMTYgKzUxMSw3OSBAQAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisKKyMKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKK0NPTkZJR19JREU9eQorQ09ORklHX0lERV9NQVhfSFdJRlM9NAorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCisjIENPTkZJR19JREVfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgZGV2aWNlIHN1cHBvcnQKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKKyMgQ09ORklHX0JMS19ERVZfU0QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwpAQCAtNjMzLDE3ICs3MjcsMTIgQEAKICMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CiAKICMKICMgSTJDIHN1cHBvcnQKQEAgLTY1OSw2ICs3NDgsNyBAQAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAKICMKICMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CkBAIC02NjcsMTggKzc1NywxNCBAQAogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAKICMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotQ09ORklHX1ZJREVPX1Y0TDI9eQogCiAjCiAjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKQEAgLTc1OCwxNCArODQ0LDIwIEBACiAjCiAKICMKKyMgVmlydHVhbGl6YXRpb24KKyMKKworIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtODE0LDcgKzkwNiw2IEBACiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkZGUzJfRlM9eQogQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CkBAIC04NzUsNiArOTY2LDExIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKQEAgLTg4MiwxNCArOTc4LDE2IEBACiAjCiAjIEtlcm5lbCBoYWNraW5nCiAjCitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CkBAIC05MDgsNiArMTAwNiw3IEBACiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQpAQCAtOTE1LDMgKzEwMTQsNCBAQAogQ09ORklHX1pMSUJfSU5GTEFURT15CiBDT05GSUdfWkxJQl9ERUZMQVRFPXkKIENPTkZJR19QTElTVD15CitDT05GSUdfSU9NQVBfQ09QWT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvTWFrZWZpbGUgYi9hcmNoL3NoL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggYmYxOGRiZi4uNmNiOTI2NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvZHJpdmVycy9NYWtlZmlsZQpAQCAtNiwzICs2LDQgQEAKIG9iai0kKENPTkZJR19TSF9ETUEpCQkrPSBkbWEvCiBvYmotJChDT05GSUdfU1VQRVJIWVdBWSkJKz0gc3VwZXJoeXdheS8KIG9iai0kKENPTkZJR19QVVNIX1NXSVRDSCkJKz0gcHVzaC1zd2l0Y2gubworb2JqLSQoQ09ORklHX0hFQVJUQkVBVCkJCSs9IGhlYXJ0YmVhdC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc2guYwppbmRleCBmNjM3MjFlLi4wNmVkMDYwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMKQEAgLTE5LDM0ICsxOSwyNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgImRtYS1zaC5oIgogCi0KLQotI2lmZGVmIENPTkZJR19DUFVfU0g0Ci1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIGRtYWVfaXByX21hcFtdID0gewotCXsgRE1BRV9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAotfTsKK3N0YXRpYyBpbnQgZG10ZV9pcnFfbWFwW10gPSB7CisJRE1URTBfSVJRLAorCURNVEUxX0lSUSwKKwlETVRFMl9JUlEsCisJRE1URTNfSVJRLAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIpIHx8CVwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApICB8fAlcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKQorCURNVEU0X0lSUSwKKwlETVRFNV9JUlEsCisJRE1URTZfSVJRLAorCURNVEU3X0lSUSwgICAgCiAjZW5kaWYKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgZG10ZV9pcHJfbWFwW10gPSB7Ci0JLyoKLQkgKiBOb3JtYWxseSB3ZSBjb3VsZCBqdXN0IGRvIERNVEUwX0lSUSArIGNoYW4gb3V0cmlnaHQsIHRob3VnaCBpbiB0aGUKLQkgKiBjYXNlIG9mIHRoZSA3NzUxUiwgdGhlIERNVEUgSVJRcyBmb3IgY2hhbm5lbHMgPiA0IHN0YXJ0IHJpZ2h0IGFib3ZlCi0JICogdGhlIFNDSUYKLQkgKi8KLQl7IERNVEUwX0lSUSArIDAsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAotCXsgRE1URTBfSVJRICsgMSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCi0JeyBETVRFMF9JUlEgKyAyLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKLQl7IERNVEUwX0lSUSArIDMsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAotCXsgRE1URTRfSVJRICsgMCwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCi0JeyBETVRFNF9JUlEgKyAxLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKLQl7IERNVEU0X0lSUSArIDIsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAotCXsgRE1URTRfSVJRICsgMywgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCiB9OwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfZG10ZV9pcnEodW5zaWduZWQgaW50IGNoYW4pCiB7CiAJdW5zaWduZWQgaW50IGlycSA9IDA7Ci0JaWYgKGNoYW4gPCBBUlJBWV9TSVpFKGRtdGVfaXByX21hcCkpCi0JCWlycSA9IGRtdGVfaXByX21hcFtjaGFuXS5pcnE7CisJaWYgKGNoYW4gPCBBUlJBWV9TSVpFKGRtdGVfaXJxX21hcCkpCisJCWlycSA9IGRtdGVfaXJxX21hcFtjaGFuXTsKIAlyZXR1cm4gaXJxOwogfQogCkBAIC0xMDMsNyArOTUsNyBAQAogCWZyZWVfaXJxKGdldF9kbXRlX2lycShjaGFuLT5jaGFuKSwgY2hhbik7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBzaF9kbWFjX2NvbmZpZ3VyZV9jaGFubmVsKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgbG9uZyBjaGNyKQogewogCWlmICghY2hjcikKQEAgLTExOSw2ICsxMTEsNyBAQAogCWN0cmxfb3V0bChjaGNyLCBDSENSW2NoYW4tPmNoYW5dKTsKIAogCWNoYW4tPmZsYWdzIHw9IERNQV9DT05GSUdVUkVEOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzaF9kbWFjX2VuYWJsZV9kbWEoc3RydWN0IGRtYV9jaGFubmVsICpjaGFuKQpAQCAtMjYyLDE3ICsyNTUsMTEgQEAKIAlpbnQgaTsKIAogI2lmZGVmIENPTkZJR19DUFVfU0g0Ci0JbWFrZV9pcHJfaXJxKGRtYWVfaXByX21hcCwgQVJSQVlfU0laRShkbWFlX2lwcl9tYXApKTsKIAlpID0gcmVxdWVzdF9pcnEoRE1BRV9JUlEsIGRtYV9lcnIsIElSUUZfRElTQUJMRUQsICJETUFDIEFkZHJlc3MgRXJyb3IiLCAwKTsKIAlpZiAodW5saWtlbHkoaSA8IDApKQogCQlyZXR1cm4gaTsKICNlbmRpZgogCi0JaSA9IGluZm8tPm5yX2NoYW5uZWxzOwotCWlmIChpID4gQVJSQVlfU0laRShkbXRlX2lwcl9tYXApKQotCQlpID0gQVJSQVlfU0laRShkbXRlX2lwcl9tYXApOwotCW1ha2VfaXByX2lycShkbXRlX2lwcl9tYXAsIGkpOwotCiAJLyoKIAkgKiBJbml0aWFsaXplIERNQU9SLCBhbmQgY2xlYW4gdXAgYW55IGVycm9yIGZsYWdzIHRoYXQgbWF5IGhhdmUKIAkgKiBiZWVuIHNldC4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9oZWFydGJlYXQuYyBiL2FyY2gvc2gvZHJpdmVycy9oZWFydGJlYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzU5Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2hlYXJ0YmVhdC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogR2VuZXJpYyBoZWFydGJlYXQgZHJpdmVyIGZvciByZWd1bGFyIExFRCBiYW5rcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIE1vc3QgU0ggcmVmZXJlbmNlIGJvYXJkcyBpbmNsdWRlIGEgbnVtYmVyIG9mIGluZGl2aWR1YWwgTEVEcyB0aGF0IGNhbgorICogYmUgaW5kZXBlbmRlbnRseSBjb250cm9sbGVkIChlaXRoZXIgdmlhIGEgcHJlLWRlZmluZWQgaGFyZHdhcmUKKyAqIGZ1bmN0aW9uIG9yIHZpYSB0aGUgTEVEIGNsYXNzLCBpZiBkZXNpcmVkIC0tIHRoZSBoYXJkd2FyZSB0ZW5kcyB0bworICogZW5jYXBzdWxhdGUgc29tZSBvZiB0aGUgc2FtZSAidHJpZ2dlcnMiIHRoYXQgdGhlIExFRCBjbGFzcyBzdXBwb3J0cywKKyAqIHNvIHRoZXJlJ3Mgbm90IHRvbyBtdWNoIHZhbHVlIGluIGl0KS4KKyAqCisgKiBBZGRpdGlvbmFsbHksIG1vc3Qgb2YgdGhlc2UgYm9hcmRzIGFsc28gaGF2ZSBhIExFRCBiYW5rIHRoYXQgd2UndmUKKyAqIHRyYWRpdGlvbmFsbHkgdXNlZCBmb3Igc3Ryb2JpbmcgdGhlIGxvYWQgYXZlcmFnZS4gVGhpcyB1c2UgY2FzZSBpcworICogaGFuZGxlZCBieSB0aGlzIGRyaXZlciwgcmF0aGVyIHRoYW4gZ2l2aW5nIGVhY2ggTEVEIGJpdCBwb3NpdGlvbiBpdHMKKyAqIG93biBzdHJ1Y3QgZGV2aWNlLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjZGVmaW5lIERSVl9OQU1FICJoZWFydGJlYXQiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEuMCIKKworc3RydWN0IGhlYXJ0YmVhdF9kYXRhIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgY2hhciBiaXRfcG9zWzhdOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworfTsKKworc3RhdGljIHZvaWQgaGVhcnRiZWF0X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaGVhcnRiZWF0X2RhdGEgKmhkID0gKHN0cnVjdCBoZWFydGJlYXRfZGF0YSAqKWRhdGE7CisJc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKKworCWN0cmxfb3V0dygxIDw8IGhkLT5iaXRfcG9zW2JpdF0sICh1bnNpZ25lZCBsb25nKWhkLT5iYXNlKTsKKwlpZiAodXApCisJCWlmIChiaXQgPT0gKEFSUkFZX1NJWkUoaGQtPmJpdF9wb3MpIC0gMSkpIHsKKwkJCWJpdC0tOworCQkJdXAgPSAwOworCQl9IGVsc2UKKwkJCWJpdCsrOworCWVsc2UgaWYgKGJpdCA9PSAwKQorCQl1cCA9IDE7CisJZWxzZQorCQliaXQtLTsKKworCW1vZF90aW1lcigmaGQtPnRpbWVyLCBqaWZmaWVzICsgKDExMCAtICgoMzAwIDw8IEZTSElGVCkgLworCQkJKChhdmVucnVuWzBdIC8gNSkgKyAoMyA8PCBGU0hJRlQpKSkpKTsKK30KKworc3RhdGljIGludCBoZWFydGJlYXRfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGhlYXJ0YmVhdF9kYXRhICpoZDsKKworCWlmICh1bmxpa2VseShwZGV2LT5udW1fcmVzb3VyY2VzICE9IDEpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgbnVtYmVyIG9mIHJlc291cmNlc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHVubGlrZWx5KHJlcyA9PSBOVUxMKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGVhcnRiZWF0X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWhkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpIHsKKwkJbWVtY3B5KGhkLT5iaXRfcG9zLCBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwKKwkJICAgICAgIEFSUkFZX1NJWkUoaGQtPmJpdF9wb3MpKTsKKwl9IGVsc2UgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoZC0+Yml0X3Bvcyk7IGkrKykKKwkJCWhkLT5iaXRfcG9zW2ldID0gaTsKKwl9CisKKwloZC0+YmFzZSA9ICh2b2lkIF9faW9tZW0gKilyZXMtPnN0YXJ0OworCisJc2V0dXBfdGltZXIoJmhkLT50aW1lciwgaGVhcnRiZWF0X3RpbWVyLCAodW5zaWduZWQgbG9uZyloZCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaGQpOworCisJcmV0dXJuIG1vZF90aW1lcigmaGQtPnRpbWVyLCBqaWZmaWVzICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgaGVhcnRiZWF0X2Rydl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGVhcnRiZWF0X2RhdGEgKmhkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZWxfdGltZXJfc3luYygmaGQtPnRpbWVyKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJa2ZyZWUoaGQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhlYXJ0YmVhdF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGhlYXJ0YmVhdF9kcnZfcHJvYmUsCisJLnJlbW92ZQkJPSBoZWFydGJlYXRfZHJ2X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBEUlZfTkFNRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaGVhcnRiZWF0X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgRFJWX05BTUUgIjogdmVyc2lvbiAlcyBsb2FkZWRcbiIsIERSVl9WRVJTSU9OKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoZWFydGJlYXRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhlYXJ0YmVhdF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmhlYXJ0YmVhdF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoaGVhcnRiZWF0X2luaXQpOworbW9kdWxlX2V4aXQoaGVhcnRiZWF0X2V4aXQpOworCitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvTWFrZWZpbGUgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDllMDBjYjguLmNjOGQwZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAtMTIsNyArMTIsNiBAQAogb2JqLSQoQ09ORklHX1NIX0RSRUFNQ0FTVCkJCSs9IG9wcy1kcmVhbWNhc3QubyBmaXh1cHMtZHJlYW1jYXN0Lm8gXAogCQkJCQkgICBkbWEtZHJlYW1jYXN0Lm8KIG9iai0kKENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCkJCSs9IG9wcy1zbmFwZ2Vhci5vCi1vYmotJChDT05GSUdfU0hfQklHU1VSKQkJCSs9IG9wcy1iaWdzdXIubwogb2JqLSQoQ09ORklHX1NIX1JUUzc3NTFSMkQpCQkrPSBvcHMtcnRzNzc1MXIyZC5vIGZpeHVwcy1ydHM3NzUxcjJkLm8KIG9iai0kKENPTkZJR19TSF9TSDAzKQkJCSs9IG9wcy1zaDAzLm8gZml4dXBzLXNoMDMubwogb2JqLSQoQ09ORklHX1NIX1I3NzgwUlApCQkrPSBvcHMtcjc3ODBycC5vIGZpeHVwcy1yNzc4MHJwLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWJpZ3N1ci5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtYmlnc3VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzFiZTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtYmlnc3VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtYmlnc3VyLmMKLSAqCi0gKiBCeSBEdXN0aW4gTWNJbnRpcmUgKGR1c3RpbkBzZW5zb3JpYS5jb20pIChjKTIwMDEKLSAqCi0gKiBQb3J0ZWQgdG8gbmV3IEFQSSBieSBQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPi4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgSGl0YWNoaSBCaWcgU3VyIEV2YWx1YXRpb24gQm9hcmQKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgInBjaS1zaDQuaCIKLSNpbmNsdWRlIDxhc20vYmlnc3VyL2JpZ3N1ci5oPgotCi0jZGVmaW5lIEJJR1NVUl9QQ0lfSU8JMHg0MDAwCi0jZGVmaW5lIEJJR1NVUl9QQ0lfTUVNCTB4ZmQwMDAwMDAKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaDc3NTFfaW9fcmVzb3VyY2UgPSB7Ci0JLm5hbWUJCT0gIlNINzc1MSBJTyIsCi0JLnN0YXJ0CQk9IEJJR1NVUl9QQ0lfSU8sCi0JLmVuZAkJPSBCSUdTVVJfUENJX0lPICsgKDY0KjEwMjQpIC0gMSwKLQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JTywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3NzUxX21lbV9yZXNvdXJjZSA9IHsKLQkubmFtZQkJPSAiU0g3NzUxIG1lbSIsCi0JLnN0YXJ0CQk9IEJJR1NVUl9QQ0lfTUVNLAotCS5lbmQJCT0gQklHU1VSX1BDSV9NRU0gKyAoNjQqMTAyNCoxMDI0KSAtIDEsCi0JLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIHNoNzc1MV9wY2lfb3BzOwotCi1zdHJ1Y3QgcGNpX2NoYW5uZWwgYm9hcmRfcGNpX2NoYW5uZWxzW10gPSB7Ci0JeyAmc2g0X3BjaV9vcHMsICZzaDc3NTFfaW9fcmVzb3VyY2UsICZzaDc3NTFfbWVtX3Jlc291cmNlLCAwLCAweGZmIH0sCi0JeyAwLCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgc2g3NzUxX3BjaV9tYXAgPSB7Ci0JLndpbmRvdzAJPSB7Ci0JCS5iYXNlCT0gU0g3NzUxX0NTM19CQVNFX0FERFIsCi0JCS5zaXplCT0gQklHU1VSX0xTUjBfU0laRSwKLQl9LAotCi0JLndpbmRvdzEJPSB7Ci0JCS5iYXNlCT0gU0g3NzUxX0NTM19CQVNFX0FERFIsCi0JCS5zaXplCT0gQklHU1VSX0xTUjFfU0laRSwKLQl9LAotfTsKLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIEJpZyBTdXIgUENJIGludGVyZmFjZQotICogU2V0dXAgaGFyZHdhcmUgdG8gYmUgQ2VudHJhbCBGdW50aW9uCi0gKiBDb3B5IHRoZSBCU1IgcmVncyB0byB0aGUgUENJIGludGVyZmFjZQotICogU2V0dXAgUENJIHdpbmRvd3MgaW50byBsb2NhbCBSQU0KLSAqLwotaW50IF9faW5pdCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCkKLXsKLQlyZXR1cm4gc2g3NzUxX3BjaWNfaW5pdCgmc2g3NzUxX3BjaV9tYXApOwotfQotCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQotewotCS8qCi0JICogVGhlIEJpZyBTdXIgY2FuIGJlIHVzZWQgaW4gYSBDUENJIGNoYXNzaXMsIGJ1dCB0aGUgU0g3NzUxIFBDSQotCSAqIGludGVyZmFjZSBpcyBvbiB0aGUgd3JvbmcgZW5kIG9mIHRoZSBib2FyZCBzbyB0aGF0IGl0IGNhbiBhbHNvCi0JICogc3VwcG9ydCBhIFYzMjAgQ1BJIGludGVyZmFjZSBjaGlwLi4uICBUaGVyZWZvciB0aGUgSVJRIG1hcHBpbmcgaXMKLQkgKiBzb21ld2hhdCB1c2UgZGVwZW5kZW50Li4uIEknbCBhc3N1bWUgYSBsaW5lYXIgbWFwIGZvciBub3csIGkuZS4KLQkgKiBJTlRBPXNsb3QwLHBpbjAuLi4gSU5URD1zbG90MyxwaW4wLi4uCi0JICovCi0JaW50IGlycSA9IChzbG90ICsgcGluLTEpICUgNCArIEJJR1NVUl9TSDc3NTFfUENJX0lSUV9CQVNFOwotCi0JUENJREJHKDIsICJQQ0k6IE1hcHBpbmcgQmlnIFN1ciBJUlEgZm9yIHNsb3QgJWQsIHBpbiAlYyB0byBpcnEgJWRcbiIsCi0JICAgICAgIHNsb3QsIHBpbi0xKydBJywgaXJxKTsKLQotCXJldHVybiBpcnE7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3NTEuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5jCmluZGV4IDg1ZTFlZTIuLjlkZGZmNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5jCkBAIC0xNTcsMTUgKzE1Nyw2IEBACiAJCSBQQ0lCSU9TX01JTl9JTywgKDY0IDw8IDEwKSwKIAkJIFNINzc1MV9QQ0lfSU9fQkFTRSArIFBDSUJJT1NfTUlOX0lPKTsKIAotCS8qCi0JICogWFhYOiBGb3Igbm93LCBsZWF2ZSB0aGlzIGJvYXJkLXNwZWNpZmljLiBJbiB0aGUgZXZlbnQgd2UgaGF2ZSBvdGhlcgotCSAqIGJvYXJkcyB0aGF0IG5lZWQgdG8gZG8gc2ltaWxhciB3b3JrLCB0aGlzIGNhbiBiZSB3cmFwcGVkLgotCSAqLwotI2lmZGVmIENPTkZJR19TSF9CSUdTVVIKLQliaWdzdXJfcG9ydF9tYXAoUENJQklPU19NSU5fSU8sICg2NCA8PCAxMCksCi0JCQlTSDc3NTFfUENJX0lPX0JBU0UgKyBQQ0lCSU9TX01JTl9JTywgMCk7Ci0jZW5kaWYKLQogCS8qIE1ha2Ugc3VyZSB0aGUgTVNCJ3Mgb2YgSU8gd2luZG93IGFyZSBzZXQgdG8gYWNjZXNzIFBDSSBzcGFjZQogCSAqIGNvcnJlY3RseSAqLwogCXdvcmQgPSBQQ0lCSU9TX01JTl9JTyAmIFNINF9QQ0lJT0JSX01BU0s7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCmluZGV4IDJmNmQyYmMuLmZmMzBkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCkBAIC02LDcgKzYsOCBAQAogCiBvYmoteQk6PSBwcm9jZXNzLm8gc2lnbmFsLm8gdHJhcHMubyBpcnEubyBcCiAJcHRyYWNlLm8gc2V0dXAubyB0aW1lLm8gc3lzX3NoLm8gc2VtYXBob3JlLm8gXAotCWlvLm8gaW9fZ2VuZXJpYy5vIHNoX2tzeW1zLm8gc3lzY2FsbHMubworCWlvLm8gaW9fZ2VuZXJpYy5vIHNoX2tzeW1zLm8gc3lzY2FsbHMubyBcCisJZGVidWd0cmFwcy5vCiAKIG9iai15CQkJCSs9IGNwdS8gdGltZXJzLwogb2JqLSQoQ09ORklHX1ZTWVNDQUxMKQkJKz0gdnN5c2NhbGwvCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYwppbmRleCA0ODEyMTc2Li40YjMzOWE2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ1BVIGluaXQgY29kZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUGF1bCBNdW5kdAorICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNiAgUGF1bCBNdW5kdAogICogQ29weXJpZ2h0IChDKSAyMDAzICBSaWNoYXJkIEN1cm5vdwogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCkBAIC0xMiw2ICsxMiw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtNDYsNyArNDgsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgY2NyLCBmbGFnczsKIAotCWlmIChjcHVfZGF0YS0+dHlwZSA9PSBDUFVfU0hfTk9ORSkKKwlpZiAoY3VycmVudF9jcHVfZGF0YS50eXBlID09IENQVV9TSF9OT05FKQogCQlwYW5pYygiVW5rbm93biBDUFUiKTsKIAogCWp1bXBfdG9fUDIoKTsKQEAgLTY2LDcgKzY4LDcgQEAKIAlpZiAoY2NyICYgQ0NSX0NBQ0hFX0VOQUJMRSkgewogCQl1bnNpZ25lZCBsb25nIHdheXMsIHdheXNpemUsIGFkZHJzdGFydDsKIAotCQl3YXlzaXplID0gY3B1X2RhdGEtPmRjYWNoZS5zZXRzOworCQl3YXlzaXplID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0czsKIAogI2lmZGVmIENDUl9DQUNIRV9PUkEKIAkJLyoKQEAgLTc3LDcgKzc5LDcgQEAKIAkJCXdheXNpemUgPj49IDE7CiAjZW5kaWYKIAotCQl3YXlzaXplIDw8PSBjcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X3NoaWZ0OworCQl3YXlzaXplIDw8PSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9zaGlmdDsKIAogI2lmZGVmIENDUl9DQUNIRV9FTU9ERQogCQkvKiBJZiBFTU9ERSBpcyBub3Qgc2V0LCB3ZSBvbmx5IGhhdmUgMSB3YXkgdG8gZmx1c2guICovCkBAIC04NSw3ICs4Nyw3IEBACiAJCQl3YXlzID0gMTsKIAkJZWxzZQogI2VuZGlmCi0JCQl3YXlzID0gY3B1X2RhdGEtPmRjYWNoZS53YXlzOworCQkJd2F5cyA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXM7CiAKIAkJYWRkcnN0YXJ0ID0gQ0FDSEVfT0NfQUREUkVTU19BUlJBWTsKIAkJZG8gewpAQCAtOTMsMTAgKzk1LDEwIEBACiAKIAkJCWZvciAoYWRkciA9IGFkZHJzdGFydDsKIAkJCSAgICAgYWRkciA8IGFkZHJzdGFydCArIHdheXNpemU7Ci0JCQkgICAgIGFkZHIgKz0gY3B1X2RhdGEtPmRjYWNoZS5saW5lc3opCisJCQkgICAgIGFkZHIgKz0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6KQogCQkJCWN0cmxfb3V0bCgwLCBhZGRyKTsKIAotCQkJYWRkcnN0YXJ0ICs9IGNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3I7CisJCQlhZGRyc3RhcnQgKz0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3I7CiAJCX0gd2hpbGUgKC0td2F5cyk7CiAJfQogCkBAIC0xMDgsNyArMTEwLDcgQEAKIAogI2lmZGVmIENDUl9DQUNIRV9FTU9ERQogCS8qIEZvcmNlIEVNT0RFIGlmIHBvc3NpYmxlICovCi0JaWYgKGNwdV9kYXRhLT5kY2FjaGUud2F5cyA+IDEpCisJaWYgKGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMgPiAxKQogCQlmbGFncyB8PSBDQ1JfQ0FDSEVfRU1PREU7CiAJZWxzZQogCQlmbGFncyAmPSB+Q0NSX0NBQ0hFX0VNT0RFOwpAQCAtMTI1LDEwICsxMjcsMTAgQEAKICNpZmRlZiBDT05GSUdfU0hfT0NSQU0KIAkvKiBUdXJuIG9uIE9DUkFNIC0tIGhhbHZlIHRoZSBPQyAqLwogCWZsYWdzIHw9IENDUl9DQUNIRV9PUkE7Ci0JY3B1X2RhdGEtPmRjYWNoZS5zZXRzID4+PSAxOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgPj49IDE7CiAKLQljcHVfZGF0YS0+ZGNhY2hlLndheV9zaXplID0gY3B1X2RhdGEtPmRjYWNoZS5zZXRzICoKLQkJCQkgICAgY3B1X2RhdGEtPmRjYWNoZS5saW5lc3o7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X3NpemUgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzICoKKwkJCQkgICAgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6OwogI2VuZGlmCiAKIAljdHJsX291dGwoZmxhZ3MsIENDUik7CkBAIC0xNzAsNyArMTcyLDcgQEAKIAogCS8qIElmIHRoZSBEU1AgYml0IGlzIHN0aWxsIHNldCwgdGhpcyBDUFUgaGFzIGEgRFNQICovCiAJaWYgKHNyICYgU1JfRFNQKQotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19EU1A7CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19EU1A7CiAKIAkvKiBOb3cgdGhhdCB3ZSd2ZSBkZXRlcm1pbmVkIHRoZSBEU1Agc3RhdHVzLCBjbGVhciB0aGUgRFNQIGJpdC4gKi8KIAlyZWxlYXNlX2RzcCgpOwpAQCAtMjAyLDIyICsyMDQsMjggQEAKIAljYWNoZV9pbml0KCk7CiAKIAlzaG1fYWxpZ25fbWFzayA9IG1heF90KHVuc2lnbmVkIGxvbmcsCi0JCQkgICAgICAgY3B1X2RhdGEtPmRjYWNoZS53YXlfc2l6ZSAtIDEsCisJCQkgICAgICAgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X3NpemUgLSAxLAogCQkJICAgICAgIFBBR0VfU0laRSAtIDEpOwogCiAJLyogRGlzYWJsZSB0aGUgRlBVICovCiAJaWYgKGZwdV9kaXNhYmxlZCkgewogCQlwcmludGsoIkZQVSBEaXNhYmxlZFxuIik7Ci0JCWNwdV9kYXRhLT5mbGFncyAmPSB+Q1BVX0hBU19GUFU7CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgJj0gfkNQVV9IQVNfRlBVOwogCQlkaXNhYmxlX2ZwdSgpOwogCX0KIAogCS8qIEZQVSBpbml0aWFsaXphdGlvbiAqLwotCWlmICgoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19GUFUpKSB7CisJaWYgKChjdXJyZW50X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19GUFUpKSB7CiAJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9VU0VERlBVKTsKIAkJY2xlYXJfdXNlZF9tYXRoKCk7CiAJfQogCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBwZXItQ1BVIEFTSUQgY2FjaGUgdmVyeSBlYXJseSwgc2luY2UgdGhlCisJICogVExCIGZsdXNoaW5nIHJvdXRpbmVzIGRlcGVuZCBvbiB0aGlzIGJlaW5nIHNldHVwLgorCSAqLworCWN1cnJlbnRfY3B1X2RhdGEuYXNpZF9jYWNoZSA9IE5PX0NPTlRFWFQ7CisKICNpZmRlZiBDT05GSUdfU0hfRFNQCiAJLyogUHJvYmUgZm9yIERTUCAqLwogCWRzcF9pbml0KCk7CkBAIC0yMjUsNyArMjMzLDcgQEAKIAkvKiBEaXNhYmxlIHRoZSBEU1AgKi8KIAlpZiAoZHNwX2Rpc2FibGVkKSB7CiAJCXByaW50aygiRFNQIERpc2FibGVkXG4iKTsKLQkJY3B1X2RhdGEtPmZsYWdzICY9IH5DUFVfSEFTX0RTUDsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyAmPSB+Q1BVX0hBU19EU1A7CiAJCXJlbGVhc2VfZHNwKCk7CiAJfQogI2VuZGlmCkBAIC0yNDAsNCArMjQ4LDMgQEAKIAl1YmNfd2FrZXVwKCk7CiAjZW5kaWYKIH0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKaW5kZXggMzVlYjU3NS4uMjEwMjgwYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCkBAIC00MywxNiArNDMsMjkgQEAKIAkubWFza19hY2sJPSBkaXNhYmxlX2lwcl9pcnEsCiB9OwogCit1bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7Cit1bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCit7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQgbWFrZV9pcHJfaXJxKHN0cnVjdCBpcHJfZGF0YSAqdGFibGUsIHVuc2lnbmVkIGludCBucl9pcnFzKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgewogCQl1bnNpZ25lZCBpbnQgaXJxID0gdGFibGVbaV0uaXJxOwotCQl0YWJsZVtpXS5hZGRyID0gbWFwX2lwcmlkeF90b19hZGRyKHRhYmxlW2ldLmlwcl9pZHgpOworCisJCWlmICghaXJxKQorCQkJaXJxID0gdGFibGVbaV0uaXJxID0gaTsKKwogCQkvKiBjb3VsZCB0aGUgSVBSIGluZGV4IGJlIG1hcHBlZCwgaWYgbm90IHdlIGlnbm9yZSB0aGlzICovCi0JCWlmICh0YWJsZVtpXS5hZGRyID09IDApCi0JCQljb250aW51ZTsKKwkJaWYgKCF0YWJsZVtpXS5hZGRyKSB7CisJCQl0YWJsZVtpXS5hZGRyID0gbWFwX2lwcmlkeF90b19hZGRyKHRhYmxlW2ldLmlwcl9pZHgpOworCQkJaWYgKCF0YWJsZVtpXS5hZGRyKQorCQkJCWNvbnRpbnVlOworCQl9CisKIAkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmlwcl9pcnFfY2hpcCwKIAkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUwppbmRleCBkNTFmYTVlOS4uN2Y3ZDI5MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUwpAQCAtMTc4LDEyICsxNzgsMTAgQEAKIDg6CS5sb25nCWRvX2V4Y2VwdGlvbl9lcnJvcgogCQogdHJhcF9lbnRyeToKLQkvKiB2ZXJib3NlIEJVRyB0cmFwYSBlbnRyeSBjaGVjayAqLwotCW1vdgkjMHgzZSxyOAotCWNtcC9nZQlyOCxyOQotCWJmL3MJMWYKLQkgYWRkCSMtMHgxMCxyOQotCWFkZAkjMHgxMCxyOQorCW1vdgkjMHgzMCxyOAorCWNtcC9nZQlyOCxyOQkJISB2ZWN0b3IgMHgyMC0weDJmIGlzIHN5c3RlbWNhbGwKKwlidAkxZgorCWFkZAkjLTB4MTAscjkJISBjb252ZXJ0IFNIMiB0byBTSDMvNCBBQkkKIDE6CQogCXNobGwyCXI5CQkJISBUUkEKIAltb3YJI09GRl9UUkEscjgKQEAgLTIwNiw3ICsyMDQsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykKIAkvKiBVbndpbmQgdGhlIHN0YWNrIGFuZCBqbXAgdG8gdGhlIGRlYnVnIGVudHJ5ICovCi1kZWJ1Z19rZXJuZWxfZnc6CitFTlRSWShzaF9iaW9zX2hhbmRsZXIpCiAJbW92CXIxNSxyMAogCWFkZAkjKDIyLTQpKjQtNCxyMAogCWxkYy5sCUByMCssZ2JyCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3Byb2JlLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3Byb2JlLmMKaW5kZXggYmE1MjdkOS4uMTA4ZTgxYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvcHJvYmUuYwpAQCAtMTgsMjcgKzE4LDI3IEBACiBpbnQgX19pbml0IGRldGVjdF9jcHVfYW5kX2NhY2hlX3N5c3RlbSh2b2lkKQogewogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCkKLQljcHVfZGF0YS0+dHlwZQkJCT0gQ1BVX1NINzYwNDsKLQljcHVfZGF0YS0+ZGNhY2hlLndheXMJCT0gNDsKLQljcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyCT0gKDE8PDEwKTsKLQljcHVfZGF0YS0+ZGNhY2hlLnNldHMJCT0gNjQ7Ci0JY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9zaGlmdAk9IDQ7Ci0JY3B1X2RhdGEtPmRjYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7Ci0JY3B1X2RhdGEtPmRjYWNoZS5mbGFncwkJPSAwOworCWN1cnJlbnRfY3B1X2RhdGEudHlwZQkJCT0gQ1BVX1NINzYwNDsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTApOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMJCT0gNjQ7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfc2hpZnQJPSA0OworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5mbGFncwkJPSAwOwogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQotCWNwdV9kYXRhLT50eXBlCQkJPSBDUFVfU0g3NjE5OwotCWNwdV9kYXRhLT5kY2FjaGUud2F5cwkJPSA0OwotCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTIpOwotCWNwdV9kYXRhLT5kY2FjaGUuc2V0cwkJPSAyNTY7Ci0JY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9zaGlmdAk9IDQ7Ci0JY3B1X2RhdGEtPmRjYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7Ci0JY3B1X2RhdGEtPmRjYWNoZS5mbGFncwkJPSAwOworCWN1cnJlbnRfY3B1X2RhdGEudHlwZQkJCT0gQ1BVX1NINzYxOTsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTIpOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMJCT0gMjU2OworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X3NoaWZ0CT0gNDsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZmxhZ3MJCT0gMDsKICNlbmRpZgogCS8qCiAJICogU0gtMiBkb2Vzbid0IGhhdmUgc2VwYXJhdGUgY2FjaGVzCiAJICovCi0JY3B1X2RhdGEtPmRjYWNoZS5mbGFncyB8PSBTSF9DQUNIRV9DT01CSU5FRDsKLQljcHVfZGF0YS0+aWNhY2hlID0gY3B1X2RhdGEtPmRjYWNoZTsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5mbGFncyB8PSBTSF9DQUNIRV9DT01CSU5FRDsKKwljdXJyZW50X2NwdV9kYXRhLmljYWNoZSA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYwppbmRleCA3OTI4M2U2Li5mODNmZjhhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMKQEAgLTUyLDQyICs1MiwzOCBAQAogfQogX19pbml0Y2FsbChzaDc2MTlfZGV2aWNlc19zZXR1cCk7CiAKLSNkZWZpbmUgSU5UQ19JUFJDICAgICAgMHhmODA4MDAwMFVMCi0jZGVmaW5lIElOVENfSVBSRCAgICAgIDB4ZjgwODAwMDJVTAotCi0jZGVmaW5lIENNSTBfSVJRICAgICAgIDg2Ci0KLSNkZWZpbmUgU0NJRjBfRVJJX0lSUSAgODgKLSNkZWZpbmUgU0NJRjBfUlhJX0lSUSAgODkKLSNkZWZpbmUgU0NJRjBfQlJJX0lSUSAgOTAKLSNkZWZpbmUgU0NJRjBfVFhJX0lSUSAgOTEKLQotI2RlZmluZSBTQ0lGMV9FUklfSVJRICA5MgotI2RlZmluZSBTQ0lGMV9SWElfSVJRICA5MwotI2RlZmluZSBTQ0lGMV9CUklfSVJRICA5NAotI2RlZmluZSBTQ0lGMV9UWElfSVJRICA5NQotCi0jZGVmaW5lIFNDSUYyX0JSSV9JUlEgIDk2Ci0jZGVmaW5lIFNDSUYyX0VSSV9JUlEgIDk3Ci0jZGVmaW5lIFNDSUYyX1JYSV9JUlEgIDk4Ci0jZGVmaW5lIFNDSUYyX1RYSV9JUlEgIDk5Ci0KIHN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NjE5X2lwcl9tYXBbXSA9IHsKLQl7IENNSTBfSVJRLCAgICAgIElOVENfSVBSQywgMSwgMiB9LAotCXsgU0NJRjBfRVJJX0lSUSwgSU5UQ19JUFJELCAzLCAzIH0sCi0JeyBTQ0lGMF9SWElfSVJRLCBJTlRDX0lQUkQsIDMsIDMgfSwKLQl7IFNDSUYwX0JSSV9JUlEsIElOVENfSVBSRCwgMywgMyB9LAotCXsgU0NJRjBfVFhJX0lSUSwgSU5UQ19JUFJELCAzLCAzIH0sCi0JeyBTQ0lGMV9FUklfSVJRLCBJTlRDX0lQUkQsIDIsIDMgfSwKLQl7IFNDSUYxX1JYSV9JUlEsIElOVENfSVBSRCwgMiwgMyB9LAotCXsgU0NJRjFfQlJJX0lSUSwgSU5UQ19JUFJELCAyLCAzIH0sCi0JeyBTQ0lGMV9UWElfSVJRLCBJTlRDX0lQUkQsIDIsIDMgfSwKLQl7IFNDSUYyX0VSSV9JUlEsIElOVENfSVBSRCwgMSwgMyB9LAotCXsgU0NJRjJfUlhJX0lSUSwgSU5UQ19JUFJELCAxLCAzIH0sCi0JeyBTQ0lGMl9CUklfSVJRLCBJTlRDX0lQUkQsIDEsIDMgfSwKLQl7IFNDSUYyX1RYSV9JUlEsIElOVENfSVBSRCwgMSwgMyB9LAorCXsgODYsIDAsICA0LCAyIH0sCS8qIENNSTAgKi8KKwl7IDg4LCAxLCAxMiwgMyB9LAkvKiBTQ0lGMF9FUkkgKi8KKwl7IDg5LCAxLCAxMiwgMyB9LAkvKiBTQ0lGMF9SWEkgKi8KKwl7IDkwLCAxLCAxMiwgMyB9LAkvKiBTQ0lGMF9CUkkgKi8KKwl7IDkxLCAxLCAxMiwgMyB9LAkvKiBTQ0lGMF9UWEkgKi8KKwl7IDkyLCAxLCAgOCwgMyB9LAkvKiBTQ0lGMV9FUkkgKi8KKwl7IDkzLCAxLCAgOCwgMyB9LAkvKiBTQ0lGMV9SWEkgKi8KKwl7IDk0LCAxLCAgOCwgMyB9LAkvKiBTQ0lGMV9CUkkgKi8KKwl7IDk1LCAxLCAgOCwgMyB9LAkvKiBTQ0lGMV9UWEkgKi8KKwl7IDk2LCAxLCAgNCwgMyB9LAkvKiBTQ0lGMl9FUkkgKi8KKwl7IDk3LCAxLCAgNCwgMyB9LAkvKiBTQ0lGMl9SWEkgKi8KKwl7IDk4LCAxLCAgNCwgMyB9LAkvKiBTQ0lGMl9CUkkgKi8KKwl7IDk5LCAxLCAgNCwgMyB9LAkvKiBTQ0lGMl9UWEkgKi8KIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXByX29mZnNldHNbXSA9IHsKKwkweGY4MDgwMDAwLAkvKiBJUFJDICovCisJMHhmODA4MDAwMiwJLyogSVBSRCAqLworCTB4ZjgwODAwMDQsCS8qIElQUkUgKi8KKwkweGY4MDgwMDA2LAkvKiBJUFJGICovCisJMHhmODA4MDAwOCwJLyogSVBSRyAqLworfTsKKworLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwordW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQoreworCWlmICh1bmxpa2VseShpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKK30KKwogdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7CiAJbWFrZV9pcHJfaXJxKHNoNzYxOV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzYxOV9pcHJfbWFwKSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvcHJvYmUuYwppbmRleCA4N2M2YzA1Li40MjZmNmRiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9wcm9iZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3Byb2JlLmMKQEAgLTE3LDE0ICsxNywxNCBAQAogaW50IF9faW5pdCBkZXRlY3RfY3B1X2FuZF9jYWNoZV9zeXN0ZW0odm9pZCkKIHsKIAkvKiBKdXN0IFNINzIwNiBmb3Igbm93IC4uICovCi0JY3B1X2RhdGEtPnR5cGUJCQk9IENQVV9TSDcyMDY7CisJY3VycmVudF9jcHVfZGF0YS50eXBlCQkJPSBDUFVfU0g3MjA2OwogCi0JY3B1X2RhdGEtPmRjYWNoZS53YXlzCQk9IDQ7Ci0JY3B1X2RhdGEtPmRjYWNoZS53YXlfaW5jcgk9ICgxIDw8IDExKTsKLQljcHVfZGF0YS0+ZGNhY2hlLnNldHMJCT0gMTI4OwotCWNwdV9kYXRhLT5kY2FjaGUuZW50cnlfc2hpZnQJPSA0OwotCWNwdV9kYXRhLT5kY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOwotCWNwdV9kYXRhLT5kY2FjaGUuZmxhZ3MJCT0gMDsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxMSk7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0cwkJPSAxMjg7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfc2hpZnQJPSA0OworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5mbGFncwkJPSAwOwogCiAJLyoKIAkgKiBUaGUgaWNhY2hlIGlzIHRoZSBzYW1lIGFzIHRoZSBkY2FjaGUgYXMgZmFyIGFzIHRoaXMgc2V0dXAgaXMKQEAgLTMyLDcgKzMyLDcgQEAKIAkgKiBsYWNrcyB0aGUgVSBiaXQgdGhhdCB0aGUgZGNhY2hlIGhhcywgbm9uZSBvZiB0aGlzIGhhcyBhbnkgYmVhcmluZwogCSAqIG9uIHRoZSBjYWNoZSBpbmZvLgogCSAqLwotCWNwdV9kYXRhLT5pY2FjaGUJCT0gY3B1X2RhdGEtPmRjYWNoZTsKKwljdXJyZW50X2NwdV9kYXRhLmljYWNoZQkJPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYwppbmRleCA0YjYwZmNjLi40ZWQ5MTEwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYwpAQCAtNTcsNTUgKzU3LDUyIEBACiB9CiBfX2luaXRjYWxsKHNoNzIwNl9kZXZpY2VzX3NldHVwKTsKIAotI2RlZmluZSBJTlRDX0lQUjA4ICAgICAweGZmZmUwYzA0VUwKLSNkZWZpbmUgSU5UQ19JUFIwOSAgICAgMHhmZmZlMGMwNlVMCi0jZGVmaW5lIElOVENfSVBSMTQgICAgIDB4ZmZmZTBjMTBVTAotCi0jZGVmaW5lIENNSTBfSVJRICAgICAgIDE0MAotCi0jZGVmaW5lIE1UVTFfVEdJMUEgICAgIDE2NAotCi0jZGVmaW5lIFNDSUYwX0JSSV9JUlEgIDI0MAotI2RlZmluZSBTQ0lGMF9FUklfSVJRICAyNDEKLSNkZWZpbmUgU0NJRjBfUlhJX0lSUSAgMjQyCi0jZGVmaW5lIFNDSUYwX1RYSV9JUlEgIDI0MwotCi0jZGVmaW5lIFNDSUYxX0JSSV9JUlEgIDI0NAotI2RlZmluZSBTQ0lGMV9FUklfSVJRICAyNDUKLSNkZWZpbmUgU0NJRjFfUlhJX0lSUSAgMjQ2Ci0jZGVmaW5lIFNDSUYxX1RYSV9JUlEgIDI0NwotCi0jZGVmaW5lIFNDSUYyX0JSSV9JUlEgIDI0OAotI2RlZmluZSBTQ0lGMl9FUklfSVJRICAyNDkKLSNkZWZpbmUgU0NJRjJfUlhJX0lSUSAgMjUwCi0jZGVmaW5lIFNDSUYyX1RYSV9JUlEgIDI1MQotCi0jZGVmaW5lIFNDSUYzX0JSSV9JUlEgIDI1MgotI2RlZmluZSBTQ0lGM19FUklfSVJRICAyNTMKLSNkZWZpbmUgU0NJRjNfUlhJX0lSUSAgMjU0Ci0jZGVmaW5lIFNDSUYzX1RYSV9JUlEgIDI1NQotCiBzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzIwNl9pcHJfbWFwW10gPSB7Ci0JeyBDTUkwX0lSUSwgICAgICBJTlRDX0lQUjA4LCAzLCAyIH0sCi0JeyBNVFUyX1RHSTFBLCAgICBJTlRDX0lQUjA5LCAxLCAyIH0sCi0JeyBTQ0lGMF9FUklfSVJRLCBJTlRDX0lQUjE0LCAzLCAzIH0sCi0JeyBTQ0lGMF9SWElfSVJRLCBJTlRDX0lQUjE0LCAzLCAzIH0sCi0JeyBTQ0lGMF9CUklfSVJRLCBJTlRDX0lQUjE0LCAzLCAzIH0sCi0JeyBTQ0lGMF9UWElfSVJRLCBJTlRDX0lQUjE0LCAzLCAzIH0sCi0JeyBTQ0lGMV9FUklfSVJRLCBJTlRDX0lQUjE0LCAyLCAzIH0sCi0JeyBTQ0lGMV9SWElfSVJRLCBJTlRDX0lQUjE0LCAyLCAzIH0sCi0JeyBTQ0lGMV9CUklfSVJRLCBJTlRDX0lQUjE0LCAyLCAzIH0sCi0JeyBTQ0lGMV9UWElfSVJRLCBJTlRDX0lQUjE0LCAyLCAzIH0sCi0JeyBTQ0lGMl9FUklfSVJRLCBJTlRDX0lQUjE0LCAxLCAzIH0sCi0JeyBTQ0lGMl9SWElfSVJRLCBJTlRDX0lQUjE0LCAxLCAzIH0sCi0JeyBTQ0lGMl9CUklfSVJRLCBJTlRDX0lQUjE0LCAxLCAzIH0sCi0JeyBTQ0lGMl9UWElfSVJRLCBJTlRDX0lQUjE0LCAxLCAzIH0sCi0JeyBTQ0lGM19FUklfSVJRLCBJTlRDX0lQUjE0LCAwLCAzIH0sCi0JeyBTQ0lGM19SWElfSVJRLCBJTlRDX0lQUjE0LCAwLCAzIH0sCi0JeyBTQ0lGM19CUklfSVJRLCBJTlRDX0lQUjE0LCAwLCAzIH0sCi0JeyBTQ0lGM19UWElfSVJRLCBJTlRDX0lQUjE0LCAwLCAzIH0sCisJeyAxNDAsICA3LCAxMiwgMiB9LAkvKiBDTUkwICovCisJeyAxNjQsICA4LCAgNCwgMiB9LAkvKiBNVFUyX1RHSTFBICovCisJeyAyNDAsIDEzLCAxMiwgMyB9LAkvKiBTQ0lGMF9CUkkgKi8KKwl7IDI0MSwgMTMsIDEyLCAzIH0sCS8qIFNDSUYwX0VSSSAqLworCXsgMjQyLCAxMywgMTIsIDMgfSwJLyogU0NJRjBfUlhJICovCisJeyAyNDMsIDEzLCAxMiwgMyB9LAkvKiBTQ0lGMF9UWEkgKi8KKwl7IDI0NCwgMTMsICA4LCAzIH0sCS8qIFNDSUYxX0JSSSAqLworCXsgMjQ1LCAxMywgIDgsIDMgfSwJLyogU0NJRjFfRVJJICovCisJeyAyNDYsIDEzLCAgOCwgMyB9LAkvKiBTQ0lGMV9SWEkgKi8KKwl7IDI0NywgMTMsICA4LCAzIH0sCS8qIFNDSUYxX1RYSSAqLworCXsgMjQ4LCAxMywgIDQsIDMgfSwJLyogU0NJRjJfQlJJICovCisJeyAyNDksIDEzLCAgNCwgMyB9LAkvKiBTQ0lGMl9FUkkgKi8KKwl7IDI1MCwgMTMsICA0LCAzIH0sCS8qIFNDSUYyX1JYSSAqLworCXsgMjUxLCAxMywgIDQsIDMgfSwJLyogU0NJRjJfVFhJICovCisJeyAyNTIsIDEzLCAgMCwgMyB9LAkvKiBTQ0lGM19CUkkgKi8KKwl7IDI1MywgMTMsICAwLCAzIH0sCS8qIFNDSUYzX0VSSSAqLworCXsgMjU0LCAxMywgIDAsIDMgfSwJLyogU0NJRjNfUlhJICovCisJeyAyNTUsIDEzLCAgMCwgMyB9LAkvKiBTQ0lGM19UWEkgKi8KIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXByX29mZnNldHNbXSA9IHsKKwkweGZmZmUwODE4LAkvKiBJUFIwMSAqLworCTB4ZmZmZTA4MWEsCS8qIElQUjAyICovCisJMCwJCS8qIHVudXNlZCAqLworCTAsCQkvKiB1bnVzZWQgKi8KKwkweGZmZmUwODIwLAkvKiBJUFIwNSAqLworCTB4ZmZmZTBjMDAsCS8qIElQUjA2ICovCisJMHhmZmZlMGMwMiwJLyogSVBSMDcgKi8KKwkweGZmZmUwYzA0LAkvKiBJUFIwOCAqLworCTB4ZmZmZTBjMDYsCS8qIElQUjA5ICovCisJMHhmZmZlMGMwOCwJLyogSVBSMTAgKi8KKwkweGZmZmUwYzBhLAkvKiBJUFIxMSAqLworCTB4ZmZmZTBjMGMsCS8qIElQUjEyICovCisJMHhmZmZlMGMwZSwJLyogSVBSMTMgKi8KKwkweGZmZmUwYzEwLAkvKiBJUFIxNCAqLworfTsKKworLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwordW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQoreworCWlmICh1bmxpa2VseShpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKK30KKwogdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7CiAJbWFrZV9pcHJfaXJxKHNoNzIwNl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzIwNl9pcHJfbWFwKSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMKaW5kZXggOGMwZGMyNy4uYzE5MjA1YiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUwpAQCAtMTMsMTAgKzEzLDggQEAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9jcHUvbW11X2NvbnRleHQuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCiAhIE5PVEU6CiAhIEdOVSBhcyAoYXMgb2YgMi45LjEpIGNoYW5nZXMgYmYvcyBpbnRvIGJ0L3MgYW5kIGJyYSwgd2hlbiB0aGUgYWRkcmVzcwpAQCAtMTM4LDE0ICsxMzYsMjkgQEAKIAogY2FsbF9kcGY6CiAJbW92LmwJMWYsIHIwCi0gCW1vdi5sCUByMCwgcjYJCSEgYWRkcmVzcworCW1vdglyNSwgcjgKKwltb3YubAlAcjAsIHI2CisJbW92CXI2LCByOQorCW1vdi5sCTJmLCByMAorCXN0cwlwciwgcjEwCisJanNyCUByMAorCSBtb3YJcjE1LCByNAorCSEKKwl0c3QJcjAsIHIwCisJYmYvcwkwZgorCSBsZHMJcjEwLCBwcgorCXJ0cworCSBub3AKKzA6CXN0aQogCW1vdi5sCTNmLCByMAotCisJbW92CXI5LCByNgorCW1vdglyOCwgcjUKIAlqbXAJQHIwCi0gCSBtb3YJcjE1LCByNAkJISByZWdzCisJIG1vdglyMTUsIHI0CiAKIAkuYWxpZ24gMgogMToJLmxvbmcJTU1VX1RFQQorMjoJLmxvbmcJX19kb19wYWdlX2ZhdWx0CiAzOgkubG9uZwlkb19wYWdlX2ZhdWx0CiAKIAkuYWxpZ24JMgpAQCAtMTczLDcgKzE4Niw3IEBACiAKICNpZiBkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKQogCS8qIFVud2luZCB0aGUgc3RhY2sgYW5kIGptcCB0byB0aGUgZGVidWcgZW50cnkgKi8KLWRlYnVnX2tlcm5lbF9mdzoKK0VOVFJZKHNoX2Jpb3NfaGFuZGxlcikKIAltb3YubAlAcjE1KywgcjAKIAltb3YubAlAcjE1KywgcjEKIAltb3YubAlAcjE1KywgcjIKQEAgLTMzMiwxNzUgKzM0NSw5IEBACiAhCiAhCiAKLS8qIFRoaXMgY29kZSBtYWtlcyBzb21lIGFzc3VtcHRpb25zIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCi0gKiBNYWtlIHN1cmUgdGhleSBhcmUgc3RpbCB0cnVlLiAqLwotI2lmIFBUUlNfUEVSX1BHRCAhPSBQVFJTX1BFUl9QVEUKLSNlcnJvciBQR0QgYW5kIFBURSBzaXplcyBkb24ndCBtYXRjaAotI2VuZGlmCi0KLS8qIGdhcyBkb2Vzbid0IGZsYWcgaW1wb3NzaWJsZSB2YWx1ZXMgZm9yIG1vdiAjaW1tZWRpYXRlIGFzIGFuIGVycm9yICovCi0jaWYgKF9QQUdFX1BSRVNFTlQgPj4gMikgPiAweDdmCi0jZXJyb3IgY2Fubm90IGxvYWQgUEFHRV9QUkVTRU5UIGFzIGFuIGltbWVkaWF0ZQotI2VuZGlmCi0jaWYgX1BBR0VfRElSVFkgPiAweDdmCi0jZXJyb3IgY2Fubm90IGxvYWQgUEFHRV9ESVJUWSBhcyBhbiBpbW1lZGlhdGUKLSNlbmRpZgotI2lmIChfUEFHRV9QUkVTRU5UIDw8IDIpICE9IF9QQUdFX0FDQ0VTU0VECi0jZXJyb3IgY2Fubm90IGRlcml2ZSBQQUdFX0FDQ0VTU0VEIGZyb20gUEFHRV9QUkVTRU5UCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCi0jZGVmaW5lIGxkbW11cHRlaChyKQltb3YubAk4ZiwgcgotI2Vsc2UKLSNkZWZpbmUgbGRtbXVwdGVoKHIpCW1vdgkjTU1VX1BURUgsIHIKLSNlbmRpZgotCiAJLmJhbGlnbiAJMTAyNCwwLDEwMjQKIHRsYl9taXNzOgotI2lmZGVmIENPVU5UX0VYQ0VQVElPTlMKLQkhIEluY3JlbWVudCB0aGUgY291bnRzCi0JbW92LmwJOWYsIGsxCi0JbW92LmwJQGsxLCBrMgotCWFkZAkjMSwgazIKLQltb3YubAlrMiwgQGsxCi0jZW5kaWYKLQotCSEgazAgc2NyYXRjaAotCSEgazEgcGdkIGFuZCBwdGUgcG9pbnRlcnMKLQkhIGsyIGZhdWx0aW5nIGFkZHJlc3MKLQkhIGszIHBnZCBhbmQgcHRlIGluZGV4IG1hc2tzCi0JISBrNCBzaGlmdAotCi0JISBMb2FkIHVwIHRoZSBwZ2QgZW50cnkgKGsxKQotCi0JbGRtbXVwdGVoKGswKQkJCSEgIDkgTFMgKGxhdGVuY3k9MikJTU1VX1BURUgKLQotCW1vdi53CTRmLCBrMwkJCSEgIDggTFMgKGxhdGVuY3k9MikJKFBUUlNfUEVSX1BHRC0xKSA8PCAyCi0JbW92CSMtKFBHRElSX1NISUZULTIpLCBrNAkhICA2IEVYCi0KLQltb3YubAlAKE1NVV9URUEtTU1VX1BURUgsazApLCBrMgkhIDE4IExTIChsYXRlbmN5PTIpCi0KLQltb3YubAlAKE1NVV9UVEItTU1VX1BURUgsazApLCBrMQkhIDE4IExTIChsYXRlbmN5PTIpCi0KLQltb3YJazIsIGswCQkJISAgIDUgTVQgKGxhdGVuY3k9MCkKLQlzaGxkCWs0LCBrMAkJCSEgIDk5IEVYCi0KLQlhbmQJazMsIGswCQkJISAgNzggRVgKLQotCW1vdi5sCUAoazAsIGsxKSwgazEJCSEgIDIxIExTIChsYXRlbmN5PTIpCi0JbW92CSMtKFBBR0VfU0hJRlQtMiksIGs0CSEgICA2IEVYCi0KLQkhIExvYWQgdXAgdGhlIHB0ZSBlbnRyeSAoazIpCi0KLQltb3YJazIsIGswCQkJISAgIDUgTVQgKGxhdGVuY3k9MCkKLQlzaGxkCWs0LCBrMAkJCSEgIDk5IEVYCi0KLQl0c3QJazEsIGsxCQkJISAgODYgTVQKLQotCWJ0CTIwZgkJCSEgMTEwIEJSCi0KLQlhbmQJazMsIGswCQkJISAgNzggRVgKLQltb3Yudwk1ZiwgazQJCQkhICAgOCBMUyAobGF0ZW5jeT0yKQlfUEFHRV9QUkVTRU5UCi0KLQltb3YubAlAKGswLCBrMSksIGsyCQkhICAyMSBMUyAobGF0ZW5jeT0yKQotCWFkZAlrMCwgazEJCQkhICA0OSBFWAotCi0jaWZkZWYgQ09ORklHX0NQVV9IQVNfUFRFQQotCSEgVGVzdCB0aGUgZW50cnkgZm9yIHByZXNlbnQgYW5kIF9QQUdFX0FDQ0VTU0VECi0KLQltb3YJIy0yOCwgazMJCSEgICA2IEVYCi0JbW92CWsyLCBrMAkJCSEgICA1IE1UIChsYXRlbmN5PTApCi0KLQl0c3QJazQsIGsyCQkJISAgNjggTVQKLQlzaGxkCWszLCBrMAkJCSEgIDk5IEVYCi0KLQlidAkyMGYJCQkhIDExMCBCUgotCi0JISBTZXQgUFRFQSByZWdpc3RlcgotCSEgTU1VX1BURUEgPSAoKHB0ZXZhbCA+PiAyOCkgJiAweGUpIHwgKHB0ZXZhbCAmIDB4MSkKLQkhCi0JISBrMD1wdGU+PjI4LCBrMT1wdGUqLCBrMj1wdGUsIGszPTx1bnVzZWQ+LCBrND1fUEFHRV9QUkVTRU5UCi0KLQlhbmQJIzB4ZSwgazAJCSEgIDc5IEVYCi0KLQltb3YJazAsIGszCQkJISAgIDUgTVQgKGxhdGVuY3k9MCkKLQltb3YJazIsIGswCQkJISAgIDUgTVQgKGxhdGVuY3k9MCkKLQotCWFuZAkjMSwgazAJCQkhICA3OSBFWAotCi0Jb3IJazAsIGszCQkJISAgODIgRVgKLQotCWxkbW11cHRlaChrMCkJCQkhICAgOSBMUyAobGF0ZW5jeT0yKQotCXNobGwyCWs0CQkJISAxMDEgRVgJCV9QQUdFX0FDQ0VTU0VECi0KLQl0c3QJazQsIGsyCQkJISAgNjggTVQKLQotCW1vdi5sCWszLCBAKE1NVV9QVEVBLU1NVV9QVEVILGswKQkhIDI3IExTCi0KLQltb3YubAk3ZiwgazMJCQkhICAgOSBMUyAobGF0ZW5jeT0yKQlfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLCi0KLQkhIGswPU1NVV9QVEVILCBrMT1wdGUqLCBrMj1wdGUsIGszPV9QQUdFX0ZMQUdTX0hBUkRXQVJFLCBrND1fUEFHRV9BQ0NFU1NFRAotI2Vsc2UKLQotCSEgVGVzdCB0aGUgZW50cnkgZm9yIHByZXNlbnQgYW5kIF9QQUdFX0FDQ0VTU0VECi0KLQltb3YubAk3ZiwgazMJCQkhICAgOSBMUyAobGF0ZW5jeT0yKQlfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLCi0JdHN0CWs0LCBrMgkJCSEgIDY4IE1UCi0KLQlzaGxsMglrNAkJCSEgMTAxIEVYCQlfUEFHRV9BQ0NFU1NFRAotCWxkbW11cHRlaChrMCkJCQkhICAgOSBMUyAobGF0ZW5jeT0yKQotCi0JYnQJMjBmCQkJISAxMTAgQlIKLQl0c3QJazQsIGsyCQkJISAgNjggTVQKLQotCSEgazA9TU1VX1BURUgsIGsxPXB0ZSosIGsyPXB0ZSwgazM9X1BBR0VfRkxBR1NfSEFSRFdBUkUsIGs0PV9QQUdFX0FDQ0VTU0VECi0KLSNlbmRpZgotCi0JISBTZXQgdXAgdGhlIGVudHJ5Ci0KLQlhbmQJazIsIGszCQkJISAgNzggRVgKLQlidC9zCTEwZgkJCSEgMTA4IEJSCi0KLQkgbW92LmwJazMsIEAoTU1VX1BURUwtTU1VX1BURUgsazApCSEgMjcgTFMKLQotCWxkdGxiCQkJCSEgMTI4IENPCi0KLQkhIEF0IGxlYXN0IG9uZSBpbnN0cnVjdGlvbiBiZXR3ZWVuIGxkdGxiIGFuZCBydGUKLQlub3AJCQkJISAxMTkgTk9QCi0KLQlydGUJCQkJISAxMjYgQ08KLQotCSBub3AJCQkJISAxMTkgTk9QCi0KLQotMTA6CW9yCWs0LCBrMgkJCSEgIDgyIEVYCi0KLQlsZHRsYgkJCQkhIDEyOCBDTwotCi0JISBBdCBsZWFzdCBvbmUgaW5zdHJ1Y3Rpb24gYmV0d2VlbiBsZHRsYiBhbmQgcnRlCi0JbW92LmwJazIsIEBrMQkJCSEgIDI3IExTCi0KLQlydGUJCQkJISAxMjYgQ08KLQotCSEgTm90ZSB3ZSBjYW5ub3QgZXhlY3V0ZSBtb3YgaGVyZSwgYmVjYXVzZSBpdCBpcyBleGVjdXRlZCBhZnRlcgotCSEgcmVzdG9yaW5nIFNTUiwgc28gd291bGQgYmUgZXhlY3V0ZWQgaW4gdXNlciBzcGFjZS4KLQkgbm9wCQkJCSEgMTE5IE5PUAotCi0KLQkuYWxpZ24gNQotCSEgT25jZSBjYWNoZSBsaW5lIGlmIHBvc3NpYmxlLi4uCi0xOgkubG9uZwlzd2FwcGVyX3BnX2RpcgotNDoJLnNob3J0CShQVFJTX1BFUl9QR0QtMSkgPDwgMgotNToJLnNob3J0CV9QQUdFX1BSRVNFTlQKLTc6CS5sb25nCV9QQUdFX0ZMQUdTX0hBUkRXQVJFX01BU0sKLTg6CS5sb25nCU1NVV9QVEVICi0jaWZkZWYgQ09VTlRfRVhDRVBUSU9OUwotOToJLmxvbmcJZXhjZXB0aW9uX2NvdW50X21pc3MKLSNlbmRpZgotCi0JISBFaXRoZXIgcGdkIG9yIHB0ZSBub3QgcHJlc2VudAotMjA6CW1vdi5sCTFmLCBrMgorCW1vdi5sCTFmLCBrMgogCW1vdi5sCTRmLCBrMwogCWJyYQloYW5kbGVfZXhjZXB0aW9uCiAJIG1vdi5sCUBrMiwgazIKQEAgLTY1MSwxNSArNDk4LDYgQEAKIAliZglpbnRlcnJ1cHRfZXhjZXB0aW9uCiAJc2hscjIJcjgKIAlzaGxyCXI4Ci0KLSNpZmRlZiBDT1VOVF9FWENFUFRJT05TCi0JbW92LmwJNWYsIHI5Ci0JYWRkCXI4LCByOQotCW1vdi5sCUByOSwgcjEwCi0JYWRkCSMxLCByMTAKLQltb3YubAlyMTAsIEByOQotI2VuZGlmCi0KIAltb3YubAk0ZiwgcjkKIAlhZGQJcjgsIHI5CiAJbW92LmwJQHI5LCByOQpAQCAtNjczLDkgKzUxMSw2IEBACiAyOgkubG9uZwkweDAwMDA4MGYwCSEgRkQ9MSwgSU1BU0s9MTUKIDM6CS5sb25nCTB4Y2ZmZmZmZmYJISBSQj0wLCBCTD0wCiA0OgkubG9uZwlleGNlcHRpb25faGFuZGxpbmdfdGFibGUKLSNpZmRlZiBDT1VOVF9FWENFUFRJT05TCi01OgkubG9uZwlleGNlcHRpb25fY291bnRfdGFibGUKLSNlbmRpZgogCiBpbnRlcnJ1cHRfZXhjZXB0aW9uOgogCW1vdi5sCTFmLCByOQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9wcm9iZS5jCmluZGV4IGU2NzA5ODguLjgyMWIwYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3Byb2JlLmMKQEAgLTUwLDQxICs1MCw0MSBAQAogCiAJYmFja190b19QMSgpOwogCi0JY3B1X2RhdGEtPmRjYWNoZS53YXlzCQk9IDQ7Ci0JY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9zaGlmdAk9IDQ7Ci0JY3B1X2RhdGEtPmRjYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7Ci0JY3B1X2RhdGEtPmRjYWNoZS5mbGFncwkJPSAwOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMJCT0gNDsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9zaGlmdAk9IDQ7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmZsYWdzCQk9IDA7CiAKIAkvKgogCSAqIDc3MDlBLzc3MjkgaGFzIDE2SyBjYWNoZSAoMjU2LWVudHJ5KSwgd2hpbGUgNzcwMiBoYXMgb25seQogCSAqIDJLKGRpcmVjdCkgNzcwMiBpcyBub3Qgc3VwcG9ydGVkICh5ZXQpCiAJICovCiAJaWYgKGRhdGEwID09IGRhdGExICYmIGRhdGEyID09IGRhdGEzKSB7CS8qIFNoYWRvdyAqLwotCQljcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyCT0gKDEgPDwgMTEpOwotCQljcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X21hc2sJPSAweDdmMDsKLQkJY3B1X2RhdGEtPmRjYWNoZS5zZXRzCQk9IDEyODsKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzA4OworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jcgk9ICgxIDw8IDExKTsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfbWFzawk9IDB4N2YwOworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzCQk9IDEyODsKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzcwODsKIAotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19NTVVfUEFHRV9BU1NPQzsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX01NVV9QQUdFX0FTU09DOwogCX0gZWxzZSB7CQkJCS8qIDc3MDlBIG9yIDc3MjkgICovCi0JCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxMik7Ci0JCWNwdV9kYXRhLT5kY2FjaGUuZW50cnlfbWFzawk9IDB4ZmYwOwotCQljcHVfZGF0YS0+ZGNhY2hlLnNldHMJCT0gMjU2OwotCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3Mjk7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheV9pbmNyCT0gKDEgPDwgMTIpOworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9tYXNrCT0gMHhmZjA7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMJCT0gMjU2OworCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzI5OwogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2KQotCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3MDY7CisJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3MDY7CiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCi0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzcxMDsKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzcxMDsKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzA1OworCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzA1OwogCiAjaWYgZGVmaW5lZChDT05GSUdfU0g3NzA1X0NBQ0hFXzMyS0IpCi0JCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxMyk7Ci0JCWNwdV9kYXRhLT5kY2FjaGUuZW50cnlfbWFzawk9IDB4MWZmMDsKLQkJY3B1X2RhdGEtPmRjYWNoZS5zZXRzCQk9IDUxMjsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxMyk7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X21hc2sJPSAweDFmZjA7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMJCT0gNTEyOwogCQljdHJsX291dGwoQ0NSX0NBQ0hFXzMyS0IsIENDUjMpOwogI2Vsc2UKIAkJY3RybF9vdXRsKENDUl9DQUNIRV8xNktCLCBDQ1IzKTsKQEAgLTk1LDggKzk1LDggQEAKIAkvKgogCSAqIFNILTMgZG9lc24ndCBoYXZlIHNlcGFyYXRlIGNhY2hlcwogCSAqLwotCWNwdV9kYXRhLT5kY2FjaGUuZmxhZ3MgfD0gU0hfQ0FDSEVfQ09NQklORUQ7Ci0JY3B1X2RhdGEtPmljYWNoZSA9IGNwdV9kYXRhLT5kY2FjaGU7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZmxhZ3MgfD0gU0hfQ0FDSEVfQ09NQklORUQ7CisJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA5LmMKaW5kZXggZmY0M2VmMi4uZGM5YjIxMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jCkBAIC01MSwzICs1MSwyNCBAQAogCQkJCSAgICBBUlJBWV9TSVpFKHNoNzcwOV9kZXZpY2VzKSk7CiB9CiBfX2luaXRjYWxsKHNoNzcwOV9kZXZpY2VzX3NldHVwKTsKKworI2RlZmluZSBJUFJ4KEEsTikgLmFkZHI9QSwgLnNoaWZ0PTAqTiotMQorI2RlZmluZSBJUFJBKE4pCUlQUngoMHhmZmZmZmVlMlVMLE4pCisjZGVmaW5lIElQUkIoTikJSVBSeCgweGZmZmZmZWU0VUwsTikKKyNkZWZpbmUgSVBSRShOKQlJUFJ4KDB4YTQwMDAwMWFVTCxOKQorCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzcwOV9pcHJfbWFwW10gPSB7CisJWzE2XQkJPSB7IElQUkEoMTUtMTIpLCAyIH0sIC8qIFRNVSBUVU5JMCAqLworCVsxN10JCT0geyBJUFJBKDExLTgpLCAgNCB9LCAvKiBUTVUgVFVOSTEgKi8KKwlbMjJdCQk9IHsgSVBSQSgzLTApLCAgIDIgfSwgLyogUlRDIENVSSAqLworCVsyMyAuLi4gMjZdCT0geyBJUFJCKDctNCksICAgMyB9LCAvKiBTQ0kgKi8KKwlbMjddCQk9IHsgSVBSQigxNS0xMiksIDIgfSwgLyogV0RUIElUSSAqLworCVs0OCAuLi4gNTFdCT0geyBJUFJFKDE1LTEyKSwgNyB9LCAvKiBETUEgKi8KKwlbNTIgLi4uIDU1XQk9IHsgSVBSRSgxMS04KSwgIDMgfSwgLyogSVJEQSAqLworCVs1NiAuLi4gNTldCT0geyBJUFJFKDctNCksICAgMyB9LCAvKiBTQ0lGICovCit9OworCit2b2lkIF9faW5pdCBpbml0X0lSUV9pcHIoKQoreworCW1ha2VfaXByX2lycShzaDc3MDlfaXByX21hcCwgQVJSQVlfU0laRShzaDc3MDlfaXByX21hcCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCmluZGV4IDkwMzFhMjIuLjlkMjhjODggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKQEAgLTEwLDExICsxMCwxMCBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiBpbnQgX19pbml0IGRldGVjdF9jcHVfYW5kX2NhY2hlX3N5c3RlbSh2b2lkKQogewpAQCAtMzYsMjAgKzM1LDIwIEBACiAJLyoKIAkgKiBTZXR1cCBzb21lIHNhbmUgU0gtNCBkZWZhdWx0cyBmb3IgdGhlIGljYWNoZQogCSAqLwotCWNwdV9kYXRhLT5pY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxMyk7Ci0JY3B1X2RhdGEtPmljYWNoZS5lbnRyeV9zaGlmdAk9IDU7Ci0JY3B1X2RhdGEtPmljYWNoZS5zZXRzCQk9IDI1NjsKLQljcHVfZGF0YS0+aWNhY2hlLndheXMJCT0gMTsKLQljcHVfZGF0YS0+aWNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKKwljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlfaW5jcgk9ICgxIDw8IDEzKTsKKwljdXJyZW50X2NwdV9kYXRhLmljYWNoZS5lbnRyeV9zaGlmdAk9IDU7CisJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUuc2V0cwkJPSAyNTY7CisJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5cwkJPSAxOworCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKIAogCS8qCiAJICogQW5kIGFnYWluIGZvciB0aGUgZGNhY2hlIC4uCiAJICovCi0JY3B1X2RhdGEtPmRjYWNoZS53YXlfaW5jcgk9ICgxIDw8IDE0KTsKLQljcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X3NoaWZ0CT0gNTsKLQljcHVfZGF0YS0+ZGNhY2hlLnNldHMJCT0gNTEyOwotCWNwdV9kYXRhLT5kY2FjaGUud2F5cwkJPSAxOwotCWNwdV9kYXRhLT5kY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheV9pbmNyCT0gKDEgPDwgMTQpOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X3NoaWZ0CT0gNTsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzCQk9IDUxMjsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDE7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOwogCiAJLyoKIAkgKiBTZXR1cCBzb21lIGdlbmVyaWMgZmxhZ3Mgd2UgY2FuIHByb2JlCkBAIC01NywxNiArNTYsMTYgQEAKIAkgKi8KIAlpZiAoKChwdnIgPj4gMTYpICYgMHhmZikgPT0gMHgxMCkgewogCQlpZiAoKGN2ciAmIDB4MDIwMDAwMDApID09IDApCi0JCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19MMl9DQUNIRTsKKwkJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19MMl9DQUNIRTsKIAkJaWYgKChjdnIgJiAweDEwMDAwMDAwKSA9PSAwKQotCQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRFNQOworCQkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0RTUDsKIAotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOworCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfTExTQzsKIAl9CiAKIAkvKiBGUFUgZGV0ZWN0aW9uIHdvcmtzIGZvciBldmVyeW9uZSAqLwogCWlmICgoY3ZyICYgMHgyMDAwMDAwMCkgPT0gMSkKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVOworCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwogCiAJLyogTWFzayBvZmYgdGhlIHVwcGVyIGNoaXAgSUQgKi8KIAlwdnIgJj0gMHhmZmZmOwpAQCAtNzcsMTUxICs3NiwxNTEgQEAKIAkgKi8KIAlzd2l0Y2ggKHB2cikgewogCWNhc2UgMHgyMDU6Ci0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc1MDsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwgQ1BVX0hBU19GUFUgfAorCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzUwOworCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwgQ1BVX0hBU19GUFUgfAogCQkJCSAgIENQVV9IQVNfUEVSRl9DT1VOVEVSOwogCQlicmVhazsKIAljYXNlIDB4MjA2OgotCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3NTBTOwotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19QMl9GTFVTSF9CVUcgfCBDUFVfSEFTX0ZQVSB8CisJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3NTBTOworCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwgQ1BVX0hBU19GUFUgfAogCQkJCSAgIENQVV9IQVNfUEVSRl9DT1VOVEVSOwogCQlicmVhazsKIAljYXNlIDB4MTEwMDoKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzUxOwotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19GUFU7CisJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3NTE7CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19GUFU7CiAJCWJyZWFrOwogCWNhc2UgMHgyMDAwOgotCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDczMTgwOwotCQljcHVfZGF0YS0+aWNhY2hlLndheXMgPSA0OwotCQljcHVfZGF0YS0+ZGNhY2hlLndheXMgPSA0OwotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOworCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3MzE4MDsKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDQ7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMgPSA0OworCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfTExTQzsKIAkJYnJlYWs7CiAJY2FzZSAweDIwMDE6CiAJY2FzZSAweDIwMDQ6Ci0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc3MDsKLQkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gNDsKLQkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzc3MDsKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDQ7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMgPSA0OwogCi0JCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfTExTQzsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfTExTQzsKIAkJYnJlYWs7CiAJY2FzZSAweDIwMDY6CiAJY2FzZSAweDIwMEE6CiAJCWlmIChwcnIgPT0gMHg2MSkKLQkJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc4MTsKKwkJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3ODE7CiAJCWVsc2UKLQkJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc4MDsKKwkJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3ODA7CiAKLQkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gNDsKLQkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDQ7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMgPSA0OwogCi0JCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUEVSRl9DT1VOVEVSIHwKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUEVSRl9DT1VOVEVSIHwKIAkJCQkgICBDUFVfSEFTX0xMU0M7CiAJCWJyZWFrOwogCWNhc2UgMHgzMDAwOgogCWNhc2UgMHgzMDAzOgogCWNhc2UgMHgzMDA5OgotCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDczNDM7Ci0JCWNwdV9kYXRhLT5pY2FjaGUud2F5cyA9IDQ7Ci0JCWNwdV9kYXRhLT5kY2FjaGUud2F5cyA9IDQ7Ci0JCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0xMU0M7CisJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDczNDM7CisJCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPSA0OworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0xMU0M7CiAJCWJyZWFrOwogCWNhc2UgMHgzMDA4OgogCQlpZiAocHJyID09IDB4YTApIHsKLQkJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzcyMjsKLQkJCWNwdV9kYXRhLT5pY2FjaGUud2F5cyA9IDQ7Ci0JCQljcHVfZGF0YS0+ZGNhY2hlLndheXMgPSA0OwotCQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfTExTQzsKKwkJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3MjI7CisJCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlzID0gNDsKKwkJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMgPSA0OworCQkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0xMU0M7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSAweDgwMDA6Ci0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NUNDBSQTsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVOworCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU1Q0MFJBOworCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwogCQlicmVhazsKIAljYXNlIDB4ODEwMDoKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU1Q0MEdYMTsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVOworCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU1Q0MEdYMTsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKIAkJYnJlYWs7CiAJY2FzZSAweDcwMDoKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g0XzUwMTsKLQkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gMjsKLQkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gMjsKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINF81MDE7CisJCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPSAyOworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gMjsKIAkJYnJlYWs7CiAJY2FzZSAweDYwMDoKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g0XzIwMjsKLQkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gMjsKLQkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gMjsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVOworCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g0XzIwMjsKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDI7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMgPSAyOworCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwogCQlicmVhazsKIAljYXNlIDB4NTAwIC4uLiAweDUwMToKIAkJc3dpdGNoIChwcnIpIHsKIAkJY2FzZSAweDEwOgotCQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzUwUjsKKwkJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3NTBSOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgxMToKLQkJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc1MVI7CisJCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzUxUjsKIAkJCWJyZWFrOwogCQljYXNlIDB4NTAgLi4uIDB4NWY6Ci0JCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3NjA7CisJCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzYwOwogCQkJYnJlYWs7CiAJCX0KIAotCQljcHVfZGF0YS0+aWNhY2hlLndheXMgPSAyOwotCQljcHVfZGF0YS0+ZGNhY2hlLndheXMgPSAyOworCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlzID0gMjsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDI7CiAKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVOworCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwogCiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NIX05PTkU7CisJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSF9OT05FOwogCQlicmVhazsKIAl9CiAKICNpZmRlZiBDT05GSUdfU0hfRElSRUNUX01BUFBFRAotCWNwdV9kYXRhLT5pY2FjaGUud2F5cyA9IDE7Ci0JY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gMTsKKwljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlzID0gMTsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gMTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0NQVV9IQVNfUFRFQQotCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX1BURUE7CisJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX1BURUE7CiAjZW5kaWYKIAogCS8qCiAJICogT24gYW55dGhpbmcgdGhhdCdzIG5vdCBhIGRpcmVjdC1tYXBwZWQgY2FjaGUsIGxvb2sgdG8gdGhlIENWUgogCSAqIGZvciBJL0QtY2FjaGUgc3BlY2lmaWNzLgogCSAqLwotCWlmIChjcHVfZGF0YS0+aWNhY2hlLndheXMgPiAxKSB7CisJaWYgKGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPiAxKSB7CiAJCXNpemUgPSBzaXplc1soY3ZyID4+IDIwKSAmIDB4Zl07Ci0JCWNwdV9kYXRhLT5pY2FjaGUud2F5X2luY3IJPSAoc2l6ZSA+PiAxKTsKLQkJY3B1X2RhdGEtPmljYWNoZS5zZXRzCQk9IChzaXplID4+IDYpOworCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlfaW5jcgk9IChzaXplID4+IDEpOworCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS5zZXRzCQk9IChzaXplID4+IDYpOwogCiAJfQogCiAJLyogU2V0dXAgdGhlIHJlc3Qgb2YgdGhlIEktY2FjaGUgaW5mbyAqLwotCWNwdV9kYXRhLT5pY2FjaGUuZW50cnlfbWFzayA9IGNwdV9kYXRhLT5pY2FjaGUud2F5X2luY3IgLQotCQkJCSAgICAgIGNwdV9kYXRhLT5pY2FjaGUubGluZXN6OworCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLmVudHJ5X21hc2sgPSBjdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlfaW5jciAtCisJCQkJICAgICAgY3VycmVudF9jcHVfZGF0YS5pY2FjaGUubGluZXN6OwogCi0JY3B1X2RhdGEtPmljYWNoZS53YXlfc2l6ZSA9IGNwdV9kYXRhLT5pY2FjaGUuc2V0cyAqCi0JCQkJICAgIGNwdV9kYXRhLT5pY2FjaGUubGluZXN6OworCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheV9zaXplID0gY3VycmVudF9jcHVfZGF0YS5pY2FjaGUuc2V0cyAqCisJCQkJICAgIGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLmxpbmVzejsKIAogCS8qIEFuZCB0aGUgcmVzdCBvZiB0aGUgRC1jYWNoZSAqLwotCWlmIChjcHVfZGF0YS0+ZGNhY2hlLndheXMgPiAxKSB7CisJaWYgKGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMgPiAxKSB7CiAJCXNpemUgPSBzaXplc1soY3ZyID4+IDE2KSAmIDB4Zl07Ci0JCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoc2l6ZSA+PiAxKTsKLQkJY3B1X2RhdGEtPmRjYWNoZS5zZXRzCQk9IChzaXplID4+IDYpOworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jcgk9IChzaXplID4+IDEpOworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzCQk9IChzaXplID4+IDYpOwogCX0KIAotCWNwdV9kYXRhLT5kY2FjaGUuZW50cnlfbWFzayA9IGNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IgLQotCQkJCSAgICAgIGNwdV9kYXRhLT5kY2FjaGUubGluZXN6OworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X21hc2sgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jciAtCisJCQkJICAgICAgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6OwogCi0JY3B1X2RhdGEtPmRjYWNoZS53YXlfc2l6ZSA9IGNwdV9kYXRhLT5kY2FjaGUuc2V0cyAqCi0JCQkJICAgIGNwdV9kYXRhLT5kY2FjaGUubGluZXN6OworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheV9zaXplID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0cyAqCisJCQkJICAgIGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmxpbmVzejsKIAogCS8qCiAJICogU2V0dXAgdGhlIEwyIGNhY2hlIGRlc2MKIAkgKgogCSAqIFNILTRBJ3MgaGF2ZSBhbiBvcHRpb25hbCBQSVBUIEwyLgogCSAqLwotCWlmIChjcHVfZGF0YS0+ZmxhZ3MgJiBDUFVfSEFTX0wyX0NBQ0hFKSB7CisJaWYgKGN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgJiBDUFVfSEFTX0wyX0NBQ0hFKSB7CiAJCS8qCiAJCSAqIFNpemUgY2FsY3VsYXRpb24gaXMgbXVjaCBtb3JlIHNlbnNpYmxlCiAJCSAqIHRoYW4gaXQgaXMgZm9yIHRoZSBMMS4KQEAgLTIzMiwxNiArMjMxLDIyIEBACiAKIAkJQlVHX09OKCFzaXplKTsKIAotCQljcHVfZGF0YS0+c2NhY2hlLndheV9pbmNyCT0gKDEgPDwgMTYpOwotCQljcHVfZGF0YS0+c2NhY2hlLmVudHJ5X3NoaWZ0CT0gNTsKLQkJY3B1X2RhdGEtPnNjYWNoZS53YXlzCQk9IDQ7Ci0JCWNwdV9kYXRhLT5zY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOwotCQljcHVfZGF0YS0+c2NhY2hlLmVudHJ5X21hc2sJPQotCQkJKGNwdV9kYXRhLT5zY2FjaGUud2F5X2luY3IgLSBjcHVfZGF0YS0+c2NhY2hlLmxpbmVzeik7Ci0JCWNwdV9kYXRhLT5zY2FjaGUuc2V0cwkJPSBzaXplIC8KLQkJCShjcHVfZGF0YS0+c2NhY2hlLmxpbmVzeiAqIGNwdV9kYXRhLT5zY2FjaGUud2F5cyk7Ci0JCWNwdV9kYXRhLT5zY2FjaGUud2F5X3NpemUJPQotCQkJKGNwdV9kYXRhLT5zY2FjaGUuc2V0cyAqIGNwdV9kYXRhLT5zY2FjaGUubGluZXN6KTsKKwkJY3VycmVudF9jcHVfZGF0YS5zY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxNik7CisJCWN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLmVudHJ5X3NoaWZ0CT0gNTsKKwkJY3VycmVudF9jcHVfZGF0YS5zY2FjaGUud2F5cwkJPSA0OworCQljdXJyZW50X2NwdV9kYXRhLnNjYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7CisKKwkJY3VycmVudF9jcHVfZGF0YS5zY2FjaGUuZW50cnlfbWFzawk9CisJCQkoY3VycmVudF9jcHVfZGF0YS5zY2FjaGUud2F5X2luY3IgLQorCQkJIGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLmxpbmVzeik7CisKKwkJY3VycmVudF9jcHVfZGF0YS5zY2FjaGUuc2V0cwkJPSBzaXplIC8KKwkJCShjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS5saW5lc3ogKgorCQkJIGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheXMpOworCisJCWN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheV9zaXplCT0KKwkJCShjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS5zZXRzICoKKwkJCSBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS5saW5lc3opOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKaW5kZXggY2JhYzI3Ni4uNmY4ZjQ1OCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCkBAIC00NiwxMSArNDYsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJeworI2lmbmRlZiBDT05GSUdfU0hfUlRTNzc1MVIyRAogCQkubWFwYmFzZQk9IDB4ZmZlMDAwMDAsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLnR5cGUJCT0gUE9SVF9TQ0ksCiAJCS5pcnFzCQk9IHsgMjMsIDI0LCAyNSwgMCB9LAogCX0sIHsKKyNlbmRpZgogCQkubWFwYmFzZQk9IDB4ZmZlODAwMDAsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLnR5cGUJCT0gUE9SVF9TQ0lGLApAQCAtMTAxLDcgKzEwMyw3IEBACiAJeyAzNSwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFMSAqLwogCXsgMzYsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTIgKi8KIAl7IDM3LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEUzICovCi0JeyAyOCwgMiwgIDgsIDcgfSwgLyogRE1BQyBETUFFICovCisJeyAzOCwgMiwgIDgsIDcgfSwgLyogRE1BQyBETUFFICovCiB9OwogCiBzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzc1MV9pcHJfbWFwW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwppbmRleCAwN2U1Mzc3Li5iN2M3MDI4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKQEAgLTUyLDE3ICs1MiwxMSBAQAogfQogX19pbml0Y2FsbChzaDc3NjBfZGV2aWNlc19zZXR1cCk7CiAKLS8qCi0gKiBTSDc3NjAgSU5UQzItU3R5bGUgaW50ZXJydXB0cywgdmVjdG9ycyBJUlE0OC0xMTEgSU5URVZUIDB4ODAwLTB4RkUwCi0gKi8KIHN0YXRpYyBzdHJ1Y3QgaW50YzJfZGF0YSBpbnRjMl9pcnFfdGFibGVbXSA9IHsKLQkvKiBJTlRQUklPMCB8IElOVE1TSzAgKi8KIAl7NDgsICAwLCAyOCwgMCwgMzEsICAzfSwJLyogSVJRIDQgKi8KIAl7NDksICAwLCAyNCwgMCwgMzAsICAzfSwJLyogSVJRIDMgKi8KIAl7NTAsICAwLCAyMCwgMCwgMjksICAzfSwJLyogSVJRIDIgKi8KIAl7NTEsICAwLCAxNiwgMCwgMjgsICAzfSwJLyogSVJRIDEgKi8KLQkvKiA1Mi01NSAoSU5URVZUIDB4ODgwLTB4OEUwKSB1bnVzZWQvcmVzZXJ2ZWQgKi8KLQkvKiBJTlRQUklPNCB8IElOVE1TSzAgKi8KIAl7NTYsICA0LCAyOCwgMCwgMjUsICAzfSwJLyogSENBTjJfQ0hBTjAgKi8KIAl7NTcsICA0LCAyNCwgMCwgMjQsICAzfSwJLyogSENBTjJfQ0hBTjEgKi8KIAl7NTgsICA0LCAyMCwgMCwgMjMsICAzfSwJLyogSTJTX0NIQU4wICAgKi8KQEAgLTcxLDE4ICs2NSwxNSBAQAogCXs2MSwgIDQsICA4LCAwLCAyMCwgIDN9LAkvKiBBQzk3X0NIQU4xICAqLwogCXs2MiwgIDQsICA0LCAwLCAxOSwgIDN9LAkvKiBJMkNfQ0hBTjAgICAqLwogCXs2MywgIDQsICAwLCAwLCAxOCwgIDN9LAkvKiBJMkNfQ0hBTjEgICAqLwotCS8qIElOVFBSSU84IHwgSU5UTVNLMCAqLwogCXs1MiwgIDgsIDE2LCAwLCAxMSwgIDN9LAkvKiBTQ0lGMF9FUklfSVJRICovCiAJezUzLCAgOCwgMTYsIDAsIDEwLCAgM30sCS8qIFNDSUYwX1JYSV9JUlEgKi8KIAl7NTQsICA4LCAxNiwgMCwgIDksICAzfSwJLyogU0NJRjBfQlJJX0lSUSAqLwogCXs1NSwgIDgsIDE2LCAwLCAgOCwgIDN9LAkvKiBTQ0lGMF9UWElfSVJRICovCiAJezY0LCAgOCwgMjgsIDAsIDE3LCAgM30sCS8qIFVTQkhJX0lSUSAqLwogCXs2NSwgIDgsIDI0LCAwLCAxNiwgIDN9LAkvKiBMQ0RDICAgICAgKi8KLQkvKiA2NiwgNjcgdW51c2VkICovCiAJezY4LCAgOCwgMjAsIDAsIDE0LCAxM30sCS8qIERNQUJSR0kwX0lSUSAqLwogCXs2OSwgIDgsIDIwLCAwLCAxMywgMTN9LAkvKiBETUFCUkdJMV9JUlEgKi8KIAl7NzAsICA4LCAyMCwgMCwgMTIsIDEzfSwJLyogRE1BQlJHSTJfSVJRICovCi0JLyogNzEgdW51c2VkICovCiAJezcyLCAgOCwgMTIsIDAsICA3LCAgM30sCS8qIFNDSUYxX0VSSV9JUlEgKi8KIAl7NzMsICA4LCAxMiwgMCwgIDYsICAzfSwJLyogU0NJRjFfUlhJX0lSUSAqLwogCXs3NCwgIDgsIDEyLCAwLCAgNSwgIDN9LAkvKiBTQ0lGMV9CUklfSVJRICovCkBAIC05MSwyNiArODIsNzEgQEAKIAl7NzcsICA4LCAgOCwgMCwgIDIsICAzfSwJLyogU0NJRjJfUlhJX0lSUSAqLwogCXs3OCwgIDgsICA4LCAwLCAgMSwgIDN9LAkvKiBTQ0lGMl9CUklfSVJRICovCiAJezc5LCAgOCwgIDgsIDAsICAwLCAgM30sCS8qIFNDSUYyX1RYSV9JUlEgKi8KLQkvKiAgICAgICAgICB8IElOVE1TSzQgKi8KIAl7ODAsICA4LCAgNCwgNCwgMjMsICAzfSwJLyogU0lNX0VSSSAqLwogCXs4MSwgIDgsICA0LCA0LCAyMiwgIDN9LAkvKiBTSU1fUlhJICovCiAJezgyLCAgOCwgIDQsIDQsIDIxLCAgM30sCS8qIFNJTV9UWEkgKi8KIAl7ODMsICA4LCAgNCwgNCwgMjAsICAzfSwJLyogU0lNX1RFSSAqLwogCXs4NCwgIDgsICAwLCA0LCAxOSwgIDN9LAkvKiBIU1BJSSAqLwotCS8qIElOVFBSSU9DIHwgSU5UTVNLNCAqLwotCS8qIDg1LTg3IHVudXNlZC9yZXNlcnZlZCAqLwogCXs4OCwgMTIsIDIwLCA0LCAxOCwgIDN9LAkvKiBNTUNJMCAqLwogCXs4OSwgMTIsIDIwLCA0LCAxNywgIDN9LAkvKiBNTUNJMSAqLwogCXs5MCwgMTIsIDIwLCA0LCAxNiwgIDN9LAkvKiBNTUNJMiAqLwogCXs5MSwgMTIsIDIwLCA0LCAxNSwgIDN9LAkvKiBNTUNJMyAqLwotCXs5MiwgMTIsIDEyLCA0LCAgNiwgIDN9LAkvKiBNRkkgKHVuc3VyZSwgYnVnPyBpbiBteSA3NzYwIG1hbnVhbCovCi0JLyogOTMtMTA3IHJlc2VydmVkL3VuZG9jdW1lbnRlZCAqLworCXs5MiwgMTIsIDEyLCA0LCAgNiwgIDN9LAkvKiBNRkkgKi8KIAl7MTA4LDEyLCAgNCwgNCwgIDEsICAzfSwJLyogQURDICAqLwogCXsxMDksMTIsICAwLCA0LCAgMCwgIDN9LAkvKiBDTVRJICovCi0JLyogMTEwLTExMSByZXNlcnZlZC91bnVzZWQgKi8KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NzYwX2lwcl9tYXBbXSA9IHsKKwkvKiBJUlEsIElQUi1pZHgsIHNoaWZ0LCBwcmlvcml0eSAqLworCXsgMTYsIDAsIDEyLCAyIH0sIC8qIFRNVTAgVFVOSSovCisJeyAxNywgMCwgIDgsIDIgfSwgLyogVE1VMSBUVU5JICovCisJeyAxOCwgMCwgIDQsIDIgfSwgLyogVE1VMiBUVU5JICovCisJeyAxOSwgMCwgIDQsIDIgfSwgLyogVE1VMiBUSVBDSSAqLworCXsgMjcsIDEsIDEyLCAyIH0sIC8qIFdEVCBJVEkgKi8KKwl7IDI4LCAxLCAgOCwgMiB9LCAvKiBSRUYgUkNNSSAqLworCXsgMjksIDEsICA4LCAyIH0sIC8qIFJFRiBST1ZJICovCisJeyAzMiwgMiwgIDAsIDcgfSwgLyogSFVESSAqLworCXsgMzMsIDIsIDEyLCA3IH0sIC8qIEdQSU9JICovCisJeyAzNCwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFMCAqLworCXsgMzUsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTEgKi8KKwl7IDM2LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEUyICovCisJeyAzNywgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFMyAqLworCXsgMzgsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1BRSAqLworCXsgNDQsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTQgKi8KKwl7IDQ1LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEU1ICovCisJeyA0NiwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFNiAqLworCXsgNDcsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTcgKi8KKy8qIHRoZXNlIGhlcmUgYXJlIG9ubHkgdmFsaWQgaWYgSU5UQ19JQ1IgYml0IDcgaXMgc2V0IHRvIDEhCisgKiBYWFg6IG1heWJlIENPTkZJR19TSF9JUkxNT0RFIHN5bWJvbD8gU0g3NzUxIGNvdWxkIHVzZSBpdCB0b28gKi8KKyNpZiAwCisJeyAgMiwgMywgMTIsIDMgfSwgLyogSVJMMCAqLworCXsgIDUsIDMsICA4LCAzIH0sIC8qIElSTDEgKi8KKwl7ICA4LCAzLCAgNCwgMyB9LCAvKiBJUkwyICovCisJeyAxMSwgMywgIDAsIDMgfSwgLyogSVJMMyAqLworI2VuZGlmCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpcHJfb2Zmc2V0c1tdID0geworCTB4ZmZkMDAwMDRVTCwJLyogMDogSVBSQSAqLworCTB4ZmZkMDAwMDhVTCwJLyogMTogSVBSQiAqLworCTB4ZmZkMDAwMGNVTCwJLyogMjogSVBSQyAqLworCTB4ZmZkMDAwMTBVTCwJLyogMzogSVBSRCAqLworfTsKKworLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwordW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQoreworCWlmIChpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpCisJCXJldHVybiAwOworCXJldHVybiBpcHJfb2Zmc2V0c1tpZHhdOworfQorCiB2b2lkIF9faW5pdCBpbml0X0lSUV9pbnRjMih2b2lkKQogewogCW1ha2VfaW50YzJfaXJxKGludGMyX2lycV90YWJsZSwgQVJSQVlfU0laRShpbnRjMl9pcnFfdGFibGUpKTsKIH0KKwordm9pZCBfX2luaXQgIGluaXRfSVJRX2lwcih2b2lkKQoreworCW1ha2VfaXByX2lycShzaDc3NjBfaXByX21hcCwgQVJSQVlfU0laRShzaDc3NjBfaXByX21hcCkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvZGVidWd0cmFwcy5TIGIvYXJjaC9zaC9rZXJuZWwvZGVidWd0cmFwcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYjY2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9kZWJ1Z3RyYXBzLlMKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL2RlYnVndHJhcHMuUworICoKKyAqIERlYnVnIHRyYXAganVtcCB0YWJsZXMgZm9yIFN1cGVySAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3N5cy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworI2lmICFkZWZpbmVkKENPTkZJR19TSF9LR0RCKQorI2RlZmluZSBrZ2RiX2hhbmRsZV9leGNlcHRpb24JZGVidWdfdHJhcF9oYW5kbGVyCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKQorI2RlZmluZSBzaF9iaW9zX2hhbmRsZXIJCWRlYnVnX3RyYXBfaGFuZGxlcgorI2VuZGlmCisKKwkuZGF0YQorCitFTlRSWShkZWJ1Z190cmFwX3RhYmxlKQorCS5sb25nIGRlYnVnX3RyYXBfaGFuZGxlcgkvKiAweDMwICovCisJLmxvbmcgZGVidWdfdHJhcF9oYW5kbGVyCS8qIDB4MzEgKi8KKwkubG9uZyBkZWJ1Z190cmFwX2hhbmRsZXIJLyogMHgzMiAqLworCS5sb25nIGRlYnVnX3RyYXBfaGFuZGxlcgkvKiAweDMzICovCisJLmxvbmcgZGVidWdfdHJhcF9oYW5kbGVyCS8qIDB4MzQgKi8KKwkubG9uZyBkZWJ1Z190cmFwX2hhbmRsZXIJLyogMHgzNSAqLworCS5sb25nIGRlYnVnX3RyYXBfaGFuZGxlcgkvKiAweDM2ICovCisJLmxvbmcgZGVidWdfdHJhcF9oYW5kbGVyCS8qIDB4MzcgKi8KKwkubG9uZyBkZWJ1Z190cmFwX2hhbmRsZXIJLyogMHgzOCAqLworCS5sb25nIGRlYnVnX3RyYXBfaGFuZGxlcgkvKiAweDM5ICovCisJLmxvbmcgZGVidWdfdHJhcF9oYW5kbGVyCS8qIDB4M2EgKi8KKwkubG9uZyBkZWJ1Z190cmFwX2hhbmRsZXIJLyogMHgzYiAqLworCS5sb25nIGtnZGJfaGFuZGxlX2V4Y2VwdGlvbgkvKiAweDNjICovCisJLmxvbmcgZGVidWdfdHJhcF9oYW5kbGVyCS8qIDB4M2QgKi8KKwkubG9uZyBidWdfdHJhcF9oYW5kbGVyCQkvKiAweDNlICovCisJLmxvbmcgc2hfYmlvc19oYW5kbGVyCQkvKiAweDNmICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gvc2gva2VybmVsL2Vhcmx5X3ByaW50ay5jCmluZGV4IDU2MGI5MWMuLjkwNDhjMDMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2Vhcmx5X3ByaW50ay5jCisrKyBiL2FyY2gvc2gva2VybmVsL2Vhcmx5X3ByaW50ay5jCkBAIC0xMDYsMTIgKzEwNiwzMiBAQAogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpICYmICFkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKQorI2RlZmluZSBERUZBVUxUX0JBVUQgMTE1MjAwCiAvKgogICogU2ltcGxlIFNDSUYgaW5pdCwgcHJpbWFyaWx5IGFpbWVkIGF0IFNINzc1MCBhbmQgb3RoZXIgc2ltaWxhciBTSC00CiAgKiBkZXZpY2VzIHRoYXQgYXJlbid0IHVzaW5nIHNoLWlwbCtnLgogICovCi1zdGF0aWMgdm9pZCBzY2lmX3NlcmNvbl9pbml0KGludCBiYXVkKQorc3RhdGljIHZvaWQgc2NpZl9zZXJjb25faW5pdChjaGFyICpzKQogeworCXVuc2lnbmVkIGJhdWQgPSBERUZBVUxUX0JBVUQ7CisJY2hhciAqZTsKKworCWlmICgqcyA9PSAnLCcpCisJCSsrczsKKworCWlmICgqcykgeworCQkvKiBpZ25vcmUgaW9wb3J0L2RldmljZSBuYW1lICovCisJCXMgKz0gc3RyY3NwbihzLCAiLCIpOworCQlpZiAoKnMgPT0gJywnKQorCQkJcysrOworCX0KKworCWlmICgqcykgeworCQliYXVkID0gc2ltcGxlX3N0cnRvdWwocywgJmUsIDApOworCQlpZiAoYmF1ZCA9PSAwIHx8IHMgPT0gZSkKKwkJCWJhdWQgPSBERUZBVUxUX0JBVUQ7CisJfQorCiAJY3RybF9vdXR3KDAsIHNjaWZfcG9ydC5tYXBiYXNlICsgOCk7CiAJY3RybF9vdXR3KDAsIHNjaWZfcG9ydC5tYXBiYXNlKTsKIApAQCAtMTY3LDcgKzE4Nyw3IEBACiAJCWVhcmx5X2NvbnNvbGUgPSAmc2NpZl9jb25zb2xlOwogCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NINCkgJiYgIWRlZmluZWQoQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MpCi0JCXNjaWZfc2VyY29uX2luaXQoMTE1MjAwKTsKKwkJc2NpZl9zZXJjb25faW5pdChidWYgKyA2KTsKICNlbmRpZgogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvZW50cnktY29tbW9uLlMgYi9hcmNoL3NoL2tlcm5lbC9lbnRyeS1jb21tb24uUwppbmRleCBmYzI3OWFlLi5hYjRlYmI4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9lbnRyeS1jb21tb24uUworKysgYi9hcmNoL3NoL2tlcm5lbC9lbnRyeS1jb21tb24uUwpAQCAtNTQsNzkgKzU0LDI0IEBACiAjICBkZWZpbmUgcmVzdW1lX2tlcm5lbAkJX19yZXN0b3JlX2FsbAogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKSB8fCBkZWZpbmVkKENPTkZJR19TSF9LR0RCKQotISBIYW5kbGUga2VybmVsIGRlYnVnIGlmIGVpdGhlciBrZ2RiIChTVykgb3IgZ2RiLXN0dWIgKEZXKSBpcyBwcmVzZW50LgotISBJZiBib3RoIGFyZSBjb25maWd1cmVkLCBoYW5kbGUgdGhlIGRlYnVnIHRyYXBzIChicmVha3BvaW50cykgaW4gU1csCi0hIGJ1dCBzdGlsbCBhbGxvdyBCSU9TIHRyYXBzIHRvIEZXLgotCi0JLmFsaWduCTIKLWRlYnVnX2tlcm5lbDoKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKSAmJiBkZWZpbmVkKENPTkZJR19TSF9LR0RCKQotCS8qIEZvcmNlIEJJT1MgY2FsbCB0byBGVyAoZGVidWdfdHJhcCBwdXQgVFJBIGluIHI4KSAqLwotCW1vdglyOCxyMAotCXNobHIyCXIwCi0JY21wL2VxCSMweDNmLHIwCi0JYnQJZGVidWdfa2VybmVsX2Z3Ci0jZW5kaWYgLyogQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgJiYgQ09ORklHX1NIX0tHREIgKi8KLQotZGVidWdfZW50ZXI6CQkKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9LR0RCKQotCS8qIEp1bXAgdG8ga2dkYiwgcGFzcyBzdGFja2VkIHJlZ3MgYXMgYXJnICovCi1kZWJ1Z19rZXJuZWxfc3c6Ci0JbW92LmwJM2YsIHIwCi0Jam1wCUByMAotCSBtb3YJcjE1LCByNAotCS5hbGlnbgkyCi0zOgkubG9uZwlrZ2RiX2hhbmRsZV9leGNlcHRpb24KLSNlbmRpZiAvKiBDT05GSUdfU0hfS0dEQiAqLwotI2lmZGVmIENPTkZJR19TSF9TVEFOREFSRF9CSU9TCi0JYnJhCWRlYnVnX2tlcm5lbF9mdwotCSBub3AKLSNlbmRpZgotI2VuZGlmIC8qIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIHx8IENPTkZJR19TSF9LR0RCICovCi0KLQkuYWxpZ24JMgotZGVidWdfdHJhcDoJCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykgfHwgZGVmaW5lZChDT05GSUdfU0hfS0dEQikKLQltb3YJcjgsIHIwCi0Jc2hscjIJcjAKLQljbXAvZXEJIzB4M2YsIHIwCQkhIHNoX2Jpb3MoKSB0cmFwCi0JYmYJMWYKLSNpZmRlZiBDT05GSUdfU0hfS0dEQgotCWNtcC9lcQkjMHhmZiwgcjAJCSEgWFhYOiBLR0RCIHRyYXAsIGZpeCBmb3IgU0gtMi4KLQliZgkxZgotI2VuZGlmCi0JbW92CSNPRkZfU1IsIHIwCi0JbW92LmwJQChyMCxyMTUpLCByMAkJISBnZXQgc3RhdHVzIHJlZ2lzdGVyCi0Jc2hsbAlyMAotCXNobGwJcjAJCQkhIGtlcm5lbCBzcGFjZT8KLQlidC9zCWRlYnVnX2tlcm5lbAotMToKLSNlbmRpZgotCSBtb3YubAlAcjE1LCByMAkJISBSZXN0b3JlIFIwIHZhbHVlCi0JbW92LmwJMWYsIHI4Ci0Jam1wCUByOAotCSBub3AKIAogCS5hbGlnbgkyCiBFTlRSWShleGNlcHRpb25fZXJyb3IpCiAJIQogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwotCW1vdi5sCTNmLCByMAorCW1vdi5sCTJmLCByMAogCWpzcglAcjAKIAkgbm9wCiAjZW5kaWYKIAlzdGkKLQltb3YubAkyZiwgcjAKKwltb3YubAkxZiwgcjAKIAlqbXAJQHIwCiAJIG5vcAogCi0hCiAJLmFsaWduCTIKLTE6CS5sb25nCWJyZWFrX3BvaW50X3RyYXBfc29mdHdhcmUKLTI6CS5sb25nCWRvX2V4Y2VwdGlvbl9lcnJvcgorMToJLmxvbmcJZG9fZXhjZXB0aW9uX2Vycm9yCiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCi0zOgkubG9uZwl0cmFjZV9oYXJkaXJxc19vbgorMjoJLmxvbmcJdHJhY2VfaGFyZGlycXNfb24KICNlbmRpZgogCiAJLmFsaWduCTIKQEAgLTMzMSwxNiArMjc2LDMxIEBACiAxOgkubG9uZwlyZXN0b3JlX2FsbAogCiAJLmFsaWduCTIKLW5vdF9zeXNjYWxsX3RyYToJCi0JYnJhCWRlYnVnX3RyYXAKLQkgbm9wCi0KLQkuYWxpZ24JMgogc3lzY2FsbF9iYWRzeXM6CQkJISBCYWQgc3lzY2FsbCBudW1iZXIKIAltb3YJIy1FTk9TWVMsIHIwCiAJYnJhCXJlc3VtZV91c2Vyc3BhY2UKIAkgbW92LmwJcjAsIEAoT0ZGX1IwLHIxNSkJISBSZXR1cm4gdmFsdWUKLQkKKworLyoKKyAqIFRoZSBtYWluIGRlYnVnIHRyYXAgaGFuZGxlci4KKyAqCisgKiByOD1UUkEgKG5vdCB0aGUgdHJhcCBudW1iZXIhKQorICoKKyAqIE5vdGU6IFRoaXMgYXNzdW1lcyB0aGF0IHRoZSB0cmFwYSB2YWx1ZSBpcyBsZWZ0IGluIGl0cyBvcmlnaW5hbAorICogZm9ybSAod2l0aG91dCB0aGUgc2hscjIgc2hpZnQpIHNvIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIGp1bXAKKyAqIGNhbGwgdGFibGUgb2Zmc2V0IHJlbWFpbnMgYSBzaW1wbGUgaW4gcGxhY2UgbWFzay4KKyAqLworZGVidWdfdHJhcDoKKwltb3YJcjgsIHIwCisJYW5kCSMoMHhmIDw8IDIpLCByMAorCW1vdi5sCTFmLCByOAorCWFkZAlyMCwgcjgKKwltb3YubAlAcjgsIHI4CisJam1wCUByOAorCSBub3AKKworCS5hbGlnbgkyCisxOgkubG9uZwlkZWJ1Z190cmFwX3RhYmxlCiAKIC8qCiAgKiBTeXNjYWxsIGludGVyZmFjZToKQEAgLTM0OCwxNyArMzA4LDE5IEBACiAgKglTeXNjYWxsICM6IFIzCiAgKglBcmd1bWVudHMgIzAgdG8gIzM6IFI0LS1SNwogICoJQXJndW1lbnRzICM0IHRvICM2OiBSMCwgUjEsIFIyCi0gKglUUkE6IChudW1iZXIgb2YgYXJndW1lbnRzICsgMHgxMCkgeCA0CisgKglUUkE6IChudW1iZXIgb2YgYXJndW1lbnRzICsgQUJJIHJldmlzaW9uKSB4IDQKICAqCiAgKiBUaGlzIGNvZGUgYWxzbyBoYW5kbGVzIGRlbGVnYXRpbmcgb3RoZXIgdHJhcHMgdG8gdGhlIEJJT1MvZ2RiIHN0dWIKICAqIGFjY29yZGluZyB0bzoKICAqCiAgKiBUcmFwIG51bWJlcgotICogKFRSQT4+MikgCSAgICBQdXJwb3NlCi0gKiAtLS0tLS0tLSAJICAgIC0tLS0tLS0KLSAqIDB4MC0weGYgIAkgICAgb2xkIHN5c2NhbGwgQUJJCi0gKiAweDEwLTB4MWYgIAkgICAgbmV3IHN5c2NhbGwgQUJJCi0gKiAweDIwLTB4ZmYgIAkgICAgZGVsZWdhdGVkIHRocm91Z2ggZGVidWdfdHJhcCB0byBCSU9TL2dkYiBzdHViLgorICogKFRSQT4+MikJUHVycG9zZQorICogLS0tLS0tLS0JLS0tLS0tLQorICogMHgwMC0weDBmCW9yaWdpbmFsIFNILTMvNCBzeXNjYWxsIEFCSSAobm90IGluIGdlbmVyYWwgdXNlKS4KKyAqIDB4MTAtMHgxZglnZW5lcmFsIFNILTMvNCBzeXNjYWxsIEFCSS4KKyAqIDB4MjAtMHgyZglzeXNjYWxsIEFCSSBmb3IgU0gtMiBwYXJ0cy4KKyAqIDB4MzAtMHgzZglkZWJ1ZyB0cmFwcyB1c2VkIGJ5IHRoZSBrZXJuZWwuCisgKiAweDQwLTB4ZmYJTm90IHN1cHBvcnRlZCBieSBhbGwgcGFydHMsIHNvIGxlZnQgdW5oYW5kbGVkLgogICoKICAqIE5vdGU6IFdoZW4gd2UncmUgZmlyc3QgY2FsbGVkLCB0aGUgVFJBIHZhbHVlIG11c3QgYmUgc2hpZnRlZAogICogcmlnaHQgMiBiaXRzIGluIG9yZGVyIHRvIGdldCB0aGUgdmFsdWUgdGhhdCB3YXMgdXNlZCBhcyB0aGUgInRyYXBhIgpAQCAtMzc1LDE3ICszMzcsMjIgQEAKIAkgbm9wCiAJLmFsaWduCTIKIDE6CS5sb25nCXNjaGVkdWxlX3RhaWwKLQkhCisKKy8qCisgKiBUaGUgcG9vcmx5IG5hbWVkIG1haW4gdHJhcGEgZGVjb2RlIGFuZCBkaXNwYXRjaCByb3V0aW5lLCBmb3IKKyAqIHN5c3RlbSBjYWxscyBhbmQgZGVidWcgdHJhcHMgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGp1bXAgdGFibGVzLgorICovCiBFTlRSWShzeXN0ZW1fY2FsbCkKICNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NIMikKIAltb3YubAkxZiwgcjkKIAltb3YubAlAcjksIHI4CQkhIFJlYWQgZnJvbSBUUkEgKFRyYXAgQWRkcmVzcykgUmVnaXN0ZXIKICNlbmRpZgotCSEKLQkhIElzIHRoZSB0cmFwIGFyZ3VtZW50ID49IDB4MjA/IChUUkEgd2lsbCBiZSA+PSAweDgwKQotCW1vdgkjMHg3ZiwgcjkKKwkvKgorCSAqIENoZWNrIHRoZSB0cmFwIHR5cGUKKwkgKi8KKwltb3YJIygoMHgyMCA8PCAyKSAtIDEpLCByOQogCWNtcC9oaQlyOSwgcjgKLQlidC9zCW5vdF9zeXNjYWxsX3RyYQorCWJ0L3MJZGVidWdfdHJhcAkJISBpdCdzIGEgZGVidWcgdHJhcC4uCiAJIG1vdgkjT0ZGX1RSQSwgcjkKIAlhZGQJcjE1LCByOQogCW1vdi5sCXI4LCBAcjkJCQkhIHNldCBUUkEgdmFsdWUgdG8gdHJhCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9pb19nZW5lcmljLmMgYi9hcmNoL3NoL2tlcm5lbC9pb19nZW5lcmljLmMKaW5kZXggMjhlYzc0OC4uNjY2MjZjMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvaW9fZ2VuZXJpYy5jCisrKyBiL2FyY2gvc2gva2VybmVsL2lvX2dlbmVyaWMuYwpAQCAtMSw5ICsxLDggQEAKLS8qICRJZDogaW9fZ2VuZXJpYy5jLHYgMS4yIDIwMDMvMDUvMDQgMTk6Mjk6NTMgbGV0aGFsIEV4cCAkCi0gKgotICogbGludXgvYXJjaC9zaC9rZXJuZWwvaW9fZ2VuZXJpYy5jCisvKgorICogYXJjaC9zaC9rZXJuZWwvaW9fZ2VuZXJpYy5jCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAwICBOaWliZSBZdXRha2EKLSAqIENvcHlyaWdodCAoQykgMjAwNSAgUGF1bCBNdW5kdAorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwNyBQYXVsIE11bmR0CiAgKgogICogR2VuZXJpYyBJL08gcm91dGluZS4gVGhlc2UgY2FuIGJlIHVzZWQgd2hlcmUgYSBtYWNoaW5lIHNwZWNpZmljIHZlcnNpb24KICAqIGlzIG5vdCByZXF1aXJlZC4KQEAgLTEzLDggKzEyLDkgQEAKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAogI2lmZGVmIENPTkZJR19DUFVfU0gzCiAvKiBTSDMgaGFzIGEgUENNQ0lBIGJ1ZyB0aGF0IG5lZWRzIGEgZHVtbXkgcmVhZCBmcm9tIGFyZWEgNiBmb3IgYQpAQCAtOTYsNiArOTYsNyBAQAogCXdoaWxlIChjb3VudC0tKQogCQkqYnVmKysgPSAqcG9ydF9hZGRyOwogCisJZmx1c2hfZGNhY2hlX2FsbCgpOwogCWR1bW15X3JlYWQoKTsKIH0KIApAQCAtMTcwLDYgKzE3MSw3IEBACiAJd2hpbGUgKGNvdW50LS0pCiAJCSpwb3J0X2FkZHIgPSAqYnVmKys7CiAKKwlmbHVzaF9kY2FjaGVfYWxsKCk7CiAJZHVtbXlfcmVhZCgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9rZ2RiX3N0dWIuYyBiL2FyY2gvc2gva2VybmVsL2tnZGJfc3R1Yi5jCmluZGV4IDljNjMxNWYuLmQ4OTI3ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2tnZGJfc3R1Yi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2tnZGJfc3R1Yi5jCkBAIC0xMzIzLDggKzEzMjMsMTEgQEAKIH0KIAogLyogVGhlcmUgaGFzIGJlZW4gYW4gZXhjZXB0aW9uLCBtb3N0IGxpa2VseSBhIGJyZWFrcG9pbnQuICovCi12b2lkIGtnZGJfaGFuZGxlX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2FzbWxpbmthZ2Ugdm9pZCBrZ2RiX2hhbmRsZV9leGNlcHRpb24odW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzIF9fcmVncykKIHsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CiAJaW50IGV4Y2VwX2NvZGUsIHZicl92YWw7CiAJaW50IGNvdW50OwogCWludCB0cmFwYV92YWx1ZSA9IGN0cmxfaW5sKFRSQSk7CkBAIC0xMzY4LDggKzEzNzEsNiBAQAogCiAJdmJyX3ZhbCA9IHRyYXBfcmVnaXN0ZXJzLnZicjsKIAlhc20oImxkYyAlMCwgdmJyIjogOiJyIih2YnJfdmFsKSk7Ci0KLQlyZXR1cm47CiB9CiAKIC8qIFRyaWdnZXIgYSBicmVha3BvaW50IGJ5IGZ1bmN0aW9uICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNDg2YzA2ZS4uOWQ2YTQzOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYwpAQCAtMSw0MiArMSwzMCBAQAotLyogJElkOiBwcm9jZXNzLmMsdiAxLjI4IDIwMDQvMDUvMDUgMTY6NTQ6MjMgbGV0aGFsIEV4cCAkCisvKgorICogYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCiAgKgotICogIGxpbnV4L2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYworICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgcHJvY2VzcyBoYW5kbGluZy4uCiAgKgogICogIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKICAqCiAgKiAgU3VwZXJIIHZlcnNpb246ICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgIE5paWJlIFl1dGFrYSAmIEtheiBLb2ppbWEKICAqCQkgICAgIENvcHlyaWdodCAoQykgMjAwNiBMaW5lbyBTb2x1dGlvbnMgSW5jLiBzdXBwb3J0IFNINEEgVUJDCisgKgkJICAgICBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA2ICBQYXVsIE11bmR0CiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIHByb2Nlc3MgaGFuZGxpbmcuLgotICovCi0KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS91YmMuaD4KIAotc3RhdGljIGludCBobHRfY291bnRlcj0wOwotCitzdGF0aWMgaW50IGhsdF9jb3VudGVyOwogaW50IHViY191c2VyY250ID0gMDsKIAogI2RlZmluZSBIQVJEX0lETEVfVElNRU9VVCAoSFogLyAzKQogCiB2b2lkICgqcG1faWRsZSkodm9pZCk7Ci0KIHZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOwogRVhQT1JUX1NZTUJPTChwbV9wb3dlcl9vZmYpOwogCkBAIC00NCwxNCArMzIsMTIgQEAKIHsKIAlobHRfY291bnRlcisrOwogfQotCiBFWFBPUlRfU1lNQk9MKGRpc2FibGVfaGx0KTsKIAogdm9pZCBlbmFibGVfaGx0KHZvaWQpCiB7CiAJaGx0X2NvdW50ZXItLTsKIH0KLQogRVhQT1JUX1NZTUJPTChlbmFibGVfaGx0KTsKIAogdm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKQEAgLTE1MiwxOSArMTM4LDIxIEBACiAJIi5hbGlnbiAyXG5cdCIKIAkiMToubG9uZyBkb19leGl0Iik7CiAKKy8qIERvbid0IHVzZSB0aGlzIGluIEJMPTEoY2xpKS4gIE9yIGVsc2UsIENQVSByZXNldHMhICovCiBpbnQga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncykKLXsJLyogRG9uJ3QgdXNlIHRoaXMgaW4gQkw9MShjbGkpLiAgT3IgZWxzZSwgQ1BVIHJlc2V0cyEgKi8KK3sKIAlzdHJ1Y3QgcHRfcmVncyByZWdzOwogCiAJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOwotCXJlZ3MucmVnc1s0XSA9ICh1bnNpZ25lZCBsb25nKSBhcmc7Ci0JcmVncy5yZWdzWzVdID0gKHVuc2lnbmVkIGxvbmcpIGZuOworCXJlZ3MucmVnc1s0XSA9ICh1bnNpZ25lZCBsb25nKWFyZzsKKwlyZWdzLnJlZ3NbNV0gPSAodW5zaWduZWQgbG9uZylmbjsKIAotCXJlZ3MucGMgPSAodW5zaWduZWQgbG9uZykga2VybmVsX3RocmVhZF9oZWxwZXI7CisJcmVncy5wYyA9ICh1bnNpZ25lZCBsb25nKWtlcm5lbF90aHJlYWRfaGVscGVyOwogCXJlZ3Muc3IgPSAoMSA8PCAzMCk7CiAKIAkvKiBPaywgY3JlYXRlIHRoZSBuZXcgcHJvY2Vzcy4uICovCi0JcmV0dXJuIGRvX2ZvcmsoZmxhZ3MgfCBDTE9ORV9WTSB8IENMT05FX1VOVFJBQ0VELCAwLCAmcmVncywgMCwgTlVMTCwgTlVMTCk7CisJcmV0dXJuIGRvX2ZvcmsoZmxhZ3MgfCBDTE9ORV9WTSB8IENMT05FX1VOVFJBQ0VELCAwLAorCQkgICAgICAgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOwogfQogCiAvKgpAQCAtMjExLDIxICsxOTksMjAgQEAKIAlyZXR1cm4gZnB2YWxpZDsKIH0KIAotLyogCisvKgogICogQ2FwdHVyZSB0aGUgdXNlciBzcGFjZSByZWdpc3RlcnMgaWYgdGhlIHRhc2sgaXMgbm90IHJ1bm5pbmcgKGluIHVzZXIgc3BhY2UpCiAgKi8KIGludCBkdW1wX3Rhc2tfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgZWxmX2dyZWdzZXRfdCAqcmVncykKIHsKIAlzdHJ1Y3QgcHRfcmVncyBwdHJlZ3M7Ci0JCisKIAlwdHJlZ3MgPSAqdGFza19wdF9yZWdzKHRzayk7CiAJZWxmX2NvcmVfY29weV9yZWdzKHJlZ3MsICZwdHJlZ3MpOwogCiAJcmV0dXJuIDE7CiB9CiAKLWludAotZHVtcF90YXNrX2ZwdSAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGVsZl9mcHJlZ3NldF90ICpmcHUpCitpbnQgZHVtcF90YXNrX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgZWxmX2ZwcmVnc2V0X3QgKmZwdSkKIHsKIAlpbnQgZnB2YWxpZCA9IDA7CiAKQEAgLTI2MywxMiArMjUwLDE0IEBACiAJCWNoaWxkcmVncy0+cmVnc1sxNV0gPSB1c3A7CiAJCXRpLT5hZGRyX2xpbWl0ID0gVVNFUl9EUzsKIAl9IGVsc2UgewotCQljaGlsZHJlZ3MtPnJlZ3NbMTVdID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHApICsgVEhSRUFEX1NJWkU7CisJCWNoaWxkcmVncy0+cmVnc1sxNV0gPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCkgKworCQkJCQkJCVRIUkVBRF9TSVpFOwogCQl0aS0+YWRkcl9saW1pdCA9IEtFUk5FTF9EUzsKIAl9Ci0gICAgICAgIGlmIChjbG9uZV9mbGFncyAmIENMT05FX1NFVFRMUykgeworCisgICAgICAgIGlmIChjbG9uZV9mbGFncyAmIENMT05FX1NFVFRMUykKIAkJY2hpbGRyZWdzLT5nYnIgPSBjaGlsZHJlZ3MtPnJlZ3NbMF07Ci0JfQorCiAJY2hpbGRyZWdzLT5yZWdzWzBdID0gMDsgLyogU2V0IHJldHVybiB2YWx1ZSBmb3IgY2hpbGQgKi8KIAogCXAtPnRocmVhZC5zcCA9ICh1bnNpZ25lZCBsb25nKSBjaGlsZHJlZ3M7CkBAIC0yODAsOCArMjY5LDcgQEAKIH0KIAogLyogVHJhY2luZyBieSB1c2VyIGJyZWFrIGNvbnRyb2xsZXIuICAqLwotc3RhdGljIHZvaWQKLXViY19zZXRfdHJhY2luZyhpbnQgYXNpZCwgdW5zaWduZWQgbG9uZyBwYykKK3N0YXRpYyB2b2lkIHViY19zZXRfdHJhY2luZyhpbnQgYXNpZCwgdW5zaWduZWQgbG9uZyBwYykKIHsKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0QSkKIAl1bnNpZ25lZCBsb25nIHZhbDsKQEAgLTI5Nyw3ICsyODUsNyBAQAogCXZhbCA9IChVQkNfQ1JSX1JFUyB8IFVCQ19DUlJfUENCIHwgVUJDX0NSUl9CSUUpOwogCWN0cmxfb3V0bCh2YWwsIFVCQ19DUlIwKTsKIAotCS8qIFJlYWQgVUJDIHJlZ2lzdGVyIHRoYXQgd2Ugd3JpdGVkIGxhc3QuIEZvciBjaGVra2luZyBVQkMgUmVnaXN0ZXIgY2hhbmdlZCAqLworCS8qIFJlYWQgVUJDIHJlZ2lzdGVyIHRoYXQgd2Ugd3JvdGUgbGFzdCwgZm9yIGNoZWNraW5nIHVwZGF0ZSAqLwogCXZhbCA9IGN0cmxfaW5sKFVCQ19DUlIwKTsKIAogI2Vsc2UJLyogQ09ORklHX0NQVV9TSDRBICovCkBAIC0zMDUsMTMgKzI5MywxNCBAQAogCiAjaWZkZWYgQ09ORklHX01NVQogCS8qIFdlIGRvbid0IGhhdmUgYW55IEFTSUQgc2V0dGluZ3MgZm9yIHRoZSBTSC0yISAqLwotCWlmIChjcHVfZGF0YS0+dHlwZSAhPSBDUFVfU0g3NjA0KQorCWlmIChjdXJyZW50X2NwdV9kYXRhLnR5cGUgIT0gQ1BVX1NINzYwNCkKIAkJY3RybF9vdXRiKGFzaWQsIFVCQ19CQVNSQSk7CiAjZW5kaWYKIAogCWN0cmxfb3V0bCgwLCBVQkNfQkFNUkEpOwogCi0JaWYgKGNwdV9kYXRhLT50eXBlID09IENQVV9TSDc3MjkgfHwgY3B1X2RhdGEtPnR5cGUgPT0gQ1BVX1NINzcxMCkgeworCWlmIChjdXJyZW50X2NwdV9kYXRhLnR5cGUgPT0gQ1BVX1NINzcyOSB8fAorCSAgICBjdXJyZW50X2NwdV9kYXRhLnR5cGUgPT0gQ1BVX1NINzcxMCkgewogCQljdHJsX291dHcoQkJSX0lOU1QgfCBCQlJfUkVBRCB8IEJCUl9DUFUsIFVCQ19CQlJBKTsKIAkJY3RybF9vdXRsKEJSQ1JfUENCQSB8IEJSQ1JfUENURSwgVUJDX0JSQ1IpOwogCX0gZWxzZSB7CkBAIC0zMjUsNyArMzE0LDggQEAKICAqCXN3aXRjaF90byh4LHkpIHNob3VsZCBzd2l0Y2ggdGFza3MgZnJvbSB4IHRvIHkuCiAgKgogICovCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQorc3RydWN0IHRhc2tfc3RydWN0ICpfX3N3aXRjaF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsCisJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQogewogI2lmIGRlZmluZWQoQ09ORklHX1NIX0ZQVSkKIAl1bmxhenlfZnB1KHByZXYsIHRhc2tfcHRfcmVncyhwcmV2KSk7CkBAIC0zNTQsNyArMzQ0LDcgQEAKICNpZmRlZiBDT05GSUdfTU1VCiAJLyoKIAkgKiBSZXN0b3JlIHRoZSBrZXJuZWwgbW9kZSByZWdpc3RlcgotCSAqICAgCWs3IChyN19iYW5rMSkKKwkgKglrNyAocjdfYmFuazEpCiAJICovCiAJYXNtIHZvbGF0aWxlKCJsZGMJJTAsIHI3X2JhbmsiCiAJCSAgICAgOiAvKiBubyBvdXRwdXQgKi8KQEAgLTM2Nyw3ICszNTcsNyBAQAogCWVsc2UgaWYgKG5leHQtPnRocmVhZC51YmNfcGMgJiYgbmV4dC0+bW0pIHsKIAkJaW50IGFzaWQgPSAwOwogI2lmZGVmIENPTkZJR19NTVUKLQkJYXNpZCB8PSBuZXh0LT5tbS0+Y29udGV4dC5pZCAmIE1NVV9DT05URVhUX0FTSURfTUFTSzsKKwkJYXNpZCB8PSBjcHVfYXNpZChzbXBfcHJvY2Vzc29yX2lkKCksIG5leHQtPm1tKTsKICNlbmRpZgogCQl1YmNfc2V0X3RyYWNpbmcoYXNpZCwgbmV4dC0+dGhyZWFkLnViY19wYyk7CiAJfSBlbHNlIHsKQEAgLTQwNSw3ICszOTUsOCBAQAogCWlmICghbmV3c3ApCiAJCW5ld3NwID0gcmVncy0+cmVnc1sxNV07CiAJcmV0dXJuIGRvX2ZvcmsoY2xvbmVfZmxhZ3MsIG5ld3NwLCByZWdzLCAwLAotCQkJKGludCBfX3VzZXIgKilwYXJlbnRfdGlkcHRyLCAoaW50IF9fdXNlciAqKWNoaWxkX3RpZHB0cik7CisJCQkoaW50IF9fdXNlciAqKXBhcmVudF90aWRwdHIsCisJCQkoaW50IF9fdXNlciAqKWNoaWxkX3RpZHB0cik7CiB9CiAKIC8qCkBAIC00OTMsOSArNDg0LDI3IEBACiAJZm9yY2Vfc2lnKFNJR1RSQVAsIGN1cnJlbnQpOwogfQogCi1hc21saW5rYWdlIHZvaWQgYnJlYWtfcG9pbnRfdHJhcF9zb2Z0d2FyZSh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCi0JCQkJCSAgc3RydWN0IHB0X3JlZ3MgX19yZWdzKQorLyoKKyAqIEdlbmVyaWMgdHJhcCBoYW5kbGVyLgorICovCithc21saW5rYWdlIHZvaWQgZGVidWdfdHJhcF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCisJCQkJICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJCQkgICBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOworCisJLyogUmV3aW5kICovCisJcmVncy0+cGMgLT0gMjsKKworCWZvcmNlX3NpZyhTSUdUUkFQLCBjdXJyZW50KTsKK30KKworLyoKKyAqIFNwZWNpYWwgaGFuZGxlciBmb3IgQlVHKCkgdHJhcHMuCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBidWdfdHJhcF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCisJCQkJIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCQkJIHN0cnVjdCBwdF9yZWdzIF9fcmVncykKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IFJFTE9DX0hJREUoJl9fcmVncywgMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NldHVwLmMgYi9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCmluZGV4IGQ2YjgxN2EuLjk4ODAyYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwpAQCAtMSwxNCArMSwxMSBAQAogLyoKLSAqICBsaW51eC9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCisgKiBhcmNoL3NoL2tlcm5lbC9zZXR1cC5jCisgKgorICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgaW5pdGlhbGl6YXRpb24KICAqCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA2IFBhdWwgTXVuZHQKICAqLwotCi0vKgotICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgaW5pdGlhbGl6YXRpb24KLSAqLwotCiAjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0zOTUsOSArMzkyLDkgQEAKIAlbQ1BVX1NIX05PTkVdCT0gIlVua25vd24iCiB9OwogCi1jb25zdCBjaGFyICpnZXRfY3B1X3N1YnR5cGUodm9pZCkKK2NvbnN0IGNoYXIgKmdldF9jcHVfc3VidHlwZShzdHJ1Y3Qgc2hfY3B1aW5mbyAqYykKIHsKLQlyZXR1cm4gY3B1X25hbWVbYm9vdF9jcHVfZGF0YS50eXBlXTsKKwlyZXR1cm4gY3B1X25hbWVbYy0+dHlwZV07CiB9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpAQCAtNDA3LDE5ICs0MDQsMTkgQEAKIAkicHRlYSIsICJsbHNjIiwgImwyIiwgTlVMTAogfTsKIAotc3RhdGljIHZvaWQgc2hvd19jcHVmbGFncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCitzdGF0aWMgdm9pZCBzaG93X2NwdWZsYWdzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHNoX2NwdWluZm8gKmMpCiB7CiAJdW5zaWduZWQgbG9uZyBpOwogCiAJc2VxX3ByaW50ZihtLCAiY3B1IGZsYWdzXHQ6Iik7CiAKLQlpZiAoIWNwdV9kYXRhLT5mbGFncykgeworCWlmICghYy0+ZmxhZ3MpIHsKIAkJc2VxX3ByaW50ZihtLCAiICVzXG4iLCBjcHVfZmxhZ3NbMF0pOwogCQlyZXR1cm47CiAJfQogCiAJZm9yIChpID0gMDsgY3B1X2ZsYWdzW2ldOyBpKyspCi0JCWlmICgoY3B1X2RhdGEtPmZsYWdzICYgKDEgPDwgaSkpKQorCQlpZiAoKGMtPmZsYWdzICYgKDEgPDwgaSkpKQogCQkJc2VxX3ByaW50ZihtLCAiICVzIiwgY3B1X2ZsYWdzW2krMV0pOwogCiAJc2VxX3ByaW50ZihtLCAiXG4iKTsKQEAgLTQ0MSwxNiArNDM4LDIwIEBACiAgKi8KIHN0YXRpYyBpbnQgc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBzaF9jcHVpbmZvICpjID0gdjsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gYyAtIGNwdV9kYXRhOwogCi0JaWYgKCFjcHUgJiYgY3B1X29ubGluZShjcHUpKQorCWlmICghY3B1X29ubGluZShjcHUpKQorCQlyZXR1cm4gMDsKKworCWlmIChjcHUgPT0gMCkKIAkJc2VxX3ByaW50ZihtLCAibWFjaGluZVx0XHQ6ICVzXG4iLCBnZXRfc3lzdGVtX3R5cGUoKSk7CiAKIAlzZXFfcHJpbnRmKG0sICJwcm9jZXNzb3JcdDogJWRcbiIsIGNwdSk7CiAJc2VxX3ByaW50ZihtLCAiY3B1IGZhbWlseVx0OiAlc1xuIiwgaW5pdF91dHNuYW1lKCktPm1hY2hpbmUpOwotCXNlcV9wcmludGYobSwgImNwdSB0eXBlXHQ6ICVzXG4iLCBnZXRfY3B1X3N1YnR5cGUoKSk7CisJc2VxX3ByaW50ZihtLCAiY3B1IHR5cGVcdDogJXNcbiIsIGdldF9jcHVfc3VidHlwZShjKSk7CiAKLQlzaG93X2NwdWZsYWdzKG0pOworCXNob3dfY3B1ZmxhZ3MobSwgYyk7CiAKIAlzZXFfcHJpbnRmKG0sICJjYWNoZSB0eXBlXHQ6ICIpOwogCkBAIC00NTksMjIgKzQ2MCwyMiBAQAogCSAqIHVuaWZpZWQgY2FjaGUgb24gdGhlIFNILTIgYW5kIFNILTMsIGFzIHdlbGwgYXMgdGhlIGhhcnZhcmQKIAkgKiBzdHlsZSBjYWNoZSBvbiB0aGUgU0gtNC4KIAkgKi8KLQlpZiAoYm9vdF9jcHVfZGF0YS5pY2FjaGUuZmxhZ3MgJiBTSF9DQUNIRV9DT01CSU5FRCkgeworCWlmIChjLT5pY2FjaGUuZmxhZ3MgJiBTSF9DQUNIRV9DT01CSU5FRCkgewogCQlzZXFfcHJpbnRmKG0sICJ1bmlmaWVkXG4iKTsKLQkJc2hvd19jYWNoZWluZm8obSwgImNhY2hlIiwgYm9vdF9jcHVfZGF0YS5pY2FjaGUpOworCQlzaG93X2NhY2hlaW5mbyhtLCAiY2FjaGUiLCBjLT5pY2FjaGUpOwogCX0gZWxzZSB7CiAJCXNlcV9wcmludGYobSwgInNwbGl0IChoYXJ2YXJkKVxuIik7Ci0JCXNob3dfY2FjaGVpbmZvKG0sICJpY2FjaGUiLCBib290X2NwdV9kYXRhLmljYWNoZSk7Ci0JCXNob3dfY2FjaGVpbmZvKG0sICJkY2FjaGUiLCBib290X2NwdV9kYXRhLmRjYWNoZSk7CisJCXNob3dfY2FjaGVpbmZvKG0sICJpY2FjaGUiLCBjLT5pY2FjaGUpOworCQlzaG93X2NhY2hlaW5mbyhtLCAiZGNhY2hlIiwgYy0+ZGNhY2hlKTsKIAl9CiAKIAkvKiBPcHRpb25hbCBzZWNvbmRhcnkgY2FjaGUgKi8KLQlpZiAoYm9vdF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfTDJfQ0FDSEUpCi0JCXNob3dfY2FjaGVpbmZvKG0sICJzY2FjaGUiLCBib290X2NwdV9kYXRhLnNjYWNoZSk7CisJaWYgKGMtPmZsYWdzICYgQ1BVX0hBU19MMl9DQUNIRSkKKwkJc2hvd19jYWNoZWluZm8obSwgInNjYWNoZSIsIGMtPnNjYWNoZSk7CiAKIAlzZXFfcHJpbnRmKG0sICJib2dvbWlwc1x0OiAlbHUuJTAybHVcbiIsCi0JCSAgICAgYm9vdF9jcHVfZGF0YS5sb29wc19wZXJfamlmZnkvKDUwMDAwMC9IWiksCi0JCSAgICAgKGJvb3RfY3B1X2RhdGEubG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSkgJSAxMDApOworCQkgICAgIGMtPmxvb3BzX3Blcl9qaWZmeS8oNTAwMDAwL0haKSwKKwkJICAgICAoYy0+bG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSkgJSAxMDApOwogCiAJcmV0dXJuIHNob3dfY2xvY2tzKG0pOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYyBiL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKaW5kZXggZTYxMDYyMy4uZmUxYjI3NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCkBAIC0xMDUsNyArMTA1LDYgQEAKIEVYUE9SVF9TWU1CT0woY2xlYXJfdXNlcl9wYWdlKTsKICNlbmRpZgogCi1FWFBPUlRfU1lNQk9MKGZsdXNoX3RsYl9wYWdlKTsKIEVYUE9SVF9TWU1CT0woX19kb3duX3RyeWxvY2spOwogCiAjaWZkZWYgQ09ORklHX1NNUApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYwppbmRleCAzNzljODhiLi4zMmYxMGEwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYwpAQCAtMTI3LDcgKzEyNyw3IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCi0JaWYgKCEoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19GUFUpKQorCWlmICghKGN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgJiBDUFVfSEFTX0ZQVSkpCiAJCXJldHVybiAwOwogCiAJc2V0X3VzZWRfbWF0aCgpOwpAQCAtMTQwLDcgKzE0MCw3IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCi0JaWYgKCEoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19GUFUpKQorCWlmICghKGN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgJiBDUFVfSEFTX0ZQVSkpCiAJCXJldHVybiAwOwogCiAJaWYgKCF1c2VkX21hdGgoKSkgewpAQCAtMTgxLDcgKzE4MSw3IEBACiAjdW5kZWYgQ09QWQogCiAjaWZkZWYgQ09ORklHX1NIX0ZQVQotCWlmIChjcHVfZGF0YS0+ZmxhZ3MgJiBDUFVfSEFTX0ZQVSkgeworCWlmIChjdXJyZW50X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19GUFUpIHsKIAkJaW50IG93bmVkX2ZwOwogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCmluZGV4IGNhODE5NzYuLjM4ZmM4Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUwpAQCAtMzE5LDE1ICszMTksMTUgQEAKIAkubG9uZyBzeXNfbXFfZ2V0c2V0YXR0cgogCS5sb25nIHN5c19rZXhlY19sb2FkCiAJLmxvbmcgc3lzX3dhaXRpZAotCS5sb25nIHN5c19uaV9zeXNjYWxsCQkvKiAyODUgKi8KLQkubG9uZyBzeXNfYWRkX2tleQorCS5sb25nIHN5c19hZGRfa2V5CQkvKiAyODUgKi8KIAkubG9uZyBzeXNfcmVxdWVzdF9rZXkKIAkubG9uZyBzeXNfa2V5Y3RsCiAJLmxvbmcgc3lzX2lvcHJpb19zZXQKLQkubG9uZyBzeXNfaW9wcmlvX2dldAkJLyogMjkwICovCi0JLmxvbmcgc3lzX2lub3RpZnlfaW5pdAorCS5sb25nIHN5c19pb3ByaW9fZ2V0CisJLmxvbmcgc3lzX2lub3RpZnlfaW5pdAkJLyogMjkwICovCiAJLmxvbmcgc3lzX2lub3RpZnlfYWRkX3dhdGNoCiAJLmxvbmcgc3lzX2lub3RpZnlfcm1fd2F0Y2gKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAogCS5sb25nIHN5c19taWdyYXRlX3BhZ2VzCiAJLmxvbmcgc3lzX29wZW5hdAkJLyogMjk1ICovCiAJLmxvbmcgc3lzX21rZGlyYXQKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMgYi9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCmluZGV4IGVjMTEwMTUuLmU5ZjE2OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwpAQCAtMTU2LDEzICsxNTYsMTMgQEAKIHsKIH0KICNlbmRpZiAvKiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSAqLwotI2VuZGlmIC8qIENPTkZJR19CVUcgKi8KIAogdm9pZCBoYW5kbGVfQlVHKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWRvX2J1Z192ZXJib3NlKHJlZ3MpOwogCWRpZSgiS2VybmVsIEJVRyIsIHJlZ3MsIFRSQVBBX0JVR19PUENPREUgJiAweGZmKTsKIH0KKyNlbmRpZiAvKiBDT05GSUdfQlVHICovCiAKIC8qCiAgKiBoYW5kbGUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBkb2VzIGFuIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIGJ5IGVtdWxhdGluZyB0aGUKQEAgLTY0MSw3ICs2NDEsNyBAQAogCSAqIFNhZmUgZ3VhcmQgaWYgRFNQIG1vZGUgaXMgYWxyZWFkeSBlbmFibGVkIG9yIHdlJ3JlIGxhY2tpbmcKIAkgKiB0aGUgRFNQIGFsdG9nZXRoZXIuCiAJICovCi0JaWYgKCEoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19EU1ApIHx8IChyZWdzLT5zciAmIFNSX0RTUCkpCisJaWYgKCEoY3VycmVudF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfRFNQKSB8fCAocmVncy0+c3IgJiBTUl9EU1ApKQogCQlyZXR1cm4gMDsKIAogCWdldF91c2VyKGluc3QsICgodW5zaWduZWQgc2hvcnQgKikgcmVncy0+cGMpKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vS2NvbmZpZyBiL2FyY2gvc2gvbW0vS2NvbmZpZwppbmRleCAyOWY0ZWUzLi42YjBkMjhhIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL0tjb25maWcKKysrIGIvYXJjaC9zaC9tbS9LY29uZmlnCkBAIC0yMCw3ICsyMCw3IEBACiAJYm9vbAogCXNlbGVjdCBDUFVfSEFTX0lOVEVWVAogCXNlbGVjdCBDUFVfSEFTX1NSX1JCCi0Jc2VsZWN0IENQVV9IQVNfUFRFQSBpZiAhQ1BVX1NVQlRZUEVfU1Q0MAorCXNlbGVjdCBDUFVfSEFTX1BURUEgaWYgKCFDUFVfU1VCVFlQRV9TVDQwICYmICFDUFVfU0g0QSkgfHwgQ1BVX1NIWDIKIAogY29uZmlnIENQVV9TSDRBCiAJYm9vbApAQCAtNzIsNiArNzIsNyBAQAogY29uZmlnIENQVV9TVUJUWVBFX1NINzcwNgogCWJvb2wgIlN1cHBvcnQgU0g3NzA2IHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMworCXNlbGVjdCBDUFVfSEFTX0lQUl9JUlEKIAloZWxwCiAJICBTZWxlY3QgU0g3NzA2IGlmIHlvdSBoYXZlIGEgMTMzIE1oeiBTSC0zIEhENjQxNzcwNiBDUFUuCiAKQEAgLTkyLDYgKzkzLDcgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3MDkKIAlib29sICJTdXBwb3J0IFNINzcwOSBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDMKKwlzZWxlY3QgQ1BVX0hBU19JUFJfSVJRCiAJc2VsZWN0IENQVV9IQVNfUElOVF9JUlEKIAloZWxwCiAJICBTZWxlY3QgU0g3NzA5IGlmIHlvdSBoYXZlIGEgIDgwIE1oeiBTSC0zIEhENjQxNzcwOSBDUFUuCkBAIC0xNDksNiArMTUxLDcgQEAKIAlib29sICJTdXBwb3J0IFNINzc2MCBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDQKIAlzZWxlY3QgQ1BVX0hBU19JTlRDMl9JUlEKKwlzZWxlY3QgQ1BVX0hBU19JUFJfSVJRCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDRfMjAyCiAJYm9vbCAiU3VwcG9ydCBTSDQtMjAyIHByb2Nlc3NvciIKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY2FjaGUtZGVidWdmcy5jIGIvYXJjaC9zaC9tbS9jYWNoZS1kZWJ1Z2ZzLmMKaW5kZXggOTA5ZGNmYS4uZGU2ZDJjOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jYWNoZS1kZWJ1Z2ZzLmMKKysrIGIvYXJjaC9zaC9tbS9jYWNoZS1kZWJ1Z2ZzLmMKQEAgLTQ2LDEwICs0NiwxMCBAQAogCiAJaWYgKGNhY2hlX3R5cGUgPT0gQ0FDSEVfVFlQRV9EQ0FDSEUpIHsKIAkJYmFzZSA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVk7Ci0JCWNhY2hlID0gJmNwdV9kYXRhLT5kY2FjaGU7CisJCWNhY2hlID0gJmN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlOwogCX0gZWxzZSB7CiAJCWJhc2UgPSBDQUNIRV9JQ19BRERSRVNTX0FSUkFZOwotCQljYWNoZSA9ICZjcHVfZGF0YS0+aWNhY2hlOworCQljYWNoZSA9ICZjdXJyZW50X2NwdV9kYXRhLmljYWNoZTsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jYWNoZS1zaDMuYyBiL2FyY2gvc2gvbW0vY2FjaGUtc2gzLmMKaW5kZXggODM4NzMxZi4uNmQxZGJlYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jYWNoZS1zaDMuYworKysgYi9hcmNoL3NoL21tL2NhY2hlLXNoMy5jCkBAIC00NCwxMSArNDQsMTEgQEAKIAogCWZvciAodiA9IGJlZ2luOyB2IDwgZW5kOyB2Kz1MMV9DQUNIRV9CWVRFUykgewogCQl1bnNpZ25lZCBsb25nIGFkZHJzdGFydCA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVk7Ci0JCWZvciAoaiA9IDA7IGogPCBjcHVfZGF0YS0+ZGNhY2hlLndheXM7IGorKykgeworCQlmb3IgKGogPSAwOyBqIDwgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5czsgaisrKSB7CiAJCQl1bnNpZ25lZCBsb25nIGRhdGEsIGFkZHIsIHA7CiAKIAkJCXAgPSBfX3BhKHYpOwotCQkJYWRkciA9IGFkZHJzdGFydCB8ICh2ICYgY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9tYXNrKTsKKwkJCWFkZHIgPSBhZGRyc3RhcnQgfCAodiAmIGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X21hc2spOwogCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQkJZGF0YSA9IGN0cmxfaW5sKGFkZHIpOwogCkBAIC02MCw3ICs2MCw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlhZGRyc3RhcnQgKz0gY3B1X2RhdGEtPmRjYWNoZS53YXlfaW5jcjsKKwkJCWFkZHJzdGFydCArPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jcjsKIAkJfQogCX0KIH0KQEAgLTg1LDcgKzg1LDcgQEAKIAogCQlkYXRhID0gKHYgJiAweGZmZmZmYzAwKTsgLyogX1ZpcnR1YWxfIGFkZHJlc3MsIH5VLCB+ViAqLwogCQlhZGRyID0gQ0FDSEVfT0NfQUREUkVTU19BUlJBWSB8Ci0JCQkodiAmIGNwdV9kYXRhLT5kY2FjaGUuZW50cnlfbWFzaykgfCBTSF9DQUNIRV9BU1NPQzsKKwkJCSh2ICYgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfbWFzaykgfCBTSF9DQUNIRV9BU1NPQzsKIAkJY3RybF9vdXRsKGRhdGEsIGFkZHIpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY2FjaGUtc2g0LmMgYi9hcmNoL3NoL21tL2NhY2hlLXNoNC5jCmluZGV4IGM2OTU1MTUuLmUwY2Q0YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vY2FjaGUtc2g0LmMKKysrIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDQuYwpAQCAtNTQsMjEgKzU0LDIxIEBACiAJCWN0cmxfaW5sKENDTl9DVlIpLAogCQljdHJsX2lubChDQ05fUFJSKSk7CiAJcHJpbnRrKCJJLWNhY2hlIDogbl93YXlzPSVkIG5fc2V0cz0lZCB3YXlfaW5jcj0lZFxuIiwKLQkJY3B1X2RhdGEtPmljYWNoZS53YXlzLAotCQljcHVfZGF0YS0+aWNhY2hlLnNldHMsCi0JCWNwdV9kYXRhLT5pY2FjaGUud2F5X2luY3IpOworCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlzLAorCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS5zZXRzLAorCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlfaW5jcik7CiAJcHJpbnRrKCJJLWNhY2hlIDogZW50cnlfbWFzaz0weCUwOHggYWxpYXNfbWFzaz0weCUwOHggbl9hbGlhc2VzPSVkXG4iLAotCQljcHVfZGF0YS0+aWNhY2hlLmVudHJ5X21hc2ssCi0JCWNwdV9kYXRhLT5pY2FjaGUuYWxpYXNfbWFzaywKLQkJY3B1X2RhdGEtPmljYWNoZS5uX2FsaWFzZXMpOworCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS5lbnRyeV9tYXNrLAorCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS5hbGlhc19tYXNrLAorCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS5uX2FsaWFzZXMpOwogCXByaW50aygiRC1jYWNoZSA6IG5fd2F5cz0lZCBuX3NldHM9JWQgd2F5X2luY3I9JWRcbiIsCi0JCWNwdV9kYXRhLT5kY2FjaGUud2F5cywKLQkJY3B1X2RhdGEtPmRjYWNoZS5zZXRzLAotCQljcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyKTsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5cywKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0cywKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IpOwogCXByaW50aygiRC1jYWNoZSA6IGVudHJ5X21hc2s9MHglMDh4IGFsaWFzX21hc2s9MHglMDh4IG5fYWxpYXNlcz0lZFxuIiwKLQkJY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9tYXNrLAotCQljcHVfZGF0YS0+ZGNhY2hlLmFsaWFzX21hc2ssCi0JCWNwdV9kYXRhLT5kY2FjaGUubl9hbGlhc2VzKTsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfbWFzaywKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuYWxpYXNfbWFzaywKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubl9hbGlhc2VzKTsKIAogCWlmICghX19mbHVzaF9kY2FjaGVfc2VnbWVudF9mbikKIAkJcGFuaWMoInVua25vd24gbnVtYmVyIG9mIGNhY2hlIHdheXNcbiIpOwpAQCAtODcsMTAgKzg3LDEwIEBACiB7CiAJaW50IGk7CiAKLQljb21wdXRlX2FsaWFzKCZjcHVfZGF0YS0+aWNhY2hlKTsKLQljb21wdXRlX2FsaWFzKCZjcHVfZGF0YS0+ZGNhY2hlKTsKKwljb21wdXRlX2FsaWFzKCZjdXJyZW50X2NwdV9kYXRhLmljYWNoZSk7CisJY29tcHV0ZV9hbGlhcygmY3VycmVudF9jcHVfZGF0YS5kY2FjaGUpOwogCi0Jc3dpdGNoIChjcHVfZGF0YS0+ZGNhY2hlLndheXMpIHsKKwlzd2l0Y2ggKGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMpIHsKIAljYXNlIDE6CiAJCV9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfZm4gPSBfX2ZsdXNoX2RjYWNoZV9zZWdtZW50XzF3YXk7CiAJCWJyZWFrOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJaWYgKGlvcmVtYXBfcGFnZV9yYW5nZShQM1NFRywgUDNTRUcgKyAoUEFHRV9TSVpFICogNCksIDAsIFBBR0VfS0VSTkVMKSkKIAkJcGFuaWMoIiVzIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOwogCi0JZm9yIChpID0gMDsgaSA8IGNwdV9kYXRhLT5kY2FjaGUubl9hbGlhc2VzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLm5fYWxpYXNlczsgaSsrKQogCQltdXRleF9pbml0KCZwM21hcF9tdXRleFtpXSk7CiB9CiAKQEAgLTIwMCwxMyArMjAwLDE0IEBACiAJCSAgICAgOiAvKiBubyBvdXRwdXQgKi8KIAkJICAgICA6ICJtIiAoX19tKHYpKSk7CiAKLQlpbmRleCA9IENBQ0hFX0lDX0FERFJFU1NfQVJSQVkgfCAodiAmIGNwdV9kYXRhLT5pY2FjaGUuZW50cnlfbWFzayk7CisJaW5kZXggPSBDQUNIRV9JQ19BRERSRVNTX0FSUkFZIHwKKwkJCSh2ICYgY3VycmVudF9jcHVfZGF0YS5pY2FjaGUuZW50cnlfbWFzayk7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJanVtcF90b19QMigpOwogCi0JZm9yIChpID0gMDsgaSA8IGNwdV9kYXRhLT5pY2FjaGUud2F5czsKLQkgICAgIGkrKywgaW5kZXggKz0gY3B1X2RhdGEtPmljYWNoZS53YXlfaW5jcikKKwlmb3IgKGkgPSAwOyBpIDwgY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5czsKKwkgICAgIGkrKywgaW5kZXggKz0gY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5X2luY3IpCiAJCWN0cmxfb3V0bCgwLCBpbmRleCk7CS8qIENsZWFyIG91dCBWYWxpZC1iaXQgKi8KIAogCWJhY2tfdG9fUDEoKTsKQEAgLTIyMyw3ICsyMjQsNyBAQAogCSAqIEFsbCB0eXBlcyBvZiBTSC00IHJlcXVpcmUgUEMgdG8gYmUgaW4gUDIgdG8gb3BlcmF0ZSBvbiB0aGUgSS1jYWNoZS4KIAkgKiBTb21lIHR5cGVzIG9mIFNILTQgcmVxdWlyZSBQQyB0byBiZSBpbiBQMiB0byBvcGVyYXRlIG9uIHRoZSBELWNhY2hlLgogCSAqLwotCWlmICgoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19QMl9GTFVTSF9CVUcpIHx8CisJaWYgKChjdXJyZW50X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19QMl9GTFVTSF9CVUcpIHx8CiAJICAgIChzdGFydCA8IENBQ0hFX09DX0FERFJFU1NfQVJSQVkpKQogCQlleGVjX29mZnNldCA9IDB4MjAwMDAwMDA7CiAKQEAgLTIzNiwxNiArMjM3LDI2IEBACiAvKgogICogV3JpdGUgYmFjayAmIGludmFsaWRhdGUgdGhlIEQtY2FjaGUgb2YgdGhlIHBhZ2UuCiAgKiAoVG8gYXZvaWQgImFsaWFzIiBpc3N1ZXMpCisgKgorICogVGhpcyB1c2VzIGEgbGF6eSB3cml0ZS1iYWNrIG9uIFVQLCB3aGljaCBpcyBleHBsaWNpdGx5CisgKiBkaXNhYmxlZCBvbiBTTVAuCiAgKi8KIHZvaWQgZmx1c2hfZGNhY2hlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JaWYgKHRlc3RfYml0KFBHX21hcHBlZCwgJnBhZ2UtPmZsYWdzKSkgeworI2lmbmRlZiBDT05GSUdfU01QCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CisKKwlpZiAobWFwcGluZyAmJiAhbWFwcGluZ19tYXBwZWQobWFwcGluZykpCisJCXNldF9iaXQoUEdfZGNhY2hlX2RpcnR5LCAmcGFnZS0+ZmxhZ3MpOworCWVsc2UKKyNlbmRpZgorCXsKIAkJdW5zaWduZWQgbG9uZyBwaHlzID0gUEhZU0FERFIocGFnZV9hZGRyZXNzKHBhZ2UpKTsKIAkJdW5zaWduZWQgbG9uZyBhZGRyID0gQ0FDSEVfT0NfQUREUkVTU19BUlJBWTsKIAkJaW50IGksIG47CiAKIAkJLyogTG9vcCBhbGwgdGhlIEQtY2FjaGUgKi8KLQkJbiA9IGNwdV9kYXRhLT5kY2FjaGUubl9hbGlhc2VzOworCQluID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubl9hbGlhc2VzOwogCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrLCBhZGRyICs9IDQwOTYpCiAJCQlmbHVzaF9jYWNoZV80MDk2KGFkZHIsIHBoeXMpOwogCX0KQEAgLTI3Nyw3ICsyODgsNyBAQAogCiB2b2lkIGZsdXNoX2RjYWNoZV9hbGwodm9pZCkKIHsKLQkoKl9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfZm4pKDBVTCwgY3B1X2RhdGEtPmRjYWNoZS53YXlfc2l6ZSk7CisJKCpfX2ZsdXNoX2RjYWNoZV9zZWdtZW50X2ZuKSgwVUwsIGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheV9zaXplKTsKIAl3bWIoKTsKIH0KIApAQCAtMjkxLDggKzMwMiw4IEBACiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXVuc2lnbmVkIGxvbmcgZCA9IDAsIHAgPSBzdGFydCAmIFBBR0VfTUFTSzsKLQl1bnNpZ25lZCBsb25nIGFsaWFzX21hc2sgPSBjcHVfZGF0YS0+ZGNhY2hlLmFsaWFzX21hc2s7Ci0JdW5zaWduZWQgbG9uZyBuX2FsaWFzZXMgPSBjcHVfZGF0YS0+ZGNhY2hlLm5fYWxpYXNlczsKKwl1bnNpZ25lZCBsb25nIGFsaWFzX21hc2sgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5hbGlhc19tYXNrOworCXVuc2lnbmVkIGxvbmcgbl9hbGlhc2VzID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubl9hbGlhc2VzOwogCXVuc2lnbmVkIGxvbmcgc2VsZWN0X2JpdDsKIAl1bnNpZ25lZCBsb25nIGFsbF9hbGlhc2VzX21hc2s7CiAJdW5zaWduZWQgbG9uZyBhZGRyX29mZnNldDsKQEAgLTM3OSw3ICszOTAsNyBAQAogCSAqIElmIGNhY2hlIGlzIG9ubHkgNGstcGVyLXdheSwgdGhlcmUgYXJlIG5ldmVyIGFueSAnYWxpYXNlcycuICBTaW5jZQogCSAqIHRoZSBjYWNoZSBpcyBwaHlzaWNhbGx5IHRhZ2dlZCwgdGhlIGRhdGEgY2FuIGp1c3QgYmUgbGVmdCBpbiB0aGVyZS4KIAkgKi8KLQlpZiAoY3B1X2RhdGEtPmRjYWNoZS5uX2FsaWFzZXMgPT0gMCkKKwlpZiAoY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubl9hbGlhc2VzID09IDApCiAJCXJldHVybjsKIAogCS8qCkBAIC00MTYsNyArNDI3LDcgQEAKIAl1bnNpZ25lZCBsb25nIHBoeXMgPSBwZm4gPDwgUEFHRV9TSElGVDsKIAl1bnNpZ25lZCBpbnQgYWxpYXNfbWFzazsKIAotCWFsaWFzX21hc2sgPSBjcHVfZGF0YS0+ZGNhY2hlLmFsaWFzX21hc2s7CisJYWxpYXNfbWFzayA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmFsaWFzX21hc2s7CiAKIAkvKiBXZSBvbmx5IG5lZWQgdG8gZmx1c2ggRC1jYWNoZSB3aGVuIHdlIGhhdmUgYWxpYXMgKi8KIAlpZiAoKGFkZHJlc3NecGh5cykgJiBhbGlhc19tYXNrKSB7CkBAIC00MzAsNyArNDQxLDcgQEAKIAkJCXBoeXMpOwogCX0KIAotCWFsaWFzX21hc2sgPSBjcHVfZGF0YS0+aWNhY2hlLmFsaWFzX21hc2s7CisJYWxpYXNfbWFzayA9IGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLmFsaWFzX21hc2s7CiAJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSB7CiAJCS8qCiAJCSAqIEV2aWN0IGVudHJpZXMgZnJvbSB0aGUgcG9ydGlvbiBvZiB0aGUgY2FjaGUgZnJvbSB3aGljaCBjb2RlCkBAIC00NjIsNyArNDczLDcgQEAKIAkgKiBJZiBjYWNoZSBpcyBvbmx5IDRrLXBlci13YXksIHRoZXJlIGFyZSBuZXZlciBhbnkgJ2FsaWFzZXMnLiAgU2luY2UKIAkgKiB0aGUgY2FjaGUgaXMgcGh5c2ljYWxseSB0YWdnZWQsIHRoZSBkYXRhIGNhbiBqdXN0IGJlIGxlZnQgaW4gdGhlcmUuCiAJICovCi0JaWYgKGNwdV9kYXRhLT5kY2FjaGUubl9hbGlhc2VzID09IDApCisJaWYgKGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLm5fYWxpYXNlcyA9PSAwKQogCQlyZXR1cm47CiAKIAkvKgpAQCAtNTIzLDcgKzUzNCw3IEBACiAJdW5zaWduZWQgbG9uZyBhLCBlYSwgcDsKIAl1bnNpZ25lZCBsb25nIHRlbXBfcGM7CiAKLQlkY2FjaGUgPSAmY3B1X2RhdGEtPmRjYWNoZTsKKwlkY2FjaGUgPSAmY3VycmVudF9jcHVfZGF0YS5kY2FjaGU7CiAJLyogV3JpdGUgdGhpcyB3YXkgZm9yIGJldHRlciBhc3NlbWJseS4gKi8KIAl3YXlfY291bnQgPSBkY2FjaGUtPndheXM7CiAJd2F5X2luY3IgPSBkY2FjaGUtPndheV9pbmNyOwpAQCAtNTk4LDcgKzYwOSw3IEBACiAJYmFzZV9hZGRyID0gKChiYXNlX2FkZHIgPj4gMTYpIDw8IDE2KTsKIAliYXNlX2FkZHIgfD0gc3RhcnQ7CiAKLQlkY2FjaGUgPSAmY3B1X2RhdGEtPmRjYWNoZTsKKwlkY2FjaGUgPSAmY3VycmVudF9jcHVfZGF0YS5kY2FjaGU7CiAJbGluZXN6ID0gZGNhY2hlLT5saW5lc3o7CiAJd2F5X2luY3IgPSBkY2FjaGUtPndheV9pbmNyOwogCXdheV9zaXplID0gZGNhY2hlLT53YXlfc2l6ZTsKQEAgLTY0MCw3ICs2NTEsNyBAQAogCWJhc2VfYWRkciA9ICgoYmFzZV9hZGRyID4+IDE2KSA8PCAxNik7CiAJYmFzZV9hZGRyIHw9IHN0YXJ0OwogCi0JZGNhY2hlID0gJmNwdV9kYXRhLT5kY2FjaGU7CisJZGNhY2hlID0gJmN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlOwogCWxpbmVzeiA9IGRjYWNoZS0+bGluZXN6OwogCXdheV9pbmNyID0gZGNhY2hlLT53YXlfaW5jcjsKIAl3YXlfc2l6ZSA9IGRjYWNoZS0+d2F5X3NpemU7CkBAIC02OTksNyArNzEwLDcgQEAKIAliYXNlX2FkZHIgPSAoKGJhc2VfYWRkciA+PiAxNikgPDwgMTYpOwogCWJhc2VfYWRkciB8PSBzdGFydDsKIAotCWRjYWNoZSA9ICZjcHVfZGF0YS0+ZGNhY2hlOworCWRjYWNoZSA9ICZjdXJyZW50X2NwdV9kYXRhLmRjYWNoZTsKIAlsaW5lc3ogPSBkY2FjaGUtPmxpbmVzejsKIAl3YXlfaW5jciA9IGRjYWNoZS0+d2F5X2luY3I7CiAJd2F5X3NpemUgPSBkY2FjaGUtPndheV9zaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jYWNoZS1zaDc3MDUuYyBiL2FyY2gvc2gvbW0vY2FjaGUtc2g3NzA1LmMKaW5kZXggMDQ1YWJkZi4uMzFmOGRlYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jYWNoZS1zaDc3MDUuYworKysgYi9hcmNoL3NoL21tL2NhY2hlLXNoNzcwNS5jCkBAIC0zLDExICszLDExIEBACiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBOaWliZSBZdXRha2EKICAqIENvcHlyaWdodCAoQykgMjAwNCAgQWxleCBTb25nCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgpAQCAtMzIsOSArMzIsOSBAQAogewogCXVuc2lnbmVkIGxvbmcgd2F5cywgd2F5c2l6ZSwgYWRkcnN0YXJ0OwogCi0Jd2F5cyA9IGNwdV9kYXRhLT5kY2FjaGUud2F5czsKLQl3YXlzaXplID0gY3B1X2RhdGEtPmRjYWNoZS5zZXRzOwotCXdheXNpemUgPDw9IGNwdV9kYXRhLT5kY2FjaGUuZW50cnlfc2hpZnQ7CisJd2F5cyA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXM7CisJd2F5c2l6ZSA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHM7CisJd2F5c2l6ZSA8PD0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfc2hpZnQ7CiAKIAlhZGRyc3RhcnQgPSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZOwogCkBAIC00Myw3ICs0Myw3IEBACiAKIAkJZm9yIChhZGRyID0gYWRkcnN0YXJ0OwogCQkgICAgIGFkZHIgPCBhZGRyc3RhcnQgKyB3YXlzaXplOwotCQkgICAgIGFkZHIgKz0gY3B1X2RhdGEtPmRjYWNoZS5saW5lc3opIHsKKwkJICAgICBhZGRyICs9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmxpbmVzeikgewogCQkJdW5zaWduZWQgbG9uZyBkYXRhOwogCQkJaW50IHYgPSBTSF9DQUNIRV9VUERBVEVEIHwgU0hfQ0FDSEVfVkFMSUQ7CiAKQEAgLTUxLDEwICs1MSw5IEBACiAKIAkJCWlmICgoZGF0YSAmIHYpID09IHYpCiAJCQkJY3RybF9vdXRsKGRhdGEgJiB+diwgYWRkcik7Ci0KIAkJfQogCi0JCWFkZHJzdGFydCArPSBjcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyOworCQlhZGRyc3RhcnQgKz0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3I7CiAJfSB3aGlsZSAoLS13YXlzKTsKIH0KIApAQCAtOTQsOSArOTMsOSBAQAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlqdW1wX3RvX1AyKCk7CiAKLQl3YXlzID0gY3B1X2RhdGEtPmRjYWNoZS53YXlzOwotCXdheXNpemUgPSBjcHVfZGF0YS0+ZGNhY2hlLnNldHM7Ci0Jd2F5c2l6ZSA8PD0gY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9zaGlmdDsKKwl3YXlzID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5czsKKwl3YXlzaXplID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0czsKKwl3YXlzaXplIDw8PSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9zaGlmdDsKIAogCWFkZHJzdGFydCA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVk7CiAKQEAgLTEwNSw3ICsxMDQsNyBAQAogCiAJCWZvciAoYWRkciA9IGFkZHJzdGFydDsKIAkJICAgICBhZGRyIDwgYWRkcnN0YXJ0ICsgd2F5c2l6ZTsKLQkJICAgICBhZGRyICs9IGNwdV9kYXRhLT5kY2FjaGUubGluZXN6KSB7CisJCSAgICAgYWRkciArPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5saW5lc3opIHsKIAkJCXVuc2lnbmVkIGxvbmcgZGF0YTsKIAogCQkJZGF0YSA9IGN0cmxfaW5sKGFkZHIpICYgKDB4MWZmZmZDMDAgfCBTSF9DQUNIRV9WQUxJRCk7CkBAIC0xMTUsNyArMTE0LDcgQEAKIAkJCX0KIAkJfQogCi0JCWFkZHJzdGFydCArPSBjcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyOworCQlhZGRyc3RhcnQgKz0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3I7CiAJfSB3aGlsZSAoLS13YXlzKTsKIAogCWJhY2tfdG9fUDEoKTsKQEAgLTEyOCw3ICsxMjcsMTEgQEAKICAqLwogdm9pZCBmbHVzaF9kY2FjaGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlpZiAodGVzdF9iaXQoUEdfbWFwcGVkLCAmcGFnZS0+ZmxhZ3MpKQorCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOworCisJaWYgKG1hcHBpbmcgJiYgIW1hcHBpbmdfbWFwcGVkKG1hcHBpbmcpKQorCQlzZXRfYml0KFBHX2RjYWNoZV9kaXJ0eSwgJnBhZ2UtPmZsYWdzKTsKKwllbHNlCiAJCV9fZmx1c2hfZGNhY2hlX3BhZ2UoUEhZU0FERFIocGFnZV9hZGRyZXNzKHBhZ2UpKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vZmF1bHQuYyBiL2FyY2gvc2gvbW0vZmF1bHQuYwppbmRleCA3MTZlYmY1Li5mYTVkN2YwIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9zaC9tbS9mYXVsdC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20va2dkYi5oPgogCiBleHRlcm4gdm9pZCBkaWUoY29uc3QgY2hhciAqLHN0cnVjdCBwdF9yZWdzICosbG9uZyk7CkBAIC0yMjQsMyArMjI1LDg5IEBACiAJaWYgKCF1c2VyX21vZGUocmVncykpCiAJCWdvdG8gbm9fY29udGV4dDsKIH0KKworI2lmZGVmIENPTkZJR19TSF9TVE9SRV9RVUVVRVMKKy8qCisgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGZvciB0aGUgU0gtNCBzdG9yZSBxdWV1ZXMsIGFzIHBhZ2VzIGZvciB0aGlzCisgKiBzcGFjZSBzdGlsbCBuZWVkIHRvIGJlIGZhdWx0ZWQgaW4gYmVmb3JlIGl0J3MgcG9zc2libGUgdG8gZmx1c2ggdGhlCisgKiBzdG9yZSBxdWV1ZSBjYWNoZSBmb3Igd3JpdGVvdXQgdG8gdGhlIHJlbWFwcGVkIHJlZ2lvbi4KKyAqLworI2RlZmluZSBQM19BRERSX01BWAkJKFA0U0VHX1NUT1JFX1FVRSArIDB4MDQwMDAwMDApCisjZWxzZQorI2RlZmluZSBQM19BRERSX01BWAkJUDRTRUcKKyNlbmRpZgorCisvKgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqLworYXNtbGlua2FnZSBpbnQgX19rcHJvYmVzIF9fZG9fcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJIHVuc2lnbmVkIGxvbmcgd3JpdGVhY2Nlc3MsCisJCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJcGdkX3QgKnBnZDsKKwlwdWRfdCAqcHVkOworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKwlwdGVfdCBlbnRyeTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXNwaW5sb2NrX3QgKnB0bDsKKwlpbnQgcmV0ID0gMTsKKworI2lmZGVmIENPTkZJR19TSF9LR0RCCisJaWYgKGtnZGJfbm9mYXVsdCAmJiBrZ2RiX2J1c19lcnJfaG9vaykKKwkJa2dkYl9idXNfZXJyX2hvb2soKTsKKyNlbmRpZgorCisJLyoKKwkgKiBXZSBkb24ndCB0YWtlIHBhZ2UgZmF1bHRzIGZvciBQMSwgUDIsIGFuZCBwYXJ0cyBvZiBQNCwgdGhlc2UKKwkgKiBhcmUgYWx3YXlzIG1hcHBlZCwgd2hldGhlciBpdCBiZSBkdWUgdG8gbGVnYWN5IGJlaGF2aW91ciBpbgorCSAqIDI5LWJpdCBtb2RlLCBvciBkdWUgdG8gUE1CIGNvbmZpZ3VyYXRpb24gaW4gMzItYml0IG1vZGUuCisJICovCisJaWYgKGFkZHJlc3MgPj0gUDNTRUcgJiYgYWRkcmVzcyA8IFAzX0FERFJfTUFYKSB7CisJCXBnZCA9IHBnZF9vZmZzZXRfayhhZGRyZXNzKTsKKwkJbW0gPSBOVUxMOworCX0gZWxzZSB7CisJCWlmICh1bmxpa2VseShhZGRyZXNzID49IFRBU0tfU0laRSB8fCAhbW0pKQorCQkJcmV0dXJuIDE7CisKKwkJcGdkID0gcGdkX29mZnNldChtbSwgYWRkcmVzcyk7CisJfQorCisJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHJlc3MpOworCWlmIChwdWRfbm9uZV9vcl9jbGVhcl9iYWQocHVkKSkKKwkJcmV0dXJuIDE7CisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHJlc3MpOworCWlmIChwbWRfbm9uZV9vcl9jbGVhcl9iYWQocG1kKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAobW0pCisJCXB0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgJnB0bCk7CisJZWxzZQorCQlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHJlc3MpOworCisJZW50cnkgPSAqcHRlOworCWlmICh1bmxpa2VseShwdGVfbm9uZShlbnRyeSkgfHwgcHRlX25vdF9wcmVzZW50KGVudHJ5KSkpCisJCWdvdG8gdW5sb2NrOworCWlmICh1bmxpa2VseSh3cml0ZWFjY2VzcyAmJiAhcHRlX3dyaXRlKGVudHJ5KSkpCisJCWdvdG8gdW5sb2NrOworCisJaWYgKHdyaXRlYWNjZXNzKQorCQllbnRyeSA9IHB0ZV9ta2RpcnR5KGVudHJ5KTsKKwllbnRyeSA9IHB0ZV9ta3lvdW5nKGVudHJ5KTsKKworI2lmZGVmIENPTkZJR19DUFVfU0g0CisJLyoKKwkgKiBJVExCIGlzIG5vdCBhZmZlY3RlZCBieSAibGR0bGIiIGluc3RydWN0aW9uLgorCSAqIFNvLCB3ZSBuZWVkIHRvIGZsdXNoIHRoZSBlbnRyeSBieSBvdXJzZWx2ZXMuCisJICovCisJbG9jYWxfZmx1c2hfdGxiX29uZShnZXRfYXNpZCgpLCBhZGRyZXNzICYgUEFHRV9NQVNLKTsKKyNlbmRpZgorCisJc2V0X3B0ZShwdGUsIGVudHJ5KTsKKwl1cGRhdGVfbW11X2NhY2hlKE5VTEwsIGFkZHJlc3MsIGVudHJ5KTsKKwlyZXQgPSAwOwordW5sb2NrOgorCWlmIChtbSkKKwkJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaW5pdC5jIGIvYXJjaC9zaC9tbS9pbml0LmMKaW5kZXggYmYwYzI2My4uYWU5NTdhOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pbml0LmMKKysrIGIvYXJjaC9zaC9tbS9pbml0LmMKQEAgLTM5LDExICszOSw2IEBACiBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbW11X2dhdGhlciwgbW11X2dhdGhlcnMpOwogcGdkX3Qgc3dhcHBlcl9wZ19kaXJbUFRSU19QRVJfUEdEXTsKIAotLyoKLSAqIENhY2hlIG9mIE1NVSBjb250ZXh0IGxhc3QgdXNlZC4KLSAqLwotdW5zaWduZWQgbG9uZyBtbXVfY29udGV4dF9jYWNoZSA9IE5PX0NPTlRFWFQ7Ci0KICNpZmRlZiBDT05GSUdfTU1VCiAvKiBJdCdkIGJlIGdvb2QgaWYgdGhlc2UgbGluZXMgd2VyZSBpbiB0aGUgc3RhbmRhcmQgaGVhZGVyIGZpbGUuICovCiAjZGVmaW5lIFNUQVJUX1BGTgkoTk9ERV9EQVRBKDApLT5iZGF0YS0+bm9kZV9ib290X3N0YXJ0ID4+IFBBR0VfU0hJRlQpCkBAIC0xMTEsNyArMTA2LDcgQEAKIAogCXNldF9wdGUocHRlLCBwZm5fcHRlKHBoeXMgPj4gUEFHRV9TSElGVCwgcHJvdCkpOwogCi0JX19mbHVzaF90bGJfcGFnZShnZXRfYXNpZCgpLCBhZGRyKTsKKwlmbHVzaF90bGJfb25lKGdldF9hc2lkKCksIGFkZHIpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9pb3JlbWFwLmMgYi9hcmNoL3NoL21tL2lvcmVtYXAuYwppbmRleCA5MGI0OTRhLi5iZTAzZDc0IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2lvcmVtYXAuYworKysgYi9hcmNoL3NoL21tL2lvcmVtYXAuYwpAQCAtNDUsMTIgKzQ1LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKgotCSAqIERvbid0IHJlbWFwIHRoZSBsb3cgUENJL0lTQSBhcmVhLCBpdCdzIGFsd2F5cyBtYXBwZWQuLgotCSAqLwotCWlmIChwaHlzX2FkZHIgPj0gMHhBMDAwMCAmJiBsYXN0X2FkZHIgPCAweDEwMDAwMCkKLQkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwaHlzX3RvX3ZpcnQocGh5c19hZGRyKTsKLQotCS8qCiAJICogSWYgd2UncmUgb24gYW4gU0g3NzUxIG9yIFNINzc4MCBQQ0kgY29udHJvbGxlciwgUENJIG1lbW9yeSBpcwogCSAqIG1hcHBlZCBhdCB0aGUgZW5kIG9mIHRoZSBhZGRyZXNzIHNwYWNlICh0eXBpY2FsbHkgMHhmZDAwMDAwMCkKIAkgKiBpbiBhIG5vbi10cmFuc2xhdGFibGUgYXJlYSwgc28gbWFwcGluZyB0aHJvdWdoIHBhZ2UgdGFibGVzIGZvcgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9wZy1zaDQuYyBiL2FyY2gvc2gvbW0vcGctc2g0LmMKaW5kZXggM2Y5OGQyYS4uOTY5ZWZlY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vcGctc2g0LmMKKysrIGIvYXJjaC9zaC9tbS9wZy1zaDQuYwpAQCAtMTMsNyArMTMsNyBAQAogCiBleHRlcm4gc3RydWN0IG11dGV4IHAzbWFwX211dGV4W107CiAKLSNkZWZpbmUgQ0FDSEVfQUxJQVMgKGNwdV9kYXRhLT5kY2FjaGUuYWxpYXNfbWFzaykKKyNkZWZpbmUgQ0FDSEVfQUxJQVMgKGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmFsaWFzX21hc2spCiAKIC8qCiAgKiBjbGVhcl91c2VyX3BhZ2UKQEAgLTIzLDcgKzIzLDYgQEAKICAqLwogdm9pZCBjbGVhcl91c2VyX3BhZ2Uodm9pZCAqdG8sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JX19zZXRfYml0KFBHX21hcHBlZCwgJnBhZ2UtPmZsYWdzKTsKIAlpZiAoKChhZGRyZXNzIF4gKHVuc2lnbmVkIGxvbmcpdG8pICYgQ0FDSEVfQUxJQVMpID09IDApCiAJCWNsZWFyX3BhZ2UodG8pOwogCWVsc2UgewpAQCAtNDAsNyArMzksNyBAQAogCQltdXRleF9sb2NrKCZwM21hcF9tdXRleFsoYWRkcmVzcyAmIENBQ0hFX0FMSUFTKT4+MTJdKTsKIAkJc2V0X3B0ZShwdGUsIGVudHJ5KTsKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlfX2ZsdXNoX3RsYl9wYWdlKGdldF9hc2lkKCksIHAzX2FkZHIpOworCQlmbHVzaF90bGJfb25lKGdldF9hc2lkKCksIHAzX2FkZHIpOwogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCXVwZGF0ZV9tbXVfY2FjaGUoTlVMTCwgcDNfYWRkciwgZW50cnkpOwogCQlfX2NsZWFyX3VzZXJfcGFnZSgodm9pZCAqKXAzX2FkZHIsIHRvKTsKQEAgLTU5LDcgKzU4LDYgQEAKIHZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKIAkJICAgIHN0cnVjdCBwYWdlICpwYWdlKQogewotCV9fc2V0X2JpdChQR19tYXBwZWQsICZwYWdlLT5mbGFncyk7CiAJaWYgKCgoYWRkcmVzcyBeICh1bnNpZ25lZCBsb25nKXRvKSAmIENBQ0hFX0FMSUFTKSA9PSAwKQogCQljb3B5X3BhZ2UodG8sIGZyb20pOwogCWVsc2UgewpAQCAtNzYsNyArNzQsNyBAQAogCQltdXRleF9sb2NrKCZwM21hcF9tdXRleFsoYWRkcmVzcyAmIENBQ0hFX0FMSUFTKT4+MTJdKTsKIAkJc2V0X3B0ZShwdGUsIGVudHJ5KTsKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlfX2ZsdXNoX3RsYl9wYWdlKGdldF9hc2lkKCksIHAzX2FkZHIpOworCQlmbHVzaF90bGJfb25lKGdldF9hc2lkKCksIHAzX2FkZHIpOwogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCXVwZGF0ZV9tbXVfY2FjaGUoTlVMTCwgcDNfYWRkciwgZW50cnkpOwogCQlfX2NvcHlfdXNlcl9wYWdlKCh2b2lkICopcDNfYWRkciwgZnJvbSwgdG8pOwpAQCAtODQsMjMgKzgyLDMgQEAKIAkJbXV0ZXhfdW5sb2NrKCZwM21hcF9tdXRleFsoYWRkcmVzcyAmIENBQ0hFX0FMSUFTKT4+MTJdKTsKIAl9CiB9Ci0KLS8qCi0gKiBGb3IgU0gtNCwgd2UgaGF2ZSBvdXIgb3duIGltcGxlbWVudGF0aW9uIGZvciBwdGVwX2dldF9hbmRfY2xlYXIKLSAqLwotaW5saW5lIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCkKLXsKLQlwdGVfdCBwdGUgPSAqcHRlcDsKLQotCXB0ZV9jbGVhcihtbSwgYWRkciwgcHRlcCk7Ci0JaWYgKCFwdGVfbm90X3ByZXNlbnQocHRlKSkgewotCQl1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ocHRlKTsKLQkJaWYgKHBmbl92YWxpZChwZm4pKSB7Ci0JCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHBmbik7Ci0JCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKLQkJCWlmICghbWFwcGluZyB8fCAhbWFwcGluZ193cml0YWJseV9tYXBwZWQobWFwcGluZykpCi0JCQkJX19jbGVhcl9iaXQoUEdfbWFwcGVkLCAmcGFnZS0+ZmxhZ3MpOwotCQl9Ci0JfQotCXJldHVybiBwdGU7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL3BnLXNoNzcwNS5jIGIvYXJjaC9zaC9tbS9wZy1zaDc3MDUuYwppbmRleCBmZjllY2U5Li44ODdhYjlkIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL3BnLXNoNzcwNS5jCisrKyBiL2FyY2gvc2gvbW0vcGctc2g3NzA1LmMKQEAgLTcsOSArNyw3IEBACiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTQ1LDEzICs0MywxMyBAQAogCiAJCXAgPSBfX3BhKHAxX2JlZ2luKTsKIAotCSAgICAgICAgd2F5cyA9IGNwdV9kYXRhLT5kY2FjaGUud2F5czsKKwkgICAgICAgIHdheXMgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzOwogCQlhZGRyID0gQ0FDSEVfT0NfQUREUkVTU19BUlJBWTsKIAogCQlkbyB7CiAJCQl1bnNpZ25lZCBsb25nIGRhdGE7CiAKLQkJCWFkZHIgfD0gKHYgJiBjcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X21hc2spOworCQkJYWRkciB8PSAodiAmIGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X21hc2spOwogCiAJCQlkYXRhID0gY3RybF9pbmwoYWRkcik7CiAJCQlpZiAoKGRhdGEgJiBDQUNIRV9QSFlTQUREUl9NQVNLKSA9PQpAQCAtNjAsNyArNTgsNyBAQAogCQkJCWN0cmxfb3V0bChkYXRhLCBhZGRyKTsKIAkJCX0KIAotCQkJYWRkciArPSBjcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyOworCQkJYWRkciArPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jcjsKIAkJfSB3aGlsZSAoLS13YXlzKTsKIAogCQlwMV9iZWdpbiArPSBMMV9DQUNIRV9CWVRFUzsKQEAgLTc2LDcgKzc0LDYgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHZpcnRfdG9fcGFnZSh0byk7CiAKLQlfX3NldF9iaXQoUEdfbWFwcGVkLCAmcGFnZS0+ZmxhZ3MpOwogCWlmICgoKGFkZHJlc3MgXiAodW5zaWduZWQgbG9uZyl0bykgJiBDQUNIRV9BTElBUykgPT0gMCkgewogCQljbGVhcl9wYWdlKHRvKTsKIAkJX19mbHVzaF93YmFja19yZWdpb24odG8sIFBBR0VfU0laRSk7CkBAIC05NSwxMiArOTIsMTEgQEAKICAqIEBmcm9tOiBQMSBhZGRyZXNzCiAgKiBAYWRkcmVzczogVTAgYWRkcmVzcyB0byBiZSBtYXBwZWQKICAqLwotdm9pZCBjb3B5X3VzZXJfcGFnZSh2b2lkICp0bywgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgcGFnZSAqcGcpCit2b2lkIGNvcHlfdXNlcl9wYWdlKHZvaWQgKnRvLCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCSAgICBzdHJ1Y3QgcGFnZSAqcGcpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UodG8pOwogCi0KLQlfX3NldF9iaXQoUEdfbWFwcGVkLCAmcGFnZS0+ZmxhZ3MpOwogCWlmICgoKGFkZHJlc3MgXiAodW5zaWduZWQgbG9uZyl0bykgJiBDQUNIRV9BTElBUykgPT0gMCkgewogCQljb3B5X3BhZ2UodG8sIGZyb20pOwogCQlfX2ZsdXNoX3diYWNrX3JlZ2lvbih0bywgUEFHRV9TSVpFKTsKQEAgLTExMiwyNiArMTA4LDMgQEAKIAkJX19mbHVzaF93YmFja19yZWdpb24odG8sIFBBR0VfU0laRSk7CiAJfQogfQotCi0vKgotICogRm9yIFNINzcwNSwgd2UgaGF2ZSBvdXIgb3duIGltcGxlbWVudGF0aW9uIGZvciBwdGVwX2dldF9hbmRfY2xlYXIKLSAqIENvcGllZCBmcm9tIHBnLXNoNC5jCi0gKi8KLWlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JcHRlX3QgcHRlID0gKnB0ZXA7Ci0KLQlwdGVfY2xlYXIobW0sIGFkZHIsIHB0ZXApOwotCWlmICghcHRlX25vdF9wcmVzZW50KHB0ZSkpIHsKLQkJdW5zaWduZWQgbG9uZyBwZm4gPSBwdGVfcGZuKHB0ZSk7Ci0JCWlmIChwZm5fdmFsaWQocGZuKSkgewotCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwotCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7Ci0JCQlpZiAoIW1hcHBpbmcgfHwgIW1hcHBpbmdfd3JpdGFibHlfbWFwcGVkKG1hcHBpbmcpKQotCQkJCV9fY2xlYXJfYml0KFBHX21hcHBlZCwgJnBhZ2UtPmZsYWdzKTsKLQkJfQotCX0KLQotCXJldHVybiBwdGU7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vdGxiLWZsdXNoLmMgYi9hcmNoL3NoL21tL3RsYi1mbHVzaC5jCmluZGV4IDczZWM3ZjYuLmQyZjdiNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vdGxiLWZsdXNoLmMKKysrIGIvYXJjaC9zaC9tbS90bGItZmx1c2guYwpAQCAtMiwyNCArMiwyOCBAQAogICogVExCIGZsdXNoaW5nIG9wZXJhdGlvbnMgZm9yIFNIIHdpdGggYW4gTU1VLgogICoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTkgIE5paWJlIFl1dGFrYQotICogIENvcHlyaWdodCAoQykgMjAwMyAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgIFBhdWwgTXVuZHQKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCi12b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHBhZ2UpCit2b2lkIGxvY2FsX2ZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHBhZ2UpCiB7Ci0JaWYgKHZtYS0+dm1fbW0gJiYgdm1hLT52bV9tbS0+Y29udGV4dC5pZCAhPSBOT19DT05URVhUKSB7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICh2bWEtPnZtX21tICYmIGNwdV9jb250ZXh0KGNwdSwgdm1hLT52bV9tbSkgIT0gTk9fQ09OVEVYVCkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQl1bnNpZ25lZCBsb25nIGFzaWQ7CiAJCXVuc2lnbmVkIGxvbmcgc2F2ZWRfYXNpZCA9IE1NVV9OT19BU0lEOwogCi0JCWFzaWQgPSB2bWEtPnZtX21tLT5jb250ZXh0LmlkICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLOworCQlhc2lkID0gY3B1X2FzaWQoY3B1LCB2bWEtPnZtX21tKTsKIAkJcGFnZSAmPSBQQUdFX01BU0s7CiAKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtMjcsMzMgKzMxLDM0IEBACiAJCQlzYXZlZF9hc2lkID0gZ2V0X2FzaWQoKTsKIAkJCXNldF9hc2lkKGFzaWQpOwogCQl9Ci0JCV9fZmx1c2hfdGxiX3BhZ2UoYXNpZCwgcGFnZSk7CisJCWxvY2FsX2ZsdXNoX3RsYl9vbmUoYXNpZCwgcGFnZSk7CiAJCWlmIChzYXZlZF9hc2lkICE9IE1NVV9OT19BU0lEKQogCQkJc2V0X2FzaWQoc2F2ZWRfYXNpZCk7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiB9CiAKLXZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQordm9pZCBsb2NhbF9mbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkgICB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCWlmIChtbS0+Y29udGV4dC5pZCAhPSBOT19DT05URVhUKSB7CisJaWYgKGNwdV9jb250ZXh0KGNwdSwgbW0pICE9IE5PX0NPTlRFWFQpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJaW50IHNpemU7CiAKIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQlzaXplID0gKGVuZCAtIHN0YXJ0ICsgKFBBR0VfU0laRSAtIDEpKSA+PiBQQUdFX1NISUZUOwogCQlpZiAoc2l6ZSA+IChNTVVfTlRMQl9FTlRSSUVTLzQpKSB7IC8qIFRvbyBtYW55IFRMQiB0byBmbHVzaCAqLwotCQkJbW0tPmNvbnRleHQuaWQgPSBOT19DT05URVhUOworCQkJY3B1X2NvbnRleHQoY3B1LCBtbSkgPSBOT19DT05URVhUOwogCQkJaWYgKG1tID09IGN1cnJlbnQtPm1tKQotCQkJCWFjdGl2YXRlX2NvbnRleHQobW0pOworCQkJCWFjdGl2YXRlX2NvbnRleHQobW0sIGNwdSk7CiAJCX0gZWxzZSB7CiAJCQl1bnNpZ25lZCBsb25nIGFzaWQ7CiAJCQl1bnNpZ25lZCBsb25nIHNhdmVkX2FzaWQgPSBNTVVfTk9fQVNJRDsKIAotCQkJYXNpZCA9IG1tLT5jb250ZXh0LmlkICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLOworCQkJYXNpZCA9IGNwdV9hc2lkKGNwdSwgbW0pOwogCQkJc3RhcnQgJj0gUEFHRV9NQVNLOwogCQkJZW5kICs9IChQQUdFX1NJWkUgLSAxKTsKIAkJCWVuZCAmPSBQQUdFX01BU0s7CkBAIC02Miw3ICs2Nyw3IEBACiAJCQkJc2V0X2FzaWQoYXNpZCk7CiAJCQl9CiAJCQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQkJCQlfX2ZsdXNoX3RsYl9wYWdlKGFzaWQsIHN0YXJ0KTsKKwkJCQlsb2NhbF9mbHVzaF90bGJfb25lKGFzaWQsIHN0YXJ0KTsKIAkJCQlzdGFydCArPSBQQUdFX1NJWkU7CiAJCQl9CiAJCQlpZiAoc2F2ZWRfYXNpZCAhPSBNTVVfTk9fQVNJRCkKQEAgLTcyLDI2ICs3NywyNyBAQAogCX0KIH0KIAotdm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQordm9pZCBsb2NhbF9mbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogeworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgc2l6ZTsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlzaXplID0gKGVuZCAtIHN0YXJ0ICsgKFBBR0VfU0laRSAtIDEpKSA+PiBQQUdFX1NISUZUOwogCWlmIChzaXplID4gKE1NVV9OVExCX0VOVFJJRVMvNCkpIHsgLyogVG9vIG1hbnkgVExCIHRvIGZsdXNoICovCi0JCWZsdXNoX3RsYl9hbGwoKTsKKwkJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGxvbmcgYXNpZDsKIAkJdW5zaWduZWQgbG9uZyBzYXZlZF9hc2lkID0gZ2V0X2FzaWQoKTsKIAotCQlhc2lkID0gaW5pdF9tbS5jb250ZXh0LmlkICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLOworCQlhc2lkID0gY3B1X2FzaWQoY3B1LCAmaW5pdF9tbSk7CiAJCXN0YXJ0ICY9IFBBR0VfTUFTSzsKIAkJZW5kICs9IChQQUdFX1NJWkUgLSAxKTsKIAkJZW5kICY9IFBBR0VfTUFTSzsKIAkJc2V0X2FzaWQoYXNpZCk7CiAJCXdoaWxlIChzdGFydCA8IGVuZCkgewotCQkJX19mbHVzaF90bGJfcGFnZShhc2lkLCBzdGFydCk7CisJCQlsb2NhbF9mbHVzaF90bGJfb25lKGFzaWQsIHN0YXJ0KTsKIAkJCXN0YXJ0ICs9IFBBR0VfU0laRTsKIAkJfQogCQlzZXRfYXNpZChzYXZlZF9hc2lkKTsKQEAgLTk5LDIyICsxMDUsMjQgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQordm9pZCBsb2NhbF9mbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwogCS8qIEludmFsaWRhdGUgYWxsIFRMQiBvZiB0aGlzIHByb2Nlc3MuICovCiAJLyogSW5zdGVhZCBvZiBpbnZhbGlkYXRpbmcgZWFjaCBUTEIsIHdlIGdldCBuZXcgTU1VIGNvbnRleHQuICovCi0JaWYgKG1tLT5jb250ZXh0LmlkICE9IE5PX0NPTlRFWFQpIHsKKwlpZiAoY3B1X2NvbnRleHQoY3B1LCBtbSkgIT0gTk9fQ09OVEVYVCkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJbW0tPmNvbnRleHQuaWQgPSBOT19DT05URVhUOworCQljcHVfY29udGV4dChjcHUsIG1tKSA9IE5PX0NPTlRFWFQ7CiAJCWlmIChtbSA9PSBjdXJyZW50LT5tbSkKLQkJCWFjdGl2YXRlX2NvbnRleHQobW0pOworCQkJYWN0aXZhdGVfY29udGV4dChtbSwgY3B1KTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KIH0KIAotdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCit2b2lkIGxvY2FsX2ZsdXNoX3RsYl9hbGwodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBzdGF0dXM7CiAKQEAgLTEzMiwzICsxNDAsNTQgQEAKIAljdHJsX2JhcnJpZXIoKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CisKK3ZvaWQgdXBkYXRlX21tdV9jYWNoZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCBwdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHB0ZXZhbDsKKwl1bnNpZ25lZCBsb25nIHZwbjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ocHRlKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKworCWlmICghcGZuX3ZhbGlkKHBmbikpCisJCXJldHVybjsKKworCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCW1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CisJaWYgKG1hcHBpbmcpIHsKKwkJdW5zaWduZWQgbG9uZyBwaHlzID0gcHRlX3ZhbChwdGUpICYgUFRFX1BIWVNfTUFTSzsKKwkJaW50IGRpcnR5ID0gdGVzdF9hbmRfY2xlYXJfYml0KFBHX2RjYWNoZV9kaXJ0eSwgJnBhZ2UtPmZsYWdzKTsKKworCQlpZiAoZGlydHkpCisJCQlfX2ZsdXNoX3diYWNrX3JlZ2lvbigodm9pZCAqKVAxU0VHQUREUihwaHlzKSwKKwkJCQkJICAgICBQQUdFX1NJWkUpOworCX0KKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCS8qIFNldCBQVEVIIHJlZ2lzdGVyICovCisJdnBuID0gKGFkZHJlc3MgJiBNTVVfVlBOX01BU0spIHwgZ2V0X2FzaWQoKTsKKwljdHJsX291dGwodnBuLCBNTVVfUFRFSCk7CisKKwlwdGV2YWwgPSBwdGVfdmFsKHB0ZSk7CisKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19QVEVBCisJLyogU2V0IFBURUEgcmVnaXN0ZXIgKi8KKwkvKiBUT0RPOiBtYWtlIHRoaXMgbG9vayBsZXNzIGhhY2t5ICovCisJY3RybF9vdXRsKCgocHRldmFsID4+IDI4KSAmIDB4ZSkgfCAocHRldmFsICYgMHgxKSwgTU1VX1BURUEpOworI2VuZGlmCisKKwkvKiBTZXQgUFRFTCByZWdpc3RlciAqLworCXB0ZXZhbCAmPSBfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLOyAvKiBkcm9wIHNvZnR3YXJlIGZsYWdzICovCisjaWYgZGVmaW5lZChDT05GSUdfU0hfV1JJVEVUSFJPVUdIKSAmJiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQorCXB0ZXZhbCB8PSBfUEFHRV9XVDsKKyNlbmRpZgorCS8qIGNvbnZlbmllbnRseSwgd2Ugd2FudCBhbGwgdGhlIHNvZnR3YXJlIGZsYWdzIHRvIGJlIDAgYW55d2F5ICovCisJY3RybF9vdXRsKHB0ZXZhbCwgTU1VX1BURUwpOworCisJLyogTG9hZCB0aGUgVExCICovCisJYXNtIHZvbGF0aWxlKCJsZHRsYiI6IC8qIG5vIG91dHB1dCAqLyA6IC8qIG5vIGlucHV0ICovIDogIm1lbW9yeSIpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vdGxiLW5vbW11LmMgYi9hcmNoL3NoL21tL3RsYi1ub21tdS5jCmluZGV4IGU1NWNmZWEuLjFjY2NhN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vdGxiLW5vbW11LmMKKysrIGIvYXJjaC9zaC9tbS90bGItbm9tbXUuYwpAQCAtMTMsMzkgKzEzLDMzIEBACiAvKgogICogTm90aGluZyB0b28gdGVycmlibHkgZXhjaXRpbmcgaGVyZSAuLgogICovCi0KLXZvaWQgZmx1c2hfdGxiKHZvaWQpCit2b2lkIGxvY2FsX2ZsdXNoX3RsYl9hbGwodm9pZCkKIHsKIAlCVUcoKTsKIH0KIAotdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCit2b2lkIGxvY2FsX2ZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlCVUcoKTsKIH0KIAotdm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JQlVHKCk7Ci19Ci0KLXZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAordm9pZCBsb2NhbF9mbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJQlVHKCk7CiB9CiAKLXZvaWQgZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgcGFnZSkKK3ZvaWQgbG9jYWxfZmx1c2hfdGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgcGFnZSkKIHsKIAlCVUcoKTsKIH0KIAotdm9pZCBfX2ZsdXNoX3RsYl9wYWdlKHVuc2lnbmVkIGxvbmcgYXNpZCwgdW5zaWduZWQgbG9uZyBwYWdlKQordm9pZCBsb2NhbF9mbHVzaF90bGJfb25lKHVuc2lnbmVkIGxvbmcgYXNpZCwgdW5zaWduZWQgbG9uZyBwYWdlKQogewogCUJVRygpOwogfQogCi12b2lkIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit2b2lkIGxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJQlVHKCk7CiB9CkBAIC01NSw0ICs0OSwzIEBACiB7CiAJQlVHKCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vdGxiLXNoMy5jIGIvYXJjaC9zaC9tbS90bGItc2gzLmMKaW5kZXggNDZiMDllMi4uZTVlNzZlYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS90bGItc2gzLmMKKysrIGIvYXJjaC9zaC9tbS90bGItc2gzLmMKQEAgLTgsNzEgKzgsMTEgQEAKICAqCiAgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KICAqLwotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotdm9pZCB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwKLQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCBwdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHB0ZXZhbDsKLQl1bnNpZ25lZCBsb25nIHZwbjsKLQotCS8qIFB0cmFjZSBtYXkgY2FsbCB0aGlzIHJvdXRpbmUuICovCi0JaWYgKHZtYSAmJiBjdXJyZW50LT5hY3RpdmVfbW0gIT0gdm1hLT52bV9tbSkKLQkJcmV0dXJuOwotCi0jaWYgZGVmaW5lZChDT05GSUdfU0g3NzA1X0NBQ0hFXzMyS0IpCi0JewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB0ZV9wYWdlKHB0ZSk7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihwdGUpOwotCi0JCWlmIChwZm5fdmFsaWQocGZuKSAmJiAhdGVzdF9iaXQoUEdfbWFwcGVkLCAmcGFnZS0+ZmxhZ3MpKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHBoeXMgPSBwdGVfdmFsKHB0ZSkgJiBQVEVfUEhZU19NQVNLOwotCi0JCQlfX2ZsdXNoX3diYWNrX3JlZ2lvbigodm9pZCAqKVAxU0VHQUREUihwaHlzKSwKLQkJCQkJICAgICBQQUdFX1NJWkUpOwotCQkJX19zZXRfYml0KFBHX21hcHBlZCwgJnBhZ2UtPmZsYWdzKTsKLQkJfQotCX0KLSNlbmRpZgotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyogU2V0IFBURUggcmVnaXN0ZXIgKi8KLQl2cG4gPSAoYWRkcmVzcyAmIE1NVV9WUE5fTUFTSykgfCBnZXRfYXNpZCgpOwotCWN0cmxfb3V0bCh2cG4sIE1NVV9QVEVIKTsKLQotCXB0ZXZhbCA9IHB0ZV92YWwocHRlKTsKLQotCS8qIFNldCBQVEVMIHJlZ2lzdGVyICovCi0JcHRldmFsICY9IF9QQUdFX0ZMQUdTX0hBUkRXQVJFX01BU0s7IC8qIGRyb3Agc29mdHdhcmUgZmxhZ3MgKi8KLQkvKiBjb252ZW5pZW50bHksIHdlIHdhbnQgYWxsIHRoZSBzb2Z0d2FyZSBmbGFncyB0byBiZSAwIGFueXdheSAqLwotCWN0cmxfb3V0bChwdGV2YWwsIE1NVV9QVEVMKTsKLQotCS8qIExvYWQgdGhlIFRMQiAqLwotCWFzbSB2b2xhdGlsZSgibGR0bGIiOiAvKiBubyBvdXRwdXQgKi8gOiAvKiBubyBpbnB1dCAqLyA6ICJtZW1vcnkiKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXZvaWQgX19mbHVzaF90bGJfcGFnZSh1bnNpZ25lZCBsb25nIGFzaWQsIHVuc2lnbmVkIGxvbmcgcGFnZSkKK3ZvaWQgbG9jYWxfZmx1c2hfdGxiX29uZSh1bnNpZ25lZCBsb25nIGFzaWQsIHVuc2lnbmVkIGxvbmcgcGFnZSkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHIsIGRhdGE7CiAJaW50IGksIHdheXMgPSBNTVVfTlRMQl9XQVlTOwpAQCAtODYsNyArMjYsNyBAQAogCWFkZHIgPSBNTVVfVExCX0FERFJFU1NfQVJSQVkgfCAocGFnZSAmIDB4MUYwMDApOwogCWRhdGEgPSAocGFnZSAmIDB4ZmZmZTAwMDApIHwgYXNpZDsgLyogVkFMSUQgYml0IGlzIG9mZiAqLwogCi0JaWYgKChjcHVfZGF0YS0+ZmxhZ3MgJiBDUFVfSEFTX01NVV9QQUdFX0FTU09DKSkgeworCWlmICgoY3VycmVudF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfTU1VX1BBR0VfQVNTT0MpKSB7CiAJCWFkZHIgfD0gTU1VX1BBR0VfQVNTT0NfQklUOwogCQl3YXlzID0gMTsJLyogd2UgYWxyZWFkeSBrbm93IHRoZSB3YXkgLi4gKi8KIAl9CkBAIC05NCw0ICszNCwzIEBACiAJZm9yIChpID0gMDsgaSA8IHdheXM7IGkrKykKIAkJY3RybF9vdXRsKGRhdGEsIGFkZHIgKyAoaSA8PCA4KSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vdGxiLXNoNC5jIGIvYXJjaC9zaC9tbS90bGItc2g0LmMKaW5kZXggODEyYjJkNS4uMjIxZTcwOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS90bGItc2g0LmMKKysrIGIvYXJjaC9zaC9tbS90bGItc2g0LmMKQEAgLTgsNzYgKzgsMTEgQEAKICAqCiAgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KICAqLwotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotdm9pZCB1cGRhdGVfbW11X2NhY2hlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSwKLQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCBwdGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBsb25nIHB0ZXZhbDsKLQl1bnNpZ25lZCBsb25nIHZwbjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIHBmbjsKLQotCS8qIFB0cmFjZSBtYXkgY2FsbCB0aGlzIHJvdXRpbmUuICovCi0JaWYgKHZtYSAmJiBjdXJyZW50LT5hY3RpdmVfbW0gIT0gdm1hLT52bV9tbSkKLQkJcmV0dXJuOwotCi0JcGZuID0gcHRlX3BmbihwdGUpOwotCWlmIChwZm5fdmFsaWQocGZuKSkgewotCQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQkJaWYgKCF0ZXN0X2JpdChQR19tYXBwZWQsICZwYWdlLT5mbGFncykpIHsKLQkJCXVuc2lnbmVkIGxvbmcgcGh5cyA9IHB0ZV92YWwocHRlKSAmIFBURV9QSFlTX01BU0s7Ci0JCQlfX2ZsdXNoX3diYWNrX3JlZ2lvbigodm9pZCAqKVAxU0VHQUREUihwaHlzKSwgUEFHRV9TSVpFKTsKLQkJCV9fc2V0X2JpdChQR19tYXBwZWQsICZwYWdlLT5mbGFncyk7Ci0JCX0KLQl9Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQkvKiBTZXQgUFRFSCByZWdpc3RlciAqLwotCXZwbiA9IChhZGRyZXNzICYgTU1VX1ZQTl9NQVNLKSB8IGdldF9hc2lkKCk7Ci0JY3RybF9vdXRsKHZwbiwgTU1VX1BURUgpOwotCi0JcHRldmFsID0gcHRlX3ZhbChwdGUpOwotCi0JLyogU2V0IFBURUEgcmVnaXN0ZXIgKi8KLQlpZiAoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19QVEVBKQotCQkvKiBUT0RPOiBtYWtlIHRoaXMgbG9vayBsZXNzIGhhY2t5ICovCi0JCWN0cmxfb3V0bCgoKHB0ZXZhbCA+PiAyOCkgJiAweGUpIHwgKHB0ZXZhbCAmIDB4MSksIE1NVV9QVEVBKTsKLQotCS8qIFNldCBQVEVMIHJlZ2lzdGVyICovCi0JcHRldmFsICY9IF9QQUdFX0ZMQUdTX0hBUkRXQVJFX01BU0s7IC8qIGRyb3Agc29mdHdhcmUgZmxhZ3MgKi8KLSNpZmRlZiBDT05GSUdfU0hfV1JJVEVUSFJPVUdICi0JcHRldmFsIHw9IF9QQUdFX1dUOwotI2VuZGlmCi0JLyogY29udmVuaWVudGx5LCB3ZSB3YW50IGFsbCB0aGUgc29mdHdhcmUgZmxhZ3MgdG8gYmUgMCBhbnl3YXkgKi8KLQljdHJsX291dGwocHRldmFsLCBNTVVfUFRFTCk7Ci0KLQkvKiBMb2FkIHRoZSBUTEIgKi8KLQlhc20gdm9sYXRpbGUoImxkdGxiIjogLyogbm8gb3V0cHV0ICovIDogLyogbm8gaW5wdXQgKi8gOiAibWVtb3J5Iik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi12b2lkIF9fZmx1c2hfdGxiX3BhZ2UodW5zaWduZWQgbG9uZyBhc2lkLCB1bnNpZ25lZCBsb25nIHBhZ2UpCit2b2lkIGxvY2FsX2ZsdXNoX3RsYl9vbmUodW5zaWduZWQgbG9uZyBhc2lkLCB1bnNpZ25lZCBsb25nIHBhZ2UpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyLCBkYXRhOwogCkBAIC05Myw0ICsyOCwzIEBACiAJY3RybF9vdXRsKGRhdGEsIGFkZHIpOwogCWJhY2tfdG9fUDEoKTsKIH0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9vcHJvZmlsZS9vcF9tb2RlbF9zaDc3NTAuYyBiL2FyY2gvc2gvb3Byb2ZpbGUvb3BfbW9kZWxfc2g3NzUwLmMKaW5kZXggMDEwNGU0NC4uZWJlZTdlMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9vcHJvZmlsZS9vcF9tb2RlbF9zaDc3NTAuYworKysgYi9hcmNoL3NoL29wcm9maWxlL29wX21vZGVsX3NoNzc1MC5jCkBAIC0yNTksNyArMjU5LDcgQEAKIAogaW50IF9faW5pdCBvcHJvZmlsZV9hcmNoX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKipvcHMpCiB7Ci0JaWYgKCEoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19QRVJGX0NPVU5URVIpKQorCWlmICghKGN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgJiBDUFVfSEFTX1BFUkZfQ09VTlRFUikpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc2g3NzUwX3BlcmZfY291bnRlcl9vcHMuY3B1X3R5cGUgPSAoY2hhciAqKWdldF9jcHVfc3VidHlwZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzIGIvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCmluZGV4IDA1NzE3NTUuLjRmZTBmOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKQEAgLTE2LDcgKzE2LDYgQEAKIEhENjQ0NjUJCQlIRDY0NDY1CiBTQVRVUk4JCQlTSF9TQVRVUk4KIERSRUFNQ0FTVAkJU0hfRFJFQU1DQVNUCi1CSUdTVVIJCQlTSF9CSUdTVVIKIE1QQzEyMTEJCQlTSF9NUEMxMjExCiBTTkFQR0VBUgkJU0hfU0VDVVJFRURHRTU0MTAKIEhTNzc1MVJWT0lQCQlTSF9IUzc3NTFSVk9JUApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jIGIvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCmluZGV4IDkyNWE2NTIuLmIyZTFmZDggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKQEAgLTk3LDIwICs5NywyMiBAQAogCiBzdGF0aWMgaW50IG5lZWRfcG9sbChzdHJ1Y3QgcG9sbGZkcyAqcG9sbHMsIGludCBuKQogewotCWlmKG4gPD0gcG9sbHMtPnNpemUpewotCQlwb2xscy0+dXNlZCA9IG47CisJc3RydWN0IHBvbGxmZCAqbmV3OworCisJaWYobiA8PSBwb2xscy0+c2l6ZSkKIAkJcmV0dXJuIDA7Ci0JfQotCWtmcmVlKHBvbGxzLT5wb2xsKTsKLQlwb2xscy0+cG9sbCA9IHVtX2ttYWxsb2NfYXRvbWljKG4gKiBzaXplb2Yoc3RydWN0IHBvbGxmZCkpOwotCWlmKHBvbGxzLT5wb2xsID09IE5VTEwpeworCisJbmV3ID0gdW1fa21hbGxvY19hdG9taWMobiAqIHNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CisJaWYobmV3ID09IE5VTEwpewogCQlwcmludGsoIm5lZWRfcG9sbCA6IGZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgcG9sbGZkc1xuIik7Ci0JCXBvbGxzLT5zaXplID0gMDsKLQkJcG9sbHMtPnVzZWQgPSAwOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CisKKwltZW1jcHkobmV3LCBwb2xscy0+cG9sbCwgcG9sbHMtPnVzZWQgKiBzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCWtmcmVlKHBvbGxzLT5wb2xsKTsKKworCXBvbGxzLT5wb2xsID0gbmV3OwogCXBvbGxzLT5zaXplID0gbjsKLQlwb2xscy0+dXNlZCA9IG47CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3MSwxNSArMTczLDE1IEBACiAJCQlnb3RvIG91dDsKIAl9CiAKLQluID0gY3VycmVudF9wb2xsLnVzZWQgKyAxOwotCWVyciA9IG5lZWRfcG9sbCgmbmV4dF9wb2xsLCBuKTsKKwluID0gY3VycmVudF9wb2xsLnVzZWQ7CisJZXJyID0gbmVlZF9wb2xsKCZuZXh0X3BvbGwsIG4gKyAxKTsKIAlpZihlcnIpCiAJCWdvdG8gb3V0OwogCi0JZm9yKGkgPSAwOyBpIDwgY3VycmVudF9wb2xsLnVzZWQ7IGkrKykKLQkJbmV4dF9wb2xsLnBvbGxbaV0gPSBjdXJyZW50X3BvbGwucG9sbFtpXTsKLQotCW5leHRfcG9sbC5wb2xsW24gLSAxXSA9ICpwOworCW1lbWNweShuZXh0X3BvbGwucG9sbCwgY3VycmVudF9wb2xsLnBvbGwsCisJICAgICAgIGN1cnJlbnRfcG9sbC51c2VkICogc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKwluZXh0X3BvbGwucG9sbFtuXSA9ICpwOworCW5leHRfcG9sbC51c2VkID0gbiArIDE7CiAJdXBkYXRlX3RocmVhZCgpOwogIG91dDoKIAlzaWdpb191bmxvY2soKTsKQEAgLTIxNCw2ICsyMTYsNyBAQAogCQlpZihwLT5mZCAhPSBmZCkKIAkJCW5leHRfcG9sbC5wb2xsW24rK10gPSAqcDsKIAl9CisJbmV4dF9wb2xsLnVzZWQgPSBjdXJyZW50X3BvbGwudXNlZCAtIDE7CiAKIAl1cGRhdGVfdGhyZWFkKCk7CiAgb3V0OgpAQCAtMzMxLDEwICszMzQsOSBAQAogCiAJc2lnaW9fbG9jaygpOwogCWVyciA9IG5lZWRfcG9sbCgmYWxsX3NpZ2lvX2ZkcywgYWxsX3NpZ2lvX2Zkcy51c2VkICsgMSk7Ci0JaWYoZXJyKXsKLQkJcHJpbnRrKCJtYXliZV9zaWdpb19icm9rZW4gLSBmYWlsZWQgdG8gYWRkIHBvbGxmZFxuIik7CisJaWYoZXJyKQogCQlnb3RvIG91dDsKLQl9CisKIAlhbGxfc2lnaW9fZmRzLnBvbGxbYWxsX3NpZ2lvX2Zkcy51c2VkKytdID0KIAkJKChzdHJ1Y3QgcG9sbGZkKSB7IC5mZCAgCT0gZmQsCiAJCQkJICAgLmV2ZW50cyAJPSByZWFkID8gUE9MTElOIDogUE9MTE9VVCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L0tjb25maWcgYi9hcmNoL3g4Nl82NC9LY29uZmlnCmluZGV4IDc5ODJjYmMuLjU2ZWIxNGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L0tjb25maWcKKysrIGIvYXJjaC94ODZfNjQvS2NvbmZpZwpAQCAtMjQsNiArMjQsMTQgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBHRU5FUklDX1RJTUUKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHRU5FUklDX1RJTUVfVlNZU0NBTEwKKwlib29sCisJZGVmYXVsdCB5CisKIGNvbmZpZyBaT05FX0RNQTMyCiAJYm9vbAogCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGFlMzk5NDUuLmJiNDdlODYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKQEAgLTgsNyArOCw3IEBACiAJCXB0cmFjZS5vIHRpbWUubyBpb3BvcnQubyBsZHQubyBzZXR1cC5vIGk4MjU5Lm8gc3lzX3g4Nl82NC5vIFwKIAkJeDg2NjRfa3N5bXMubyBpMzg3Lm8gc3lzY2FsbC5vIHZzeXNjYWxsLm8gXAogCQlzZXR1cDY0Lm8gYm9vdGZsYWcubyBlODIwLm8gcmVib290Lm8gcXVpcmtzLm8gaTgyMzcubyBcCi0JCXBjaS1kbWEubyBwY2ktbm9tbXUubyBhbHRlcm5hdGl2ZS5vCisJCXBjaS1kbWEubyBwY2ktbm9tbXUubyBhbHRlcm5hdGl2ZS5vIGhwZXQubyB0c2MubwogCiBvYmotJChDT05GSUdfU1RBQ0tUUkFDRSkJKz0gc3RhY2t0cmFjZS5vCiBvYmotJChDT05GSUdfWDg2X01DRSkJCSs9IG1jZS5vIHRoZXJtX3Rocm90Lm8KQEAgLTE5LDcgKzE5LDcgQEAKIG9iai0kKENPTkZJR19YODZfTVNSKQkJKz0gbXNyLm8KIG9iai0kKENPTkZJR19NSUNST0NPREUpCQkrPSBtaWNyb2NvZGUubwogb2JqLSQoQ09ORklHX1g4Nl9DUFVJRCkJCSs9IGNwdWlkLm8KLW9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubyBzbXBib290Lm8gdHJhbXBvbGluZS5vCitvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc21wYm9vdC5vIHRyYW1wb2xpbmUubyB0c2Nfc3luYy5vCiBvYmoteQkJCQkrPSBhcGljLm8gIG5taS5vCiBvYmoteQkJCQkrPSBpb19hcGljLm8gbXBwYXJzZS5vIFwKIAkJZ2VuYXBpYy5vIGdlbmFwaWNfY2x1c3Rlci5vIGdlbmFwaWNfZmxhdC5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYwppbmRleCAxMjRiMmQyLi43MjM0MTdkIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxhc20vaWRsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KIAogaW50IGFwaWNfbWFwcGVkOwpAQCAtNzYzLDcgKzc2NCw3IEBACiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJLyogd2FpdCBmb3IgaXJxIHNsaWNlICovCi0gCWlmICh2eHRpbWUuaHBldF9hZGRyZXNzICYmIGhwZXRfdXNlX3RpbWVyKSB7CisgCWlmIChocGV0X2FkZHJlc3MgJiYgaHBldF91c2VfdGltZXIpIHsKICAJCWludCB0cmlnZ2VyID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCk7CiAgCQl3aGlsZSAoaHBldF9yZWFkbChIUEVUX0NPVU5URVIpID49IHRyaWdnZXIpCiAgCQkJLyogZG8gbm90aGluZyAqLyA7CkBAIC03ODUsNyArNzg2LDcgQEAKIAkvKiBUdXJuIG9mZiBQSVQgaW50ZXJydXB0IGlmIHdlIHVzZSBBUElDIHRpbWVyIGFzIG1haW4gdGltZXIuCiAJICAgT25seSB3b3JrcyB3aXRoIHRoZSBQTSB0aW1lciByaWdodCBub3cKIAkgICBUQkQgZml4IGl0IGZvciBIUEVUIHRvby4gKi8KLQlpZiAodnh0aW1lLm1vZGUgPT0gVlhUSU1FX1BNVE1SICYmCisJaWYgKChwbXRtcl9pb3BvcnQgIT0gMCkgJiYKIAkJc21wX3Byb2Nlc3Nvcl9pZCgpID09IGJvb3RfY3B1X2lkICYmCiAJCWFwaWNfcnVuc19tYWluX3RpbWVyID09IDEgJiYKIAkJIWNwdV9pc3NldChib290X2NwdV9pZCwgdGltZXJfaW50ZXJydXB0X2Jyb2FkY2FzdF9pcGlfbWFzaykpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseS1xdWlya3MuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseS1xdWlya3MuYwppbmRleCBiZDMwZDEzLi44MDQ3ZWE4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHktcXVpcmtzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5LXF1aXJrcy5jCkBAIC01Myw3ICs1Myw5IEBACiAJCXJldHVybjsKIAogCW52aWRpYV9ocGV0X2RldGVjdGVkID0gMDsKLQlhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX0hQRVQsIG52aWRpYV9ocGV0X2NoZWNrKTsKKwlpZiAoYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19IUEVULCBudmlkaWFfaHBldF9jaGVjaykpCisJCXJldHVybjsKKwogCWlmIChudmlkaWFfaHBldF9kZXRlY3RlZCA9PSAwKSB7CiAJCWFjcGlfc2tpcF90aW1lcl9vdmVycmlkZSA9IDE7CiAJCXByaW50ayhLRVJOX0lORk8gIk52aWRpYSBib2FyZCAiCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaHBldC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2hwZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWEwZWRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2hwZXQuYwpAQCAtMCwwICsxLDUxMSBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2hwZXQuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisKK2ludCBub2hwZXQgX19pbml0ZGF0YTsKKwordW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7Cit1bnNpZ25lZCBsb25nIGhwZXRfcGVyaW9kOwkvKiBmc2VjcyAvIEhQRVQgY2xvY2sgKi8KK3Vuc2lnbmVkIGxvbmcgaHBldF90aWNrOwkvKiBIUEVUIGNsb2NrcyAvIGludGVycnVwdCAqLworCitpbnQgaHBldF91c2VfdGltZXI7CQkvKiBVc2UgY291bnRlciBvZiBocGV0IGZvciB0aW1lIGtlZXBpbmcsCisJCQkJICogb3RoZXJ3aXNlIFBJVAorCQkJCSAqLworCisjaWZkZWYJQ09ORklHX0hQRVQKK3N0YXRpYyBfX2luaXQgaW50IGxhdGVfaHBldF9pbml0KHZvaWQpCit7CisJc3RydWN0IGhwZXRfZGF0YQloZDsKKwl1bnNpZ25lZCBpbnQgCQludGltZXI7CisKKwlpZiAoIWhwZXRfYWRkcmVzcykKKyAgICAgICAgCXJldHVybiAwOworCisJbWVtc2V0KCZoZCwgMCwgc2l6ZW9mKGhkKSk7CisKKwludGltZXIgPSBocGV0X3JlYWRsKEhQRVRfSUQpOworCW50aW1lciA9IChudGltZXIgJiBIUEVUX0lEX05VTUJFUikgPj4gSFBFVF9JRF9OVU1CRVJfU0hJRlQ7CisJbnRpbWVyKys7CisKKwkvKgorCSAqIFJlZ2lzdGVyIHdpdGggZHJpdmVyLgorCSAqIFRpbWVyMCBhbmQgVGltZXIxIGlzIHVzZWQgYnkgcGxhdGZvcm0uCisJICovCisJaGQuaGRfcGh5c19hZGRyZXNzID0gaHBldF9hZGRyZXNzOworCWhkLmhkX2FkZHJlc3MgPSAodm9pZCBfX2lvbWVtICopZml4X3RvX3ZpcnQoRklYX0hQRVRfQkFTRSk7CisJaGQuaGRfbmlycXMgPSBudGltZXI7CisJaGQuaGRfZmxhZ3MgPSBIUEVUX0RBVEFfUExBVEZPUk07CisJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMCk7CisjaWZkZWYJQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKKwlocGV0X3Jlc2VydmVfdGltZXIoJmhkLCAxKTsKKyNlbmRpZgorCWhkLmhkX2lycVswXSA9IEhQRVRfTEVHQUNZXzgyNTQ7CisJaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOworCWlmIChudGltZXIgPiAyKSB7CisJCXN0cnVjdCBocGV0CQkqaHBldDsKKwkJc3RydWN0IGhwZXRfdGltZXIJKnRpbWVyOworCQlpbnQJCQlpOworCisJCWhwZXQgPSAoc3RydWN0IGhwZXQgKikgZml4X3RvX3ZpcnQoRklYX0hQRVRfQkFTRSk7CisJCXRpbWVyID0gJmhwZXQtPmhwZXRfdGltZXJzWzJdOworCQlmb3IgKGkgPSAyOyBpIDwgbnRpbWVyOyB0aW1lcisrLCBpKyspCisJCQloZC5oZF9pcnFbaV0gPSAodGltZXItPmhwZXRfY29uZmlnICYKKwkJCQkJVG5fSU5UX1JPVVRFX0NORl9NQVNLKSA+PgorCQkJCVRuX0lOVF9ST1VURV9DTkZfU0hJRlQ7CisKKwl9CisKKwlocGV0X2FsbG9jKCZoZCk7CisJcmV0dXJuIDA7Cit9Citmc19pbml0Y2FsbChsYXRlX2hwZXRfaW5pdCk7CisjZW5kaWYKKworaW50IGhwZXRfdGltZXJfc3RvcF9zZXRfZ28odW5zaWduZWQgbG9uZyB0aWNrKQoreworCXVuc2lnbmVkIGludCBjZmc7CisKKy8qCisgKiBTdG9wIHRoZSB0aW1lcnMgYW5kIHJlc2V0IHRoZSBtYWluIGNvdW50ZXIuCisgKi8KKworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOworCWNmZyAmPSB+KEhQRVRfQ0ZHX0VOQUJMRSB8IEhQRVRfQ0ZHX0xFR0FDWSk7CisJaHBldF93cml0ZWwoY2ZnLCBIUEVUX0NGRyk7CisJaHBldF93cml0ZWwoMCwgSFBFVF9DT1VOVEVSKTsKKwlocGV0X3dyaXRlbCgwLCBIUEVUX0NPVU5URVIgKyA0KTsKKworLyoKKyAqIFNldCB1cCB0aW1lciAwLCBhcyBwZXJpb2RpYyB3aXRoIGZpcnN0IGludGVycnVwdCB0byBoYXBwZW4gYXQgaHBldF90aWNrLAorICogYW5kIHBlcmlvZCBhbHNvIGhwZXRfdGljay4KKyAqLworCWlmIChocGV0X3VzZV90aW1lcikgeworCQlocGV0X3dyaXRlbChIUEVUX1ROX0VOQUJMRSB8IEhQRVRfVE5fUEVSSU9ESUMgfCBIUEVUX1ROX1NFVFZBTCB8CisJCSAgICBIUEVUX1ROXzMyQklULCBIUEVUX1QwX0NGRyk7CisJCWhwZXRfd3JpdGVsKGhwZXRfdGljaywgSFBFVF9UMF9DTVApOyAvKiBuZXh0IGludGVycnVwdCAqLworCQlocGV0X3dyaXRlbChocGV0X3RpY2ssIEhQRVRfVDBfQ01QKTsgLyogcGVyaW9kICovCisJCWNmZyB8PSBIUEVUX0NGR19MRUdBQ1k7CisJfQorLyoKKyAqIEdvIQorICovCisKKwljZmcgfD0gSFBFVF9DRkdfRU5BQkxFOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBocGV0X2FyY2hfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpZDsKKworCWlmICghaHBldF9hZGRyZXNzKQorCQlyZXR1cm4gLTE7CisJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9IUEVUX0JBU0UsIGhwZXRfYWRkcmVzcyk7CisJX19zZXRfZml4bWFwKFZTWVNDQUxMX0hQRVQsIGhwZXRfYWRkcmVzcywgUEFHRV9LRVJORUxfVlNZU0NBTExfTk9DQUNIRSk7CisKKy8qCisgKiBSZWFkIHRoZSBwZXJpb2QsIGNvbXB1dGUgdGljayBhbmQgcXVvdGllbnQuCisgKi8KKworCWlkID0gaHBldF9yZWFkbChIUEVUX0lEKTsKKworCWlmICghKGlkICYgSFBFVF9JRF9WRU5ET1IpIHx8ICEoaWQgJiBIUEVUX0lEX05VTUJFUikpCisJCXJldHVybiAtMTsKKworCWhwZXRfcGVyaW9kID0gaHBldF9yZWFkbChIUEVUX1BFUklPRCk7CisJaWYgKGhwZXRfcGVyaW9kIDwgMTAwMDAwIHx8IGhwZXRfcGVyaW9kID4gMTAwMDAwMDAwKQorCQlyZXR1cm4gLTE7CisKKwlocGV0X3RpY2sgPSAoRlNFQ19QRVJfVElDSyArIGhwZXRfcGVyaW9kIC8gMikgLyBocGV0X3BlcmlvZDsKKworCWhwZXRfdXNlX3RpbWVyID0gKGlkICYgSFBFVF9JRF9MRUdTVVApOworCisJcmV0dXJuIGhwZXRfdGltZXJfc3RvcF9zZXRfZ28oaHBldF90aWNrKTsKK30KKworaW50IGhwZXRfcmVlbmFibGUodm9pZCkKK3sKKwlyZXR1cm4gaHBldF90aW1lcl9zdG9wX3NldF9nbyhocGV0X3RpY2spOworfQorCisvKgorICogY2FsaWJyYXRlX3RzYygpIGNhbGlicmF0ZXMgdGhlIHByb2Nlc3NvciBUU0MgaW4gYSB2ZXJ5IHNpbXBsZSB3YXksIGNvbXBhcmluZworICogaXQgdG8gdGhlIEhQRVQgdGltZXIgb2Yga25vd24gZnJlcXVlbmN5LgorICovCisKKyNkZWZpbmUgVElDS19DT1VOVCAxMDAwMDAwMDAKKyNkZWZpbmUgVElDS19NSU4gICA1MDAwCisKKy8qCisgKiBTb21lIHBsYXRmb3JtcyB0YWtlIHBlcmlvZGljIFNNSSBpbnRlcnJ1cHRzIHdpdGggNW1zIGR1cmF0aW9uLiBNYWtlIHN1cmUgbm9uZQorICogb2NjdXJzIGJldHdlZW4gdGhlIHJlYWRzIG9mIHRoZSBocGV0ICYgVFNDLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgcmVhZF9ocGV0X3RzYyhpbnQgKmhwZXQsIGludCAqdHNjKQoreworCWludCB0c2MxLCB0c2MyLCBocGV0MTsKKworCWRvIHsKKwkJdHNjMSA9IGdldF9jeWNsZXNfc3luYygpOworCQlocGV0MSA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwkJdHNjMiA9IGdldF9jeWNsZXNfc3luYygpOworCX0gd2hpbGUgKHRzYzIgLSB0c2MxID4gVElDS19NSU4pOworCSpocGV0ID0gaHBldDE7CisJKnRzYyA9IHRzYzI7Cit9CisKK3Vuc2lnbmVkIGludCBfX2luaXQgaHBldF9jYWxpYnJhdGVfdHNjKHZvaWQpCit7CisJaW50IHRzY19zdGFydCwgaHBldF9zdGFydDsKKwlpbnQgdHNjX25vdywgaHBldF9ub3c7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJlYWRfaHBldF90c2MoJmhwZXRfc3RhcnQsICZ0c2Nfc3RhcnQpOworCisJZG8geworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlyZWFkX2hwZXRfdHNjKCZocGV0X25vdywgJnRzY19ub3cpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfSB3aGlsZSAoKHRzY19ub3cgLSB0c2Nfc3RhcnQpIDwgVElDS19DT1VOVCAmJgorCQkoaHBldF9ub3cgLSBocGV0X3N0YXJ0KSA8IFRJQ0tfQ09VTlQpOworCisJcmV0dXJuICh0c2Nfbm93IC0gdHNjX3N0YXJ0KSAqIDEwMDAwMDAwMDBMCisJCS8gKChocGV0X25vdyAtIGhwZXRfc3RhcnQpICogaHBldF9wZXJpb2QgLyAxMDAwKTsKK30KKworI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCisvKiBIUEVUIGluIExlZ2FjeVJlcGxhY2VtZW50IE1vZGUgZWF0cyB1cCBSVEMgaW50ZXJydXB0IGxpbmUuIFdoZW4sIEhQRVQKKyAqIGlzIGVuYWJsZWQsIHdlIHN1cHBvcnQgUlRDIGludGVycnVwdCBmdW5jdGlvbmFsaXR5IGluIHNvZnR3YXJlLgorICogUlRDIGhhcyAzIGtpbmRzIG9mIGludGVycnVwdHM6CisgKiAxKSBVcGRhdGUgSW50ZXJydXB0IC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0LCBldmVyeSBzZWMsIHdoZW4gUlRDIGNsb2NrCisgKiAgICBpcyB1cGRhdGVkCisgKiAyKSBBbGFybSBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgYXQgYSBzcGVjaWZpYyB0aW1lIG9mIGRheQorICogMykgUGVyaW9kaWMgSW50ZXJydXB0IC0gZ2VuZXJhdGUgcGVyaW9kaWMgaW50ZXJydXB0LCB3aXRoIGZyZXF1ZW5jaWVzCisgKiAgICAySHotODE5Mkh6ICgySHotNjRIeiBmb3Igbm9uLXJvb3QgdXNlcikgKGFsbCBmcmVxcyBpbiBwb3dlcnMgb2YgMikKKyAqICgxKSBhbmQgKDIpIGFib3ZlIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBwb2xsaW5nIGF0IGEgZnJlcXVlbmN5IG9mCisgKiA2NCBIei4gVGhlIGV4YWN0IGZyZXF1ZW5jeSBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gYWNjdXJhY3kgYW5kIGludGVycnVwdAorICogb3ZlcmhlYWQuIChERUZBVUxUX1JUQ19JTlRfRlJFUSkKKyAqIEZvciAoMyksIHdlIHVzZSBpbnRlcnJ1cHRzIGF0IDY0SHogb3IgdXNlciBzcGVjaWZpZWQgcGVyaW9kaWMKKyAqIGZyZXF1ZW5jeSwgd2hpY2hldmVyIGlzIGhpZ2hlci4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjZGVmaW5lIERFRkFVTFRfUlRDX0lOVF9GUkVRIAk2NAorI2RlZmluZSBSVENfTlVNX0lOVFMgCQkxCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFVJRV9vbjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHByZXZfdXBkYXRlX3NlYzsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgQUlFX29uOworc3RhdGljIHN0cnVjdCBydGNfdGltZSBhbGFybV90aW1lOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfb247CitzdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROworc3RhdGljIHVuc2lnbmVkIGxvbmcgUElFX2NvdW50OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3J0Y19pbnRfZnJlcTsgLyogUlRDIGludGVycnVwdCBmcmVxdWVuY3kgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaHBldF90MV9jbXA7IC8qIGNhY2hlZCBjb21wYXJhdG9yIHJlZ2lzdGVyICovCisKK2ludCBpc19ocGV0X2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gaHBldF9hZGRyZXNzICE9IDA7Cit9CisKKy8qCisgKiBUaW1lciAxIGZvciBSVEMsIHdlIGRvIG5vdCB1c2UgcGVyaW9kaWMgaW50ZXJydXB0IGZlYXR1cmUsCisgKiBldmVuIGlmIEhQRVQgc3VwcG9ydHMgcGVyaW9kaWMgaW50ZXJydXB0cyBvbiBUaW1lciAxLgorICogVGhlIHJlYXNvbiBiZWluZywgdG8gc2V0IHVwIGEgcGVyaW9kaWMgaW50ZXJydXB0IGluIEhQRVQsIHdlIG5lZWQgdG8KKyAqIHN0b3AgdGhlIG1haW4gY291bnRlci4gQW5kIGlmIHdlIGRvIHRoYXQgZXZlcnl0aW1lIHNvbWVvbmUgZGlhYmxlcy9lbmFibGVzCisgKiBSVEMsIHdlIHdpbGwgaGF2ZSBhZHZlcnNlIGVmZmVjdCBvbiBtYWluIGtlcm5lbCB0aW1lciBydW5uaW5nIG9uIFRpbWVyIDAuCisgKiBTbywgZm9yIHRoZSB0aW1lIGJlaW5nLCBzaW11bGF0ZSB0aGUgcGVyaW9kaWMgaW50ZXJydXB0IGluIHNvZnR3YXJlLgorICoKKyAqIGhwZXRfcnRjX3RpbWVyX2luaXQoKSBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBkdXJpbmcgc3Vic2VxdWVudAorICogaW50ZXJ1cHB0cyByZWluaXQgaGFwcGVucyB0aHJvdWdoIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpLgorICovCitpbnQgaHBldF9ydGNfdGltZXJfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBjZmcsIGNudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBTZXQgdGhlIGNvdW50ZXIgMSBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHRzLgorCSAqLworCWlmIChQSUVfb24gJiYgKFBJRV9mcmVxID4gREVGQVVMVF9SVENfSU5UX0ZSRVEpKQorCQlocGV0X3J0Y19pbnRfZnJlcSA9IFBJRV9mcmVxOworCWVsc2UKKwkJaHBldF9ydGNfaW50X2ZyZXEgPSBERUZBVUxUX1JUQ19JTlRfRlJFUTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwljbnQgKz0gKChocGV0X3RpY2sqSFopL2hwZXRfcnRjX2ludF9mcmVxKTsKKwlocGV0X3dyaXRlbChjbnQsIEhQRVRfVDFfQ01QKTsKKwlocGV0X3QxX2NtcCA9IGNudDsKKworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOworCWNmZyAmPSB+SFBFVF9UTl9QRVJJT0RJQzsKKwljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBjZmcsIGNudCwgdGlja3NfcGVyX2ludCwgbG9zdF9pbnRzOworCisJaWYgKHVubGlrZWx5KCEoUElFX29uIHwgQUlFX29uIHwgVUlFX29uKSkpIHsKKwkJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7CisJCWNmZyAmPSB+SFBFVF9UTl9FTkFCTEU7CisJCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOworCQlyZXR1cm47CisJfQorCisJaWYgKFBJRV9vbiAmJiAoUElFX2ZyZXEgPiBERUZBVUxUX1JUQ19JTlRfRlJFUSkpCisJCWhwZXRfcnRjX2ludF9mcmVxID0gUElFX2ZyZXE7CisJZWxzZQorCQlocGV0X3J0Y19pbnRfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROworCisJLyogSXQgaXMgbW9yZSBhY2N1cmF0ZSB0byB1c2UgdGhlIGNvbXBhcmF0b3IgdmFsdWUgdGhhbiBjdXJyZW50IGNvdW50LiovCisJdGlja3NfcGVyX2ludCA9IGhwZXRfdGljayAqIEhaIC8gaHBldF9ydGNfaW50X2ZyZXE7CisJaHBldF90MV9jbXAgKz0gdGlja3NfcGVyX2ludDsKKwlocGV0X3dyaXRlbChocGV0X3QxX2NtcCwgSFBFVF9UMV9DTVApOworCisJLyoKKwkgKiBJZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2FzIGRlbGF5ZWQgdG9vIGxvbmcsIHRoZSB3cml0ZSBhYm92ZSB0cmllcworCSAqIHRvIHNjaGVkdWxlIHRoZSBuZXh0IGludGVycnVwdCBpbiB0aGUgcGFzdCBhbmQgdGhlIGhhcmR3YXJlIHdvdWxkCisJICogbm90IGludGVycnVwdCB1bnRpbCB0aGUgY291bnRlciBoYWQgd3JhcHBlZCBhcm91bmQuCisJICogU28gd2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBjb21wYXJhdG9yIHdhc24ndCBzZXQgdG8gYSBwYXN0IHRpbWUuCisJICovCisJY250ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCWlmICh1bmxpa2VseSgoaW50KShjbnQgLSBocGV0X3QxX2NtcCkgPiAwKSkgeworCQlsb3N0X2ludHMgPSAoY250IC0gaHBldF90MV9jbXApIC8gdGlja3NfcGVyX2ludCArIDE7CisJCS8qIE1ha2Ugc3VyZSB0aGF0LCBldmVuIHdpdGggdGhlIHRpbWUgbmVlZGVkIHRvIGV4ZWN1dGUKKwkJICogdGhpcyBjb2RlLCB0aGUgbmV4dCBzY2hlZHVsZWQgaW50ZXJydXB0IGhhcyBiZWVuIG1vdmVkCisJCSAqIGJhY2sgdG8gdGhlIGZ1dHVyZTogKi8KKwkJbG9zdF9pbnRzKys7CisKKwkJaHBldF90MV9jbXAgKz0gbG9zdF9pbnRzICogdGlja3NfcGVyX2ludDsKKwkJaHBldF93cml0ZWwoaHBldF90MV9jbXAsIEhQRVRfVDFfQ01QKTsKKworCQlpZiAoUElFX29uKQorCQkJUElFX2NvdW50ICs9IGxvc3RfaW50czsKKworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicnRjOiBsb3N0IHNvbWUgaW50ZXJydXB0cyBhdCAlbGRIei5cbiIsCisJCQkgICAgICAgaHBldF9ydGNfaW50X2ZyZXEpOworCX0KK30KKworLyoKKyAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGNhbGxlZCBmcm9tIHJ0YyBkcml2ZXIuCisgKiBSZXR1cm4gMCBpZiBIUEVUIGlzIG5vdCBiZWluZyB1c2VkLgorICogT3RoZXJ3aXNlIGRvIHRoZSBuZWNlc3NhcnkgY2hhbmdlcyBhbmQgcmV0dXJuIDEuCisgKi8KK2ludCBocGV0X21hc2tfcnRjX2lycV9iaXQodW5zaWduZWQgbG9uZyBiaXRfbWFzaykKK3sKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmIChiaXRfbWFzayAmIFJUQ19VSUUpCisJCVVJRV9vbiA9IDA7CisJaWYgKGJpdF9tYXNrICYgUlRDX1BJRSkKKwkJUElFX29uID0gMDsKKwlpZiAoYml0X21hc2sgJiBSVENfQUlFKQorCQlBSUVfb24gPSAwOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKQoreworCWludCB0aW1lcl9pbml0X3JlcWQgPSAwOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShQSUVfb24gfCBBSUVfb24gfCBVSUVfb24pKQorCQl0aW1lcl9pbml0X3JlcWQgPSAxOworCisJaWYgKGJpdF9tYXNrICYgUlRDX1VJRSkgeworCQlVSUVfb24gPSAxOworCX0KKwlpZiAoYml0X21hc2sgJiBSVENfUElFKSB7CisJCVBJRV9vbiA9IDE7CisJCVBJRV9jb3VudCA9IDA7CisJfQorCWlmIChiaXRfbWFzayAmIFJUQ19BSUUpIHsKKwkJQUlFX29uID0gMTsKKwl9CisKKwlpZiAodGltZXJfaW5pdF9yZXFkKQorCQlocGV0X3J0Y190aW1lcl9pbml0KCk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGhwZXRfc2V0X2FsYXJtX3RpbWUodW5zaWduZWQgY2hhciBocnMsIHVuc2lnbmVkIGNoYXIgbWluLCB1bnNpZ25lZCBjaGFyIHNlYykKK3sKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWFsYXJtX3RpbWUudG1faG91ciA9IGhyczsKKwlhbGFybV90aW1lLnRtX21pbiA9IG1pbjsKKwlhbGFybV90aW1lLnRtX3NlYyA9IHNlYzsKKworCXJldHVybiAxOworfQorCitpbnQgaHBldF9zZXRfcGVyaW9kaWNfZnJlcSh1bnNpZ25lZCBsb25nIGZyZXEpCit7CisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlQSUVfZnJlcSA9IGZyZXE7CisJUElFX2NvdW50ID0gMDsKKworCXJldHVybiAxOworfQorCitpbnQgaHBldF9ydGNfZHJvcHBlZF9pcnEodm9pZCkKK3sKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitpcnFyZXR1cm5fdCBocGV0X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgY3Vycl90aW1lOworCXVuc2lnbmVkIGxvbmcgcnRjX2ludF9mbGFnID0gMDsKKwlpbnQgY2FsbF9ydGNfaW50ZXJydXB0ID0gMDsKKworCWhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpOworCisJaWYgKFVJRV9vbiB8IEFJRV9vbikgeworCQlydGNfZ2V0X3J0Y190aW1lKCZjdXJyX3RpbWUpOworCX0KKwlpZiAoVUlFX29uKSB7CisJCWlmIChjdXJyX3RpbWUudG1fc2VjICE9IHByZXZfdXBkYXRlX3NlYykgeworCQkJLyogU2V0IHVwZGF0ZSBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLworCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKKwkJCXJ0Y19pbnRfZmxhZyA9IFJUQ19VRjsKKwkJCXByZXZfdXBkYXRlX3NlYyA9IGN1cnJfdGltZS50bV9zZWM7CisJCX0KKwl9CisJaWYgKFBJRV9vbikgeworCQlQSUVfY291bnQrKzsKKwkJaWYgKFBJRV9jb3VudCA+PSBocGV0X3J0Y19pbnRfZnJlcS9QSUVfZnJlcSkgeworCQkJLyogU2V0IHBlcmlvZGljIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCisJCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOworCQkJcnRjX2ludF9mbGFnIHw9IFJUQ19QRjsKKwkJCVBJRV9jb3VudCA9IDA7CisJCX0KKwl9CisJaWYgKEFJRV9vbikgeworCQlpZiAoKGN1cnJfdGltZS50bV9zZWMgPT0gYWxhcm1fdGltZS50bV9zZWMpICYmCisJCSAgICAoY3Vycl90aW1lLnRtX21pbiA9PSBhbGFybV90aW1lLnRtX21pbikgJiYKKwkJICAgIChjdXJyX3RpbWUudG1faG91ciA9PSBhbGFybV90aW1lLnRtX2hvdXIpKSB7CisJCQkvKiBTZXQgYWxhcm0gaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KKwkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7CisJCQlydGNfaW50X2ZsYWcgfD0gUlRDX0FGOworCQl9CisJfQorCWlmIChjYWxsX3J0Y19pbnRlcnJ1cHQpIHsKKwkJcnRjX2ludF9mbGFnIHw9IChSVENfSVJRRiB8IChSVENfTlVNX0lOVFMgPDwgOCkpOworCQlydGNfaW50ZXJydXB0KHJ0Y19pbnRfZmxhZywgZGV2X2lkKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IG5vaHBldF9zZXR1cChjaGFyICpzKQoreworCW5vaHBldCA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm5vaHBldCIsIG5vaHBldF9zZXR1cCk7CisKKyNkZWZpbmUgSFBFVF9NQVNLCTB4RkZGRkZGRkYKKyNkZWZpbmUgSFBFVF9TSElGVAkyMgorCisvKiBGU0VDID0gMTBeLTE1IE5TRUMgPSAxMF4tOSAqLworI2RlZmluZSBGU0VDX1BFUl9OU0VDCTEwMDAwMDAKKworc3RhdGljIHZvaWQgKmhwZXRfcHRyOworCitzdGF0aWMgY3ljbGVfdCByZWFkX2hwZXQodm9pZCkKK3sKKwlyZXR1cm4gKGN5Y2xlX3QpcmVhZGwoaHBldF9wdHIpOworfQorCitzdGF0aWMgY3ljbGVfdCBfX3ZzeXNjYWxsX2ZuIHZyZWFkX2hwZXQodm9pZCkKK3sKKwlyZXR1cm4gcmVhZGwoKHZvaWQgX19pb21lbSAqKWZpeF90b192aXJ0KFZTWVNDQUxMX0hQRVQpICsgMHhmMCk7Cit9CisKK3N0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9ocGV0ID0geworCS5uYW1lCQk9ICJocGV0IiwKKwkucmF0aW5nCQk9IDI1MCwKKwkucmVhZAkJPSByZWFkX2hwZXQsCisJLm1hc2sJCT0gKGN5Y2xlX3QpSFBFVF9NQVNLLAorCS5tdWx0CQk9IDAsIC8qIHNldCBiZWxvdyAqLworCS5zaGlmdAkJPSBIUEVUX1NISUZULAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKKwkudnJlYWQJCT0gdnJlYWRfaHBldCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaHBldF9jbG9ja3NvdXJjZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7CisJdm9pZCBfX2lvbWVtICpocGV0X2Jhc2U7CisJdTY0IHRtcDsKKworCWlmICghaHBldF9hZGRyZXNzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGNhbGN1bGF0ZSB0aGUgaHBldCBhZGRyZXNzOiAqLworCWhwZXRfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShocGV0X2FkZHJlc3MsIEhQRVRfTU1BUF9TSVpFKTsKKwlocGV0X3B0ciA9IGhwZXRfYmFzZSArIEhQRVRfQ09VTlRFUjsKKworCS8qIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5OiAqLworCWhwZXRfcGVyaW9kID0gcmVhZGwoaHBldF9iYXNlICsgSFBFVF9QRVJJT0QpOworCisJLyoKKwkgKiBocGV0IHBlcmlvZCBpcyBpbiBmZW10byBzZWNvbmRzIHBlciBjeWNsZQorCSAqIHNvIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHRvIG5zL2N5YyB1bml0cworCSAqIGFwcm94aW1hdGVkIGJ5IG11bHQvMl5zaGlmdAorCSAqCisJICogIGZzZWMvY3ljICogMW5zZWMvMTAwMDAwMGZzZWMgPSBuc2VjL2N5YyA9IG11bHQvMl5zaGlmdAorCSAqICBmc2VjL2N5YyAqIDFucy8xMDAwMDAwZnNlYyAqIDJec2hpZnQgPSBtdWx0CisJICogIGZzZWMvY3ljICogMl5zaGlmdCAqIDFuc2VjLzEwMDAwMDBmc2VjID0gbXVsdAorCSAqICAoZnNlYy9jeWMgPDwgc2hpZnQpLzEwMDAwMDAgPSBtdWx0CisJICogIChocGV0X3BlcmlvZCA8PCBzaGlmdCkvRlNFQ19QRVJfTlNFQyA9IG11bHQKKwkgKi8KKwl0bXAgPSAodTY0KWhwZXRfcGVyaW9kIDw8IEhQRVRfU0hJRlQ7CisJZG9fZGl2KHRtcCwgRlNFQ19QRVJfTlNFQyk7CisJY2xvY2tzb3VyY2VfaHBldC5tdWx0ID0gKHUzMil0bXA7CisKKwlyZXR1cm4gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX2hwZXQpOworfQorCittb2R1bGVfaW5pdChpbml0X2hwZXRfY2xvY2tzb3VyY2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYwppbmRleCBkNzNjNzllLi4wMWUyY2YwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaTgyNTkuYwpAQCAtMTAzLDYgKzEwMyw3IEBACiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGk4MjU5QV9jaGlwID0gewogCS5uYW1lCQk9ICJYVC1QSUMiLAogCS5tYXNrCQk9IGRpc2FibGVfODI1OUFfaXJxLAorCS5kaXNhYmxlCT0gZGlzYWJsZV84MjU5QV9pcnEsCiAJLnVubWFzawkJPSBlbmFibGVfODI1OUFfaXJxLAogCS5tYXNrX2Fjawk9IG1hc2tfYW5kX2Fja184MjU5QSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwppbmRleCA1NjZlNjRkLi45NTA2ODJmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKQEAgLTgxMCwxMSArODEwLDkgQEAKIAkJCXRyaWdnZXIgPT0gSU9BUElDX0xFVkVMKQogCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpb2FwaWNfY2hpcCwKIAkJCQkJICAgICAgaGFuZGxlX2Zhc3Rlb2lfaXJxLCAiZmFzdGVvaSIpOwotCWVsc2UgewotCQlpcnFfZGVzY1tpcnFdLnN0YXR1cyB8PSBJUlFfREVMQVlFRF9ESVNBQkxFOworCWVsc2UKIAkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaW9hcGljX2NoaXAsCiAJCQkJCSAgICAgIGhhbmRsZV9lZGdlX2lycSwgImVkZ2UiKTsKLQl9CiB9CiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfSU9fQVBJQ19pcnEoaW50IGFwaWMsIGludCBwaW4sIGludCBpZHgsIGludCBpcnEpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcG10aW1lci5jIGIvYXJjaC94ODZfNjQva2VybmVsL3BtdGltZXIuYwppbmRleCA3NTU0NDU4Li5hZThmOTEyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvcG10aW1lci5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wbXRpbWVyLmMKQEAgLTI0LDE1ICsyNCw2IEBACiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgogCi0vKiBUaGUgSS9PIHBvcnQgdGhlIFBNVE1SIHJlc2lkZXMgYXQuCi0gKiBUaGUgbG9jYXRpb24gaXMgZGV0ZWN0ZWQgZHVyaW5nIHNldHVwX2FyY2goKSwKLSAqIGluIGFyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMgKi8KLXUzMiBwbXRtcl9pb3BvcnQgX19yZWFkX21vc3RseTsKLQotLyogdmFsdWUgb2YgdGhlIFBvd2VyIHRpbWVyIGF0IGxhc3QgdGltZXIgaW50ZXJydXB0ICovCi1zdGF0aWMgdTMyIG9mZnNldF9kZWxheTsKLXN0YXRpYyB1MzIgbGFzdF9wbXRtcl90aWNrOwotCiAjZGVmaW5lIEFDUElfUE1fTUFTSyAweEZGRkZGRiAvKiBsaW1pdCBpdCB0byAyNCBiaXRzICovCiAKIHN0YXRpYyBpbmxpbmUgdTMyIGN5YzJ1cyh1MzIgY3ljbGVzKQpAQCAtNDgsMzggKzM5LDYgQEAKIAlyZXR1cm4gKGN5Y2xlcyA+PiAxMCk7CiB9CiAKLWludCBwbXRpbWVyX21hcmtfb2Zmc2V0KHZvaWQpCi17Ci0Jc3RhdGljIGludCBmaXJzdF9ydW4gPSAxOwotCXVuc2lnbmVkIGxvbmcgdHNjOwotCXUzMiBsb3N0OwotCi0JdTMyIHRpY2sgPSBpbmwocG10bXJfaW9wb3J0KTsKLQl1MzIgZGVsdGE7Ci0KLQlkZWx0YSA9IGN5YzJ1cygodGljayAtIGxhc3RfcG10bXJfdGljaykgJiBBQ1BJX1BNX01BU0spOwotCi0JbGFzdF9wbXRtcl90aWNrID0gdGljazsKLQltb25vdG9uaWNfYmFzZSArPSBkZWx0YSAqIE5TRUNfUEVSX1VTRUM7Ci0KLQlkZWx0YSArPSBvZmZzZXRfZGVsYXk7Ci0KLQlsb3N0ID0gZGVsdGEgLyAoVVNFQ19QRVJfU0VDIC8gSFopOwotCW9mZnNldF9kZWxheSA9IGRlbHRhICUgKFVTRUNfUEVSX1NFQyAvIEhaKTsKLQotCXJkdHNjbGwodHNjKTsKLQl2eHRpbWUubGFzdF90c2MgPSB0c2MgLSBvZmZzZXRfZGVsYXkgKiAodTY0KWNwdV9raHogLyAxMDAwOwotCi0JLyogZG9uJ3QgY2FsY3VsYXRlIGRlbGF5IGZvciBmaXJzdCBydW4sCi0JICAgb3IgaWYgd2UndmUgZ290IGxlc3MgdGhlbiBhIHRpY2sgKi8KLQlpZiAoZmlyc3RfcnVuIHx8IChsb3N0IDwgMSkpIHsKLQkJZmlyc3RfcnVuID0gMDsKLQkJb2Zmc2V0X2RlbGF5ID0gMDsKLQl9Ci0KLQlyZXR1cm4gbG9zdCAtIDE7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBwbXRpbWVyX3dhaXRfdGljayh2b2lkKQogewogCXUzMiBhLCBiOwpAQCAtMTAxLDIzICs2MCw2IEBACiAJfSB3aGlsZSAoY3ljMnVzKGIgLSBhKSA8IHVzKTsKIH0KIAotdm9pZCBwbXRpbWVyX3Jlc3VtZSh2b2lkKQotewotCWxhc3RfcG10bXJfdGljayA9IGlubChwbXRtcl9pb3BvcnQpOwotfQotCi11bnNpZ25lZCBpbnQgZG9fZ2V0dGltZW9mZnNldF9wbSh2b2lkKQotewotCXUzMiBub3csIG9mZnNldCwgZGVsdGEgPSAwOwotCi0Jb2Zmc2V0ID0gbGFzdF9wbXRtcl90aWNrOwotCW5vdyA9IGlubChwbXRtcl9pb3BvcnQpOwotCWRlbHRhID0gKG5vdyAtIG9mZnNldCkgJiBBQ1BJX1BNX01BU0s7Ci0KLQlyZXR1cm4gb2Zmc2V0X2RlbGF5ICsgY3ljMnVzKGRlbHRhKTsKLX0KLQotCiBzdGF0aWMgaW50IF9faW5pdCBub3BtdGltZXJfc2V0dXAoY2hhciAqcykKIHsKIAlwbXRtcl9pb3BvcnQgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKaW5kZXggZGFmMTkzMy4uMzU0NDM3MiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCkBAIC0xNDgsMjE3ICsxNDgsNiBAQAogCXByaW50X2NwdV9pbmZvKGMpOwogfQogCi0vKgotICogTmV3IEZ1bmt5IFRTQyBzeW5jIGFsZ29yaXRobSBib3Jyb3dlZCBmcm9tIElBNjQuCi0gKiBNYWluIGFkdmFudGFnZSBpcyB0aGF0IGl0IGRvZXNuJ3QgcmVzZXQgdGhlIFRTQ3MgZnVsbHkgYW5kCi0gKiBpbiBnZW5lcmFsIGxvb2tzIG1vcmUgcm9idXN0IGFuZCBpdCB3b3JrcyBiZXR0ZXIgdGhhbiBteSBlYXJsaWVyCi0gKiBhdHRlbXB0cy4gSSBiZWxpZXZlIGl0IHdhcyB3cml0dGVuIGJ5IERhdmlkIE1vc2Jlcmdlci4gU29tZSBtaW5vcgotICogYWRqdXN0bWVudHMgZm9yIHg4Ni02NCBieSBtZSAtQUsKLSAqCi0gKiBPcmlnaW5hbCBjb21tZW50IHJlcHJvZHVjZWQgYmVsb3cuCi0gKgotICogU3luY2hyb25pemUgVFNDIG9mIHRoZSBjdXJyZW50IChzbGF2ZSkgQ1BVIHdpdGggdGhlIFRTQyBvZiB0aGUKLSAqIE1BU1RFUiBDUFUgKG5vcm1hbGx5IHRoZSB0aW1lLWtlZXBlciBDUFUpLiAgV2UgdXNlIGEgY2xvc2VkIGxvb3AgdG8KLSAqIGVsaW1pbmF0ZSB0aGUgcG9zc2liaWxpdHkgb2YgdW5hY2NvdW50ZWQtZm9yIGVycm9ycyAoc3VjaCBhcwotICogZ2V0dGluZyBhIG1hY2hpbmUgY2hlY2sgaW4gdGhlIG1pZGRsZSBvZiBhIGNhbGlicmF0aW9uIHN0ZXApLiAgVGhlCi0gKiBiYXNpYyBpZGVhIGlzIGZvciB0aGUgc2xhdmUgdG8gYXNrIHRoZSBtYXN0ZXIgd2hhdCBpdGMgdmFsdWUgaXQgaGFzCi0gKiBhbmQgdG8gcmVhZCBpdHMgb3duIGl0YyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtYXN0ZXIgcmVzcG9uZHMuICBFYWNoCi0gKiBpdGVyYXRpb24gZ2l2ZXMgdXMgdGhyZWUgdGltZXN0YW1wczoKLSAqCi0gKglzbGF2ZQkJbWFzdGVyCi0gKgotICoJdDAgLS0tXAotICogICAgICAgICAgICAgLS0tXAotICoJCSAgIC0tLT4KLSAqCQkJdG0KLSAqCQkgICAvLS0tCi0gKgkgICAgICAgLy0tLQotICoJdDEgPC0tLQotICoKLSAqCi0gKiBUaGUgZ29hbCBpcyB0byBhZGp1c3QgdGhlIHNsYXZlJ3MgVFNDIHN1Y2ggdGhhdCB0bSBmYWxscyBleGFjdGx5Ci0gKiBoYWxmLXdheSBiZXR3ZWVuIHQwIGFuZCB0MS4gIElmIHdlIGFjaGlldmUgdGhpcywgdGhlIGNsb2NrcyBhcmUKLSAqIHN5bmNocm9uaXplZCBwcm92aWRlZCB0aGUgaW50ZXJjb25uZWN0IGJldHdlZW4gdGhlIHNsYXZlIGFuZCB0aGUKLSAqIG1hc3RlciBpcyBzeW1tZXRyaWMuICBFdmVuIGlmIHRoZSBpbnRlcmNvbm5lY3Qgd2VyZSBhc3ltbWV0cmljLCB3ZQotICogd291bGQgc3RpbGwga25vdyB0aGF0IHRoZSBzeW5jaHJvbml6YXRpb24gZXJyb3IgaXMgc21hbGxlciB0aGFuIHRoZQotICogcm91bmR0cmlwIGxhdGVuY3kgKHQwIC0gdDEpLgotICoKLSAqIFdoZW4gdGhlIGludGVyY29ubmVjdCBpcyBxdWlldCBhbmQgc3ltbWV0cmljLCB0aGlzIGxldHMgdXMKLSAqIHN5bmNocm9uaXplIHRoZSBUU0MgdG8gd2l0aGluIG9uZSBvciB0d28gY3ljbGVzLiAgSG93ZXZlciwgd2UgY2FuCi0gKiBvbmx5ICpndWFyYW50ZWUqIHRoYXQgdGhlIHN5bmNocm9uaXphdGlvbiBpcyBhY2N1cmF0ZSB0byB3aXRoaW4gYQotICogcm91bmQtdHJpcCB0aW1lLCB3aGljaCBpcyB0eXBpY2FsbHkgaW4gdGhlIHJhbmdlIG9mIHNldmVyYWwgaHVuZHJlZAotICogY3ljbGVzIChlLmcuLCB+NTAwIGN5Y2xlcykuICBJbiBwcmFjdGljZSwgdGhpcyBtZWFucyB0aGF0IHRoZSBUU0NzCi0gKiBhcmUgdXN1YWxseSBhbG1vc3QgcGVyZmVjdGx5IHN5bmNocm9uaXplZCwgYnV0IHdlIHNob3VsZG4ndCBhc3N1bWUKLSAqIHRoYXQgdGhlIGFjY3VyYWN5IGlzIG11Y2ggYmV0dGVyIHRoYW4gaGFsZiBhIG1pY3JvIHNlY29uZCBvciBzby4KLSAqCi0gKiBbdGhlcmUgYXJlIG90aGVyIGVycm9ycyBsaWtlIHRoZSBsYXRlbmN5IG9mIFJEVFNDIGFuZCBvZiB0aGUKLSAqIFdSTVNSLiBUaGVzZSBjYW4gYWxzbyBhY2NvdW50IHRvIGh1bmRyZWRzIG9mIGN5Y2xlcy4gU28gaXQncwotICogcHJvYmFibHkgd29yc2UuIEl0IGNsYWltcyAxNTMgY3ljbGVzIGVycm9yIG9uIGEgZHVhbCBPcHRlcm9uLAotICogYnV0IEkgc3VzcGVjdCB0aGUgbnVtYmVycyBhcmUgYWN0dWFsbHkgc29tZXdoYXQgd29yc2UgLUFLXQotICovCi0KLSNkZWZpbmUgTUFTVEVSCTAKLSNkZWZpbmUgU0xBVkUJKFNNUF9DQUNIRV9CWVRFUy84KQotCi0vKiBJbnRlbnRpb25hbGx5IGRvbid0IHVzZSBjcHVfcmVsYXgoKSB3aGlsZSBUU0Mgc3luY2hyb25pemF0aW9uCi0gICBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZ28gaW50byBmdW5reSBwb3dlciBzYXZlIG1vZGkgb3IgY2F1c2UKLSAgIGh5cGVydmlzb3JzIHRvIHNjaGVkdWxlIHVzIGF3YXkuICBHb2luZyB0byBzbGVlcCB3b3VsZCBsaWtlbHkgYWZmZWN0Ci0gICBsYXRlbmN5IGFuZCBsb3cgbGF0ZW5jeSBpcyB0aGUgcHJpbWFyeSBvYmplY3RpdmUgaGVyZS4gLUFLICovCi0jZGVmaW5lIG5vX2NwdV9yZWxheCgpIGJhcnJpZXIoKQotCi1zdGF0aWMgX19jcHVpbml0ZGF0YSBERUZJTkVfU1BJTkxPQ0sodHNjX3N5bmNfbG9jayk7Ci1zdGF0aWMgdm9sYXRpbGUgX19jcHVpbml0ZGF0YSB1bnNpZ25lZCBsb25nIGdvW1NMQVZFICsgMV07Ci1zdGF0aWMgaW50IG5vdHNjc3luYyBfX2NwdWluaXRkYXRhOwotCi0jdW5kZWYgREVCVUdfVFNDX1NZTkMKLQotI2RlZmluZSBOVU1fUk9VTkRTCTY0CS8qIG1hZ2ljIHZhbHVlICovCi0jZGVmaW5lIE5VTV9JVEVSUwk1CS8qIGxpa2V3aXNlICovCi0KLS8qIENhbGxiYWNrIG9uIGJvb3QgQ1BVICovCi1zdGF0aWMgX19jcHVpbml0IHZvaWQgc3luY19tYXN0ZXIodm9pZCAqYXJnKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGk7Ci0KLQlnb1tNQVNURVJdID0gMDsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQl7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fUk9VTkRTKk5VTV9JVEVSUzsgKytpKSB7Ci0JCQl3aGlsZSAoIWdvW01BU1RFUl0pCi0JCQkJbm9fY3B1X3JlbGF4KCk7Ci0JCQlnb1tNQVNURVJdID0gMDsKLQkJCXJkdHNjbGwoZ29bU0xBVkVdKTsKLQkJfQotCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLS8qCi0gKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjeWNsZXMgYnkgd2hpY2ggb3VyIHRzYyBkaWZmZXJzIGZyb20gdGhlIHRzYwotICogb24gdGhlIG1hc3RlciAodGltZS1rZWVwZXIpIENQVS4gIEEgcG9zaXRpdmUgbnVtYmVyIGluZGljYXRlcyBvdXIKLSAqIHRzYyBpcyBhaGVhZCBvZiB0aGUgbWFzdGVyLCBuZWdhdGl2ZSB0aGF0IGl0IGlzIGJlaGluZC4KLSAqLwotc3RhdGljIGlubGluZSBsb25nCi1nZXRfZGVsdGEobG9uZyAqcnQsIGxvbmcgKm1hc3RlcikKLXsKLQl1bnNpZ25lZCBsb25nIGJlc3RfdDAgPSAwLCBiZXN0X3QxID0gfjBVTCwgYmVzdF90bSA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0Y2VudGVyLCB0MCwgdDEsIHRtOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9JVEVSUzsgKytpKSB7Ci0JCXJkdHNjbGwodDApOwotCQlnb1tNQVNURVJdID0gMTsKLQkJd2hpbGUgKCEodG0gPSBnb1tTTEFWRV0pKQotCQkJbm9fY3B1X3JlbGF4KCk7Ci0JCWdvW1NMQVZFXSA9IDA7Ci0JCXJkdHNjbGwodDEpOwotCi0JCWlmICh0MSAtIHQwIDwgYmVzdF90MSAtIGJlc3RfdDApCi0JCQliZXN0X3QwID0gdDAsIGJlc3RfdDEgPSB0MSwgYmVzdF90bSA9IHRtOwotCX0KLQotCSpydCA9IGJlc3RfdDEgLSBiZXN0X3QwOwotCSptYXN0ZXIgPSBiZXN0X3RtIC0gYmVzdF90MDsKLQotCS8qIGF2ZXJhZ2UgYmVzdF90MCBhbmQgYmVzdF90MSB3aXRob3V0IG92ZXJmbG93OiAqLwotCXRjZW50ZXIgPSAoYmVzdF90MC8yICsgYmVzdF90MS8yKTsKLQlpZiAoYmVzdF90MCAlIDIgKyBiZXN0X3QxICUgMiA9PSAyKQotCQkrK3RjZW50ZXI7Ci0JcmV0dXJuIHRjZW50ZXIgLSBiZXN0X3RtOwotfQotCi1zdGF0aWMgX19jcHVpbml0IHZvaWQgc3luY190c2ModW5zaWduZWQgaW50IG1hc3RlcikKLXsKLQlpbnQgaSwgZG9uZSA9IDA7Ci0JbG9uZyBkZWx0YSwgYWRqLCBhZGp1c3RfbGF0ZW5jeSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgcnQsIG1hc3Rlcl90aW1lX3N0YW1wLCBib3VuZDsKLSNpZmRlZiBERUJVR19UU0NfU1lOQwotCXN0YXRpYyBzdHJ1Y3Qgc3luY2RlYnVnIHsKLQkJbG9uZyBydDsJLyogcm91bmR0cmlwIHRpbWUgKi8KLQkJbG9uZyBtYXN0ZXI7CS8qIG1hc3RlcidzIHRpbWVzdGFtcCAqLwotCQlsb25nIGRpZmY7CS8qIGRpZmZlcmVuY2UgYmV0d2VlbiBtaWRwb2ludCBhbmQgbWFzdGVyJ3MgdGltZXN0YW1wICovCi0JCWxvbmcgbGF0OwkvKiBlc3RpbWF0ZSBvZiB0c2MgYWRqdXN0bWVudCBsYXRlbmN5ICovCi0JfSB0W05VTV9ST1VORFNdIF9fY3B1aW5pdGRhdGE7Ci0jZW5kaWYKLQotCXByaW50ayhLRVJOX0lORk8gIkNQVSAlZDogU3luY2luZyBUU0MgdG8gQ1BVICV1LlxuIiwKLQkJc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXN0ZXIpOwotCi0JZ29bTUFTVEVSXSA9IDE7Ci0KLQkvKiBJdCBpcyBkYW5nZXJvdXMgdG8gYnJvYWRjYXN0IElQSSBhcyBjcHVzIGFyZSBjb21pbmcgdXAsCi0JICogYXMgdGhleSBtYXkgbm90IGJlIHJlYWR5IHRvIGFjY2VwdCB0aGVtLiAgU28gc2luY2UKLQkgKiB3ZSBvbmx5IG5lZWQgdG8gc2VuZCB0aGUgaXBpIHRvIHRoZSBib290IGNwdSBkaXJlY3QKLQkgKiB0aGUgbWVzc2FnZSwgYW5kIGF2b2lkIHRoZSByYWNlLgotCSAqLwotCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShtYXN0ZXIsIHN5bmNfbWFzdGVyLCBOVUxMLCAxLCAwKTsKLQotCXdoaWxlIChnb1tNQVNURVJdKQkvKiB3YWl0IGZvciBtYXN0ZXIgdG8gYmUgcmVhZHkgKi8KLQkJbm9fY3B1X3JlbGF4KCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHNjX3N5bmNfbG9jaywgZmxhZ3MpOwotCXsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9ST1VORFM7ICsraSkgewotCQkJZGVsdGEgPSBnZXRfZGVsdGEoJnJ0LCAmbWFzdGVyX3RpbWVfc3RhbXApOwotCQkJaWYgKGRlbHRhID09IDApIHsKLQkJCQlkb25lID0gMTsJLyogbGV0J3MgbG9jayBvbiB0byB0aGlzLi4uICovCi0JCQkJYm91bmQgPSBydDsKLQkJCX0KLQotCQkJaWYgKCFkb25lKSB7Ci0JCQkJdW5zaWduZWQgbG9uZyB0OwotCQkJCWlmIChpID4gMCkgewotCQkJCQlhZGp1c3RfbGF0ZW5jeSArPSAtZGVsdGE7Ci0JCQkJCWFkaiA9IC1kZWx0YSArIGFkanVzdF9sYXRlbmN5LzQ7Ci0JCQkJfSBlbHNlCi0JCQkJCWFkaiA9IC1kZWx0YTsKLQotCQkJCXJkdHNjbGwodCk7Ci0JCQkJd3Jtc3JsKE1TUl9JQTMyX1RTQywgdCArIGFkaik7Ci0JCQl9Ci0jaWZkZWYgREVCVUdfVFNDX1NZTkMKLQkJCXRbaV0ucnQgPSBydDsKLQkJCXRbaV0ubWFzdGVyID0gbWFzdGVyX3RpbWVfc3RhbXA7Ci0JCQl0W2ldLmRpZmYgPSBkZWx0YTsKLQkJCXRbaV0ubGF0ID0gYWRqdXN0X2xhdGVuY3kvNDsKLSNlbmRpZgotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRzY19zeW5jX2xvY2ssIGZsYWdzKTsKLQotI2lmZGVmIERFQlVHX1RTQ19TWU5DCi0JZm9yIChpID0gMDsgaSA8IE5VTV9ST1VORFM7ICsraSkKLQkJcHJpbnRrKCJydD0lNWxkIG1hc3Rlcj0lNWxkIGRpZmY9JTVsZCBhZGpsYXQ9JTVsZFxuIiwKLQkJICAgICAgIHRbaV0ucnQsIHRbaV0ubWFzdGVyLCB0W2ldLmRpZmYsIHRbaV0ubGF0KTsKLSNlbmRpZgotCi0JcHJpbnRrKEtFUk5fSU5GTwotCSAgICAgICAiQ1BVICVkOiBzeW5jaHJvbml6ZWQgVFNDIHdpdGggQ1BVICV1IChsYXN0IGRpZmYgJWxkIGN5Y2xlcywgIgotCSAgICAgICAibWF4ZXJyICVsdSBjeWNsZXMpXG4iLAotCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCksIG1hc3RlciwgZGVsdGEsIHJ0KTsKLX0KLQotc3RhdGljIHZvaWQgX19jcHVpbml0IHRzY19zeW5jX3dhaXQodm9pZCkKLXsKLQkvKgotCSAqIFdoZW4gdGhlIENQVSBoYXMgc3luY2hyb25pemVkIFRTQ3MgYXNzdW1lIHRoZSBCSU9TCi0gIAkgKiBvciB0aGUgaGFyZHdhcmUgYWxyZWFkeSBzeW5jZWQuICBPdGhlcndpc2Ugd2UgY291bGQKLQkgKiBtZXNzIHVwIGEgcG9zc2libGUgcGVyZmVjdCBzeW5jaHJvbml6YXRpb24gd2l0aCBhCi0JICogbm90LXF1aXRlLXBlcmZlY3QgYWxnb3JpdGhtLgotCSAqLwotCWlmIChub3RzY3N5bmMgfHwgIWNwdV9oYXNfdHNjIHx8ICF1bnN5bmNocm9uaXplZF90c2MoKSkKLQkJcmV0dXJuOwotCXN5bmNfdHNjKDApOwotfQotCi1zdGF0aWMgX19pbml0IGludCBub3RzY3N5bmNfc2V0dXAoY2hhciAqcykKLXsKLQlub3RzY3N5bmMgPSAxOwotCXJldHVybiAxOwotfQotX19zZXR1cCgibm90c2NzeW5jIiwgbm90c2NzeW5jX3NldHVwKTsKLQogc3RhdGljIGF0b21pY190IGluaXRfZGVhc3NlcnRlZCBfX2NwdWluaXRkYXRhOwogCiAvKgpAQCAtNTQ2LDYgKzMzNSwxMSBAQAogCS8qIG90aGVyd2lzZSBnY2Mgd2lsbCBtb3ZlIHVwIHRoZSBzbXBfcHJvY2Vzc29yX2lkIGJlZm9yZSB0aGUgY3B1X2luaXQgKi8KIAliYXJyaWVyKCk7CiAKKwkvKgorICAJICogQ2hlY2sgVFNDIHN5bmMgZmlyc3Q6CisgCSAqLworCWNoZWNrX3RzY19zeW5jX3RhcmdldCgpOworCiAJRHByaW50aygiY3B1ICVkOiBzZXR0aW5nIHVwIGFwaWMgY2xvY2tcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7IAkKIAlzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jaygpOwogCkBAIC01NjUsMTQgKzM1OSw2IEBACiAJICovCiAJc2V0X2NwdV9zaWJsaW5nX21hcChzbXBfcHJvY2Vzc29yX2lkKCkpOwogCi0JLyogCi0gIAkgKiBXYWl0IGZvciBUU0Mgc3luYyB0byBub3Qgc2NoZWR1bGUgdGhpbmdzIGJlZm9yZS4KLQkgKiBXZSBzdGlsbCBwcm9jZXNzIGludGVycnVwdHMsIHdoaWNoIGNvdWxkIHNlZSBhbiBpbmNvbnNpc3RlbnQKLQkgKiB0aW1lIGluIHRoYXQgd2luZG93IHVuZm9ydHVuYXRlbHkuIAotCSAqIERvIHRoaXMgaGVyZSBiZWNhdXNlIFRTQyBzeW5jIGhhcyBnbG9iYWwgdW5wcm90ZWN0ZWQgc3RhdGUuCi0gCSAqLwotCXRzY19zeW5jX3dhaXQoKTsKLQogCS8qCiAJICogV2UgbmVlZCB0byBob2xkIGNhbGxfbG9jaywgc28gdGhlcmUgaXMgbm8gaW5jb25zaXN0ZW5jeQogCSAqIGJldHdlZW4gdGhlIHRpbWUgc21wX2NhbGxfZnVuY3Rpb24oKSBkZXRlcm1pbmVzIG51bWJlciBvZgpAQCAtNTkyLDYgKzM3OCw3IEBACiAJY3B1X3NldChzbXBfcHJvY2Vzc29yX2lkKCksIGNwdV9vbmxpbmVfbWFwKTsKIAlwZXJfY3B1KGNwdV9zdGF0ZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IENQVV9PTkxJTkU7CiAJc3Bpbl91bmxvY2soJnZlY3Rvcl9sb2NrKTsKKwogCXVubG9ja19pcGlfY2FsbF9sb2NrKCk7CiAKIAljcHVfaWRsZSgpOwpAQCAtMTE2OCw2ICs5NTUsMTEgQEAKIAkvKiBVbmxlYXNoIHRoZSBDUFUhICovCiAJRHByaW50aygid2FpdGluZyBmb3IgY3B1ICVkXG4iLCBjcHUpOwogCisJLyoKKyAgCSAqIE1ha2Ugc3VyZSBhbmQgY2hlY2sgVFNDIHN5bmM6CisgCSAqLworCWNoZWNrX3RzY19zeW5jX3NvdXJjZShjcHUpOworCiAJd2hpbGUgKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCiAJCWNwdV9yZWxheCgpOwogCkBAIC0xMTkwLDcgKzk4Miw2IEBACiAJc21wX2NsZWFudXBfYm9vdCgpOwogCXNldHVwX2lvYXBpY19kZXN0KCk7CiAJY2hlY2tfbm1pX3dhdGNoZG9nKCk7Ci0JdGltZV9pbml0X2d0b2QoKTsKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKaW5kZXggM2NjNjg4Ni4uYTg3YzUxNyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCkBAIC00MiwxMCArNDIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9ocGV0Lmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaHBldC5oPgogCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRCi1zdGF0aWMgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpOwotI2VuZGlmCiBleHRlcm4gdm9pZCBpODI1NF90aW1lcl9yZXN1bWUodm9pZCk7CiBleHRlcm4gaW50IHVzaW5nX2FwaWNfdGltZXI7CiAKQEAgLTU1LDEyOCArNTMsNyBAQAogRVhQT1JUX1NZTUJPTChydGNfbG9jayk7CiBERUZJTkVfU1BJTkxPQ0soaTgyNTNfbG9jayk7CiAKLWludCBub2hwZXQgX19pbml0ZGF0YSA9IDA7Ci1zdGF0aWMgaW50IG5vdHNjIF9faW5pdGRhdGEgPSAwOwotCi0jZGVmaW5lIFVTRUNfUEVSX1RJQ0sgKFVTRUNfUEVSX1NFQyAvIEhaKQotI2RlZmluZSBOU0VDX1BFUl9USUNLIChOU0VDX1BFUl9TRUMgLyBIWikKLSNkZWZpbmUgRlNFQ19QRVJfVElDSyAoRlNFQ19QRVJfU0VDIC8gSFopCi0KLSNkZWZpbmUgTlNfU0NBTEUJMTAgLyogMl4xMCwgY2FyZWZ1bGx5IGNob3NlbiAqLwotI2RlZmluZSBVU19TQ0FMRQkzMiAvKiAyXjMyLCBhcmJpdHJhbHJpbHkgY2hvc2VuICovCi0KLXVuc2lnbmVkIGludCBjcHVfa2h6OwkJCQkJLyogVFNDIGNsb2NrcyAvIHVzZWMsIG5vdCB1c2VkIGhlcmUgKi8KLUVYUE9SVF9TWU1CT0woY3B1X2toeik7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsJCQkvKiBmc2VjcyAvIEhQRVQgY2xvY2sgKi8KLXVuc2lnbmVkIGxvbmcgaHBldF90aWNrOwkJCQkvKiBIUEVUIGNsb2NrcyAvIGludGVycnVwdCAqLwotaW50IGhwZXRfdXNlX3RpbWVyOwkJCQkvKiBVc2UgY291bnRlciBvZiBocGV0IGZvciB0aW1lIGtlZXBpbmcsIG90aGVyd2lzZSBQSVQgKi8KLXVuc2lnbmVkIGxvbmcgdnh0aW1lX2h6ID0gUElUX1RJQ0tfUkFURTsKLWludCByZXBvcnRfbG9zdF90aWNrczsJCQkJLyogY29tbWFuZCBsaW5lIG9wdGlvbiAqLwotdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19iYXNlOwotCi1zdHJ1Y3Qgdnh0aW1lX2RhdGEgX192eHRpbWUgX19zZWN0aW9uX3Z4dGltZTsJLyogZm9yIHZzeXNjYWxscyAqLwotCiB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9famlmZmllcyBfX3NlY3Rpb25famlmZmllcyA9IElOSVRJQUxfSklGRklFUzsKLXN0cnVjdCB0aW1lc3BlYyBfX3h0aW1lIF9fc2VjdGlvbl94dGltZTsKLXN0cnVjdCB0aW1lem9uZSBfX3N5c190eiBfX3NlY3Rpb25fc3lzX3R6OwotCi0vKgotICogZG9fZ2V0dGltZW9mZnNldCgpIHJldHVybnMgbWljcm9zZWNvbmRzIHNpbmNlIGxhc3QgdGltZXIgaW50ZXJydXB0IHdhcwotICogdHJpZ2dlcmVkIGJ5IGhhcmR3YXJlLiBBIG1lbW9yeSByZWFkIG9mIEhQRVQgaXMgc2xvd2VyIHRoYW4gYSByZWdpc3RlciByZWFkCi0gKiBvZiBUU0MsIGJ1dCBtdWNoIG1vcmUgcmVsaWFibGUuIEl0J3MgYWxzbyBzeW5jaHJvbml6ZWQgdG8gdGhlIHRpbWVyCi0gKiBpbnRlcnJ1cHQuIE5vdGUgdGhhdCBkb19nZXR0aW1lb2Zmc2V0KCkgbWF5IHJldHVybiBtb3JlIHRoYW4gaHBldF90aWNrLCBpZiBhCi0gKiB0aW1lciBpbnRlcnJ1cHQgaGFzIGhhcHBlbmVkIGFscmVhZHksIGJ1dCB2eHRpbWUudHJpZ2dlciB3YXNuJ3QgdXBkYXRlZCB5ZXQuCi0gKiBUaGlzIGlzIG5vdCBhIHByb2JsZW0sIGJlY2F1c2UgamlmZmllcyBoYXNuJ3QgdXBkYXRlZCBlaXRoZXIuIFRoZXkgYXJlIGJvdW5kCi0gKiB0b2dldGhlciBieSB4dGltZV9sb2NrLgotICovCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRvX2dldHRpbWVvZmZzZXRfdHNjKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB0OwotCXVuc2lnbmVkIGxvbmcgeDsKLQl0ID0gZ2V0X2N5Y2xlc19zeW5jKCk7Ci0JaWYgKHQgPCB2eHRpbWUubGFzdF90c2MpIAotCQl0ID0gdnh0aW1lLmxhc3RfdHNjOyAvKiBoYWNrICovCi0JeCA9ICgodCAtIHZ4dGltZS5sYXN0X3RzYykgKiB2eHRpbWUudHNjX3F1b3QpID4+IFVTX1NDQUxFOwotCXJldHVybiB4OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkb19nZXR0aW1lb2Zmc2V0X2hwZXQodm9pZCkKLXsKLQkvKiBjYXAgY291bnRlciByZWFkIHRvIG9uZSB0aWNrIHRvIGF2b2lkIGluY29uc2lzdGVuY2llcyAqLwotCXVuc2lnbmVkIGxvbmcgY291bnRlciA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKSAtIHZ4dGltZS5sYXN0OwotCXJldHVybiAobWluKGNvdW50ZXIsaHBldF90aWNrKSAqIHZ4dGltZS5xdW90KSA+PiBVU19TQ0FMRTsKLX0KLQotdW5zaWduZWQgaW50ICgqZG9fZ2V0dGltZW9mZnNldCkodm9pZCkgPSBkb19nZXR0aW1lb2Zmc2V0X3RzYzsKLQotLyoKLSAqIFRoaXMgdmVyc2lvbiBvZiBnZXR0aW1lb2ZkYXkoKSBoYXMgbWljcm9zZWNvbmQgcmVzb2x1dGlvbiBhbmQgYmV0dGVyIHRoYW4KLSAqIG1pY3Jvc2Vjb25kIHByZWNpc2lvbiwgYXMgd2UncmUgdXNpbmcgYXQgbGVhc3QgYSAxMCBNSHogKHVzdWFsbHkgMTQuMzE4MTgKLSAqIE1IeikgSFBFVCB0aW1lci4KLSAqLwotCi12b2lkIGRvX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYpCi17Ci0JdW5zaWduZWQgbG9uZyBzZXE7Ci0gCXVuc2lnbmVkIGludCBzZWMsIHVzZWM7Ci0KLQlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwotCi0JCXNlYyA9IHh0aW1lLnR2X3NlYzsKLQkJdXNlYyA9IHh0aW1lLnR2X25zZWMgLyBOU0VDX1BFUl9VU0VDOwotCi0JCS8qIGkzODYgZG9lcyBzb21lIGNvcnJlY3Rpb24gaGVyZSB0byBrZWVwIHRoZSBjbG9jayAKLQkJICAgbW9ub3Rvbm91cyBldmVuIHdoZW4gbnRwZCBpcyBmaXhpbmcgZHJpZnQuCi0JCSAgIEJ1dCB0aGV5IGRpZG4ndCB3b3JrIGZvciBtZSwgdGhlcmUgaXMgYSBub24gbW9ub3RvbmljCi0JCSAgIGNsb2NrIGFueXdheXMgd2l0aCBudHAuCi0JCSAgIEkgZHJvcHBlZCBhbGwgY29ycmVjdGlvbnMgbm93IHVudGlsIGEgcmVhbCBzb2x1dGlvbiBjYW4KLQkJICAgYmUgZm91bmQuIE5vdGUgd2hlbiB5b3UgZml4IGl0IGhlcmUgeW91IG5lZWQgdG8gZG8gdGhlIHNhbWUKLQkJICAgaW4gYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMgYW5kIGV4cG9ydCBhbGwgbmVlZGVkCi0JCSAgIHZhcmlhYmxlcyBpbiB2bWxpbnV4Lmxkcy4gLUFLICovIAotCQl1c2VjICs9IGRvX2dldHRpbWVvZmZzZXQoKTsKLQotCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwotCi0JdHYtPnR2X3NlYyA9IHNlYyArIHVzZWMgLyBVU0VDX1BFUl9TRUM7Ci0JdHYtPnR2X3VzZWMgPSB1c2VjICUgVVNFQ19QRVJfU0VDOwotfQotCi1FWFBPUlRfU1lNQk9MKGRvX2dldHRpbWVvZmRheSk7Ci0KLS8qCi0gKiBzZXR0aW1lb2ZkYXkoKSBmaXJzdCB1bmRvZXMgdGhlIGNvcnJlY3Rpb24gdGhhdCBnZXR0aW1lb2ZkYXkgd291bGQgZG8KLSAqIG9uIHRoZSB0aW1lLCBhbmQgdGhlbiBzYXZlcyBpdC4gVGhpcyBpcyB1Z2x5LCBidXQgaGFzIGJlZW4gbGlrZSB0aGlzIGZvcgotICogYWdlcyBhbHJlYWR5LgotICovCi0KLWludCBkb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dikKLXsKLQl0aW1lX3Qgd3RtX3NlYywgc2VjID0gdHYtPnR2X3NlYzsKLQlsb25nIHd0bV9uc2VjLCBuc2VjID0gdHYtPnR2X25zZWM7Ci0KLQlpZiAoKHVuc2lnbmVkIGxvbmcpdHYtPnR2X25zZWMgPj0gTlNFQ19QRVJfU0VDKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKLQotCW5zZWMgLT0gZG9fZ2V0dGltZW9mZnNldCgpICogTlNFQ19QRVJfVVNFQzsKLQotCXd0bV9zZWMgID0gd2FsbF90b19tb25vdG9uaWMudHZfc2VjICsgKHh0aW1lLnR2X3NlYyAtIHNlYyk7Ci0Jd3RtX25zZWMgPSB3YWxsX3RvX21vbm90b25pYy50dl9uc2VjICsgKHh0aW1lLnR2X25zZWMgLSBuc2VjKTsKLQotCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ4dGltZSwgc2VjLCBuc2VjKTsKLQlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIHd0bV9zZWMsIHd0bV9uc2VjKTsKLQotCW50cF9jbGVhcigpOwotCi0Jd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7Ci0JY2xvY2tfd2FzX3NldCgpOwotCXJldHVybiAwOwotfQotCi1FWFBPUlRfU1lNQk9MKGRvX3NldHRpbWVvZmRheSk7CiAKIHVuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTI2Nyw4NCArMTQ0LDkgQEAKIH0KIAogCi0vKiBtb25vdG9uaWNfY2xvY2soKTogcmV0dXJucyAjIG9mIG5hbm9zZWNvbmRzIHBhc3NlZCBzaW5jZSB0aW1lX2luaXQoKQotICoJCU5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gcmV0dXJuIGFjY3VyYXRlCi0gKgkJdGltZSBldmVuIGluIHRoZSBhYnNlbmNlIG9mIG11bHRpcGxlIHRpbWVyIHRpY2tzLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfMl9ucyh1bnNpZ25lZCBsb25nIGxvbmcgY3ljKTsKLXVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2sodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHNlcTsKLSAJdTMyIGxhc3Rfb2Zmc2V0LCB0aGlzX29mZnNldCwgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbG9uZyBiYXNlOwotCi0JaWYgKHZ4dGltZS5tb2RlID09IFZYVElNRV9IUEVUKSB7Ci0JCWRvIHsKLQkJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwotCi0JCQlsYXN0X29mZnNldCA9IHZ4dGltZS5sYXN0OwotCQkJYmFzZSA9IG1vbm90b25pY19iYXNlOwotCQkJdGhpc19vZmZzZXQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0JCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwotCQlvZmZzZXQgPSAodGhpc19vZmZzZXQgLSBsYXN0X29mZnNldCk7Ci0JCW9mZnNldCAqPSBOU0VDX1BFUl9USUNLIC8gaHBldF90aWNrOwotCX0gZWxzZSB7Ci0JCWRvIHsKLQkJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwotCi0JCQlsYXN0X29mZnNldCA9IHZ4dGltZS5sYXN0X3RzYzsKLQkJCWJhc2UgPSBtb25vdG9uaWNfYmFzZTsKLQkJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7Ci0JCXRoaXNfb2Zmc2V0ID0gZ2V0X2N5Y2xlc19zeW5jKCk7Ci0JCW9mZnNldCA9IGN5Y2xlc18yX25zKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpOwotCX0KLQlyZXR1cm4gYmFzZSArIG9mZnNldDsKLX0KLUVYUE9SVF9TWU1CT0wobW9ub3RvbmljX2Nsb2NrKTsKLQotc3RhdGljIG5vaW5saW5lIHZvaWQgaGFuZGxlX2xvc3RfdGlja3MoaW50IGxvc3QpCi17Ci0Jc3RhdGljIGxvbmcgbG9zdF9jb3VudDsKLQlzdGF0aWMgaW50IHdhcm5lZDsKLQlpZiAocmVwb3J0X2xvc3RfdGlja3MpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAidGltZS5jOiBMb3N0ICVkIHRpbWVyIHRpY2socykhICIsIGxvc3QpOwotCQlwcmludF9zeW1ib2woInJpcCAlcylcbiIsIGdldF9pcnFfcmVncygpLT5yaXApOwotCX0KLQotCWlmIChsb3N0X2NvdW50ID09IDEwMDAgJiYgIXdhcm5lZCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXJuaW5nOiBtYW55IGxvc3QgdGlja3MuXG4iCi0JCSAgICAgICBLRVJOX1dBUk5JTkcgIllvdXIgdGltZSBzb3VyY2Ugc2VlbXMgdG8gYmUgaW5zdGFibGUgb3IgIgotCQkgICAJCSJzb21lIGRyaXZlciBpcyBob2dnaW5nIGludGVydXB0c1xuIik7Ci0JCXByaW50X3N5bWJvbCgicmlwICVzXG4iLCBnZXRfaXJxX3JlZ3MoKS0+cmlwKTsKLQkJaWYgKHZ4dGltZS5tb2RlID09IFZYVElNRV9UU0MgJiYgdnh0aW1lLmhwZXRfYWRkcmVzcykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFsbGluZyBiYWNrIHRvIEhQRVRcbiIpOwotCQkJaWYgKGhwZXRfdXNlX3RpbWVyKQotCQkJCXZ4dGltZS5sYXN0ID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCkgLSAKLQkJCQkJCQlocGV0X3RpY2s7Ci0JCQllbHNlCi0JCQkJdnh0aW1lLmxhc3QgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0JCQl2eHRpbWUubW9kZSA9IFZYVElNRV9IUEVUOwotCQkJZG9fZ2V0dGltZW9mZnNldCA9IGRvX2dldHRpbWVvZmZzZXRfaHBldDsKLQkJfQotCQkvKiBlbHNlIHNob3VsZCBmYWxsIGJhY2sgdG8gUElULCBidXQgY29kZSBtaXNzaW5nLiAqLwotCQl3YXJuZWQgPSAxOwotCX0gZWxzZQotCQlsb3N0X2NvdW50Kys7Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKLQkvKiBJbiBzb21lIGNhc2VzIHRoZSBDUFUgY2FuIGNoYW5nZSBmcmVxdWVuY3kgd2l0aG91dCB1cyBub3RpY2luZwotCSAgIEdpdmUgY3B1ZnJlcSBhIGNoYW5nZSB0byBjYXRjaCB1cC4gKi8KLQlpZiAoKGxvc3RfY291bnQrMSkgJSAyNSA9PSAwKQotCQljcHVmcmVxX2RlbGF5ZWRfZ2V0KCk7Ci0jZW5kaWYKLX0KLQogdm9pZCBtYWluX3RpbWVyX2hhbmRsZXIodm9pZCkKIHsKIAlzdGF0aWMgdW5zaWduZWQgbG9uZyBydGNfdXBkYXRlID0gMDsKLQl1bnNpZ25lZCBsb25nIHRzYzsKLQlpbnQgZGVsYXkgPSAwLCBvZmZzZXQgPSAwLCBsb3N0ID0gMDsKLQogLyoKICAqIEhlcmUgd2UgYXJlIGluIHRoZSB0aW1lciBpcnEgaGFuZGxlci4gV2UgaGF2ZSBpcnFzIGxvY2FsbHkgZGlzYWJsZWQgKHNvIHdlCiAgKiBkb24ndCBuZWVkIHNwaW5fbG9ja19pcnFzYXZlKCkpIGJ1dCB3ZSBkb24ndCBrbm93IGlmIHRoZSB0aW1lcl9iaCBpcyBydW5uaW5nCkBAIC0zNTQsNzIgKzE1NiwxMSBAQAogCiAJd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7CiAKLQlpZiAodnh0aW1lLmhwZXRfYWRkcmVzcykKLQkJb2Zmc2V0ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCi0JaWYgKGhwZXRfdXNlX3RpbWVyKSB7Ci0JCS8qIGlmIHdlJ3JlIHVzaW5nIHRoZSBocGV0IHRpbWVyIGZ1bmN0aW9uYWxpdHksCi0JCSAqIHdlIGNhbiBtb3JlIGFjY3VyYXRlbHkga25vdyB0aGUgY291bnRlciB2YWx1ZQotCQkgKiB3aGVuIHRoZSB0aW1lciBpbnRlcnJ1cHQgb2NjdXJlZC4KLQkJICovCi0JCW9mZnNldCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApIC0gaHBldF90aWNrOwotCQlkZWxheSA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKSAtIG9mZnNldDsKLQl9IGVsc2UgaWYgKCFwbXRtcl9pb3BvcnQpIHsKLQkJc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKLQkJb3V0Yl9wKDB4MDAsIDB4NDMpOwotCQlkZWxheSA9IGluYl9wKDB4NDApOwotCQlkZWxheSB8PSBpbmIoMHg0MCkgPDwgODsKLQkJc3Bpbl91bmxvY2soJmk4MjUzX2xvY2spOwotCQlkZWxheSA9IExBVENIIC0gMSAtIGRlbGF5OwotCX0KLQotCXRzYyA9IGdldF9jeWNsZXNfc3luYygpOwotCi0JaWYgKHZ4dGltZS5tb2RlID09IFZYVElNRV9IUEVUKSB7Ci0JCWlmIChvZmZzZXQgLSB2eHRpbWUubGFzdCA+IGhwZXRfdGljaykgewotCQkJbG9zdCA9IChvZmZzZXQgLSB2eHRpbWUubGFzdCkgLyBocGV0X3RpY2sgLSAxOwotCQl9Ci0KLQkJbW9ub3RvbmljX2Jhc2UgKz0gCi0JCQkob2Zmc2V0IC0gdnh0aW1lLmxhc3QpICogTlNFQ19QRVJfVElDSyAvIGhwZXRfdGljazsKLQotCQl2eHRpbWUubGFzdCA9IG9mZnNldDsKLSNpZmRlZiBDT05GSUdfWDg2X1BNX1RJTUVSCi0JfSBlbHNlIGlmICh2eHRpbWUubW9kZSA9PSBWWFRJTUVfUE1UTVIpIHsKLQkJbG9zdCA9IHBtdGltZXJfbWFya19vZmZzZXQoKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCW9mZnNldCA9ICgoKHRzYyAtIHZ4dGltZS5sYXN0X3RzYykgKgotCQkJICAgdnh0aW1lLnRzY19xdW90KSA+PiBVU19TQ0FMRSkgLSBVU0VDX1BFUl9USUNLOwotCi0JCWlmIChvZmZzZXQgPCAwKQotCQkJb2Zmc2V0ID0gMDsKLQotCQlpZiAob2Zmc2V0ID4gVVNFQ19QRVJfVElDSykgewotCQkJbG9zdCA9IG9mZnNldCAvIFVTRUNfUEVSX1RJQ0s7Ci0JCQlvZmZzZXQgJT0gVVNFQ19QRVJfVElDSzsKLQkJfQotCi0JCW1vbm90b25pY19iYXNlICs9IGN5Y2xlc18yX25zKHRzYyAtIHZ4dGltZS5sYXN0X3RzYyk7Ci0KLQkJdnh0aW1lLmxhc3RfdHNjID0gdHNjIC0gdnh0aW1lLnF1b3QgKiBkZWxheSAvIHZ4dGltZS50c2NfcXVvdDsKLQotCQlpZiAoKCgodHNjIC0gdnh0aW1lLmxhc3RfdHNjKSAqCi0JCSAgICAgIHZ4dGltZS50c2NfcXVvdCkgPj4gVVNfU0NBTEUpIDwgb2Zmc2V0KQotCQkJdnh0aW1lLmxhc3RfdHNjID0gdHNjIC0KLQkJCQkoKChsb25nKSBvZmZzZXQgPDwgVVNfU0NBTEUpIC8gdnh0aW1lLnRzY19xdW90KSAtIDE7Ci0JfQotCi0JaWYgKGxvc3QgPiAwKQotCQloYW5kbGVfbG9zdF90aWNrcyhsb3N0KTsKLQllbHNlCi0JCWxvc3QgPSAwOwotCiAvKgogICogRG8gdGhlIHRpbWVyIHN0dWZmLgogICovCiAKLQlkb190aW1lcihsb3N0ICsgMSk7CisJZG9fdGltZXIoMSk7CiAjaWZuZGVmIENPTkZJR19TTVAKIAl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKICNlbmRpZgpAQCAtNDYwLDQwICsyMDEsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBjeWMybnNfc2NhbGUgX19yZWFkX21vc3RseTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNldF9jeWMybnNfc2NhbGUodW5zaWduZWQgbG9uZyBjcHVfa2h6KQotewotCWN5YzJuc19zY2FsZSA9IChOU0VDX1BFUl9NU0VDIDw8IE5TX1NDQUxFKSAvIGNwdV9raHo7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc18yX25zKHVuc2lnbmVkIGxvbmcgbG9uZyBjeWMpCi17Ci0JcmV0dXJuIChjeWMgKiBjeWMybnNfc2NhbGUpID4+IE5TX1NDQUxFOwotfQotCi11bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGEgPSAwOwotCi0jaWYgMAotCS8qIERvbid0IGRvIGEgSFBFVCByZWFkIGhlcmUuIFVzaW5nIFRTQyBhbHdheXMgaXMgbXVjaCBmYXN0ZXIKLQkgICBhbmQgSFBFVCBtYXkgbm90IGJlIG1hcHBlZCB5ZXQgd2hlbiB0aGUgc2NoZWR1bGVyIGZpcnN0IHJ1bnMuCi0gICAgICAgICAgIERpc2FkdmFudGFnZSBpcyBhIHNtYWxsIGRyaWZ0IGJldHdlZW4gQ1BVcyBpbiBzb21lIGNvbmZpZ3VyYXRpb25zLAotCSAgIGJ1dCB0aGF0IHNob3VsZCBiZSB0b2xlcmFibGUuICovCi0JaWYgKF9fdnh0aW1lLm1vZGUgPT0gVlhUSU1FX0hQRVQpCi0JCXJldHVybiAoaHBldF9yZWFkbChIUEVUX0NPVU5URVIpICogdnh0aW1lLnF1b3QpID4+IFVTX1NDQUxFOwotI2VuZGlmCi0KLQkvKiBDb3VsZCBkbyBDUFUgY29yZSBzeW5jIGhlcmUuIE9wdGVyb24gY2FuIGV4ZWN1dGUgcmR0c2Mgc3BlY3VsYXRpdmVseSwKLQkgICB3aGljaCBtZWFucyBpdCBpcyBub3QgY29tcGxldGVseSBleGFjdCBhbmQgbWF5IG5vdCBiZSBtb25vdG9ub3VzIGJldHdlZW4KLQkgICBDUFVzLiBCdXQgdGhlIGVycm9ycyBzaG91bGQgYmUgdG9vIHNtYWxsIHRvIG1hdHRlciBmb3Igc2NoZWR1bGluZwotCSAgIHB1cnBvc2VzLiAqLwotCi0JcmR0c2NsbChhKTsKLQlyZXR1cm4gY3ljbGVzXzJfbnMoYSk7Ci19Ci0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjOwpAQCAtNTQ1LDE2NCArMjUyLDYgQEAKIAlyZXR1cm4gbWt0aW1lKHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKLQotLyogRnJlcXVlbmN5IHNjYWxpbmcgc3VwcG9ydC4gQWRqdXN0IHRoZSBUU0MgYmFzZWQgdGltZXIgd2hlbiB0aGUgY3B1IGZyZXF1ZW5jeQotICAgY2hhbmdlcy4KLSAgIAotICAgUkVELVBFTjogT24gU01QIHdlIGFzc3VtZSBhbGwgQ1BVcyBydW4gd2l0aCB0aGUgc2FtZSBmcmVxdWVuY3kuICBJdCdzCi0gICBub3QgdGhhdCBpbXBvcnRhbnQgYmVjYXVzZSBjdXJyZW50IE9wdGVyb24gc2V0dXBzIGRvIG5vdCBzdXBwb3J0Ci0gICBzY2FsaW5nIG9uIFNNUCBhbnlyb2Fkcy4KLQotICAgU2hvdWxkIGZpeCB1cCBsYXN0X3RzYyB0b28uIEN1cnJlbnRseSBnZXR0aW1lb2ZkYXkgaW4gdGhlCi0gICBmaXJzdCB0aWNrIGFmdGVyIHRoZSBjaGFuZ2Ugd2lsbCBiZSBzbGlnaHRseSB3cm9uZy4gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi1zdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9pbml0ID0gMDsKLXN0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrOwotCi1zdGF0aWMgdm9pZCBoYW5kbGVfY3B1ZnJlcV9kZWxheWVkX2dldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnYpCi17Ci0JdW5zaWduZWQgaW50IGNwdTsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQljcHVmcmVxX2dldChjcHUpOwotCX0KLQljcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7Ci19Ci0KLS8qIGlmIHdlIG5vdGljZSBsb3N0IHRpY2tzLCBzY2hlZHVsZSBhIGNhbGwgdG8gY3B1ZnJlcV9nZXQoKSBhcyBpdCB0cmllcwotICogdG8gdmVyaWZ5IHRoZSBDUFUgZnJlcXVlbmN5IHRoZSB0aW1pbmcgY29yZSB0aGlua3MgdGhlIENQVSBpcyBydW5uaW5nCi0gKiBhdCBpcyBzdGlsbCBjb3JyZWN0LgotICovCi1zdGF0aWMgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpCi17Ci0Jc3RhdGljIGludCB3YXJuZWQ7Ci0JaWYgKGNwdWZyZXFfaW5pdCAmJiAhY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQpIHsKLQkJY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAxOwotCQlpZiAoIXdhcm5lZCkgewotCQkJd2FybmVkID0gMTsKLQkJCXByaW50ayhLRVJOX0RFQlVHIAotCSJMb3Npbmcgc29tZSB0aWNrcy4uLiBjaGVja2luZyBpZiBDUFUgZnJlcXVlbmN5IGNoYW5nZWQuXG4iKTsKLQkJfQotCQlzY2hlZHVsZV93b3JrKCZjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcmspOwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCAgcmVmX2ZyZXEgPSAwOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5X3JlZiA9IDA7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9raHpfcmVmID0gMDsKLQotc3RhdGljIGludCB0aW1lX2NwdWZyZXFfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCi0JCQkJIHZvaWQgKmRhdGEpCi17Ci0gICAgICAgIHN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcmVxID0gZGF0YTsKLQl1bnNpZ25lZCBsb25nICpscGosIGR1bW15OwotCi0JaWYgKGNwdV9oYXMoJmNwdV9kYXRhW2ZyZXEtPmNwdV0sIFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQykpCi0JCXJldHVybiAwOwotCi0JbHBqID0gJmR1bW15OwotCWlmICghKGZyZXEtPmZsYWdzICYgQ1BVRlJFUV9DT05TVF9MT09QUykpCi0jaWZkZWYgQ09ORklHX1NNUAotCQlscGogPSAmY3B1X2RhdGFbZnJlcS0+Y3B1XS5sb29wc19wZXJfamlmZnk7Ci0jZWxzZQotCQlscGogPSAmYm9vdF9jcHVfZGF0YS5sb29wc19wZXJfamlmZnk7Ci0jZW5kaWYKLQotCWlmICghcmVmX2ZyZXEpIHsKLQkJcmVmX2ZyZXEgPSBmcmVxLT5vbGQ7Ci0JCWxvb3BzX3Blcl9qaWZmeV9yZWYgPSAqbHBqOwotCQljcHVfa2h6X3JlZiA9IGNwdV9raHo7Ci0JfQotICAgICAgICBpZiAoKHZhbCA9PSBDUFVGUkVRX1BSRUNIQU5HRSAgJiYgZnJlcS0+b2xkIDwgZnJlcS0+bmV3KSB8fAotICAgICAgICAgICAgKHZhbCA9PSBDUFVGUkVRX1BPU1RDSEFOR0UgJiYgZnJlcS0+b2xkID4gZnJlcS0+bmV3KSB8fAotCSAgICAodmFsID09IENQVUZSRVFfUkVTVU1FQ0hBTkdFKSkgewotICAgICAgICAgICAgICAgICpscGogPQotCQljcHVmcmVxX3NjYWxlKGxvb3BzX3Blcl9qaWZmeV9yZWYsIHJlZl9mcmVxLCBmcmVxLT5uZXcpOwotCi0JCWNwdV9raHogPSBjcHVmcmVxX3NjYWxlKGNwdV9raHpfcmVmLCByZWZfZnJlcSwgZnJlcS0+bmV3KTsKLQkJaWYgKCEoZnJlcS0+ZmxhZ3MgJiBDUFVGUkVRX0NPTlNUX0xPT1BTKSkKLQkJCXZ4dGltZS50c2NfcXVvdCA9IChVU0VDX1BFUl9NU0VDIDw8IFVTX1NDQUxFKSAvIGNwdV9raHo7Ci0JfQotCQotCXNldF9jeWMybnNfc2NhbGUoY3B1X2toel9yZWYpOwotCi0JcmV0dXJuIDA7Ci19Ci0gCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jayA9IHsKLSAgICAgICAgIC5ub3RpZmllcl9jYWxsICA9IHRpbWVfY3B1ZnJlcV9ub3RpZmllcgotfTsKLQotc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV90c2Modm9pZCkKLXsKLQlJTklUX1dPUksoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yaywgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQpOwotCWlmICghY3B1ZnJlcV9yZWdpc3Rlcl9ub3RpZmllcigmdGltZV9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrLAotCQkJCSAgICAgICBDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpKQotCQljcHVmcmVxX2luaXQgPSAxOwotCXJldHVybiAwOwotfQotCi1jb3JlX2luaXRjYWxsKGNwdWZyZXFfdHNjKTsKLQotI2VuZGlmCi0KLS8qCi0gKiBjYWxpYnJhdGVfdHNjKCkgY2FsaWJyYXRlcyB0aGUgcHJvY2Vzc29yIFRTQyBpbiBhIHZlcnkgc2ltcGxlIHdheSwgY29tcGFyaW5nCi0gKiBpdCB0byB0aGUgSFBFVCB0aW1lciBvZiBrbm93biBmcmVxdWVuY3kuCi0gKi8KLQotI2RlZmluZSBUSUNLX0NPVU5UIDEwMDAwMDAwMAotI2RlZmluZSBUSUNLX01JTiAgIDUwMDAKLSNkZWZpbmUgTUFYX1JFQURfUkVUUklFUyA1Ci0KLS8qCi0gKiBTb21lIHBsYXRmb3JtcyB0YWtlIHBlcmlvZGljIFNNSSBpbnRlcnJ1cHRzIHdpdGggNW1zIGR1cmF0aW9uLiBNYWtlIHN1cmUgbm9uZQotICogb2NjdXJzIGJldHdlZW4gdGhlIHJlYWRzIG9mIHRoZSBocGV0ICYgVFNDLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVhZF9ocGV0X3RzYyhpbnQgKmhwZXQsIGludCAqdHNjKQotewotCWludCB0c2MxLCB0c2MyLCBocGV0MSwgcmV0cmllcyA9IDA7Ci0Jc3RhdGljIGludCBtc2c7Ci0KLQlkbyB7Ci0JCXRzYzEgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQkJaHBldDEgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0JCXRzYzIgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQl9IHdoaWxlICh0c2MyIC0gdHNjMSA+IFRJQ0tfTUlOICYmIHJldHJpZXMrKyA8IE1BWF9SRUFEX1JFVFJJRVMpOwotCWlmIChyZXRyaWVzID49IE1BWF9SRUFEX1JFVFJJRVMgJiYgIW1zZysrKQotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiaHBldC5jOiBleGNlZWRlZCBtYXggcmV0cmllcyB0byByZWFkIEhQRVQgJiBUU0NcbiIpOwotCSpocGV0ID0gaHBldDE7Ci0JKnRzYyA9IHRzYzI7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgaHBldF9jYWxpYnJhdGVfdHNjKHZvaWQpCi17Ci0JaW50IHRzY19zdGFydCwgaHBldF9zdGFydDsKLQlpbnQgdHNjX25vdywgaHBldF9ub3c7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCi0JcmVhZF9ocGV0X3RzYygmaHBldF9zdGFydCwgJnRzY19zdGFydCk7Ci0KLQlkbyB7Ci0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCXJlYWRfaHBldF90c2MoJmhwZXRfbm93LCAmdHNjX25vdyk7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQl9IHdoaWxlICgodHNjX25vdyAtIHRzY19zdGFydCkgPCBUSUNLX0NPVU5UICYmCi0JCSAoaHBldF9ub3cgLSBocGV0X3N0YXJ0KSA8IFRJQ0tfQ09VTlQpOwotCi0JcmV0dXJuICh0c2Nfbm93IC0gdHNjX3N0YXJ0KSAqIDEwMDAwMDAwMDBMCi0JCS8gKChocGV0X25vdyAtIGhwZXRfc3RhcnQpICogaHBldF9wZXJpb2QgLyAxMDAwKTsKLX0KLQogCiAvKgogICogcGl0X2NhbGlicmF0ZV90c2MoKSB1c2VzIHRoZSBzcGVha2VyIG91dHB1dCAoY2hhbm5lbCAyKSBvZgpAQCAtNzMzLDEyNCArMjgyLDYgQEAKIAlyZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIDUwOwogfQogCi0jaWZkZWYJQ09ORklHX0hQRVQKLXN0YXRpYyBfX2luaXQgaW50IGxhdGVfaHBldF9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGhwZXRfZGF0YQloZDsKLQl1bnNpZ25lZCBpbnQgCQludGltZXI7Ci0KLQlpZiAoIXZ4dGltZS5ocGV0X2FkZHJlc3MpCi0gICAgICAgIAlyZXR1cm4gMDsKLQotCW1lbXNldCgmaGQsIDAsIHNpemVvZiAoaGQpKTsKLQotCW50aW1lciA9IGhwZXRfcmVhZGwoSFBFVF9JRCk7Ci0JbnRpbWVyID0gKG50aW1lciAmIEhQRVRfSURfTlVNQkVSKSA+PiBIUEVUX0lEX05VTUJFUl9TSElGVDsKLQludGltZXIrKzsKLQotCS8qCi0JICogUmVnaXN0ZXIgd2l0aCBkcml2ZXIuCi0JICogVGltZXIwIGFuZCBUaW1lcjEgaXMgdXNlZCBieSBwbGF0Zm9ybS4KLQkgKi8KLQloZC5oZF9waHlzX2FkZHJlc3MgPSB2eHRpbWUuaHBldF9hZGRyZXNzOwotCWhkLmhkX2FkZHJlc3MgPSAodm9pZCBfX2lvbWVtICopZml4X3RvX3ZpcnQoRklYX0hQRVRfQkFTRSk7Ci0JaGQuaGRfbmlycXMgPSBudGltZXI7Ci0JaGQuaGRfZmxhZ3MgPSBIUEVUX0RBVEFfUExBVEZPUk07Ci0JaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMCk7Ci0jaWZkZWYJQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKLQlocGV0X3Jlc2VydmVfdGltZXIoJmhkLCAxKTsKLSNlbmRpZgotCWhkLmhkX2lycVswXSA9IEhQRVRfTEVHQUNZXzgyNTQ7Ci0JaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOwotCWlmIChudGltZXIgPiAyKSB7Ci0JCXN0cnVjdCBocGV0CQkqaHBldDsKLQkJc3RydWN0IGhwZXRfdGltZXIJKnRpbWVyOwotCQlpbnQJCQlpOwotCi0JCWhwZXQgPSAoc3RydWN0IGhwZXQgKikgZml4X3RvX3ZpcnQoRklYX0hQRVRfQkFTRSk7Ci0JCXRpbWVyID0gJmhwZXQtPmhwZXRfdGltZXJzWzJdOwotCQlmb3IgKGkgPSAyOyBpIDwgbnRpbWVyOyB0aW1lcisrLCBpKyspCi0JCQloZC5oZF9pcnFbaV0gPSAodGltZXItPmhwZXRfY29uZmlnICYKLQkJCQkJVG5fSU5UX1JPVVRFX0NORl9NQVNLKSA+PgotCQkJCVRuX0lOVF9ST1VURV9DTkZfU0hJRlQ7Ci0KLQl9Ci0KLQlocGV0X2FsbG9jKCZoZCk7Ci0JcmV0dXJuIDA7Ci19Ci1mc19pbml0Y2FsbChsYXRlX2hwZXRfaW5pdCk7Ci0jZW5kaWYKLQotc3RhdGljIGludCBocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKHVuc2lnbmVkIGxvbmcgdGljaykKLXsKLQl1bnNpZ25lZCBpbnQgY2ZnOwotCi0vKgotICogU3RvcCB0aGUgdGltZXJzIGFuZCByZXNldCB0aGUgbWFpbiBjb3VudGVyLgotICovCi0KLQljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKLQljZmcgJj0gfihIUEVUX0NGR19FTkFCTEUgfCBIUEVUX0NGR19MRUdBQ1kpOwotCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOwotCWhwZXRfd3JpdGVsKDAsIEhQRVRfQ09VTlRFUik7Ci0JaHBldF93cml0ZWwoMCwgSFBFVF9DT1VOVEVSICsgNCk7Ci0KLS8qCi0gKiBTZXQgdXAgdGltZXIgMCwgYXMgcGVyaW9kaWMgd2l0aCBmaXJzdCBpbnRlcnJ1cHQgdG8gaGFwcGVuIGF0IGhwZXRfdGljaywKLSAqIGFuZCBwZXJpb2QgYWxzbyBocGV0X3RpY2suCi0gKi8KLQlpZiAoaHBldF91c2VfdGltZXIpIHsKLQkJaHBldF93cml0ZWwoSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROX1BFUklPRElDIHwgSFBFVF9UTl9TRVRWQUwgfAotCQkgICAgSFBFVF9UTl8zMkJJVCwgSFBFVF9UMF9DRkcpOwotCQlocGV0X3dyaXRlbChocGV0X3RpY2ssIEhQRVRfVDBfQ01QKTsgLyogbmV4dCBpbnRlcnJ1cHQgKi8KLQkJaHBldF93cml0ZWwoaHBldF90aWNrLCBIUEVUX1QwX0NNUCk7IC8qIHBlcmlvZCAqLwotCQljZmcgfD0gSFBFVF9DRkdfTEVHQUNZOwotCX0KLS8qCi0gKiBHbyEKLSAqLwotCi0JY2ZnIHw9IEhQRVRfQ0ZHX0VOQUJMRTsKLQlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhwZXRfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBpZDsKLQotCWlmICghdnh0aW1lLmhwZXRfYWRkcmVzcykKLQkJcmV0dXJuIC0xOwotCXNldF9maXhtYXBfbm9jYWNoZShGSVhfSFBFVF9CQVNFLCB2eHRpbWUuaHBldF9hZGRyZXNzKTsKLQlfX3NldF9maXhtYXAoVlNZU0NBTExfSFBFVCwgdnh0aW1lLmhwZXRfYWRkcmVzcywgUEFHRV9LRVJORUxfVlNZU0NBTExfTk9DQUNIRSk7Ci0KLS8qCi0gKiBSZWFkIHRoZSBwZXJpb2QsIGNvbXB1dGUgdGljayBhbmQgcXVvdGllbnQuCi0gKi8KLQotCWlkID0gaHBldF9yZWFkbChIUEVUX0lEKTsKLQotCWlmICghKGlkICYgSFBFVF9JRF9WRU5ET1IpIHx8ICEoaWQgJiBIUEVUX0lEX05VTUJFUikpCi0JCXJldHVybiAtMTsKLQotCWhwZXRfcGVyaW9kID0gaHBldF9yZWFkbChIUEVUX1BFUklPRCk7Ci0JaWYgKGhwZXRfcGVyaW9kIDwgMTAwMDAwIHx8IGhwZXRfcGVyaW9kID4gMTAwMDAwMDAwKQotCQlyZXR1cm4gLTE7Ci0KLQlocGV0X3RpY2sgPSAoRlNFQ19QRVJfVElDSyArIGhwZXRfcGVyaW9kIC8gMikgLyBocGV0X3BlcmlvZDsKLQotCWhwZXRfdXNlX3RpbWVyID0gKGlkICYgSFBFVF9JRF9MRUdTVVApOwotCi0JcmV0dXJuIGhwZXRfdGltZXJfc3RvcF9zZXRfZ28oaHBldF90aWNrKTsKLX0KLQotc3RhdGljIGludCBocGV0X3JlZW5hYmxlKHZvaWQpCi17Ci0JcmV0dXJuIGhwZXRfdGltZXJfc3RvcF9zZXRfZ28oaHBldF90aWNrKTsKLX0KLQogI2RlZmluZSBQSVRfTU9ERSAweDQzCiAjZGVmaW5lIFBJVF9DSDAgIDB4NDAKIApAQCAtODc4LDcgKzMwOSw3IEBACiB2b2lkIF9faW5pdCBzdG9wX3RpbWVyX2ludGVycnVwdCh2b2lkKQogewogCWNoYXIgKm5hbWU7Ci0JaWYgKHZ4dGltZS5ocGV0X2FkZHJlc3MpIHsKKwlpZiAoaHBldF9hZGRyZXNzKSB7CiAJCW5hbWUgPSAiSFBFVCI7CiAJCWhwZXRfdGltZXJfc3RvcF9zZXRfZ28oMCk7CiAJfSBlbHNlIHsKQEAgLTg4OCwxMiArMzE5LDYgQEAKIAlwcmludGsoS0VSTl9JTkZPICJ0aW1lcjogJXMgaW50ZXJydXB0IHN0b3BwZWQuXG4iLCBuYW1lKTsKIH0KIAotaW50IF9faW5pdCB0aW1lX3NldHVwKGNoYXIgKnN0cikKLXsKLQlyZXBvcnRfbG9zdF90aWNrcyA9IDE7Ci0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgPSB7CiAJdGltZXJfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCBDUFVfTUFTS19OT05FLCAidGltZXIiLCBOVUxMLCBOVUxMCiB9OwpAQCAtOTAxLDEyNCArMzI2LDQxIEBACiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKIAlpZiAobm9ocGV0KQotCQl2eHRpbWUuaHBldF9hZGRyZXNzID0gMDsKLQorCQlocGV0X2FkZHJlc3MgPSAwOwogCXh0aW1lLnR2X3NlYyA9IGdldF9jbW9zX3RpbWUoKTsKIAl4dGltZS50dl9uc2VjID0gMDsKIAogCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywKIAkgICAgICAgICAgICAgICAgICAgICAgICAteHRpbWUudHZfc2VjLCAteHRpbWUudHZfbnNlYyk7CiAKLQlpZiAoIWhwZXRfaW5pdCgpKQotICAgICAgICAgICAgICAgIHZ4dGltZV9oeiA9IChGU0VDX1BFUl9TRUMgKyBocGV0X3BlcmlvZCAvIDIpIC8gaHBldF9wZXJpb2Q7Ci0JZWxzZQotCQl2eHRpbWUuaHBldF9hZGRyZXNzID0gMDsKKwlpZiAoaHBldF9hcmNoX2luaXQoKSkKKwkJaHBldF9hZGRyZXNzID0gMDsKIAogCWlmIChocGV0X3VzZV90aW1lcikgewogCQkvKiBzZXQgdGlja19uc2VjIHRvIHVzZSB0aGUgcHJvcGVyIHJhdGUgZm9yIEhQRVQgKi8KIAkgIAl0aWNrX25zZWMgPSBUSUNLX05TRUNfSFBFVDsKIAkJY3B1X2toeiA9IGhwZXRfY2FsaWJyYXRlX3RzYygpOwogCQl0aW1lbmFtZSA9ICJIUEVUIjsKLSNpZmRlZiBDT05GSUdfWDg2X1BNX1RJTUVSCi0JfSBlbHNlIGlmIChwbXRtcl9pb3BvcnQgJiYgIXZ4dGltZS5ocGV0X2FkZHJlc3MpIHsKLQkJdnh0aW1lX2h6ID0gUE1fVElNRVJfRlJFUVVFTkNZOwotCQl0aW1lbmFtZSA9ICJQTSI7Ci0JCXBpdF9pbml0KCk7Ci0JCWNwdV9raHogPSBwaXRfY2FsaWJyYXRlX3RzYygpOwotI2VuZGlmCiAJfSBlbHNlIHsKIAkJcGl0X2luaXQoKTsKIAkJY3B1X2toeiA9IHBpdF9jYWxpYnJhdGVfdHNjKCk7CiAJCXRpbWVuYW1lID0gIlBJVCI7CiAJfQogCi0Jdnh0aW1lLm1vZGUgPSBWWFRJTUVfVFNDOwotCXZ4dGltZS5xdW90ID0gKFVTRUNfUEVSX1NFQyA8PCBVU19TQ0FMRSkgLyB2eHRpbWVfaHo7Ci0Jdnh0aW1lLnRzY19xdW90ID0gKFVTRUNfUEVSX01TRUMgPDwgVVNfU0NBTEUpIC8gY3B1X2toejsKLQl2eHRpbWUubGFzdF90c2MgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHopOwotCXNldHVwX2lycSgwLCAmaXJxMCk7Ci0KLSNpZm5kZWYgQ09ORklHX1NNUAotCXRpbWVfaW5pdF9ndG9kKCk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIE1ha2UgYW4gZWR1Y2F0ZWQgZ3Vlc3MgaWYgdGhlIFRTQyBpcyB0cnVzdHdvcnRoeSBhbmQgc3luY2hyb25pemVkCi0gKiBvdmVyIGFsbCBDUFVzLgotICovCi1fX2NwdWluaXQgaW50IHVuc3luY2hyb25pemVkX3RzYyh2b2lkKQotewotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoYXBpY19pc19jbHVzdGVyZWRfYm94KCkpCi0JCXJldHVybiAxOwotI2VuZGlmCi0JLyogTW9zdCBpbnRlbCBzeXN0ZW1zIGhhdmUgc3luY2hyb25pemVkIFRTQ3MgZXhjZXB0IGZvcgotCSAgIG11bHRpIG5vZGUgc3lzdGVtcyAqLwotIAlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpIHsKLSNpZmRlZiBDT05GSUdfQUNQSQotCQkvKiBCdXQgVFNDIGRvZXNuJ3QgdGljayBpbiBDMyBzbyBkb24ndCB1c2UgaXQgdGhlcmUgKi8KLQkJaWYgKGFjcGlfZ2JsX0ZBRFQuaGVhZGVyLmxlbmd0aCA+IDAgJiYgYWNwaV9nYmxfRkFEVC5DM2xhdGVuY3kgPCAxMDAwKQotCQkJcmV0dXJuIDE7Ci0jZW5kaWYKLSAJCXJldHVybiAwOwotCX0KLQotIAkvKiBBc3N1bWUgbXVsdGkgc29ja2V0IHN5c3RlbXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQgKi8KLSAJcmV0dXJuIG51bV9wcmVzZW50X2NwdXMoKSA+IDE7Ci19Ci0KLS8qCi0gKiBEZWNpZGUgd2hhdCBtb2RlIGdldHRpbWVvZmRheSBzaG91bGQgdXNlLgotICovCi12b2lkIHRpbWVfaW5pdF9ndG9kKHZvaWQpCi17Ci0JY2hhciAqdGltZXR5cGU7Ci0KIAlpZiAodW5zeW5jaHJvbml6ZWRfdHNjKCkpCi0JCW5vdHNjID0gMTsKKwkJbWFya190c2NfdW5zdGFibGUoKTsKIAotIAlpZiAoY3B1X2hhcygmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfUkRUU0NQKSkKKwlpZiAoY3B1X2hhcygmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfUkRUU0NQKSkKIAkJdmdldGNwdV9tb2RlID0gVkdFVENQVV9SRFRTQ1A7CiAJZWxzZQogCQl2Z2V0Y3B1X21vZGUgPSBWR0VUQ1BVX0xTTDsKIAotCWlmICh2eHRpbWUuaHBldF9hZGRyZXNzICYmIG5vdHNjKSB7Ci0JCXRpbWV0eXBlID0gaHBldF91c2VfdGltZXIgPyAiSFBFVCIgOiAiUElUL0hQRVQiOwotCQlpZiAoaHBldF91c2VfdGltZXIpCi0JCQl2eHRpbWUubGFzdCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApIC0gaHBldF90aWNrOwotCQllbHNlCi0JCQl2eHRpbWUubGFzdCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQkJdnh0aW1lLm1vZGUgPSBWWFRJTUVfSFBFVDsKLQkJZG9fZ2V0dGltZW9mZnNldCA9IGRvX2dldHRpbWVvZmZzZXRfaHBldDsKLSNpZmRlZiBDT05GSUdfWDg2X1BNX1RJTUVSCi0JLyogVXNpbmcgUE0gZm9yIGdldHRpbWVvZmRheSBpcyBxdWl0ZSBzbG93LCBidXQgd2UgaGF2ZSBubyBvdGhlcgotCSAgIGNob2ljZSBiZWNhdXNlIHRoZSBUU0MgaXMgdG9vIHVucmVsaWFibGUgb24gc29tZSBzeXN0ZW1zLiAqLwotCX0gZWxzZSBpZiAocG10bXJfaW9wb3J0ICYmICF2eHRpbWUuaHBldF9hZGRyZXNzICYmIG5vdHNjKSB7Ci0JCXRpbWV0eXBlID0gIlBNIjsKLQkJZG9fZ2V0dGltZW9mZnNldCA9IGRvX2dldHRpbWVvZmZzZXRfcG07Ci0JCXZ4dGltZS5tb2RlID0gVlhUSU1FX1BNVE1SOwotCQlzeXNjdGxfdnN5c2NhbGwgPSAwOwotCQlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxpbmcgdnN5c2NhbGwgZHVlIHRvIHVzZSBvZiBQTSB0aW1lclxuIik7Ci0jZW5kaWYKLQl9IGVsc2UgewotCQl0aW1ldHlwZSA9IGhwZXRfdXNlX3RpbWVyID8gIkhQRVQvVFNDIiA6ICJQSVQvVFNDIjsKLQkJdnh0aW1lLm1vZGUgPSBWWFRJTUVfVFNDOwotCX0KLQotCXByaW50ayhLRVJOX0lORk8gInRpbWUuYzogVXNpbmcgJWxkLiUwNmxkIE1IeiBXQUxMICVzIEdUT0QgJXMgdGltZXIuXG4iLAotCSAgICAgICB2eHRpbWVfaHogLyAxMDAwMDAwLCB2eHRpbWVfaHogJSAxMDAwMDAwLCB0aW1lbmFtZSwgdGltZXR5cGUpOworCXNldF9jeWMybnNfc2NhbGUoY3B1X2toeik7CiAJcHJpbnRrKEtFUk5fSU5GTyAidGltZS5jOiBEZXRlY3RlZCAlZC4lMDNkIE1IeiBwcm9jZXNzb3IuXG4iLAogCQljcHVfa2h6IC8gMTAwMCwgY3B1X2toeiAlIDEwMDApOwotCXZ4dGltZS5xdW90ID0gKFVTRUNfUEVSX1NFQyA8PCBVU19TQ0FMRSkgLyB2eHRpbWVfaHo7Ci0Jdnh0aW1lLnRzY19xdW90ID0gKFVTRUNfUEVSX01TRUMgPDwgVVNfU0NBTEUpIC8gY3B1X2toejsKLQl2eHRpbWUubGFzdF90c2MgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQotCXNldF9jeWMybnNfc2NhbGUoY3B1X2toeik7CisJc2V0dXBfaXJxKDAsICZpcnEwKTsKIH0KIAotX19zZXR1cCgicmVwb3J0X2xvc3RfdGlja3MiLCB0aW1lX3NldHVwKTsKIAogc3RhdGljIGxvbmcgY2xvY2tfY21vc19kaWZmOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2xlZXBfc3RhcnQ7CkBAIC0xMDU1LDcgKzM5Nyw3IEBACiAJCXNsZWVwX2xlbmd0aCA9IDA7CiAJCWN0aW1lID0gc2xlZXBfc3RhcnQ7CiAJfQotCWlmICh2eHRpbWUuaHBldF9hZGRyZXNzKQorCWlmIChocGV0X2FkZHJlc3MpCiAJCWhwZXRfcmVlbmFibGUoKTsKIAllbHNlCiAJCWk4MjU0X3RpbWVyX3Jlc3VtZSgpOwpAQCAtMTA2NCwyMCArNDA2LDggQEAKIAl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssZmxhZ3MpOwogCXh0aW1lLnR2X3NlYyA9IHNlYzsKIAl4dGltZS50dl9uc2VjID0gMDsKLQlpZiAodnh0aW1lLm1vZGUgPT0gVlhUSU1FX0hQRVQpIHsKLQkJaWYgKGhwZXRfdXNlX3RpbWVyKQotCQkJdnh0aW1lLmxhc3QgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ01QKSAtIGhwZXRfdGljazsKLQkJZWxzZQotCQkJdnh0aW1lLmxhc3QgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0jaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgotCX0gZWxzZSBpZiAodnh0aW1lLm1vZGUgPT0gVlhUSU1FX1BNVE1SKSB7Ci0JCXBtdGltZXJfcmVzdW1lKCk7Ci0jZW5kaWYKLQl9IGVsc2UKLQkJdnh0aW1lLmxhc3RfdHNjID0gZ2V0X2N5Y2xlc19zeW5jKCk7Ci0Jd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssZmxhZ3MpOwogCWppZmZpZXMgKz0gc2xlZXBfbGVuZ3RoOwotCW1vbm90b25pY19iYXNlICs9IHNsZWVwX2xlbmd0aCAqIChOU0VDX1BFUl9TRUMvSFopOworCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLGZsYWdzKTsKIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMTAzLDI3MCArNDMzLDMgQEAKIH0KIAogZGV2aWNlX2luaXRjYWxsKHRpbWVfaW5pdF9kZXZpY2UpOwotCi0jaWZkZWYgQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKLS8qIEhQRVQgaW4gTGVnYWN5UmVwbGFjZW1lbnQgTW9kZSBlYXRzIHVwIFJUQyBpbnRlcnJ1cHQgbGluZS4gV2hlbiwgSFBFVAotICogaXMgZW5hYmxlZCwgd2Ugc3VwcG9ydCBSVEMgaW50ZXJydXB0IGZ1bmN0aW9uYWxpdHkgaW4gc29mdHdhcmUuCi0gKiBSVEMgaGFzIDMga2luZHMgb2YgaW50ZXJydXB0czoKLSAqIDEpIFVwZGF0ZSBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQsIGV2ZXJ5IHNlYywgd2hlbiBSVEMgY2xvY2sKLSAqICAgIGlzIHVwZGF0ZWQKLSAqIDIpIEFsYXJtIEludGVycnVwdCAtIGdlbmVyYXRlIGFuIGludGVycnVwdCBhdCBhIHNwZWNpZmljIHRpbWUgb2YgZGF5Ci0gKiAzKSBQZXJpb2RpYyBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBwZXJpb2RpYyBpbnRlcnJ1cHQsIHdpdGggZnJlcXVlbmNpZXMKLSAqICAgIDJIei04MTkySHogKDJIei02NEh6IGZvciBub24tcm9vdCB1c2VyKSAoYWxsIGZyZXFzIGluIHBvd2VycyBvZiAyKQotICogKDEpIGFuZCAoMikgYWJvdmUgYXJlIGltcGxlbWVudGVkIHVzaW5nIHBvbGxpbmcgYXQgYSBmcmVxdWVuY3kgb2YKLSAqIDY0IEh6LiBUaGUgZXhhY3QgZnJlcXVlbmN5IGlzIGEgdHJhZGVvZmYgYmV0d2VlbiBhY2N1cmFjeSBhbmQgaW50ZXJydXB0Ci0gKiBvdmVyaGVhZC4gKERFRkFVTFRfUlRDX0lOVF9GUkVRKQotICogRm9yICgzKSwgd2UgdXNlIGludGVycnVwdHMgYXQgNjRIeiBvciB1c2VyIHNwZWNpZmllZCBwZXJpb2RpYwotICogZnJlcXVlbmN5LCB3aGljaGV2ZXIgaXMgaGlnaGVyLgotICovCi0jaW5jbHVkZSA8bGludXgvcnRjLmg+Ci0KLSNkZWZpbmUgREVGQVVMVF9SVENfSU5UX0ZSRVEgCTY0Ci0jZGVmaW5lIFJUQ19OVU1fSU5UUyAJCTEKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgVUlFX29uOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl91cGRhdGVfc2VjOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBBSUVfb247Ci1zdGF0aWMgc3RydWN0IHJ0Y190aW1lIGFsYXJtX3RpbWU7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9vbjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfY291bnQ7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfcnRjX2ludF9mcmVxOyAvKiBSVEMgaW50ZXJydXB0IGZyZXF1ZW5jeSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBocGV0X3QxX2NtcDsgLyogY2FjaGVkIGNvbXBhcmF0b3IgcmVnaXN0ZXIgKi8KLQotaW50IGlzX2hwZXRfZW5hYmxlZCh2b2lkKQotewotCXJldHVybiB2eHRpbWUuaHBldF9hZGRyZXNzICE9IDA7Ci19Ci0KLS8qCi0gKiBUaW1lciAxIGZvciBSVEMsIHdlIGRvIG5vdCB1c2UgcGVyaW9kaWMgaW50ZXJydXB0IGZlYXR1cmUsCi0gKiBldmVuIGlmIEhQRVQgc3VwcG9ydHMgcGVyaW9kaWMgaW50ZXJydXB0cyBvbiBUaW1lciAxLgotICogVGhlIHJlYXNvbiBiZWluZywgdG8gc2V0IHVwIGEgcGVyaW9kaWMgaW50ZXJydXB0IGluIEhQRVQsIHdlIG5lZWQgdG8KLSAqIHN0b3AgdGhlIG1haW4gY291bnRlci4gQW5kIGlmIHdlIGRvIHRoYXQgZXZlcnl0aW1lIHNvbWVvbmUgZGlhYmxlcy9lbmFibGVzCi0gKiBSVEMsIHdlIHdpbGwgaGF2ZSBhZHZlcnNlIGVmZmVjdCBvbiBtYWluIGtlcm5lbCB0aW1lciBydW5uaW5nIG9uIFRpbWVyIDAuCi0gKiBTbywgZm9yIHRoZSB0aW1lIGJlaW5nLCBzaW11bGF0ZSB0aGUgcGVyaW9kaWMgaW50ZXJydXB0IGluIHNvZnR3YXJlLgotICoKLSAqIGhwZXRfcnRjX3RpbWVyX2luaXQoKSBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBkdXJpbmcgc3Vic2VxdWVudAotICogaW50ZXJ1cHB0cyByZWluaXQgaGFwcGVucyB0aHJvdWdoIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpLgotICovCi1pbnQgaHBldF9ydGNfdGltZXJfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBjZmcsIGNudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0JLyoKLQkgKiBTZXQgdGhlIGNvdW50ZXIgMSBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHRzLgotCSAqLwotCWlmIChQSUVfb24gJiYgKFBJRV9mcmVxID4gREVGQVVMVF9SVENfSU5UX0ZSRVEpKQotCQlocGV0X3J0Y19pbnRfZnJlcSA9IFBJRV9mcmVxOwotCWVsc2UKLQkJaHBldF9ydGNfaW50X2ZyZXEgPSBERUZBVUxUX1JUQ19JTlRfRlJFUTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQljbnQgKz0gKChocGV0X3RpY2sqSFopL2hwZXRfcnRjX2ludF9mcmVxKTsKLQlocGV0X3dyaXRlbChjbnQsIEhQRVRfVDFfQ01QKTsKLQlocGV0X3QxX2NtcCA9IGNudDsKLQotCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOwotCWNmZyAmPSB+SFBFVF9UTl9QRVJJT0RJQzsKLQljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOwotCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBjZmcsIGNudCwgdGlja3NfcGVyX2ludCwgbG9zdF9pbnRzOwotCi0JaWYgKHVubGlrZWx5KCEoUElFX29uIHwgQUlFX29uIHwgVUlFX29uKSkpIHsKLQkJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7Ci0JCWNmZyAmPSB+SFBFVF9UTl9FTkFCTEU7Ci0JCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKFBJRV9vbiAmJiAoUElFX2ZyZXEgPiBERUZBVUxUX1JUQ19JTlRfRlJFUSkpCi0JCWhwZXRfcnRjX2ludF9mcmVxID0gUElFX2ZyZXE7Ci0JZWxzZQotCQlocGV0X3J0Y19pbnRfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROwotCi0JLyogSXQgaXMgbW9yZSBhY2N1cmF0ZSB0byB1c2UgdGhlIGNvbXBhcmF0b3IgdmFsdWUgdGhhbiBjdXJyZW50IGNvdW50LiovCi0JdGlja3NfcGVyX2ludCA9IGhwZXRfdGljayAqIEhaIC8gaHBldF9ydGNfaW50X2ZyZXE7Ci0JaHBldF90MV9jbXAgKz0gdGlja3NfcGVyX2ludDsKLQlocGV0X3dyaXRlbChocGV0X3QxX2NtcCwgSFBFVF9UMV9DTVApOwotCi0JLyoKLQkgKiBJZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2FzIGRlbGF5ZWQgdG9vIGxvbmcsIHRoZSB3cml0ZSBhYm92ZSB0cmllcwotCSAqIHRvIHNjaGVkdWxlIHRoZSBuZXh0IGludGVycnVwdCBpbiB0aGUgcGFzdCBhbmQgdGhlIGhhcmR3YXJlIHdvdWxkCi0JICogbm90IGludGVycnVwdCB1bnRpbCB0aGUgY291bnRlciBoYWQgd3JhcHBlZCBhcm91bmQuCi0JICogU28gd2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBjb21wYXJhdG9yIHdhc24ndCBzZXQgdG8gYSBwYXN0IHRpbWUuCi0JICovCi0JY250ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCWlmICh1bmxpa2VseSgoaW50KShjbnQgLSBocGV0X3QxX2NtcCkgPiAwKSkgewotCQlsb3N0X2ludHMgPSAoY250IC0gaHBldF90MV9jbXApIC8gdGlja3NfcGVyX2ludCArIDE7Ci0JCS8qIE1ha2Ugc3VyZSB0aGF0LCBldmVuIHdpdGggdGhlIHRpbWUgbmVlZGVkIHRvIGV4ZWN1dGUKLQkJICogdGhpcyBjb2RlLCB0aGUgbmV4dCBzY2hlZHVsZWQgaW50ZXJydXB0IGhhcyBiZWVuIG1vdmVkCi0JCSAqIGJhY2sgdG8gdGhlIGZ1dHVyZTogKi8KLQkJbG9zdF9pbnRzKys7Ci0KLQkJaHBldF90MV9jbXAgKz0gbG9zdF9pbnRzICogdGlja3NfcGVyX2ludDsKLQkJaHBldF93cml0ZWwoaHBldF90MV9jbXAsIEhQRVRfVDFfQ01QKTsKLQotCQlpZiAoUElFX29uKQotCQkJUElFX2NvdW50ICs9IGxvc3RfaW50czsKLQotCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAicnRjOiBsb3N0IHNvbWUgaW50ZXJydXB0cyBhdCAlbGRIei5cbiIsCi0JCQkgICAgICAgaHBldF9ydGNfaW50X2ZyZXEpOwotCX0KLX0KLQotLyoKLSAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGNhbGxlZCBmcm9tIHJ0YyBkcml2ZXIuCi0gKiBSZXR1cm4gMCBpZiBIUEVUIGlzIG5vdCBiZWluZyB1c2VkLgotICogT3RoZXJ3aXNlIGRvIHRoZSBuZWNlc3NhcnkgY2hhbmdlcyBhbmQgcmV0dXJuIDEuCi0gKi8KLWludCBocGV0X21hc2tfcnRjX2lycV9iaXQodW5zaWduZWQgbG9uZyBiaXRfbWFzaykKLXsKLQlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQotCQlyZXR1cm4gMDsKLQotCWlmIChiaXRfbWFzayAmIFJUQ19VSUUpCi0JCVVJRV9vbiA9IDA7Ci0JaWYgKGJpdF9tYXNrICYgUlRDX1BJRSkKLQkJUElFX29uID0gMDsKLQlpZiAoYml0X21hc2sgJiBSVENfQUlFKQotCQlBSUVfb24gPSAwOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBocGV0X3NldF9ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKQotewotCWludCB0aW1lcl9pbml0X3JlcWQgPSAwOwotCi0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIShQSUVfb24gfCBBSUVfb24gfCBVSUVfb24pKQotCQl0aW1lcl9pbml0X3JlcWQgPSAxOwotCi0JaWYgKGJpdF9tYXNrICYgUlRDX1VJRSkgewotCQlVSUVfb24gPSAxOwotCX0KLQlpZiAoYml0X21hc2sgJiBSVENfUElFKSB7Ci0JCVBJRV9vbiA9IDE7Ci0JCVBJRV9jb3VudCA9IDA7Ci0JfQotCWlmIChiaXRfbWFzayAmIFJUQ19BSUUpIHsKLQkJQUlFX29uID0gMTsKLQl9Ci0KLQlpZiAodGltZXJfaW5pdF9yZXFkKQotCQlocGV0X3J0Y190aW1lcl9pbml0KCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGhwZXRfc2V0X2FsYXJtX3RpbWUodW5zaWduZWQgY2hhciBocnMsIHVuc2lnbmVkIGNoYXIgbWluLCB1bnNpZ25lZCBjaGFyIHNlYykKLXsKLQlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQotCQlyZXR1cm4gMDsKLQotCWFsYXJtX3RpbWUudG1faG91ciA9IGhyczsKLQlhbGFybV90aW1lLnRtX21pbiA9IG1pbjsKLQlhbGFybV90aW1lLnRtX3NlYyA9IHNlYzsKLQotCXJldHVybiAxOwotfQotCi1pbnQgaHBldF9zZXRfcGVyaW9kaWNfZnJlcSh1bnNpZ25lZCBsb25nIGZyZXEpCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlQSUVfZnJlcSA9IGZyZXE7Ci0JUElFX2NvdW50ID0gMDsKLQotCXJldHVybiAxOwotfQotCi1pbnQgaHBldF9ydGNfZHJvcHBlZF9pcnEodm9pZCkKLXsKLQlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi1pcnFyZXR1cm5fdCBocGV0X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgY3Vycl90aW1lOwotCXVuc2lnbmVkIGxvbmcgcnRjX2ludF9mbGFnID0gMDsKLQlpbnQgY2FsbF9ydGNfaW50ZXJydXB0ID0gMDsKLQotCWhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpOwotCi0JaWYgKFVJRV9vbiB8IEFJRV9vbikgewotCQlydGNfZ2V0X3J0Y190aW1lKCZjdXJyX3RpbWUpOwotCX0KLQlpZiAoVUlFX29uKSB7Ci0JCWlmIChjdXJyX3RpbWUudG1fc2VjICE9IHByZXZfdXBkYXRlX3NlYykgewotCQkJLyogU2V0IHVwZGF0ZSBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLwotCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKLQkJCXJ0Y19pbnRfZmxhZyA9IFJUQ19VRjsKLQkJCXByZXZfdXBkYXRlX3NlYyA9IGN1cnJfdGltZS50bV9zZWM7Ci0JCX0KLQl9Ci0JaWYgKFBJRV9vbikgewotCQlQSUVfY291bnQrKzsKLQkJaWYgKFBJRV9jb3VudCA+PSBocGV0X3J0Y19pbnRfZnJlcS9QSUVfZnJlcSkgewotCQkJLyogU2V0IHBlcmlvZGljIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCi0JCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOwotCQkJcnRjX2ludF9mbGFnIHw9IFJUQ19QRjsKLQkJCVBJRV9jb3VudCA9IDA7Ci0JCX0KLQl9Ci0JaWYgKEFJRV9vbikgewotCQlpZiAoKGN1cnJfdGltZS50bV9zZWMgPT0gYWxhcm1fdGltZS50bV9zZWMpICYmCi0JCSAgICAoY3Vycl90aW1lLnRtX21pbiA9PSBhbGFybV90aW1lLnRtX21pbikgJiYKLQkJICAgIChjdXJyX3RpbWUudG1faG91ciA9PSBhbGFybV90aW1lLnRtX2hvdXIpKSB7Ci0JCQkvKiBTZXQgYWxhcm0gaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KLQkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7Ci0JCQlydGNfaW50X2ZsYWcgfD0gUlRDX0FGOwotCQl9Ci0JfQotCWlmIChjYWxsX3J0Y19pbnRlcnJ1cHQpIHsKLQkJcnRjX2ludF9mbGFnIHw9IChSVENfSVJRRiB8IChSVENfTlVNX0lOVFMgPDwgOCkpOwotCQlydGNfaW50ZXJydXB0KHJ0Y19pbnRfZmxhZywgZGV2X2lkKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgX19pbml0IG5vaHBldF9zZXR1cChjaGFyICpzKSAKLXsgCi0Jbm9ocGV0ID0gMTsKLQlyZXR1cm4gMTsKLX0gCi0KLV9fc2V0dXAoIm5vaHBldCIsIG5vaHBldF9zZXR1cCk7Ci0KLWludCBfX2luaXQgbm90c2Nfc2V0dXAoY2hhciAqcykKLXsKLQlub3RzYyA9IDE7Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoIm5vdHNjIiwgbm90c2Nfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3RzYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTgzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHNjLmMKQEAgLTAsMCArMSwyMjYgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgorCisjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisKK3N0YXRpYyBpbnQgbm90c2MgX19pbml0ZGF0YSA9IDA7CisKK3Vuc2lnbmVkIGludCBjcHVfa2h6OwkJLyogVFNDIGNsb2NrcyAvIHVzZWMsIG5vdCB1c2VkIGhlcmUgKi8KK0VYUE9SVF9TWU1CT0woY3B1X2toeik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3ljMm5zX3NjYWxlIF9fcmVhZF9tb3N0bHk7CisKK3ZvaWQgc2V0X2N5YzJuc19zY2FsZSh1bnNpZ25lZCBsb25nIGtoeikKK3sKKwljeWMybnNfc2NhbGUgPSAoTlNFQ19QRVJfTVNFQyA8PCBOU19TQ0FMRSkgLyBraHo7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzXzJfbnModW5zaWduZWQgbG9uZyBsb25nIGN5YykKK3sKKwlyZXR1cm4gKGN5YyAqIGN5YzJuc19zY2FsZSkgPj4gTlNfU0NBTEU7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYSA9IDA7CisKKwkvKiBDb3VsZCBkbyBDUFUgY29yZSBzeW5jIGhlcmUuIE9wdGVyb24gY2FuIGV4ZWN1dGUgcmR0c2Mgc3BlY3VsYXRpdmVseSwKKwkgKiB3aGljaCBtZWFucyBpdCBpcyBub3QgY29tcGxldGVseSBleGFjdCBhbmQgbWF5IG5vdCBiZSBtb25vdG9ub3VzCisJICogYmV0d2VlbiBDUFVzLiBCdXQgdGhlIGVycm9ycyBzaG91bGQgYmUgdG9vIHNtYWxsIHRvIG1hdHRlciBmb3IKKwkgKiBzY2hlZHVsaW5nIHB1cnBvc2VzLgorCSAqLworCisJcmR0c2NsbChhKTsKKwlyZXR1cm4gY3ljbGVzXzJfbnMoYSk7Cit9CisKK3N0YXRpYyBpbnQgdHNjX3Vuc3RhYmxlOworCitzdGF0aWMgaW5saW5lIGludCBjaGVja190c2NfdW5zdGFibGUodm9pZCkKK3sKKwlyZXR1cm4gdHNjX3Vuc3RhYmxlOworfQorI2lmZGVmIENPTkZJR19DUFVfRlJFUQorCisvKiBGcmVxdWVuY3kgc2NhbGluZyBzdXBwb3J0LiBBZGp1c3QgdGhlIFRTQyBiYXNlZCB0aW1lciB3aGVuIHRoZSBjcHUgZnJlcXVlbmN5CisgKiBjaGFuZ2VzLgorICoKKyAqIFJFRC1QRU46IE9uIFNNUCB3ZSBhc3N1bWUgYWxsIENQVXMgcnVuIHdpdGggdGhlIHNhbWUgZnJlcXVlbmN5LiAgSXQncworICogbm90IHRoYXQgaW1wb3J0YW50IGJlY2F1c2UgY3VycmVudCBPcHRlcm9uIHNldHVwcyBkbyBub3Qgc3VwcG9ydAorICogc2NhbGluZyBvbiBTTVAgYW55cm9hZHMuCisgKgorICogU2hvdWxkIGZpeCB1cCBsYXN0X3RzYyB0b28uIEN1cnJlbnRseSBnZXR0aW1lb2ZkYXkgaW4gdGhlCisgKiBmaXJzdCB0aWNrIGFmdGVyIHRoZSBjaGFuZ2Ugd2lsbCBiZSBzbGlnaHRseSB3cm9uZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2luaXQgPSAwOworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcms7CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqdikKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWNwdWZyZXFfZ2V0KGNwdSk7CisJfQorCWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCAgcmVmX2ZyZXEgPSAwOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5X3JlZiA9IDA7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9raHpfcmVmID0gMDsKKworc3RhdGljIGludCB0aW1lX2NwdWZyZXFfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCisJCQkJIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNwdWZyZXFfZnJlcXMgKmZyZXEgPSBkYXRhOworCXVuc2lnbmVkIGxvbmcgKmxwaiwgZHVtbXk7CisKKwlpZiAoY3B1X2hhcygmY3B1X2RhdGFbZnJlcS0+Y3B1XSwgWDg2X0ZFQVRVUkVfQ09OU1RBTlRfVFNDKSkKKwkJcmV0dXJuIDA7CisKKwlscGogPSAmZHVtbXk7CisJaWYgKCEoZnJlcS0+ZmxhZ3MgJiBDUFVGUkVRX0NPTlNUX0xPT1BTKSkKKyNpZmRlZiBDT05GSUdfU01QCisJCWxwaiA9ICZjcHVfZGF0YVtmcmVxLT5jcHVdLmxvb3BzX3Blcl9qaWZmeTsKKyNlbHNlCisJCWxwaiA9ICZib290X2NwdV9kYXRhLmxvb3BzX3Blcl9qaWZmeTsKKyNlbmRpZgorCisJaWYgKCFyZWZfZnJlcSkgeworCQlyZWZfZnJlcSA9IGZyZXEtPm9sZDsKKwkJbG9vcHNfcGVyX2ppZmZ5X3JlZiA9ICpscGo7CisJCWNwdV9raHpfcmVmID0gY3B1X2toejsKKwl9CisJaWYgKCh2YWwgPT0gQ1BVRlJFUV9QUkVDSEFOR0UgICYmIGZyZXEtPm9sZCA8IGZyZXEtPm5ldykgfHwKKwkJKHZhbCA9PSBDUFVGUkVRX1BPU1RDSEFOR0UgJiYgZnJlcS0+b2xkID4gZnJlcS0+bmV3KSB8fAorCQkodmFsID09IENQVUZSRVFfUkVTVU1FQ0hBTkdFKSkgeworCQkqbHBqID0KKwkJY3B1ZnJlcV9zY2FsZShsb29wc19wZXJfamlmZnlfcmVmLCByZWZfZnJlcSwgZnJlcS0+bmV3KTsKKworCQljcHVfa2h6ID0gY3B1ZnJlcV9zY2FsZShjcHVfa2h6X3JlZiwgcmVmX2ZyZXEsIGZyZXEtPm5ldyk7CisJCWlmICghKGZyZXEtPmZsYWdzICYgQ1BVRlJFUV9DT05TVF9MT09QUykpCisJCQltYXJrX3RzY191bnN0YWJsZSgpOworCX0KKworCXNldF9jeWMybnNfc2NhbGUoY3B1X2toel9yZWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGltZV9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsICA9IHRpbWVfY3B1ZnJlcV9ub3RpZmllcgorfTsKKworc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV90c2Modm9pZCkKK3sKKwlJTklUX1dPUksoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yaywgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQpOworCWlmICghY3B1ZnJlcV9yZWdpc3Rlcl9ub3RpZmllcigmdGltZV9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrLAorCQkJCSAgICAgICBDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpKQorCQljcHVmcmVxX2luaXQgPSAxOworCXJldHVybiAwOworfQorCitjb3JlX2luaXRjYWxsKGNwdWZyZXFfdHNjKTsKKworI2VuZGlmCisKK3N0YXRpYyBpbnQgdHNjX3Vuc3RhYmxlID0gMDsKKworLyoKKyAqIE1ha2UgYW4gZWR1Y2F0ZWQgZ3Vlc3MgaWYgdGhlIFRTQyBpcyB0cnVzdHdvcnRoeSBhbmQgc3luY2hyb25pemVkCisgKiBvdmVyIGFsbCBDUFVzLgorICovCitfX2NwdWluaXQgaW50IHVuc3luY2hyb25pemVkX3RzYyh2b2lkKQoreworCWlmICh0c2NfdW5zdGFibGUpCisJCXJldHVybiAxOworCisjaWZkZWYgQ09ORklHX1NNUAorCWlmIChhcGljX2lzX2NsdXN0ZXJlZF9ib3goKSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwkvKiBNb3N0IGludGVsIHN5c3RlbXMgaGF2ZSBzeW5jaHJvbml6ZWQgVFNDcyBleGNlcHQgZm9yCisJICAgbXVsdGkgbm9kZSBzeXN0ZW1zICovCisgCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgeworI2lmZGVmIENPTkZJR19BQ1BJCisJCS8qIEJ1dCBUU0MgZG9lc24ndCB0aWNrIGluIEMzIHNvIGRvbid0IHVzZSBpdCB0aGVyZSAqLworCQlpZiAoYWNwaV9nYmxfRkFEVC5oZWFkZXIubGVuZ3RoID4gMCAmJiBhY3BpX2dibF9GQURULkMzbGF0ZW5jeSA8IDEwMDApCisJCQlyZXR1cm4gMTsKKyNlbmRpZgorIAkJcmV0dXJuIDA7CisJfQorCisgCS8qIEFzc3VtZSBtdWx0aSBzb2NrZXQgc3lzdGVtcyBhcmUgbm90IHN5bmNocm9uaXplZCAqLworIAlyZXR1cm4gbnVtX3ByZXNlbnRfY3B1cygpID4gMTsKK30KKworaW50IF9faW5pdCBub3RzY19zZXR1cChjaGFyICpzKQoreworCW5vdHNjID0gMTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibm90c2MiLCBub3RzY19zZXR1cCk7CisKKworLyogY2xvY2sgc291cmNlIGNvZGU6ICovCitzdGF0aWMgY3ljbGVfdCByZWFkX3RzYyh2b2lkKQoreworCWN5Y2xlX3QgcmV0ID0gKGN5Y2xlX3QpZ2V0X2N5Y2xlc19zeW5jKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGN5Y2xlX3QgX192c3lzY2FsbF9mbiB2cmVhZF90c2Modm9pZCkKK3sKKwljeWNsZV90IHJldCA9IChjeWNsZV90KWdldF9jeWNsZXNfc3luYygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfdHNjID0geworCS5uYW1lCQkJPSAidHNjIiwKKwkucmF0aW5nCQkJPSAzMDAsCisJLnJlYWQJCQk9IHJlYWRfdHNjLAorCS5tYXNrCQkJPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKKwkuc2hpZnQJCQk9IDIyLAorCS5mbGFncwkJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMgfAorCQkJCSAgQ0xPQ0tfU09VUkNFX01VU1RfVkVSSUZZLAorCS52cmVhZAkJCT0gdnJlYWRfdHNjLAorfTsKKwordm9pZCBtYXJrX3RzY191bnN0YWJsZSh2b2lkKQoreworCWlmICghdHNjX3Vuc3RhYmxlKSB7CisJCXRzY191bnN0YWJsZSA9IDE7CisJCS8qIENoYW5nZSBvbmx5IHRoZSByYXRpbmcsIHdoZW4gbm90IHJlZ2lzdGVyZWQgKi8KKwkJaWYgKGNsb2Nrc291cmNlX3RzYy5tdWx0KQorCQkJY2xvY2tzb3VyY2VfY2hhbmdlX3JhdGluZygmY2xvY2tzb3VyY2VfdHNjLCAwKTsKKwkJZWxzZQorCQkJY2xvY2tzb3VyY2VfdHNjLnJhdGluZyA9IDA7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwobWFya190c2NfdW5zdGFibGUpOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RzY19jbG9ja3NvdXJjZSh2b2lkKQoreworCWlmICghbm90c2MpIHsKKwkJY2xvY2tzb3VyY2VfdHNjLm11bHQgPSBjbG9ja3NvdXJjZV9raHoybXVsdChjcHVfa2h6LAorCQkJCQkJCWNsb2Nrc291cmNlX3RzYy5zaGlmdCk7CisJCWlmIChjaGVja190c2NfdW5zdGFibGUoKSkKKwkJCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSAwOworCisJCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfdHNjKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdHNjX2Nsb2Nrc291cmNlKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90c2Nfc3luYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RzY19zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0ZjBkYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90c2Nfc3luYy5jCkBAIC0wLDAgKzEsMTg3IEBACisvKgorICogYXJjaC94ODZfNjQva2VybmVsL3RzY19zeW5jLmM6IGNoZWNrIFRTQyBzeW5jaHJvbml6YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICoKKyAqIFdlIGNoZWNrIHdoZXRoZXIgYWxsIGJvb3QgQ1BVcyBoYXZlIHRoZWlyIFRTQydzIHN5bmNocm9uaXplZCwKKyAqIHByaW50IGEgd2FybmluZyBpZiBub3QgYW5kIHR1cm4gb2ZmIHRoZSBUU0MgY2xvY2stc291cmNlLgorICoKKyAqIFRoZSB3YXJwLWNoZWNrIGlzIHBvaW50LXRvLXBvaW50IGJldHdlZW4gdHdvIENQVXMsIHRoZSBDUFUKKyAqIGluaXRpYXRpbmcgdGhlIGJvb3R1cCBpcyB0aGUgJ3NvdXJjZSBDUFUnLCB0aGUgZnJlc2hseSBib290aW5nCisgKiBDUFUgaXMgdGhlICd0YXJnZXQgQ1BVJy4KKyAqCisgKiBPbmx5IHR3byBDUFVzIG1heSBwYXJ0aWNpcGF0ZSAtIHRoZXkgY2FuIGVudGVyIGluIGFueSBvcmRlci4KKyAqICggVGhlIHNlcmlhbCBuYXR1cmUgb2YgdGhlIGJvb3QgbG9naWMgYW5kIHRoZSBDUFUgaG90cGx1ZyBsb2NrCisgKiAgIHByb3RlY3RzIGFnYWluc3QgbW9yZSB0aGFuIDIgQ1BVcyBlbnRlcmluZyB0aGlzIGNvZGUuICkKKyAqLworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGFzbS90c2MuaD4KKworLyoKKyAqIEVudHJ5L2V4aXQgY291bnRlcnMgdGhhdCBtYWtlIHN1cmUgdGhhdCBib3RoIENQVXMKKyAqIHJ1biB0aGUgbWVhc3VyZW1lbnQgY29kZSBhdCBvbmNlOgorICovCitzdGF0aWMgX19jcHVpbml0ZGF0YSBhdG9taWNfdCBzdGFydF9jb3VudDsKK3N0YXRpYyBfX2NwdWluaXRkYXRhIGF0b21pY190IHN0b3BfY291bnQ7CisKKy8qCisgKiBXZSB1c2UgYSByYXcgc3BpbmxvY2sgaW4gdGhpcyBleGNlcHRpb25hbCBjYXNlLCBiZWNhdXNlCisgKiB3ZSB3YW50IHRvIGhhdmUgdGhlIGZhc3Rlc3QsIGlubGluZWQsIG5vbi1kZWJ1ZyB2ZXJzaW9uCisgKiBvZiBhIGNyaXRpY2FsIHNlY3Rpb24sIHRvIGJlIGFibGUgdG8gcHJvdmUgVFNDIHRpbWUtd2FycHM6CisgKi8KK3N0YXRpYyBfX2NwdWluaXRkYXRhIHJhd19zcGlubG9ja190IHN5bmNfbG9jayA9IF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBfX2NwdWluaXRkYXRhIGN5Y2xlc190IGxhc3RfdHNjOworc3RhdGljIF9fY3B1aW5pdGRhdGEgY3ljbGVzX3QgbWF4X3dhcnA7CitzdGF0aWMgX19jcHVpbml0ZGF0YSBpbnQgbnJfd2FycHM7CisKKy8qCisgKiBUU0Mtd2FycCBtZWFzdXJlbWVudCBsb29wIHJ1bm5pbmcgb24gYm90aCBDUFVzOgorICovCitzdGF0aWMgX19jcHVpbml0IHZvaWQgY2hlY2tfdHNjX3dhcnAodm9pZCkKK3sKKwljeWNsZXNfdCBzdGFydCwgbm93LCBwcmV2LCBlbmQ7CisJaW50IGk7CisKKwlzdGFydCA9IGdldF9jeWNsZXNfc3luYygpOworCS8qCisJICogVGhlIG1lYXN1cmVtZW50IHJ1bnMgZm9yIDIwIG1zZWNzOgorCSAqLworCWVuZCA9IHN0YXJ0ICsgY3B1X2toeiAqIDIwVUxMOworCW5vdyA9IHN0YXJ0OworCisJZm9yIChpID0gMDsgOyBpKyspIHsKKwkJLyoKKwkJICogV2UgdGFrZSB0aGUgZ2xvYmFsIGxvY2ssIG1lYXN1cmUgVFNDLCBzYXZlIHRoZQorCQkgKiBwcmV2aW91cyBUU0MgdGhhdCB3YXMgbWVhc3VyZWQgKHBvc3NpYmx5IG9uCisJCSAqIGFub3RoZXIgQ1BVKSBhbmQgdXBkYXRlIHRoZSBwcmV2aW91cyBUU0MgdGltZXN0YW1wLgorCQkgKi8KKwkJX19yYXdfc3Bpbl9sb2NrKCZzeW5jX2xvY2spOworCQlwcmV2ID0gbGFzdF90c2M7CisJCW5vdyA9IGdldF9jeWNsZXNfc3luYygpOworCQlsYXN0X3RzYyA9IG5vdzsKKwkJX19yYXdfc3Bpbl91bmxvY2soJnN5bmNfbG9jayk7CisKKwkJLyoKKwkJICogQmUgbmljZSBldmVyeSBub3cgYW5kIHRoZW4gKGFuZCBhbHNvIGNoZWNrIHdoZXRoZXIKKwkJICogbWVhc3VyZW1lbnQgaXMgZG9uZSBbd2UgYWxzbyBpbnNlcnQgYSAxMDAgbWlsbGlvbgorCQkgKiBsb29wcyBzYWZldHkgZXhpdCwgc28gd2UgZG9udCBsb2NrIHVwIGluIGNhc2UgdGhlCisJCSAqIFRTQyByZWFkb3V0IGlzIHRvdGFsbHkgYnJva2VuXSk6CisJCSAqLworCQlpZiAodW5saWtlbHkoIShpICYgNykpKSB7CisJCQlpZiAobm93ID4gZW5kIHx8IGkgPiAxMDAwMDAwMDApCisJCQkJYnJlYWs7CisJCQljcHVfcmVsYXgoKTsKKwkJCXRvdWNoX25taV93YXRjaGRvZygpOworCQl9CisJCS8qCisJCSAqIE91dHNpZGUgdGhlIGNyaXRpY2FsIHNlY3Rpb24gd2UgY2FuIG5vdyBzZWUgd2hldGhlcgorCQkgKiB3ZSBzYXcgYSB0aW1lLXdhcnAgb2YgdGhlIFRTQyBnb2luZyBiYWNrd2FyZHM6CisJCSAqLworCQlpZiAodW5saWtlbHkocHJldiA+IG5vdykpIHsKKwkJCV9fcmF3X3NwaW5fbG9jaygmc3luY19sb2NrKTsKKwkJCW1heF93YXJwID0gbWF4KG1heF93YXJwLCBwcmV2IC0gbm93KTsKKwkJCW5yX3dhcnBzKys7CisJCQlfX3Jhd19zcGluX3VubG9jaygmc3luY19sb2NrKTsKKwkJfQorCisJfQorfQorCisvKgorICogU291cmNlIENQVSBjYWxscyBpbnRvIHRoaXMgLSBpdCB3YWl0cyBmb3IgdGhlIGZyZXNobHkgYm9vdGVkCisgKiB0YXJnZXQgQ1BVIHRvIGFycml2ZSBhbmQgdGhlbiBzdGFydHMgdGhlIG1lYXN1cmVtZW50OgorICovCit2b2lkIF9fY3B1aW5pdCBjaGVja190c2Nfc3luY19zb3VyY2UoaW50IGNwdSkKK3sKKwlpbnQgY3B1cyA9IDI7CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gY2hlY2sgaWYgd2UgYWxyZWFkeSBrbm93IHRoYXQgdGhlIFRTQyBpcyBub3QKKwkgKiBzeW5jaHJvbml6ZWQ6CisJICovCisJaWYgKHVuc3luY2hyb25pemVkX3RzYygpKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9JTkZPICJjaGVja2luZyBUU0Mgc3luY2hyb25pemF0aW9uIFtDUFUjJWQgLT4gQ1BVIyVkXToiLAorCQkJICBzbXBfcHJvY2Vzc29yX2lkKCksIGNwdSk7CisKKwkvKgorCSAqIFJlc2V0IGl0IC0gaW4gY2FzZSB0aGlzIGlzIGEgc2Vjb25kIGJvb3R1cDoKKwkgKi8KKwlhdG9taWNfc2V0KCZzdG9wX2NvdW50LCAwKTsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIHRhcmdldCB0byBhcnJpdmU6CisJICovCisJd2hpbGUgKGF0b21pY19yZWFkKCZzdGFydF9jb3VudCkgIT0gY3B1cy0xKQorCQljcHVfcmVsYXgoKTsKKwkvKgorCSAqIFRyaWdnZXIgdGhlIHRhcmdldCB0byBjb250aW51ZSBpbnRvIHRoZSBtZWFzdXJlbWVudCB0b286CisJICovCisJYXRvbWljX2luYygmc3RhcnRfY291bnQpOworCisJY2hlY2tfdHNjX3dhcnAoKTsKKworCXdoaWxlIChhdG9taWNfcmVhZCgmc3RvcF9jb3VudCkgIT0gY3B1cy0xKQorCQljcHVfcmVsYXgoKTsKKworCS8qCisJICogUmVzZXQgaXQgLSBqdXN0IGluIGNhc2Ugd2UgYm9vdCBhbm90aGVyIENQVSBsYXRlcjoKKwkgKi8KKwlhdG9taWNfc2V0KCZzdGFydF9jb3VudCwgMCk7CisKKwlpZiAobnJfd2FycHMpIHsKKwkJcHJpbnRrKCJcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNZWFzdXJlZCAlTGQgY3ljbGVzIFRTQyB3YXJwIGJldHdlZW4gQ1BVcywiCisJCQkJICAgICIgdHVybmluZyBvZmYgVFNDIGNsb2NrLlxuIiwgbWF4X3dhcnApOworCQltYXJrX3RzY191bnN0YWJsZSgpOworCQlucl93YXJwcyA9IDA7CisJCW1heF93YXJwID0gMDsKKwkJbGFzdF90c2MgPSAwOworCX0gZWxzZSB7CisJCXByaW50aygiIHBhc3NlZC5cbiIpOworCX0KKworCS8qCisJICogTGV0IHRoZSB0YXJnZXQgY29udGludWUgd2l0aCB0aGUgYm9vdHVwOgorCSAqLworCWF0b21pY19pbmMoJnN0b3BfY291bnQpOworfQorCisvKgorICogRnJlc2hseSBib290ZWQgQ1BVcyBjYWxsIGludG8gdGhpczoKKyAqLwordm9pZCBfX2NwdWluaXQgY2hlY2tfdHNjX3N5bmNfdGFyZ2V0KHZvaWQpCit7CisJaW50IGNwdXMgPSAyOworCisJaWYgKHVuc3luY2hyb25pemVkX3RzYygpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFJlZ2lzdGVyIHRoaXMgQ1BVJ3MgcGFydGljaXBhdGlvbiBhbmQgd2FpdCBmb3IgdGhlCisJICogc291cmNlIENQVSB0byBzdGFydCB0aGUgbWVhc3VyZW1lbnQ6CisJICovCisJYXRvbWljX2luYygmc3RhcnRfY291bnQpOworCXdoaWxlIChhdG9taWNfcmVhZCgmc3RhcnRfY291bnQpICE9IGNwdXMpCisJCWNwdV9yZWxheCgpOworCisJY2hlY2tfdHNjX3dhcnAoKTsKKworCS8qCisJICogT2ssIHdlIGFyZSBkb25lOgorCSAqLworCWF0b21pY19pbmMoJnN0b3BfY291bnQpOworCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgc291cmNlIENQVSB0byBwcmludCBzdHVmZjoKKwkgKi8KKwl3aGlsZSAoYXRvbWljX3JlYWQoJnN0b3BfY291bnQpICE9IGNwdXMpCisJCWNwdV9yZWxheCgpOworfQorI3VuZGVmIE5SX0xPT1BTCisKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYzM2MGM0Mi4uYjczMjEyYyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTg4LDMxICs4OCwyNSBAQAogICBfX3ZzeXNjYWxsXzAgPSBWU1lTQ0FMTF9WSVJUX0FERFI7CiAKICAgLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOwotICAueHRpbWVfbG9jayA6IEFUKFZMT0FEKC54dGltZV9sb2NrKSkgeyAqKC54dGltZV9sb2NrKSB9Ci0gIHh0aW1lX2xvY2sgPSBWVklSVCgueHRpbWVfbG9jayk7Ci0KLSAgLnZ4dGltZSA6IEFUKFZMT0FEKC52eHRpbWUpKSB7ICooLnZ4dGltZSkgfQotICB2eHRpbWUgPSBWVklSVCgudnh0aW1lKTsKKyAgLnZzeXNjYWxsX2ZuIDogQVQoVkxPQUQoLnZzeXNjYWxsX2ZuKSkgeyAqKC52c3lzY2FsbF9mbikgfQorICAuID0gQUxJR04oQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUyk7CisgIC52c3lzY2FsbF9ndG9kX2RhdGEgOiBBVChWTE9BRCgudnN5c2NhbGxfZ3RvZF9kYXRhKSkKKwkJeyAqKC52c3lzY2FsbF9ndG9kX2RhdGEpIH0KKyAgdnN5c2NhbGxfZ3RvZF9kYXRhID0gVlZJUlQoLnZzeXNjYWxsX2d0b2RfZGF0YSk7CiAKICAgLnZnZXRjcHVfbW9kZSA6IEFUKFZMT0FEKC52Z2V0Y3B1X21vZGUpKSB7ICooLnZnZXRjcHVfbW9kZSkgfQogICB2Z2V0Y3B1X21vZGUgPSBWVklSVCgudmdldGNwdV9tb2RlKTsKIAotICAuc3lzX3R6IDogQVQoVkxPQUQoLnN5c190eikpIHsgKiguc3lzX3R6KSB9Ci0gIHN5c190eiA9IFZWSVJUKC5zeXNfdHopOwotCi0gIC5zeXNjdGxfdnN5c2NhbGwgOiBBVChWTE9BRCguc3lzY3RsX3ZzeXNjYWxsKSkgeyAqKC5zeXNjdGxfdnN5c2NhbGwpIH0KLSAgc3lzY3RsX3ZzeXNjYWxsID0gVlZJUlQoLnN5c2N0bF92c3lzY2FsbCk7Ci0KLSAgLnh0aW1lIDogQVQoVkxPQUQoLnh0aW1lKSkgeyAqKC54dGltZSkgfQotICB4dGltZSA9IFZWSVJUKC54dGltZSk7Ci0KICAgLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOwogICAuamlmZmllcyA6IEFUKFZMT0FEKC5qaWZmaWVzKSkgeyAqKC5qaWZmaWVzKSB9CiAgIGppZmZpZXMgPSBWVklSVCguamlmZmllcyk7CiAKLSAgLnZzeXNjYWxsXzEgQUREUigudnN5c2NhbGxfMCkgKyAxMDI0OiBBVChWTE9BRCgudnN5c2NhbGxfMSkpIHsgKigudnN5c2NhbGxfMSkgfQotICAudnN5c2NhbGxfMiBBRERSKC52c3lzY2FsbF8wKSArIDIwNDg6IEFUKFZMT0FEKC52c3lzY2FsbF8yKSkgeyAqKC52c3lzY2FsbF8yKSB9Ci0gIC52c3lzY2FsbF8zIEFERFIoLnZzeXNjYWxsXzApICsgMzA3MjogQVQoVkxPQUQoLnZzeXNjYWxsXzMpKSB7ICooLnZzeXNjYWxsXzMpIH0KKyAgLnZzeXNjYWxsXzEgQUREUigudnN5c2NhbGxfMCkgKyAxMDI0OiBBVChWTE9BRCgudnN5c2NhbGxfMSkpCisJCXsgKigudnN5c2NhbGxfMSkgfQorICAudnN5c2NhbGxfMiBBRERSKC52c3lzY2FsbF8wKSArIDIwNDg6IEFUKFZMT0FEKC52c3lzY2FsbF8yKSkKKwkJeyAqKC52c3lzY2FsbF8yKSB9CisgIC52c3lzY2FsbF8zIEFERFIoLnZzeXNjYWxsXzApICsgMzA3MjogQVQoVkxPQUQoLnZzeXNjYWxsXzMpKQorCQl7ICooLnZzeXNjYWxsXzMpIH0KIAogICAuID0gVlNZU0NBTExfVklSVF9BRERSICsgNDA5NjsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdnN5c2NhbGwuYwppbmRleCAzMTNkYzZhLi4xODBmZjkxIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdnN5c2NhbGwuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdnN5c2NhbGwuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KICNpbmNsdWRlIDxsaW51eC9nZXRjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KQEAgLTM0LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxhc20vdnN5c2NhbGwuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KQEAgLTQ0LDU2ICs0Niw0MSBAQAogI2RlZmluZSBfX3ZzeXNjYWxsKG5yKSBfX2F0dHJpYnV0ZV9fICgodW51c2VkLF9fc2VjdGlvbl9fKCIudnN5c2NhbGxfIiAjbnIpKSkKICNkZWZpbmUgX19zeXNjYWxsX2Nsb2JiZXIgInIxMSIsInJjeCIsIm1lbW9yeSIKIAotaW50IF9fc3lzY3RsX3ZzeXNjYWxsIF9fc2VjdGlvbl9zeXNjdGxfdnN5c2NhbGwgPSAxOwotc2VxbG9ja190IF9feHRpbWVfbG9jayBfX3NlY3Rpb25feHRpbWVfbG9jayA9IFNFUUxPQ0tfVU5MT0NLRUQ7CitzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhX3QgeworCXNlcWxvY2tfdCBsb2NrOworCWludCBzeXNjdGxfZW5hYmxlZDsKKwlzdHJ1Y3QgdGltZXZhbCB3YWxsX3RpbWVfdHY7CisJc3RydWN0IHRpbWV6b25lIHN5c190ejsKKwljeWNsZV90IG9mZnNldF9iYXNlOworCXN0cnVjdCBjbG9ja3NvdXJjZSBjbG9jazsKK307CiBpbnQgX192Z2V0Y3B1X21vZGUgX19zZWN0aW9uX3ZnZXRjcHVfbW9kZTsKIAotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KLQotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHRpbWV2YWxfbm9ybWFsaXplKHN0cnVjdCB0aW1ldmFsICogdHYpCitzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhX3QgX192c3lzY2FsbF9ndG9kX2RhdGEgX19zZWN0aW9uX3ZzeXNjYWxsX2d0b2RfZGF0YSA9CiB7Ci0JdGltZV90IF9fc2VjOworCS5sb2NrID0gU0VRTE9DS19VTkxPQ0tFRCwKKwkuc3lzY3RsX2VuYWJsZWQgPSAxLAorfTsKIAotCV9fc2VjID0gdHYtPnR2X3VzZWMgLyAxMDAwMDAwOwotCWlmIChfX3NlYykgewotCQl0di0+dHZfdXNlYyAlPSAxMDAwMDAwOwotCQl0di0+dHZfc2VjICs9IF9fc2VjOwotCX0KK3ZvaWQgdXBkYXRlX3ZzeXNjYWxsKHN0cnVjdCB0aW1lc3BlYyAqd2FsbF90aW1lLCBzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNsb2NrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnZzeXNjYWxsX2d0b2RfZGF0YS5sb2NrLCBmbGFncyk7CisJLyogY29weSB2c3lzY2FsbCBkYXRhICovCisJdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrID0gKmNsb2NrOworCXZzeXNjYWxsX2d0b2RfZGF0YS53YWxsX3RpbWVfdHYudHZfc2VjID0gd2FsbF90aW1lLT50dl9zZWM7CisJdnN5c2NhbGxfZ3RvZF9kYXRhLndhbGxfdGltZV90di50dl91c2VjID0gd2FsbF90aW1lLT50dl9uc2VjLzEwMDA7CisJdnN5c2NhbGxfZ3RvZF9kYXRhLnN5c190eiA9IHN5c190ejsKKwl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmdnN5c2NhbGxfZ3RvZF9kYXRhLmxvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGRvX3ZnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiB0dikKLXsKLQlsb25nIHNlcXVlbmNlLCB0OwotCXVuc2lnbmVkIGxvbmcgc2VjLCB1c2VjOwotCi0JZG8gewotCQlzZXF1ZW5jZSA9IHJlYWRfc2VxYmVnaW4oJl9feHRpbWVfbG9jayk7Ci0JCQotCQlzZWMgPSBfX3h0aW1lLnR2X3NlYzsKLQkJdXNlYyA9IF9feHRpbWUudHZfbnNlYyAvIDEwMDA7Ci0KLQkJaWYgKF9fdnh0aW1lLm1vZGUgIT0gVlhUSU1FX0hQRVQpIHsKLQkJCXQgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQkJCWlmICh0IDwgX192eHRpbWUubGFzdF90c2MpCi0JCQkJdCA9IF9fdnh0aW1lLmxhc3RfdHNjOwotCQkJdXNlYyArPSAoKHQgLSBfX3Z4dGltZS5sYXN0X3RzYykgKgotCQkJCSBfX3Z4dGltZS50c2NfcXVvdCkgPj4gMzI7Ci0JCQkvKiBTZWUgY29tbWVudCBpbiB4ODZfNjQgZG9fZ2V0dGltZW9mZGF5LiAqLwotCQl9IGVsc2UgewotCQkJdXNlYyArPSAoKHJlYWRsKCh2b2lkIF9faW9tZW0gKikKLQkJCQkgICBmaXhfdG9fdmlydChWU1lTQ0FMTF9IUEVUKSArIDB4ZjApIC0KLQkJCQkgIF9fdnh0aW1lLmxhc3QpICogX192eHRpbWUucXVvdCkgPj4gMzI7Ci0JCX0KLQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZfX3h0aW1lX2xvY2ssIHNlcXVlbmNlKSk7Ci0KLQl0di0+dHZfc2VjID0gc2VjICsgdXNlYyAvIDEwMDAwMDA7Ci0JdHYtPnR2X3VzZWMgPSB1c2VjICUgMTAwMDAwMDsKLX0KLQotLyogUkVELVBFTiBtYXkgd2FudCB0byByZWFkZCBzZXEgbG9ja2luZywgYnV0IHRoZW4gdGhlIHZhcmlhYmxlIHNob3VsZCBiZSB3cml0ZS1vbmNlLiAqLworLyogUkVELVBFTiBtYXkgd2FudCB0byByZWFkZCBzZXEgbG9ja2luZywgYnV0IHRoZW4gdGhlIHZhcmlhYmxlIHNob3VsZCBiZQorICogd3JpdGUtb25jZS4KKyAqLwogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGRvX2dldF90eihzdHJ1Y3QgdGltZXpvbmUgKiB0eikKIHsKLQkqdHogPSBfX3N5c190ejsKKwkqdHogPSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS5zeXNfdHo7CiB9CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYsIHN0cnVjdCB0aW1lem9uZSAqdHopCkBAIC0xMDEsNyArODgsOCBAQAogCWludCByZXQ7CiAJYXNtIHZvbGF0aWxlKCJ2c3lzYzI6IHN5c2NhbGwiCiAJCTogIj1hIiAocmV0KQotCQk6ICIwIiAoX19OUl9nZXR0aW1lb2ZkYXkpLCJEIiAodHYpLCJTIiAodHopIDogX19zeXNjYWxsX2Nsb2JiZXIgKTsKKwkJOiAiMCIgKF9fTlJfZ2V0dGltZW9mZGF5KSwiRCIgKHR2KSwiUyIgKHR6KQorCQk6IF9fc3lzY2FsbF9jbG9iYmVyICk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTE0LDEwICsxMDIsNDQgQEAKIAlyZXR1cm4gc2VjczsKIH0KIAorc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGRvX3ZnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiB0dikKK3sKKwljeWNsZV90IG5vdywgYmFzZSwgbWFzaywgY3ljbGVfZGVsdGE7CisJdW5zaWduZWQgbG9uZyBzZXEsIG11bHQsIHNoaWZ0LCBuc2VjX2RlbHRhOworCWN5Y2xlX3QgKCp2cmVhZCkodm9pZCk7CisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZfX3ZzeXNjYWxsX2d0b2RfZGF0YS5sb2NrKTsKKworCQl2cmVhZCA9IF9fdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLnZyZWFkOworCQlpZiAodW5saWtlbHkoIV9fdnN5c2NhbGxfZ3RvZF9kYXRhLnN5c2N0bF9lbmFibGVkIHx8ICF2cmVhZCkpIHsKKwkJCWdldHRpbWVvZmRheSh0diwwKTsKKwkJCXJldHVybjsKKwkJfQorCQlub3cgPSB2cmVhZCgpOworCQliYXNlID0gX192c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2suY3ljbGVfbGFzdDsKKwkJbWFzayA9IF9fdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLm1hc2s7CisJCW11bHQgPSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5tdWx0OworCQlzaGlmdCA9IF9fdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLnNoaWZ0OworCisJCSp0diA9IF9fdnN5c2NhbGxfZ3RvZF9kYXRhLndhbGxfdGltZV90djsKKworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJl9fdnN5c2NhbGxfZ3RvZF9kYXRhLmxvY2ssIHNlcSkpOworCisJLyogY2FsY3VsYXRlIGludGVydmFsOiAqLworCWN5Y2xlX2RlbHRhID0gKG5vdyAtIGJhc2UpICYgbWFzazsKKwkvKiBjb252ZXJ0IHRvIG5zZWNzOiAqLworCW5zZWNfZGVsdGEgPSAoY3ljbGVfZGVsdGEgKiBtdWx0KSA+PiBzaGlmdDsKKworCS8qIGNvbnZlcnQgdG8gdXNlY3MgYW5kIGFkZCB0byB0aW1lc3BlYzogKi8KKwl0di0+dHZfdXNlYyArPSBuc2VjX2RlbHRhIC8gTlNFQ19QRVJfVVNFQzsKKwl3aGlsZSAodHYtPnR2X3VzZWMgPiBVU0VDX1BFUl9TRUMpIHsKKwkJdHYtPnR2X3NlYyArPSAxOworCQl0di0+dHZfdXNlYyAtPSBVU0VDX1BFUl9TRUM7CisJfQorfQorCiBpbnQgX192c3lzY2FsbCgwKSB2Z2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICogdHYsIHN0cnVjdCB0aW1lem9uZSAqIHR6KQogewotCWlmICghX19zeXNjdGxfdnN5c2NhbGwpCi0JCXJldHVybiBnZXR0aW1lb2ZkYXkodHYsdHopOwogCWlmICh0dikKIAkJZG9fdmdldHRpbWVvZmRheSh0dik7CiAJaWYgKHR6KQpAQCAtMTI5LDExICsxNTEsMTEgQEAKICAqIHVubGlrZWx5ICovCiB0aW1lX3QgX192c3lzY2FsbCgxKSB2dGltZSh0aW1lX3QgKnQpCiB7Ci0JaWYgKCFfX3N5c2N0bF92c3lzY2FsbCkKKwlpZiAodW5saWtlbHkoIV9fdnN5c2NhbGxfZ3RvZF9kYXRhLnN5c2N0bF9lbmFibGVkKSkKIAkJcmV0dXJuIHRpbWVfc3lzY2FsbCh0KTsKIAllbHNlIGlmICh0KQotCQkqdCA9IF9feHRpbWUudHZfc2VjOwkJCi0JcmV0dXJuIF9feHRpbWUudHZfc2VjOworCQkqdCA9IF9fdnN5c2NhbGxfZ3RvZF9kYXRhLndhbGxfdGltZV90di50dl9zZWM7CisJcmV0dXJuIF9fdnN5c2NhbGxfZ3RvZF9kYXRhLndhbGxfdGltZV90di50dl9zZWM7CiB9CiAKIC8qIEZhc3Qgd2F5IHRvIGdldCBjdXJyZW50IENQVSBhbmQgbm9kZS4KQEAgLTIxMCw3ICsyMzIsNyBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0JaWYgKCFzeXNjdGxfdnN5c2NhbGwpIHsKKwlpZiAoIXZzeXNjYWxsX2d0b2RfZGF0YS5zeXNjdGxfZW5hYmxlZCkgewogCQl3cml0ZXcoU1lTQ0FMTCwgbWFwMSk7CiAJCXdyaXRldyhTWVNDQUxMLCBtYXAyKTsKIAl9IGVsc2UgewpAQCAtMjMyLDcgKzI1NCw4IEBACiAKIHN0YXRpYyBjdGxfdGFibGUga2VybmVsX3RhYmxlMltdID0gewogCXsgLmN0bF9uYW1lID0gOTksIC5wcm9jbmFtZSA9ICJ2c3lzY2FsbDY0IiwKLQkgIC5kYXRhID0gJnN5c2N0bF92c3lzY2FsbCwgLm1heGxlbiA9IHNpemVvZihpbnQpLCAubW9kZSA9IDA2NDQsCisJICAuZGF0YSA9ICZ2c3lzY2FsbF9ndG9kX2RhdGEuc3lzY3RsX2VuYWJsZWQsIC5tYXhsZW4gPSBzaXplb2YoaW50KSwKKwkgIC5tb2RlID0gMDY0NCwKIAkgIC5zdHJhdGVneSA9IHZzeXNjYWxsX3N5c2N0bF9ub3N0cmF0LAogCSAgLnByb2NfaGFuZGxlciA9IHZzeXNjYWxsX3N5c2N0bF9jaGFuZ2UgfSwKIAl7fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL0tjb25maWcgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwppbmRleCAyMGVhY2MyLi5lOTQyZmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwpAQCAtMTMsNiArMTMsNyBAQAogCWRlcGVuZHMgb24gSUE2NCB8fCBYODYKIAlkZXBlbmRzIG9uIFBDSQogCWRlcGVuZHMgb24gUE0KKwlzZWxlY3QgUE5QCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlIChBQ1BJKSBzdXBwb3J0IGZvciAKQEAgLTEzMiwxNSArMTMzLDYgQEAKIAkgIE5vdGUgdGhhdCB0aGlzIGlzIGFuIHJlZi4gaW1wbGVtZW50YXRpb24gb25seS4gIEl0IG1heSBvciBtYXkgbm90IHdvcmsKIAkgIGZvciB5b3VyIGludGVncmF0ZWQgdmlkZW8gZGV2aWNlLgogCi1jb25maWcgQUNQSV9IT1RLRVkKLQl0cmlzdGF0ZSAiR2VuZXJpYyBIb3RrZXkgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQlkZXBlbmRzIG9uIFg4NgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIEV4cGVyaW1lbnRhbCBjb25zb2xpZGF0ZWQgaG90a2V5IGRyaXZlci4KLQkgIElmIHlvdSBhcmUgdW5zdXJlLCBzYXkgTi4KLQogY29uZmlnIEFDUElfRkFOCiAJdHJpc3RhdGUgIkZhbiIKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQppbmRleCA4NTZjMzJiLi41OTU2ZTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCkBAIC00Niw3ICs0Niw2IEBACiBvYmotJChDT05GSUdfQUNQSV9ET0NLKQkJKz0gZG9jay5vCiBvYmotJChDT05GSUdfQUNQSV9CQVkpCQkrPSBiYXkubwogb2JqLSQoQ09ORklHX0FDUElfVklERU8pCSs9IHZpZGVvLm8KLW9iai0kKENPTkZJR19BQ1BJX0hPVEtFWSkJKz0gaG90a2V5Lm8KIG9iai15CQkJCSs9IHBjaV9yb290Lm8gcGNpX2xpbmsubyBwY2lfaXJxLm8gcGNpX2JpbmQubwogb2JqLSQoQ09ORklHX0FDUElfUE9XRVIpCSs9IHBvd2VyLm8KIG9iai0kKENPTkZJR19BQ1BJX1BST0NFU1NPUikJKz0gcHJvY2Vzc29yLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hYy5jIGIvZHJpdmVycy9hY3BpL2FjLmMKaW5kZXggNmRhZWFjZS4uMzdjN2RjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNkZWZpbmUgQUNQSV9BQ19DT01QT05FTlQJCTB4MDAwMjAwMDAKICNkZWZpbmUgQUNQSV9BQ19DTEFTUwkJCSJhY19hZGFwdGVyIgogI2RlZmluZSBBQ1BJX0FDX0hJRCAJCQkiQUNQSTAwMDMiCi0jZGVmaW5lIEFDUElfQUNfRFJJVkVSX05BTUUJCSJBQ1BJIEFDIEFkYXB0ZXIgRHJpdmVyIgogI2RlZmluZSBBQ1BJX0FDX0RFVklDRV9OQU1FCQkiQUMgQWRhcHRlciIKICNkZWZpbmUgQUNQSV9BQ19GSUxFX1NUQVRFCQkic3RhdGUiCiAjZGVmaW5lIEFDUElfQUNfTk9USUZZX1NUQVRVUwkJMHg4MApAQCAtNDQsMTAgKzQzLDEwIEBACiAjZGVmaW5lIEFDUElfQUNfU1RBVFVTX1VOS05PV04JCTB4RkYKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0FDX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9hYyIpCitBQ1BJX01PRFVMRV9OQU1FKCJhYyIpOwogCi0gICAgTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfQUNfRFJJVkVSX05BTUUpOworTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIEFDIEFkYXB0ZXIgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIGV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfbG9ja19hY19kaXIodm9pZCk7CkBAIC01OCw3ICs1Nyw3IEBACiBzdGF0aWMgaW50IGFjcGlfYWNfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9hY19kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX0FDX0RSSVZFUl9OQU1FLAorCS5uYW1lID0gImFjIiwKIAkuY2xhc3MgPSBBQ1BJX0FDX0NMQVNTLAogCS5pZHMgPSBBQ1BJX0FDX0hJRCwKIAkub3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jIGIvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCmluZGV4IGNkOTQ2ZWQuLmMyNjE3MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKQEAgLTM1LDE0ICszNSwxMyBAQAogI2RlZmluZSBBQ1BJX01FTU9SWV9ERVZJQ0VfQ09NUE9ORU5UCQkweDA4MDAwMDAwVUwKICNkZWZpbmUgQUNQSV9NRU1PUllfREVWSUNFX0NMQVNTCQkibWVtb3J5IgogI2RlZmluZSBBQ1BJX01FTU9SWV9ERVZJQ0VfSElECQkJIlBOUDBDODAiCi0jZGVmaW5lIEFDUElfTUVNT1JZX0RFVklDRV9EUklWRVJfTkFNRQkJIkhvdHBsdWcgTWVtIERyaXZlciIKICNkZWZpbmUgQUNQSV9NRU1PUllfREVWSUNFX05BTUUJCQkiSG90cGx1ZyBNZW0gRGV2aWNlIgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfTUVNT1JZX0RFVklDRV9DT01QT05FTlQKIAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9tZW1vcnkiKQotICAgIE1PRFVMRV9BVVRIT1IoIk5hdmVlbiBCIFMgPG5hdmVlbi5iLnNAaW50ZWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfTUVNT1JZX0RFVklDRV9EUklWRVJfTkFNRSk7CitBQ1BJX01PRFVMRV9OQU1FKCJhY3BpX21lbWhvdHBsdWciKTsKK01PRFVMRV9BVVRIT1IoIk5hdmVlbiBCIFMgPG5hdmVlbi5iLnNAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3RwbHVnIE1lbSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogLyogQUNQSSBfU1RBIG1ldGhvZCB2YWx1ZXMgKi8KQEAgLTYwLDcgKzU5LDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9tZW1vcnlfZGV2aWNlX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX21lbW9yeV9kZXZpY2VfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9NRU1PUllfREVWSUNFX0RSSVZFUl9OQU1FLAorCS5uYW1lID0gImFjcGlfbWVtaG90cGx1ZyIsCiAJLmNsYXNzID0gQUNQSV9NRU1PUllfREVWSUNFX0NMQVNTLAogCS5pZHMgPSBBQ1BJX01FTU9SWV9ERVZJQ0VfSElELAogCS5vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMgYi9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKaW5kZXggMzFhZDcwYS4uNzcyMjk5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYwpAQCAtMTQxLDYgKzE0MSw3IEBACiAJCVc1QSwJCS8vVzVBCiAJCVczViwgICAgICAgICAgICAvL1czMDMwVgogCQl4eE4sCQkvL00yNDAwTiwgTTM3MDBOLCBNNTIwME4sIE02ODAwTiwgUzEzMDBOLCBTNTIwME4KKwkJQTRTLCAgICAgICAgICAgIC8vWjgxc3AKIAkJLy8oQ2VudHJpbm8pCiAJCUVORF9NT0RFTAogCX0gbW9kZWw7CQkvL01vZGVscyBjdXJyZW50bHkgc3VwcG9ydGVkCkBAIC0zOTcsNyArMzk4LDE2IEBACiAJIC5icmlnaHRuZXNzX3NldCA9ICJTUExWIiwKIAkgLmJyaWdodG5lc3NfZ2V0ID0gIkdQTFYiLAogCSAuZGlzcGxheV9zZXQgPSAiU0RTUCIsCi0JIC5kaXNwbGF5X2dldCA9ICJcXEFEVkcifQorCS5kaXNwbGF5X2dldCA9ICJcXEFEVkcifSwKKworCXsKKwkJLm5hbWUgICAgICAgICAgICAgID0gIkE0UyIsCisJCS5icmlnaHRuZXNzX3NldCAgICA9ICJTUExWIiwKKwkJLmJyaWdodG5lc3NfZ2V0ICAgID0gIkdQTFYiLAorCQkubXRfYnRfc3dpdGNoICAgICAgPSAiQkxFRCIsCisJCS5tdF93bGVkICAgICAgICAgICA9ICJXTEVEIgorCX0KKwogfTsKIAogLyogcHJvY2RpciB3ZSB1c2UgKi8KQEAgLTQyMSw3ICs0MzEsNyBAQAogc3RhdGljIGludCBhc3VzX2hvdGtfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYXN1c19ob3RrX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhc3VzX2hvdGtfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9IT1RLX05BTUUsCisJLm5hbWUgPSAiYXN1c19hY3BpIiwKIAkuY2xhc3MgPSBBQ1BJX0hPVEtfQ0xBU1MsCiAJLmlkcyA9IEFDUElfSE9US19ISUQsCiAJLm9wcyA9IHsKQEAgLTExMTcsNiArMTEyNyw4IEBACiAJCXJldHVybiBXM1Y7CiAJZWxzZSBpZiAoc3RybmNtcChtb2RlbCwgIlc1QSIsIDMpID09IDApCiAJCXJldHVybiBXNUE7CisJZWxzZSBpZiAoc3RybmNtcChtb2RlbCwgIkE0UyIsIDMpID09IDApCisJCXJldHVybiBBNFM7CiAJZWxzZQogCQlyZXR1cm4gRU5EX01PREVMOwogfQpAQCAtMTM2NSwxMCArMTM3Nyw2IEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCFhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVXNpbmcgZ2VuZXJpYyBob3RrZXkgZHJpdmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQogCWFzdXNfcHJvY19kaXIgPSBwcm9jX21rZGlyKFBST0NfQVNVUywgYWNwaV9yb290X2Rpcik7CiAJaWYgKCFhc3VzX3Byb2NfZGlyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQXN1cyBBQ1BJOiBVbmFibGUgdG8gY3JlYXRlIC9wcm9jIGVudHJ5XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCmluZGV4IDJmNDUyMWEuLjAyZGU0OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwpAQCAtNDIsNyArNDIsNiBAQAogI2RlZmluZSBBQ1BJX0JBVFRFUllfQ09NUE9ORU5UCQkweDAwMDQwMDAwCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9DTEFTUwkJImJhdHRlcnkiCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9ISUQJCSJQTlAwQzBBIgotI2RlZmluZSBBQ1BJX0JBVFRFUllfRFJJVkVSX05BTUUJIkFDUEkgQmF0dGVyeSBEcml2ZXIiCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9ERVZJQ0VfTkFNRQkiQmF0dGVyeSIKICNkZWZpbmUgQUNQSV9CQVRURVJZX0ZJTEVfSU5GTwkJImluZm8iCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9GSUxFX1NUQVRVUwkic3RhdGUiCkBAIC01MywxMCArNTIsMTAgQEAKICNkZWZpbmUgQUNQSV9CQVRURVJZX1VOSVRTX0FNUFMJCSJtQSIKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0JBVFRFUllfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2JhdHRlcnkiKQorQUNQSV9NT0RVTEVfTkFNRSgiYmF0dGVyeSIpOwogCi0gICAgTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfQkFUVEVSWV9EUklWRVJfTkFNRSk7CitNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDUEkgQmF0dGVyeSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWNwaV9sb2NrX2JhdHRlcnlfZGlyKHZvaWQpOwpAQCAtNjcsNyArNjYsNyBAQAogc3RhdGljIGludCBhY3BpX2JhdHRlcnlfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2JhdHRlcnlfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9CQVRURVJZX0RSSVZFUl9OQU1FLAorCS5uYW1lID0gImJhdHRlcnkiLAogCS5jbGFzcyA9IEFDUElfQkFUVEVSWV9DTEFTUywKIAkuaWRzID0gQUNQSV9CQVRURVJZX0hJRCwKIAkub3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2JheS5jIGIvZHJpdmVycy9hY3BpL2JheS5jCmluZGV4IDkxMDgyY2UuLmZiM2YzMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9iYXkuYworKysgYi9kcml2ZXJzL2FjcGkvYmF5LmMKQEAgLTMyLDExICszMiw5IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAotI2RlZmluZSBBQ1BJX0JBWV9EUklWRVJfTkFNRSAiQUNQSSBSZW1vdmFibGUgRHJpdmUgQmF5IERyaXZlciIKLQotQUNQSV9NT0RVTEVfTkFNRSgiYmF5IikKK0FDUElfTU9EVUxFX05BTUUoImJheSIpOwogTU9EVUxFX0FVVEhPUigiS3Jpc3RlbiBDYXJsc29uIEFjY2FyZGkiKTsKLU1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0JBWV9EUklWRVJfTkFNRSk7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDUEkgUmVtb3ZhYmxlIERyaXZlIEJheSBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKICNkZWZpbmUgQUNQSV9CQVlfQ0xBU1MgImJheSIKICNkZWZpbmUgQUNQSV9CQVlfQ09NUE9ORU5UCTB4MTAwMDAwMDAKQEAgLTQ3LDE4ICs0NSw2IEBACiAJYWNwaV9nZXRfbmFtZShoLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWZmZXIpO1wKIAlwcmludGsoS0VSTl9ERUJVRyBQUkVGSVggIiVzOiAlc1xuIiwgcHJlZml4LCBzKTsgfQogc3RhdGljIHZvaWQgYmF5X25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSk7Ci1zdGF0aWMgaW50IGFjcGlfYmF5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IGFjcGlfYmF5X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfYmF5X2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfQkFZX0RSSVZFUl9OQU1FLAotCS5jbGFzcyA9IEFDUElfQkFZX0NMQVNTLAotCS5pZHMgPSBBQ1BJX0JBWV9ISUQsCi0JLm9wcyA9IHsKLQkJLmFkZCA9IGFjcGlfYmF5X2FkZCwKLQkJLnJlbW92ZSA9IGFjcGlfYmF5X3JlbW92ZSwKLQkJfSwKLX07CiAKIHN0cnVjdCBiYXkgewogCWFjcGlfaGFuZGxlIGhhbmRsZTsKQEAgLTIzNCwxNCArMjIwLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVqZWN0X3JlbW92YWJsZV9kcml2ZSk7CiAKLXN0YXRpYyBpbnQgYWNwaV9iYXlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCWJheV9kcHJpbnRrKGRldmljZS0+aGFuZGxlLCAiYWRkaW5nIGJheSBkZXZpY2UiKTsKLQlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCAiRG9ja2FibGUgQmF5Iik7Ci0Jc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksICJiYXkiKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBhY3BpX2JheV9hZGRfZnMoc3RydWN0IGJheSAqYmF5KQogewogCWludCByZXQ7CkBAIC0zMDMsNyArMjgxLDcgQEAKIAogCS8qIGluaXRpYWxpemUgcGxhdGZvcm0gZGV2aWNlIHN0dWZmICovCiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoQUNQSV9CQVlfQ0xBU1MsIGlkLCBOVUxMLCAwKTsKLQlpZiAocGRldiA9PSBOVUxMKSB7CisJaWYgKElTX0VSUihwZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJFcnJvciByZWdpc3RlcmluZyBiYXkgZGV2aWNlXG4iKTsKIAkJZ290byBiYXlfYWRkX2VycjsKIAl9CkBAIC0zMzksNTIgKzMxNyw2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9iYXlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSkKLXsKLQkvKioqIEZJWE1FOiBkbyBzb21ldGhpbmcgaGVyZSAqLwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGJheV9jcmVhdGVfYWNwaV9kZXZpY2UgLSBhZGQgbmV3IGRldmljZXMgdG8gYWNwaQotICogQGhhbmRsZSAtIGhhbmRsZSBvZiB0aGUgZGV2aWNlIHRvIGFkZAotICoKLSAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgbmV3IGFjcGlfZGV2aWNlIGZvciB0aGUgZ2l2ZW4KLSAqICBoYW5kbGUgaWYgb25lIGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBUaGlzIHNob3VsZCBjYXVzZQotICogIGFjcGkgdG8gc2NhbiBmb3IgZHJpdmVycyBmb3IgdGhlIGdpdmVuIGRldmljZXMsIGFuZCBjYWxsCi0gKiAgbWF0Y2hpbmcgZHJpdmVyJ3MgYWRkIHJvdXRpbmUuCi0gKgotICogIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhY3BpX2RldmljZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYW5kbGUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBiYXlfY3JlYXRlX2FjcGlfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKLXsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICpwYXJlbnRfZGV2aWNlOwotCWFjcGlfaGFuZGxlIHBhcmVudDsKLQlpbnQgcmV0OwotCi0JYmF5X2RwcmludGsoaGFuZGxlLCAiVHJ5aW5nIHRvIGdldCBkZXZpY2UiKTsKLQlpZiAoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpKSB7Ci0JCS8qCi0JCSAqIG5vIGRldmljZSBjcmVhdGVkIGZvciB0aGlzIG9iamVjdCwKLQkJICogc28gd2Ugc2hvdWxkIGNyZWF0ZSBvbmUuCi0JCSAqLwotCQliYXlfZHByaW50ayhoYW5kbGUsICJObyBkZXZpY2UgZm9yIGhhbmRsZSIpOwotCQlhY3BpX2dldF9wYXJlbnQoaGFuZGxlLCAmcGFyZW50KTsKLQkJaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UocGFyZW50LCAmcGFyZW50X2RldmljZSkpCi0JCQlwYXJlbnRfZGV2aWNlID0gTlVMTDsKLQotCQlyZXQgPSBhY3BpX2J1c19hZGQoJmRldmljZSwgcGFyZW50X2RldmljZSwgaGFuZGxlLAotCQkJQUNQSV9CVVNfVFlQRV9ERVZJQ0UpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9kZWJ1ZygiZXJyb3IgYWRkaW5nIGJ1cywgJXhcbiIsCi0JCQkJLXJldCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gZGV2aWNlOwotfQotCiAvKioKICAqIGJheV9ub3RpZnkgLSBhY3QgdXBvbiBhbiBhY3BpIGJheSBub3RpZmljYXRpb24KICAqIEBoYW5kbGU6IHRoZSBiYXkgaGFuZGxlCkBAIC0zOTQsMzggKzMyNiwxOSBAQAogICovCiBzdGF0aWMgdm9pZCBiYXlfbm90aWZ5KGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2OworCXN0cnVjdCBiYXkgKmJheV9kZXYgPSAoc3RydWN0IGJheSAqKWRhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJheV9kZXYtPnBkZXYtPmRldjsKIAogCWJheV9kcHJpbnRrKGhhbmRsZSwgIkJheSBldmVudCIpOwogCiAJc3dpdGNoKGV2ZW50KSB7CiAJY2FzZSBBQ1BJX05PVElGWV9CVVNfQ0hFQ0s6Ci0JCXByaW50aygiQnVzIENoZWNrXG4iKTsKIAljYXNlIEFDUElfTk9USUZZX0RFVklDRV9DSEVDSzoKLQkJcHJpbnRrKCJEZXZpY2UgQ2hlY2tcbiIpOwotCQlkZXYgPSBiYXlfY3JlYXRlX2FjcGlfZGV2aWNlKGhhbmRsZSk7Ci0JCWlmIChkZXYpCi0JCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXYsIGV2ZW50LCAwKTsKLQkJZWxzZQotCQkJcHJpbnRrKCJObyBkZXZpY2UgZm9yIGdlbmVyYXRpbmcgZXZlbnRcbiIpOwotCQkvKiB3b3VsZG4ndCBpdCBiZSBhIGdvb2QgaWRlYSB0byBqdXN0IHJlc2NhbiBTQVRBCi0JCSAqIHJpZ2h0IGhlcmU/Ci0JCSAqLwotCQlicmVhazsKIAljYXNlIEFDUElfTk9USUZZX0VKRUNUX1JFUVVFU1Q6Ci0JCXByaW50aygiRWplY3QgcmVxdWVzdFxuIik7Ci0JCWRldiA9IGJheV9jcmVhdGVfYWNwaV9kZXZpY2UoaGFuZGxlKTsKLQkJaWYgKGRldikKLQkJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGRldiwgZXZlbnQsIDApOwotCQllbHNlCi0JCQlwcmludGsoIk5vIGRldmljZSBmb3IgZ2VuZXJhdGluZyBldmVudG4iKTsKLQotCQkvKiB3b3VsZG4ndCBpdCBiZSBhIGdvb2QgaWRlYSB0byBqdXN0IGNhbGwgdGhlCi0JCSAqIGVqZWN0X2RldmljZSBoZXJlIGlmIHdlIHdlcmUgYSBTQVRBIGRldmljZT8KLQkJICovCisJCWtvYmplY3RfdWV2ZW50KCZkZXYtPmtvYmosIEtPQkpfQ0hBTkdFKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKCJ1bmtub3duIGV2ZW50ICVkXG4iLCBldmVudCk7CisJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkJheTogdW5rbm93biBldmVudCAlZFxuIiwgZXZlbnQpOwogCX0KIH0KIApAQCAtNDU3LDEwICszNzAsNiBAQAogCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKIAkJQUNQSV9VSU5UMzJfTUFYLCBmaW5kX2JheSwgJmJheXMsIE5VTEwpOwogCi0JaWYgKGJheXMpCi0JCWlmICgoYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2JheV9kcml2ZXIpIDwgMCkpCi0JCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBiYXkgZHJpdmVyXG4iKTsKLQogCWlmICghYmF5cykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTQ4MSw4ICszOTAsNiBAQAogCQlrZnJlZShiYXktPm5hbWUpOwogCQlrZnJlZShiYXkpOwogCX0KLQotCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZhY3BpX2JheV9kcml2ZXIpOwogfQogCiBwb3N0Y29yZV9pbml0Y2FsbChiYXlfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnVzLmMgYi9kcml2ZXJzL2FjcGkvYnVzLmMKaW5kZXggYzI2NDY4ZC4uZmQzN2UxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1cy5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXMuYwpAQCAtMzksNyArMzksNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CVVNfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2J1cyIpCitBQ1BJX01PRFVMRV9OQU1FKCJidXMiKTsKICNpZmRlZglDT05GSUdfWDg2CiBleHRlcm4gdm9pZCBfX2luaXQgYWNwaV9waWNfc2NpX3NldF90cmlnZ2VyKHVuc2lnbmVkIGludCBpcnEsIHUxNiB0cmlnZ2VyKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1dHRvbi5jIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCmluZGV4IGM3MjY2MTIuLmNiNDExMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXR0b24uYworKysgYi9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKQEAgLTM0LDcgKzM0LDYgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCiAjZGVmaW5lIEFDUElfQlVUVE9OX0NPTVBPTkVOVAkJMHgwMDA4MDAwMAotI2RlZmluZSBBQ1BJX0JVVFRPTl9EUklWRVJfTkFNRQkJIkFDUEkgQnV0dG9uIERyaXZlciIKICNkZWZpbmUgQUNQSV9CVVRUT05fQ0xBU1MJCSJidXR0b24iCiAjZGVmaW5lIEFDUElfQlVUVE9OX0ZJTEVfSU5GTwkJImluZm8iCiAjZGVmaW5lIEFDUElfQlVUVE9OX0ZJTEVfU1RBVEUJCSJzdGF0ZSIKQEAgLTYxLDEwICs2MCwxMCBAQAogI2RlZmluZSBBQ1BJX0JVVFRPTl9UWVBFX0xJRAkJMHgwNQogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfQlVUVE9OX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9idXR0b24iKQorQUNQSV9NT0RVTEVfTkFNRSgiYnV0dG9uIik7CiAKIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKLU1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0JVVFRPTl9EUklWRVJfTkFNRSk7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDUEkgQnV0dG9uIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CkBAIC03Myw3ICs3Miw3IEBACiBzdGF0aWMgaW50IGFjcGlfYnV0dG9uX3N0YXRlX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfYnV0dG9uX2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfQlVUVE9OX0RSSVZFUl9OQU1FLAorCS5uYW1lID0gImJ1dHRvbiIsCiAJLmNsYXNzID0gQUNQSV9CVVRUT05fQ0xBU1MsCiAJLmlkcyA9ICJidXR0b25fcG93ZXIsYnV0dG9uX3NsZWVwLFBOUDBDMEQsUE5QMEMwQyxQTlAwQzBFIiwKIAkub3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2NtX3Nicy5jIGIvZHJpdmVycy9hY3BpL2NtX3Nicy5jCmluZGV4IDRhOWI3YmYuLmY5ZGI0ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9jbV9zYnMuYworKysgYi9kcml2ZXJzL2FjcGkvY21fc2JzLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjdXRpbHMuaD4KIAotQUNQSV9NT0RVTEVfTkFNRSgiY21fc2JzIikKK0FDUElfTU9EVUxFX05BTUUoImNtX3NicyIpOwogI2RlZmluZSBBQ1BJX0FDX0NMQVNTCQkiYWNfYWRhcHRlciIKICNkZWZpbmUgQUNQSV9CQVRURVJZX0NMQVNTCSJiYXR0ZXJ5IgogI2RlZmluZSBBQ1BJX1NCU19DT01QT05FTlQJMHgwMDA4MDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jIGIvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCmluZGV4IDY5YTY4ZmQuLjA5MzBkOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogI2luY2x1ZGUgPGFjcGkvY29udGFpbmVyLmg+CiAKLSNkZWZpbmUgQUNQSV9DT05UQUlORVJfRFJJVkVSX05BTUUJIkFDUEkgY29udGFpbmVyIGRyaXZlciIKICNkZWZpbmUgQUNQSV9DT05UQUlORVJfREVWSUNFX05BTUUJIkFDUEkgY29udGFpbmVyIGRldmljZSIKICNkZWZpbmUgQUNQSV9DT05UQUlORVJfQ0xBU1MJCSJjb250YWluZXIiCiAKQEAgLTQ0LDEwICs0MywxMCBAQAogCiAjZGVmaW5lIEFDUElfQ09OVEFJTkVSX0NPTVBPTkVOVAkweDAxMDAwMDAwCiAjZGVmaW5lIF9DT01QT05FTlQJCQlBQ1BJX0NPTlRBSU5FUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfY29udGFpbmVyIikKK0FDUElfTU9EVUxFX05BTUUoImNvbnRhaW5lciIpOwogCi0gICAgTU9EVUxFX0FVVEhPUigiQW5pbCBTIEtlc2hhdmFtdXJ0aHkiKTsKLU1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0NPTlRBSU5FUl9EUklWRVJfTkFNRSk7CitNT0RVTEVfQVVUSE9SKCJBbmlsIFMgS2VzaGF2YW11cnRoeSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIGNvbnRhaW5lciBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogI2RlZmluZSBBQ1BJX1NUQV9QUkVTRU5UCQkoMHgwMDAwMDAwMSkKQEAgLTU2LDcgKzU1LDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9jb250YWluZXJfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9jb250YWluZXJfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9DT05UQUlORVJfRFJJVkVSX05BTUUsCisJLm5hbWUgPSAiY29udGFpbmVyIiwKIAkuY2xhc3MgPSBBQ1BJX0NPTlRBSU5FUl9DTEFTUywKIAkuaWRzID0gIkFDUEkwMDA0LFBOUDBBMDUsUE5QMEEwNiIsCiAJLm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jIGIvZHJpdmVycy9hY3BpL2RlYnVnLmMKaW5kZXggZDQ4ZjY1YS4uYmY1MTNlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2RlYnVnLmMKKysrIGIvZHJpdmVycy9hY3BpL2RlYnVnLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjZ2xvYmFsLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJkZWJ1ZyIpCitBQ1BJX01PRFVMRV9OQU1FKCJkZWJ1ZyIpOwogCiAjaWZkZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAogI3VuZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kb2NrLmMgYi9kcml2ZXJzL2FjcGkvZG9jay5jCmluZGV4IDY4OGU4M2EuLjU0YTY5N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kb2NrLmMKKysrIGIvZHJpdmVycy9hY3BpL2RvY2suYwpAQCAtMzIsMTEgKzMyLDExIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKLSNkZWZpbmUgQUNQSV9ET0NLX0RSSVZFUl9OQU1FICJBQ1BJIERvY2sgU3RhdGlvbiBEcml2ZXIiCisjZGVmaW5lIEFDUElfRE9DS19EUklWRVJfREVTQ1JJUFRJT04gIkFDUEkgRG9jayBTdGF0aW9uIERyaXZlciIKIAotQUNQSV9NT0RVTEVfTkFNRSgiZG9jayIpCitBQ1BJX01PRFVMRV9OQU1FKCJkb2NrIik7CiBNT0RVTEVfQVVUSE9SKCJLcmlzdGVuIENhcmxzb24gQWNjYXJkaSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfRE9DS19EUklWRVJfTkFNRSk7CitNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9ET0NLX0RSSVZFUl9ERVNDUklQVElPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgZG9ja19ub3RpZmllcl9saXN0OwpAQCAtNzQxLDcgKzc0MSw3IEBACiAJCWdvdG8gZG9ja19hZGRfZXJyOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBcbiIsIEFDUElfRE9DS19EUklWRVJfTkFNRSk7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFxuIiwgQUNQSV9ET0NLX0RSSVZFUl9ERVNDUklQVElPTik7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2VjLmMgYi9kcml2ZXJzL2FjcGkvZWMuYwppbmRleCA3NDNjZTI3Li5hYjY4ODgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZWMuYworKysgYi9kcml2ZXJzL2FjcGkvZWMuYwpAQCAtMzgsMTEgKzM4LDEwIEBACiAjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9FQ19DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfZWMiKQorQUNQSV9NT0RVTEVfTkFNRSgiZWMiKTsKICNkZWZpbmUgQUNQSV9FQ19DT01QT05FTlQJCTB4MDAxMDAwMDAKICNkZWZpbmUgQUNQSV9FQ19DTEFTUwkJCSJlbWJlZGRlZF9jb250cm9sbGVyIgogI2RlZmluZSBBQ1BJX0VDX0hJRAkJCSJQTlAwQzA5IgotI2RlZmluZSBBQ1BJX0VDX0RSSVZFUl9OQU1FCQkiQUNQSSBFbWJlZGRlZCBDb250cm9sbGVyIERyaXZlciIKICNkZWZpbmUgQUNQSV9FQ19ERVZJQ0VfTkFNRQkJIkVtYmVkZGVkIENvbnRyb2xsZXIiCiAjZGVmaW5lIEFDUElfRUNfRklMRV9JTkZPCQkiaW5mbyIKICN1bmRlZiBQUkVGSVgKQEAgLTgwLDcgKzc5LDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9lY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfZWNfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9FQ19EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJlYyIsCiAJLmNsYXNzID0gQUNQSV9FQ19DTEFTUywKIAkuaWRzID0gQUNQSV9FQ19ISUQsCiAJLm9wcyA9IHsKQEAgLTI4MCw4ICsyNzksMTAgQEAKIAltdXRleF9sb2NrKCZlYy0+bG9jayk7CiAJaWYgKGVjLT5nbG9iYWxfbG9jaykgewogCQlzdGF0dXMgPSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9FQ19VREVMQVlfR0xLLCAmZ2xrKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCW11dGV4X3VubG9jaygmZWMtPmxvY2spOwogCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KIAl9CiAKIAkvKiBNYWtlIHN1cmUgR1BFIGlzIGVuYWJsZWQgYmVmb3JlIGRvaW5nIHRyYW5zYWN0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudC5jCmluZGV4IDk1OWE4OTMuLjNiMjM1NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudC5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImV2ZW50IikKK0FDUElfTU9EVUxFX05BTUUoImV2ZW50Iik7CiAKIC8qIEdsb2JhbCB2YXJzIGZvciBoYW5kbGluZyBldmVudCBwcm9jIGVudHJ5ICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFjcGlfc3lzdGVtX2V2ZW50X2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCmluZGV4IGRmYWMzZWMuLjYzNWJhNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKQEAgLTYzNiwxNyArNjM2LDYgQEAKIAkJfQogCX0KIAotCWlmICghYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nKSB7Ci0JCS8qCi0JCSAqIFdlIGp1c3Qgd29rZSB1cCBiZWNhdXNlIG9mIGEgd2FrZSBHUEUuIERpc2FibGUgYW55IGZ1cnRoZXIgR1BFcwotCQkgKiB1bnRpbCB3ZSBhcmUgZnVsbHkgdXAgYW5kIHJ1bm5pbmcgKE9ubHkgd2FrZSBHUEVzIHNob3VsZCBiZSBlbmFibGVkCi0JCSAqIGF0IHRoaXMgdGltZSwgYnV0IHdlIGp1c3QgYnJ1dGUtZm9yY2UgZGlzYWJsZSB0aGVtIGFsbC4pCi0JCSAqIDEpIFdlIG11c3QgZGlzYWJsZSB0aGlzIHBhcnRpY3VsYXIgd2FrZSBHUEUgc28gaXQgd29uJ3QgZmlyZSBhZ2FpbgotCQkgKiAyKSBXZSB3YW50IHRvIGRpc2FibGUgYWxsIHdha2UgR1BFcywgc2luY2Ugd2UgYXJlIG5vdyBhd2FrZQotCQkgKi8KLQkJKHZvaWQpYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKCk7Ci0JfQotCiAJLyoKIAkgKiBEaXNwYXRjaCB0aGUgR1BFIHRvIGVpdGhlciBhbiBpbnN0YWxsZWQgaGFuZGxlciwgb3IgdGhlIGNvbnRyb2wgbWV0aG9kCiAJICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgR1BFIChfTHh4IG9yIF9FeHgpLiBJZiBhIGhhbmRsZXIgZXhpc3RzLCB3ZSBpbnZva2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9mYW4uYyBiL2RyaXZlcnMvYWNwaS9mYW4uYwppbmRleCBhZjIyZmRmLi5lYzY1NWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZmFuLmMKKysrIGIvZHJpdmVycy9hY3BpL2Zhbi5jCkBAIC0zNiwxNCArMzYsMTMgQEAKIAogI2RlZmluZSBBQ1BJX0ZBTl9DT01QT05FTlQJCTB4MDAyMDAwMDAKICNkZWZpbmUgQUNQSV9GQU5fQ0xBU1MJCQkiZmFuIgotI2RlZmluZSBBQ1BJX0ZBTl9EUklWRVJfTkFNRQkJIkFDUEkgRmFuIERyaXZlciIKICNkZWZpbmUgQUNQSV9GQU5fRklMRV9TVEFURQkJInN0YXRlIgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfRkFOX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9mYW4iKQorQUNQSV9NT0RVTEVfTkFNRSgiZmFuIik7CiAKLSAgICBNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9GQU5fRFJJVkVSX05BTUUpOworTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIEZhbiBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIGludCBhY3BpX2Zhbl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwpAQCAtNTIsNyArNTEsNyBAQAogc3RhdGljIGludCBhY3BpX2Zhbl9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfZmFuX2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfRkFOX0RSSVZFUl9OQU1FLAorCS5uYW1lID0gImZhbiIsCiAJLmNsYXNzID0gQUNQSV9GQU5fQ0xBU1MsCiAJLmlkcyA9ICJQTlAwQzBCIiwKIAkub3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2dsdWUuYyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKaW5kZXggN2I2YzlmZi4uNDMzNGMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2dsdWUuYworKysgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCkBAIC0yNDEsMyArMjQxLDY1IEBACiB9CiAKIGFyY2hfaW5pdGNhbGwoaW5pdF9hY3BpX2RldmljZV9ub3RpZnkpOworCisKKyNpZiBkZWZpbmVkKENPTkZJR19SVENfRFJWX0NNT1MpIHx8IGRlZmluZWQoQ09ORklHX1JUQ19EUlZfQ01PU19NT0RVTEUpCisKKy8qIEV2ZXJ5IEFDUEkgcGxhdGZvcm0gaGFzIGEgbWMxNDY4MTggY29tcGF0aWJsZSAiY21vcyBydGMiLiAgSGVyZSB3ZSBmaW5kCisgKiBpdHMgZGV2aWNlIG5vZGUgYW5kIHBhc3MgZXh0cmEgY29uZmlnIGRhdGEuICBUaGlzIGhlbHBzIGl0cyBkcml2ZXIgdXNlCisgKiBjYXBhYmlsaXRpZXMgdGhhdCB0aGUgbm93LW9ic29sZXRlIG1jMTQ2ODE4IGRpZG4ndCBoYXZlLCBhbmQgaW5mb3JtcyBpdAorICogdGhhdCB0aGlzIGJvYXJkJ3MgUlRDIGlzIHdha2V1cC1jYXBhYmxlIChwZXIgQUNQSSBzcGVjKS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY21vc19ydGNfYm9hcmRfaW5mbyBydGNfaW5mbzsKKworCisvKiBQTlAgZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCBpbiBhIHN1YnN5c19pbml0Y2FsbCgpOworICogQUNQSSBzcGVjaWZpZXMgdGhlIFBOUCBJRHMgdG8gdXNlLgorICovCisjaW5jbHVkZSA8bGludXgvcG5wLmg+CisKK3N0YXRpYyBpbnQgX19pbml0IHBucF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmlkc1tdID0geyAiUE5QMGIwMCIsICJQTlAwYjAxIiwgIlBOUDBiMDIiLCB9OworCXN0cnVjdCBwbnBfZGV2ICpwbnAgPSB0b19wbnBfZGV2KGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpZHMpOyBpKyspIHsKKwkJaWYgKGNvbXBhcmVfcG5wX2lkKHBucC0+aWQsIGlkc1tpXSkgIT0gMCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKl9faW5pdCBnZXRfcnRjX2Rldih2b2lkKQoreworCXJldHVybiBidXNfZmluZF9kZXZpY2UoJnBucF9idXNfdHlwZSwgTlVMTCwgTlVMTCwgcG5wX21hdGNoKTsKK30KKworc3RhdGljIGludCBfX2luaXQgYWNwaV9ydGNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGdldF9ydGNfZGV2KCk7CisKKwlpZiAoZGV2KSB7CisJCXJ0Y19pbmZvLnJ0Y19kYXlfYWxhcm0gPSBhY3BpX2dibF9GQURULmRheV9hbGFybTsKKwkJcnRjX2luZm8ucnRjX21vbl9hbGFybSA9IGFjcGlfZ2JsX0ZBRFQubW9udGhfYWxhcm07CisJCXJ0Y19pbmZvLnJ0Y19jZW50dXJ5ID0gYWNwaV9nYmxfRkFEVC5jZW50dXJ5OworCisJCS8qIE5PVEU6ICBhY3BpX2dibF9GQURULT5ydGNzNCBpcyBOT1QgY3VycmVudGx5IHVzZWZ1bCAqLworCisJCWRldi0+cGxhdGZvcm1fZGF0YSA9ICZydGNfaW5mbzsKKworCQkvKiBSVEMgYWx3YXlzIHdha2VzIGZyb20gUzEvUzIvUzMsIGFuZCBvZnRlbiBTNC9TVEQgKi8KKwkJZGV2aWNlX2luaXRfd2FrZXVwKGRldiwgMSk7CisKKwkJcHV0X2RldmljZShkZXYpOworCX0gZWxzZQorCQlwcl9kZWJ1ZygiQUNQSTogUlRDIHVuYXZhaWxhYmxlP1xuIik7CisJcmV0dXJuIDA7Cit9CisvKiBkbyB0aGlzIGJldHdlZW4gUlRDIHN1YnN5c19pbml0Y2FsbCgpIGFuZCBydGNfY21vcyBkcml2ZXJfaW5pdGNhbGwoKSAqLworZnNfaW5pdGNhbGwoYWNwaV9ydGNfaW5pdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2hvdGtleS5jIGIvZHJpdmVycy9hY3BpL2hvdGtleS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWRmYjkyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvYWNwaS9ob3RrZXkuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDIgKzAsMCBAQAotLyoKLSAqICBob3RrZXkuYyAtIEFDUEkgSG90a2V5IERyaXZlciAoJFJldmlzaW9uOiAwLjIgJCkKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA0IEx1bWluZyBZdSA8bHVtaW5nLnl1QGludGVsLmNvbT4KLSAqCi0gKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNkZWZpbmUgSE9US0VZX0FDUElfVkVSU0lPTiAiMC4xIgotCi0jZGVmaW5lIEhPVEtFWV9QUk9DICJob3RrZXkiCi0jZGVmaW5lIEhPVEtFWV9FVl9DT05GSUcgICAgImV2ZW50X2NvbmZpZyIKLSNkZWZpbmUgSE9US0VZX1BMX0NPTkZJRyAgICAicG9sbF9jb25maWciCi0jZGVmaW5lIEhPVEtFWV9BQ1RJT04gICAiYWN0aW9uIgotI2RlZmluZSBIT1RLRVlfSU5GTyAiaW5mbyIKLQotI2RlZmluZSBBQ1BJX0hPVEtfTkFNRSAgICAgICAgICAiR2VuZXJpYyBIb3RrZXkgRHJpdmVyIgotI2RlZmluZSBBQ1BJX0hPVEtfQ0xBU1MgICAgICAgICAiSG90a2V5IgotI2RlZmluZSBBQ1BJX0hPVEtfREVWSUNFX05BTUUgICAiSG90a2V5IgotI2RlZmluZSBBQ1BJX0hPVEtfSElEICAgICAgICAgICAiVW5rbm93bj8iCi0jZGVmaW5lIEFDUElfSE9US0VZX0NPTVBPTkVOVCAgIDB4MjAwMDAwMDAKLQotI2RlZmluZSBBQ1BJX0hPVEtFWV9FVkVOVCAgIDB4MQotI2RlZmluZSBBQ1BJX0hPVEtFWV9QT0xMSU5HIDB4MgotI2RlZmluZSBBQ1BJX1VOREVGSU5FRF9FVkVOVCAgICAweGYKLQotI2RlZmluZSBSRVNVTFRfU1RSX0xFTgkgICAgODAKLQotI2RlZmluZSBBQ1RJT05fTUVUSE9ECTAKLSNkZWZpbmUgUE9MTF9NRVRIT0QJMQotCi0jZGVmaW5lIElTX0VWRU5UKGUpICAgICAgIAkoKGUpIDw9IDEwMDAwICYmIChlKSA+MCkKLSNkZWZpbmUgSVNfUE9MTChlKSAgICAgIAkoKGUpID4gMTAwMDApCi0jZGVmaW5lIElTX09USEVSUyhlKQkJKChlKTw9MCB8fCAoZSk+PTIwMDAwKQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgICAgICBBQ1BJX0hPVEtFWV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfaG90a2V5IikKLQotICAgIE1PRFVMRV9BVVRIT1IoImx1bWluZy55dUBpbnRlbC5jb20iKTsKLU1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0hPVEtfTkFNRSk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLS8qICBzdGFuZGFyZGl6ZWQgaW50ZXJuYWwgaG90a2V5IG51bWJlci9ldmVudCAgKi8KLWVudW0gewotCS8qIFZpZGVvIEV4dGVuc2lvbiBldmVudCAqLwotCUhLX0VWRU5UX0NZQ0xFX09VVFBVVF9ERVZJQ0UgPSAweDgwLAotCUhLX0VWRU5UX09VVFBVVF9ERVZJQ0VfU1RBVFVTX0NIQU5HRSwKLQlIS19FVkVOVF9DWUNMRV9ESVNQTEFZX09VVFBVVCwKLQlIS19FVkVOVF9ORVhUX0RJU1BMQVlfT1VUUFVULAotCUhLX0VWRU5UX1BSRVZJT1VTX0RJU1BMQVlfT1VUUFVULAotCUhLX0VWRU5UX0NZQ0xFX0JSSUdIVE5FU1MsCi0JSEtfRVZFTlRfSU5DUkVBU0VfQlJJR0hUTkVTUywKLQlIS19FVkVOVF9ERUNSRUFTRV9CUklHSFRORVNTLAotCUhLX0VWRU5UX1pFUk9fQlJJR0hUTkVTUywKLQlIS19FVkVOVF9ESVNQTEFZX0RFVklDRV9PRkYsCi0KLQkvKiBTbmQgQ2FyZCBldmVudCAqLwotCUhLX0VWRU5UX1ZPTFVNRV9NVVRFLAotCUhLX0VWRU5UX1ZPTFVNRV9JTkNMUkVBU0UsCi0JSEtfRVZFTlRfVk9MVU1FX0RFQ1JFQVNFLAotCi0JLyogcnVubmluZyBzdGF0ZSBjb250cm9sICovCi0JSEtfRVZFTlRfRU5URVJSSU5HX1MzLAotCUhLX0VWRU5UX0VOVEVSUklOR19TNCwKLQlIS19FVkVOVF9FTlRFUlJJTkdfUzUsCi19OwotCi1lbnVtIGNvbmZfZW50cnlfZW51bSB7Ci0JYnVzX2hhbmRsZSA9IDAsCi0JYnVzX21ldGhvZCA9IDEsCi0JYWN0aW9uX2hhbmRsZSA9IDIsCi0JbWV0aG9kID0gMywKLQlMQVNUX0NPTkZfRU5UUlkKLX07Ci0KLS8qICBwcm9jZGlyIHdlIHVzZSAqLwotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaG90a2V5X3Byb2NfZGlyOwotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaG90a2V5X2NvbmZpZzsKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhvdGtleV9wb2xsX2NvbmZpZzsKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhvdGtleV9hY3Rpb247Ci1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpob3RrZXlfaW5mbzsKLQotLyogbGlua2FnZSBmb3IgYWxsIHR5cGUgb2YgaG90a2V5ICovCi1zdHJ1Y3QgYWNwaV9ob3RrZXlfbGluayB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzOwotCWludCBob3RrZXlfdHlwZTsJLyogZXZlbnQgb3IgcG9sbGluZyBiYXNlZCBob3RrZXkgICovCi0JaW50IGhvdGtleV9zdGFuZGFyZF9udW07CS8qIHN0YW5kYXJkaXplZCBob3RrZXkoZXZlbnQpIG51bWJlciAqLwotfTsKLQotLyogZXZlbnQgYmFzZWQgaG90a2V5ICovCi1zdHJ1Y3QgYWNwaV9ldmVudF9ob3RrZXkgewotCXN0cnVjdCBhY3BpX2hvdGtleV9saW5rIGhvdGtleV9saW5rOwotCWludCBmbGFnOwotCWFjcGlfaGFuZGxlIGJ1c19oYW5kbGU7CS8qIGJ1cyB0byBpbnN0YWxsIG5vdGlmeSBoYW5kbGVyICovCi0JaW50IGV4dGVybmFsX2hvdGtleV9udW07CS8qIGV4dGVybmFsIGhvdGtleS9ldmVudCBudW1iZXIgKi8KLQlhY3BpX2hhbmRsZSBhY3Rpb25faGFuZGxlOwkvKiBhY3BpIGhhbmRsZSBhdHRhY2hlZCBhbWwgYWN0aW9uIG1ldGhvZCAqLwotCWNoYXIgKmFjdGlvbl9tZXRob2Q7CS8qIGFjdGlvbiBtZXRob2QgKi8KLX07Ci0KLS8qCi0gKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gcG9sbCBzdGF0dXMKLSAqIDEuIGRpcmVjdHkgY2FsbCByZWFkX3h4eCBtZXRob2QsIHdpdGhvdXQgYW55IGFyZ3VtZW50cyBwYXNzZWQgaW4KLSAqIDIuIGNhbGwgd3JpdGVfeHh4IG1ldGhvZCwgd2l0aCBhcmd1bWVudHMgcGFzc2VkIGluLCB5b3UgbmVlZAotICogdGhlIHJlc3VsdCBpcyBzYXZlZCBpbiBhY3BpX3BvbGxpbmdfaG90a2V5LnBvbGxfcmVzdWx0LgotICogYW50aG9lciByZWFkIGNvbW1hbmQgdGhyb3VnaCBwb2xsaW5nIGludGVyZmFjZS4KLSAqCi0gKi8KLQotLyogcG9sbGluZyBiYXNlZCBob3RrZXkgKi8KLXN0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5IHsKLQlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGluayBob3RrZXlfbGluazsKLQlpbnQgZmxhZzsKLQlhY3BpX2hhbmRsZSBwb2xsX2hhbmRsZTsJLyogYWNwaSBoYW5kbGUgYXR0YWNoZWQgcG9sbGluZyBtZXRob2QgKi8KLQljaGFyICpwb2xsX21ldGhvZDsJLyogcG9sbCBtZXRob2QgKi8KLQlhY3BpX2hhbmRsZSBhY3Rpb25faGFuZGxlOwkvKiBhY3BpIGhhbmRsZSBhdHRhY2hlZCBhY3Rpb24gbWV0aG9kICovCi0JY2hhciAqYWN0aW9uX21ldGhvZDsJLyogYWN0aW9uIG1ldGhvZCAqLwotCXVuaW9uIGFjcGlfb2JqZWN0ICpwb2xsX3Jlc3VsdDsJLyogcG9sbGluZ19yZXN1bHQgKi8KLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7Ci19OwotCi0vKiBob3RrZXkgb2JqZWN0IHVuaW9uICovCi11bmlvbiBhY3BpX2hvdGtleSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzOwotCXN0cnVjdCBhY3BpX2hvdGtleV9saW5rIGxpbms7Ci0Jc3RydWN0IGFjcGlfZXZlbnRfaG90a2V5IGV2ZW50X2hvdGtleTsKLQlzdHJ1Y3QgYWNwaV9wb2xsaW5nX2hvdGtleSBwb2xsX2hvdGtleTsKLX07Ci0KLS8qIGhvdGtleSBvYmplY3QgbGlzdCAqLwotc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgewotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXM7Ci0JaW50IGNvdW50OwotfTsKLQotc3RhdGljIGludCBhdXRvX2hvdGtleV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhdXRvX2hvdGtleV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBob3RrZXlfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9IT1RLX05BTUUsCi0JLmNsYXNzID0gQUNQSV9IT1RLX0NMQVNTLAotCS5pZHMgPSBBQ1BJX0hPVEtfSElELAotCS5vcHMgPSB7Ci0JCS5hZGQgPSBhdXRvX2hvdGtleV9hZGQsCi0JCS5yZW1vdmUgPSBhdXRvX2hvdGtleV9yZW1vdmUsCi0JCX0sCi19OwotCi1zdGF0aWMgdm9pZCBmcmVlX2hvdGtleV9kZXZpY2UodW5pb24gYWNwaV9ob3RrZXkgKmtleSk7Ci1zdGF0aWMgdm9pZCBmcmVlX2hvdGtleV9idWZmZXIodW5pb24gYWNwaV9ob3RrZXkgKmtleSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3BvbGxfaG90a2V5X2J1ZmZlcih1bmlvbiBhY3BpX2hvdGtleSAqa2V5KTsKLXN0YXRpYyBpbnQgaG90a2V5X29wZW5fY29uZmlnKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgaG90a2V5X3BvbGxfb3Blbl9jb25maWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHNzaXplX3QgaG90a2V5X3dyaXRlX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKLQkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpOwotc3RhdGljIGludCBob3RrZXlfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgaG90a2V5X2FjdGlvbl9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBzc2l6ZV90IGhvdGtleV9leGVjdXRlX2FtbF9tZXRob2Qoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKLQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSk7Ci1zdGF0aWMgaW50IGhvdGtleV9jb25maWdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7Ci1zdGF0aWMgaW50IGhvdGtleV9wb2xsX2NvbmZpZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLXN0YXRpYyBpbnQgaG90a2V5X3BvbGxpbmdfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgdW5pb24gYWNwaV9ob3RrZXkgKmdldF9ob3RrZXlfYnlfZXZlbnQoc3RydWN0Ci0JCQkJCSAgICAgIGFjcGlfaG90a2V5X2xpc3QKLQkJCQkJICAgICAgKmhvdGtleV9saXN0LCBpbnQgZXZlbnQpOwotCi0vKiBldmVudCBiYXNlZCBjb25maWcgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvdGtleV9jb25maWdfZm9wcyA9IHsKLQkub3BlbiA9IGhvdGtleV9vcGVuX2NvbmZpZywKLQkucmVhZCA9IHNlcV9yZWFkLAotCS53cml0ZSA9IGhvdGtleV93cml0ZV9jb25maWcsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotLyogcG9sbGluZyBiYXNlZCBjb25maWcgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvdGtleV9wb2xsX2NvbmZpZ19mb3BzID0gewotCS5vcGVuID0gaG90a2V5X3BvbGxfb3Blbl9jb25maWcsCi0JLnJlYWQgPSBzZXFfcmVhZCwKLQkud3JpdGUgPSBob3RrZXlfd3JpdGVfY29uZmlnLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLS8qIGhvdGtleSBkcml2ZXIgaW5mbyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG90a2V5X2luZm9fZm9wcyA9IHsKLQkub3BlbiA9IGhvdGtleV9pbmZvX29wZW5fZnMsCi0JLnJlYWQgPSBzZXFfcmVhZCwKLQkubGxzZWVrID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi0vKiBhY3Rpb24gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvdGtleV9hY3Rpb25fZm9wcyA9IHsKLQkub3BlbiA9IGhvdGtleV9hY3Rpb25fb3Blbl9mcywKLQkucmVhZCA9IHNlcV9yZWFkLAotCS53cml0ZSA9IGhvdGtleV9leGVjdXRlX2FtbF9tZXRob2QsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotLyogcG9sbGluZyByZXN1bHRzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3RrZXlfcG9sbGluZ19mb3BzID0gewotCS5vcGVuID0gaG90a2V5X3BvbGxpbmdfb3Blbl9mcywKLQkucmVhZCA9IHNlcV9yZWFkLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLXN0cnVjdCBhY3BpX2hvdGtleV9saXN0IGdsb2JhbF9ob3RrZXlfbGlzdDsJLyogbGluayBhbGwgZXYgb3IgcGwgaG90a2V5ICAqLwotc3RydWN0IGxpc3RfaGVhZCBob3RrZXlfZW50cmllczsJLyogaGVhZCBvZiB0aGUgbGlzdCBvZiBob3RrZXlfbGlzdCAqLwotCi1zdGF0aWMgaW50IGhvdGtleV9pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIkhvdGtleSBnZW5lcmljIGRyaXZlciB2ZXI6ICVzXG4iLCBIT1RLRVlfQUNQSV9WRVJTSU9OKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV9pbmZvX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhvdGtleV9pbmZvX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKLX0KLQotc3RhdGljIGNoYXIgKmZvcm1hdF9yZXN1bHQodW5pb24gYWNwaV9vYmplY3QgKm9iamVjdCkKLXsKLQljaGFyICpidWY7Ci0KLQlidWYgPSBremFsbG9jKFJFU1VMVF9TVFJfTEVOLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIE5VTEw7Ci0JLyogTm93LCBqdXN0IHN1cHBvcnQgaW50ZWdlciB0eXBlICovCi0JaWYgKG9iamVjdC0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikKLQkJc3ByaW50ZihidWYsICIlZFxuIiwgKHUzMikgb2JqZWN0LT5pbnRlZ2VyLnZhbHVlKTsKLQlyZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV9wb2xsaW5nX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0Jc3RydWN0IGFjcGlfcG9sbGluZ19ob3RrZXkgKnBvbGxfaG90a2V5ID0gc2VxLT5wcml2YXRlOwotCWNoYXIgKmJ1ZjsKLQotCi0JaWYgKHBvbGxfaG90a2V5LT5wb2xsX3Jlc3VsdCkgewotCQlidWYgPSBmb3JtYXRfcmVzdWx0KHBvbGxfaG90a2V5LT5wb2xsX3Jlc3VsdCk7Ci0JCWlmIChidWYpCi0JCQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmKTsKLQkJa2ZyZWUoYnVmKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaG90a2V5X3BvbGxpbmdfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaG90a2V5X3BvbGxpbmdfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV9hY3Rpb25fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaG90a2V5X2luZm9fc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwotfQotCi0vKiBNYXBwaW5nIGV4dGVybmFsIGhvdGtleSBudW1iZXIgdG8gc3RhbmRhcmRpemVkIGhvdGtleSBldmVudCBudW0gKi8KLXN0YXRpYyBpbnQgaG90a2V5X2dldF9pbnRlcm5hbF9ldmVudChpbnQgZXZlbnQsIHN0cnVjdCBhY3BpX2hvdGtleV9saXN0ICpsaXN0KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXM7Ci0JaW50IHZhbCA9IC0xOwotCi0KLQlsaXN0X2Zvcl9lYWNoKGVudHJpZXMsIGxpc3QtPmVudHJpZXMpIHsKLQkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9Ci0JCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOwotCQlpZiAoa2V5LT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX0VWRU5UCi0JCSAgICAmJiBrZXktPmV2ZW50X2hvdGtleS5leHRlcm5hbF9ob3RrZXlfbnVtID09IGV2ZW50KSB7Ci0JCQl2YWwgPSBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQKLWFjcGlfaG90a2V5X25vdGlmeV9oYW5kbGVyKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGV2ZW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlID0gTlVMTDsKLQl1MzIgaW50ZXJuYWxfZXZlbnQ7Ci0KLQotCWlmIChhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmRldmljZSkpCi0JCXJldHVybjsKLQotCWludGVybmFsX2V2ZW50ID0gaG90a2V5X2dldF9pbnRlcm5hbF9ldmVudChldmVudCwgJmdsb2JhbF9ob3RrZXlfbGlzdCk7Ci0JYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoZGV2aWNlLCBpbnRlcm5hbF9ldmVudCwgMCk7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qIE5lZWQgdG8gaW52ZW50IGF1dG9tYXRpY2FsbHkgaG90a2V5IGFkZCBtZXRob2QgKi8KLXN0YXRpYyBpbnQgYXV0b19ob3RrZXlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQotewotCS8qIEltcGxlbWVudCBtZSAqLwotCXJldHVybiAwOwotfQotCi0vKiBOZWVkIHRvIGludmVudCBhdXRvbWF0aWNhbGx5IGhvdGtleSByZW1vdmUgbWV0aG9kICovCi1zdGF0aWMgaW50IGF1dG9faG90a2V5X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCi17Ci0JLyogSW1wbGVtZW50IG1lICovCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIENyZWF0ZSBhIHByb2MgZmlsZSBmb3IgZWFjaCBwb2xsaW5nIG1ldGhvZCAqLwotc3RhdGljIGludCBjcmVhdGVfcG9sbGluZ19wcm9jKHVuaW9uIGFjcGlfaG90a2V5ICpkZXZpY2UpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOwotCWNoYXIgcHJvY19uYW1lWzgwXTsKLQltb2RlX3QgbW9kZTsKLQotCW1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVR087Ci0KLQlzcHJpbnRmKHByb2NfbmFtZSwgIiVkIiwgZGV2aWNlLT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pOwotCS8qCi0JICAgc3RyY2F0KHByb2NfbmFtZSwgZGV2aWNlLT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCk7Ci0JICovCi0JcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSwgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKLQotCWlmICghcHJvYykgewotCQlyZXR1cm4gLUVOT0RFVjsKLQl9IGVsc2UgewotCQlwcm9jLT5wcm9jX2ZvcHMgPSAmaG90a2V5X3BvbGxpbmdfZm9wczsKLQkJcHJvYy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkJcHJvYy0+ZGF0YSA9IGRldmljZTsKLQkJcHJvYy0+dWlkID0gMDsKLQkJcHJvYy0+Z2lkID0gMDsKLQkJZGV2aWNlLT5wb2xsX2hvdGtleS5wcm9jID0gcHJvYzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaG90a2V5X2FkZCh1bmlvbiBhY3BpX2hvdGtleSAqZGV2aWNlKQotewotCWludCBzdGF0dXMgPSAwOwotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2ID0gTlVMTDsKLQotCi0JaWYgKGRldmljZS0+bGluay5ob3RrZXlfdHlwZSA9PSBBQ1BJX0hPVEtFWV9FVkVOVCkgewotCQlhY3BpX2J1c19nZXRfZGV2aWNlKGRldmljZS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGUsICZkZXYpOwotCQlzdGF0dXMgPSBhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoZGV2LT5oYW5kbGUsCi0JCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKLQkJCQkJCSAgICAgYWNwaV9ob3RrZXlfbm90aWZ5X2hhbmRsZXIsCi0JCQkJCQkgICAgIGRldik7Ci0JfSBlbHNlCQkJLyogQWRkIHBvbGxpbmcgaG90a2V5ICovCi0JCWNyZWF0ZV9wb2xsaW5nX3Byb2MoZGV2aWNlKTsKLQotCWdsb2JhbF9ob3RrZXlfbGlzdC5jb3VudCsrOwotCi0JbGlzdF9hZGRfdGFpbCgmZGV2aWNlLT5saW5rLmVudHJpZXMsIGdsb2JhbF9ob3RrZXlfbGlzdC5lbnRyaWVzKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbnQgaG90a2V5X3JlbW92ZSh1bmlvbiBhY3BpX2hvdGtleSAqZGV2aWNlKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXMsICpuZXh0OwotCi0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgZ2xvYmFsX2hvdGtleV9saXN0LmVudHJpZXMpIHsKLQkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9Ci0JCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOwotCQlpZiAoa2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPT0KLQkJICAgIGRldmljZS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKSB7Ci0JCQlsaXN0X2RlbCgma2V5LT5saW5rLmVudHJpZXMpOwotCQkJZnJlZV9ob3RrZXlfZGV2aWNlKGtleSk7Ci0JCQlnbG9iYWxfaG90a2V5X2xpc3QuY291bnQtLTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWtmcmVlKGRldmljZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaG90a2V5X3VwZGF0ZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXM7Ci0KLQotCWxpc3RfZm9yX2VhY2goZW50cmllcywgZ2xvYmFsX2hvdGtleV9saXN0LmVudHJpZXMpIHsKLQkJdW5pb24gYWNwaV9ob3RrZXkgKnRtcCA9Ci0JCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOwotCQlpZiAodG1wLT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPT0KLQkJICAgIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKSB7Ci0JCQlpZiAoa2V5LT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX0VWRU5UKSB7Ci0JCQkJZnJlZV9ob3RrZXlfYnVmZmVyKHRtcCk7Ci0JCQkJdG1wLT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSA9Ci0JCQkJICAgIGtleS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGU7Ci0JCQkJdG1wLT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSA9Ci0JCQkJICAgIGtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW07Ci0JCQkJdG1wLT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSA9Ci0JCQkJICAgIGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9oYW5kbGU7Ci0JCQkJdG1wLT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9Ci0JCQkJICAgIGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2Q7Ci0JCQkJa2ZyZWUoa2V5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgICBjaGFyICBwcm9jX25hbWVbODBdOwotCi0JCQkJICAgc3ByaW50Zihwcm9jX25hbWUsICIlZCIsIHRtcC0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKTsKLQkJCQkgICBzdHJjYXQocHJvY19uYW1lLCB0bXAtPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kKTsKLQkJCQkgICByZW1vdmVfcHJvY19lbnRyeShwcm9jX25hbWUsaG90a2V5X3Byb2NfZGlyKTsKLQkJCQkgKi8KLQkJCQlmcmVlX3BvbGxfaG90a2V5X2J1ZmZlcih0bXApOwotCQkJCXRtcC0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGUgPQotCQkJCSAgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlOwotCQkJCXRtcC0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QgPQotCQkJCSAgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kOwotCQkJCXRtcC0+cG9sbF9ob3RrZXkuYWN0aW9uX2hhbmRsZSA9Ci0JCQkJICAgIGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX2hhbmRsZTsKLQkJCQl0bXAtPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QgPQotCQkJCSAgICBrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2Q7Ci0JCQkJdG1wLT5wb2xsX2hvdGtleS5wb2xsX3Jlc3VsdCA9Ci0JCQkJICAgIGtleS0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQ7Ci0JCQkJLyoKLQkJCQkgICBjcmVhdGVfcG9sbGluZ19wcm9jKHRtcCk7Ci0JCQkJICovCi0JCQkJa2ZyZWUoa2V5KTsKLQkJCX0KLQkJCXJldHVybiAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIHZvaWQgZnJlZV9ob3RrZXlfZGV2aWNlKHVuaW9uIGFjcGlfaG90a2V5ICprZXkpCi17Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICpkZXY7Ci0KLQotCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQpIHsKLQkJYWNwaV9idXNfZ2V0X2RldmljZShrZXktPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlLCAmZGV2KTsKLQkJaWYgKGRldi0+aGFuZGxlKQotCQkJYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoZGV2LT5oYW5kbGUsCi0JCQkJCQkgICBBQ1BJX0RFVklDRV9OT1RJRlksCi0JCQkJCQkgICBhY3BpX2hvdGtleV9ub3RpZnlfaGFuZGxlcik7Ci0JCWZyZWVfaG90a2V5X2J1ZmZlcihrZXkpOwotCX0gZWxzZSB7Ci0JCWNoYXIgcHJvY19uYW1lWzgwXTsKLQotCQlzcHJpbnRmKHByb2NfbmFtZSwgIiVkIiwga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pOwotCQkvKgotCQkgICBzdHJjYXQocHJvY19uYW1lLCBrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kKTsKLQkJICovCi0JCXJlbW92ZV9wcm9jX2VudHJ5KHByb2NfbmFtZSwgaG90a2V5X3Byb2NfZGlyKTsKLQkJZnJlZV9wb2xsX2hvdGtleV9idWZmZXIoa2V5KTsKLQl9Ci0Ja2ZyZWUoa2V5KTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfaG90a2V5X2J1ZmZlcih1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQotewotCS8qIGtleSB3b3VsZCBuZXZlciBiZSBudWxsLCBhY3Rpb24gbWV0aG9kIGNvdWxkIGJlICovCi0Ja2ZyZWUoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfcG9sbF9ob3RrZXlfYnVmZmVyKHVuaW9uIGFjcGlfaG90a2V5ICprZXkpCi17Ci0JLyoga2V5IHdvdWxkIG5ldmVyIGJlIG51bGwsIG90aGVycyBjb3VsZCBiZSovCi0Ja2ZyZWUoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kKTsKLQlrZnJlZShrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kKTsKLQlrZnJlZShrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0KTsKLX0KLXN0YXRpYyBpbnQKLWluaXRfaG90a2V5X2RldmljZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5LCBjaGFyICoqY29uZmlnX2VudHJ5LAotCQkgICBpbnQgc3RkX251bSwgaW50IGV4dGVybmFsX251bSkKLXsKLQlhY3BpX2hhbmRsZSB0bXBfaGFuZGxlOwotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCi0JaWYgKHN0ZF9udW0gPCAwIHx8IElTX1BPTEwoc3RkX251bSkgfHwgIWtleSkKLQkJZ290byBkb19mYWlsOwotCi0JaWYgKCFjb25maWdfZW50cnlbYnVzX2hhbmRsZV0gfHwgIWNvbmZpZ19lbnRyeVthY3Rpb25faGFuZGxlXQotCQkJfHwgIWNvbmZpZ19lbnRyeVttZXRob2RdKQotCQlnb3RvIGRvX2ZhaWw7Ci0KLQlrZXktPmxpbmsuaG90a2V5X3R5cGUgPSBBQ1BJX0hPVEtFWV9FVkVOVDsKLQlrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSA9IHN0ZF9udW07Ci0Ja2V5LT5ldmVudF9ob3RrZXkuZmxhZyA9IDA7Ci0Ja2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9IGNvbmZpZ19lbnRyeVttZXRob2RdOwotCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGNvbmZpZ19lbnRyeVtidXNfaGFuZGxlXSwKLQkJCSAgICYoa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSkpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJZ290byBkb19mYWlsX3plcm87Ci0Ja2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSA9IGV4dGVybmFsX251bTsKLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoTlVMTCwgY29uZmlnX2VudHJ5W2FjdGlvbl9oYW5kbGVdLAotCQkJICAgICYoa2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX2hhbmRsZSkpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJZ290byBkb19mYWlsX3plcm87Ci0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9oYW5kbGUsCi0JCQkJIGNvbmZpZ19lbnRyeVttZXRob2RdLCAmdG1wX2hhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlnb3RvIGRvX2ZhaWxfemVybzsKLQlyZXR1cm4gQUVfT0s7Ci1kb19mYWlsX3plcm86Ci0Ja2V5LT5ldmVudF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9IE5VTEw7Ci1kb19mYWlsOgotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW50Ci1pbml0X3BvbGxfaG90a2V5X2RldmljZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5LCBjaGFyICoqY29uZmlnX2VudHJ5LAotCQkJaW50IHN0ZF9udW0pCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JYWNwaV9oYW5kbGUgdG1wX2hhbmRsZTsKLQotCWlmIChzdGRfbnVtIDwgMCB8fCBJU19FVkVOVChzdGRfbnVtKSB8fCAha2V5KQotCQlnb3RvIGRvX2ZhaWw7Ci0JaWYgKCFjb25maWdfZW50cnlbYnVzX2hhbmRsZV0gfHwhY29uZmlnX2VudHJ5W2J1c19tZXRob2RdIHx8Ci0JCSFjb25maWdfZW50cnlbYWN0aW9uX2hhbmRsZV0gfHwgIWNvbmZpZ19lbnRyeVttZXRob2RdKQotCQlnb3RvIGRvX2ZhaWw7Ci0KLQlrZXktPmxpbmsuaG90a2V5X3R5cGUgPSBBQ1BJX0hPVEtFWV9QT0xMSU5HOwotCWtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID0gc3RkX251bTsKLQlrZXktPnBvbGxfaG90a2V5LmZsYWcgPSAwOwotCWtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QgPSBjb25maWdfZW50cnlbYnVzX21ldGhvZF07Ci0Ja2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kID0gY29uZmlnX2VudHJ5W21ldGhvZF07Ci0KLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoTlVMTCwgY29uZmlnX2VudHJ5W2J1c19oYW5kbGVdLAotCQkgICAgICAmKGtleS0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGUpKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCWdvdG8gZG9fZmFpbF96ZXJvOwotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShrZXktPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlLAotCQkJCSBjb25maWdfZW50cnlbYnVzX21ldGhvZF0sICZ0bXBfaGFuZGxlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCWdvdG8gZG9fZmFpbF96ZXJvOwotCXN0YXR1cyA9Ci0JICAgIGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBjb25maWdfZW50cnlbYWN0aW9uX2hhbmRsZV0sCi0JCQkgICAgJihrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGUpKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCWdvdG8gZG9fZmFpbF96ZXJvOwotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGUsCi0JCQkJIGNvbmZpZ19lbnRyeVttZXRob2RdLCAmdG1wX2hhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlnb3RvIGRvX2ZhaWxfemVybzsKLQlrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0ID0KLQkgICAga21hbGxvYyhzaXplb2YodW5pb24gYWNwaV9vYmplY3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleS0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQpCi0JCWdvdG8gZG9fZmFpbF96ZXJvOwotCXJldHVybiBBRV9PSzsKLQotZG9fZmFpbF96ZXJvOgotCWtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QgPSBOVUxMOwotCWtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9IE5VTEw7Ci1kb19mYWlsOgotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV9vcGVuX2NvbmZpZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gKHNpbmdsZV9vcGVuCi0JCSAgICAgKGZpbGUsIGhvdGtleV9jb25maWdfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpKTsKLX0KLQotc3RhdGljIGludCBob3RrZXlfcG9sbF9vcGVuX2NvbmZpZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gKHNpbmdsZV9vcGVuCi0JCSAgICAgKGZpbGUsIGhvdGtleV9wb2xsX2NvbmZpZ19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSkpOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV9jb25maWdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QgPSAmZ2xvYmFsX2hvdGtleV9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXM7Ci0JY2hhciBidXNfbmFtZVtBQ1BJX1BBVEhOQU1FX01BWF0gPSB7IDAgfTsKLQljaGFyIGFjdGlvbl9uYW1lW0FDUElfUEFUSE5BTUVfTUFYXSA9IHsgMCB9OwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidXMgPSB7IEFDUElfUEFUSE5BTUVfTUFYLCBidXNfbmFtZSB9OwotCXN0cnVjdCBhY3BpX2J1ZmZlciBhY3QgPSB7IEFDUElfUEFUSE5BTUVfTUFYLCBhY3Rpb25fbmFtZSB9OwotCi0KLQlsaXN0X2Zvcl9lYWNoKGVudHJpZXMsIGhvdGtleV9saXN0LT5lbnRyaWVzKSB7Ci0JCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPQotCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKLQkJaWYgKGtleS0+bGluay5ob3RrZXlfdHlwZSA9PSBBQ1BJX0hPVEtFWV9FVkVOVCkgewotCQkJYWNwaV9nZXRfbmFtZShrZXktPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlLAotCQkJCSAgICAgIEFDUElfTkFNRV9UWVBFX01BWCwgJmJ1cyk7Ci0JCQlhY3BpX2dldF9uYW1lKGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9oYW5kbGUsCi0JCQkJICAgICAgQUNQSV9OQU1FX1RZUEVfTUFYLCAmYWN0KTsKLQkJCXNlcV9wcmludGYoc2VxLCAiJXM6JXM6JXM6JWQ6JWRcbiIsIGJ1c19uYW1lLAotCQkJCSAgIGFjdGlvbl9uYW1lLAotCQkJCSAgIGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QsCi0JCQkJICAga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0sCi0JCQkJICAga2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSk7Ci0JCX0KLQl9Ci0Jc2VxX3B1dHMoc2VxLCAiXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBob3RrZXlfcG9sbF9jb25maWdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QgPSAmZ2xvYmFsX2hvdGtleV9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXM7Ci0JY2hhciBidXNfbmFtZVtBQ1BJX1BBVEhOQU1FX01BWF0gPSB7IDAgfTsKLQljaGFyIGFjdGlvbl9uYW1lW0FDUElfUEFUSE5BTUVfTUFYXSA9IHsgMCB9OwotCXN0cnVjdCBhY3BpX2J1ZmZlciBidXMgPSB7IEFDUElfUEFUSE5BTUVfTUFYLCBidXNfbmFtZSB9OwotCXN0cnVjdCBhY3BpX2J1ZmZlciBhY3QgPSB7IEFDUElfUEFUSE5BTUVfTUFYLCBhY3Rpb25fbmFtZSB9OwotCi0KLQlsaXN0X2Zvcl9lYWNoKGVudHJpZXMsIGhvdGtleV9saXN0LT5lbnRyaWVzKSB7Ci0JCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPQotCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKLQkJaWYgKGtleS0+bGluay5ob3RrZXlfdHlwZSA9PSBBQ1BJX0hPVEtFWV9QT0xMSU5HKSB7Ci0JCQlhY3BpX2dldF9uYW1lKGtleS0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGUsCi0JCQkJICAgICAgQUNQSV9OQU1FX1RZUEVfTUFYLCAmYnVzKTsKLQkJCWFjcGlfZ2V0X25hbWUoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlLAotCQkJCSAgICAgIEFDUElfTkFNRV9UWVBFX01BWCwgJmFjdCk7Ci0JCQlzZXFfcHJpbnRmKHNlcSwgIiVzOiVzOiVzOiVzOiVkXG4iLCBidXNfbmFtZSwKLQkJCQkgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kLAotCQkJCSAgIGFjdGlvbl9uYW1lLAotCQkJCSAgIGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCwKLQkJCQkgICBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSk7Ci0JCX0KLQl9Ci0Jc2VxX3B1dHMoc2VxLCAiXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotZ2V0X3Bhcm1zKGNoYXIgKmNvbmZpZ19yZWNvcmQsIGludCAqY21kLCBjaGFyICoqY29uZmlnX2VudHJ5LAotCSAgICAgICBpbnQgKmludGVybmFsX2V2ZW50X251bSwgaW50ICpleHRlcm5hbF9ldmVudF9udW0pCi17Ci0vKiB0aGUgZm9ybWF0IG9mICpjb25maWdfcmVjb3JkID0KLSAqICIxOlxkKzoqIiA6ICJjbWQ6aW50ZXJuYWxfZXZlbnRfbnVtIgotICogIlxkKzpcdys6XHcrOlx3Kzpcdys6XGQrOlxkKyIgOgotICogImNtZDpidXNfaGFuZGxlOmJ1c19tZXRob2Q6YWN0aW9uX2hhbmRsZTptZXRob2Q6aW50ZXJuYWxfZXZlbnRfbnVtOmV4dGVybmFsX2V2ZW50X251bSIKLSAqLwotCWNoYXIgKnRtcCwgKnRtcDEsIGNvdW50OwotCWludCBpOwotCi0Jc3NjYW5mKGNvbmZpZ19yZWNvcmQsICIlZCIsIGNtZCk7Ci0JaWYgKCpjbWQgPT0gMSkgewotCQlpZiAoc3NjYW5mKGNvbmZpZ19yZWNvcmQsICIlZDolZCIsIGNtZCwgaW50ZXJuYWxfZXZlbnRfbnVtKSAhPQotCQkgICAgMikKLQkJCWdvdG8gZG9fZmFpbDsKLQkJZWxzZQotCQkJcmV0dXJuICg2KTsKLQl9Ci0JdG1wID0gc3RyY2hyKGNvbmZpZ19yZWNvcmQsICc6Jyk7Ci0JaWYgKCF0bXApCi0JCWdvdG8gZG9fZmFpbDsKLQl0bXArKzsKLQlmb3IgKGkgPSAwOyBpIDwgTEFTVF9DT05GX0VOVFJZOyBpKyspIHsKLQkJdG1wMSA9IHN0cmNocih0bXAsICc6Jyk7Ci0JCWlmICghdG1wMSkgewotCQkJZ290byBkb19mYWlsOwotCQl9Ci0JCWNvdW50ID0gdG1wMSAtIHRtcDsKLQkJY29uZmlnX2VudHJ5W2ldID0ga3phbGxvYyhjb3VudCArIDEsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNvbmZpZ19lbnRyeVtpXSkKLQkJCWdvdG8gaGFuZGxlX2ZhaWx1cmU7Ci0JCXN0cm5jcHkoY29uZmlnX2VudHJ5W2ldLCB0bXAsIGNvdW50KTsKLQkJdG1wID0gdG1wMSArIDE7Ci0JfQotCWlmIChzc2NhbmYodG1wLCAiJWQ6JWQiLCBpbnRlcm5hbF9ldmVudF9udW0sIGV4dGVybmFsX2V2ZW50X251bSkgPD0gMCkKLQkJZ290byBoYW5kbGVfZmFpbHVyZTsKLQlpZiAoIUlTX09USEVSUygqaW50ZXJuYWxfZXZlbnRfbnVtKSkgewotCQlyZXR1cm4gNjsKLQl9Ci1oYW5kbGVfZmFpbHVyZToKLQl3aGlsZSAoaS0tID4gMCkKLQkJa2ZyZWUoY29uZmlnX2VudHJ5W2ldKTsKLWRvX2ZhaWw6Ci0JcmV0dXJuIC0xOwotfQotCi0vKiAgY291bnQgaXMgbGVuZ3RoIGZvciBvbmUgaW5wdXQgcmVjb3JkICovCi1zdGF0aWMgc3NpemVfdCBob3RrZXlfd3JpdGVfY29uZmlnKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAotCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKLXsKLQljaGFyICpjb25maWdfcmVjb3JkID0gTlVMTDsKLQljaGFyICpjb25maWdfZW50cnlbTEFTVF9DT05GX0VOVFJZXTsKLQlpbnQgY21kLCBpbnRlcm5hbF9ldmVudF9udW0sIGV4dGVybmFsX2V2ZW50X251bTsKLQlpbnQgcmV0ID0gMDsKLQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0ga3phbGxvYyhzaXplb2YodW5pb24gYWNwaV9ob3RrZXkpLCBHRlBfS0VSTkVMKTsKLQotCWlmICgha2V5KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNvbmZpZ19yZWNvcmQgPSBremFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjb25maWdfcmVjb3JkKSB7Ci0JCWtmcmVlKGtleSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihjb25maWdfcmVjb3JkLCBidWZmZXIsIGNvdW50KSkgewotCQlrZnJlZShjb25maWdfcmVjb3JkKTsKLQkJa2ZyZWUoa2V5KTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCBkYXRhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldCA9IGdldF9wYXJtcyhjb25maWdfcmVjb3JkLCAmY21kLCBjb25maWdfZW50cnksCi0JCSAgICAgICAmaW50ZXJuYWxfZXZlbnRfbnVtLCAmZXh0ZXJuYWxfZXZlbnRfbnVtKTsKLQlrZnJlZShjb25maWdfcmVjb3JkKTsKLQlpZiAocmV0ICE9IDYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCBkYXRhIGZvcm1hdCByZXQ9JWRcbiIsIHJldCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjbWQgPT0gMSkgewotCQl1bmlvbiBhY3BpX2hvdGtleSAqdG1wID0gTlVMTDsKLQkJdG1wID0gZ2V0X2hvdGtleV9ieV9ldmVudCgmZ2xvYmFsX2hvdGtleV9saXN0LAotCQkJCQkgIGludGVybmFsX2V2ZW50X251bSk7Ci0JCWlmICghdG1wKQotCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCBrZXlcbiIpOwotCQllbHNlCi0JCQltZW1jcHkoa2V5LCB0bXAsIHNpemVvZih1bmlvbiBhY3BpX2hvdGtleSkpOwotCQlnb3RvIGNvbnRfY21kOwotCX0KLQlpZiAoSVNfRVZFTlQoaW50ZXJuYWxfZXZlbnRfbnVtKSkgewotCQlpZiAoaW5pdF9ob3RrZXlfZGV2aWNlKGtleSwgY29uZmlnX2VudHJ5LAotCQkJaW50ZXJuYWxfZXZlbnRfbnVtLCBleHRlcm5hbF9ldmVudF9udW0pKQotCQkJZ290byBpbml0X2hvdGtleV9mYWlsOwotCX0gZWxzZSB7Ci0JCWlmIChpbml0X3BvbGxfaG90a2V5X2RldmljZShrZXksIGNvbmZpZ19lbnRyeSwKLQkJCSAgICAgICBpbnRlcm5hbF9ldmVudF9udW0pKQotCQkJZ290byBpbml0X3BvbGxfaG90a2V5X2ZhaWw7Ci0JfQotY29udF9jbWQ6Ci0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIDA6Ci0JCWlmIChnZXRfaG90a2V5X2J5X2V2ZW50KCZnbG9iYWxfaG90a2V5X2xpc3QsCi0JCQkJa2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pKQotCQkJZ290byBmYWlsX291dDsKLQkJZWxzZQotCQkJaG90a2V5X2FkZChrZXkpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCWhvdGtleV9yZW1vdmUoa2V5KTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkvKiBrZXkgaXMga2ZyZWUoKWVkIGlmIG1hdGNoZWQqLwotCQlpZiAoaG90a2V5X3VwZGF0ZShrZXkpKQotCQkJZ290byBmYWlsX291dDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZ290byBmYWlsX291dDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBjb3VudDsKLQotaW5pdF9wb2xsX2hvdGtleV9mYWlsOgkJLyogZmFpbGVkIGluaXRfcG9sbF9ob3RrZXlfZGV2aWNlICovCi0Ja2ZyZWUoY29uZmlnX2VudHJ5W2J1c19tZXRob2RdKTsKLQljb25maWdfZW50cnlbYnVzX21ldGhvZF0gPSBOVUxMOwotaW5pdF9ob3RrZXlfZmFpbDoJCS8qIGZhaWxlZCBpbml0X2hvdGtleV9kZXZpY2UgKi8KLQlrZnJlZShjb25maWdfZW50cnlbbWV0aG9kXSk7Ci1mYWlsX291dDoKLQlrZnJlZShjb25maWdfZW50cnlbYnVzX2hhbmRsZV0pOwotCWtmcmVlKGNvbmZpZ19lbnRyeVthY3Rpb25faGFuZGxlXSk7Ci0JLyogTm8gZG91YmxlIGZyZWUgc2luY2UgZWxlbWVudHMgPU5VTEwgZm9yIGVycm9yIGNhc2VzICovCi0JaWYgKElTX0VWRU5UKGludGVybmFsX2V2ZW50X251bSkpIHsKLQkJaWYgKGNvbmZpZ19lbnRyeVtidXNfbWV0aG9kXSkKLQkJCWtmcmVlKGNvbmZpZ19lbnRyeVtidXNfbWV0aG9kXSk7Ci0JCWZyZWVfaG90a2V5X2J1ZmZlcihrZXkpOwkvKiBmcmVlcyBbbWV0aG9kXSAqLwotCX0gZWxzZQotCQlmcmVlX3BvbGxfaG90a2V5X2J1ZmZlcihrZXkpOyAgLyogZnJlZXMgW2J1c19tZXRob2RdK1ttZXRob2RdICovCi0Ja2ZyZWUoa2V5KTsKLQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJpbnZhbGlkIGtleVxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGV2YWx1YXRlcyBhbiBBQ1BJIG1ldGhvZCwgZ2l2ZW4gYW4gaW50IGFzIHBhcmFtZXRlciwgdGhlCi0gKiBtZXRob2QgaXMgc2VhcmNoZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgaGFuZGxlLCBjYW4gYmUgTlVMTC4gVGhlIG91dHB1dAotICogb2YgdGhlIG1ldGhvZCBpcyB3cml0dGVuIGlzIG91dHB1dCwgd2hpY2ggY2FuIGFsc28gYmUgTlVMTAotICoKLSAqIHJldHVybnMgMSBpZiB3cml0ZSBpcyBzdWNjZXNzZnVsLCAwIGVsc2UuCi0gKi8KLXN0YXRpYyBpbnQgd3JpdGVfYWNwaV9pbnQoYWNwaV9oYW5kbGUgaGFuZGxlLCBjb25zdCBjaGFyICptZXRob2QsIGludCB2YWwsCi0JCQkgIHN0cnVjdCBhY3BpX2J1ZmZlciAqb3V0cHV0KQotewotCXN0cnVjdCBhY3BpX29iamVjdF9saXN0IHBhcmFtczsJLyogbGlzdCBvZiBpbnB1dCBwYXJhbWV0ZXJzIChhbiBpbnQgaGVyZSkgKi8KLQl1bmlvbiBhY3BpX29iamVjdCBpbl9vYmo7CS8qIHRoZSBvbmx5IHBhcmFtIHdlIHVzZSAqLwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCXBhcmFtcy5jb3VudCA9IDE7Ci0JcGFyYW1zLnBvaW50ZXIgPSAmaW5fb2JqOwotCWluX29iai50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7Ci0JaW5fb2JqLmludGVnZXIudmFsdWUgPSB2YWw7Ci0KLQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIChjaGFyICopbWV0aG9kLCAmcGFyYW1zLCBvdXRwdXQpOwotCi0JcmV0dXJuIChzdGF0dXMgPT0gQUVfT0spOwotfQotCi1zdGF0aWMgaW50IHJlYWRfYWNwaV9pbnQoYWNwaV9oYW5kbGUgaGFuZGxlLCBjb25zdCBjaGFyICptZXRob2QsCi0JCQkgdW5pb24gYWNwaV9vYmplY3QgKnZhbCkKLXsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0OwotCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmo7Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0Jb3V0cHV0Lmxlbmd0aCA9IHNpemVvZihvdXRfb2JqKTsKLQlvdXRwdXQucG9pbnRlciA9ICZvdXRfb2JqOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAoY2hhciAqKW1ldGhvZCwgTlVMTCwgJm91dHB1dCk7Ci0JaWYgKHZhbCkgewotCQl2YWwtPmludGVnZXIudmFsdWUgPSBvdXRfb2JqLmludGVnZXIudmFsdWU7Ci0JCXZhbC0+dHlwZSA9IG91dF9vYmoudHlwZTsKLQl9IGVsc2UKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAibnVsbCB2YWwgcG9pbnRlclxuIik7Ci0JcmV0dXJuICgoc3RhdHVzID09IEFFX09LKQotCQkgICAgICYmIChvdXRfb2JqLnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpKTsKLX0KLQotc3RhdGljIHVuaW9uIGFjcGlfaG90a2V5ICpnZXRfaG90a2V5X2J5X2V2ZW50KHN0cnVjdAotCQkJCQkgICAgICBhY3BpX2hvdGtleV9saXN0Ci0JCQkJCSAgICAgICpob3RrZXlfbGlzdCwgaW50IGV2ZW50KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXM7Ci0KLQlsaXN0X2Zvcl9lYWNoKGVudHJpZXMsIGhvdGtleV9saXN0LT5lbnRyaWVzKSB7Ci0JCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPQotCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKLQkJaWYgKGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09IGV2ZW50KSB7Ci0JCQlyZXR1cm4gKGtleSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotLyoKLSAqIHVzZXIgY2FsbCBBTUwgbWV0aG9kIGludGVyZmFjZToKLSAqIENhbGwgY29udmVudGlvbjoKLSAqIGVjaG8gImV2ZW50X251bTogYXJnIHR5cGUgOiB2YWx1ZSIKLSAqIGV4YW1wbGU6IGVjaG8gIjE6MTozMCIgPiAvcHJvYy9hY3BpL2FjdGlvbgotICogSnVzdCBzdXBwb3J0IDEgaW50ZWdlciBhcmcgcGFzc2luZyB0byBBTUwgbWV0aG9kCi0gKi8KLQotc3RhdGljIHNzaXplX3QgaG90a2V5X2V4ZWN1dGVfYW1sX21ldGhvZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJIGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKQotewotCXN0cnVjdCBhY3BpX2hvdGtleV9saXN0ICpob3RrZXlfbGlzdCA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7Ci0JY2hhciAqYXJnOwotCWludCBldmVudCwgbWV0aG9kX3R5cGUsIHR5cGUsIHZhbHVlOwotCXVuaW9uIGFjcGlfaG90a2V5ICprZXk7Ci0KLQotCWFyZyA9IGt6YWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFyZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoYXJnLCBidWZmZXIsIGNvdW50KSkgewotCQlrZnJlZShhcmcpOwotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJJbnZhbGlkIGFyZ3VtZW50IDJcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc3NjYW5mKGFyZywgIiVkOiVkOiVkOiVkIiwgJmV2ZW50LCAmbWV0aG9kX3R5cGUsICZ0eXBlLCAmdmFsdWUpICE9Ci0JICAgIDQpIHsKLQkJa2ZyZWUoYXJnKTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCBhcmd1bWVudCAzXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWtmcmVlKGFyZyk7Ci0JaWYgKHR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKLQkJa2V5ID0gZ2V0X2hvdGtleV9ieV9ldmVudChob3RrZXlfbGlzdCwgZXZlbnQpOwotCQlpZiAoIWtleSkKLQkJCWdvdG8gZG9fZmFpbDsKLQkJaWYgKElTX0VWRU5UKGV2ZW50KSkKLQkJCXdyaXRlX2FjcGlfaW50KGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9oYW5kbGUsCi0JCQkJICAgICAgIGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QsIHZhbHVlLAotCQkJCSAgICAgICBOVUxMKTsKLQkJZWxzZSBpZiAoSVNfUE9MTChldmVudCkpIHsKLQkJCWlmIChtZXRob2RfdHlwZSA9PSBQT0xMX01FVEhPRCkKLQkJCQlyZWFkX2FjcGlfaW50KGtleS0+cG9sbF9ob3RrZXkucG9sbF9oYW5kbGUsCi0JCQkJCSAgICAgIGtleS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QsCi0JCQkJCSAgICAgIGtleS0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQpOwotCQkJZWxzZSBpZiAobWV0aG9kX3R5cGUgPT0gQUNUSU9OX01FVEhPRCkKLQkJCQl3cml0ZV9hY3BpX2ludChrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGUsCi0JCQkJCSAgICAgICBrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QsCi0JCQkJCSAgICAgICB2YWx1ZSwgTlVMTCk7Ci0JCQllbHNlCi0JCQkJZ290byBkb19mYWlsOwotCi0JCX0KLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJOb3Qgc3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiBjb3VudDsKLSAgICAgIGRvX2ZhaWw6Ci0JcmV0dXJuIC1FSU5WQUw7Ci0KLX0KLQotc3RhdGljIGludCBfX2luaXQgaG90a2V5X2luaXQodm9pZCkKLXsKLQlpbnQgcmVzdWx0OwotCW1vZGVfdCBtb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVUdPOwotCi0KLQlpZiAoYWNwaV9kaXNhYmxlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlpZiAoYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCkgewotCQlwcmludGsoIlVzaW5nIHNwZWNpZmljIGhvdGtleSBkcml2ZXJcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlob3RrZXlfcHJvY19kaXIgPSBwcm9jX21rZGlyKEhPVEtFWV9QUk9DLCBhY3BpX3Jvb3RfZGlyKTsKLQlpZiAoIWhvdGtleV9wcm9jX2RpcikgewotCQlyZXR1cm4gKC1FTk9ERVYpOwotCX0KLQlob3RrZXlfcHJvY19kaXItPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQlob3RrZXlfY29uZmlnID0KLQkgICAgY3JlYXRlX3Byb2NfZW50cnkoSE9US0VZX0VWX0NPTkZJRywgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKLQlpZiAoIWhvdGtleV9jb25maWcpIHsKLQkJZ290byBkb19mYWlsMTsKLQl9IGVsc2UgewotCQlob3RrZXlfY29uZmlnLT5wcm9jX2ZvcHMgPSAmaG90a2V5X2NvbmZpZ19mb3BzOwotCQlob3RrZXlfY29uZmlnLT5kYXRhID0gJmdsb2JhbF9ob3RrZXlfbGlzdDsKLQkJaG90a2V5X2NvbmZpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkJaG90a2V5X2NvbmZpZy0+dWlkID0gMDsKLQkJaG90a2V5X2NvbmZpZy0+Z2lkID0gMDsKLQl9Ci0KLQlob3RrZXlfcG9sbF9jb25maWcgPQotCSAgICBjcmVhdGVfcHJvY19lbnRyeShIT1RLRVlfUExfQ09ORklHLCBtb2RlLCBob3RrZXlfcHJvY19kaXIpOwotCWlmICghaG90a2V5X3BvbGxfY29uZmlnKSB7Ci0JCWdvdG8gZG9fZmFpbDI7Ci0JfSBlbHNlIHsKLQkJaG90a2V5X3BvbGxfY29uZmlnLT5wcm9jX2ZvcHMgPSAmaG90a2V5X3BvbGxfY29uZmlnX2ZvcHM7Ci0JCWhvdGtleV9wb2xsX2NvbmZpZy0+ZGF0YSA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7Ci0JCWhvdGtleV9wb2xsX2NvbmZpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkJaG90a2V5X3BvbGxfY29uZmlnLT51aWQgPSAwOwotCQlob3RrZXlfcG9sbF9jb25maWctPmdpZCA9IDA7Ci0JfQotCi0JaG90a2V5X2FjdGlvbiA9IGNyZWF0ZV9wcm9jX2VudHJ5KEhPVEtFWV9BQ1RJT04sIG1vZGUsIGhvdGtleV9wcm9jX2Rpcik7Ci0JaWYgKCFob3RrZXlfYWN0aW9uKSB7Ci0JCWdvdG8gZG9fZmFpbDM7Ci0JfSBlbHNlIHsKLQkJaG90a2V5X2FjdGlvbi0+cHJvY19mb3BzID0gJmhvdGtleV9hY3Rpb25fZm9wczsKLQkJaG90a2V5X2FjdGlvbi0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkJaG90a2V5X2FjdGlvbi0+dWlkID0gMDsKLQkJaG90a2V5X2FjdGlvbi0+Z2lkID0gMDsKLQl9Ci0KLQlob3RrZXlfaW5mbyA9IGNyZWF0ZV9wcm9jX2VudHJ5KEhPVEtFWV9JTkZPLCBtb2RlLCBob3RrZXlfcHJvY19kaXIpOwotCWlmICghaG90a2V5X2luZm8pIHsKLQkJZ290byBkb19mYWlsNDsKLQl9IGVsc2UgewotCQlob3RrZXlfaW5mby0+cHJvY19mb3BzID0gJmhvdGtleV9pbmZvX2ZvcHM7Ci0JCWhvdGtleV9pbmZvLT5vd25lciA9IFRISVNfTU9EVUxFOwotCQlob3RrZXlfaW5mby0+dWlkID0gMDsKLQkJaG90a2V5X2luZm8tPmdpZCA9IDA7Ci0JfQotCi0JcmVzdWx0ID0gYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZob3RrZXlfZHJpdmVyKTsKLQlpZiAocmVzdWx0IDwgMCkKLQkJZ290byBkb19mYWlsNTsKLQlnbG9iYWxfaG90a2V5X2xpc3QuY291bnQgPSAwOwotCWdsb2JhbF9ob3RrZXlfbGlzdC5lbnRyaWVzID0gJmhvdGtleV9lbnRyaWVzOwotCi0JSU5JVF9MSVNUX0hFQUQoJmhvdGtleV9lbnRyaWVzKTsKLQotCXJldHVybiAoMCk7Ci0KLSAgICAgIGRvX2ZhaWw1OgotCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9JTkZPLCBob3RrZXlfcHJvY19kaXIpOwotICAgICAgZG9fZmFpbDQ6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX0FDVElPTiwgaG90a2V5X3Byb2NfZGlyKTsKLSAgICAgIGRvX2ZhaWwzOgotCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9QTF9DT05GSUcsIGhvdGtleV9wcm9jX2Rpcik7Ci0gICAgICBkb19mYWlsMjoKLQlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfRVZfQ09ORklHLCBob3RrZXlfcHJvY19kaXIpOwotICAgICAgZG9fZmFpbDE6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX1BST0MsIGFjcGlfcm9vdF9kaXIpOwotCXJldHVybiAoLUVOT0RFVik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBob3RrZXlfZXhpdCh2b2lkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJpZXMsICpuZXh0OwotCi0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUoZW50cmllcywgbmV4dCwgZ2xvYmFsX2hvdGtleV9saXN0LmVudHJpZXMpIHsKLQkJdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9Ci0JCSAgICBjb250YWluZXJfb2YoZW50cmllcywgdW5pb24gYWNwaV9ob3RrZXksIGVudHJpZXMpOwotCi0JCWFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUoTlVMTCk7Ci0JCWxpc3RfZGVsKCZrZXktPmxpbmsuZW50cmllcyk7Ci0JCWdsb2JhbF9ob3RrZXlfbGlzdC5jb3VudC0tOwotCQlmcmVlX2hvdGtleV9kZXZpY2Uoa2V5KTsKLQl9Ci0JYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmhvdGtleV9kcml2ZXIpOwotCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9FVl9DT05GSUcsIGhvdGtleV9wcm9jX2Rpcik7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX1BMX0NPTkZJRywgaG90a2V5X3Byb2NfZGlyKTsKLQlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfQUNUSU9OLCBob3RrZXlfcHJvY19kaXIpOwotCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9JTkZPLCBob3RrZXlfcHJvY19kaXIpOwotCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9QUk9DLCBhY3BpX3Jvb3RfZGlyKTsKLQlyZXR1cm47Ci19Ci0KLW1vZHVsZV9pbml0KGhvdGtleV9pbml0KTsKLW1vZHVsZV9leGl0KGhvdGtleV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9pMmNfZWMuYyBiL2RyaXZlcnMvYWNwaS9pMmNfZWMuYwppbmRleCA3NmVjOGI2Li5hY2FiNGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaTJjX2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2kyY19lYy5jCkBAIC0yNywxOCArMjcsMTcgQEAKICNkZWZpbmUgQUNQSV9FQ19IQ19DT01QT05FTlQJMHgwMDA4MDAwMAogI2RlZmluZSBBQ1BJX0VDX0hDX0NMQVNTCSJlY19oY19zbWJ1cyIKICNkZWZpbmUgQUNQSV9FQ19IQ19ISUQJCSJBQ1BJMDAwMSIKLSNkZWZpbmUgQUNQSV9FQ19IQ19EUklWRVJfTkFNRQkiQUNQSSBFQyBIQyBzbWJ1cyBkcml2ZXIiCiAjZGVmaW5lIEFDUElfRUNfSENfREVWSUNFX05BTUUJIkVDIEhDIHNtYnVzIgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfRUNfSENfQ09NUE9ORU5UCiAKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfc21idXMiKQorQUNQSV9NT0RVTEVfTkFNRSgiaTJjX2VjIik7CiAKIHN0YXRpYyBpbnQgYWNwaV9lY19oY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX2VjX2hjX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfZWNfaGNfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9FQ19IQ19EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJpMmNfZWMiLAogCS5jbGFzcyA9IEFDUElfRUNfSENfQ0xBU1MsCiAJLmlkcyA9IEFDUElfRUNfSENfSElELAogCS5vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYyBiL2RyaXZlcnMvYWNwaS9pYm1fYWNwaS5jCmluZGV4IGM2MTQ0Y2EuLjFhMGVkM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9pYm1fYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9pYm1fYWNwaS5jCkBAIC00OTYsNiArNDk2LDEwIEBACiAJcHJpbnRrKElCTV9JTkZPICIlcyB2JXNcbiIsIElCTV9ERVNDLCBJQk1fVkVSU0lPTik7CiAJcHJpbnRrKElCTV9JTkZPICIlc1xuIiwgSUJNX1VSTCk7CiAKKwlpZiAoaWJtX3RoaW5rcGFkX2VjX2ZvdW5kKQorCQlwcmludGsoSUJNX0lORk8gIlRoaW5rUGFkIEVDIGZpcm13YXJlICVzXG4iLAorCQkgICAgICAgaWJtX3RoaW5rcGFkX2VjX2ZvdW5kKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNjE3LDcgKzI2MjEsNyBAQAogCWlibV9oYW5kbGVfaW5pdCgjb2JqZWN0LCAmb2JqZWN0IyNfaGFuZGxlLCAqb2JqZWN0IyNfcGFyZW50LAlcCiAJCW9iamVjdCMjX3BhdGhzLCBBUlJBWV9TSVpFKG9iamVjdCMjX3BhdGhzKSwgJm9iamVjdCMjX3BhdGgpCiAKLXN0YXRpYyBpbnQgc2V0X2libV9wYXJhbShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQorc3RhdGljIGludCBfX2luaXQgc2V0X2libV9wYXJhbShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC0yNjU5LDcgKzI2NjMsOCBAQAogCWZvciAoaSA9IEFSUkFZX1NJWkUoaWJtcykgLSAxOyBpID49IDA7IGktLSkKIAkJaWJtX2V4aXQoJmlibXNbaV0pOwogCi0JcmVtb3ZlX3Byb2NfZW50cnkoSUJNX0RJUiwgYWNwaV9yb290X2Rpcik7CisJaWYgKHByb2NfZGlyKQorCQlyZW1vdmVfcHJvY19lbnRyeShJQk1fRElSLCBhY3BpX3Jvb3RfZGlyKTsKIAogCWlmIChpYm1fdGhpbmtwYWRfZWNfZm91bmQpCiAJCWtmcmVlKGlibV90aGlua3BhZF9lY19mb3VuZCk7CkBAIC0yNjk2LDExICsyNzAxLDYgQEAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpIHsKLQkJcHJpbnRrKElCTV9FUlIgInVzaW5nIGdlbmVyaWMgaG90a2V5IGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCS8qIGVjIGlzIHJlcXVpcmVkIGJlY2F1c2UgbWFueSBvdGhlciBoYW5kbGVzIGFyZSByZWxhdGl2ZSB0byBpdCAqLwogCUlCTV9IQU5ETEVfSU5JVChlYyk7CiAJaWYgKCFlY19oYW5kbGUpIHsKQEAgLTI3MTAsOSArMjcxMCw2IEBACiAKIAkvKiBNb2RlbHMgd2l0aCBuZXdlciBmaXJtd2FyZSByZXBvcnQgdGhlIEVDIGluIERNSSAqLwogCWlibV90aGlua3BhZF9lY19mb3VuZCA9IGNoZWNrX2RtaV9mb3JfZWMoKTsKLQlpZiAoaWJtX3RoaW5rcGFkX2VjX2ZvdW5kKQotCQlwcmludGsoSUJNX0lORk8gIlRoaW5rUGFkIEVDIGZpcm13YXJlICVzXG4iLAotCQkgICAgICAgaWJtX3RoaW5rcGFkX2VjX2ZvdW5kKTsKIAogCS8qIHRoZXNlIGhhbmRsZXMgYXJlIG5vdCByZXF1aXJlZCAqLwogCUlCTV9IQU5ETEVfSU5JVCh2aWQpOwpAQCAtMjc0Miw2ICsyNzM5LDcgQEAKIAlwcm9jX2RpciA9IHByb2NfbWtkaXIoSUJNX0RJUiwgYWNwaV9yb290X2Rpcik7CiAJaWYgKCFwcm9jX2RpcikgewogCQlwcmludGsoSUJNX0VSUiAidW5hYmxlIHRvIGNyZWF0ZSBwcm9jIGRpciAlcyIsIElCTV9ESVIpOworCQlhY3BpX2libV9leGl0KCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlwcm9jX2Rpci0+b3duZXIgPSBUSElTX01PRFVMRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9udW1hLmMgYi9kcml2ZXJzL2FjcGkvbnVtYS5jCmluZGV4IDRhOWZhZmYuLjhmY2Q2YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9udW1hLmMKKysrIGIvZHJpdmVycy9hY3BpL251bWEuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAjZGVmaW5lIEFDUElfTlVNQQkweDgwMDAwMDAwCiAjZGVmaW5lIF9DT01QT05FTlQJQUNQSV9OVU1BCi1BQ1BJX01PRFVMRV9OQU1FKCJudW1hIikKK0FDUElfTU9EVUxFX05BTUUoIm51bWEiKTsKIAogc3RhdGljIG5vZGVtYXNrX3Qgbm9kZXNfZm91bmRfbWFwID0gTk9ERV9NQVNLX05PTkU7CiAjZGVmaW5lIFBYTV9JTlZBTAktMQpAQCAtNDUsMTIgKzQ1LDYgQEAKIGludCBfX2NwdWluaXRkYXRhIG5vZGVfdG9fcHhtX21hcFtNQVhfTlVNTk9ERVNdCiAJCQkJPSB7IFswIC4uLiBNQVhfTlVNTk9ERVMgLSAxXSA9IFBYTV9JTlZBTCB9OwogCi1leHRlcm4gaW50IF9faW5pdCBhY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5KGNoYXIgKmlkLAotCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBtYWR0X3NpemUsCi0JCQkJCSAgICAgICBpbnQgZW50cnlfaWQsCi0JCQkJCSAgICAgICBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLAotCQkJCQkgICAgICAgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKTsKLQogaW50IF9fY3B1aW5pdCBweG1fdG9fbm9kZShpbnQgcHhtKQogewogCWlmIChweG0gPCAwKQpAQCAtMjA4LDkgKzIwMiw5IEBACiAKIGludCBfX2luaXQKIGFjcGlfdGFibGVfcGFyc2Vfc3JhdChlbnVtIGFjcGlfc3JhdF90eXBlIGlkLAotCQkgICAgICBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpCisJCSAgICAgIGFjcGlfdGFibGVfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpCiB7Ci0JcmV0dXJuIGFjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkoQUNQSV9TSUdfU1JBVCwKKwlyZXR1cm4gYWNwaV90YWJsZV9wYXJzZV9lbnRyaWVzKEFDUElfU0lHX1NSQVQsCiAJCQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfc3JhdCksIGlkLAogCQkJCQkgICAgaGFuZGxlciwgbWF4X2VudHJpZXMpOwogfQpAQCAtMjIwLDkgKzIxNCw3IEBACiAJaW50IHJlc3VsdDsKIAogCS8qIFNSQVQ6IFN0YXRpYyBSZXNvdXJjZSBBZmZpbml0eSBUYWJsZSAqLwotCXJlc3VsdCA9IGFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfU1JBVCwgYWNwaV9wYXJzZV9zcmF0KTsKLQotCWlmIChyZXN1bHQgPiAwKSB7CisJaWYgKCFhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX1NSQVQsIGFjcGlfcGFyc2Vfc3JhdCkpIHsKIAkJcmVzdWx0ID0gYWNwaV90YWJsZV9wYXJzZV9zcmF0KEFDUElfU1JBVF9UWVBFX0NQVV9BRkZJTklUWSwKIAkJCQkJICAgICAgIGFjcGlfcGFyc2VfcHJvY2Vzc29yX2FmZmluaXR5LAogCQkJCQkgICAgICAgTlJfQ1BVUyk7CkBAIC0yMzAsNyArMjIyLDcgQEAKIAl9CiAKIAkvKiBTTElUOiBTeXN0ZW0gTG9jYWxpdHkgSW5mb3JtYXRpb24gVGFibGUgKi8KLQlyZXN1bHQgPSBhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX1NMSVQsIGFjcGlfcGFyc2Vfc2xpdCk7CisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19TTElULCBhY3BpX3BhcnNlX3NsaXQpOwogCiAJYWNwaV9udW1hX2FyY2hfZml4dXAoKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9vc2wuYyBiL2RyaXZlcnMvYWNwaS9vc2wuYwppbmRleCAwZjZmM2JjLi45NzFlY2E0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvb3NsLmMKKysrIGIvZHJpdmVycy9hY3BpL29zbC5jCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9PU19TRVJWSUNFUwotQUNQSV9NT0RVTEVfTkFNRSgib3NsIikKK0FDUElfTU9EVUxFX05BTUUoIm9zbCIpOwogI2RlZmluZSBQUkVGSVgJCSJBQ1BJOiAiCiBzdHJ1Y3QgYWNwaV9vc19kcGMgewogCWFjcGlfb3NkX2V4ZWNfY2FsbGJhY2sgZnVuY3Rpb247CkBAIC02OCw5ICs2OCw2IEBACiBleHRlcm4gY2hhciBsaW5lX2J1Zls4MF07CiAjZW5kaWYJCQkJLypFTkFCTEVfREVCVUdHRVIgKi8KIAotaW50IGFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQgPSBUUlVFOwotRVhQT1JUX1NZTUJPTChhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKTsKLQogc3RhdGljIHVuc2lnbmVkIGludCBhY3BpX2lycV9pcnE7CiBzdGF0aWMgYWNwaV9vc2RfaGFuZGxlciBhY3BpX2lycV9oYW5kbGVyOwogc3RhdGljIHZvaWQgKmFjcGlfaXJxX2NvbnRleHQ7CkBAIC0yMDUsNyArMjAyLDcgQEAKIHsKIAlpZiAocGh5cyA+IFVMT05HX01BWCkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDYW5ub3QgbWFwIG1lbW9yeSB0aGF0IGhpZ2hcbiIpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCWlmIChhY3BpX2dibF9wZXJtYW5lbnRfbW1hcCkKIAkJLyoKQEAgLTg5MCwyNiArODg3LDYgQEAKIH0KICNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKLS8qIEFzc3VtZXMgbm8gdW5yZWFkYWJsZSBob2xlcyBpbmJldHdlZW4gKi8KLXU4IGFjcGlfb3NfcmVhZGFibGUodm9pZCAqcHRyLCBhY3BpX3NpemUgbGVuKQotewotI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKLQljaGFyIHRtcDsKLQlyZXR1cm4gIV9fZ2V0X3VzZXIodG1wLCAoY2hhciBfX3VzZXIgKilwdHIpCi0JICAgICYmICFfX2dldF91c2VyKHRtcCwgKGNoYXIgX191c2VyICopcHRyICsgbGVuIC0gMSk7Ci0jZW5kaWYKLQlyZXR1cm4gMTsKLX0KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi11OCBhY3BpX29zX3dyaXRhYmxlKHZvaWQgKnB0ciwgYWNwaV9zaXplIGxlbikKLXsKLQkvKiBjb3VsZCBkbyBkdW1teSB3cml0ZSAocmFjeSkgb3IgYSBrZXJuZWwgcGFnZSB0YWJsZSBsb29rdXAuCi0JICAgVGhlIGxhdGVyIG1heSBiZSBkaWZmaWN1bHQgYXQgZWFybHkgYm9vdCB3aGVuIGttYXAgZG9lc24ndCB3b3JrIHlldC4gKi8KLQlyZXR1cm4gMTsKLX0KLSNlbmRpZgotCiBhY3BpX3N0YXR1cyBhY3BpX29zX3NpZ25hbCh1MzIgZnVuY3Rpb24sIHZvaWQgKmluZm8pCiB7CiAJc3dpdGNoIChmdW5jdGlvbikgewpAQCAtMTAxMiwxNCArOTg5LDYgQEAKIAogX19zZXR1cCgiYWNwaV93YWtlX2dwZXNfYWx3YXlzX29uIiwgYWNwaV93YWtlX2dwZXNfYWx3YXlzX29uX3NldHVwKTsKIAotc3RhdGljIGludCBfX2luaXQgYWNwaV9ob3RrZXlfc2V0dXAoY2hhciAqc3RyKQotewotCWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQgPSBGQUxTRTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgiYWNwaV9nZW5lcmljX2hvdGtleSIsIGFjcGlfaG90a2V5X3NldHVwKTsKLQogLyoKICAqIG1heF9jc3RhdGUgaXMgZGVmaW5lZCBpbiB0aGUgYmFzZSBrZXJuZWwgc28gbW9kdWxlcyBjYW4KICAqIGNoYW5nZSBpdCB3L28gZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUgcHJvY2Vzc29yIG1vZHVsZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfYmluZC5jIGIvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKaW5kZXggNTVmNTdhNi4uMDI4OTY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9iaW5kLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUENJX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgicGNpX2JpbmQiKQorQUNQSV9NT0RVTEVfTkFNRSgicGNpX2JpbmQiKTsKIAogc3RydWN0IGFjcGlfcGNpX2RhdGEgewogCXN0cnVjdCBhY3BpX3BjaV9pZCBpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCmluZGV4IGZlN2QwMDcuLmRkMzE4NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwpAQCAtMzgsNyArMzgsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9QQ0lfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJwY2lfaXJxIikKK0FDUElfTU9EVUxFX05BTUUoInBjaV9pcnEiKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX3BydF9saXN0IGFjcGlfcHJ0Owogc3RhdGljIERFRklORV9TUElOTE9DSyhhY3BpX3BydF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jIGIvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKaW5kZXggMGY2ODNjOC4uYWNjNTk0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9saW5rLmMKQEAgLTQ0LDEwICs0NCw5IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BDSV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoInBjaV9saW5rIikKK0FDUElfTU9EVUxFX05BTUUoInBjaV9saW5rIik7CiAjZGVmaW5lIEFDUElfUENJX0xJTktfQ0xBU1MJCSJwY2lfaXJxX3JvdXRpbmciCiAjZGVmaW5lIEFDUElfUENJX0xJTktfSElECQkiUE5QMEMwRiIKLSNkZWZpbmUgQUNQSV9QQ0lfTElOS19EUklWRVJfTkFNRQkiQUNQSSBQQ0kgSW50ZXJydXB0IExpbmsgRHJpdmVyIgogI2RlZmluZSBBQ1BJX1BDSV9MSU5LX0RFVklDRV9OQU1FCSJQQ0kgSW50ZXJydXB0IExpbmsiCiAjZGVmaW5lIEFDUElfUENJX0xJTktfRklMRV9JTkZPCQkiaW5mbyIKICNkZWZpbmUgQUNQSV9QQ0lfTElOS19GSUxFX1NUQVRVUwkic3RhdGUiCkBAIC01Niw3ICs1NSw3IEBACiBzdGF0aWMgaW50IGFjcGlfcGNpX2xpbmtfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9wY2lfbGlua19kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX1BDSV9MSU5LX0RSSVZFUl9OQU1FLAorCS5uYW1lID0gInBjaV9saW5rIiwKIAkuY2xhc3MgPSBBQ1BJX1BDSV9MSU5LX0NMQVNTLAogCS5pZHMgPSBBQ1BJX1BDSV9MSU5LX0hJRCwKIAkub3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwppbmRleCA0ZWNmNzAxLi5hZDQxNDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwpAQCAtMzYsMTcgKzM2LDE2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BDSV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoInBjaV9yb290IikKK0FDUElfTU9EVUxFX05BTUUoInBjaV9yb290Iik7CiAjZGVmaW5lIEFDUElfUENJX1JPT1RfQ0xBU1MJCSJwY2lfYnJpZGdlIgogI2RlZmluZSBBQ1BJX1BDSV9ST09UX0hJRAkJIlBOUDBBMDMiCi0jZGVmaW5lIEFDUElfUENJX1JPT1RfRFJJVkVSX05BTUUJIkFDUEkgUENJIFJvb3QgQnJpZGdlIERyaXZlciIKICNkZWZpbmUgQUNQSV9QQ0lfUk9PVF9ERVZJQ0VfTkFNRQkiUENJIFJvb3QgQnJpZGdlIgogc3RhdGljIGludCBhY3BpX3BjaV9yb290X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3RfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CiBzdGF0aWMgaW50IGFjcGlfcGNpX3Jvb3Rfc3RhcnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcGNpX3Jvb3RfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9QQ0lfUk9PVF9EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJwY2lfcm9vdCIsCiAJLmNsYXNzID0gQUNQSV9QQ0lfUk9PVF9DTEFTUywKIAkuaWRzID0gQUNQSV9QQ0lfUk9PVF9ISUQsCiAJLm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wb3dlci5jIGIvZHJpdmVycy9hY3BpL3Bvd2VyLmMKaW5kZXggMGJhN2RmYi4uOTJmODBiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Bvd2VyLmMKKysrIGIvZHJpdmVycy9hY3BpL3Bvd2VyLmMKQEAgLTQ1LDEwICs0NSw5IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BPV0VSX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9wb3dlciIpCitBQ1BJX01PRFVMRV9OQU1FKCJwb3dlciIpOwogI2RlZmluZSBBQ1BJX1BPV0VSX0NPTVBPTkVOVAkJMHgwMDgwMDAwMAogI2RlZmluZSBBQ1BJX1BPV0VSX0NMQVNTCQkicG93ZXJfcmVzb3VyY2UiCi0jZGVmaW5lIEFDUElfUE9XRVJfRFJJVkVSX05BTUUJCSJBQ1BJIFBvd2VyIFJlc291cmNlIERyaXZlciIKICNkZWZpbmUgQUNQSV9QT1dFUl9ERVZJQ0VfTkFNRQkJIlBvd2VyIFJlc291cmNlIgogI2RlZmluZSBBQ1BJX1BPV0VSX0ZJTEVfSU5GTwkJImluZm8iCiAjZGVmaW5lIEFDUElfUE9XRVJfRklMRV9TVEFUVVMJCSJzdGF0ZSIKQEAgLTYwLDcgKzU5LDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9wb3dlcl9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3Bvd2VyX2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfUE9XRVJfRFJJVkVSX05BTUUsCisJLm5hbWUgPSAicG93ZXIiLAogCS5jbGFzcyA9IEFDUElfUE9XRVJfQ0xBU1MsCiAJLmlkcyA9IEFDUElfUE9XRVJfSElELAogCS5vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCmluZGV4IDAwNzliYzUuLjk5ZDE1MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jCkBAIC02MCw3ICs2MCw2IEBACiAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UCTB4MDEwMDAwMDAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ0xBU1MJCSJwcm9jZXNzb3IiCi0jZGVmaW5lIEFDUElfUFJPQ0VTU09SX0RSSVZFUl9OQU1FCSJBQ1BJIFByb2Nlc3NvciBEcml2ZXIiCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0RFVklDRV9OQU1FCSJQcm9jZXNzb3IiCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0ZJTEVfSU5GTwkiaW5mbyIKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfRklMRV9USFJPVFRMSU5HCSJ0aHJvdHRsaW5nIgpAQCAtNzQsMTAgKzczLDEwIEBACiAjZGVmaW5lIEFDUElfU1RBX1BSRVNFTlQgMHgwMDAwMDAwMQogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9wcm9jZXNzb3IiKQorQUNQSV9NT0RVTEVfTkFNRSgicHJvY2Vzc29yX2NvcmUiKTsKIAotICAgIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKLU1PRFVMRV9ERVNDUklQVElPTihBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRSk7CitNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDUEkgUHJvY2Vzc29yIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CkBAIC04OSw3ICs4OCw3IEBACiBzdGF0aWMgaW50IGFjcGlfcHJvY2Vzc29yX2hhbmRsZV9lamVjdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3Byb2Nlc3Nvcl9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJwcm9jZXNzb3IiLAogCS5jbGFzcyA9IEFDUElfUFJPQ0VTU09SX0NMQVNTLAogCS5pZHMgPSBBQ1BJX1BST0NFU1NPUl9ISUQsCiAJLm9wcyA9IHsKQEAgLTQwNCw3ICs0MDMsNyBAQAogCWlmIChsc2FwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpIHsKIAkJLyogRmlyc3QgY2hlY2sgYWdhaW5zdCBpZCAqLwogCQlpZiAobHNhcGljLT5wcm9jZXNzb3JfaWQgPT0gYWNwaV9pZCkgewotCQkJKmFwaWNfaWQgPSBsc2FwaWMtPmlkOworCQkJKmFwaWNfaWQgPSAobHNhcGljLT5pZCA8PCA4KSB8IGxzYXBpYy0+ZWlkOwogCQkJcmV0dXJuIDE7CiAJCS8qIENoZWNrIGFnYWluc3Qgb3B0aW9uYWwgdWlkICovCiAJCX0gZWxzZSBpZiAoZW50cnktPmxlbmd0aCA+PSAxNiAmJgpAQCAtMTAwNSw3ICsxMDA0LDcgQEAKICNpZmRlZiBDT05GSUdfU01QCiAJaWYgKEFDUElfRkFJTFVSRShhY3BpX2dldF90YWJsZShBQ1BJX1NJR19NQURULCAwLAogCQkJCShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopJm1hZHQpKSkKLQkJbWFkdCA9IDA7CisJCW1hZHQgPSBOVUxMOwogI2VuZGlmCiAKIAlhY3BpX3Byb2Nlc3Nvcl9kaXIgPSBwcm9jX21rZGlyKEFDUElfUFJPQ0VTU09SX0NMQVNTLCBhY3BpX3Jvb3RfZGlyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKaW5kZXggNmM2NzUxYi4uNjA3NzMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKQEAgLTM5LDYgKzM5LDI1IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBuZWVkX3Jlc2NoZWQoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2xhdGVuY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisKKy8qCisgKiBJbmNsdWRlIHRoZSBhcGljIGRlZmluaXRpb25zIGZvciB4ODYgdG8gaGF2ZSB0aGUgQVBJQyB0aW1lciByZWxhdGVkIGRlZmluZXMKKyAqIGF2YWlsYWJsZSBhbHNvIGZvciBVUCAob24gU01QIGl0IGdldHMgbWFnaWNhbGx5IGluY2x1ZGVkIHZpYSBsaW51eC9zbXAuaCkuCisgKiBhc20vYWNwaS5oIGlzIG5vdCBhbiBvcHRpb24sIGFzIGl0IHdvdWxkIHJlcXVpcmUgbW9yZSBpbmNsdWRlIG1hZ2ljLiBBbHNvCisgKiBjcmVhdGluZyBhbiBlbXB0eSBhc20taWE2NC9hcGljLmggd291bGQganVzdCB0cmFkZSBwZXN0IHZzLiBjaG9sZXJhLgorICovCisjaWZkZWYgQ09ORklHX1g4NgorI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjZW5kaWYKKworLyoKKyAqIEluY2x1ZGUgdGhlIGFwaWMgZGVmaW5pdGlvbnMgZm9yIHg4NiB0byBoYXZlIHRoZSBBUElDIHRpbWVyIHJlbGF0ZWQgZGVmaW5lcworICogYXZhaWxhYmxlIGFsc28gZm9yIFVQIChvbiBTTVAgaXQgZ2V0cyBtYWdpY2FsbHkgaW5jbHVkZWQgdmlhIGxpbnV4L3NtcC5oKS4KKyAqLworI2lmZGVmIENPTkZJR19YODYKKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDgsOSArNjcsOCBAQAogCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVCAgICAgICAgMHgwMTAwMDAwMAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9DTEFTUyAgICAgICAgICAgICJwcm9jZXNzb3IiCi0jZGVmaW5lIEFDUElfUFJPQ0VTU09SX0RSSVZFUl9OQU1FICAgICAgIkFDUEkgUHJvY2Vzc29yIERyaXZlciIKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICAgICAgQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3Byb2Nlc3NvciIpCitBQ1BJX01PRFVMRV9OQU1FKCJwcm9jZXNzb3JfaWRsZSIpOwogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9GSUxFX1BPV0VSCSJwb3dlciIKICNkZWZpbmUgVVNfVE9fUE1fVElNRVJfVElDS1ModCkJCSgodCAqIChQTV9USU1FUl9GUkVRVUVOQ1kvMTAwMCkpIC8gMTAwMCkKICNkZWZpbmUgQzJfT1ZFUkhFQUQJCQk0CS8qIDF1cyAoMy41NzkgdGlja3MgcGVyIHVzKSAqLwpAQCAtMjM4LDYgKzI1Niw4MSBAQAogCX0KIH0KIAorI2lmZGVmIEFSQ0hfQVBJQ1RJTUVSX1NUT1BTX09OX0MzCisKKy8qCisgKiBTb21lIEJJT1MgaW1wbGVtZW50YXRpb25zIHN3aXRjaCB0byBDMyBpbiB0aGUgcHVibGlzaGVkIEMyIHN0YXRlLgorICogVGhpcyBzZWVtcyB0byBiZSBhIGNvbW1vbiBwcm9ibGVtIG9uIEFNRCBib3hlbiwgYnV0IG90aGVyIHZlbmRvcnMKKyAqIGFyZSBhZmZlY3RlZCB0b28uIFdlIHBpY2sgdGhlIG1vc3QgY29uc2VydmF0aXZlIGFwcHJvYWNoOiB3ZSBhc3N1bWUKKyAqIHRoYXQgdGhlIGxvY2FsIEFQSUMgc3RvcHMgaW4gYm90aCBDMiBhbmQgQzMuCisgKi8KK3N0YXRpYyB2b2lkIGFjcGlfdGltZXJfY2hlY2tfc3RhdGUoaW50IHN0YXRlLCBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJCSAgIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gpCit7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3Bvd2VyICpwd3IgPSAmcHItPnBvd2VyOworCisJLyoKKwkgKiBDaGVjaywgaWYgb25lIG9mIHRoZSBwcmV2aW91cyBzdGF0ZXMgYWxyZWFkeSBtYXJrZWQgdGhlIGxhcGljCisJICogdW5zdGFibGUKKwkgKi8KKwlpZiAocHdyLT50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUgPCBzdGF0ZSkKKwkJcmV0dXJuOworCisJaWYgKGN4LT50eXBlID49IEFDUElfU1RBVEVfQzIpCisJCXByLT5wb3dlci50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUgPSBzdGF0ZTsKK30KKworc3RhdGljIHZvaWQgYWNwaV9wcm9wYWdhdGVfdGltZXJfYnJvYWRjYXN0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCit7CisjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMKKwl1bnNpZ25lZCBsb25nIHJlYXNvbjsKKworCXJlYXNvbiA9IHByLT5wb3dlci50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUgPCBJTlRfTUFYID8KKwkJQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT04gOiBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PRkY7CisKKwljbG9ja2V2ZW50c19ub3RpZnkocmVhc29uLCAmcHItPmlkKTsKKyNlbHNlCisJY3B1bWFza190IG1hc2sgPSBjcHVtYXNrX29mX2NwdShwci0+aWQpOworCisJaWYgKHByLT5wb3dlci50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUgPCBJTlRfTUFYKQorCQlvbl9lYWNoX2NwdShzd2l0Y2hfQVBJQ190aW1lcl90b19pcGksICZtYXNrLCAxLCAxKTsKKwllbHNlCisJCW9uX2VhY2hfY3B1KHN3aXRjaF9pcGlfdG9fQVBJQ190aW1lciwgJm1hc2ssIDEsIDEpOworI2VuZGlmCit9CisKKy8qIFBvd2VyKEMpIFN0YXRlIHRpbWVyIGJyb2FkY2FzdCBjb250cm9sICovCitzdGF0aWMgdm9pZCBhY3BpX3N0YXRlX3RpbWVyX2Jyb2FkY2FzdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4LAorCQkJCSAgICAgICBpbnQgYnJvYWRjYXN0KQoreworI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTCisKKwlpbnQgc3RhdGUgPSBjeCAtIHByLT5wb3dlci5zdGF0ZXM7CisKKwlpZiAoc3RhdGUgPj0gcHItPnBvd2VyLnRpbWVyX2Jyb2FkY2FzdF9vbl9zdGF0ZSkgeworCQl1bnNpZ25lZCBsb25nIHJlYXNvbjsKKworCQlyZWFzb24gPSBicm9hZGNhc3QgPyAgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIgOgorCQkJQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRVhJVDsKKwkJY2xvY2tldmVudHNfbm90aWZ5KHJlYXNvbiwgJnByLT5pZCk7CisJfQorI2VuZGlmCit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIGFjcGlfdGltZXJfY2hlY2tfc3RhdGUoaW50IHN0YXRlLCBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJCSAgIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3N0YXRlKSB7IH0KK3N0YXRpYyB2b2lkIGFjcGlfcHJvcGFnYXRlX3RpbWVyX2Jyb2FkY2FzdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKSB7IH0KK3N0YXRpYyB2b2lkIGFjcGlfc3RhdGVfdGltZXJfYnJvYWRjYXN0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCisJCQkJICAgICAgIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3gsCisJCQkJICAgICAgIGludCBicm9hZGNhc3QpCit7Cit9CisKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBhY3BpX3Byb2Nlc3Nvcl9pZGxlKHZvaWQpCiB7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciA9IE5VTEw7CkBAIC0zODIsNiArNDc1LDcgQEAKIAkJLyogR2V0IHN0YXJ0IHRpbWUgKHRpY2tzKSAqLwogCQl0MSA9IGlubChhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jay5hZGRyZXNzKTsKIAkJLyogSW52b2tlIEMyICovCisJCWFjcGlfc3RhdGVfdGltZXJfYnJvYWRjYXN0KHByLCBjeCwgMSk7CiAJCWFjcGlfY3N0YXRlX2VudGVyKGN4KTsKIAkJLyogR2V0IGVuZCB0aW1lICh0aWNrcykgKi8KIAkJdDIgPSBpbmwoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suYWRkcmVzcyk7CkBAIC0zOTYsNiArNDkwLDcgQEAKIAkJLyogQ29tcHV0ZSB0aW1lICh0aWNrcykgdGhhdCB3ZSB3ZXJlIGFjdHVhbGx5IGFzbGVlcCAqLwogCQlzbGVlcF90aWNrcyA9CiAJCSAgICB0aWNrc19lbGFwc2VkKHQxLCB0MikgLSBjeC0+bGF0ZW5jeV90aWNrcyAtIEMyX09WRVJIRUFEOworCQlhY3BpX3N0YXRlX3RpbWVyX2Jyb2FkY2FzdChwciwgY3gsIDApOwogCQlicmVhazsKIAogCWNhc2UgQUNQSV9TVEFURV9DMzoKQEAgLTQxNyw2ICs1MTIsNyBAQAogCQkvKiBHZXQgc3RhcnQgdGltZSAodGlja3MpICovCiAJCXQxID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOwogCQkvKiBJbnZva2UgQzMgKi8KKwkJYWNwaV9zdGF0ZV90aW1lcl9icm9hZGNhc3QocHIsIGN4LCAxKTsKIAkJYWNwaV9jc3RhdGVfZW50ZXIoY3gpOwogCQkvKiBHZXQgZW5kIHRpbWUgKHRpY2tzKSAqLwogCQl0MiA9IGlubChhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jay5hZGRyZXNzKTsKQEAgLTQzNiw2ICs1MzIsNyBAQAogCQkvKiBDb21wdXRlIHRpbWUgKHRpY2tzKSB0aGF0IHdlIHdlcmUgYWN0dWFsbHkgYXNsZWVwICovCiAJCXNsZWVwX3RpY2tzID0KIAkJICAgIHRpY2tzX2VsYXBzZWQodDEsIHQyKSAtIGN4LT5sYXRlbmN5X3RpY2tzIC0gQzNfT1ZFUkhFQUQ7CisJCWFjcGlfc3RhdGVfdGltZXJfYnJvYWRjYXN0KHByLCBjeCwgMCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTkwNCwxMSArMTAwMSw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgaW50IHdvcmtpbmcgPSAwOwogCi0jaWZkZWYgQVJDSF9BUElDVElNRVJfU1RPUFNfT05fQzMKLQlpbnQgdGltZXJfYnJvYWRjYXN0ID0gMDsKLQljcHVtYXNrX3QgbWFzayA9IGNwdW1hc2tfb2ZfY3B1KHByLT5pZCk7Ci0Jb25fZWFjaF9jcHUoc3dpdGNoX2lwaV90b19BUElDX3RpbWVyLCAmbWFzaywgMSwgMSk7Ci0jZW5kaWYKKwlwci0+cG93ZXIudGltZXJfYnJvYWRjYXN0X29uX3N0YXRlID0gSU5UX01BWDsKIAogCWZvciAoaSA9IDE7IGkgPCBBQ1BJX1BST0NFU1NPUl9NQVhfUE9XRVI7IGkrKykgewogCQlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4ID0gJnByLT5wb3dlci5zdGF0ZXNbaV07CkBAIC05MjAsMjEgKzEwMTMsMTQgQEAKIAogCQljYXNlIEFDUElfU1RBVEVfQzI6CiAJCQlhY3BpX3Byb2Nlc3Nvcl9wb3dlcl92ZXJpZnlfYzIoY3gpOwotI2lmZGVmIEFSQ0hfQVBJQ1RJTUVSX1NUT1BTX09OX0MzCi0JCQkvKiBTb21lIEFNRCBzeXN0ZW1zIGZha2UgQzMgYXMgQzIsIGJ1dCBzdGlsbAotCQkJICAgaGF2ZSB0aW1lciB0cm91YmxlcyAqLwotCQkJaWYgKGN4LT52YWxpZCAmJiAKLQkJCQlib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpCi0JCQkJdGltZXJfYnJvYWRjYXN0Kys7Ci0jZW5kaWYKKwkJCWlmIChjeC0+dmFsaWQpCisJCQkJYWNwaV90aW1lcl9jaGVja19zdGF0ZShpLCBwciwgY3gpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1NUQVRFX0MzOgogCQkJYWNwaV9wcm9jZXNzb3JfcG93ZXJfdmVyaWZ5X2MzKHByLCBjeCk7Ci0jaWZkZWYgQVJDSF9BUElDVElNRVJfU1RPUFNfT05fQzMKIAkJCWlmIChjeC0+dmFsaWQpCi0JCQkJdGltZXJfYnJvYWRjYXN0Kys7Ci0jZW5kaWYKKwkJCQlhY3BpX3RpbWVyX2NoZWNrX3N0YXRlKGksIHByLCBjeCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC05NDIsMTAgKzEwMjgsNyBAQAogCQkJd29ya2luZysrOwogCX0KIAotI2lmZGVmIEFSQ0hfQVBJQ1RJTUVSX1NUT1BTX09OX0MzCi0JaWYgKHRpbWVyX2Jyb2FkY2FzdCkKLQkJb25fZWFjaF9jcHUoc3dpdGNoX0FQSUNfdGltZXJfdG9faXBpLCAmbWFzaywgMSwgMSk7Ci0jZW5kaWYKKwlhY3BpX3Byb3BhZ2F0ZV90aW1lcl9icm9hZGNhc3QocHIpOwogCiAJcmV0dXJuICh3b3JraW5nKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKaW5kZXggMDU4ZjEzYy4uMmYyZTc5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKQEAgLTQ0LDEwICs0NCw5IEBACiAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UCTB4MDEwMDAwMDAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ0xBU1MJCSJwcm9jZXNzb3IiCi0jZGVmaW5lIEFDUElfUFJPQ0VTU09SX0RSSVZFUl9OQU1FCSJBQ1BJIFByb2Nlc3NvciBEcml2ZXIiCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0ZJTEVfUEVSRk9STUFOQ0UJInBlcmZvcm1hbmNlIgogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfcHJvY2Vzc29yIikKK0FDUElfTU9EVUxFX05BTUUoInByb2Nlc3Nvcl9wZXJmbGliIik7CiAKIHN0YXRpYyBERUZJTkVfTVVURVgocGVyZm9ybWFuY2VfbXV0ZXgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCmluZGV4IDQwZmVjZDYuLjA2ZTZmM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jCkBAIC00MSw5ICs0MSw4IEBACiAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UICAgICAgICAweDAxMDAwMDAwCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NMQVNTICAgICAgICAgICAgInByb2Nlc3NvciIKLSNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfRFJJVkVSX05BTUUgICAgICAiQUNQSSBQcm9jZXNzb3IgRHJpdmVyIgogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgICAgICBBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfcHJvY2Vzc29yIikKK0FDUElfTU9EVUxFX05BTUUoInByb2Nlc3Nvcl90aGVybWFsIik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW1pdCBJbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMKaW5kZXggODlkZmYzNi4uYjMzNDg2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aHJvdHRsaW5nLmMKQEAgLTQxLDkgKzQxLDggQEAKIAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQgICAgICAgIDB4MDEwMDAwMDAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ0xBU1MgICAgICAgICAgICAicHJvY2Vzc29yIgotI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRSAgICAgICJBQ1BJIFByb2Nlc3NvciBEcml2ZXIiCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgICAgIEFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9wcm9jZXNzb3IiKQorQUNQSV9NT0RVTEVfTkFNRSgicHJvY2Vzc29yX3Rocm90dGxpbmciKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm90dGxpbmcgQ29udHJvbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Nicy5jIGIvZHJpdmVycy9hY3BpL3Nicy5jCmluZGV4IGY1OGZjNzQuLjFlYWIyMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zYnMuYworKysgYi9kcml2ZXJzL2FjcGkvc2JzLmMKQEAgLTU5LDcgKzU5LDYgQEAKICNkZWZpbmUgQUNQSV9BQ19DTEFTUwkJCSJhY19hZGFwdGVyIgogI2RlZmluZSBBQ1BJX0JBVFRFUllfQ0xBU1MJCSJiYXR0ZXJ5IgogI2RlZmluZSBBQ1BJX1NCU19ISUQJCQkiQUNQSTAwMDIiCi0jZGVmaW5lIEFDUElfU0JTX0RSSVZFUl9OQU1FCQkiQUNQSSBTbWFydCBCYXR0ZXJ5IFN5c3RlbSBEcml2ZXIiCiAjZGVmaW5lIEFDUElfU0JTX0RFVklDRV9OQU1FCQkiU21hcnQgQmF0dGVyeSBTeXN0ZW0iCiAjZGVmaW5lIEFDUElfU0JTX0ZJTEVfSU5GTwkJImluZm8iCiAjZGVmaW5lIEFDUElfU0JTX0ZJTEVfU1RBVEUJCSJzdGF0ZSIKQEAgLTc4LDcgKzc3LDcgQEAKICNkZWZpbmUJTUFYX1NCU19CQVQJCQk0CiAjZGVmaW5lCU1BWF9TTUJVU19FUlIJCQkxCiAKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfc2JzIik7CitBQ1BJX01PRFVMRV9OQU1FKCJzYnMiKTsKIAogTU9EVUxFX0FVVEhPUigiUmljaCBUb3duc2VuZCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTbWFydCBCYXR0ZXJ5IFN5c3RlbSBBQ1BJIGludGVyZmFjZSBkcml2ZXIiKTsKQEAgLTExMCw3ICsxMDksNyBAQAogc3RhdGljIHZvaWQgYWNwaV9zYnNfdXBkYXRlX3F1ZXVlKHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfc2JzX2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfU0JTX0RSSVZFUl9OQU1FLAorCS5uYW1lID0gInNicyIsCiAJLmNsYXNzID0gQUNQSV9TQlNfQ0xBU1MsCiAJLmlkcyA9IEFDUElfU0JTX0hJRCwKIAkub3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NjYW4uYyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKaW5kZXggNjRmMjZkYi4uYmIwZTBkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NjYW4uYworKysgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCkBAIC0xMSwxMyArMTEsMTIgQEAKICNpbmNsdWRlIDxhY3BpL2FjaW50ZXJwLmg+CS8qIGZvciBhY3BpX2V4X2Vpc2FfaWRfdG9fc3RyaW5nKCkgKi8KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0JVU19DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoInNjYW4iKQorQUNQSV9NT0RVTEVfTkFNRSgic2NhbiIpOwogI2RlZmluZSBTVFJVQ1RfVE9fSU5UKHMpCSgqKChpbnQqKSZzKSkKIGV4dGVybiBzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfcm9vdDsKIAogI2RlZmluZSBBQ1BJX0JVU19DTEFTUwkJCSJzeXN0ZW1fYnVzIgogI2RlZmluZSBBQ1BJX0JVU19ISUQJCQkiQUNQSV9CVVMiCi0jZGVmaW5lIEFDUElfQlVTX0RSSVZFUl9OQU1FCQkiQUNQSSBCdXMgRHJpdmVyIgogI2RlZmluZSBBQ1BJX0JVU19ERVZJQ0VfTkFNRQkJIlN5c3RlbSBCdXMiCiAKIHN0YXRpYyBMSVNUX0hFQUQoYWNwaV9kZXZpY2VfbGlzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc3lzdGVtLmMgYi9kcml2ZXJzL2FjcGkvc3lzdGVtLmMKaW5kZXggNzE0N2IwYi4uODNhOGQzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3N5c3RlbS5jCisrKyBiL2RyaXZlcnMvYWNwaS9zeXN0ZW0uYwpAQCAtMzEsMTQgKzMxLDEzIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfc3lzdGVtIikKK0FDUElfTU9EVUxFX05BTUUoInN5c3RlbSIpOwogI2lmZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKICN1bmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCiAjZW5kaWYKICNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWCAiYWNwaS4iCiAKICNkZWZpbmUgQUNQSV9TWVNURU1fQ0xBU1MJCSJzeXN0ZW0iCi0jZGVmaW5lIEFDUElfU1lTVEVNX0RSSVZFUl9OQU1FCQkiQUNQSSBTeXN0ZW0gRHJpdmVyIgogI2RlZmluZSBBQ1BJX1NZU1RFTV9ERVZJQ0VfTkFNRQkJIlN5c3RlbSIKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9JTkZPCQkiaW5mbyIKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9FVkVOVAkJImV2ZW50IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy5jCmluZGV4IDQ1YmQxNzMuLjg0OWUyYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzLmMKQEAgLTE2OSw0MCArMTY5LDQwIEBACiAKIAogaW50IF9faW5pdAotYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseShjaGFyICppZCwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBtYWR0X3NpemUsCithY3BpX3RhYmxlX3BhcnNlX2VudHJpZXMoY2hhciAqaWQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgdGFibGVfc2l6ZSwKIAkJCSAgICAgaW50IGVudHJ5X2lkLAotCQkJICAgICBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLAorCQkJICAgICBhY3BpX3RhYmxlX2VudHJ5X2hhbmRsZXIgaGFuZGxlciwKIAkJCSAgICAgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQogewotCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqbWFkdCA9IE5VTEw7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9oZWFkZXIgPSBOVUxMOwogCXN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnk7CiAJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQl1bnNpZ25lZCBsb25nIG1hZHRfZW5kOworCXVuc2lnbmVkIGxvbmcgdGFibGVfZW5kOwogCiAJaWYgKCFoYW5kbGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIExvY2F0ZSB0aGUgTUFEVCAoaWYgZXhpc3RzKS4gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lLiAqLwotCWFjcGlfZ2V0X3RhYmxlKGlkLCAwLCAmbWFkdCk7CisJLyogTG9jYXRlIHRoZSB0YWJsZSAoaWYgZXhpc3RzKS4gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lLiAqLworCWFjcGlfZ2V0X3RhYmxlKGlkLCAwLCAmdGFibGVfaGVhZGVyKTsKIAotCWlmICghbWFkdCkgeworCWlmICghdGFibGVfaGVhZGVyKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgUFJFRklYICIlNC40cyBub3QgcHJlc2VudFxuIiwgaWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQltYWR0X2VuZCA9ICh1bnNpZ25lZCBsb25nKW1hZHQgKyBtYWR0LT5sZW5ndGg7CisJdGFibGVfZW5kID0gKHVuc2lnbmVkIGxvbmcpdGFibGVfaGVhZGVyICsgdGFibGVfaGVhZGVyLT5sZW5ndGg7CiAKIAkvKiBQYXJzZSBhbGwgZW50cmllcyBsb29raW5nIGZvciBhIG1hdGNoLiAqLwogCiAJZW50cnkgPSAoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICopCi0JICAgICgodW5zaWduZWQgbG9uZyltYWR0ICsgbWFkdF9zaXplKTsKKwkgICAgKCh1bnNpZ25lZCBsb25nKXRhYmxlX2hlYWRlciArIHRhYmxlX3NpemUpOwogCiAJd2hpbGUgKCgodW5zaWduZWQgbG9uZyllbnRyeSkgKyBzaXplb2Yoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyKSA8Ci0JICAgICAgIG1hZHRfZW5kKSB7CisJICAgICAgIHRhYmxlX2VuZCkgewogCQlpZiAoZW50cnktPnR5cGUgPT0gZW50cnlfaWQKIAkJICAgICYmICghbWF4X2VudHJpZXMgfHwgY291bnQrKyA8IG1heF9lbnRyaWVzKSkKLQkJCWlmIChoYW5kbGVyKGVudHJ5LCBtYWR0X2VuZCkpCisJCQlpZiAoaGFuZGxlcihlbnRyeSwgdGFibGVfZW5kKSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQllbnRyeSA9IChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKikKQEAgLTIxOCwxMyArMjE4LDIyIEBACiAKIGludCBfX2luaXQKIGFjcGlfdGFibGVfcGFyc2VfbWFkdChlbnVtIGFjcGlfbWFkdF90eXBlIGlkLAotCQkgICAgICBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpCisJCSAgICAgIGFjcGlfdGFibGVfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpCiB7Ci0JcmV0dXJuIGFjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkoQUNQSV9TSUdfTUFEVCwKKwlyZXR1cm4gYWNwaV90YWJsZV9wYXJzZV9lbnRyaWVzKEFDUElfU0lHX01BRFQsCiAJCQkJCSAgICBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfbWFkdCksIGlkLAogCQkJCQkgICAgaGFuZGxlciwgbWF4X2VudHJpZXMpOwogfQogCisvKioKKyAqIGFjcGlfdGFibGVfcGFyc2UgLSBmaW5kIHRhYmxlIHdpdGggQGlkLCBydW4gQGhhbmRsZXIgb24gaXQKKyAqCisgKiBAaWQ6IHRhYmxlIGlkIHRvIGZpbmQKKyAqIEBoYW5kbGVyOiBoYW5kbGVyIHRvIHJ1bgorICoKKyAqIFNjYW4gdGhlIEFDUEkgU3lzdGVtIERlc2NyaXB0b3IgVGFibGUgKFNURCkgZm9yIGEgdGFibGUgbWF0Y2hpbmcgQGlkLAorICogcnVuIEBoYW5kbGVyIG9uIGl0LiAgUmV0dXJuIDAgaWYgdGFibGUgZm91bmQsIHJldHVybiBvbiBpZiBub3QuCisgKi8KIGludCBfX2luaXQgYWNwaV90YWJsZV9wYXJzZShjaGFyICppZCwgYWNwaV90YWJsZV9oYW5kbGVyIGhhbmRsZXIpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSA9IE5VTEw7CkBAIC0yMzQsOSArMjQzLDkgQEAKIAlhY3BpX2dldF90YWJsZShpZCwgMCwgJnRhYmxlKTsKIAlpZiAodGFibGUpIHsKIAkJaGFuZGxlcih0YWJsZSk7Ci0JCXJldHVybiAxOwotCX0gZWxzZQogCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIDE7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCmluZGV4IDgwNzk3OGQuLjQxN2VmNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jCkBAIC0zMzgsOSArMzM4LDkgQEAKIAlpbnQgaTsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfdW5sb2FkX3RhYmxlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfdW5sb2FkX3RhYmxlX2lkKTsKIAotCS8qIEZpbmQgdGFibGUgZnJvbSB0aGUgcmVxdWVzdGVkIHR5cGUgbGlzdCAqLworCS8qIEZpbmQgdGFibGUgaW4gdGhlIGdsb2JhbCB0YWJsZSBsaXN0ICovCiAJZm9yIChpID0gMDsgaSA8IGFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC5jb3VudDsgKytpKSB7CiAJCWlmIChpZCAhPSBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLm93bmVyX2lkKSB7CiAJCQljb250aW51ZTsKQEAgLTM1Miw4ICszNTIsOSBAQAogCQkqIHNpbXBseSBhIHBvc2l0aW9uIHdpdGhpbiB0aGUgaGllcmFyY2h5CiAJCSovCiAJCWFjcGlfdGJfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcihpKTsKLQkJYWNwaV90Yl9yZWxlYXNlX293bmVyX2lkKGkpOworCQlzdGF0dXMgPSBhY3BpX3RiX3JlbGVhc2Vfb3duZXJfaWQoaSk7CiAJCWFjcGlfdGJfc2V0X3RhYmxlX2xvYWRlZF9mbGFnKGksIEZBTFNFKTsKKwkJYnJlYWs7CiAJfQogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpAQCAtNDA4LDcgKzQwOSw3IEBACiAJCX0KIAogCQlpZiAoIWFjcGlfZ2JsX3Blcm1hbmVudF9tbWFwKSB7Ci0JCQlhY3BpX2dibF9yb290X3RhYmxlX2xpc3QudGFibGVzW2ldLnBvaW50ZXIgPSAwOworCQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyID0gTlVMTDsKIAkJfQogCiAJCXJldHVybiAoc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMgYi9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCmluZGV4IDk4NmFmZDQuLjE1MDIyYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwpAQCAtNDcsNyArNDcsNiBAQAogCiAjZGVmaW5lIEFDUElfVEhFUk1BTF9DT01QT05FTlQJCTB4MDQwMDAwMDAKICNkZWZpbmUgQUNQSV9USEVSTUFMX0NMQVNTCQkidGhlcm1hbF96b25lIgotI2RlZmluZSBBQ1BJX1RIRVJNQUxfRFJJVkVSX05BTUUJIkFDUEkgVGhlcm1hbCBab25lIERyaXZlciIKICNkZWZpbmUgQUNQSV9USEVSTUFMX0RFVklDRV9OQU1FCSJUaGVybWFsIFpvbmUiCiAjZGVmaW5lIEFDUElfVEhFUk1BTF9GSUxFX1NUQVRFCQkic3RhdGUiCiAjZGVmaW5lIEFDUElfVEhFUk1BTF9GSUxFX1RFTVBFUkFUVVJFCSJ0ZW1wZXJhdHVyZSIKQEAgLTcxLDEwICs3MCwxMCBAQAogI2RlZmluZSBDRUxTSVVTX1RPX0tFTFZJTih0KQkoKHQrMjczKSoxMCkKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1RIRVJNQUxfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3RoZXJtYWwiKQorQUNQSV9NT0RVTEVfTkFNRSgidGhlcm1hbCIpOwogCiBNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9USEVSTUFMX0RSSVZFUl9OQU1FKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNQSSBUaGVybWFsIFpvbmUgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBpbnQgdHpwOwpAQCAtOTksNyArOTgsNyBAQAogCQkJCQkgIHNpemVfdCwgbG9mZl90ICopOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfdGhlcm1hbF9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX1RIRVJNQUxfRFJJVkVSX05BTUUsCisJLm5hbWUgPSAidGhlcm1hbCIsCiAJLmNsYXNzID0gQUNQSV9USEVSTUFMX0NMQVNTLAogCS5pZHMgPSBBQ1BJX1RIRVJNQUxfSElELAogCS5vcHMgPSB7CkBAIC0yNzAsNyArMjY5LDcgQEAKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKIAkJCSAgIlBvbGxpbmcgZnJlcXVlbmN5IHNldCB0byAlbHUgc2Vjb25kc1xuIiwKLQkJCSAgdHotPnBvbGxpbmdfZnJlcXVlbmN5KSk7CisJCQkgIHR6LT5wb2xsaW5nX2ZyZXF1ZW5jeS8xMCkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMgYi9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMKaW5kZXggZDliNjUxZi4uZmFmOGE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS90b3NoaWJhX2FjcGkuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJdW5pb24gYWNwaV9vYmplY3QgaW5fb2Jqc1sxXTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlwYXJhbXMuY291bnQgPSBzaXplb2YoaW5fb2JqcykgLyBzaXplb2YoaW5fb2Jqc1swXSk7CisJcGFyYW1zLmNvdW50ID0gQVJSQVlfU0laRShpbl9vYmpzKTsKIAlwYXJhbXMucG9pbnRlciA9IGluX29ianM7CiAJaW5fb2Jqc1swXS50eXBlID0gQUNQSV9UWVBFX0lOVEVHRVI7CiAJaW5fb2Jqc1swXS5pbnRlZ2VyLnZhbHVlID0gdmFsOwpAQCAtNTYxLDEwICs1NjEsNiBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCkgewotCQlwcmludGsoTVlfSU5GTyAiVXNpbmcgZ2VuZXJpYyBob3RrZXkgZHJpdmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQogCS8qIHNpbXBsZSBkZXZpY2UgZGV0ZWN0aW9uOiBsb29rIGZvciBIQ0kgbWV0aG9kICovCiAJaWYgKGlzX3ZhbGlkX2FjcGlfcGF0aChNRVRIT0RfSENJXzEpKQogCQltZXRob2RfaGNpID0gTUVUSE9EX0hDSV8xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvdXRpbHMuYwppbmRleCA2OGE4MDlmLi4zNGYxNTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbHMuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CVVNfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3V0aWxzIikKK0FDUElfTU9EVUxFX05BTUUoInV0aWxzIik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IEV2YWx1YXRpb24gSGVscGVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwppbmRleCBlMGI5N2FkLi5iZjUyNWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdmlkZW8uYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwpAQCAtNDAsNyArNDAsNiBAQAogCiAjZGVmaW5lIEFDUElfVklERU9fQ09NUE9ORU5UCQkweDA4MDAwMDAwCiAjZGVmaW5lIEFDUElfVklERU9fQ0xBU1MJCSJ2aWRlbyIKLSNkZWZpbmUgQUNQSV9WSURFT19EUklWRVJfTkFNRQkJIkFDUEkgVmlkZW8gRHJpdmVyIgogI2RlZmluZSBBQ1BJX1ZJREVPX0JVU19OQU1FCQkiVmlkZW8gQnVzIgogI2RlZmluZSBBQ1BJX1ZJREVPX0RFVklDRV9OQU1FCQkiVmlkZW8gRGV2aWNlIgogI2RlZmluZSBBQ1BJX1ZJREVPX05PVElGWV9TV0lUQ0gJMHg4MApAQCAtNjUsMTcgKzY0LDE3IEBACiAjZGVmaW5lIEFDUElfVklERU9fRElTUExBWV9MQ0QJNAogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfVklERU9fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3ZpZGVvIikKK0FDUElfTU9EVUxFX05BTUUoInZpZGVvIik7CiAKLSAgICBNT0RVTEVfQVVUSE9SKCJCcnVubyBEdWNyb3QiKTsKLU1PRFVMRV9ERVNDUklQVElPTihBQ1BJX1ZJREVPX0RSSVZFUl9OQU1FKTsKK01PRFVMRV9BVVRIT1IoIkJydW5vIER1Y3JvdCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIFZpZGVvIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfdmlkZW9fYnVzID0gewotCS5uYW1lID0gQUNQSV9WSURFT19EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJ2aWRlbyIsCiAJLmNsYXNzID0gQUNQSV9WSURFT19DTEFTUywKIAkuaWRzID0gQUNQSV9WSURFT19ISUQsCiAJLm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCmluZGV4IDI1ZDhkM2YuLjJjZjgyNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwpAQCAtMTQxMCw3ICsxNDEwLDE2IEBACiAJfQogCiAJdGYucHJvdG9jb2wgPSBBVEFfUFJPVF9QSU87Ci0JdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX1BPTExJTkc7IC8qIGZvciBwb2xsaW5nIHByZXNlbmNlIGRldGVjdGlvbiAqLworCisJLyogU29tZSBkZXZpY2VzIGNob2tlIGlmIFRGIHJlZ2lzdGVycyBjb250YWluIGdhcmJhZ2UuICBNYWtlCisJICogc3VyZSB0aG9zZSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisJICovCisJdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19ERVZJQ0U7CisKKwkvKiBEZXZpY2UgcHJlc2VuY2UgZGV0ZWN0aW9uIGlzIHVucmVsaWFibGUgb24gc29tZQorCSAqIGNvbnRyb2xsZXJzLiAgQWx3YXlzIHBvbGwgSURFTlRJRlkgaWYgYXZhaWxhYmxlLgorCSAqLworCXRmLmZsYWdzIHw9IEFUQV9URkxBR19QT0xMSU5HOwogCiAJZXJyX21hc2sgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX0ZST01fREVWSUNFLAogCQkJCSAgICAgaWQsIHNpemVvZihpZFswXSkgKiBBVEFfSURfV09SRFMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKaW5kZXggNDIyM2UxMC4uOThjMWZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCkBAIC04OSw5ICs4OSwxMCBAQAogc3RhdGljIGludCBodDY1NjBhOwkJCS8qIEhUIDY1NjBBIG9uIHByaW1hcnkgMSwgc2Vjb25kYXJ5IDIsIGJvdGggMyAqLwogc3RhdGljIGludCBodDY1NjBiOwkJCS8qIEhUIDY1NjBBIG9uIHByaW1hcnkgMSwgc2Vjb25kYXJ5IDIsIGJvdGggMyAqLwogc3RhdGljIGludCBvcHRpODJjNjExYTsJCQkvKiBPcHRpODJjNjExQSBvbiBwcmltYXJ5IDEsIHNlY29uZGFyeSAyLCBib3RoIDMgKi8KLXN0YXRpYyBpbnQgb3B0aTgyYzQ2eDsJCS8qIE9wdGkgODJjNDY1TVYgcHJlc2VudCAocHJpL3NlYyBhdXRvZGV0ZWN0KSAqLworc3RhdGljIGludCBvcHRpODJjNDZ4OwkJCS8qIE9wdGkgODJjNDY1TVYgcHJlc2VudCAocHJpL3NlYyBhdXRvZGV0ZWN0KSAqLwogc3RhdGljIGludCBhdXRvc3BlZWQ7CQkJLyogQ2hpcCBwcmVzZW50IHdoaWNoIHNub29wcyBzcGVlZCBjaGFuZ2VzICovCiBzdGF0aWMgaW50IHBpb19tYXNrID0gMHgxRjsJCS8qIFBJTyByYW5nZSBmb3IgYXV0b3NwZWVkIGRldmljZXMgKi8KK3N0YXRpYyBpbnQgaW9yZHlfbWFzayA9IDB4RkZGRkZGRkY7CS8qIFVzZSBpb3JkeSBpZiBhdmFpbGFibGUgKi8KIAogLyoqCiAgKglsZWdhY3lfc2V0X21vZGUJCS0JbW9kZSBzZXR0aW5nCkBAIC0xMTMsNiArMTE0LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKIAkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2ldOwogCQlpZiAoYXRhX2Rldl9lbmFibGVkKGRldikpIHsKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiY29uZmlndXJlZCBmb3IgUElPXG4iKTsKIAkJCWRldi0+cGlvX21vZGUgPSBYRkVSX1BJT18wOwogCQkJZGV2LT54ZmVyX21vZGUgPSBYRkVSX1BJT18wOwogCQkJZGV2LT54ZmVyX3NoaWZ0ID0gQVRBX1NISUZUX1BJTzsKQEAgLTY5NSw2ICs2OTcsNyBAQAogCXZvaWQgX19pb21lbSAqaW9fYWRkciwgKmN0cmxfYWRkcjsKIAlpbnQgcGlvX21vZGVzID0gcGlvX21hc2s7CiAJdTMyIG1hc2sgPSAoMSA8PCBwb3J0KTsKKwl1MzIgaW9yZHkgPSAoaW9yZHlfbWFzayAmIG1hc2spID8gMDogQVRBX0ZMQUdfTk9fSU9SRFk7CiAJaW50IHJldDsKIAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKERSVl9OQU1FLCBucl9sZWdhY3lfaG9zdCwgTlVMTCwgMCk7CkBAIC03MTUsNiArNzE4LDcgQEAKIAlpZiAoaHQ2NTYwYSAmIG1hc2spIHsKIAkJb3BzID0gJmh0NjU2MGFfcG9ydF9vcHM7CiAJCXBpb19tb2RlcyA9IDB4MDc7CisJCWlvcmR5ID0gQVRBX0ZMQUdfTk9fSU9SRFk7CiAJfQogCWlmIChodDY1NjBiICYgbWFzaykgewogCQlvcHMgPSAmaHQ2NTYwYl9wb3J0X29wczsKQEAgLTc1MCw2ICs3NTQsNyBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiUERDMjAyMzAtQy8yMDYzMCBWTEIgQVRBIGNvbnRyb2xsZXIgZGV0ZWN0ZWQuXG4iKTsKIAkJCQlwaW9fbW9kZXMgPSAweDA3OwogCQkJb3BzID0gJnBkYzIwMjMwX3BvcnRfb3BzOworCQkJaW9yZHkgPSBBVEFfRkxBR19OT19JT1JEWTsKIAkJCXVkZWxheSgxMDApOwogCQkJaW5iKDB4MUY1KTsKIAkJfSBlbHNlIHsKQEAgLTc2Nyw2ICs3NzIsNyBAQAogCS8qIENoaXAgZG9lcyBtb2RlIHNldHRpbmcgYnkgY29tbWFuZCBzbm9vcGluZyAqLwogCWlmIChvcHMgPT0gJmxlZ2FjeV9wb3J0X29wcyAmJiAoYXV0b3NwZWVkICYgbWFzaykpCiAJCW9wcyA9ICZzaW1wbGVfcG9ydF9vcHM7CisKIAltZW1zZXQoJmFlLCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wcm9iZV9lbnQpKTsKIAlJTklUX0xJU1RfSEVBRCgmYWUubm9kZSk7CiAJYWUuZGV2ID0gJnBkZXYtPmRldjsKQEAgLTc3Niw3ICs3ODIsNyBAQAogCWFlLnBpb19tYXNrID0gcGlvX21vZGVzOwogCWFlLmlycSA9IGlycTsKIAlhZS5pcnFfZmxhZ3MgPSAwOwotCWFlLnBvcnRfZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1Q7CisJYWUucG9ydF9mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVHxpb3JkeTsKIAlhZS5wb3J0WzBdLmNtZF9hZGRyID0gaW9fYWRkcjsKIAlhZS5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0gY3RybF9hZGRyOwogCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSBjdHJsX2FkZHI7CkBAIC05NDUsNiArOTUxLDcgQEAKIG1vZHVsZV9wYXJhbShvcHRpODJjNjExYSwgaW50LCAwKTsKIG1vZHVsZV9wYXJhbShvcHRpODJjNDZ4LCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHBpb19tYXNrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlvcmR5X21hc2ssIGludCwgMCk7CiAKIG1vZHVsZV9pbml0KGxlZ2FjeV9pbml0KTsKIG1vZHVsZV9leGl0KGxlZ2FjeV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcWRpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jCmluZGV4IDFiM2I0ZWQuLjQzNjIxNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcWRpLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9xZGkuYwpAQCAtMjY0LDE2ICsyNjQsMTggQEAKIAlpZiAodHlwZSA9PSA2NTgwKSB7CiAJCWFlLnBvcnRfb3BzID0gJnFkaTY1ODBfcG9ydF9vcHM7CiAJCWFlLnBpb19tYXNrID0gMHgxRjsKKwkJYWUucG9ydF9mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNUOwogCX0gZWxzZSB7CiAJCWFlLnBvcnRfb3BzID0gJnFkaTY1MDBfcG9ydF9vcHM7CiAJCWFlLnBpb19tYXNrID0gMHgwNzsJLyogQWN0dWFsbHkgUElPMyAhSU9SRFkgaXMgcG9zc2libGUgKi8KKwkJYWUucG9ydF9mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNUIHwKKwkJCQlBVEFfRkxBR19OT19JT1JEWTsKIAl9CiAKIAlhZS5zaHQgPSAmcWRpX3NodDsKIAlhZS5uX3BvcnRzID0gMTsKIAlhZS5pcnEgPSBpcnE7CiAJYWUuaXJxX2ZsYWdzID0gMDsKLQlhZS5wb3J0X2ZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1Q7CiAJYWUucG9ydFswXS5jbWRfYWRkciA9IGlvX2FkZHI7CiAJYWUucG9ydFswXS5hbHRzdGF0dXNfYWRkciA9IGN0bF9hZGRyOwogCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSBjdGxfYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYwppbmRleCBmMmZhMTU4Li45NmU4OTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCkBAIC0xODcsNyArMTg3LDkgQEAKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwogCisJdWRlbGF5KDEwMCk7CiAJc2w4MmMxMDVfcmVzZXRfZW5naW5lKGFwKTsKKwl1ZGVsYXkoMTAwKTsKIAogCS8qIFNldCB0aGUgY2xvY2tzIGZvciBETUEgKi8KIAlzbDgyYzEwNV9jb25maWd1cmVfZG1hbW9kZShhcCwgcWMtPmRldik7CkBAIC0yMTYsNiArMjE4LDcgQEAKIAogCWF0YV9ibWRtYV9zdG9wKHFjKTsKIAlzbDgyYzEwNV9yZXNldF9lbmdpbmUoYXApOworCXVkZWxheSgxMDApOwogCiAJLyogVGhpcyB3aWxsIHJlZG8gdGhlIGluaXRpYWwgc2V0dXAgb2YgdGhlIERNQSBkZXZpY2UgdG8gbWF0Y2hpbmcKIAkgICBQSU8gdGltaW5ncyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9udi5jIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCmluZGV4IDA5NWVmMWIuLmFiOTJmMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX252LmMKQEAgLTgyNyw3ICs4MjcsOCBAQAogCQkJLyogZnJlZXplIGlmIGhvdHBsdWdnZWQgb3IgY29udHJvbGxlciBlcnJvciAqLwogCQkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChOVl9BRE1BX1NUQVRfSE9UUExVRyB8CiAJCQkJCSAgICAgICBOVl9BRE1BX1NUQVRfSE9UVU5QTFVHIHwKLQkJCQkJICAgICAgIE5WX0FETUFfU1RBVF9USU1FT1VUKSkpIHsKKwkJCQkJICAgICAgIE5WX0FETUFfU1RBVF9USU1FT1VUIHwKKwkJCQkJICAgICAgIE5WX0FETUFfU1RBVF9TRVJST1IpKSkgewogCQkJCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmFwLT5laF9pbmZvOwogCiAJCQkJYXRhX2VoaV9jbGVhcl9kZXNjKGVoaSk7CkBAIC04NDEsNiArODQyLDkgQEAKIAkJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE5WX0FETUFfU1RBVF9IT1RVTlBMVUcpIHsKIAkJCQkJYXRhX2VoaV9ob3RwbHVnZ2VkKGVoaSk7CiAJCQkJCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgIjogaG90IHVucGx1ZyIpOworCQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgTlZfQURNQV9TVEFUX1NFUlJPUikgeworCQkJCQkvKiBsZXQgbGliYXRhIGFuYWx5emUgU0Vycm9yIGFuZCBmaWd1cmUgb3V0IHRoZSBjYXVzZSAqLworCQkJCQlhdGFfZWhpX3B1c2hfZGVzYyhlaGksICI6IFNFcnJvciIpOwogCQkJCX0KIAkJCQlhdGFfcG9ydF9mcmVlemUoYXApOwogCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYwppbmRleCBiMmUyZTY5Li5jZjllZDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYwpAQCAtMTE5LDkgKzExOSw3IEBACiBzdGF0aWMgdm9pZCBwZGNfc2F0YV9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOwogc3RhdGljIGludCBwZGNfYXRhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgcGRjX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKLXN0YXRpYyB2b2lkIHBkY19lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyBpbnQgcGRjX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7Ci1zdGF0aWMgdm9pZCBwZGNfcGF0YV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBwZGNfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyB2b2lkIHBkY190Zl9sb2FkX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3Qgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOwogc3RhdGljIHZvaWQgcGRjX2V4ZWNfY29tbWFuZF9tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKQEAgLTIxNSwxMiArMjEzLDEyIEBACiAJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAogCS5jaGVja19hdGFwaV9kbWEJPSBwZGNfY2hlY2tfYXRhcGlfZG1hLAogCi0JLnBoeV9yZXNldAkJPSBwZGNfcGF0YV9waHlfcmVzZXQsCi0KIAkucWNfcHJlcAkJPSBwZGNfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gcGRjX3FjX2lzc3VlX3Byb3QsCisJLmZyZWV6ZQkJCT0gcGRjX2ZyZWV6ZSwKKwkudGhhdwkJCT0gcGRjX3RoYXcsCisJLmVycm9yX2hhbmRsZXIJCT0gcGRjX2Vycm9yX2hhbmRsZXIsCiAJLmRhdGFfeGZlcgkJPSBhdGFfZGF0YV94ZmVyLAotCS5lbmdfdGltZW91dAkJPSBwZGNfZW5nX3RpbWVvdXQsCiAJLmlycV9oYW5kbGVyCQk9IHBkY19pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBwZGNfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCkBAIC0yNTMsNyArMjUxLDcgQEAKIAkvKiBib2FyZF8yMDYxOSAqLwogCXsKIAkJLnNodAkJPSAmcGRjX2F0YV9zaHQsCi0JCS5mbGFncwkJPSBQRENfQ09NTU9OX0ZMQUdTIHwgQVRBX0ZMQUdfU1JTVCB8IEFUQV9GTEFHX1NMQVZFX1BPU1MsCisJCS5mbGFncwkJPSBQRENfQ09NTU9OX0ZMQUdTIHwgQVRBX0ZMQUdfU0xBVkVfUE9TUywKIAkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwpAQCAtMzg5LDE0ICszODcsNiBAQAogCQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBODA7CiB9CiAKLXN0YXRpYyB2b2lkIHBkY19wYXRhX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXBkY19wYXRhX2NibF9kZXRlY3QoYXApOwotCXBkY19yZXNldF9wb3J0KGFwKTsKLQlhdGFfcG9ydF9wcm9iZShhcCk7Ci0JYXRhX2J1c19yZXNldChhcCk7Ci19Ci0KIHN0YXRpYyB1MzIgcGRjX3NhdGFfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MIHx8IGFwLT5jYmwgIT0gQVRBX0NCTF9TQVRBKQpAQCAtNTY0LDYgKzU1NCwxMyBAQAogCXJlYWRsKG1taW8gKyBQRENfQ1RMU1RBVCk7IC8qIGZsdXNoICovCiB9CiAKK3N0YXRpYyBpbnQgcGRjX3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWlmICghc2F0YV9zY3JfdmFsaWQoYXApKQorCQlwZGNfcGF0YV9jYmxfZGV0ZWN0KGFwKTsKKwlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Cit9CisKIHN0YXRpYyB2b2lkIHBkY19lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJYXRhX3Jlc2V0X2ZuX3QgaGFyZHJlc2V0OwpAQCAtNTc2LDcgKzU3Myw3IEBACiAJCWhhcmRyZXNldCA9IHNhdGFfc3RkX2hhcmRyZXNldDsKIAogCS8qIHBlcmZvcm0gcmVjb3ZlcnkgKi8KLQlhdGFfZG9fZWgoYXAsIGF0YV9zdGRfcHJlcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBoYXJkcmVzZXQsCisJYXRhX2RvX2VoKGFwLCBwZGNfcHJlX3Jlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgaGFyZHJlc2V0LAogCQkgIGF0YV9zdGRfcG9zdHJlc2V0KTsKIH0KIApAQCAtNTkyLDQzICs1ODksNiBAQAogCQlwZGNfcmVzZXRfcG9ydChhcCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBkY19lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGFwLT5ob3N0OwotCXU4IGRydl9zdGF0OwotCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQUklOVEsoIkVOVEVSXG4iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7Ci0KLQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCi0Jc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKLQljYXNlIEFUQV9QUk9UX0RNQToKLQljYXNlIEFUQV9QUk9UX05PREFUQToKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgImNvbW1hbmQgdGltZW91dFxuIik7Ci0JCWRydl9zdGF0ID0gYXRhX3dhaXRfaWRsZShhcCk7Ci0JCXFjLT5lcnJfbWFzayB8PSBfX2FjX2Vycl9tYXNrKGRydl9zdGF0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkcnZfc3RhdCA9IGF0YV9idXN5X3dhaXQoYXAsIEFUQV9CVVNZIHwgQVRBX0RSUSwgMTAwMCk7Ci0KLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwKLQkJCQkidW5rbm93biB0aW1lb3V0LCBjbWQgMHgleCBzdGF0IDB4JXhcbiIsCi0JCQkJcWMtPnRmLmNvbW1hbmQsIGRydl9zdGF0KTsKLQotCQlxYy0+ZXJyX21hc2sgfD0gYWNfZXJyX21hc2soZHJ2X3N0YXQpOwotCQlicmVhazsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7Ci0JYXRhX2VoX3FjX2NvbXBsZXRlKHFjKTsKLQlEUFJJTlRLKCJFWElUXG4iKTsKLX0KLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGRjX2hvc3RfaW50ciggc3RydWN0IGF0YV9wb3J0ICphcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jIGIvZHJpdmVycy9hdGEvc2F0YV92c2MuYwppbmRleCAzZDlkYWYyLi4yZmQwMzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMKQEAgLTM0Niw2ICszNDYsNyBAQAogCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7CiAJaW50IHJjOworCXU4IGNsczsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKQEAgLTM4Myw5ICszODQsMTIgQEAKIAlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKIAogCS8qCi0JICogRHVlIHRvIGEgYnVnIGluIHRoZSBjaGlwLCB0aGUgZGVmYXVsdCBjYWNoZSBsaW5lIHNpemUgY2FuJ3QgYmUgdXNlZAorCSAqIER1ZSB0byBhIGJ1ZyBpbiB0aGUgY2hpcCwgdGhlIGRlZmF1bHQgY2FjaGUgbGluZSBzaXplIGNhbid0IGJlCisJICogdXNlZCAodW5sZXNzIHRoZSBkZWZhdWx0IGlzIG5vbi16ZXJvKS4KIAkgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgMHg4MCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmNscyk7CisJaWYgKGNscyA9PSAweDAwKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgMHg4MCk7CiAKIAlpZiAocGNpX2VuYWJsZV9tc2kocGRldikgPT0gMCkKIAkJcGNpX2ludHgocGRldiwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2FncC9NYWtlZmlsZQppbmRleCAzZTU4MTYwLi5hMGQwNGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvTWFrZWZpbGUKQEAgLTEsNiArMSw3IEBACiBhZ3BnYXJ0LXkgOj0gYmFja2VuZC5vIGZyb250ZW5kLm8gZ2VuZXJpYy5vIGlzb2NoLm8KIAogb2JqLSQoQ09ORklHX0FHUCkJCSs9IGFncGdhcnQubworb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IGNvbXBhdF9pb2N0bC5vCiBvYmotJChDT05GSUdfQUdQX0FMSSkJCSs9IGFsaS1hZ3Aubwogb2JqLSQoQ09ORklHX0FHUF9BVEkpCQkrPSBhdGktYWdwLm8KIG9iai0kKENPTkZJR19BR1BfQU1EKQkJKz0gYW1kLWs3LWFncC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FncC5oIGIvZHJpdmVycy9jaGFyL2FncC9hZ3AuaAppbmRleCAxZDU5ZTJhLi45YmQ2OGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FncC5oCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYWdwLmgKQEAgLTExNCw2ICsxMTQsNyBAQAogCXZvaWQgKCpmcmVlX2J5X3R5cGUpKHN0cnVjdCBhZ3BfbWVtb3J5ICopOwogCXZvaWQgKigqYWdwX2FsbG9jX3BhZ2UpKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKik7CiAJdm9pZCAoKmFncF9kZXN0cm95X3BhZ2UpKHZvaWQgKik7CisgICAgICAgIGludCAoKmFncF90eXBlX3RvX21hc2tfdHlwZSkgKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKiwgaW50KTsKIH07CiAKIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgewpAQCAtMjE4LDYgKzIxOSw3IEBACiAjZGVmaW5lIEk4MTBfUFRFX01BSU5fVU5DQUNIRUQJMHgwMDAwMDAwMAogI2RlZmluZSBJODEwX1BURV9MT0NBTAkJMHgwMDAwMDAwMgogI2RlZmluZSBJODEwX1BURV9WQUxJRAkJMHgwMDAwMDAwMQorI2RlZmluZSBJODMwX1BURV9TWVNURU1fQ0FDSEVEICAweDAwMDAwMDA2CiAjZGVmaW5lIEk4MTBfU01SQU1fTUlTQ0MJMHg3MAogI2RlZmluZSBJODEwX0dGWF9NRU1fV0lOX1NJWkUJMHgwMDAxMDAwMAogI2RlZmluZSBJODEwX0dGWF9NRU1fV0lOXzMyTQkweDAwMDEwMDAwCkBAIC0yNzAsOCArMjcyLDE2IEBACiB2b2lkIGdldF9hZ3BfdmVyc2lvbihzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpOwogdW5zaWduZWQgbG9uZyBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCiAJdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgdHlwZSk7CitpbnQgYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAorCQkJCSAgaW50IHR5cGUpOwogc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYWdwX2dlbmVyaWNfZmluZF9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogCisvKiBnZW5lcmljIGZ1bmN0aW9ucyBmb3IgdXNlci1wb3B1bGF0ZWQgQUdQIG1lbW9yeSB0eXBlcyAqLworc3RydWN0IGFncF9tZW1vcnkgKmFncF9nZW5lcmljX2FsbG9jX3VzZXIoc2l6ZV90IHBhZ2VfY291bnQsIGludCB0eXBlKTsKK3ZvaWQgYWdwX2FsbG9jX3BhZ2VfYXJyYXkoc2l6ZV90IHNpemUsIHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pOwordm9pZCBhZ3BfZnJlZV9wYWdlX2FycmF5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pOworCisKIC8qIGdlbmVyaWMgcm91dGluZXMgZm9yIGFncD49MyAqLwogaW50IGFncDNfZ2VuZXJpY19mZXRjaF9zaXplKHZvaWQpOwogdm9pZCBhZ3AzX2dlbmVyaWNfdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKm1lbSk7CkBAIC0yODgsNiArMjk4LDggQEAKIGV4dGVybiBpbnQgYWdwX29mZjsKIGV4dGVybiBpbnQgYWdwX3RyeV91bnN1cHBvcnRlZF9ib290OwogCitsb25nIGNvbXBhdF9hZ3BfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwogLyogQ2hpcHNldCBpbmRlcGVuZGFudCByZWdpc3RlcnMgKGZyb20gQUdQIFNwZWMpICovCiAjZGVmaW5lIEFHUF9BUEJBU0UJMHgxMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FsaS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYWxpLWFncC5jCmluZGV4IDVhMzFlYzcuLjk4MTc3YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYWxpLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYWxpLWFncC5jCkBAIC0yMTQsNiArMjE0LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFsaV9kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgYWxpX20xNTQxX2JyaWRnZSA9IHsKQEAgLTIzNyw2ICsyMzgsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBtMTU0MV9hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gbTE1NDFfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYWxwaGEtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FscGhhLWFncC5jCmluZGV4IGI0ZTAwYTMuLmIwYWNmNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYWxwaGEtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hbHBoYS1hZ3AuYwpAQCAtOTEsNiArOTEsOSBAQAogCWludCBudW1fZW50cmllcywgc3RhdHVzOwogCXZvaWQgKnRlbXA7CiAKKwlpZiAodHlwZSA+PSBBR1BfVVNFUl9UWVBFUyB8fCBtZW0tPnR5cGUgPj0gQUdQX1VTRVJfVFlQRVMpCisJCXJldHVybiAtRUlOVkFMOworCiAJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKIAludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOwogCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpCkBAIC0xNDIsNiArMTQ1LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYWxwaGFfYnJpZGdlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hbWQtazctYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYwppbmRleCBjODVjOGNhLi4zZDhkNDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYwpAQCAtMzgxLDYgKzM4MSw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2RldmljZV9pZHMgYW1kX2FncF9kZXZpY2VfaWRzW10gX19kZXZpbml0ZGF0YSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYwppbmRleCA5M2QyMjA5Li42MzZkOTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKQEAgLTYyLDEyICs2MiwxOCBAQAogewogCWludCBpLCBqLCBudW1fZW50cmllczsKIAlsb25nIGxvbmcgdG1wOworCWludCBtYXNrX3R5cGU7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlID0gbWVtLT5icmlkZ2U7CiAJdTMyIHB0ZTsKIAogCW51bV9lbnRyaWVzID0gYWdwX251bV9lbnRyaWVzKCk7CiAKLQlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKQorCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJbWFza190eXBlID0gYnJpZGdlLT5kcml2ZXItPmFncF90eXBlX3RvX21hc2tfdHlwZShicmlkZ2UsIHR5cGUpOworCWlmIChtYXNrX3R5cGUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAogCS8qIE1ha2Ugc3VyZSB3ZSBjYW4gZml0IHRoZSByYW5nZSBpbiB0aGUgZ2F0dCB0YWJsZS4gKi8KIAkvKiBGSVhNRTogY291bGQgd3JhcCAqLwpAQCAtOTAsNyArOTYsNyBAQAogCiAJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgewogCQl0bXAgPSBhZ3BfYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGFncF9icmlkZ2UsCi0JCQltZW0tPm1lbW9yeVtpXSwgbWVtLT50eXBlKTsKKwkJCW1lbS0+bWVtb3J5W2ldLCBtYXNrX3R5cGUpOwogCiAJCUJVR19PTih0bXAgJiAweGZmZmZmZjAwMDAwMDBmZmNVTEwpOwogCQlwdGUgPSAodG1wICYgMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAyODsKQEAgLTI0Nyw2ICsyNTMsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiAvKiBTb21lIGJhc2ljIHNhbml0eSBjaGVja3MgZm9yIHRoZSBhcGVydHVyZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hdGktYWdwLmMKaW5kZXggOTk4N2RjMi4uNzdjOWFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hdGktYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hdGktYWdwLmMKQEAgLTQzMSw2ICs0MzEsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYmFja2VuZC5jIGIvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKaW5kZXggZDU5ZTAzNy4uZWJkZDZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKQEAgLTQzLDcgKzQzLDcgQEAKICAqIGZpeCBzb21lIHJlYWwgc3R1cGlkaXR5LiBJdCdzIG9ubHkgYnkgY2hhbmNlIHdlIGNhbiBidW1wCiAgKiBwYXN0IDAuOTkgYXQgYWxsIGR1ZSB0byBzb21lIGJvb2xlYW4gbG9naWMgZXJyb3IuICovCiAjZGVmaW5lIEFHUEdBUlRfVkVSU0lPTl9NQUpPUiAwCi0jZGVmaW5lIEFHUEdBUlRfVkVSU0lPTl9NSU5PUiAxMDEKKyNkZWZpbmUgQUdQR0FSVF9WRVJTSU9OX01JTk9SIDEwMgogc3RhdGljIGNvbnN0IHN0cnVjdCBhZ3BfdmVyc2lvbiBhZ3BfY3VycmVudF92ZXJzaW9uID0KIHsKIAkubWFqb3IgPSBBR1BHQVJUX1ZFUlNJT05fTUFKT1IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2NvbXBhdF9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I0YjFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuYwpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIEFHUEdBUlQgZHJpdmVyIGZyb250ZW5kIGNvbXBhdGliaWxpdHkgaW9jdGxzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRGF2ZSBKb25lcworICogQ29weXJpZ2h0IChDKSAxOTk5IEplZmYgSGFydG1hbm4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAxOTk5IFhpIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBKRUZGIEhBUlRNQU5OLCBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUKKyAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAiYWdwLmgiCisjaW5jbHVkZSAiY29tcGF0X2lvY3RsLmgiCisKK3N0YXRpYyBpbnQgY29tcGF0X2FncGlvY19pbmZvX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFncF9pbmZvMzIgdXNlcmluZm87CisJc3RydWN0IGFncF9rZXJuX2luZm8ga2VybmluZm87CisKKwlhZ3BfY29weV9pbmZvKGFncF9icmlkZ2UsICZrZXJuaW5mbyk7CisKKwl1c2VyaW5mby52ZXJzaW9uLm1ham9yID0ga2VybmluZm8udmVyc2lvbi5tYWpvcjsKKwl1c2VyaW5mby52ZXJzaW9uLm1pbm9yID0ga2VybmluZm8udmVyc2lvbi5taW5vcjsKKwl1c2VyaW5mby5icmlkZ2VfaWQgPSBrZXJuaW5mby5kZXZpY2UtPnZlbmRvciB8CisJICAgIChrZXJuaW5mby5kZXZpY2UtPmRldmljZSA8PCAxNik7CisJdXNlcmluZm8uYWdwX21vZGUgPSBrZXJuaW5mby5tb2RlOworCXVzZXJpbmZvLmFwZXJfYmFzZSA9IChjb21wYXRfbG9uZ190KWtlcm5pbmZvLmFwZXJfYmFzZTsKKwl1c2VyaW5mby5hcGVyX3NpemUgPSBrZXJuaW5mby5hcGVyX3NpemU7CisJdXNlcmluZm8ucGdfdG90YWwgPSB1c2VyaW5mby5wZ19zeXN0ZW0gPSBrZXJuaW5mby5tYXhfbWVtb3J5OworCXVzZXJpbmZvLnBnX3VzZWQgPSBrZXJuaW5mby5jdXJyZW50X21lbW9yeTsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdXNlcmluZm8sIHNpemVvZih1c2VyaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9hZ3Bpb2NfcmVzZXJ2ZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhZ3BfcmVnaW9uMzIgdXJlc2VydmU7CisJc3RydWN0IGFncF9yZWdpb24ga3Jlc2VydmU7CisJc3RydWN0IGFncF9jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqY2xpZW50X3ByaXY7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmdXJlc2VydmUsIGFyZywgc2l6ZW9mKHVyZXNlcnZlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCh1bnNpZ25lZCkgdXJlc2VydmUuc2VnX2NvdW50ID49IH4wVS9zaXplb2Yoc3RydWN0IGFncF9zZWdtZW50MzIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWtyZXNlcnZlLnBpZCA9IHVyZXNlcnZlLnBpZDsKKwlrcmVzZXJ2ZS5zZWdfY291bnQgPSB1cmVzZXJ2ZS5zZWdfY291bnQ7CisKKwljbGllbnQgPSBhZ3BfZmluZF9jbGllbnRfYnlfcGlkKGtyZXNlcnZlLnBpZCk7CisKKwlpZiAoa3Jlc2VydmUuc2VnX2NvdW50ID09IDApIHsKKwkJLyogcmVtb3ZlIGEgY2xpZW50ICovCisJCWNsaWVudF9wcml2ID0gYWdwX2ZpbmRfcHJpdmF0ZShrcmVzZXJ2ZS5waWQpOworCisJCWlmIChjbGllbnRfcHJpdiAhPSBOVUxMKSB7CisJCQlzZXRfYml0KEFHUF9GRl9JU19DTElFTlQsICZjbGllbnRfcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJCXNldF9iaXQoQUdQX0ZGX0lTX1ZBTElELCAmY2xpZW50X3ByaXYtPmFjY2Vzc19mbGFncyk7CisJCX0KKwkJaWYgKGNsaWVudCA9PSBOVUxMKSB7CisJCQkvKiBjbGllbnQgaXMgYWxyZWFkeSByZW1vdmVkICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gYWdwX3JlbW92ZV9jbGllbnQoa3Jlc2VydmUucGlkKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgYWdwX3NlZ21lbnQzMiAqdXNlZ21lbnQ7CisJCXN0cnVjdCBhZ3Bfc2VnbWVudCAqa3NlZ21lbnQ7CisJCWludCBzZWc7CisKKwkJaWYgKHVyZXNlcnZlLnNlZ19jb3VudCA+PSAxNjM4NCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXVzZWdtZW50ID0ga21hbGxvYyhzaXplb2YoKnVzZWdtZW50KSAqIHVyZXNlcnZlLnNlZ19jb3VudCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdXNlZ21lbnQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlrc2VnbWVudCA9IGttYWxsb2Moc2l6ZW9mKCprc2VnbWVudCkgKiBrcmVzZXJ2ZS5zZWdfY291bnQsIEdGUF9LRVJORUwpOworCQlpZiAoIWtzZWdtZW50KSB7CisJCQlrZnJlZSh1c2VnbWVudCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcih1c2VnbWVudCwgKHZvaWQgX191c2VyICopIHVyZXNlcnZlLnNlZ19saXN0LAorCQkJCSAgIHNpemVvZigqdXNlZ21lbnQpICogdXJlc2VydmUuc2VnX2NvdW50KSkgeworCQkJa2ZyZWUodXNlZ21lbnQpOworCQkJa2ZyZWUoa3NlZ21lbnQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlmb3IgKHNlZyA9IDA7IHNlZyA8IHVyZXNlcnZlLnNlZ19jb3VudDsgc2VnKyspIHsKKwkJCWtzZWdtZW50W3NlZ10ucGdfc3RhcnQgPSB1c2VnbWVudFtzZWddLnBnX3N0YXJ0OworCQkJa3NlZ21lbnRbc2VnXS5wZ19jb3VudCA9IHVzZWdtZW50W3NlZ10ucGdfY291bnQ7CisJCQlrc2VnbWVudFtzZWddLnByb3QgPSB1c2VnbWVudFtzZWddLnByb3Q7CisJCX0KKworCQlrZnJlZSh1c2VnbWVudCk7CisJCWtyZXNlcnZlLnNlZ19saXN0ID0ga3NlZ21lbnQ7CisKKwkJaWYgKGNsaWVudCA9PSBOVUxMKSB7CisJCQkvKiBDcmVhdGUgdGhlIGNsaWVudCBhbmQgYWRkIHRoZSBzZWdtZW50ICovCisJCQljbGllbnQgPSBhZ3BfY3JlYXRlX2NsaWVudChrcmVzZXJ2ZS5waWQpOworCisJCQlpZiAoY2xpZW50ID09IE5VTEwpIHsKKwkJCQlrZnJlZShrc2VnbWVudCk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQljbGllbnRfcHJpdiA9IGFncF9maW5kX3ByaXZhdGUoa3Jlc2VydmUucGlkKTsKKworCQkJaWYgKGNsaWVudF9wcml2ICE9IE5VTEwpIHsKKwkJCQlzZXRfYml0KEFHUF9GRl9JU19DTElFTlQsICZjbGllbnRfcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJCQlzZXRfYml0KEFHUF9GRl9JU19WQUxJRCwgJmNsaWVudF9wcml2LT5hY2Nlc3NfZmxhZ3MpOworCQkJfQorCQl9CisJCXJldHVybiBhZ3BfY3JlYXRlX3NlZ21lbnQoY2xpZW50LCAma3Jlc2VydmUpOworCX0KKwkvKiBXaWxsIG5ldmVyIHJlYWxseSBoYXBwZW4gKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjb21wYXRfYWdwaW9jX2FsbG9jYXRlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeTsKKwlzdHJ1Y3QgYWdwX2FsbG9jYXRlMzIgYWxsb2M7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmYWxsb2MsIGFyZywgc2l6ZW9mKGFsbG9jKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtb3J5ID0gYWdwX2FsbG9jYXRlX21lbW9yeV93cmFwKGFsbG9jLnBnX2NvdW50LCBhbGxvYy50eXBlKTsKKworCWlmIChtZW1vcnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhbGxvYy5rZXkgPSBtZW1vcnktPmtleTsKKwlhbGxvYy5waHlzaWNhbCA9IG1lbW9yeS0+cGh5c2ljYWw7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmFsbG9jLCBzaXplb2YoYWxsb2MpKSkgeworCQlhZ3BfZnJlZV9tZW1vcnlfd3JhcChtZW1vcnkpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X2FncGlvY19iaW5kX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFncF9iaW5kMzIgYmluZF9pbmZvOworCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmYmluZF9pbmZvLCBhcmcsIHNpemVvZihiaW5kX2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1vcnkgPSBhZ3BfZmluZF9tZW1fYnlfa2V5KGJpbmRfaW5mby5rZXkpOworCisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBhZ3BfYmluZF9tZW1vcnkobWVtb3J5LCBiaW5kX2luZm8ucGdfc3RhcnQpOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9hZ3Bpb2NfdW5iaW5kX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeTsKKwlzdHJ1Y3QgYWdwX3VuYmluZDMyIHVuYmluZDsKKworCURCRygiIik7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1bmJpbmQsIGFyZywgc2l6ZW9mKHVuYmluZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbW9yeSA9IGFncF9maW5kX21lbV9ieV9rZXkodW5iaW5kLmtleSk7CisKKwlpZiAobWVtb3J5ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGFncF91bmJpbmRfbWVtb3J5KG1lbW9yeSk7Cit9CisKK2xvbmcgY29tcGF0X2FncF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmN1cnJfcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0X3ZhbCA9IC1FTk9UVFk7CisKKwltdXRleF9sb2NrKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCisJaWYgKChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyID09IE5VTEwpICYmCisJICAgIChjbWQgIT0gQUdQSU9DX0FDUVVJUkUzMikpIHsKKwkJcmV0X3ZhbCA9IC1FSU5WQUw7CisJCWdvdG8gaW9jdGxfb3V0OworCX0KKwlpZiAoKGFncF9mZS5iYWNrZW5kX2FjcXVpcmVkICE9IFRSVUUpICYmCisJICAgIChjbWQgIT0gQUdQSU9DX0FDUVVJUkUzMikpIHsKKwkJcmV0X3ZhbCA9IC1FQlVTWTsKKwkJZ290byBpb2N0bF9vdXQ7CisJfQorCWlmIChjbWQgIT0gQUdQSU9DX0FDUVVJUkUzMikgeworCQlpZiAoISh0ZXN0X2JpdChBR1BfRkZfSVNfQ09OVFJPTExFUiwgJmN1cnJfcHJpdi0+YWNjZXNzX2ZsYWdzKSkpIHsKKwkJCXJldF92YWwgPSAtRVBFUk07CisJCQlnb3RvIGlvY3RsX291dDsKKwkJfQorCQkvKiBVc2UgdGhlIG9yaWdpbmFsIHBpZCBvZiB0aGUgY29udHJvbGxlciwKKwkJICogaW4gY2FzZSBpdCdzIHRocmVhZGVkICovCisKKwkJaWYgKGFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXItPnBpZCAhPSBjdXJyX3ByaXYtPm15X3BpZCkgeworCQkJcmV0X3ZhbCA9IC1FQlVTWTsKKwkJCWdvdG8gaW9jdGxfb3V0OworCQl9CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFHUElPQ19JTkZPMzI6CisJCXJldF92YWwgPSBjb21wYXRfYWdwaW9jX2luZm9fd3JhcChjdXJyX3ByaXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0FDUVVJUkUzMjoKKwkJcmV0X3ZhbCA9IGFncGlvY19hY3F1aXJlX3dyYXAoY3Vycl9wcml2KTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19SRUxFQVNFMzI6CisJCXJldF92YWwgPSBhZ3Bpb2NfcmVsZWFzZV93cmFwKGN1cnJfcHJpdik7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfU0VUVVAzMjoKKwkJcmV0X3ZhbCA9IGFncGlvY19zZXR1cF93cmFwKGN1cnJfcHJpdiwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfUkVTRVJWRTMyOgorCQlyZXRfdmFsID0gY29tcGF0X2FncGlvY19yZXNlcnZlX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19QUk9URUNUMzI6CisJCXJldF92YWwgPSBhZ3Bpb2NfcHJvdGVjdF93cmFwKGN1cnJfcHJpdik7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfQUxMT0NBVEUzMjoKKwkJcmV0X3ZhbCA9IGNvbXBhdF9hZ3Bpb2NfYWxsb2NhdGVfd3JhcChjdXJyX3ByaXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0RFQUxMT0NBVEUzMjoKKwkJcmV0X3ZhbCA9IGFncGlvY19kZWFsbG9jYXRlX3dyYXAoY3Vycl9wcml2LCAoaW50KSBhcmcpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0JJTkQzMjoKKwkJcmV0X3ZhbCA9IGNvbXBhdF9hZ3Bpb2NfYmluZF93cmFwKGN1cnJfcHJpdiwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfVU5CSU5EMzI6CisJCXJldF92YWwgPSBjb21wYXRfYWdwaW9jX3VuYmluZF93cmFwKGN1cnJfcHJpdiwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCX0KKworaW9jdGxfb3V0OgorCURCRygiaW9jdGwgcmV0dXJucyAlZFxuIiwgcmV0X3ZhbCk7CisJbXV0ZXhfdW5sb2NrKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCXJldHVybiByZXRfdmFsOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2NvbXBhdF9pb2N0bC5oIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTkzOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBKZWZmIEhhcnRtYW5uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBYaSBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogSkVGRiBIQVJUTUFOTiwgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFCisgKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfQUdQX0NPTVBBVF9JT0NUTF9ICisjZGVmaW5lIF9BR1BfQ09NUEFUX0lPQ1RMX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncGdhcnQuaD4KKworI2RlZmluZSBBR1BJT0NfSU5GTzMyICAgICAgIF9JT1IgKEFHUElPQ19CQVNFLCAwLCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfQUNRVUlSRTMyICAgIF9JTyAgKEFHUElPQ19CQVNFLCAxKQorI2RlZmluZSBBR1BJT0NfUkVMRUFTRTMyICAgIF9JTyAgKEFHUElPQ19CQVNFLCAyKQorI2RlZmluZSBBR1BJT0NfU0VUVVAzMiAgICAgIF9JT1cgKEFHUElPQ19CQVNFLCAzLCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfUkVTRVJWRTMyICAgIF9JT1cgKEFHUElPQ19CQVNFLCA0LCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfUFJPVEVDVDMyICAgIF9JT1cgKEFHUElPQ19CQVNFLCA1LCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfQUxMT0NBVEUzMiAgIF9JT1dSKEFHUElPQ19CQVNFLCA2LCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfREVBTExPQ0FURTMyIF9JT1cgKEFHUElPQ19CQVNFLCA3LCBjb21wYXRfaW50X3QpCisjZGVmaW5lIEFHUElPQ19CSU5EMzIgICAgICAgX0lPVyAoQUdQSU9DX0JBU0UsIDgsIGNvbXBhdF91cHRyX3QpCisjZGVmaW5lIEFHUElPQ19VTkJJTkQzMiAgICAgX0lPVyAoQUdQSU9DX0JBU0UsIDksIGNvbXBhdF91cHRyX3QpCisKK3N0cnVjdCBhZ3BfaW5mbzMyIHsKKwlzdHJ1Y3QgYWdwX3ZlcnNpb24gdmVyc2lvbjsJLyogdmVyc2lvbiBvZiB0aGUgZHJpdmVyICAgICAgICAqLworCXUzMiBicmlkZ2VfaWQ7CQkvKiBicmlkZ2UgdmVuZG9yL2RldmljZSAgICAgICAgICovCisJdTMyIGFncF9tb2RlOwkJLyogbW9kZSBpbmZvIG9mIGJyaWRnZSAgICAgICAgICAqLworCWNvbXBhdF9sb25nX3QgYXBlcl9iYXNlOwkvKiBiYXNlIG9mIGFwZXJ0dXJlICAgICAgICAgICAgICovCisJY29tcGF0X3NpemVfdCBhcGVyX3NpemU7CS8qIHNpemUgb2YgYXBlcnR1cmUgICAgICAgICAgICAgKi8KKwljb21wYXRfc2l6ZV90IHBnX3RvdGFsOwkvKiBtYXggcGFnZXMgKHN3YXAgKyBzeXN0ZW0pICAgICovCisJY29tcGF0X3NpemVfdCBwZ19zeXN0ZW07CS8qIG1heCBwYWdlcyAoc3lzdGVtKSAgICAgICAgICAgKi8KKwljb21wYXRfc2l6ZV90IHBnX3VzZWQ7CQkvKiBjdXJyZW50IHBhZ2VzIHVzZWQgICAgICAgICAgICovCit9OworCisvKgorICogVGhlICJwcm90IiBkb3duIGJlbG93IG5lZWRzIHN0aWxsIGEgInNsZWVwIiBmbGFnIHNvbWVob3cgLi4uCisgKi8KK3N0cnVjdCBhZ3Bfc2VnbWVudDMyIHsKKwljb21wYXRfb2ZmX3QgcGdfc3RhcnQ7CQkvKiBzdGFydGluZyBwYWdlIHRvIHBvcHVsYXRlICAgICovCisJY29tcGF0X3NpemVfdCBwZ19jb3VudDsJLyogbnVtYmVyIG9mIHBhZ2VzICAgICAgICAgICAgICAqLworCWNvbXBhdF9pbnRfdCBwcm90OwkJLyogcHJvdCBmbGFncyBmb3IgbW1hcCAgICAgICAgICAqLworfTsKKworc3RydWN0IGFncF9yZWdpb24zMiB7CisJY29tcGF0X3BpZF90IHBpZDsJCS8qIHBpZCBvZiBwcm9jZXNzICAgICAgICAgICAgICAgKi8KKwljb21wYXRfc2l6ZV90IHNlZ19jb3VudDsJLyogbnVtYmVyIG9mIHNlZ21lbnRzICAgICAgICAgICAqLworCXN0cnVjdCBhZ3Bfc2VnbWVudDMyICpzZWdfbGlzdDsKK307CisKK3N0cnVjdCBhZ3BfYWxsb2NhdGUzMiB7CisJY29tcGF0X2ludF90IGtleTsJCS8qIHRhZyBvZiBhbGxvY2F0aW9uICAgICAgICAgICAgKi8KKwljb21wYXRfc2l6ZV90IHBnX2NvdW50OwkvKiBudW1iZXIgb2YgcGFnZXMgICAgICAgICAgICAgICovCisJdTMyIHR5cGU7CQkvKiAwID09IG5vcm1hbCwgb3RoZXIgZGV2c3BlYyAgICovCisJdTMyIHBoeXNpY2FsOyAgICAgICAgICAgLyogZGV2aWNlIHNwZWNpZmljIChzb21lIGRldmljZXMKKwkJCQkgKiBuZWVkIGEgcGh5cyBhZGRyZXNzIG9mIHRoZQorCQkJCSAqIGFjdHVhbCBwYWdlIGJlaGluZCB0aGUgZ2F0dAorCQkJCSAqIHRhYmxlKSAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCitzdHJ1Y3QgYWdwX2JpbmQzMiB7CisJY29tcGF0X2ludF90IGtleTsJCS8qIHRhZyBvZiBhbGxvY2F0aW9uICAgICAgICAgICAgKi8KKwljb21wYXRfb2ZmX3QgcGdfc3RhcnQ7CQkvKiBzdGFydGluZyBwYWdlIHRvIHBvcHVsYXRlICAgICovCit9OworCitzdHJ1Y3QgYWdwX3VuYmluZDMyIHsKKwljb21wYXRfaW50X3Qga2V5OwkJLyogdGFnIG9mIGFsbG9jYXRpb24gICAgICAgICAgICAqLworCXUzMiBwcmlvcml0eTsJCS8qIHByaW9yaXR5IGZvciBwYWdpbmcgb3V0ICAgICAgKi8KK307CisKK2V4dGVybiBzdHJ1Y3QgYWdwX2Zyb250X2RhdGEgYWdwX2ZlOworCitpbnQgYWdwaW9jX2FjcXVpcmVfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdik7CitpbnQgYWdwaW9jX3JlbGVhc2Vfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdik7CitpbnQgYWdwaW9jX3Byb3RlY3Rfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdik7CitpbnQgYWdwaW9jX3NldHVwX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpOworaW50IGFncGlvY19kZWFsbG9jYXRlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIGludCBhcmcpOworc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmFncF9maW5kX3ByaXZhdGUocGlkX3QgcGlkKTsKK3N0cnVjdCBhZ3BfY2xpZW50ICphZ3BfY3JlYXRlX2NsaWVudChwaWRfdCBpZCk7CitpbnQgYWdwX3JlbW92ZV9jbGllbnQocGlkX3QgaWQpOworaW50IGFncF9jcmVhdGVfc2VnbWVudChzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgYWdwX3JlZ2lvbiAqcmVnaW9uKTsKK3ZvaWQgYWdwX2ZyZWVfbWVtb3J5X3dyYXAoc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeSk7CitzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2FsbG9jYXRlX21lbW9yeV93cmFwKHNpemVfdCBwZ19jb3VudCwgdTMyIHR5cGUpOworc3RydWN0IGFncF9tZW1vcnkgKmFncF9maW5kX21lbV9ieV9rZXkoaW50IGtleSk7CitzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2ZpbmRfY2xpZW50X2J5X3BpZChwaWRfdCBpZCk7CisKKyNlbmRpZiAvKiBfQUdQX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2VmZmljZW9uLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9lZmZpY2Vvbi1hZ3AuYwppbmRleCAzMGY3MzBmLi42NThjYjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2VmZmljZW9uLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMKQEAgLTMzNSw2ICszMzUsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3BfZWZmaWNlb25fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKaW5kZXggMGYyZWQyYS4uNjc5ZDdmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYwpAQCAtNDEsOSArNDEsOSBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSAiYWdwLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgYWdwX2Zyb250X2RhdGEgYWdwX2ZlOworc3RydWN0IGFncF9mcm9udF9kYXRhIGFncF9mZTsKIAotc3RhdGljIHN0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfZmluZF9tZW1fYnlfa2V5KGludCBrZXkpCitzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2ZpbmRfbWVtX2J5X2tleShpbnQga2V5KQogewogCXN0cnVjdCBhZ3BfbWVtb3J5ICpjdXJyOwogCkBAIC0xNTksNyArMTU5LDcgQEAKIAlyZXR1cm4gdm1fZ2V0X3BhZ2VfcHJvdChwcm90X2JpdHMpOwogfQogCi1zdGF0aWMgaW50IGFncF9jcmVhdGVfc2VnbWVudChzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgYWdwX3JlZ2lvbiAqcmVnaW9uKQoraW50IGFncF9jcmVhdGVfc2VnbWVudChzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgYWdwX3JlZ2lvbiAqcmVnaW9uKQogewogCXN0cnVjdCBhZ3Bfc2VnbWVudF9wcml2ICoqcmV0X3NlZzsKIAlzdHJ1Y3QgYWdwX3NlZ21lbnRfcHJpdiAqc2VnOwpAQCAtMjExLDcgKzIxMSw3IEBACiAKIC8qIEZpbGUgcHJpdmF0ZSBsaXN0IHJvdXRpbmVzICovCiAKLXN0YXRpYyBzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqYWdwX2ZpbmRfcHJpdmF0ZShwaWRfdCBwaWQpCitzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqYWdwX2ZpbmRfcHJpdmF0ZShwaWRfdCBwaWQpCiB7CiAJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmN1cnI7CiAKQEAgLTI2NiwxMyArMjY2LDEzIEBACiAgKiBXcmFwcGVycyBmb3IgYWdwX2ZyZWVfbWVtb3J5ICYgYWdwX2FsbG9jYXRlX21lbW9yeQogICogVGhlc2UgbWFrZSBzdXJlIHRoYXQgaW50ZXJuYWwgbGlzdHMgYXJlIGtlcHQgdXBkYXRlZC4KICAqLwotc3RhdGljIHZvaWQgYWdwX2ZyZWVfbWVtb3J5X3dyYXAoc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeSkKK3ZvaWQgYWdwX2ZyZWVfbWVtb3J5X3dyYXAoc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeSkKIHsKIAlhZ3BfcmVtb3ZlX2Zyb21fcG9vbChtZW1vcnkpOwogCWFncF9mcmVlX21lbW9yeShtZW1vcnkpOwogfQogCi1zdGF0aWMgc3RydWN0IGFncF9tZW1vcnkgKmFncF9hbGxvY2F0ZV9tZW1vcnlfd3JhcChzaXplX3QgcGdfY291bnQsIHUzMiB0eXBlKQorc3RydWN0IGFncF9tZW1vcnkgKmFncF9hbGxvY2F0ZV9tZW1vcnlfd3JhcChzaXplX3QgcGdfY291bnQsIHUzMiB0eXBlKQogewogCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CiAKQEAgLTQ4NCw3ICs0ODQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGFncF9jbGllbnQgKmFncF9maW5kX2NsaWVudF9ieV9waWQocGlkX3QgaWQpCitzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2ZpbmRfY2xpZW50X2J5X3BpZChwaWRfdCBpZCkKIHsKIAlzdHJ1Y3QgYWdwX2NsaWVudCAqdGVtcDsKIApAQCAtNTA5LDcgKzUwOSw3IEBACiAJYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlci0+bnVtX2NsaWVudHMrKzsKIH0KIAotc3RhdGljIHN0cnVjdCBhZ3BfY2xpZW50ICphZ3BfY3JlYXRlX2NsaWVudChwaWRfdCBpZCkKK3N0cnVjdCBhZ3BfY2xpZW50ICphZ3BfY3JlYXRlX2NsaWVudChwaWRfdCBpZCkKIHsKIAlzdHJ1Y3QgYWdwX2NsaWVudCAqbmV3X2NsaWVudDsKIApAQCAtNTIyLDcgKzUyMiw3IEBACiAJcmV0dXJuIG5ld19jbGllbnQ7CiB9CiAKLXN0YXRpYyBpbnQgYWdwX3JlbW92ZV9jbGllbnQocGlkX3QgaWQpCitpbnQgYWdwX3JlbW92ZV9jbGllbnQocGlkX3QgaWQpCiB7CiAJc3RydWN0IGFncF9jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgYWdwX2NsaWVudCAqcHJldl9jbGllbnQ7CkBAIC03NDYsNyArNzQ2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZ3Bpb2NfYWNxdWlyZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2KQoraW50IGFncGlvY19hY3F1aXJlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCiB7CiAJc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyOwogCkBAIC03ODksMTQgKzc4OSwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFncGlvY19yZWxlYXNlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCitpbnQgYWdwaW9jX3JlbGVhc2Vfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdikKIHsKIAlEQkcoIiIpOwogCWFncF9jb250cm9sbGVyX3JlbGVhc2VfY3VycmVudChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyLCBwcml2KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZ3Bpb2Nfc2V0dXBfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK2ludCBhZ3Bpb2Nfc2V0dXBfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgYWdwX3NldHVwIG1vZGU7CiAKQEAgLTg3Niw3ICs4NzYsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGFncGlvY19wcm90ZWN0X3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCitpbnQgYWdwaW9jX3Byb3RlY3Rfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdikKIHsKIAlEQkcoIiIpOwogCS8qIFRoaXMgZnVuY3Rpb24gaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCAqLwpAQCAtODkyLDYgKzg5Miw5IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZhbGxvYywgYXJnLCBzaXplb2Yoc3RydWN0IGFncF9hbGxvY2F0ZSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAorCWlmIChhbGxvYy50eXBlID49IEFHUF9VU0VSX1RZUEVTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCW1lbW9yeSA9IGFncF9hbGxvY2F0ZV9tZW1vcnlfd3JhcChhbGxvYy5wZ19jb3VudCwgYWxsb2MudHlwZSk7CiAKIAlpZiAobWVtb3J5ID09IE5VTEwpCkBAIC05MDcsNyArOTEwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZ3Bpb2NfZGVhbGxvY2F0ZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCBpbnQgYXJnKQoraW50IGFncGlvY19kZWFsbG9jYXRlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIGludCBhcmcpCiB7CiAJc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeTsKIApAQCAtMTA0Myw2ICsxMDQ2LDkgQEAKIAkucmVhZAkJPSBhZ3BfcmVhZCwKIAkud3JpdGUJCT0gYWdwX3dyaXRlLAogCS5pb2N0bAkJPSBhZ3BfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSBjb21wYXRfYWdwX2lvY3RsLAorI2VuZGlmCiAJLm1tYXAJCT0gYWdwX21tYXAsCiAJLm9wZW4JCT0gYWdwX29wZW4sCiAJLnJlbGVhc2UJPSBhZ3BfcmVsZWFzZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jIGIvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKaW5kZXggMzQ5MWQ2Zi4uNzkyMzMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKQEAgLTEwMSw2ICsxMDEsNjMgQEAKIAlyZXR1cm4gLTE7CiB9CiAKKy8qCisgKiBVc2Uga21hbGxvYyBpZiBwb3NzaWJsZSBmb3IgdGhlIHBhZ2UgbGlzdC4gT3RoZXJ3aXNlIGZhbGwgYmFjayB0bworICogdm1hbGxvYy4gVGhpcyBzcGVlZHMgdGhpbmdzIHVwIGFuZCBhbHNvIHNhdmVzIG1lbW9yeSBmb3Igc21hbGwgQUdQCisgKiByZWdpb25zLgorICovCisKK3ZvaWQgYWdwX2FsbG9jX3BhZ2VfYXJyYXkoc2l6ZV90IHNpemUsIHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJbWVtLT5tZW1vcnkgPSBOVUxMOworCW1lbS0+dm1hbGxvY19mbGFnID0gMDsKKworCWlmIChzaXplIDw9IDIqUEFHRV9TSVpFKQorCQltZW0tPm1lbW9yeSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCWlmIChtZW0tPm1lbW9yeSA9PSBOVUxMKSB7CisJCW1lbS0+bWVtb3J5ID0gdm1hbGxvYyhzaXplKTsKKwkJbWVtLT52bWFsbG9jX2ZsYWcgPSAxOworCX0KK30KK0VYUE9SVF9TWU1CT0woYWdwX2FsbG9jX3BhZ2VfYXJyYXkpOworCit2b2lkIGFncF9mcmVlX3BhZ2VfYXJyYXkoc3RydWN0IGFncF9tZW1vcnkgKm1lbSkKK3sKKwlpZiAobWVtLT52bWFsbG9jX2ZsYWcpIHsKKwkJdmZyZWUobWVtLT5tZW1vcnkpOworCX0gZWxzZSB7CisJCWtmcmVlKG1lbS0+bWVtb3J5KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGFncF9mcmVlX3BhZ2VfYXJyYXkpOworCisKK3N0YXRpYyBzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2NyZWF0ZV91c2VyX21lbW9yeSh1bnNpZ25lZCBsb25nIG51bV9hZ3BfcGFnZXMpCit7CisJc3RydWN0IGFncF9tZW1vcnkgKm5ldzsKKwl1bnNpZ25lZCBsb25nIGFsbG9jX3NpemUgPSBudW1fYWdwX3BhZ2VzKnNpemVvZihzdHJ1Y3QgcGFnZSAqKTsKKworCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZ3BfbWVtb3J5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5ldyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW5ldy0+a2V5ID0gYWdwX2dldF9rZXkoKTsKKworCWlmIChuZXctPmtleSA8IDApIHsKKwkJa2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYWdwX2FsbG9jX3BhZ2VfYXJyYXkoYWxsb2Nfc2l6ZSwgbmV3KTsKKworCWlmIChuZXctPm1lbW9yeSA9PSBOVUxMKSB7CisJCWFncF9mcmVlX2tleShuZXctPmtleSk7CisJCWtmcmVlKG5ldyk7CisJCXJldHVybiBOVUxMOworCX0KKwluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gMDsKKwlyZXR1cm4gbmV3OworfQogCiBzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2NyZWF0ZV9tZW1vcnkoaW50IHNjcmF0Y2hfcGFnZXMpCiB7CkBAIC0xMTYsNyArMTczLDggQEAKIAkJa2ZyZWUobmV3KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCW5ldy0+bWVtb3J5ID0gdm1hbGxvYyhQQUdFX1NJWkUgKiBzY3JhdGNoX3BhZ2VzKTsKKworCWFncF9hbGxvY19wYWdlX2FycmF5KFBBR0VfU0laRSAqIHNjcmF0Y2hfcGFnZXMsIG5ldyk7CiAKIAlpZiAobmV3LT5tZW1vcnkgPT0gTlVMTCkgewogCQlhZ3BfZnJlZV9rZXkobmV3LT5rZXkpOwpAQCAtMTI0LDYgKzE4Miw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gc2NyYXRjaF9wYWdlczsKKwluZXctPnR5cGUgPSBBR1BfTk9STUFMX01FTU9SWTsKIAlyZXR1cm4gbmV3OwogfQogRVhQT1JUX1NZTUJPTChhZ3BfY3JlYXRlX21lbW9yeSk7CkBAIC0xNDYsNiArMjA1LDExIEBACiAJaWYgKGN1cnItPmlzX2JvdW5kID09IFRSVUUpCiAJCWFncF91bmJpbmRfbWVtb3J5KGN1cnIpOwogCisJaWYgKGN1cnItPnR5cGUgPj0gQUdQX1VTRVJfVFlQRVMpIHsKKwkJYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlKGN1cnIpOworCQlyZXR1cm47CisJfQorCiAJaWYgKGN1cnItPnR5cGUgIT0gMCkgewogCQljdXJyLT5icmlkZ2UtPmRyaXZlci0+ZnJlZV9ieV90eXBlKGN1cnIpOwogCQlyZXR1cm47CkBAIC0xNTcsNyArMjIxLDcgQEAKIAkJZmx1c2hfYWdwX21hcHBpbmdzKCk7CiAJfQogCWFncF9mcmVlX2tleShjdXJyLT5rZXkpOwotCXZmcmVlKGN1cnItPm1lbW9yeSk7CisJYWdwX2ZyZWVfcGFnZV9hcnJheShjdXJyKTsKIAlrZnJlZShjdXJyKTsKIH0KIEVYUE9SVF9TWU1CT0woYWdwX2ZyZWVfbWVtb3J5KTsKQEAgLTE4OCw2ICsyNTIsMTMgQEAKIAlpZiAoKGF0b21pY19yZWFkKCZicmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCkgKyBwYWdlX2NvdW50KSA+IGJyaWRnZS0+bWF4X21lbW9yeV9hZ3ApCiAJCXJldHVybiBOVUxMOwogCisJaWYgKHR5cGUgPj0gQUdQX1VTRVJfVFlQRVMpIHsKKwkJbmV3ID0gYWdwX2dlbmVyaWNfYWxsb2NfdXNlcihwYWdlX2NvdW50LCB0eXBlKTsKKwkJaWYgKG5ldykKKwkJCW5ldy0+YnJpZGdlID0gYnJpZGdlOworCQlyZXR1cm4gbmV3OworCX0KKwogCWlmICh0eXBlICE9IDApIHsKIAkJbmV3ID0gYnJpZGdlLT5kcml2ZXItPmFsbG9jX2J5X3R5cGUocGFnZV9jb3VudCwgdHlwZSk7CiAJCWlmIChuZXcpCkBAIC05NjAsNiArMTAzMSw3IEBACiAJb2ZmX3QgajsKIAl2b2lkICp0ZW1wOwogCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKKwlpbnQgbWFza190eXBlOwogCiAJYnJpZGdlID0gbWVtLT5icmlkZ2U7CiAJaWYgKCFicmlkZ2UpCkBAIC05OTUsNyArMTA2NywxMSBAQAogCW51bV9lbnRyaWVzIC09IGFncF9tZW1vcnlfcmVzZXJ2ZWQvUEFHRV9TSVpFOwogCWlmIChudW1fZW50cmllcyA8IDApIG51bV9lbnRyaWVzID0gMDsKIAotCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwlpZiAodHlwZSAhPSBtZW0tPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFza190eXBlID0gYnJpZGdlLT5kcml2ZXItPmFncF90eXBlX3RvX21hc2tfdHlwZShicmlkZ2UsIHR5cGUpOworCWlmIChtYXNrX3R5cGUgIT0gMCkgewogCQkvKiBUaGUgZ2VuZXJpYyByb3V0aW5lcyBrbm93IG5vdGhpbmcgb2YgbWVtb3J5IHR5cGVzICovCiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwMTgsNyArMTA5NCw4IEBACiAJfQogCiAJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgewotCQl3cml0ZWwoYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGJyaWRnZSwgbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksIGJyaWRnZS0+Z2F0dF90YWJsZStqKTsKKwkJd3JpdGVsKGJyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShicmlkZ2UsIG1lbS0+bWVtb3J5W2ldLCBtYXNrX3R5cGUpLAorCQkgICAgICAgYnJpZGdlLT5nYXR0X3RhYmxlK2opOwogCX0KIAlyZWFkbChicmlkZ2UtPmdhdHRfdGFibGUrai0xKTsJLyogUENJIFBvc3RpbmcuICovCiAKQEAgLTEwMzIsNiArMTEwOSw3IEBACiB7CiAJc2l6ZV90IGk7CiAJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCWludCBtYXNrX3R5cGU7CiAKIAlicmlkZ2UgPSBtZW0tPmJyaWRnZTsKIAlpZiAoIWJyaWRnZSkKQEAgLTEwNDAsNyArMTExOCwxMSBAQAogCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJaWYgKHR5cGUgIT0gbWVtLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1hc2tfdHlwZSA9IGJyaWRnZS0+ZHJpdmVyLT5hZ3BfdHlwZV90b19tYXNrX3R5cGUoYnJpZGdlLCB0eXBlKTsKKwlpZiAobWFza190eXBlICE9IDApIHsKIAkJLyogVGhlIGdlbmVyaWMgcm91dGluZXMga25vdyBub3RoaW5nIG9mIG1lbW9yeSB0eXBlcyAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMDU2LDIyICsxMTM4LDQwIEBACiB9CiBFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnkpOwogCi0KIHN0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlKHNpemVfdCBwYWdlX2NvdW50LCBpbnQgdHlwZSkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSk7CiAKLQogdm9pZCBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUoc3RydWN0IGFncF9tZW1vcnkgKmN1cnIpCiB7Ci0JdmZyZWUoY3Vyci0+bWVtb3J5KTsKKwlhZ3BfZnJlZV9wYWdlX2FycmF5KGN1cnIpOwogCWFncF9mcmVlX2tleShjdXJyLT5rZXkpOwogCWtmcmVlKGN1cnIpOwogfQogRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUpOwogCitzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2dlbmVyaWNfYWxsb2NfdXNlcihzaXplX3QgcGFnZV9jb3VudCwgaW50IHR5cGUpCit7CisJc3RydWN0IGFncF9tZW1vcnkgKm5ldzsKKwlpbnQgaTsKKwlpbnQgcGFnZXM7CisKKwlwYWdlcyA9IChwYWdlX2NvdW50ICsgRU5UUklFU19QRVJfUEFHRSAtIDEpIC8gRU5UUklFU19QRVJfUEFHRTsKKwluZXcgPSBhZ3BfY3JlYXRlX3VzZXJfbWVtb3J5KHBhZ2VfY291bnQpOworCWlmIChuZXcgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKQorCQluZXctPm1lbW9yeVtpXSA9IDA7CisJbmV3LT5wYWdlX2NvdW50ID0gMDsKKwluZXctPnR5cGUgPSB0eXBlOworCW5ldy0+bnVtX3NjcmF0Y2hfcGFnZXMgPSBwYWdlczsKKworCXJldHVybiBuZXc7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX2FsbG9jX3VzZXIpOwogCiAvKgogICogQmFzaWMgUGFnZSBBbGxvY2F0aW9uIFJvdXRpbmVzIC0KQEAgLTExNjUsNiArMTI2NSwxNSBAQAogfQogRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSk7CiAKK2ludCBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCisJCQkJICBpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA+PSBBR1BfVVNFUl9UWVBFUykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHR5cGU7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlKTsKKwogLyoKICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHRoZSBBR1B2MyBzcGVjLAogICogd2hpY2ggY292ZXJzIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdGhhdCBoYWQgcHJldmlvdXNseSBiZWVuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYwppbmRleCA5MDdmYjY2Li44NDdkZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKQEAgLTQzOCw2ICs0MzgsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiAJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaTQ2MC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaTQ2MC1hZ3AuYwppbmRleCA5MTc2OTQ0Li4zZTc2MTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2k0NjAtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pNDYwLWFncC5jCkBAIC0yOTMsNiArMjkzLDkgQEAKIAlwcl9kZWJ1ZygiaTQ2MF9pbnNlcnRfbWVtb3J5X3NtYWxsX2lvX3BhZ2UobWVtPSVwLCBwZ19zdGFydD0lbGQsIHR5cGU9JWQsIHBhZGRyMD0weCVseClcbiIsCiAJCSBtZW0sIHBnX3N0YXJ0LCB0eXBlLCBtZW0tPm1lbW9yeVswXSk7CiAKKwlpZiAodHlwZSA+PSBBR1BfVVNFUl9UWVBFUyB8fCBtZW0tPnR5cGUgPj0gQUdQX1VTRVJfVFlQRVMpCisJCXJldHVybiAtRUlOVkFMOworCiAJaW9fcGdfc3RhcnQgPSBJNDYwX0lPUEFHRVNfUEVSX0tQQUdFICogcGdfc3RhcnQ7CiAKIAl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOwpAQCAtMzk2LDYgKzM5OSw5IEBACiAJc3RydWN0IGxwX2Rlc2MgKnN0YXJ0LCAqZW5kLCAqbHA7CiAJdm9pZCAqdGVtcDsKIAorCWlmICh0eXBlID49IEFHUF9VU0VSX1RZUEVTIHx8IG1lbS0+dHlwZSA+PSBBR1BfVVNFUl9UWVBFUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOwogCW51bV9lbnRyaWVzID0gQV9TSVpFXzgodGVtcCktPm51bV9lbnRyaWVzOwogCkBAIC01NzIsNiArNTc4LDcgQEAKICNlbmRpZgogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIAkuY2FudF91c2VfYXBlcnR1cmUJPSAxLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKaW5kZXggYTMwMTFkZS4uMDZiMGJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KICNpbmNsdWRlICJhZ3AuaCIKQEAgLTI0LDYgKzI1LDkgQEAKICAgICAgICAgICAgICAgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdfSEIpCiAKIAorZXh0ZXJuIGludCBhZ3BfbWVtb3J5X3Jlc2VydmVkOworCisKIC8qIEludGVsIDgxNSByZWdpc3RlciAqLwogI2RlZmluZSBJTlRFTF84MTVfQVBDT05UCTB4NTEKICNkZWZpbmUgSU5URUxfODE1X0FUVEJBU0VfTUFTSwl+MHgxRkZGRkZGRgpAQCAtNjgsMTIgKzcyLDE1IEBACiAKICNkZWZpbmUgQUdQX0RDQUNIRV9NRU1PUlkJMQogI2RlZmluZSBBR1BfUEhZU19NRU1PUlkJCTIKKyNkZWZpbmUgSU5URUxfQUdQX0NBQ0hFRF9NRU1PUlkgMwogCiBzdGF0aWMgc3RydWN0IGdhdHRfbWFzayBpbnRlbF9pODEwX21hc2tzW10gPQogewogCXsubWFzayA9IEk4MTBfUFRFX1ZBTElELCAudHlwZSA9IDB9LAogCXsubWFzayA9IChJODEwX1BURV9WQUxJRCB8IEk4MTBfUFRFX0xPQ0FMKSwgLnR5cGUgPSBBR1BfRENBQ0hFX01FTU9SWX0sCi0Jey5tYXNrID0gSTgxMF9QVEVfVkFMSUQsIC50eXBlID0gMH0KKwl7Lm1hc2sgPSBJODEwX1BURV9WQUxJRCwgLnR5cGUgPSAwfSwKKwl7Lm1hc2sgPSBJODEwX1BURV9WQUxJRCB8IEk4MzBfUFRFX1NZU1RFTV9DQUNIRUQsCisJIC50eXBlID0gSU5URUxfQUdQX0NBQ0hFRF9NRU1PUll9CiB9OwogCiBzdGF0aWMgc3RydWN0IF9pbnRlbF9pODEwX3ByaXZhdGUgewpAQCAtMTE3LDEzICsxMjQsMTUgQEAKIAogCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9GSVgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKIAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbnRlbF9pODEwX3ByaXZhdGUuaTgxMF9kZXYsIEk4MTBfTU1BRERSLCAmdGVtcCk7Ci0JdGVtcCAmPSAweGZmZjgwMDAwOwotCi0JaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycyA9IGlvcmVtYXAodGVtcCwgMTI4ICogNDA5Nik7CiAJaWYgKCFpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZW1hcCBtZW1vcnkuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbnRlbF9pODEwX3ByaXZhdGUuaTgxMF9kZXYsIEk4MTBfTU1BRERSLCAmdGVtcCk7CisJCXRlbXAgJj0gMHhmZmY4MDAwMDsKKworCQlpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzID0gaW9yZW1hcCh0ZW1wLCAxMjggKiA0MDk2KTsKKwkJaWYgKCFpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVtYXAgbWVtb3J5LlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCX0KIAogCWlmICgocmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX0RSQU1fQ1RMKQpAQCAtMjAxLDYyICsyMTAsNzkgQEAKIAlhdG9taWNfZGVjKCZhZ3BfYnJpZGdlLT5jdXJyZW50X21lbW9yeV9hZ3ApOwogfQogCitzdGF0aWMgaW50IGludGVsX2k4MzBfdHlwZV90b19tYXNrX3R5cGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAorCQkJCQlpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA8IEFHUF9VU0VSX1RZUEVTKQorCQlyZXR1cm4gdHlwZTsKKwllbHNlIGlmICh0eXBlID09IEFHUF9VU0VSX0NBQ0hFRF9NRU1PUlkpCisJCXJldHVybiBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWTsKKwllbHNlCisJCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGludGVsX2k4MTBfaW5zZXJ0X2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsCiAJCQkJaW50IHR5cGUpCiB7CiAJaW50IGksIGosIG51bV9lbnRyaWVzOwogCXZvaWQgKnRlbXA7CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IG1hc2tfdHlwZTsKIAogCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKIAludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOwogCiAJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKKwogCiAJZm9yIChqID0gcGdfc3RhcnQ7IGogPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpOyBqKyspIHsKLQkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSwgcmVhZGwoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStqKSkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKLQkJaWYgKCh0eXBlID09IEFHUF9EQ0FDSEVfTUVNT1JZKSAmJiAobWVtLT50eXBlID09IEFHUF9EQ0FDSEVfTUVNT1JZKSkgewotCQkJLyogc3BlY2lhbCBpbnNlcnQgKi8KLQkJCWlmICghbWVtLT5pc19mbHVzaGVkKSB7Ci0JCQkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7Ci0JCQkJbWVtLT5pc19mbHVzaGVkID0gVFJVRTsKLQkJCX0KLQotCQkJZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpOyBpKyspIHsKLQkJCQl3cml0ZWwoKGkqNDA5Nil8STgxMF9QVEVfTE9DQUx8STgxMF9QVEVfVkFMSUQsIGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7Ci0JCQl9Ci0JCQlyZWFkbChpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKChpLTEpKjQpKTsJLyogUENJIFBvc3RpbmcuICovCi0KLQkJCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7Ci0JCQlyZXR1cm4gMDsKKwkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSwgcmVhZGwoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStqKSkpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0X2VycjsKIAkJfQotCQlpZiAoKHR5cGUgPT0gQUdQX1BIWVNfTUVNT1JZKSAmJiAobWVtLT50eXBlID09IEFHUF9QSFlTX01FTU9SWSkpCi0JCQlnb3RvIGluc2VydDsKLQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi1pbnNlcnQ6Ci0JaWYgKCFtZW0tPmlzX2ZsdXNoZWQpIHsKLQkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7Ci0JCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7Ci0JfQorCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKKwkJZ290byBvdXRfZXJyOwogCi0JZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgewotCQl3cml0ZWwoYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAotCQkJbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksCi0JCQlpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGoqNCkpOworCW1hc2tfdHlwZSA9IGFncF9icmlkZ2UtPmRyaXZlci0+YWdwX3R5cGVfdG9fbWFza190eXBlKGFncF9icmlkZ2UsIHR5cGUpOworCisJc3dpdGNoIChtYXNrX3R5cGUpIHsKKwljYXNlIEFHUF9EQ0FDSEVfTUVNT1JZOgorCQlpZiAoIW1lbS0+aXNfZmx1c2hlZCkKKwkJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCQlmb3IgKGkgPSBwZ19zdGFydDsgaSA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCk7IGkrKykgeworCQkJd3JpdGVsKChpKjQwOTYpfEk4MTBfUFRFX0xPQ0FMfEk4MTBfUFRFX1ZBTElELAorCQkJICAgICAgIGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CisJCX0KKwkJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKygoaS0xKSo0KSk7CisJCWJyZWFrOworCWNhc2UgQUdQX1BIWVNfTUVNT1JZOgorCWNhc2UgQUdQX05PUk1BTF9NRU1PUlk6CisJCWlmICghbWVtLT5pc19mbHVzaGVkKQorCQkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKKwkJCXdyaXRlbChhZ3BfYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGFncF9icmlkZ2UsCisJCQkJCQkJICAgICAgIG1lbS0+bWVtb3J5W2ldLAorCQkJCQkJCSAgICAgICBtYXNrX3R5cGUpLAorCQkJICAgICAgIGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7CisJCX0KKwkJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKygoai0xKSo0KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0X2VycjsKIAl9Ci0JcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKygoai0xKSo0KSk7CS8qIFBDSSBQb3N0aW5nLiAqLwogCiAJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKLQlyZXR1cm4gMDsKK291dDoKKwlyZXQgPSAwOworb3V0X2VycjoKKwltZW0tPmlzX2ZsdXNoZWQgPSAxOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxfaTgxMF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwKQEAgLTMzNywxMiArMzYzLDExIEBACiAJCW5ldy0+dHlwZSA9IEFHUF9EQ0FDSEVfTUVNT1JZOwogCQluZXctPnBhZ2VfY291bnQgPSBwZ19jb3VudDsKIAkJbmV3LT5udW1fc2NyYXRjaF9wYWdlcyA9IDA7Ci0JCXZmcmVlKG5ldy0+bWVtb3J5KTsKKwkJYWdwX2ZyZWVfcGFnZV9hcnJheShuZXcpOwogCQlyZXR1cm4gbmV3OwogCX0KIAlpZiAodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpCiAJCXJldHVybiBhbGxvY19hZ3BwaHlzbWVtX2k4eHgocGdfY291bnQsIHR5cGUpOwotCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM1Nyw3ICszODIsNyBAQAogCQkJCSBnYXJ0X3RvX3ZpcnQoY3Vyci0+bWVtb3J5WzBdKSk7CiAJCQlnbG9iYWxfZmx1c2hfdGxiKCk7CiAJCX0KLQkJdmZyZWUoY3Vyci0+bWVtb3J5KTsKKwkJYWdwX2ZyZWVfcGFnZV9hcnJheShjdXJyKTsKIAl9CiAJa2ZyZWUoY3Vycik7CiB9CkBAIC02MTksOSArNjQ0LDExIEBACiB7CiAJaW50IGksaixudW1fZW50cmllczsKIAl2b2lkICp0ZW1wOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBtYXNrX3R5cGU7CiAKIAlpZiAobWVtLT5wYWdlX2NvdW50ID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAogCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CiAJbnVtX2VudHJpZXMgPSBBX1NJWkVfRklYKHRlbXApLT5udW1fZW50cmllczsKQEAgLTYzMSwzNCArNjU4LDQxIEBACiAJCQkJcGdfc3RhcnQsaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzKTsKIAogCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlRyeWluZyB0byBpbnNlcnQgaW50byBsb2NhbC9zdG9sZW4gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyOwogCiAJLyogVGhlIGk4MzAgY2FuJ3QgY2hlY2sgdGhlIEdUVCBmb3IgZW50cmllcyBzaW5jZSBpdHMgcmVhZCBvbmx5LAogCSAqIGRlcGVuZCBvbiB0aGUgY2FsbGVyIHRvIG1ha2UgdGhlIGNvcnJlY3Qgb2Zmc2V0IGRlY2lzaW9ucy4KIAkgKi8KIAotCWlmICgodHlwZSAhPSAwICYmIHR5cGUgIT0gQUdQX1BIWVNfTUVNT1JZKSB8fAotCQkobWVtLT50eXBlICE9IDAgJiYgbWVtLT50eXBlICE9IEFHUF9QSFlTX01FTU9SWSkpCi0JCXJldHVybiAtRUlOVkFMOworCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKKwkJZ290byBvdXRfZXJyOwogCi0JaWYgKCFtZW0tPmlzX2ZsdXNoZWQpIHsKKwltYXNrX3R5cGUgPSBhZ3BfYnJpZGdlLT5kcml2ZXItPmFncF90eXBlX3RvX21hc2tfdHlwZShhZ3BfYnJpZGdlLCB0eXBlKTsKKworCWlmIChtYXNrX3R5cGUgIT0gMCAmJiBtYXNrX3R5cGUgIT0gQUdQX1BIWVNfTUVNT1JZICYmCisJICAgIG1hc2tfdHlwZSAhPSBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWSkKKwkJZ290byBvdXRfZXJyOworCisJaWYgKCFtZW0tPmlzX2ZsdXNoZWQpCiAJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwotCQltZW0tPmlzX2ZsdXNoZWQgPSBUUlVFOwotCX0KIAogCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKIAkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKLQkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLAotCQkJaW50ZWxfaTgzMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhqKjQpKTsKKwkJCQkJCSAgICAgICBtZW0tPm1lbW9yeVtpXSwgbWFza190eXBlKSwKKwkJICAgICAgIGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7CiAJfQogCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGotMSkqNCkpOwotCiAJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKLQlyZXR1cm4gMDsKKworb3V0OgorCXJldCA9IDA7CitvdXRfZXJyOgorCW1lbS0+aXNfZmx1c2hlZCA9IDE7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBpbnRlbF9pODMwX3JlbW92ZV9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sb2ZmX3QgcGdfc3RhcnQsCkBAIC02ODcsNyArNzIxLDYgQEAKIHsKIAlpZiAodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpCiAJCXJldHVybiBhbGxvY19hZ3BwaHlzbWVtX2k4eHgocGdfY291bnQsIHR5cGUpOwotCiAJLyogYWx3YXlzIHJldHVybiBOVUxMIGZvciBvdGhlciBhbGxvY2F0aW9uIHR5cGVzIGZvciBub3cgKi8KIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTczNCw5ICs3NjcsMTEgQEAKIHsKIAlpbnQgaSxqLG51bV9lbnRyaWVzOwogCXZvaWQgKnRlbXA7CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IG1hc2tfdHlwZTsKIAogCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKIAludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOwpAQCAtNzQ2LDMzICs3ODEsNDEgQEAKIAkJCQlwZ19zdGFydCxpbnRlbF9pODMwX3ByaXZhdGUuZ3R0X2VudHJpZXMpOwogCiAJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVHJ5aW5nIHRvIGluc2VydCBpbnRvIGxvY2FsL3N0b2xlbiBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyOwogCX0KIAogCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dF9lcnI7CiAKLQkvKiBUaGUgaTgzMCBjYW4ndCBjaGVjayB0aGUgR1RUIGZvciBlbnRyaWVzIHNpbmNlIGl0cyByZWFkIG9ubHksCisJLyogVGhlIGk5MTUgY2FuJ3QgY2hlY2sgdGhlIEdUVCBmb3IgZW50cmllcyBzaW5jZSBpdHMgcmVhZCBvbmx5LAogCSAqIGRlcGVuZCBvbiB0aGUgY2FsbGVyIHRvIG1ha2UgdGhlIGNvcnJlY3Qgb2Zmc2V0IGRlY2lzaW9ucy4KIAkgKi8KIAotCWlmICgodHlwZSAhPSAwICYmIHR5cGUgIT0gQUdQX1BIWVNfTUVNT1JZKSB8fAotCQkobWVtLT50eXBlICE9IDAgJiYgbWVtLT50eXBlICE9IEFHUF9QSFlTX01FTU9SWSkpCi0JCXJldHVybiAtRUlOVkFMOworCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKKwkJZ290byBvdXRfZXJyOwogCi0JaWYgKCFtZW0tPmlzX2ZsdXNoZWQpIHsKKwltYXNrX3R5cGUgPSBhZ3BfYnJpZGdlLT5kcml2ZXItPmFncF90eXBlX3RvX21hc2tfdHlwZShhZ3BfYnJpZGdlLCB0eXBlKTsKKworCWlmIChtYXNrX3R5cGUgIT0gMCAmJiBtYXNrX3R5cGUgIT0gQUdQX1BIWVNfTUVNT1JZICYmCisJICAgIG1hc2tfdHlwZSAhPSBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWSkKKwkJZ290byBvdXRfZXJyOworCisJaWYgKCFtZW0tPmlzX2ZsdXNoZWQpCiAJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwotCQltZW0tPmlzX2ZsdXNoZWQgPSBUUlVFOwotCX0KIAogCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKIAkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKLQkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLCBpbnRlbF9pODMwX3ByaXZhdGUuZ3R0K2opOworCQkJbWVtLT5tZW1vcnlbaV0sIG1hc2tfdHlwZSksIGludGVsX2k4MzBfcHJpdmF0ZS5ndHQraik7CiAJfQotCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5ndHQrai0xKTsKIAorCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5ndHQrai0xKTsKIAlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOwotCXJldHVybiAwOworCisgb3V0OgorCXJldCA9IDA7Cisgb3V0X2VycjoKKwltZW0tPmlzX2ZsdXNoZWQgPSAxOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxfaTkxNV9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLG9mZl90IHBnX3N0YXJ0LApAQCAtODAzLDcgKzg0Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQgaW50ZWxfaTl4eF9mZXRjaF9zaXplKHZvaWQpCiB7Ci0JaW50IG51bV9zaXplcyA9IHNpemVvZihpbnRlbF9pODMwX3NpemVzKSAvIHNpemVvZigqaW50ZWxfaTgzMF9zaXplcyk7CisJaW50IG51bV9zaXplcyA9IEFSUkFZX1NJWkUoaW50ZWxfaTgzMF9zaXplcyk7CiAJaW50IGFwZXJfc2l6ZTsgLyogc2l6ZSBpbiBtZWdhYnl0ZXMgKi8KIAlpbnQgaTsKIApAQCAtMTM4NCw2ICsxNDI3LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84MTBfZHJpdmVyID0gewpAQCAtMTQwOCw2ICsxNDUyLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGludGVsX2k4MTBfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzgxNV9kcml2ZXIgPSB7CkBAIC0xNDMxLDYgKzE0NzYsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzgzMF9kcml2ZXIgPSB7CkBAIC0xNDU1LDYgKzE1MDEsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84MjBfZHJpdmVyID0gewpAQCAtMTQ3OCw2ICsxNTI1LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84MzBtcF9kcml2ZXIgPSB7CkBAIC0xNTAxLDYgKzE1NDksNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzg0MF9kcml2ZXIgPSB7CkBAIC0xNTI0LDYgKzE1NzMsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzg0NV9kcml2ZXIgPSB7CkBAIC0xNTQ3LDYgKzE1OTcsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzg1MF9kcml2ZXIgPSB7CkBAIC0xNTcwLDYgKzE2MjEsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzg2MF9kcml2ZXIgPSB7CkBAIC0xNTkzLDYgKzE2NDUsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzkxNV9kcml2ZXIgPSB7CkBAIC0xNjE3LDYgKzE2NzAsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF9pOTY1X2RyaXZlciA9IHsKQEAgLTE2NDEsNiArMTY5NSw3IEBACiAgICAgICAgLmZyZWVfYnlfdHlwZSAgICAgICAgICAgPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKICAgICAgICAuYWdwX2FsbG9jX3BhZ2UgICAgICAgICA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAgICAgICAgLmFncF9kZXN0cm95X3BhZ2UgICAgICAgPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisgICAgICAgLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF83NTA1X2RyaXZlciA9IHsKQEAgLTE2NjQsNiArMTcxOSw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBpbnQgZmluZF9pODEwKHUxNiBkZXZpY2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL252aWRpYS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvbnZpZGlhLWFncC5jCmluZGV4IGRmN2YzN2IuLjI1NjMyODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvbnZpZGlhLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvbnZpZGlhLWFncC5jCkBAIC0zMTAsNiArMzEwLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgYWdwX252aWRpYV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9wYXJpc2MtYWdwLmMKaW5kZXggMTdjNTBiMC4uYjdiNDU5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9wYXJpc2MtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9wYXJpc2MtYWdwLmMKQEAgLTIyOCw2ICsyMjgsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiAJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMKaW5kZXggOTAyNjQ4ZC4uOTJkMWRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMKQEAgLTI2NSw2ICsyNjUsNyBAQAogCS5mcmVlX2J5X3R5cGUgPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlID0gc2dpX3Rpb2NhX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UgPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIAkuY2FudF91c2VfYXBlcnR1cmUgPSAxLAogCS5uZWVkc19zY3JhdGNoX3BhZ2UgPSAwLAogCS5udW1fYXBlcnR1cmVfc2l6ZXMgPSAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9zaXMtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3Npcy1hZ3AuYwppbmRleCBhMDBmZDQ4Li42MDM0MmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL3Npcy1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL3Npcy1hZ3AuYwpAQCAtMTQwLDYgKzE0MCw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2RldmljZV9pZHMgc2lzX2FncF9kZXZpY2VfaWRzW10gX19kZXZpbml0ZGF0YSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3N3b3Jrcy1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCmluZGV4IDRmMmQ3ZDkuLjlmNWFlNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCkBAIC00NDQsNiArNDQ0LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgYWdwX3NlcnZlcndvcmtzX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC91bmlub3J0aC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMKaW5kZXggZGZmYzE5My4uNmM0NTcwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC91bmlub3J0aC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCkBAIC01MTAsNiArNTEwLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogCS5jYW50X3VzZV9hcGVydHVyZQk9IDEsCiB9OwogCkBAIC01MzQsNiArNTM1LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogCS5jYW50X3VzZV9hcGVydHVyZQk9IDEsCiAJLm5lZWRzX3NjcmF0Y2hfcGFnZQk9IDEsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC92aWEtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3ZpYS1hZ3AuYwppbmRleCAyZGVkN2EyOC4uMmU3YzA0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC92aWEtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC92aWEtYWdwLmMKQEAgLTE5MSw2ICsxOTEsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIHZpYV9kcml2ZXIgPSB7CkBAIC0yMTQsNiArMjE1LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfZGV2aWNlX2lkcyB2aWFfYWdwX2RldmljZV9pZHNbXSBfX2RldmluaXRkYXRhID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9oYW5nY2hlY2stdGltZXIuYyBiL2RyaXZlcnMvY2hhci9oYW5nY2hlY2stdGltZXIuYwppbmRleCAxYWE5M2E3Li5hZTc2YTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaGFuZ2NoZWNrLXRpbWVyLmMKKysrIGIvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIF9fc2V0dXAoImhjaGVja19kdW1wX3Rhc2tzIiwgaGFuZ2NoZWNrX3BhcnNlX2R1bXBfdGFza3MpOwogI2VuZGlmIC8qIG5vdCBNT0RVTEUgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfUzM5MCkKKyNpZiBkZWZpbmVkKENPTkZJR19TMzkwKQogIyBkZWZpbmUgSEFWRV9NT05PVE9OSUMKICMgZGVmaW5lIFRJTUVSX0ZSRVEgMTAwMDAwMDAwMFVMTAogI2VsaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeXNycS5jIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKaW5kZXggYmU3M2M4MC4uMWQ4YzRhZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeXNycS5jCisrKyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CkBAIC0xNTgsNiArMTU5LDE3IEBACiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NZTkMsCiB9OwogCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfc2hvd190aW1lcnMoaW50IGtleSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzeXNycV90aW1lcl9saXN0X3Nob3coKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd190aW1lcnNfb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd190aW1lcnMsCisJLmhlbHBfbXNnCT0gInNob3ctYWxsLXRpbWVycyhRKSIsCisJLmFjdGlvbl9tc2cJPSAiU2hvdyBQZW5kaW5nIFRpbWVycyIsCit9OworCiBzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfbW91bnRybyhpbnQga2V5LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWVtZXJnZW5jeV9yZW1vdW50KCk7CkBAIC0zMzUsNyArMzQ3LDcgQEAKIAkvKiBvOiBUaGlzIHdpbGwgb2Z0ZW4gYmUgcmVnaXN0ZXJlZCBhcyAnT2ZmJyBhdCBpbml0IHRpbWUgKi8KIAlOVUxMLAkJCQkvKiBvICovCiAJJnN5c3JxX3Nob3dyZWdzX29wLAkJLyogcCAqLwotCU5VTEwsCQkJCS8qIHEgKi8KKwkmc3lzcnFfc2hvd190aW1lcnNfb3AsCQkvKiBxICovCiAJJnN5c3JxX3VucmF3X29wLAkJLyogciAqLwogCSZzeXNycV9zeW5jX29wLAkJCS8qIHMgKi8KIAkmc3lzcnFfc2hvd3N0YXRlX29wLAkJLyogdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwppbmRleCBiNmJjZGJiLi5jY2FhNmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwpAQCAtMTYsMTUgKzE2LDEzIEBACiAgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Mi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvYWNwaV9wbXRtci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLS8qIE51bWJlciBvZiBQTVRNUiB0aWNrcyBleHBlY3RlZCBkdXJpbmcgY2FsaWJyYXRpb24gcnVuICovCi0jZGVmaW5lIFBNVE1SX1RJQ0tTX1BFUl9TRUMgMzU3OTU0NQotCiAvKgogICogVGhlIEkvTyBwb3J0IHRoZSBQTVRNUiByZXNpZGVzIGF0LgogICogVGhlIGxvY2F0aW9uIGlzIGRldGVjdGVkIGR1cmluZyBzZXR1cF9hcmNoKCksCkBAIC0zMiwxNSArMzAsMTMgQEAKICAqLwogdTMyIHBtdG1yX2lvcG9ydCBfX3JlYWRfbW9zdGx5OwogCi0jZGVmaW5lIEFDUElfUE1fTUFTSyBDTE9DS1NPVVJDRV9NQVNLKDI0KSAvKiBsaW1pdCBpdCB0byAyNCBiaXRzICovCi0KIHN0YXRpYyBpbmxpbmUgdTMyIHJlYWRfcG10bXIodm9pZCkKIHsKIAkvKiBtYXNrIHRoZSBvdXRwdXQgdG8gMjQgYml0cyAqLwogCXJldHVybiBpbmwocG10bXJfaW9wb3J0KSAmIEFDUElfUE1fTUFTSzsKIH0KIAotc3RhdGljIGN5Y2xlX3QgYWNwaV9wbV9yZWFkX3ZlcmlmaWVkKHZvaWQpCit1MzIgYWNwaV9wbV9yZWFkX3ZlcmlmaWVkKHZvaWQpCiB7CiAJdTMyIHYxID0gMCwgdjIgPSAwLCB2MyA9IDA7CiAKQEAgLTU3LDcgKzUzLDEyIEBACiAJfSB3aGlsZSAodW5saWtlbHkoKHYxID4gdjIgJiYgdjEgPCB2MykgfHwgKHYyID4gdjMgJiYgdjIgPCB2MSkKIAkJCSAgfHwgKHYzID4gdjEgJiYgdjMgPCB2MikpKTsKIAotCXJldHVybiAoY3ljbGVfdCl2MjsKKwlyZXR1cm4gdjI7Cit9CisKK3N0YXRpYyBjeWNsZV90IGFjcGlfcG1fcmVhZF9zbG93KHZvaWQpCit7CisJcmV0dXJuIChjeWNsZV90KWFjcGlfcG1fcmVhZF92ZXJpZmllZCgpOwogfQogCiBzdGF0aWMgY3ljbGVfdCBhY3BpX3BtX3JlYWQodm9pZCkKQEAgLTcyLDcgKzczLDggQEAKIAkubWFzawkJPSAoY3ljbGVfdClBQ1BJX1BNX01BU0ssCiAJLm11bHQJCT0gMCwgLyp0byBiZSBjYWx1Y2xhdGVkKi8KIAkuc2hpZnQJCT0gMjIsCi0JLmlzX2NvbnRpbnVvdXMJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKKwogfTsKIAogCkBAIC04Nyw3ICs4OSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3BtX25lZWRfd29ya2Fyb3VuZCh2b2lkKQogewotCWNsb2Nrc291cmNlX2FjcGlfcG0ucmVhZCA9IGFjcGlfcG1fcmVhZF92ZXJpZmllZDsKKwljbG9ja3NvdXJjZV9hY3BpX3BtLnJlYWQgPSBhY3BpX3BtX3JlYWRfc2xvdzsKIAljbG9ja3NvdXJjZV9hY3BpX3BtLnJhdGluZyA9IDExMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jeWNsb25lLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYwppbmRleCBiZjRkM2Q1Li40ZjM5MjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYwpAQCAtMzEsNyArMzEsNyBAQAogCS5tYXNrCQk9IENZQ0xPTkVfVElNRVJfTUFTSywKIAkubXVsdAkJPSAxMCwKIAkuc2hpZnQJCT0gMCwKLQkuaXNfY29udGludW91cwk9IDEsCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9jeWNsb25lX2Nsb2Nrc291cmNlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NjeDIwMF9ocnQuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2N4MjAwX2hydC5jCmluZGV4IDIyOTE1Y2MuLmI5MmRhNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2N4MjAwX2hydC5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2N4MjAwX2hydC5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJLnJhdGluZwkJPSAyNTAsCiAJLnJlYWQJCT0gcmVhZF9ocnQsCiAJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCi0JLmlzX2NvbnRpbnVvdXMJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIAkvKiBtdWx0LCBzaGlmdCBhcmUgc2V0IGJhc2VkIG9uIG1oejI3IGZsYWcgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKaW5kZXggNDkxNzc5YS4uZDE1NWU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKKysrIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKQEAgLTE2LDcgKzE2LDcgQEAKIGlmIENQVV9GUkVRCiAKIGNvbmZpZyBDUFVfRlJFUV9UQUJMRQotICAgICAgIGRlZl90cmlzdGF0ZSBtCisgICAgICAgdHJpc3RhdGUKIAogY29uZmlnIENQVV9GUkVRX0RFQlVHCiAJYm9vbCAiRW5hYmxlIENQVWZyZXEgZGVidWdnaW5nIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggYTQ1Y2M4OS4uZjUyZmFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC00MSw4ICs0MSw2NyBAQAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqY3B1ZnJlcV9jcHVfZGF0YVtOUl9DUFVTXTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3B1ZnJlcV9kcml2ZXJfbG9jayk7CiAKKy8qCisgKiBjcHVfcG9saWN5X3J3c2VtIGlzIGEgcGVyIENQVSByZWFkZXItd3JpdGVyIHNlbWFwaG9yZSBkZXNpZ25lZCB0byBjdXJlCisgKiBhbGwgY3B1ZnJlcS9ob3RwbHVnL3dvcmtxdWV1ZS9ldGMgcmVsYXRlZCBsb2NrIGlzc3Vlcy4KKyAqCisgKiBUaGUgcnVsZXMgZm9yIHRoaXMgc2VtYXBob3JlOgorICogLSBBbnkgcm91dGluZSB0aGF0IHdhbnRzIHRvIHJlYWQgZnJvbSB0aGUgcG9saWN5IHN0cnVjdHVyZSB3aWxsCisgKiAgIGRvIGEgZG93bl9yZWFkIG9uIHRoaXMgc2VtYXBob3JlLgorICogLSBBbnkgcm91dGluZSB0aGF0IHdpbGwgd3JpdGUgdG8gdGhlIHBvbGljeSBzdHJ1Y3R1cmUgYW5kL29yIG1heSB0YWtlIGF3YXkKKyAqICAgdGhlIHBvbGljeSBhbHRvZ2V0aGVyIChlZy4gQ1BVIGhvdHBsdWcpLCB3aWxsIGhvbGQgdGhpcyBsb2NrIGluIHdyaXRlCisgKiAgIG1vZGUgYmVmb3JlIGRvaW5nIHNvLgorICoKKyAqIEFkZGl0aW9uYWwgcnVsZXM6CisgKiAtIEFsbCBob2xkZXJzIG9mIHRoZSBsb2NrIHNob3VsZCBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgQ1BVIHRoZXkKKyAqICAgYXJlIGNvbmNlcm5lZCB3aXRoIGFyZSBvbmxpbmUgYWZ0ZXIgdGhleSBnZXQgdGhlIGxvY2suCisgKiAtIEdvdmVybm9yIHJvdXRpbmVzIHRoYXQgY2FuIGJlIGNhbGxlZCBpbiBjcHVmcmVxIGhvdHBsdWcgcGF0aCBzaG91bGQgbm90CisgKiAgIHRha2UgdGhpcyBzZW0gYXMgdG9wIGxldmVsIGhvdHBsdWcgbm90aWZpZXIgaGFuZGxlciB0YWtlcyB0aGlzLgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwb2xpY3lfY3B1KTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgcndfc2VtYXBob3JlLCBjcHVfcG9saWN5X3J3c2VtKTsKKworI2RlZmluZSBsb2NrX3BvbGljeV9yd3NlbShtb2RlLCBjcHUpCQkJCQlcCitpbnQgbG9ja19wb2xpY3lfcndzZW1fIyNtb2RlCQkJCQkJXAorKGludCBjcHUpCQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCWludCBwb2xpY3lfY3B1ID0gcGVyX2NwdShwb2xpY3lfY3B1LCBjcHUpOwkJCVwKKwlCVUdfT04ocG9saWN5X2NwdSA9PSAtMSk7CQkJCQlcCisJZG93bl8jI21vZGUoJnBlcl9jcHUoY3B1X3BvbGljeV9yd3NlbSwgcG9saWN5X2NwdSkpOwkJXAorCWlmICh1bmxpa2VseSghY3B1X29ubGluZShjcHUpKSkgewkJCQlcCisJCXVwXyMjbW9kZSgmcGVyX2NwdShjcHVfcG9saWN5X3J3c2VtLCBwb2xpY3lfY3B1KSk7CVwKKwkJcmV0dXJuIC0xOwkJCQkJCVwKKwl9CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30KKworbG9ja19wb2xpY3lfcndzZW0ocmVhZCwgY3B1KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGxvY2tfcG9saWN5X3J3c2VtX3JlYWQpOworCitsb2NrX3BvbGljeV9yd3NlbSh3cml0ZSwgY3B1KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKTsKKwordm9pZCB1bmxvY2tfcG9saWN5X3J3c2VtX3JlYWQoaW50IGNwdSkKK3sKKwlpbnQgcG9saWN5X2NwdSA9IHBlcl9jcHUocG9saWN5X2NwdSwgY3B1KTsKKwlCVUdfT04ocG9saWN5X2NwdSA9PSAtMSk7CisJdXBfcmVhZCgmcGVyX2NwdShjcHVfcG9saWN5X3J3c2VtLCBwb2xpY3lfY3B1KSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1bmxvY2tfcG9saWN5X3J3c2VtX3JlYWQpOworCit2b2lkIHVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoaW50IGNwdSkKK3sKKwlpbnQgcG9saWN5X2NwdSA9IHBlcl9jcHUocG9saWN5X2NwdSwgY3B1KTsKKwlCVUdfT04ocG9saWN5X2NwdSA9PSAtMSk7CisJdXBfd3JpdGUoJnBlcl9jcHUoY3B1X3BvbGljeV9yd3NlbSwgcG9saWN5X2NwdSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZSk7CisKKwogLyogaW50ZXJuYWwgcHJvdG90eXBlcyAqLwogc3RhdGljIGludCBfX2NwdWZyZXFfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHVuc2lnbmVkIGludCBldmVudCk7CitzdGF0aWMgdW5zaWduZWQgaW50IF9fY3B1ZnJlcV9nZXQodW5zaWduZWQgaW50IGNwdSk7CiBzdGF0aWMgdm9pZCBoYW5kbGVfdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIC8qKgpAQCAtNDE1LDEyICs0NzQsOCBAQAogCWlmIChyZXQgIT0gMSkJCQkJCQkJXAogCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCiAJCQkJCQkJCQlcCi0JbG9ja19jcHVfaG90cGx1ZygpOwkJCQkJCVwKLQltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOwkJCQkJXAogCXJldCA9IF9fY3B1ZnJlcV9zZXRfcG9saWN5KHBvbGljeSwgJm5ld19wb2xpY3kpOwkJXAogCXBvbGljeS0+dXNlcl9wb2xpY3kub2JqZWN0ID0gcG9saWN5LT5vYmplY3Q7CQkJXAotCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsJCQkJCVwKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsJCQkJCQlcCiAJCQkJCQkJCQlcCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwkJCQkJXAogfQpAQCAtNDM0LDcgKzQ4OSw3IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X2NwdWluZm9fY3VyX2ZyZXEgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqIHBvbGljeSwKIAkJCQkJCQljaGFyICpidWYpCiB7Ci0JdW5zaWduZWQgaW50IGN1cl9mcmVxID0gY3B1ZnJlcV9nZXQocG9saWN5LT5jcHUpOworCXVuc2lnbmVkIGludCBjdXJfZnJlcSA9IF9fY3B1ZnJlcV9nZXQocG9saWN5LT5jcHUpOwogCWlmICghY3VyX2ZyZXEpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjx1bmtub3duPiIpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjdXJfZnJlcSk7CkBAIC00NzksMTggKzUzNCwxMiBAQAogCQkJCQkJJm5ld19wb2xpY3kuZ292ZXJub3IpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxvY2tfY3B1X2hvdHBsdWcoKTsKLQogCS8qIERvIG5vdCB1c2UgY3B1ZnJlcV9zZXRfcG9saWN5IGhlcmUgb3IgdGhlIHVzZXJfcG9saWN5Lm1heAogCSAgIHdpbGwgYmUgd3JvbmdseSBvdmVycmlkZGVuICovCi0JbXV0ZXhfbG9jaygmcG9saWN5LT5sb2NrKTsKIAlyZXQgPSBfX2NwdWZyZXFfc2V0X3BvbGljeShwb2xpY3ksICZuZXdfcG9saWN5KTsKIAogCXBvbGljeS0+dXNlcl9wb2xpY3kucG9saWN5ID0gcG9saWN5LT5wb2xpY3k7CiAJcG9saWN5LT51c2VyX3BvbGljeS5nb3Zlcm5vciA9IHBvbGljeS0+Z292ZXJub3I7Ci0JbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOwotCi0JdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNTk1LDExICs2NDQsMTcgQEAKIAlwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQocG9saWN5LT5jcHUpOwogCWlmICghcG9saWN5KQogCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsb2NrX3BvbGljeV9yd3NlbV9yZWFkKHBvbGljeS0+Y3B1KSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKGZhdHRyLT5zaG93KQogCQlyZXQgPSBmYXR0ci0+c2hvdyhwb2xpY3ksIGJ1Zik7CiAJZWxzZQogCQlyZXQgPSAtRUlPOwogCisJdW5sb2NrX3BvbGljeV9yd3NlbV9yZWFkKHBvbGljeS0+Y3B1KTsKKwogCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwogCXJldHVybiByZXQ7CiB9CkBAIC02MTMsMTEgKzY2OCwxNyBAQAogCXBvbGljeSA9IGNwdWZyZXFfY3B1X2dldChwb2xpY3ktPmNwdSk7CiAJaWYgKCFwb2xpY3kpCiAJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKHBvbGljeS0+Y3B1KSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKGZhdHRyLT5zdG9yZSkKIAkJcmV0ID0gZmF0dHItPnN0b3JlKHBvbGljeSwgYnVmLCBjb3VudCk7CiAJZWxzZQogCQlyZXQgPSAtRUlPOwogCisJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShwb2xpY3ktPmNwdSk7CisKIAljcHVmcmVxX2NwdV9wdXQocG9saWN5KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjkxLDggKzc1MiwxMCBAQAogCXBvbGljeS0+Y3B1ID0gY3B1OwogCXBvbGljeS0+Y3B1cyA9IGNwdW1hc2tfb2ZfY3B1KGNwdSk7CiAKLQltdXRleF9pbml0KCZwb2xpY3ktPmxvY2spOwotCW11dGV4X2xvY2soJnBvbGljeS0+bG9jayk7CisJLyogSW5pdGlhbGx5IHNldCBDUFUgaXRzZWxmIGFzIHRoZSBwb2xpY3lfY3B1ICovCisJcGVyX2NwdShwb2xpY3lfY3B1LCBjcHUpID0gY3B1OworCWxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CisKIAlpbml0X2NvbXBsZXRpb24oJnBvbGljeS0+a29ial91bnJlZ2lzdGVyKTsKIAlJTklUX1dPUksoJnBvbGljeS0+dXBkYXRlLCBoYW5kbGVfdXBkYXRlKTsKIApAQCAtNzAyLDcgKzc2NSw3IEBACiAJcmV0ID0gY3B1ZnJlcV9kcml2ZXItPmluaXQocG9saWN5KTsKIAlpZiAocmV0KSB7CiAJCWRwcmludGsoImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7Ci0JCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKKwkJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCkBAIC03MTYsNiArNzc5LDE0IEBACiAJCSAqLwogCQltYW5hZ2VkX3BvbGljeSA9IGNwdWZyZXFfY3B1X2dldChqKTsKIAkJaWYgKHVubGlrZWx5KG1hbmFnZWRfcG9saWN5KSkgeworCisJCQkvKiBTZXQgcHJvcGVyIHBvbGljeV9jcHUgKi8KKwkJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKKwkJCXBlcl9jcHUocG9saWN5X2NwdSwgY3B1KSA9IG1hbmFnZWRfcG9saWN5LT5jcHU7CisKKwkJCWlmIChsb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpIDwgMCkKKwkJCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7CisKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAJCQltYW5hZ2VkX3BvbGljeS0+Y3B1cyA9IHBvbGljeS0+Y3B1czsKIAkJCWNwdWZyZXFfY3B1X2RhdGFbY3B1XSA9IG1hbmFnZWRfcG9saWN5OwpAQCAtNzI2LDEzICs3OTcsMTMgQEAKIAkJCQkJCSZtYW5hZ2VkX3BvbGljeS0+a29iaiwKIAkJCQkJCSJjcHVmcmVxIik7CiAJCQlpZiAocmV0KSB7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOworCQkJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAkJCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7CiAJCQl9CiAKIAkJCWNwdWZyZXFfZGVidWdfZW5hYmxlX3JhdGVsaW1pdCgpOwotCQkJbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOwogCQkJcmV0ID0gMDsKKwkJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAkJCWdvdG8gZXJyX291dF9kcml2ZXJfZXhpdDsgLyogY2FsbCBkcml2ZXItPmV4aXQoKSAqLwogCQl9CiAJfQpAQCAtNzQ2LDcgKzgxNyw3IEBACiAKIAlyZXQgPSBrb2JqZWN0X3JlZ2lzdGVyKCZwb2xpY3ktPmtvYmopOwogCWlmIChyZXQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOworCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CiAJCWdvdG8gZXJyX291dF9kcml2ZXJfZXhpdDsKIAl9CiAJLyogc2V0IHVwIGZpbGVzIGZvciB0aGlzIGNwdSBkZXZpY2UgKi8KQEAgLTc2MSw4ICs4MzIsMTAgQEAKIAkJc3lzZnNfY3JlYXRlX2ZpbGUoJnBvbGljeS0+a29iaiwgJnNjYWxpbmdfY3VyX2ZyZXEuYXR0cik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwotCWZvcl9lYWNoX2NwdV9tYXNrKGosIHBvbGljeS0+Y3B1cykKKwlmb3JfZWFjaF9jcHVfbWFzayhqLCBwb2xpY3ktPmNwdXMpIHsKIAkJY3B1ZnJlcV9jcHVfZGF0YVtqXSA9IHBvbGljeTsKKwkJcGVyX2NwdShwb2xpY3lfY3B1LCBqKSA9IHBvbGljeS0+Y3B1OworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAKIAkvKiBzeW1saW5rIGFmZmVjdGVkIENQVXMgKi8KQEAgLTc3OCwxNCArODUxLDE0IEBACiAJCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZjcHVfc3lzX2Rldi0+a29iaiwgJnBvbGljeS0+a29iaiwKIAkJCQkJImNwdWZyZXEiKTsKIAkJaWYgKHJldCkgewotCQkJbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOworCQkJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXI7CiAJCX0KIAl9CiAKIAlwb2xpY3ktPmdvdmVybm9yID0gTlVMTDsgLyogdG8gYXNzdXJlIHRoYXQgdGhlIHN0YXJ0aW5nIHNlcXVlbmNlIGlzCiAJCQkJICAqIHJ1biBpbiBjcHVmcmVxX3NldF9wb2xpY3kgKi8KLQltdXRleF91bmxvY2soJnBvbGljeS0+bG9jayk7CisJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCiAJLyogc2V0IGRlZmF1bHQgcG9saWN5ICovCiAJcmV0ID0gY3B1ZnJlcV9zZXRfcG9saWN5KCZuZXdfcG9saWN5KTsKQEAgLTgyNiwxMSArODk5LDEzIEBACiAKIAogLyoqCi0gKiBjcHVmcmVxX3JlbW92ZV9kZXYgLSByZW1vdmUgYSBDUFUgZGV2aWNlCisgKiBfX2NwdWZyZXFfcmVtb3ZlX2RldiAtIHJlbW92ZSBhIENQVSBkZXZpY2UKICAqCiAgKiBSZW1vdmVzIHRoZSBjcHVmcmVxIGludGVyZmFjZSBmb3IgYSBDUFUgZGV2aWNlLgorICogQ2FsbGVyIHNob3VsZCBhbHJlYWR5IGhhdmUgcG9saWN5X3J3c2VtIGluIHdyaXRlIG1vZGUgZm9yIHRoaXMgQ1BVLgorICogVGhpcyByb3V0aW5lIGZyZWVzIHRoZSByd3NlbSBiZWZvcmUgcmV0dXJuaW5nLgogICovCi1zdGF0aWMgaW50IGNwdWZyZXFfcmVtb3ZlX2RldiAoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNfZGV2KQorc3RhdGljIGludCBfX2NwdWZyZXFfcmVtb3ZlX2RldiAoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNfZGV2KQogewogCXVuc2lnbmVkIGludCBjcHUgPSBzeXNfZGV2LT5pZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtODQ5LDYgKzkyNCw3IEBACiAJaWYgKCFkYXRhKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdWZyZXFfZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAkJY3B1ZnJlcV9kZWJ1Z19lbmFibGVfcmF0ZWxpbWl0KCk7CisJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWNwdWZyZXFfY3B1X2RhdGFbY3B1XSA9IE5VTEw7CkBAIC04NjUsNiArOTQxLDcgQEAKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJnN5c19kZXYtPmtvYmosICJjcHVmcmVxIik7CiAJCWNwdWZyZXFfY3B1X3B1dChkYXRhKTsKIAkJY3B1ZnJlcV9kZWJ1Z19lbmFibGVfcmF0ZWxpbWl0KCk7CisJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAkJcmV0dXJuIDA7CiAJfQogI2VuZGlmCkBAIC04NzMsNiArOTUwLDcgQEAKIAlpZiAoIWtvYmplY3RfZ2V0KCZkYXRhLT5rb2JqKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAJCWNwdWZyZXFfZGVidWdfZW5hYmxlX3JhdGVsaW1pdCgpOworCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtOTA2LDEwICs5ODQsMTAgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAjZW5kaWYKIAotCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCWlmIChjcHVmcmVxX2RyaXZlci0+dGFyZ2V0KQogCQlfX2NwdWZyZXFfZ292ZXJub3IoZGF0YSwgQ1BVRlJFUV9HT1ZfU1RPUCk7Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAogCWtvYmplY3RfdW5yZWdpc3RlcigmZGF0YS0+a29iaik7CiAKQEAgLTkzMyw2ICsxMDExLDE4IEBACiB9CiAKIAorc3RhdGljIGludCBjcHVmcmVxX3JlbW92ZV9kZXYgKHN0cnVjdCBzeXNfZGV2aWNlICogc3lzX2RldikKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc3lzX2Rldi0+aWQ7CisJaW50IHJldHZhbDsKKwlpZiAodW5saWtlbHkobG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KSkpCisJCUJVRygpOworCisJcmV0dmFsID0gX19jcHVmcmVxX3JlbW92ZV9kZXYoc3lzX2Rldik7CisJcmV0dXJuIHJldHZhbDsKK30KKworCiBzdGF0aWMgdm9pZCBoYW5kbGVfdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9CkBAIC05ODAsOSArMTA3MCwxMiBAQAogCXVuc2lnbmVkIGludCByZXRfZnJlcSA9IDA7CiAKIAlpZiAocG9saWN5KSB7Ci0JCW11dGV4X2xvY2soJnBvbGljeS0+bG9jayk7CisJCWlmICh1bmxpa2VseShsb2NrX3BvbGljeV9yd3NlbV9yZWFkKGNwdSkpKQorCQkJcmV0dXJuIHJldF9mcmVxOworCiAJCXJldF9mcmVxID0gcG9saWN5LT5jdXI7Ci0JCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKKworCQl1bmxvY2tfcG9saWN5X3J3c2VtX3JlYWQoY3B1KTsKIAkJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiAJfQogCkBAIC05OTEsMjQgKzEwODQsMTMgQEAKIEVYUE9SVF9TWU1CT0woY3B1ZnJlcV9xdWlja19nZXQpOwogCiAKLS8qKgotICogY3B1ZnJlcV9nZXQgLSBnZXQgdGhlIGN1cnJlbnQgQ1BVIGZyZXF1ZW5jeSAoaW4ga0h6KQotICogQGNwdTogQ1BVIG51bWJlcgotICoKLSAqIEdldCB0aGUgQ1BVIGN1cnJlbnQgKHN0YXRpYykgQ1BVIGZyZXF1ZW5jeQotICovCi11bnNpZ25lZCBpbnQgY3B1ZnJlcV9nZXQodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jcHVmcmVxX2dldCh1bnNpZ25lZCBpbnQgY3B1KQogewotCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KGNwdSk7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBjcHVmcmVxX2NwdV9kYXRhW2NwdV07CiAJdW5zaWduZWQgaW50IHJldF9mcmVxID0gMDsKIAotCWlmICghcG9saWN5KQotCQlyZXR1cm4gMDsKLQogCWlmICghY3B1ZnJlcV9kcml2ZXItPmdldCkKLQkJZ290byBvdXQ7Ci0KLQltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOworCQlyZXR1cm4gKHJldF9mcmVxKTsKIAogCXJldF9mcmVxID0gY3B1ZnJlcV9kcml2ZXItPmdldChjcHUpOwogCkBAIC0xMDIyLDExICsxMTA0LDMzIEBACiAJCX0KIAl9CiAKLQltdXRleF91bmxvY2soJnBvbGljeS0+bG9jayk7CisJcmV0dXJuIChyZXRfZnJlcSk7Cit9CiAKLW91dDoKKy8qKgorICogY3B1ZnJlcV9nZXQgLSBnZXQgdGhlIGN1cnJlbnQgQ1BVIGZyZXF1ZW5jeSAoaW4ga0h6KQorICogQGNwdTogQ1BVIG51bWJlcgorICoKKyAqIEdldCB0aGUgQ1BVIGN1cnJlbnQgKHN0YXRpYykgQ1BVIGZyZXF1ZW5jeQorICovCit1bnNpZ25lZCBpbnQgY3B1ZnJlcV9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0X2ZyZXEgPSAwOworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KGNwdSk7CisKKwlpZiAoIXBvbGljeSkKKwkJZ290byBvdXQ7CisKKwlpZiAodW5saWtlbHkobG9ja19wb2xpY3lfcndzZW1fcmVhZChjcHUpKSkKKwkJZ290byBvdXRfcG9saWN5OworCisJcmV0X2ZyZXEgPSBfX2NwdWZyZXFfZ2V0KGNwdSk7CisKKwl1bmxvY2tfcG9saWN5X3J3c2VtX3JlYWQoY3B1KTsKKworb3V0X3BvbGljeToKIAljcHVmcmVxX2NwdV9wdXQocG9saWN5KTsKLQorb3V0OgogCXJldHVybiAocmV0X2ZyZXEpOwogfQogRVhQT1JUX1NZTUJPTChjcHVmcmVxX2dldCk7CkBAIC0xMjc4LDcgKzEzODIsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0vKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2tfY3B1X2hvdHBsdWcgaGVsZCAqLwogaW50IF9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQkJICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCkBAIC0xMzA0LDIwICsxNDA3LDE5IEBACiAJaWYgKCFwb2xpY3kpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbG9ja19jcHVfaG90cGx1ZygpOwotCW11dGV4X2xvY2soJnBvbGljeS0+bG9jayk7CisJaWYgKHVubGlrZWx5KGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKHBvbGljeS0+Y3B1KSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0ID0gX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCB0YXJnZXRfZnJlcSwgcmVsYXRpb24pOwogCi0JbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOwotCXVubG9ja19jcHVfaG90cGx1ZygpOworCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUocG9saWN5LT5jcHUpOwogCiAJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZHJpdmVyX3RhcmdldCk7CiAKLWludCBjcHVmcmVxX2RyaXZlcl9nZXRhdmcoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitpbnQgX19jcHVmcmVxX2RyaXZlcl9nZXRhdmcoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTEzMjUsMjAgKzE0MjcsMTUgQEAKIAlpZiAoIXBvbGljeSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOwotCiAJaWYgKGNwdV9vbmxpbmUocG9saWN5LT5jcHUpICYmIGNwdWZyZXFfZHJpdmVyLT5nZXRhdmcpCiAJCXJldCA9IGNwdWZyZXFfZHJpdmVyLT5nZXRhdmcocG9saWN5LT5jcHUpOwogCi0JbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOwotCiAJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZHJpdmVyX2dldGF2Zyk7CitFWFBPUlRfU1lNQk9MX0dQTChfX2NwdWZyZXFfZHJpdmVyX2dldGF2Zyk7CiAKIC8qCi0gKiBMb2NraW5nOiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrX2NwdV9ob3RwbHVnKCkgbG9jayBoZWxkCiAgKiB3aGVuICJldmVudCIgaXMgQ1BVRlJFUV9HT1ZfTElNSVRTCiAgKi8KIApAQCAtMTQyMCw5ICsxNTE3LDcgQEAKIAlpZiAoIWNwdV9wb2xpY3kpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbXV0ZXhfbG9jaygmY3B1X3BvbGljeS0+bG9jayk7CiAJbWVtY3B5KHBvbGljeSwgY3B1X3BvbGljeSwgc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX3BvbGljeSkpOwotCW11dGV4X3VubG9jaygmY3B1X3BvbGljeS0+bG9jayk7CiAKIAljcHVmcmVxX2NwdV9wdXQoY3B1X3BvbGljeSk7CiAJcmV0dXJuIDA7CkBAIC0xNDMzLDcgKzE1MjgsNiBAQAogLyoKICAqIGRhdGEgICA6IGN1cnJlbnQgcG9saWN5LgogICogcG9saWN5IDogcG9saWN5IHRvIGJlIHNldC4KLSAqIExvY2tpbmc6IE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2tfY3B1X2hvdHBsdWcoKSBsb2NrIGhlbGQKICAqLwogc3RhdGljIGludCBfX2NwdWZyZXFfc2V0X3BvbGljeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmRhdGEsCiAJCQkJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCkBAIC0xNTM5LDEwICsxNjMzLDkgQEAKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbG9ja19jcHVfaG90cGx1ZygpOworCWlmICh1bmxpa2VseShsb2NrX3BvbGljeV9yd3NlbV93cml0ZShwb2xpY3ktPmNwdSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIGxvY2sgdGhpcyBDUFUgKi8KLQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKIAogCXJldCA9IF9fY3B1ZnJlcV9zZXRfcG9saWN5KGRhdGEsIHBvbGljeSk7CiAJZGF0YS0+dXNlcl9wb2xpY3kubWluID0gZGF0YS0+bWluOwpAQCAtMTU1MCw5ICsxNjQzLDggQEAKIAlkYXRhLT51c2VyX3BvbGljeS5wb2xpY3kgPSBkYXRhLT5wb2xpY3k7CiAJZGF0YS0+dXNlcl9wb2xpY3kuZ292ZXJub3IgPSBkYXRhLT5nb3Zlcm5vcjsKIAotCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShwb2xpY3ktPmNwdSk7CiAKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIAljcHVmcmVxX2NwdV9wdXQoZGF0YSk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTU3Niw4ICsxNjY4LDggQEAKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PREVWOwogCi0JbG9ja19jcHVfaG90cGx1ZygpOwotCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWlmICh1bmxpa2VseShsb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkcHJpbnRrKCJ1cGRhdGluZyBwb2xpY3kgZm9yIENQVSAldVxuIiwgY3B1KTsKIAltZW1jcHkoJnBvbGljeSwgZGF0YSwgc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX3BvbGljeSkpOwpAQCAtMTYwMiw4ICsxNjk0LDggQEAKIAogCXJldCA9IF9fY3B1ZnJlcV9zZXRfcG9saWN5KGRhdGEsICZwb2xpY3kpOwogCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKKwl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CisKIAljcHVmcmVxX2NwdV9wdXQoZGF0YSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2MTMsMzEgKzE3MDUsMjggQEAKIAkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CiAJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7Ci0Jc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CiAJc3RydWN0IHN5c19kZXZpY2UgKnN5c19kZXY7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CiAKIAlzeXNfZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKLQogCWlmIChzeXNfZGV2KSB7CiAJCXN3aXRjaCAoYWN0aW9uKSB7CiAJCWNhc2UgQ1BVX09OTElORToKIAkJCWNwdWZyZXFfYWRkX2RldihzeXNfZGV2KTsKIAkJCWJyZWFrOwogCQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JCQkvKgotCQkJICogV2UgYXR0ZW1wdCB0byBwdXQgdGhpcyBjcHUgaW4gbG93ZXN0IGZyZXF1ZW5jeQotCQkJICogcG9zc2libGUgYmVmb3JlIGdvaW5nIGRvd24uIFRoaXMgd2lsbCBwZXJtaXQKLQkJCSAqIGhhcmR3YXJlLW1hbmFnZWQgUC1TdGF0ZSB0byBzd2l0Y2ggb3RoZXIgcmVsYXRlZAotCQkJICogdGhyZWFkcyB0byBtaW4gb3IgaGlnaGVyIHNwZWVkcyBpZiBwb3NzaWJsZS4KLQkJCSAqLworCQkJaWYgKHVubGlrZWx5KGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSkpKQorCQkJCUJVRygpOworCiAJCQlwb2xpY3kgPSBjcHVmcmVxX2NwdV9kYXRhW2NwdV07CiAJCQlpZiAocG9saWN5KSB7Ci0JCQkJY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBvbGljeSwgcG9saWN5LT5taW4sCisJCQkJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCBwb2xpY3ktPm1pbiwKIAkJCQkJCUNQVUZSRVFfUkVMQVRJT05fSCk7CiAJCQl9CisJCQlfX2NwdWZyZXFfcmVtb3ZlX2RldihzeXNfZGV2KTsKIAkJCWJyZWFrOwotCQljYXNlIENQVV9ERUFEOgotCQkJY3B1ZnJlcV9yZW1vdmVfZGV2KHN5c19kZXYpOworCQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwkJCWNwdWZyZXFfYWRkX2RldihzeXNfZGV2KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTc1MSwzICsxODQwLDE2IEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKTsKKworc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9jb3JlX2luaXQodm9pZCkKK3sKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlwZXJfY3B1KHBvbGljeV9jcHUsIGNwdSkgPSAtMTsKKwkJaW5pdF9yd3NlbSgmcGVyX2NwdShjcHVfcG9saWN5X3J3c2VtLCBjcHUpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2NvcmVfaW5pdGNhbGwoY3B1ZnJlcV9jb3JlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYwppbmRleCAwNWQ2YzIyLi4yNmY0NDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYwpAQCAtNDI5LDE0ICs0MjksMTIgQEAKIHN0YXRpYyB2b2lkIGRvX2Ric190aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7IAogCWludCBpOwotCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAltdXRleF9sb2NrKCZkYnNfbXV0ZXgpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKIAkJZGJzX2NoZWNrX2NwdShpKTsKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRic193b3JrLCAKIAkJCXVzZWNzX3RvX2ppZmZpZXMoZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSkpOwogCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIH0gCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkYnNfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKaW5kZXggZjY5NzQ0OS4uZDYwYmNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCkBAIC01MiwxOSArNTIsMjAgQEAKIHN0YXRpYyB2b2lkIGRvX2Ric190aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKiBTYW1wbGluZyB0eXBlcyAqLwotZW51bSBkYnNfc2FtcGxlIHtEQlNfTk9STUFMX1NBTVBMRSwgREJTX1NVQl9TQU1QTEV9OworZW51bSB7REJTX05PUk1BTF9TQU1QTEUsIERCU19TVUJfU0FNUExFfTsKIAogc3RydWN0IGNwdV9kYnNfaW5mb19zIHsKIAljcHV0aW1lNjRfdCBwcmV2X2NwdV9pZGxlOwogCWNwdXRpbWU2NF90IHByZXZfY3B1X3dhbGw7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjdXJfcG9saWN5OwogIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7Ci0JZW51bSBkYnNfc2FtcGxlIHNhbXBsZV90eXBlOwotCXVuc2lnbmVkIGludCBlbmFibGU7CiAJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlOwogCXVuc2lnbmVkIGludCBmcmVxX2xvOwogCXVuc2lnbmVkIGludCBmcmVxX2xvX2ppZmZpZXM7CiAJdW5zaWduZWQgaW50IGZyZXFfaGlfamlmZmllczsKKwlpbnQgY3B1OworCXVuc2lnbmVkIGludCBlbmFibGU6MSwKKwkgICAgICAgICAgICAgc2FtcGxlX3R5cGU6MTsKIH07CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9kYnNfaW5mb19zLCBjcHVfZGJzX2luZm8pOwogCkBAIC00MDIsNyArNDAzLDcgQEAKIAlpZiAobG9hZCA8IChkYnNfdHVuZXJzX2lucy51cF90aHJlc2hvbGQgLSAxMCkpIHsKIAkJdW5zaWduZWQgaW50IGZyZXFfbmV4dCwgZnJlcV9jdXI7CiAKLQkJZnJlcV9jdXIgPSBjcHVmcmVxX2RyaXZlcl9nZXRhdmcocG9saWN5KTsKKwkJZnJlcV9jdXIgPSBfX2NwdWZyZXFfZHJpdmVyX2dldGF2Zyhwb2xpY3kpOwogCQlpZiAoIWZyZXFfY3VyKQogCQkJZnJlcV9jdXIgPSBwb2xpY3ktPmN1cjsKIApAQCAtNDIzLDkgKzQyNCwxMSBAQAogCiBzdGF0aWMgdm9pZCBkb19kYnNfdGltZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jc3RydWN0IGNwdV9kYnNfaW5mb19zICpkYnNfaW5mbyA9ICZwZXJfY3B1KGNwdV9kYnNfaW5mbywgY3B1KTsKLQllbnVtIGRic19zYW1wbGUgc2FtcGxlX3R5cGUgPSBkYnNfaW5mby0+c2FtcGxlX3R5cGU7CisJc3RydWN0IGNwdV9kYnNfaW5mb19zICpkYnNfaW5mbyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY3B1X2Ric19pbmZvX3MsIHdvcmsud29yayk7CisJdW5zaWduZWQgaW50IGNwdSA9IGRic19pbmZvLT5jcHU7CisJaW50IHNhbXBsZV90eXBlID0gZGJzX2luZm8tPnNhbXBsZV90eXBlOworCiAJLyogV2Ugd2FudCBhbGwgQ1BVcyB0byBkbyBzYW1wbGluZyBuZWFybHkgb24gc2FtZSBqaWZmeSAqLwogCWludCBkZWxheSA9IHVzZWNzX3RvX2ppZmZpZXMoZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSk7CiAKQEAgLTQzNCwxNSArNDM3LDE5IEBACiAKIAlkZWxheSAtPSBqaWZmaWVzICUgZGVsYXk7CiAKLQlpZiAoIWRic19pbmZvLT5lbmFibGUpCisJaWYgKGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSkgPCAwKQogCQlyZXR1cm47CisKKwlpZiAoIWRic19pbmZvLT5lbmFibGUpIHsKKwkJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOworCQlyZXR1cm47CisJfQorCiAJLyogQ29tbW9uIE5PUk1BTF9TQU1QTEUgc2V0dXAgKi8KIAlkYnNfaW5mby0+c2FtcGxlX3R5cGUgPSBEQlNfTk9STUFMX1NBTVBMRTsKIAlpZiAoIWRic190dW5lcnNfaW5zLnBvd2Vyc2F2ZV9iaWFzIHx8CiAJICAgIHNhbXBsZV90eXBlID09IERCU19OT1JNQUxfU0FNUExFKSB7Ci0JCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAkJZGJzX2NoZWNrX2NwdShkYnNfaW5mbyk7Ci0JCXVubG9ja19jcHVfaG90cGx1ZygpOwogCQlpZiAoZGJzX2luZm8tPmZyZXFfbG8pIHsKIAkJCS8qIFNldHVwIHRpbWVyIGZvciBTVUJfU0FNUExFICovCiAJCQlkYnNfaW5mby0+c2FtcGxlX3R5cGUgPSBEQlNfU1VCX1NBTVBMRTsKQEAgLTQ1NCwyNiArNDYxLDI3IEBACiAJICAgICAgICAgICAgICAgICAgICAgICAgCUNQVUZSRVFfUkVMQVRJT05fSCk7CiAJfQogCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihjcHUsIGtvbmRlbWFuZF93cSwgJmRic19pbmZvLT53b3JrLCBkZWxheSk7CisJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGJzX3RpbWVyX2luaXQodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYnNfdGltZXJfaW5pdChzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKmRic19pbmZvKQogewotCXN0cnVjdCBjcHVfZGJzX2luZm9fcyAqZGJzX2luZm8gPSAmcGVyX2NwdShjcHVfZGJzX2luZm8sIGNwdSk7CiAJLyogV2Ugd2FudCBhbGwgQ1BVcyB0byBkbyBzYW1wbGluZyBuZWFybHkgb24gc2FtZSBqaWZmeSAqLwogCWludCBkZWxheSA9IHVzZWNzX3RvX2ppZmZpZXMoZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSk7CiAJZGVsYXkgLT0gamlmZmllcyAlIGRlbGF5OwogCisJZGJzX2luZm8tPmVuYWJsZSA9IDE7CiAJb25kZW1hbmRfcG93ZXJzYXZlX2JpYXNfaW5pdCgpOwotCUlOSVRfREVMQVlFRF9XT1JLX05BUigmZGJzX2luZm8tPndvcmssIGRvX2Ric190aW1lcik7CiAJZGJzX2luZm8tPnNhbXBsZV90eXBlID0gREJTX05PUk1BTF9TQU1QTEU7Ci0JcXVldWVfZGVsYXllZF93b3JrX29uKGNwdSwga29uZGVtYW5kX3dxLCAmZGJzX2luZm8tPndvcmssIGRlbGF5KTsKKwlJTklUX0RFTEFZRURfV09SS19OQVIoJmRic19pbmZvLT53b3JrLCBkb19kYnNfdGltZXIpOworCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihkYnNfaW5mby0+Y3B1LCBrb25kZW1hbmRfd3EsICZkYnNfaW5mby0+d29yaywKKwkgICAgICAgICAgICAgICAgICAgICAgZGVsYXkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGJzX3RpbWVyX2V4aXQoc3RydWN0IGNwdV9kYnNfaW5mb19zICpkYnNfaW5mbykKIHsKIAlkYnNfaW5mby0+ZW5hYmxlID0gMDsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZkYnNfaW5mby0+d29yayk7Ci0JZmx1c2hfd29ya3F1ZXVlKGtvbmRlbWFuZF93cSk7CiB9CiAKIHN0YXRpYyBpbnQgY3B1ZnJlcV9nb3Zlcm5vcl9kYnMoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCkBAIC01MDIsMjEgKzUxMCw5IEBACiAKIAkJbXV0ZXhfbG9jaygmZGJzX211dGV4KTsKIAkJZGJzX2VuYWJsZSsrOwotCQlpZiAoZGJzX2VuYWJsZSA9PSAxKSB7Ci0JCQlrb25kZW1hbmRfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJrb25kZW1hbmQiKTsKLQkJCWlmICgha29uZGVtYW5kX3dxKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSAiQ3JlYXRpb24gb2Yga29uZGVtYW5kIGZhaWxlZFxuIik7Ci0JCQkJZGJzX2VuYWJsZS0tOwotCQkJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKLQkJCQlyZXR1cm4gLUVOT1NQQzsKLQkJCX0KLQkJfQogCiAJCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZkYnNfYXR0cl9ncm91cCk7CiAJCWlmIChyYykgewotCQkJaWYgKGRic19lbmFibGUgPT0gMSkKLQkJCQlkZXN0cm95X3dvcmtxdWV1ZShrb25kZW1hbmRfd3EpOwogCQkJZGJzX2VuYWJsZS0tOwogCQkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOwogCQkJcmV0dXJuIHJjOwpAQCAtNTMwLDcgKzUyNiw3IEBACiAJCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlID0gZ2V0X2NwdV9pZGxlX3RpbWUoaik7CiAJCQlqX2Ric19pbmZvLT5wcmV2X2NwdV93YWxsID0gZ2V0X2ppZmZpZXNfNjQoKTsKIAkJfQotCQl0aGlzX2Ric19pbmZvLT5lbmFibGUgPSAxOworCQl0aGlzX2Ric19pbmZvLT5jcHUgPSBjcHU7CiAJCS8qCiAJCSAqIFN0YXJ0IHRoZSB0aW1lcnNjaGVkdWxlIHdvcmssIHdoZW4gdGhpcyBnb3Zlcm5vcgogCQkgKiBpcyB1c2VkIGZvciBmaXJzdCB0aW1lCkBAIC01NTAsNyArNTQ2LDcgQEAKIAogCQkJZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSA9IGRlZl9zYW1wbGluZ19yYXRlOwogCQl9Ci0JCWRic190aW1lcl9pbml0KHBvbGljeS0+Y3B1KTsKKwkJZGJzX3RpbWVyX2luaXQodGhpc19kYnNfaW5mbyk7CiAKIAkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOwogCQlicmVhazsKQEAgLTU2MCw5ICs1NTYsNiBAQAogCQlkYnNfdGltZXJfZXhpdCh0aGlzX2Ric19pbmZvKTsKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZkYnNfYXR0cl9ncm91cCk7CiAJCWRic19lbmFibGUtLTsKLQkJaWYgKGRic19lbmFibGUgPT0gMCkKLQkJCWRlc3Ryb3lfd29ya3F1ZXVlKGtvbmRlbWFuZF93cSk7Ci0KIAkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOwogCiAJCWJyZWFrOwpAQCAtNTkxLDEyICs1ODQsMTggQEAKIAogc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9nb3ZfZGJzX2luaXQodm9pZCkKIHsKKwlrb25kZW1hbmRfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJrb25kZW1hbmQiKTsKKwlpZiAoIWtvbmRlbWFuZF93cSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNyZWF0aW9uIG9mIGtvbmRlbWFuZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZ292ZXJub3IoJmNwdWZyZXFfZ292X2Ricyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjcHVmcmVxX2dvdl9kYnNfZXhpdCh2b2lkKQogewogCWNwdWZyZXFfdW5yZWdpc3Rlcl9nb3Zlcm5vcigmY3B1ZnJlcV9nb3ZfZGJzKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShrb25kZW1hbmRfd3EpOwogfQogCiAKQEAgLTYwOCwzICs2MDcsNCBAQAogCiBtb2R1bGVfaW5pdChjcHVmcmVxX2dvdl9kYnNfaW5pdCk7CiBtb2R1bGVfZXhpdChjcHVmcmVxX2dvdl9kYnNfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCmluZGV4IDkxYWQzNDIuLmQxYzdjYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwpAQCAtMzcwLDEyICszNzAsMTAgQEAKIAljcHVmcmVxX3VucmVnaXN0ZXJfbm90aWZpZXIoJm5vdGlmaWVyX3RyYW5zX2Jsb2NrLAogCQkJQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKIAl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmY3B1ZnJlcV9zdGF0X2NwdV9ub3RpZmllcik7Ci0JbG9ja19jcHVfaG90cGx1ZygpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCWNwdWZyZXFfc3RhdF9jcHVfY2FsbGJhY2soJmNwdWZyZXFfc3RhdF9jcHVfbm90aWZpZXIsCiAJCQkJCQlDUFVfREVBRCwgKHZvaWQgKikobG9uZyljcHUpOwogCX0KLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIH0KIAogTU9EVUxFX0FVVEhPUiAoIlpvdSBOYW4gaGFpIDxuYW5oYWkuem91QGludGVsLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKaW5kZXggMmE0ZWIwYi4uODYwMzQ1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKQEAgLTcxLDcgKzcxLDYgQEAKIAogCWRwcmludGsoImNwdWZyZXFfc2V0IGZvciBjcHUgJXUsIGZyZXEgJXUga0h6XG4iLCBwb2xpY3ktPmNwdSwgZnJlcSk7CiAKLQlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJbXV0ZXhfbG9jaygmdXNlcnNwYWNlX211dGV4KTsKIAlpZiAoIWNwdV9pc19tYW5hZ2VkW3BvbGljeS0+Y3B1XSkKIAkJZ290byBlcnI7CkBAIC05NCw3ICs5Myw2IEBACiAKICBlcnI6CiAJbXV0ZXhfdW5sb2NrKCZ1c2Vyc3BhY2VfbXV0ZXgpOwotCXVubG9ja19jcHVfaG90cGx1ZygpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKaW5kZXggY2QyNTFlZi4uMGEyNmUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKQEAgLTU0Niw3ICs1NDYsNyBAQAogCQkJdHMtPnNwaS0+ZGV2LmJ1c19pZCwgdHMtPnRjLmlnbm9yZSwgUnQpOwogI2VuZGlmCiAJCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfUEVSSU9EKSwKLQkJCSAgICAgIEhSVElNRVJfUkVMKTsKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9SRUwpOwogCQlyZXR1cm47CiAJfQogCkBAIC01NzgsNyArNTc4LDggQEAKICNlbmRpZgogCX0KIAotCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfUEVSSU9EKSwgSFJUSU1FUl9SRUwpOworCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfUEVSSU9EKSwKKwkJCUhSVElNRVJfTU9ERV9SRUwpOwogfQogCiBzdGF0aWMgaW50IGFkczc4NDZfZGVib3VuY2Uodm9pZCAqYWRzLCBpbnQgZGF0YV9pZHgsIGludCAqdmFsKQpAQCAtNjY3LDcgKzY2OCw3IEBACiAJCQkJc3RhdHVzKTsKIH0KIAotc3RhdGljIGludCBhZHM3ODQ2X3RpbWVyKHN0cnVjdCBocnRpbWVyICpoYW5kbGUpCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgYWRzNzg0Nl90aW1lcihzdHJ1Y3QgaHJ0aW1lciAqaGFuZGxlKQogewogCXN0cnVjdCBhZHM3ODQ2CSp0cyA9IGNvbnRhaW5lcl9vZihoYW5kbGUsIHN0cnVjdCBhZHM3ODQ2LCB0aW1lcik7CiAJaW50CQlzdGF0dXMgPSAwOwpAQCAtNzI0LDcgKzcyNSw3IEBACiAJCQlkaXNhYmxlX2lycSh0cy0+c3BpLT5pcnEpOwogCQkJdHMtPnBlbmRpbmcgPSAxOwogCQkJaHJ0aW1lcl9zdGFydCgmdHMtPnRpbWVyLCBrdGltZV9zZXQoMCwgVFNfUE9MTF9ERUxBWSksCi0JCQkJCUhSVElNRVJfUkVMKTsKKwkJCQkJSFJUSU1FUl9NT0RFX1JFTCk7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHMtPmxvY2ssIGZsYWdzKTsKQEAgLTg2Miw3ICs4NjMsNyBAQAogCXRzLT5zcGkgPSBzcGk7CiAJdHMtPmlucHV0ID0gaW5wdXRfZGV2OwogCi0JaHJ0aW1lcl9pbml0KCZ0cy0+dGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9SRUwpOworCWhydGltZXJfaW5pdCgmdHMtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCXRzLT50aW1lci5mdW5jdGlvbiA9IGFkczc4NDZfdGltZXI7CiAKIAlzcGluX2xvY2tfaW5pdCgmdHMtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvTWFrZWZpbGUgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9NYWtlZmlsZQppbmRleCA4MzViODA2Li4wNzdlMjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9NYWtlZmlsZQpAQCAtNSw0ICs1LDQgQEAKIAogb2JqLSQoQ09ORklHX0dJR0FTRVRfTTEwNSkgKz0gdXNiX2dpZ2FzZXQubyBnaWdhc2V0Lm8KIG9iai0kKENPTkZJR19HSUdBU0VUX0JBU0UpICs9IGJhc19naWdhc2V0Lm8gZ2lnYXNldC5vCi1vYmotJChDT05GSUdfR0lHQVNFVF9NMTA1KSArPSBzZXJfZ2lnYXNldC5vIGdpZ2FzZXQubworb2JqLSQoQ09ORklHX0dJR0FTRVRfTTEwMSkgKz0gc2VyX2dpZ2FzZXQubyBnaWdhc2V0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggYmVkYWU0YS4uODBiMTk5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTEwNyw0ICsxMDcsMTkgQEAKIAogCSAgSWYgeW91IGhhdmUgYW4gTVNJIFMyNzAgbGFwdG9wLCBzYXkgWSBvciBNIGhlcmUuCiAKK2NvbmZpZyBTT05ZX0xBUFRPUAorCXRyaXN0YXRlICJTb255IExhcHRvcCBFeHRyYXMiCisJZGVwZW5kcyBvbiBYODYgJiYgQUNQSQorCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJICAtLS1oZWxwLS0tCisJICBUaGlzIG1pbmktZHJpdmVyIGRyaXZlcyB0aGUgU05DIGRldmljZSBwcmVzZW50IGluIHRoZSBBQ1BJIEJJT1Mgb2YKKwkgIHRoZSBTb255IFZhaW8gbGFwdG9wcy4KKworCSAgSXQgZ2l2ZXMgYWNjZXNzIHRvIHNvbWUgZXh0cmEgbGFwdG9wIGZ1bmN0aW9uYWxpdGllcy4gSW4gaXRzIGN1cnJlbnQKKwkgIGZvcm0sIHRoaXMgZHJpdmVyIGxldCB0aGUgdXNlciBzZXQgb3IgcXVlcnkgdGhlIHNjcmVlbiBicmlnaHRuZXNzCisJICB0aHJvdWdoIHRoZSBiYWNrbGlnaHQgc3Vic3lzdGVtIGFuZCByZW1vdmUvYXBwbHkgcG93ZXIgdG8gc29tZQorCSAgZGV2aWNlcy4KKworCSAgUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvbnktbGFwdG9wLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCAzNWRhNTNjLi43NzkzY2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC0xMSwzICsxMSw0IEBACiBvYmotJChDT05GSUdfVElGTV9DT1JFKSAgICAgICAJKz0gdGlmbV9jb3JlLm8KIG9iai0kKENPTkZJR19USUZNXzdYWDEpICAgICAgIAkrPSB0aWZtXzd4eDEubwogb2JqLSQoQ09ORklHX1NHSV9JT0M0KQkJKz0gaW9jNC5vCitvYmotJChDT05GSUdfU09OWV9MQVBUT1ApCSs9IHNvbnktbGFwdG9wLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hc3VzLWxhcHRvcC5jIGIvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMKaW5kZXggODYxYzM5OS4uZTRlMmI3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMKQEAgLTEwODgsMTEgKzEwODgsNiBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCkgewotCQlwcmludGsoQVNVU19FUlIgIlVzaW5nIGdlbmVyaWMgaG90a2V5IGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYXN1c19ob3RrX2RyaXZlcik7CiAJaWYgKHJlc3VsdCA8IDApCiAJCXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc29ueS1sYXB0b3AuYyBiL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmJlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2Mvc29ueS1sYXB0b3AuYwpAQCAtMCwwICsxLDU2MiBAQAorLyoKKyAqIEFDUEkgU29ueSBOb3RlYm9vayBDb250cm9sIERyaXZlciAoU05DKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0dGlhIERvbmdpbGkgPG1hbGF0dGlhQGxpbnV4Lml0PgorICoKKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGluc3BpcmVkIGZyb20gYXN1c19hY3BpLmMgYW5kIGlibV9hY3BpLmMKKyAqIHdoaWNoIGFyZSBjb3B5cmlnaHRlZCBieSB0aGVpciByZXNwZWN0aXZlIGF1dGhvcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgQUNQSV9TTkNfQ0xBU1MJCSJzb255IgorI2RlZmluZSBBQ1BJX1NOQ19ISUQJCSJTTlk1MDAxIgorI2RlZmluZSBBQ1BJX1NOQ19EUklWRVJfTkFNRQkiQUNQSSBTb255IE5vdGVib29rIENvbnRyb2wgRHJpdmVyIHYwLjQiCisKKy8qIHRoZSBkZXZpY2UgdXNlcyAxLWJhc2VkIHZhbHVlcywgd2hpbGUgdGhlIGJhY2tsaWdodCBzdWJzeXN0ZW0gdXNlcworICAgMC1iYXNlZCB2YWx1ZXMgKi8KKyNkZWZpbmUgU09OWV9NQVhfQlJJR0hUTkVTUwk4CisKKyNkZWZpbmUgTE9HX1BGWAkJCUtFUk5fV0FSTklORyAic29ueS1sYXB0b3A6ICIKKworTU9EVUxFX0FVVEhPUigiU3RlbGlhbiBQb3AsIE1hdHRpYSBEb25naWxpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9TTkNfRFJJVkVSX05BTUUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCB0aGlzIHRvIDEgKGFuZCBSVEZNKSBpZiB5b3Ugd2FudCB0byBoZWxwICIKKwkJICJ0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIiKTsKKworc3RhdGljIHNzaXplX3Qgc29ueV9hY3BpX3Nob3coc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqLAorCQkJICAgICAgY2hhciAqKTsKK3N0YXRpYyBzc2l6ZV90IHNvbnlfYWNwaV9zdG9yZShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICosCisJCQkgICAgICAgY29uc3QgY2hhciAqLCBzaXplX3QpOworc3RhdGljIGludCBib29sZWFuX3ZhbGlkYXRlKGNvbnN0IGludCwgY29uc3QgaW50KTsKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19kZWZhdWx0X3ZhbGlkYXRlKGNvbnN0IGludCwgY29uc3QgaW50KTsKKworI2RlZmluZSBTTkNfVkFMSURBVEVfSU4JCTAKKyNkZWZpbmUgU05DX1ZBTElEQVRFX09VVAkxCisKK3N0cnVjdCBzb255X2FjcGlfdmFsdWUgeworCWNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIHRoZSBlbnRyeSAqLworCWNoYXIgKiphY3BpZ2V0OwkJLyogbmFtZXMgb2YgdGhlIEFDUEkgZ2V0IGZ1bmN0aW9uICovCisJY2hhciAqKmFjcGlzZXQ7CQkvKiBuYW1lcyBvZiB0aGUgQUNQSSBzZXQgZnVuY3Rpb24gKi8KKwlpbnQgKCp2YWxpZGF0ZSkoY29uc3QgaW50LCBjb25zdCBpbnQpOwkvKiBpbnB1dC9vdXRwdXQgdmFsaWRhdGlvbiAqLworCWludCB2YWx1ZTsJCS8qIGN1cnJlbnQgc2V0dGluZyAqLworCWludCB2YWxpZDsJCS8qIEhhcyBldmVyIGJlZW4gc2V0ICovCisJaW50IGRlYnVnOwkJLyogYWN0aXZlIG9ubHkgaW4gZGVidWcgbW9kZSA/ICovCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2YXR0cjsJLyogc3lzZnMgYXRyaWJ1dGUgKi8KK307CisKKyNkZWZpbmUgSEFORExFX05BTUVTKF9uYW1lLCBfdmFsdWVzLi4uKSBcCisJc3RhdGljIGNoYXIgKnNuY18jI19uYW1lW10gPSB7IF92YWx1ZXMsIE5VTEwgfQorCisjZGVmaW5lIFNPTllfQUNQSV9WQUxVRShfbmFtZSwgX2dldHRlcnMsIF9zZXR0ZXJzLCBfdmFsaWRhdGUsIF9kZWJ1ZykgXAorCXsgXAorCQkubmFtZQkJPSBfX3N0cmluZ2lmeShfbmFtZSksIFwKKwkJLmFjcGlnZXQJPSBfZ2V0dGVycywgXAorCQkuYWNwaXNldAk9IF9zZXR0ZXJzLCBcCisJCS52YWxpZGF0ZQk9IF92YWxpZGF0ZSwgXAorCQkuZGVidWcJCT0gX2RlYnVnLCBcCisJCS5kZXZhdHRyCT0gX19BVFRSKF9uYW1lLCAwLCBzb255X2FjcGlfc2hvdywgc29ueV9hY3BpX3N0b3JlKSwgXAorCX0KKworI2RlZmluZSBTT05ZX0FDUElfVkFMVUVfTlVMTAl7IC5uYW1lID0gTlVMTCB9CisKK0hBTkRMRV9OQU1FUyhmbmtleV9nZXQsICJHSEtFIik7CisKK0hBTkRMRV9OQU1FUyhicmlnaHRuZXNzX2RlZl9nZXQsICJHUEJSIik7CitIQU5ETEVfTkFNRVMoYnJpZ2h0bmVzc19kZWZfc2V0LCAiU1BCUiIpOworCitIQU5ETEVfTkFNRVMoY2Rwb3dlcl9nZXQsICJHQ0RQIik7CitIQU5ETEVfTkFNRVMoY2Rwb3dlcl9zZXQsICJTQ0RQIiwgIkNEUFciKTsKKworSEFORExFX05BTUVTKGF1ZGlvcG93ZXJfZ2V0LCAiR0FaUCIpOworSEFORExFX05BTUVTKGF1ZGlvcG93ZXJfc2V0LCAiQVpQVyIpOworCitIQU5ETEVfTkFNRVMobGFucG93ZXJfZ2V0LCAiR0xOUCIpOworSEFORExFX05BTUVTKGxhbnBvd2VyX3NldCwgIkxOUFciKTsKKworSEFORExFX05BTUVTKFBJRF9nZXQsICJHUElEIik7CisKK0hBTkRMRV9OQU1FUyhDVFJfZ2V0LCAiR0NUUiIpOworSEFORExFX05BTUVTKENUUl9zZXQsICJTQ1RSIik7CisKK0hBTkRMRV9OQU1FUyhQQ1JfZ2V0LCAiR1BDUiIpOworSEFORExFX05BTUVTKFBDUl9zZXQsICJTUENSIik7CisKK0hBTkRMRV9OQU1FUyhDTUlfZ2V0LCAiR0NNSSIpOworSEFORExFX05BTUVTKENNSV9zZXQsICJTQ01JIik7CisKK3N0YXRpYyBzdHJ1Y3Qgc29ueV9hY3BpX3ZhbHVlIHNvbnlfYWNwaV92YWx1ZXNbXSA9IHsKKwlTT05ZX0FDUElfVkFMVUUoYnJpZ2h0bmVzc19kZWZhdWx0LCBzbmNfYnJpZ2h0bmVzc19kZWZfZ2V0LAorCQkJc25jX2JyaWdodG5lc3NfZGVmX3NldCwgYnJpZ2h0bmVzc19kZWZhdWx0X3ZhbGlkYXRlLCAwKSwKKwlTT05ZX0FDUElfVkFMVUUoZm5rZXksIHNuY19mbmtleV9nZXQsIE5VTEwsIE5VTEwsIDApLAorCVNPTllfQUNQSV9WQUxVRShjZHBvd2VyLCBzbmNfY2Rwb3dlcl9nZXQsIHNuY19jZHBvd2VyX3NldCwgYm9vbGVhbl92YWxpZGF0ZSwgMCksCisJU09OWV9BQ1BJX1ZBTFVFKGF1ZGlvcG93ZXIsIHNuY19hdWRpb3Bvd2VyX2dldCwgc25jX2F1ZGlvcG93ZXJfc2V0LAorCQkJYm9vbGVhbl92YWxpZGF0ZSwgMCksCisJU09OWV9BQ1BJX1ZBTFVFKGxhbnBvd2VyLCBzbmNfbGFucG93ZXJfZ2V0LCBzbmNfbGFucG93ZXJfc2V0LAorCQkJYm9vbGVhbl92YWxpZGF0ZSwgMSksCisJLyogdW5rbm93biBtZXRob2RzICovCisJU09OWV9BQ1BJX1ZBTFVFKFBJRCwgc25jX1BJRF9nZXQsIE5VTEwsIE5VTEwsIDEpLAorCVNPTllfQUNQSV9WQUxVRShDVFIsIHNuY19DVFJfZ2V0LCBzbmNfQ1RSX3NldCwgTlVMTCwgMSksCisJU09OWV9BQ1BJX1ZBTFVFKFBDUiwgc25jX1BDUl9nZXQsIHNuY19QQ1Jfc2V0LCBOVUxMLCAxKSwKKwlTT05ZX0FDUElfVkFMVUUoQ01JLCBzbmNfQ01JX2dldCwgc25jX0NNSV9zZXQsIE5VTEwsIDEpLAorCVNPTllfQUNQSV9WQUxVRV9OVUxMCit9OworCitzdGF0aWMgYWNwaV9oYW5kbGUgc29ueV9hY3BpX2hhbmRsZTsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnNvbnlfYWNwaV9hY3BpX2RldmljZSA9IE5VTEw7CisKKy8qCisgKiBhY3BpX2V2YWx1YXRlX29iamVjdCB3cmFwcGVycworICovCitzdGF0aWMgaW50IGFjcGlfY2FsbGdldGZ1bmMoYWNwaV9oYW5kbGUgaGFuZGxlLCBjaGFyICpuYW1lLCBpbnQgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0OworCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmo7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJb3V0cHV0Lmxlbmd0aCA9IHNpemVvZihvdXRfb2JqKTsKKwlvdXRwdXQucG9pbnRlciA9ICZvdXRfb2JqOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBuYW1lLCBOVUxMLCAmb3V0cHV0KTsKKwlpZiAoKHN0YXR1cyA9PSBBRV9PSykgJiYgKG91dF9vYmoudHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKKwkJKnJlc3VsdCA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKExPR19QRlggImFjcGlfY2FsbHJlYWRmdW5jIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9jYWxsc2V0ZnVuYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSwKKwkJCSAgICBpbnQgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqOworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7CisJdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlwYXJhbXMuY291bnQgPSAxOworCXBhcmFtcy5wb2ludGVyID0gJmluX29iajsKKwlpbl9vYmoudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCWluX29iai5pbnRlZ2VyLnZhbHVlID0gdmFsdWU7CisKKwlvdXRwdXQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOworCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIG5hbWUsICZwYXJhbXMsICZvdXRwdXQpOworCWlmIChzdGF0dXMgPT0gQUVfT0spIHsKKwkJaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisJCQlpZiAob3V0X29iai50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCQkJcHJpbnRrKExPR19QRlggImFjcGlfZXZhbHVhdGVfb2JqZWN0IGJhZCAiCisJCQkJICAgICAgICJyZXR1cm4gdHlwZVxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJKnJlc3VsdCA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoTE9HX1BGWCAiYWNwaV9ldmFsdWF0ZV9vYmplY3QgZmFpbGVkXG4iKTsKKworCXJldHVybiAtMTsKK30KKworLyoKKyAqIHNvbnlfYWNwaV92YWx1ZXMgaW5wdXQvb3V0cHV0IHZhbGlkYXRlIGZ1bmN0aW9ucworICovCisKKy8qIGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZToKKyAqCisgKiBtYW5pcHVsYXRlIGlucHV0IG91dHB1dCB2YWx1ZXMgdG8ga2VlcCBjb25zaXN0ZW5jeSB3aXRoIHRoZQorICogYmFja2xpZ2h0IGZyYW1ld29yayBmb3Igd2hpY2ggYnJpZ2h0bmVzcyB2YWx1ZXMgYXJlIDAtYmFzZWQuCisgKi8KK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19kZWZhdWx0X3ZhbGlkYXRlKGNvbnN0IGludCBkaXJlY3Rpb24sIGNvbnN0IGludCB2YWx1ZSkKK3sKKwlzd2l0Y2ggKGRpcmVjdGlvbikgeworCQljYXNlIFNOQ19WQUxJREFURV9PVVQ6CisJCQlyZXR1cm4gdmFsdWUgLSAxOworCQljYXNlIFNOQ19WQUxJREFURV9JTjoKKwkJCWlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDwgU09OWV9NQVhfQlJJR0hUTkVTUykKKwkJCQlyZXR1cm4gdmFsdWUgKyAxOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogYm9vbGVhbl92YWxpZGF0ZToKKyAqCisgKiBvbiBpbnB1dCB2YWxpZGF0ZSBib29sZWFuIHZhbHVlcyAwLzEsIG9uIG91dHB1dCBqdXN0IHBhc3MgdGhlCisgKiByZWNlaXZlZCB2YWx1ZS4KKyAqLworc3RhdGljIGludCBib29sZWFuX3ZhbGlkYXRlKGNvbnN0IGludCBkaXJlY3Rpb24sIGNvbnN0IGludCB2YWx1ZSkKK3sKKwlpZiAoZGlyZWN0aW9uID09IFNOQ19WQUxJREFURV9JTikgeworCQlpZiAodmFsdWUgIT0gMCAmJiB2YWx1ZSAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIFN5c2ZzIHNob3cvc3RvcmUgY29tbW9uIHRvIGFsbCBzb255X2FjcGlfdmFsdWVzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNvbnlfYWNwaV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWZmZXIpCit7CisJaW50IHZhbHVlOworCXN0cnVjdCBzb255X2FjcGlfdmFsdWUgKml0ZW0gPQorCSAgICBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHNvbnlfYWNwaV92YWx1ZSwgZGV2YXR0cik7CisKKwlpZiAoISppdGVtLT5hY3BpZ2V0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChhY3BpX2NhbGxnZXRmdW5jKHNvbnlfYWNwaV9oYW5kbGUsICppdGVtLT5hY3BpZ2V0LCAmdmFsdWUpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoaXRlbS0+dmFsaWRhdGUpCisJCXZhbHVlID0gaXRlbS0+dmFsaWRhdGUoU05DX1ZBTElEQVRFX09VVCwgdmFsdWUpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc29ueV9hY3BpX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgdmFsdWU7CisJc3RydWN0IHNvbnlfYWNwaV92YWx1ZSAqaXRlbSA9CisJICAgIGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgc29ueV9hY3BpX3ZhbHVlLCBkZXZhdHRyKTsKKworCWlmICghaXRlbS0+YWNwaXNldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoY291bnQgPiAzMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlciwgTlVMTCwgMTApOworCisJaWYgKGl0ZW0tPnZhbGlkYXRlKQorCQl2YWx1ZSA9IGl0ZW0tPnZhbGlkYXRlKFNOQ19WQUxJREFURV9JTiwgdmFsdWUpOworCisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuIHZhbHVlOworCisJaWYgKGFjcGlfY2FsbHNldGZ1bmMoc29ueV9hY3BpX2hhbmRsZSwgKml0ZW0tPmFjcGlzZXQsIHZhbHVlLCBOVUxMKSA8IDApCisJCXJldHVybiAtRUlPOworCWl0ZW0tPnZhbHVlID0gdmFsdWU7CisJaXRlbS0+dmFsaWQgPSAxOworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIFBsYXRmb3JtIGRldmljZQorICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmNwZl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAic29ueS1sYXB0b3AiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgfQorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbmNwZl9kZXZpY2U7CisKK3N0YXRpYyBpbnQgc29ueV9zbmNfcGZfYWRkKHZvaWQpCit7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBzb255X2FjcGlfdmFsdWUgKml0ZW07CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuY3BmX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlzbmNwZl9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvbnktbGFwdG9wIiwgLTEpOworCWlmICghc25jcGZfZGV2aWNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3BsYXRmb3JtX3JlZ2lzdGVyZWQ7CisJfQorCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzbmNwZl9kZXZpY2UpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3BsYXRmb3JtX2FsbG9jZWQ7CisKKwlmb3IgKGl0ZW0gPSBzb255X2FjcGlfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKKworCQlpZiAoIWRlYnVnICYmIGl0ZW0tPmRlYnVnKQorCQkJY29udGludWU7CisKKwkJLyogZmluZCB0aGUgYXZhaWxhYmxlIGFjcGlnZXQgYXMgZGVzY3JpYmVkIGluIHRoZSBEU0RUICovCisJCWZvciAoOyBpdGVtLT5hY3BpZ2V0ICYmICppdGVtLT5hY3BpZ2V0OyArK2l0ZW0tPmFjcGlnZXQpIHsKKwkJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHNvbnlfYWNwaV9oYW5kbGUsCisJCQkJCQkJICppdGVtLT5hY3BpZ2V0LAorCQkJCQkJCSAmaGFuZGxlKSkpIHsKKwkJCQlpZiAoZGVidWcpCisJCQkJCXByaW50ayhMT0dfUEZYICJGb3VuZCAlcyBnZXR0ZXI6ICVzXG4iLAorCQkJCQkgICAgICAgaXRlbS0+bmFtZSwgKml0ZW0tPmFjcGlnZXQpOworCQkJCWl0ZW0tPmRldmF0dHIuYXR0ci5tb2RlIHw9IFNfSVJVR087CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBmaW5kIHRoZSBhdmFpbGFibGUgYWNwaXNldCBhcyBkZXNjcmliZWQgaW4gdGhlIERTRFQgKi8KKwkJZm9yICg7IGl0ZW0tPmFjcGlzZXQgJiYgKml0ZW0tPmFjcGlzZXQ7ICsraXRlbS0+YWNwaXNldCkgeworCQkJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoc29ueV9hY3BpX2hhbmRsZSwKKwkJCQkJCQkgKml0ZW0tPmFjcGlzZXQsCisJCQkJCQkJICZoYW5kbGUpKSkgeworCQkJCWlmIChkZWJ1ZykKKwkJCQkJcHJpbnRrKExPR19QRlggIkZvdW5kICVzIHNldHRlcjogJXNcbiIsCisJCQkJCSAgICAgICBpdGVtLT5uYW1lLCAqaXRlbS0+YWNwaXNldCk7CisJCQkJaXRlbS0+ZGV2YXR0ci5hdHRyLm1vZGUgfD0gU19JV1VTUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpdGVtLT5kZXZhdHRyLmF0dHIubW9kZSAhPSAwKSB7CisJCQlyZXQgPQorCQkJICAgIGRldmljZV9jcmVhdGVfZmlsZSgmc25jcGZfZGV2aWNlLT5kZXYsCisJCQkJCSAgICAgICAmaXRlbS0+ZGV2YXR0cik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0X3N5c2ZzOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKKyAgICAgIG91dF9zeXNmczoKKwlmb3IgKGl0ZW0gPSBzb255X2FjcGlfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzbmNwZl9kZXZpY2UtPmRldiwgJml0ZW0tPmRldmF0dHIpOworCX0KKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHNuY3BmX2RldmljZSk7CisgICAgICBvdXRfcGxhdGZvcm1fYWxsb2NlZDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNuY3BmX2RldmljZSk7CisgICAgICBvdXRfcGxhdGZvcm1fcmVnaXN0ZXJlZDoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25jcGZfZHJpdmVyKTsKKyAgICAgIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzb255X3NuY19wZl9yZW1vdmUodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ueV9hY3BpX3ZhbHVlICppdGVtOworCisJZm9yIChpdGVtID0gc29ueV9hY3BpX3ZhbHVlczsgaXRlbS0+bmFtZTsgKytpdGVtKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmc25jcGZfZGV2aWNlLT5kZXYsICZpdGVtLT5kZXZhdHRyKTsKKwl9CisKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHNuY3BmX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzbmNwZl9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmNwZl9kcml2ZXIpOworfQorCisvKgorICogQmFja2xpZ2h0IGRldmljZQorICovCitzdGF0aWMgaW50IHNvbnlfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXJldHVybiBhY3BpX2NhbGxzZXRmdW5jKHNvbnlfYWNwaV9oYW5kbGUsICJTQlJUIiwKKwkJCQliZC0+cHJvcHMtPmJyaWdodG5lc3MgKyAxLCBOVUxMKTsKK30KKworc3RhdGljIGludCBzb255X2JhY2tsaWdodF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJaW50IHZhbHVlOworCisJaWYgKGFjcGlfY2FsbGdldGZ1bmMoc29ueV9hY3BpX2hhbmRsZSwgIkdCUlQiLCAmdmFsdWUpKQorCQlyZXR1cm4gMDsKKwkvKiBicmlnaHRuZXNzIGxldmVscyBhcmUgMS1iYXNlZCwgd2hpbGUgYmFja2xpZ2h0IG9uZXMgYXJlIDAtYmFzZWQgKi8KKwlyZXR1cm4gdmFsdWUgLSAxOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKnNvbnlfYmFja2xpZ2h0X2RldmljZTsKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgc29ueV9iYWNrbGlnaHRfcHJvcGVydGllcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkudXBkYXRlX3N0YXR1cyA9IHNvbnlfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMsCisJLmdldF9icmlnaHRuZXNzID0gc29ueV9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3MsCisJLm1heF9icmlnaHRuZXNzID0gU09OWV9NQVhfQlJJR0hUTkVTUyAtIDEsCit9OworCisvKgorICogQUNQSSBjYWxsYmFja3MKKyAqLworc3RhdGljIHZvaWQgc29ueV9hY3BpX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlpZiAoZGVidWcpCisJCXByaW50ayhMT0dfUEZYICJzb255X2FjcGlfbm90aWZ5LCBldmVudDogJWRcbiIsIGV2ZW50KTsKKwlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChzb255X2FjcGlfYWNwaV9kZXZpY2UsIDEsIGV2ZW50KTsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHNvbnlfd2Fsa19jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsZXZlbCwKKwkJCQkgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmQ7CisKKwlub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopaGFuZGxlOworCW9wZXJhbmQgPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKW5vZGUtPm9iamVjdDsKKworCXByaW50ayhMT0dfUEZYICJtZXRob2Q6IG5hbWU6ICU0LjRzLCBhcmdzICVYXG4iLCBub2RlLT5uYW1lLmFzY2lpLAorCSAgICAgICAodTMyKSBvcGVyYW5kLT5tZXRob2QucGFyYW1fY291bnQpOworCisJcmV0dXJuIEFFX09LOworfQorCisvKgorICogQUNQSSBkZXZpY2UKKyAqLworc3RhdGljIGludCBzb255X2FjcGlfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzb255X2FjcGlfdmFsdWUgKml0ZW07CisKKwlmb3IgKGl0ZW0gPSBzb255X2FjcGlfdmFsdWVzOyBpdGVtLT5uYW1lOyBpdGVtKyspIHsKKwkJaW50IHJldDsKKworCQlpZiAoIWl0ZW0tPnZhbGlkKQorCQkJY29udGludWU7CisJCXJldCA9IGFjcGlfY2FsbHNldGZ1bmMoc29ueV9hY3BpX2hhbmRsZSwgKml0ZW0tPmFjcGlzZXQsCisJCQkJICAgICAgIGl0ZW0tPnZhbHVlLCBOVUxMKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50aygiJXM6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb255X2FjcGlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgcmVzdWx0OworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKworCXNvbnlfYWNwaV9hY3BpX2RldmljZSA9IGRldmljZTsKKworCXNvbnlfYWNwaV9oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKKworCWlmIChkZWJ1ZykgeworCQlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9NRVRIT0QsIHNvbnlfYWNwaV9oYW5kbGUsCisJCQkJCSAgICAgMSwgc29ueV93YWxrX2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlwcmludGsoTE9HX1BGWCAidW5hYmxlIHRvIHdhbGsgYWNwaSByZXNvdXJjZXNcbiIpOworCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0d2FsazsKKwkJfQorCX0KKworCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihzb255X2FjcGlfaGFuZGxlLAorCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgICBzb255X2FjcGlfbm90aWZ5LCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJpbnRrKExPR19QRlggInVuYWJsZSB0byBpbnN0YWxsIG5vdGlmeSBoYW5kbGVyXG4iKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBvdXR3YWxrOworCX0KKworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHNvbnlfYWNwaV9oYW5kbGUsICJHQlJUIiwgJmhhbmRsZSkpKSB7CisJCXNvbnlfYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInNvbnkiLCBOVUxMLAorCQkJCQkJCQkgIE5VTEwsCisJCQkJCQkJCSAgJnNvbnlfYmFja2xpZ2h0X3Byb3BlcnRpZXMpOworCisJCWlmIChJU19FUlIoc29ueV9iYWNrbGlnaHRfZGV2aWNlKSkgeworCQkJcHJpbnRrKExPR19QRlggInVuYWJsZSB0byByZWdpc3RlciBiYWNrbGlnaHQgZGV2aWNlXG4iKTsKKwkJCXNvbnlfYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7CisJCX0gZWxzZQorCQkJc29ueV9iYWNrbGlnaHRfcHJvcGVydGllcy5icmlnaHRuZXNzID0KKwkJCSAgICBzb255X2JhY2tsaWdodF9nZXRfYnJpZ2h0bmVzcworCQkJICAgIChzb255X2JhY2tsaWdodF9kZXZpY2UpOworCX0KKworCWlmIChzb255X3NuY19wZl9hZGQoKSkKKwkJZ290byBvdXRiYWNrbGlnaHQ7CisKKwlwcmludGsoS0VSTl9JTkZPIEFDUElfU05DX0RSSVZFUl9OQU1FICIgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZFxuIik7CisKKwlyZXR1cm4gMDsKKworICAgICAgb3V0YmFja2xpZ2h0OgorCWlmIChzb255X2JhY2tsaWdodF9kZXZpY2UpCisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihzb255X2JhY2tsaWdodF9kZXZpY2UpOworCisJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoc29ueV9hY3BpX2hhbmRsZSwKKwkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgIHNvbnlfYWNwaV9ub3RpZnkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcHJpbnRrKExPR19QRlggInVuYWJsZSB0byByZW1vdmUgbm90aWZ5IGhhbmRsZXJcbiIpOworICAgICAgb3V0d2FsazoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHNvbnlfYWNwaV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmIChzb255X2JhY2tsaWdodF9kZXZpY2UpCisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihzb255X2JhY2tsaWdodF9kZXZpY2UpOworCisJc29ueV9hY3BpX2FjcGlfZGV2aWNlID0gTlVMTDsKKworCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKHNvbnlfYWNwaV9oYW5kbGUsCisJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICBzb255X2FjcGlfbm90aWZ5KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXByaW50ayhMT0dfUEZYICJ1bmFibGUgdG8gcmVtb3ZlIG5vdGlmeSBoYW5kbGVyXG4iKTsKKworCXNvbnlfc25jX3BmX3JlbW92ZSgpOworCisJcHJpbnRrKEtFUk5fSU5GTyBBQ1BJX1NOQ19EUklWRVJfTkFNRSAiIHN1Y2Nlc3NmdWxseSByZW1vdmVkXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIHNvbnlfYWNwaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBBQ1BJX1NOQ19EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX1NOQ19DTEFTUywKKwkuaWRzID0gQUNQSV9TTkNfSElELAorCS5vcHMgPSB7CisJCS5hZGQgPSBzb255X2FjcGlfYWRkLAorCQkucmVtb3ZlID0gc29ueV9hY3BpX3JlbW92ZSwKKwkJLnJlc3VtZSA9IHNvbnlfYWNwaV9yZXN1bWUsCisJCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzb255X2FjcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJnNvbnlfYWNwaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc29ueV9hY3BpX2V4aXQodm9pZCkKK3sKKwlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmc29ueV9hY3BpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNvbnlfYWNwaV9pbml0KTsKK21vZHVsZV9leGl0KHNvbnlfYWNwaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvS2NvbmZpZyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvS2NvbmZpZwppbmRleCBhZDI3ZTVlLi5iMDQ3NjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9LY29uZmlnCkBAIC0yLDE3ICsyLDUgQEAKICMgUGx1ZyBhbmQgUGxheSBBQ1BJIGNvbmZpZ3VyYXRpb24KICMKIGNvbmZpZyBQTlBBQ1BJCi0JYm9vbCAiUGx1ZyBhbmQgUGxheSBBQ1BJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQTlAgJiYgQUNQSQotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIExpbnV4IHVzZXMgdGhlIFBOUEFDUEkgdG8gYXV0b2RldGVjdCBidWlsdC1pbgotCSAgbWFpbmJvYXJkIHJlc291cmNlcyAoZS5nLiBwYXJhbGxlbCBwb3J0IHJlc291cmNlcykuCi0KLSAgICAgICAgICBTb21lIGZlYXR1cmVzIChlLmcuIHJlYWwgaG90cGx1ZykgYXJlIG5vdCBjdXJyZW50bHkKLSAgICAgICAgICBpbXBsZW1lbnRlZC4KLQotICAgICAgICAgIElmIHlvdSB3b3VsZCBsaWtlIHRoZSBrZXJuZWwgdG8gZGV0ZWN0IGFuZCBhbGxvY2F0ZSByZXNvdXJjZXMgdG8KLSAgICAgICAgICB5b3VyIG1haW5ib2FyZCBkZXZpY2VzIChvbiBzb21lIHN5c3RlbXMgdGhleSBhcmUgZGlzYWJsZWQgYnkgdGhlCi0gICAgICAgICAgQklPUykgc2F5IFkgaGVyZS4gIEFsc28gdGhlIFBOUEFDUEkgY2FuIGhlbHAgcHJldmVudCByZXNvdXJjZQotICAgICAgICAgIGNvbmZsaWN0cyBiZXR3ZWVuIG1haW5ib2FyZCBkZXZpY2VzIGFuZCBvdGhlciBidXMgZGV2aWNlcy4KKwlib29sCisJZGVmYXVsdCAoUE5QICYmIEFDUEkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jIGIvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYwppbmRleCAzMmYwZTNhLi5lNTczYzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKQEAgLTI4MSw4ICsyODEsOCBAQAogCS8qIFJlZ2lzdGVyIGJhY2tsaWdodCBkZXZpY2UgKi8KIAlzbnByaW50ZihibF9uYW1lLCBzaXplb2YoYmxfbmFtZSksICJhcHBsZWRpc3BsYXklZCIsCiAJCWF0b21pY19pbmNfcmV0dXJuKCZjb3VudF9kaXNwbGF5cykgLSAxKTsKLQlwZGF0YS0+YmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKGJsX25hbWUsIE5VTEwsCi0JCXBkYXRhLCAmYXBwbGVkaXNwbGF5X2JsX2RhdGEpOworCXBkYXRhLT5iZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoYmxfbmFtZSwgTlVMTCwgcGRhdGEsCisJCQkJCQkmYXBwbGVkaXNwbGF5X2JsX2RhdGEpOwogCWlmIChJU19FUlIocGRhdGEtPmJkKSkgewogCQllcnIoImFwcGxlZGlzcGxheTogQmFja2xpZ2h0IHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKIAkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCmluZGV4IGNjZWY1NmQuLmVkMzQyNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYwpAQCAtNzkxLDYgKzc5MSw4IEBACiAKIAlpbmZvID0gZmJpbmZvLT5wYXI7CiAJaW5mby0+ZmIgPSBmYmluZm87CisJaW5mby0+ZGV2ID0gJnBkZXYtPmRldjsKKwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGZiaW5mbyk7CiAKIAlkcHJpbnRrKCJkZXZpbml0XG4iKTsKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oIGIvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKaW5kZXggYjM2MDliNy4uNDAzZTNiYSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKKysrIGIvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKQEAgLTQ2Nyw2ICs0NjcsNyBAQAogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICplY3J5cHRmc19oZWFkZXJfY2FjaGVfMjsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZWNyeXB0ZnNfeGF0dHJfY2FjaGU7CiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmVjcnlwdGZzX2xvd2VyX3BhZ2VfY2FjaGU7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmVjcnlwdGZzX2tleV9yZWNvcmRfY2FjaGU7CiAKIGludCBlY3J5cHRmc19pbnRlcnBvc2Uoc3RydWN0IGRlbnRyeSAqaGlkZGVuX2RlbnRyeSwKIAkJICAgICAgIHN0cnVjdCBkZW50cnkgKnRoaXNfZGVudHJ5LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYyBiL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKaW5kZXggODExNTZlOS4uYjU1MGRlYSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYworKysgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCkBAIC0xNjM4LDYgKzE2MzgsOCBAQAogCXJldHVybiByYzsKIH0KIAorc3RydWN0IGttZW1fY2FjaGUgKmVjcnlwdGZzX2tleV9yZWNvcmRfY2FjaGU7CisKIC8qKgogICogZWNyeXB0ZnNfZ2VuZXJhdGVfa2V5X3BhY2tldF9zZXQKICAqIEBkZXN0OiBWaXJ0dWFsIGFkZHJlc3MgZnJvbSB3aGljaCB0byB3cml0ZSB0aGUga2V5IHJlY29yZCBzZXQKQEAgLTE2NjQsNTAgKzE2NjYsNTUgQEAKIAkJJmVjcnlwdGZzX3N1cGVyYmxvY2tfdG9fcHJpdmF0ZSgKIAkJCWVjcnlwdGZzX2RlbnRyeS0+ZF9zYiktPm1vdW50X2NyeXB0X3N0YXQ7CiAJc2l6ZV90IHdyaXR0ZW47Ci0Jc3RydWN0IGVjcnlwdGZzX2tleV9yZWNvcmQga2V5X3JlYzsKKwlzdHJ1Y3QgZWNyeXB0ZnNfa2V5X3JlY29yZCAqa2V5X3JlYzsKIAlpbnQgcmMgPSAwOwogCiAJKCpsZW4pID0gMDsKKwlrZXlfcmVjID0ga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19rZXlfcmVjb3JkX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtleV9yZWMpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CiAJaWYgKG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3RvaykgewogCQlhdXRoX3RvayA9IG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3RvazsKIAkJaWYgKGF1dGhfdG9rLT50b2tlbl90eXBlID09IEVDUllQVEZTX1BBU1NXT1JEKSB7CiAJCQlyYyA9IHdyaXRlX3RhZ18zX3BhY2tldCgoZGVzdF9iYXNlICsgKCpsZW4pKSwKIAkJCQkJCW1heCwgYXV0aF90b2ssCi0JCQkJCQljcnlwdF9zdGF0LCAma2V5X3JlYywKKwkJCQkJCWNyeXB0X3N0YXQsIGtleV9yZWMsCiAJCQkJCQkmd3JpdHRlbik7CiAJCQlpZiAocmMpIHsKIAkJCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiRXJyb3IgIgogCQkJCQkJIndyaXRpbmcgdGFnIDMgcGFja2V0XG4iKTsKLQkJCQlnb3RvIG91dDsKKwkJCQlnb3RvIG91dF9mcmVlOwogCQkJfQogCQkJKCpsZW4pICs9IHdyaXR0ZW47CiAJCQkvKiBXcml0ZSBhdXRoIHRvayBzaWduYXR1cmUgcGFja2V0ICovCiAJCQlyYyA9IHdyaXRlX3RhZ18xMV9wYWNrZXQoCiAJCQkJKGRlc3RfYmFzZSArICgqbGVuKSksCiAJCQkJKG1heCAtICgqbGVuKSksCi0JCQkJa2V5X3JlYy5zaWcsIEVDUllQVEZTX1NJR19TSVpFLCAmd3JpdHRlbik7CisJCQkJa2V5X3JlYy0+c2lnLCBFQ1JZUFRGU19TSUdfU0laRSwgJndyaXR0ZW4pOwogCQkJaWYgKHJjKSB7CiAJCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3Igd3JpdGluZyAiCiAJCQkJCQkiYXV0aCB0b2sgc2lnbmF0dXJlIHBhY2tldFxuIik7Ci0JCQkJZ290byBvdXQ7CisJCQkJZ290byBvdXRfZnJlZTsKIAkJCX0KIAkJCSgqbGVuKSArPSB3cml0dGVuOwogCQl9IGVsc2UgaWYgKGF1dGhfdG9rLT50b2tlbl90eXBlID09IEVDUllQVEZTX1BSSVZBVEVfS0VZKSB7CiAJCQlyYyA9IHdyaXRlX3RhZ18xX3BhY2tldChkZXN0X2Jhc2UgKyAoKmxlbiksCiAJCQkJCQltYXgsIGF1dGhfdG9rLAogCQkJCQkJY3J5cHRfc3RhdCxtb3VudF9jcnlwdF9zdGF0LAotCQkJCQkJJmtleV9yZWMsICZ3cml0dGVuKTsKKwkJCQkJCWtleV9yZWMsICZ3cml0dGVuKTsKIAkJCWlmIChyYykgewogCQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJFcnJvciAiCiAJCQkJCQkid3JpdGluZyB0YWcgMSBwYWNrZXRcbiIpOwotCQkJCWdvdG8gb3V0OworCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9CiAJCQkoKmxlbikgKz0gd3JpdHRlbjsKIAkJfSBlbHNlIHsKIAkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJVbnN1cHBvcnRlZCAiCiAJCQkJCSJhdXRoZW50aWNhdGlvbiB0b2tlbiB0eXBlXG4iKTsKIAkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfZnJlZTsKIAkJfQogCX0gZWxzZQogCQlCVUcoKTsKQEAgLTE3MTcsNiArMTcyNCw5IEBACiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIHdyaXRpbmcgYm91bmRhcnkgYnl0ZVxuIik7CiAJCXJjID0gLUVJTzsKIAl9CisKK291dF9mcmVlOgorCWttZW1fY2FjaGVfZnJlZShlY3J5cHRmc19rZXlfcmVjb3JkX2NhY2hlLCBrZXlfcmVjKTsKIG91dDoKIAlpZiAocmMpCiAJCSgqbGVuKSA9IDA7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tYWluLmMgYi9mcy9lY3J5cHRmcy9tYWluLmMKaW5kZXggMjZmZTQwNS4uODAwNDRkMSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvbWFpbi5jCisrKyBiL2ZzL2VjcnlwdGZzL21haW4uYwpAQCAtNjUxLDYgKzY1MSwxMSBAQAogCQkubmFtZSA9ICJlY3J5cHRmc19sb3dlcl9wYWdlX2NhY2hlIiwKIAkJLnNpemUgPSBQQUdFX0NBQ0hFX1NJWkUsCiAJfSwKKwl7CisJCS5jYWNoZSA9ICZlY3J5cHRmc19rZXlfcmVjb3JkX2NhY2hlLAorCQkubmFtZSA9ICJlY3J5cHRmc19rZXlfcmVjb3JkX2NhY2hlIiwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGVjcnlwdGZzX2tleV9yZWNvcmQpLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBlY3J5cHRmc19mcmVlX2ttZW1fY2FjaGVzKHZvaWQpCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYyBiL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCmluZGV4IDQ3ZDdlN2IuLjNiYWYyNTMgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCisrKyBiL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCkBAIC0xNjksNyArMTY5LDggQEAKIAlpZiAoIW5ld19pZCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnk7IHVuYWJsZSAiCi0JCQkJInRvIHJlZ2lzdGVyIGRhZW1vbiBbJWRdIGZvciB1c2VyXG4iLCBwaWQsIHVpZCk7CisJCQkJInRvIHJlZ2lzdGVyIGRhZW1vbiBbJWRdIGZvciB1c2VyIFslZF1cbiIsCisJCQkJcGlkLCB1aWQpOwogCQlnb3RvIHVubG9jazsKIAl9CiAJaWYgKCFlY3J5cHRmc19maW5kX2RhZW1vbl9pZCh1aWQsICZvbGRfaWQpKSB7CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCAxNjFlMjIyLi5lZTYwY2M0IDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTI2ODgsMTAgKzI2ODgsMTEgQEAKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JaW50IGVyciA9IC1FTk9NRU07CisJaW50IGVycjsKIAljaGFyICprYWRkcjsKIAogcmV0cnk6CisJZXJyID0gLUVOT01FTTsKIAlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShtYXBwaW5nLCAwLCBnZnBfbWFzayk7CiAJaWYgKCFwYWdlKQogCQlnb3RvIGZhaWw7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRhY2wuYyBiL2ZzL25mc2QvbmZzNGFjbC5jCmluZGV4IDVkOTQ1NTUuLjgzMjY3M2IgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGFjbC5jCisrKyBiL2ZzL25mc2QvbmZzNGFjbC5jCkBAIC02MSw5ICs2MSwxMSBAQAogCiAvKiBmbGFncyB1c2VkIHRvIHNpbXVsYXRlIHBvc2l4IGRlZmF1bHQgQUNMcyAqLwogI2RlZmluZSBORlM0X0lOSEVSSVRBTkNFX0ZMQUdTIChORlM0X0FDRV9GSUxFX0lOSEVSSVRfQUNFIFwKLQkJfCBORlM0X0FDRV9ESVJFQ1RPUllfSU5IRVJJVF9BQ0UgfCBORlM0X0FDRV9JTkhFUklUX09OTFlfQUNFKQorCQl8IE5GUzRfQUNFX0RJUkVDVE9SWV9JTkhFUklUX0FDRSkKIAotI2RlZmluZSBORlM0X1NVUFBPUlRFRF9GTEFHUyAoTkZTNF9JTkhFUklUQU5DRV9GTEFHUyB8IE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVApCisjZGVmaW5lIE5GUzRfU1VQUE9SVEVEX0ZMQUdTIChORlM0X0lOSEVSSVRBTkNFX0ZMQUdTIFwKKwkJfCBORlM0X0FDRV9JTkhFUklUX09OTFlfQUNFIFwKKwkJfCBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQKQogCiAjZGVmaW5lIE1BU0tfRVFVQUwobWFzazEsIG1hc2syKSBcCiAJKCAoKG1hc2sxKSAmIE5GUzRfQUNFX01BU0tfQUxMKSA9PSAoKG1hc2syKSAmIE5GUzRfQUNFX01BU0tfQUxMKSApCkBAIC04NywxMiArODksMTkgQEAKIH0KIAogc3RhdGljIHUzMgotZGVueV9tYXNrKHUzMiBhbGxvd19tYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitkZW55X21hc2tfZnJvbV9wb3NpeCh1bnNpZ25lZCBzaG9ydCBwZXJtLCB1MzIgZmxhZ3MpCiB7Ci0JdTMyIHJldCA9IH5hbGxvd19tYXNrICYgfk5GUzRfTUFTS19VTlNVUFA7Ci0JaWYgKCEoZmxhZ3MgJiBORlM0X0FDTF9ESVIpKQotCQlyZXQgJj0gfk5GUzRfQUNFX0RFTEVURV9DSElMRDsKLQlyZXR1cm4gcmV0OworCXUzMiBtYXNrID0gMDsKKworCWlmIChwZXJtICYgQUNMX1JFQUQpCisJCW1hc2sgfD0gTkZTNF9SRUFEX01PREU7CisJaWYgKHBlcm0gJiBBQ0xfV1JJVEUpCisJCW1hc2sgfD0gTkZTNF9XUklURV9NT0RFOworCWlmICgocGVybSAmIEFDTF9XUklURSkgJiYgKGZsYWdzICYgTkZTNF9BQ0xfRElSKSkKKwkJbWFzayB8PSBORlM0X0FDRV9ERUxFVEVfQ0hJTEQ7CisJaWYgKHBlcm0gJiBBQ0xfRVhFQ1VURSkKKwkJbWFzayB8PSBORlM0X0VYRUNVVEVfTU9ERTsKKwlyZXR1cm4gbWFzazsKIH0KIAogLyogWFhYOiBtb2RpZnkgZnVuY3Rpb25zIHRvIHJldHVybiBORlMgZXJyb3JzOyB0aGV5J3JlIG9ubHkgZXZlcgpAQCAtMTI2LDEwOCArMTM1LDE1MSBAQAogfTsKIAogc3RhdGljIHNob3J0IGFjZTJ0eXBlKHN0cnVjdCBuZnM0X2FjZSAqKTsKLXN0YXRpYyBpbnQgX3Bvc2l4X3RvX25mc3Y0X29uZShzdHJ1Y3QgcG9zaXhfYWNsICosIHN0cnVjdCBuZnM0X2FjbCAqLCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKl9uZnN2NF90b19wb3NpeF9vbmUoc3RydWN0IG5mczRfYWNsICosIHVuc2lnbmVkIGludCk7Ci1pbnQgbmZzNF9hY2xfYWRkX2FjZShzdHJ1Y3QgbmZzNF9hY2wgKiwgdTMyLCB1MzIsIHUzMiwgaW50LCB1aWRfdCk7Ci1zdGF0aWMgaW50IG5mczRfYWNsX3NwbGl0KHN0cnVjdCBuZnM0X2FjbCAqLCBzdHJ1Y3QgbmZzNF9hY2wgKik7CitzdGF0aWMgdm9pZCBfcG9zaXhfdG9fbmZzdjRfb25lKHN0cnVjdCBwb3NpeF9hY2wgKiwgc3RydWN0IG5mczRfYWNsICosCisJCQkJdW5zaWduZWQgaW50KTsKK3ZvaWQgbmZzNF9hY2xfYWRkX2FjZShzdHJ1Y3QgbmZzNF9hY2wgKiwgdTMyLCB1MzIsIHUzMiwgaW50LCB1aWRfdCk7CiAKIHN0cnVjdCBuZnM0X2FjbCAqCiBuZnM0X2FjbF9wb3NpeF90b19uZnN2NChzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsICpkcGFjbCwKIAkJCXVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgbmZzNF9hY2wgKmFjbDsKLQlpbnQgZXJyb3IgPSAtRUlOVkFMOworCWludCBzaXplID0gMDsKIAotCWlmICgocGFjbCAhPSBOVUxMICYmCi0JCShwb3NpeF9hY2xfdmFsaWQocGFjbCkgPCAwIHx8IHBhY2wtPmFfY291bnQgPT0gMCkpIHx8Ci0JICAgIChkcGFjbCAhPSBOVUxMICYmCi0JCShwb3NpeF9hY2xfdmFsaWQoZHBhY2wpIDwgMCB8fCBkcGFjbC0+YV9jb3VudCA9PSAwKSkpCi0JCWdvdG8gb3V0X2VycjsKLQotCWFjbCA9IG5mczRfYWNsX25ldygpOwotCWlmIChhY2wgPT0gTlVMTCkgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2VycjsKKwlpZiAocGFjbCkgeworCQlpZiAocG9zaXhfYWNsX3ZhbGlkKHBhY2wpIDwgMCkKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlzaXplICs9IDIqcGFjbC0+YV9jb3VudDsKKwl9CisJaWYgKGRwYWNsKSB7CisJCWlmIChwb3NpeF9hY2xfdmFsaWQoZHBhY2wpIDwgMCkKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlzaXplICs9IDIqZHBhY2wtPmFfY291bnQ7CiAJfQogCi0JaWYgKHBhY2wgIT0gTlVMTCkgewotCQllcnJvciA9IF9wb3NpeF90b19uZnN2NF9vbmUocGFjbCwgYWNsLAotCQkJCQkJZmxhZ3MgJiB+TkZTNF9BQ0xfVFlQRV9ERUZBVUxUKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0X2FjbDsKLQl9CisJLyogQWxsb2NhdGUgZm9yIHdvcnN0IGNhc2U6IG9uZSAoZGVueSwgYWxsb3cpIHBhaXIgZWFjaDogKi8KKwlhY2wgPSBuZnM0X2FjbF9uZXcoc2l6ZSk7CisJaWYgKGFjbCA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWlmIChkcGFjbCAhPSBOVUxMKSB7Ci0JCWVycm9yID0gX3Bvc2l4X3RvX25mc3Y0X29uZShkcGFjbCwgYWNsLAotCQkJCQkJZmxhZ3MgfCBORlM0X0FDTF9UWVBFX0RFRkFVTFQpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBvdXRfYWNsOwotCX0KKwlpZiAocGFjbCkKKwkJX3Bvc2l4X3RvX25mc3Y0X29uZShwYWNsLCBhY2wsIGZsYWdzICYgfk5GUzRfQUNMX1RZUEVfREVGQVVMVCk7CiAKLQlyZXR1cm4gYWNsOwotCi1vdXRfYWNsOgotCW5mczRfYWNsX2ZyZWUoYWNsKTsKLW91dF9lcnI6Ci0JYWNsID0gRVJSX1BUUihlcnJvcik7CisJaWYgKGRwYWNsKQorCQlfcG9zaXhfdG9fbmZzdjRfb25lKGRwYWNsLCBhY2wsIGZsYWdzIHwgTkZTNF9BQ0xfVFlQRV9ERUZBVUxUKTsKIAogCXJldHVybiBhY2w7CiB9CiAKLXN0YXRpYyBpbnQKLW5mczRfYWNsX2FkZF9wYWlyKHN0cnVjdCBuZnM0X2FjbCAqYWNsLCBpbnQgZWZsYWcsIHUzMiBtYXNrLCBpbnQgd2hvdHlwZSwKLQkJdWlkX3Qgb3duZXIsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlpbnQgZXJyb3I7CitzdHJ1Y3QgcG9zaXhfYWNsX3N1bW1hcnkgeworCXVuc2lnbmVkIHNob3J0IG93bmVyOworCXVuc2lnbmVkIHNob3J0IHVzZXJzOworCXVuc2lnbmVkIHNob3J0IGdyb3VwOworCXVuc2lnbmVkIHNob3J0IGdyb3VwczsKKwl1bnNpZ25lZCBzaG9ydCBvdGhlcjsKKwl1bnNpZ25lZCBzaG9ydCBtYXNrOworfTsKIAotCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFLAotCQkJCSBlZmxhZywgbWFzaywgd2hvdHlwZSwgb3duZXIpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAotCQkJCWVmbGFnLCBkZW55X21hc2sobWFzaywgZmxhZ3MpLCB3aG90eXBlLCBvd25lcik7Ci0JcmV0dXJuIGVycm9yOworc3RhdGljIHZvaWQKK3N1bW1hcml6ZV9wb3NpeF9hY2woc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsX3N1bW1hcnkgKnBhcykKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlOworCXBhcy0+dXNlcnMgPSAwOworCXBhcy0+Z3JvdXBzID0gMDsKKwlwYXMtPm1hc2sgPSAwNzsKKworCXBlID0gYWNsLT5hX2VudHJpZXMgKyBhY2wtPmFfY291bnQ7CisKKwlGT1JFQUNIX0FDTF9FTlRSWShwYSwgYWNsLCBwZSkgeworCQlzd2l0Y2ggKHBhLT5lX3RhZykgeworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQkJcGFzLT5vd25lciA9IHBhLT5lX3Blcm07CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQkJcGFzLT5ncm91cCA9IHBhLT5lX3Blcm07CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9VU0VSOgorCQkJCXBhcy0+dXNlcnMgfD0gcGEtPmVfcGVybTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCXBhcy0+Z3JvdXBzIHw9IHBhLT5lX3Blcm07CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9PVEhFUjoKKwkJCQlwYXMtPm90aGVyID0gcGEtPmVfcGVybTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNMX01BU0s6CisJCQkJcGFzLT5tYXNrID0gcGEtPmVfcGVybTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwkvKiBXZSdsbCBvbmx5IGNhcmUgYWJvdXQgZWZmZWN0aXZlIHBlcm1pc3Npb25zOiAqLworCXBhcy0+dXNlcnMgJj0gcGFzLT5tYXNrOworCXBhcy0+Z3JvdXAgJj0gcGFzLT5tYXNrOworCXBhcy0+Z3JvdXBzICY9IHBhcy0+bWFzazsKIH0KIAogLyogV2UgYXNzdW1lIHRoZSBhY2wgaGFzIGJlZW4gdmVyaWZpZWQgd2l0aCBwb3NpeF9hY2xfdmFsaWQuICovCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogX3Bvc2l4X3RvX25mc3Y0X29uZShzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBzdHJ1Y3QgbmZzNF9hY2wgKmFjbCwKIAkJCQkJCXVuc2lnbmVkIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlLCAqZ3JvdXBfb3duZXJfZW50cnk7Ci0JaW50IGVycm9yID0gLUVJTlZBTDsKLQl1MzIgbWFzaywgbWFza19tYXNrOworCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKnBhLCAqZ3JvdXBfb3duZXJfZW50cnk7CisJc3RydWN0IG5mczRfYWNlICphY2U7CisJc3RydWN0IHBvc2l4X2FjbF9zdW1tYXJ5IHBhczsKKwl1bnNpZ25lZCBzaG9ydCBkZW55OwogCWludCBlZmxhZyA9ICgoZmxhZ3MgJiBORlM0X0FDTF9UWVBFX0RFRkFVTFQpID8KIAkJCQkJTkZTNF9JTkhFUklUQU5DRV9GTEFHUyA6IDApOwogCiAJQlVHX09OKHBhY2wtPmFfY291bnQgPCAzKTsKLQlwZSA9IHBhY2wtPmFfZW50cmllcyArIHBhY2wtPmFfY291bnQ7Ci0JcGEgPSBwZSAtIDI7IC8qIGlmIG1hc2sgZW50cnkgZXhpc3RzLCBpdCdzIHNlY29uZCBmcm9tIHRoZSBsYXN0LiAqLwotCWlmIChwYS0+ZV90YWcgPT0gQUNMX01BU0spCi0JCW1hc2tfbWFzayA9IGRlbnlfbWFzayhtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpLCBmbGFncyk7Ci0JZWxzZQotCQltYXNrX21hc2sgPSAwOworCXN1bW1hcml6ZV9wb3NpeF9hY2wocGFjbCwgJnBhcyk7CiAKIAlwYSA9IHBhY2wtPmFfZW50cmllczsKLQlCVUdfT04ocGEtPmVfdGFnICE9IEFDTF9VU0VSX09CSik7Ci0JbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyB8IE5GUzRfQUNMX09XTkVSKTsKLQllcnJvciA9IG5mczRfYWNsX2FkZF9wYWlyKGFjbCwgZWZsYWcsIG1hc2ssIE5GUzRfQUNMX1dIT19PV05FUiwgMCwgZmxhZ3MpOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gb3V0OworCWFjZSA9IGFjbC0+YWNlcyArIGFjbC0+bmFjZXM7CisKKwkvKiBXZSBjb3VsZCBkZW55IGV2ZXJ5dGhpbmcgbm90IGdyYW50ZWQgYnkgdGhlIG93bmVyOiAqLworCWRlbnkgPSB+cGFzLm93bmVyOworCS8qCisJICogYnV0IGl0IGlzIGVxdWl2YWxlbnQgKGFuZCBzaW1wbGVyKSB0byBkZW55IG9ubHkgd2hhdCBpcyBub3QKKwkgKiBncmFudGVkIGJ5IGxhdGVyIGVudHJpZXM6CisJICovCisJZGVueSAmPSBwYXMudXNlcnMgfCBwYXMuZ3JvdXAgfCBwYXMuZ3JvdXBzIHwgcGFzLm90aGVyOworCWlmIChkZW55KSB7CisJCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEU7CisJCWFjZS0+ZmxhZyA9IGVmbGFnOworCQlhY2UtPmFjY2Vzc19tYXNrID0gZGVueV9tYXNrX2Zyb21fcG9zaXgoZGVueSwgZmxhZ3MpOworCQlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fT1dORVI7CisJCWFjZSsrOworCQlhY2wtPm5hY2VzKys7CisJfQorCisJYWNlLT50eXBlID0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEU7CisJYWNlLT5mbGFnID0gZWZsYWc7CisJYWNlLT5hY2Nlc3NfbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyB8IE5GUzRfQUNMX09XTkVSKTsKKwlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fT1dORVI7CisJYWNlKys7CisJYWNsLT5uYWNlcysrOwogCXBhKys7CiAKIAl3aGlsZSAocGEtPmVfdGFnID09IEFDTF9VU0VSKSB7Ci0JCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOwotCQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAotCQkJCWVmbGFnLCAgbWFza19tYXNrLCBORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0OwotCi0KLQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfcGFpcihhY2wsIGVmbGFnLCBtYXNrLAotCQkJCU5GUzRfQUNMX1dIT19OQU1FRCwgcGEtPmVfaWQsIGZsYWdzKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0OworCQlkZW55ID0gfihwYS0+ZV9wZXJtICYgcGFzLm1hc2spOworCQlkZW55ICY9IHBhcy5ncm91cHMgfCBwYXMuZ3JvdXAgfCBwYXMub3RoZXI7CisJCWlmIChkZW55KSB7CisJCQlhY2UtPnR5cGUgPSBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFOworCQkJYWNlLT5mbGFnID0gZWZsYWc7CisJCQlhY2UtPmFjY2Vzc19tYXNrID0gZGVueV9tYXNrX2Zyb21fcG9zaXgoZGVueSwgZmxhZ3MpOworCQkJYWNlLT53aG90eXBlID0gTkZTNF9BQ0xfV0hPX05BTUVEOworCQkJYWNlLT53aG8gPSBwYS0+ZV9pZDsKKwkJCWFjZSsrOworCQkJYWNsLT5uYWNlcysrOworCQl9CisJCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFOworCQlhY2UtPmZsYWcgPSBlZmxhZzsKKwkJYWNlLT5hY2Nlc3NfbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtICYgcGFzLm1hc2ssCisJCQkJCQkgICBmbGFncyk7CisJCWFjZS0+d2hvdHlwZSA9IE5GUzRfQUNMX1dIT19OQU1FRDsKKwkJYWNlLT53aG8gPSBwYS0+ZV9pZDsKKwkJYWNlKys7CisJCWFjbC0+bmFjZXMrKzsKIAkJcGErKzsKIAl9CiAKQEAgLTIzNiw2NyArMjg4LDY1IEBACiAKIAkvKiBhbGxvdyBBQ0VzICovCiAKLQlpZiAocGFjbC0+YV9jb3VudCA+IDMpIHsKLQkJQlVHX09OKHBhLT5lX3RhZyAhPSBBQ0xfR1JPVVBfT0JKKTsKLQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKLQkJCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsIG1hc2tfbWFzaywKLQkJCQlORlM0X0FDTF9XSE9fR1JPVVAsIDApOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQogCWdyb3VwX293bmVyX2VudHJ5ID0gcGE7Ci0JbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyk7Ci0JZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUsCi0JCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsIG1hc2ssCi0JCQlORlM0X0FDTF9XSE9fR1JPVVAsIDApOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gb3V0OworCisJYWNlLT50eXBlID0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEU7CisJYWNlLT5mbGFnID0gZWZsYWc7CisJYWNlLT5hY2Nlc3NfbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYXMuZ3JvdXAsIGZsYWdzKTsKKwlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fR1JPVVA7CisJYWNlKys7CisJYWNsLT5uYWNlcysrOwogCXBhKys7CiAKIAl3aGlsZSAocGEtPmVfdGFnID09IEFDTF9HUk9VUCkgewotCQltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKTsKLQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKLQkJCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsIG1hc2tfbWFzaywKLQkJCQlORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFLAotCQkgICAgCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsIG1hc2ssCi0JCSAgICAJCU5GUzRfQUNMX1dIT19OQU1FRCwgcGEtPmVfaWQpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBvdXQ7CisJCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFOworCQlhY2UtPmZsYWcgPSBlZmxhZyB8IE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVA7CisJCWFjZS0+YWNjZXNzX21hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSAmIHBhcy5tYXNrLAorCQkJCQkJICAgZmxhZ3MpOworCQlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fTkFNRUQ7CisJCWFjZS0+d2hvID0gcGEtPmVfaWQ7CisJCWFjZSsrOworCQlhY2wtPm5hY2VzKys7CiAJCXBhKys7CiAJfQogCiAJLyogZGVueSBBQ0VzICovCiAKIAlwYSA9IGdyb3VwX293bmVyX2VudHJ5OwotCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOwotCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUsCi0JCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsCi0JCQlkZW55X21hc2sobWFzaywgZmxhZ3MpLCBORlM0X0FDTF9XSE9fR1JPVVAsIDApOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gb3V0OworCisJZGVueSA9IH5wYXMuZ3JvdXAgJiBwYXMub3RoZXI7CisJaWYgKGRlbnkpIHsKKwkJYWNlLT50eXBlID0gTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRTsKKwkJYWNlLT5mbGFnID0gZWZsYWcgfCBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQOworCQlhY2UtPmFjY2Vzc19tYXNrID0gZGVueV9tYXNrX2Zyb21fcG9zaXgoZGVueSwgZmxhZ3MpOworCQlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fR1JPVVA7CisJCWFjZSsrOworCQlhY2wtPm5hY2VzKys7CisJfQogCXBhKys7CisKIAl3aGlsZSAocGEtPmVfdGFnID09IEFDTF9HUk9VUCkgewotCQltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKTsKLQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKLQkJICAgIAkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLAotCQkgICAgCQlkZW55X21hc2sobWFzaywgZmxhZ3MpLCBORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0OworCQlkZW55ID0gfihwYS0+ZV9wZXJtICYgcGFzLm1hc2spOworCQlkZW55ICY9IHBhcy5vdGhlcjsKKwkJaWYgKGRlbnkpIHsKKwkJCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEU7CisJCQlhY2UtPmZsYWcgPSBlZmxhZyB8IE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVA7CisJCQlhY2UtPmFjY2Vzc19tYXNrID0gbWFza19mcm9tX3Bvc2l4KGRlbnksIGZsYWdzKTsKKwkJCWFjZS0+d2hvdHlwZSA9IE5GUzRfQUNMX1dIT19OQU1FRDsKKwkJCWFjZS0+d2hvID0gcGEtPmVfaWQ7CisJCQlhY2UrKzsKKwkJCWFjbC0+bmFjZXMrKzsKKwkJfQogCQlwYSsrOwogCX0KIAogCWlmIChwYS0+ZV90YWcgPT0gQUNMX01BU0spCiAJCXBhKys7Ci0JQlVHX09OKHBhLT5lX3RhZyAhPSBBQ0xfT1RIRVIpOwotCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOwotCWVycm9yID0gbmZzNF9hY2xfYWRkX3BhaXIoYWNsLCBlZmxhZywgbWFzaywgTkZTNF9BQ0xfV0hPX0VWRVJZT05FLCAwLCBmbGFncyk7Ci0KLW91dDoKLQlyZXR1cm4gZXJyb3I7CisJYWNlLT50eXBlID0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEU7CisJYWNlLT5mbGFnID0gZWZsYWc7CisJYWNlLT5hY2Nlc3NfbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyk7CisJYWNlLT53aG90eXBlID0gTkZTNF9BQ0xfV0hPX0VWRVJZT05FOworCWFjbC0+bmFjZXMrKzsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM0Miw0NiArMzkyLDYgQEAKIAlyZXR1cm47CiB9CiAKLWludAotbmZzNF9hY2xfbmZzdjRfdG9fcG9zaXgoc3RydWN0IG5mczRfYWNsICphY2wsIHN0cnVjdCBwb3NpeF9hY2wgKipwYWNsLAotCQlzdHJ1Y3QgcG9zaXhfYWNsICoqZHBhY2wsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgbmZzNF9hY2wgKmRhY2w7Ci0JaW50IGVycm9yID0gLUVOT01FTTsKLQotCSpwYWNsID0gTlVMTDsKLQkqZHBhY2wgPSBOVUxMOwotCi0JZGFjbCA9IG5mczRfYWNsX25ldygpOwotCWlmIChkYWNsID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCi0JZXJyb3IgPSBuZnM0X2FjbF9zcGxpdChhY2wsIGRhY2wpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfYWNsOwotCi0JKnBhY2wgPSBfbmZzdjRfdG9fcG9zaXhfb25lKGFjbCwgZmxhZ3MpOwotCWlmIChJU19FUlIoKnBhY2wpKSB7Ci0JCWVycm9yID0gUFRSX0VSUigqcGFjbCk7Ci0JCSpwYWNsID0gTlVMTDsKLQkJZ290byBvdXRfYWNsOwotCX0KLQotCSpkcGFjbCA9IF9uZnN2NF90b19wb3NpeF9vbmUoZGFjbCwgZmxhZ3MpOwotCWlmIChJU19FUlIoKmRwYWNsKSkgewotCQllcnJvciA9IFBUUl9FUlIoKmRwYWNsKTsKLQkJKmRwYWNsID0gTlVMTDsKLQl9Ci1vdXRfYWNsOgotCWlmIChlcnJvcikgewotCQlwb3NpeF9hY2xfcmVsZWFzZSgqcGFjbCk7Ci0JCSpwYWNsID0gTlVMTDsKLQl9Ci0JbmZzNF9hY2xfZnJlZShkYWNsKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIC8qCiAgKiBXaGlsZSBwcm9jZXNzaW5nIHRoZSBORlN2NCBBQ0UsIHRoaXMgbWFpbnRhaW5zIGJpdG1hc2tzIHJlcHJlc2VudGluZwogICogd2hpY2ggcGVybWlzc2lvbiBiaXRzIGhhdmUgYmVlbiBhbGxvd2VkIGFuZCB3aGljaCBkZW5pZWQgdG8gYSBnaXZlbgpAQCAtNDA2LDYgKzQxNiw3IEBACiAgKiBjYWxjdWxhdGVkIHNvIGZhcjogKi8KIAogc3RydWN0IHBvc2l4X2FjbF9zdGF0ZSB7CisJaW50IGVtcHR5OwogCXN0cnVjdCBwb3NpeF9hY2Vfc3RhdGUgb3duZXI7CiAJc3RydWN0IHBvc2l4X2FjZV9zdGF0ZSBncm91cDsKIAlzdHJ1Y3QgcG9zaXhfYWNlX3N0YXRlIG90aGVyOwpAQCAtNDIxLDYgKzQzMiw3IEBACiAJaW50IGFsbG9jOwogCiAJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RydWN0IHBvc2l4X2FjbF9zdGF0ZSkpOworCXN0YXRlLT5lbXB0eSA9IDE7CiAJLyoKIAkgKiBJbiB0aGUgd29yc3QgY2FzZSwgZWFjaCBpbmRpdmlkdWFsIGFjbCBjb3VsZCBiZSBmb3IgYSBkaXN0aW5jdAogCSAqIG5hbWVkIHVzZXIgb3IgZ3JvdXAsIGJ1dCB3ZSBkb24ndCBubyB3aGljaCwgc28gd2UgYWxsb2NhdGUKQEAgLTQ4OCw2ICs1MDAsMjAgQEAKIAlpbnQgbmFjZTsKIAlpbnQgaSwgZXJyb3IgPSAwOwogCisJLyoKKwkgKiBBQ0xzIHdpdGggbm8gQUNFcyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseSBpbiB0aGUgaW5oZXJpdGFibGUKKwkgKiBhbmQgZWZmZWN0aXZlIGNhc2VzOiB3aGVuIHRoZXJlIGFyZSBubyBpbmhlcml0YWJsZSBBQ0VzLCB3ZQorCSAqIHNldCBhIHplcm8tbGVuZ3RoIGRlZmF1bHQgcG9zaXggYWNsOgorCSAqLworCWlmIChzdGF0ZS0+ZW1wdHkgJiYgKGZsYWdzICYgTkZTNF9BQ0xfVFlQRV9ERUZBVUxUKSkgeworCQlwYWNsID0gcG9zaXhfYWNsX2FsbG9jKDAsIEdGUF9LRVJORUwpOworCQlyZXR1cm4gcGFjbCA/IHBhY2wgOiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwkvKgorCSAqIFdoZW4gdGhlcmUgYXJlIG5vIGVmZmVjdGl2ZSBBQ0VzLCB0aGUgZm9sbG93aW5nIHdpbGwgZW5kCisJICogdXAgc2V0dGluZyBhIDMtZWxlbWVudCBlZmZlY3RpdmUgcG9zaXggQUNMIHdpdGggYWxsCisJICogcGVybWlzc2lvbnMgemVyby4KKwkgKi8KIAluYWNlID0gNCArIHN0YXRlLT51c2Vycy0+biArIHN0YXRlLT5ncm91cHMtPm47CiAJcGFjbCA9IHBvc2l4X2FjbF9hbGxvYyhuYWNlLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBhY2wpCkBAIC02MDMsNiArNjI5LDggQEAKIAl1MzIgbWFzayA9IGFjZS0+YWNjZXNzX21hc2s7CiAJaW50IGk7CiAKKwlzdGF0ZS0+ZW1wdHkgPSAwOworCiAJc3dpdGNoIChhY2UydHlwZShhY2UpKSB7CiAJY2FzZSBBQ0xfVVNFUl9PQko6CiAJCWlmIChhY2UtPnR5cGUgPT0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUpIHsKQEAgLTY2Niw3NSArNjk0LDYyIEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCi1fbmZzdjRfdG9fcG9zaXhfb25lKHN0cnVjdCBuZnM0X2FjbCAqbjRhY2wsIHVuc2lnbmVkIGludCBmbGFncykKK2ludCBuZnM0X2FjbF9uZnN2NF90b19wb3NpeChzdHJ1Y3QgbmZzNF9hY2wgKmFjbCwgc3RydWN0IHBvc2l4X2FjbCAqKnBhY2wsCisJCQkgICAgc3RydWN0IHBvc2l4X2FjbCAqKmRwYWNsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHBvc2l4X2FjbF9zdGF0ZSBzdGF0ZTsKLQlzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsOworCXN0cnVjdCBwb3NpeF9hY2xfc3RhdGUgZWZmZWN0aXZlX2FjbF9zdGF0ZSwgZGVmYXVsdF9hY2xfc3RhdGU7CiAJc3RydWN0IG5mczRfYWNlICphY2U7CiAJaW50IHJldDsKIAotCXJldCA9IGluaXRfc3RhdGUoJnN0YXRlLCBuNGFjbC0+bmFjZXMpOworCXJldCA9IGluaXRfc3RhdGUoJmVmZmVjdGl2ZV9hY2xfc3RhdGUsIGFjbC0+bmFjZXMpOwogCWlmIChyZXQpCi0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFjZSwgJm40YWNsLT5hY2VfaGVhZCwgbF9hY2UpCi0JCXByb2Nlc3Nfb25lX3Y0X2FjZSgmc3RhdGUsIGFjZSk7Ci0KLQlwYWNsID0gcG9zaXhfc3RhdGVfdG9fYWNsKCZzdGF0ZSwgZmxhZ3MpOwotCi0JZnJlZV9zdGF0ZSgmc3RhdGUpOwotCi0JaWYgKCFJU19FUlIocGFjbCkpCi0JCXNvcnRfcGFjbChwYWNsKTsKLQlyZXR1cm4gcGFjbDsKLX0KLQotc3RhdGljIGludAotbmZzNF9hY2xfc3BsaXQoc3RydWN0IG5mczRfYWNsICphY2wsIHN0cnVjdCBuZnM0X2FjbCAqZGFjbCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoLCAqbjsKLQlzdHJ1Y3QgbmZzNF9hY2UgKmFjZTsKLQlpbnQgZXJyb3IgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGgsIG4sICZhY2wtPmFjZV9oZWFkKSB7Ci0JCWFjZSA9IGxpc3RfZW50cnkoaCwgc3RydWN0IG5mczRfYWNlLCBsX2FjZSk7Ci0KKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBpbml0X3N0YXRlKCZkZWZhdWx0X2FjbF9zdGF0ZSwgYWNsLT5uYWNlcyk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZXN0YXRlOworCXJldCA9IC1FSU5WQUw7CisJZm9yIChhY2UgPSBhY2wtPmFjZXM7IGFjZSA8IGFjbC0+YWNlcyArIGFjbC0+bmFjZXM7IGFjZSsrKSB7CiAJCWlmIChhY2UtPnR5cGUgIT0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUgJiYKIAkJICAgIGFjZS0+dHlwZSAhPSBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KKwkJCWdvdG8gb3V0X2RzdGF0ZTsKIAkJaWYgKGFjZS0+ZmxhZyAmIH5ORlM0X1NVUFBPUlRFRF9GTEFHUykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXN3aXRjaCAoYWNlLT5mbGFnICYgTkZTNF9JTkhFUklUQU5DRV9GTEFHUykgewotCQljYXNlIDA6Ci0JCQkvKiBMZWF2ZSB0aGlzIGFjZSBpbiB0aGUgZWZmZWN0aXZlIGFjbDogKi8KKwkJCWdvdG8gb3V0X2RzdGF0ZTsKKwkJaWYgKChhY2UtPmZsYWcgJiBORlM0X0lOSEVSSVRBTkNFX0ZMQUdTKSA9PSAwKSB7CisJCQlwcm9jZXNzX29uZV92NF9hY2UoJmVmZmVjdGl2ZV9hY2xfc3RhdGUsIGFjZSk7CiAJCQljb250aW51ZTsKLQkJY2FzZSBORlM0X0lOSEVSSVRBTkNFX0ZMQUdTOgotCQkJLyogQWRkIHRoaXMgYWNlIHRvIHRoZSBkZWZhdWx0IGFjbCBhbmQgcmVtb3ZlIGl0Ci0JCQkgKiBmcm9tIHRoZSBlZmZlY3RpdmUgYWNsOiAqLwotCQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGRhY2wsIGFjZS0+dHlwZSwgYWNlLT5mbGFnLAotCQkJCWFjZS0+YWNjZXNzX21hc2ssIGFjZS0+d2hvdHlwZSwgYWNlLT53aG8pOwotCQkJaWYgKGVycm9yKQotCQkJCXJldHVybiBlcnJvcjsKLQkJCWxpc3RfZGVsKGgpOwotCQkJa2ZyZWUoYWNlKTsKLQkJCWFjbC0+bmFjZXMtLTsKLQkJCWJyZWFrOwotCQljYXNlIE5GUzRfSU5IRVJJVEFOQ0VfRkxBR1MgJiB+TkZTNF9BQ0VfSU5IRVJJVF9PTkxZX0FDRToKLQkJCS8qIEFkZCB0aGlzIGFjZSB0byB0aGUgZGVmYXVsdCwgYnV0IGxlYXZlIGl0IGluCi0JCQkgKiB0aGUgZWZmZWN0aXZlIGFjbCBhcyB3ZWxsOiAqLwotCQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGRhY2wsIGFjZS0+dHlwZSwgYWNlLT5mbGFnLAotCQkJCWFjZS0+YWNjZXNzX21hc2ssIGFjZS0+d2hvdHlwZSwgYWNlLT53aG8pOwotCQkJaWYgKGVycm9yKQotCQkJCXJldHVybiBlcnJvcjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KKwkJaWYgKCEoZmxhZ3MgJiBORlM0X0FDTF9ESVIpKQorCQkJZ290byBvdXRfZHN0YXRlOworCQkvKgorCQkgKiBOb3RlIHRoYXQgd2hlbiBvbmx5IG9uZSBvZiBGSUxFX0lOSEVSSVQgb3IgRElSRUNUT1JZX0lOSEVSSVQKKwkJICogaXMgc2V0LCB3ZSdyZSBlZmZlY3RpdmVseSB0dXJuaW5nIG9uIHRoZSBvdGhlci4gIFRoYXQncyBPSywKKwkJICogYWNjb3JkaW5nIHRvIHJmYyAzNTMwLgorCQkgKi8KKwkJcHJvY2Vzc19vbmVfdjRfYWNlKCZkZWZhdWx0X2FjbF9zdGF0ZSwgYWNlKTsKKworCQlpZiAoIShhY2UtPmZsYWcgJiBORlM0X0FDRV9JTkhFUklUX09OTFlfQUNFKSkKKwkJCXByb2Nlc3Nfb25lX3Y0X2FjZSgmZWZmZWN0aXZlX2FjbF9zdGF0ZSwgYWNlKTsKIAl9Ci0JcmV0dXJuIDA7CisJKnBhY2wgPSBwb3NpeF9zdGF0ZV90b19hY2woJmVmZmVjdGl2ZV9hY2xfc3RhdGUsIGZsYWdzKTsKKwlpZiAoSVNfRVJSKCpwYWNsKSkgeworCQlyZXQgPSBQVFJfRVJSKCpwYWNsKTsKKwkJZ290byBvdXRfZHN0YXRlOworCX0KKwkqZHBhY2wgPSBwb3NpeF9zdGF0ZV90b19hY2woJmRlZmF1bHRfYWNsX3N0YXRlLAorCQkJCQkJZmxhZ3MgfCBORlM0X0FDTF9UWVBFX0RFRkFVTFQpOworCWlmIChJU19FUlIoKmRwYWNsKSkgeworCQlyZXQgPSBQVFJfRVJSKCpkcGFjbCk7CisJCXBvc2l4X2FjbF9yZWxlYXNlKCpwYWNsKTsKKwkJZ290byBvdXRfZHN0YXRlOworCX0KKwlzb3J0X3BhY2woKnBhY2wpOworCXNvcnRfcGFjbCgqZHBhY2wpOworCXJldCA9IDA7CitvdXRfZHN0YXRlOgorCWZyZWVfc3RhdGUoJmRlZmF1bHRfYWNsX3N0YXRlKTsKK291dF9lc3RhdGU6CisJZnJlZV9zdGF0ZSgmZWZmZWN0aXZlX2FjbF9zdGF0ZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHNob3J0CkBAIC03NTksNDggKzc3NCwyMiBAQAogRVhQT1JUX1NZTUJPTChuZnM0X2FjbF9uZnN2NF90b19wb3NpeCk7CiAKIHN0cnVjdCBuZnM0X2FjbCAqCi1uZnM0X2FjbF9uZXcodm9pZCkKK25mczRfYWNsX25ldyhpbnQgbikKIHsKIAlzdHJ1Y3QgbmZzNF9hY2wgKmFjbDsKIAotCWlmICgoYWNsID0ga21hbGxvYyhzaXplb2YoKmFjbCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCWFjbCA9IGttYWxsb2Moc2l6ZW9mKCphY2wpICsgbipzaXplb2Yoc3RydWN0IG5mczRfYWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFjbCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQogCWFjbC0+bmFjZXMgPSAwOwotCUlOSVRfTElTVF9IRUFEKCZhY2wtPmFjZV9oZWFkKTsKLQogCXJldHVybiBhY2w7CiB9CiAKIHZvaWQKLW5mczRfYWNsX2ZyZWUoc3RydWN0IG5mczRfYWNsICphY2wpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaDsKLQlzdHJ1Y3QgbmZzNF9hY2UgKmFjZTsKLQotCWlmICghYWNsKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmFjbC0+YWNlX2hlYWQpKSB7Ci0JCWggPSBhY2wtPmFjZV9oZWFkLm5leHQ7Ci0JCWxpc3RfZGVsKGgpOwotCQlhY2UgPSBsaXN0X2VudHJ5KGgsIHN0cnVjdCBuZnM0X2FjZSwgbF9hY2UpOwotCQlrZnJlZShhY2UpOwotCX0KLQotCWtmcmVlKGFjbCk7Ci0KLQlyZXR1cm47Ci19Ci0KLWludAogbmZzNF9hY2xfYWRkX2FjZShzdHJ1Y3QgbmZzNF9hY2wgKmFjbCwgdTMyIHR5cGUsIHUzMiBmbGFnLCB1MzIgYWNjZXNzX21hc2ssCiAJCWludCB3aG90eXBlLCB1aWRfdCB3aG8pCiB7Ci0Jc3RydWN0IG5mczRfYWNlICphY2U7Ci0KLQlpZiAoKGFjZSA9IGttYWxsb2Moc2l6ZW9mKCphY2UpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07CisJc3RydWN0IG5mczRfYWNlICphY2UgPSBhY2wtPmFjZXMgKyBhY2wtPm5hY2VzOwogCiAJYWNlLT50eXBlID0gdHlwZTsKIAlhY2UtPmZsYWcgPSBmbGFnOwpAQCAtODA4LDEwICs3OTcsNyBAQAogCWFjZS0+d2hvdHlwZSA9IHdob3R5cGU7CiAJYWNlLT53aG8gPSB3aG87CiAKLQlsaXN0X2FkZF90YWlsKCZhY2UtPmxfYWNlLCAmYWNsLT5hY2VfaGVhZCk7CiAJYWNsLT5uYWNlcysrOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtODY1LDcgKzg1MSw2IEBACiB9CiAKIEVYUE9SVF9TWU1CT0wobmZzNF9hY2xfbmV3KTsKLUVYUE9SVF9TWU1CT0wobmZzNF9hY2xfZnJlZSk7CiBFWFBPUlRfU1lNQk9MKG5mczRfYWNsX2FkZF9hY2UpOwogRVhQT1JUX1NZTUJPTChuZnM0X2FjbF9nZXRfd2hvdHlwZSk7CiBFWFBPUlRfU1lNQk9MKG5mczRfYWNsX3dyaXRlX3dobyk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRjYWxsYmFjay5jIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwppbmRleCBmNTc2NTVhLi5mYjE0ZDY4IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRjYWxsYmFjay5jCisrKyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKQEAgLTM4Nyw3ICszODcsNiBAQAogCQkuYWRkcmVzcwk9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwKIAkJLmFkZHJzaXplCT0gc2l6ZW9mKGFkZHIpLAogCQkudGltZW91dAk9ICZ0aW1lcGFybXMsCi0JCS5zZXJ2ZXJuYW1lCT0gY2xwLT5jbF9uYW1lLmRhdGEsCiAJCS5wcm9ncmFtCT0gcHJvZ3JhbSwKIAkJLnZlcnNpb24JPSBuZnNfY2JfdmVyc2lvblsxXS0+bnVtYmVyLAogCQkuYXV0aGZsYXZvcgk9IFJQQ19BVVRIX1VOSVgsCS8qIFhYWDogbmVlZCBBVVRIX0dTUy4uLiAqLwpAQCAtMzk3LDYgKzM5Niw3IEBACiAJCS5ycGNfcHJvYyAgICAgICA9ICZuZnM0X2NiX3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9DQl9OVUxMXSwKIAkJLnJwY19hcmdwICAgICAgID0gY2xwLAogCX07CisJY2hhciBjbGllbnRuYW1lWzE2XTsKIAlpbnQgc3RhdHVzOwogCiAJaWYgKGF0b21pY19yZWFkKCZjYi0+Y2Jfc2V0KSkKQEAgLTQxOSw2ICs0MTksMTEgQEAKIAltZW1zZXQocHJvZ3JhbS0+c3RhdHMsIDAsIHNpemVvZihjYi0+Y2Jfc3RhdCkpOwogCXByb2dyYW0tPnN0YXRzLT5wcm9ncmFtID0gcHJvZ3JhbTsKIAorCS8qIEp1c3QgaGVyZSB0byBtYWtlIHNvbWUgcHJpbnRrJ3MgbW9yZSB1c2VmdWw6ICovCisJc25wcmludGYoY2xpZW50bmFtZSwgc2l6ZW9mKGNsaWVudG5hbWUpLAorCQkiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKGFkZHIuc2luX2FkZHIpKTsKKwlhcmdzLnNlcnZlcm5hbWUgPSBjbGllbnRuYW1lOworCiAJLyogQ3JlYXRlIFJQQyBjbGllbnQgKi8KIAljYi0+Y2JfY2xpZW50ID0gcnBjX2NyZWF0ZSgmYXJncyk7CiAJaWYgKElTX0VSUihjYi0+Y2JfY2xpZW50KSkgewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCAwZWZiYTU1Li41ZDA5MGYxIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtMTk5LDI0ICsxOTksMjIgQEAKIAogc3RhdGljIGNoYXIgKnNhdmVtZW0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgX19iZTMyICpwLCBpbnQgbmJ5dGVzKQogewotCXZvaWQgKm5ldyA9IE5VTEw7CiAJaWYgKHAgPT0gYXJncC0+dG1wKSB7Ci0JCW5ldyA9IGttYWxsb2MobmJ5dGVzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXcpIHJldHVybiBOVUxMOwotCQlwID0gbmV3OworCQlwID0ga21hbGxvYyhuYnl0ZXMsIEdGUF9LRVJORUwpOworCQlpZiAoIXApCisJCQlyZXR1cm4gTlVMTDsKIAkJbWVtY3B5KHAsIGFyZ3AtPnRtcCwgbmJ5dGVzKTsKIAl9IGVsc2UgewogCQlCVUdfT04ocCAhPSBhcmdwLT50bXBwKTsKIAkJYXJncC0+dG1wcCA9IE5VTEw7CiAJfQogCWlmIChkZWZlcl9mcmVlKGFyZ3AsIGtmcmVlLCBwKSkgewotCQlrZnJlZShuZXcpOworCQlrZnJlZShwKTsKIAkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlCiAJCXJldHVybiAoY2hhciAqKXA7CiB9CiAKLQogc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2JpdG1hcChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCB1MzIgKmJtdmFsKQogewpAQCAtMjU1LDcgKzI1Myw3IEBACiAJCXJldHVybiBzdGF0dXM7CiAKIAkvKgotCSAqIEFjY29yZGluZyB0byBzcGVjLCB1bnN1cHBvcnRlZCBhdHRyaWJ1dGVzIHJldHVybiBFUlJfTk9UU1VQUDsKKwkgKiBBY2NvcmRpbmcgdG8gc3BlYywgdW5zdXBwb3J0ZWQgYXR0cmlidXRlcyByZXR1cm4gRVJSX0FUVFJOT1RTVVBQOwogCSAqIHJlYWQtb25seSBhdHRyaWJ1dGVzIHJldHVybiBFUlJfSU5WQUwuCiAJICovCiAJaWYgKChibXZhbFswXSAmIH5ORlNEX1NVUFBPUlRFRF9BVFRSU19XT1JEMCkgfHwgKGJtdmFsWzFdICYgfk5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQxKSkKQEAgLTI3Myw0MiArMjcxLDQyIEBACiAJCWlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX1NJWkU7CiAJfQogCWlmIChibXZhbFswXSAmIEZBVFRSNF9XT1JEMF9BQ0wpIHsKLQkJaW50IG5hY2UsIGk7Ci0JCXN0cnVjdCBuZnM0X2FjZSBhY2U7CisJCWludCBuYWNlOworCQlzdHJ1Y3QgbmZzNF9hY2UgKmFjZTsKIAogCQlSRUFEX0JVRig0KTsgbGVuICs9IDQ7CiAJCVJFQUQzMihuYWNlKTsKIAotCQkqYWNsID0gbmZzNF9hY2xfbmV3KCk7CisJCWlmIChuYWNlID4gTkZTNF9BQ0xfTUFYKQorCQkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKKworCQkqYWNsID0gbmZzNF9hY2xfbmV3KG5hY2UpOwogCQlpZiAoKmFjbCA9PSBOVUxMKSB7CiAJCQlob3N0X2VyciA9IC1FTk9NRU07CiAJCQlnb3RvIG91dF9uZnNlcnI7CiAJCX0KLQkJZGVmZXJfZnJlZShhcmdwLCAodm9pZCAoKikoY29uc3Qgdm9pZCAqKSluZnM0X2FjbF9mcmVlLCAqYWNsKTsKKwkJZGVmZXJfZnJlZShhcmdwLCBrZnJlZSwgKmFjbCk7CiAKLQkJZm9yIChpID0gMDsgaSA8IG5hY2U7IGkrKykgeworCQkoKmFjbCktPm5hY2VzID0gbmFjZTsKKwkJZm9yIChhY2UgPSAoKmFjbCktPmFjZXM7IGFjZSA8ICgqYWNsKS0+YWNlcyArIG5hY2U7IGFjZSsrKSB7CiAJCQlSRUFEX0JVRigxNik7IGxlbiArPSAxNjsKLQkJCVJFQUQzMihhY2UudHlwZSk7Ci0JCQlSRUFEMzIoYWNlLmZsYWcpOwotCQkJUkVBRDMyKGFjZS5hY2Nlc3NfbWFzayk7CisJCQlSRUFEMzIoYWNlLT50eXBlKTsKKwkJCVJFQUQzMihhY2UtPmZsYWcpOworCQkJUkVBRDMyKGFjZS0+YWNjZXNzX21hc2spOwogCQkJUkVBRDMyKGR1bW15MzIpOwogCQkJUkVBRF9CVUYoZHVtbXkzMik7CiAJCQlsZW4gKz0gWERSX1FVQURMRU4oZHVtbXkzMikgPDwgMjsKIAkJCVJFQURNRU0oYnVmLCBkdW1teTMyKTsKLQkJCWFjZS53aG90eXBlID0gbmZzNF9hY2xfZ2V0X3dob3R5cGUoYnVmLCBkdW1teTMyKTsKKwkJCWFjZS0+d2hvdHlwZSA9IG5mczRfYWNsX2dldF93aG90eXBlKGJ1ZiwgZHVtbXkzMik7CiAJCQlob3N0X2VyciA9IDA7Ci0JCQlpZiAoYWNlLndob3R5cGUgIT0gTkZTNF9BQ0xfV0hPX05BTUVEKQotCQkJCWFjZS53aG8gPSAwOwotCQkJZWxzZSBpZiAoYWNlLmZsYWcgJiBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQKQorCQkJaWYgKGFjZS0+d2hvdHlwZSAhPSBORlM0X0FDTF9XSE9fTkFNRUQpCisJCQkJYWNlLT53aG8gPSAwOworCQkJZWxzZSBpZiAoYWNlLT5mbGFnICYgTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCkKIAkJCQlob3N0X2VyciA9IG5mc2RfbWFwX25hbWVfdG9fZ2lkKGFyZ3AtPnJxc3RwLAotCQkJCQkJYnVmLCBkdW1teTMyLCAmYWNlLndobyk7CisJCQkJCQlidWYsIGR1bW15MzIsICZhY2UtPndobyk7CiAJCQllbHNlCiAJCQkJaG9zdF9lcnIgPSBuZnNkX21hcF9uYW1lX3RvX3VpZChhcmdwLT5ycXN0cCwKLQkJCQkJCWJ1ZiwgZHVtbXkzMiwgJmFjZS53aG8pOwotCQkJaWYgKGhvc3RfZXJyKQotCQkJCWdvdG8gb3V0X25mc2VycjsKLQkJCWhvc3RfZXJyID0gbmZzNF9hY2xfYWRkX2FjZSgqYWNsLCBhY2UudHlwZSwgYWNlLmZsYWcsCi0JCQkJIGFjZS5hY2Nlc3NfbWFzaywgYWNlLndob3R5cGUsIGFjZS53aG8pOworCQkJCQkJYnVmLCBkdW1teTMyLCAmYWNlLT53aG8pOwogCQkJaWYgKGhvc3RfZXJyKQogCQkJCWdvdG8gb3V0X25mc2VycjsKIAkJfQpAQCAtMTU5Niw3ICsxNTk0LDYgQEAKIAl9CiAJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9BQ0wpIHsKIAkJc3RydWN0IG5mczRfYWNlICphY2U7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKmg7CiAKIAkJaWYgKGFjbCA9PSBOVUxMKSB7CiAJCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCkBAIC0xNjA5LDkgKzE2MDYsNyBAQAogCQkJZ290byBvdXRfcmVzb3VyY2U7CiAJCVdSSVRFMzIoYWNsLT5uYWNlcyk7CiAKLQkJbGlzdF9mb3JfZWFjaChoLCAmYWNsLT5hY2VfaGVhZCkgewotCQkJYWNlID0gbGlzdF9lbnRyeShoLCBzdHJ1Y3QgbmZzNF9hY2UsIGxfYWNlKTsKLQorCQlmb3IgKGFjZSA9IGFjbC0+YWNlczsgYWNlIDwgYWNsLT5hY2VzICsgYWNsLT5uYWNlczsgYWNlKyspIHsKIAkJCWlmICgoYnVmbGVuIC09IDQqMykgPCAwKQogCQkJCWdvdG8gb3V0X3Jlc291cmNlOwogCQkJV1JJVEUzMihhY2UtPnR5cGUpOwpAQCAtMTgyMSw3ICsxODE2LDcgQEAKIAlzdGF0dXMgPSBuZnNfb2s7CiAKIG91dDoKLQluZnM0X2FjbF9mcmVlKGFjbCk7CisJa2ZyZWUoYWNsKTsKIAlpZiAoZmhwID09ICZ0ZW1wZmgpCiAJCWZoX3B1dCgmdGVtcGZoKTsKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggODI4MzIzNi4uN2U2YWEyNCAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC00NjYsNyArNDY2LDEwIEBACiAJcG9zaXhfYWNsX3JlbGVhc2UoZHBhY2wpOwogCXJldHVybiAoZXJyb3IpOwogb3V0X25mc2VycjoKLQllcnJvciA9IG5mc2Vycm5vKGhvc3RfZXJyb3IpOworCWlmIChob3N0X2Vycm9yID09IC1FT1BOT1RTVVBQKQorCQllcnJvciA9IG5mc2Vycl9hdHRybm90c3VwcDsKKwllbHNlCisJCWVycm9yID0gbmZzZXJybm8oaG9zdF9lcnJvcik7CiAJZ290byBvdXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaCBiL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAppbmRleCA0ZGM4YTUwLi4wN2E1ZWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCkBAIC0xMDUsMTIgKzEwNSw2IEBACiAKIGludCBhY3BpX3Byb2Nlc3Nvcl9zZXRfdGhlcm1hbF9saW1pdChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlKTsKIAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvdCBLZXlzCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1leHRlcm4gaW50IGFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQ7Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb2NrIFN0YXRpb24KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEyMiwxMCArMTE2LDI0IEBACiAJYWNwaV9ub3RpZnlfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpjb250ZXh0KTsKIGV4dGVybiB2b2lkIHVucmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpOwogI2Vsc2UKLSNkZWZpbmUgaXNfZG9ja19kZXZpY2UoaCkJCQkoMCkKLSNkZWZpbmUgcmVnaXN0ZXJfZG9ja19ub3RpZmllcihuYikgCQkoLUVOT0RFVikKLSNkZWZpbmUgdW5yZWdpc3Rlcl9kb2NrX25vdGlmaWVyKG5iKSAgICAgICAgICAgCWRvIHsgfSB3aGlsZSgwKQotI2RlZmluZSByZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGgxLCBoMiwgYykJKC1FTk9ERVYpCi0jZGVmaW5lIHVucmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShoKSAgICAgICBkbyB7IH0gd2hpbGUoMCkKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2RvY2tfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX2RvY2tfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bnJlZ2lzdGVyX2RvY2tfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKK30KK3N0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJCWFjcGlfbm90aWZ5X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqY29udGV4dCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bnJlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworfQogI2VuZGlmCiAjZW5kaWYgLypfX0FDUElfRFJJVkVSU19IX18qLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmggYi9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaAppbmRleCA3ODEzOTRiLi4yNzg1MDU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaApAQCAtMjQwLDEyICsyNDAsNiBAQAogYWNwaV9vc192YWxpZGF0ZV9hZGRyZXNzKHU4IHNwYWNlX2lkLAogCQkJIGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzLCBhY3BpX3NpemUgbGVuZ3RoKTsKIAotdTggYWNwaV9vc19yZWFkYWJsZSh2b2lkICpwb2ludGVyLCBhY3BpX3NpemUgbGVuZ3RoKTsKLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi11OCBhY3BpX29zX3dyaXRhYmxlKHZvaWQgKnBvaW50ZXIsIGFjcGlfc2l6ZSBsZW5ndGgpOwotI2VuZGlmCi0KIHU2NCBhY3BpX29zX2dldF90aW1lcih2b2lkKTsKIAogYWNwaV9zdGF0dXMgYWNwaV9vc19zaWduYWwodTMyIGZ1bmN0aW9uLCB2b2lkICppbmZvKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAppbmRleCA3Nzk4ZDJhLi45MTZjMDEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCkBAIC03OSw2ICs3OSw3IEBACiAJdTMyIGJtX2FjdGl2aXR5OwogCWludCBjb3VudDsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggc3RhdGVzW0FDUElfUFJPQ0VTU09SX01BWF9QT1dFUl07CisJaW50IHRpbWVyX2Jyb2FkY2FzdF9vbl9zdGF0ZTsKIH07CiAKIC8qIFBlcmZvcm1hbmNlIE1hbmFnZW1lbnQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oCmluZGV4IGIxMjBlZTAuLjFhN2IwN2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaApAQCAtMjYsNyArMjYsOSBAQAogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqCiBhdDMyX2FkZF9kZXZpY2VfZXRoKHVuc2lnbmVkIGludCBpZCwgc3RydWN0IGV0aF9wbGF0Zm9ybV9kYXRhICpkYXRhKTsKIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYXQzMl9hZGRfZGV2aWNlX3NwaSh1bnNpZ25lZCBpbnQgaWQpOworc3RydWN0IHNwaV9ib2FyZF9pbmZvOworc3RydWN0IHBsYXRmb3JtX2RldmljZSAqCithdDMyX2FkZF9kZXZpY2Vfc3BpKHVuc2lnbmVkIGludCBpZCwgc3RydWN0IHNwaV9ib2FyZF9pbmZvICpiLCB1bnNpZ25lZCBpbnQgbik7CiAKIHN0cnVjdCBsY2RjX3BsYXRmb3JtX2RhdGEgewogCXVuc2lnbmVkIGxvbmcgZmJtZW1fc3RhcnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi9pby5oIGIvaW5jbHVkZS9hc20tYXZyMzIvaW8uaAppbmRleCBlZWM0NzUwLi5jMDhlODEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hdnIzMi9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL2lvLmgKQEAgLTI4LDEzICsyOCwxMyBAQAogICogR2VuZXJpYyBJTyByZWFkL3dyaXRlLiAgVGhlc2UgcGVyZm9ybSBuYXRpdmUtZW5kaWFuIGFjY2Vzc2VzLiAgTm90ZQogICogdGhhdCBzb21lIGFyY2hpdGVjdHVyZXMgd2lsbCB3YW50IHRvIHJlLWRlZmluZSBfX3Jhd197cmVhZCx3cml0ZX13LgogICovCi1leHRlcm4gdm9pZCBfX3Jhd193cml0ZXNiKHVuc2lnbmVkIGludCBhZGRyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgYnl0ZWxlbik7Ci1leHRlcm4gdm9pZCBfX3Jhd193cml0ZXN3KHVuc2lnbmVkIGludCBhZGRyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgd29yZGxlbik7Ci1leHRlcm4gdm9pZCBfX3Jhd193cml0ZXNsKHVuc2lnbmVkIGludCBhZGRyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbG9uZ2xlbik7CitleHRlcm4gdm9pZCBfX3Jhd193cml0ZXNiKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGJ5dGVsZW4pOworZXh0ZXJuIHZvaWQgX19yYXdfd3JpdGVzdyh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCB3b3JkbGVuKTsKK2V4dGVybiB2b2lkIF9fcmF3X3dyaXRlc2wodm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbG9uZ2xlbik7CiAKLWV4dGVybiB2b2lkIF9fcmF3X3JlYWRzYih1bnNpZ25lZCBpbnQgYWRkciwgdm9pZCAqZGF0YSwgaW50IGJ5dGVsZW4pOwotZXh0ZXJuIHZvaWQgX19yYXdfcmVhZHN3KHVuc2lnbmVkIGludCBhZGRyLCB2b2lkICpkYXRhLCBpbnQgd29yZGxlbik7Ci1leHRlcm4gdm9pZCBfX3Jhd19yZWFkc2wodW5zaWduZWQgaW50IGFkZHIsIHZvaWQgKmRhdGEsIGludCBsb25nbGVuKTsKK2V4dGVybiB2b2lkIF9fcmF3X3JlYWRzYihjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRhdGEsIGludCBieXRlbGVuKTsKK2V4dGVybiB2b2lkIF9fcmF3X3JlYWRzdyhjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRhdGEsIGludCB3b3JkbGVuKTsKK2V4dGVybiB2b2lkIF9fcmF3X3JlYWRzbChjb25zdCB2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRhdGEsIGludCBsb25nbGVuKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHdyaXRlYih1bnNpZ25lZCBjaGFyIGIsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKQEAgLTI1Miw2ICsyNTIsOSBAQAogI2RlZmluZSBpb3JlbWFwKG9mZnNldCwgc2l6ZSkJCQlcCiAJX19pb3JlbWFwKChvZmZzZXQpLCAoc2l6ZSksIDApCiAKKyNkZWZpbmUgaW9yZW1hcF9ub2NhY2hlKG9mZnNldCwgc2l6ZSkJCVwKKwlfX2lvcmVtYXAoKG9mZnNldCksIChzaXplKSwgMCkKKwogI2RlZmluZSBpb3VubWFwKGFkZHIpCQkJCVwKIAlfX2lvdW5tYXAoYWRkcikKIApAQCAtMjYzLDYgKzI2NiwxNCBAQAogI2RlZmluZSBwYWdlX3RvX2J1cyBwYWdlX3RvX3BoeXMKICNkZWZpbmUgYnVzX3RvX3BhZ2UgcGh5c190b19wYWdlCiAKKy8qCisgKiBDcmVhdGUgYSB2aXJ0dWFsIG1hcHBpbmcgY29va2llIGZvciBhbiBJTyBwb3J0IHJhbmdlLiAgVGhlcmUgZXhpc3RzCisgKiBubyBzdWNoIHRoaW5nIGFzIHBvcnQtYmFzZWQgSS9PIG9uIEFWUjMyLCBzbyBhIHJlZ3VsYXIgaW9yZW1hcCgpCisgKiBzaG91bGQgZG8gd2hhdCB3ZSBuZWVkLgorICovCisjZGVmaW5lIGlvcG9ydF9tYXAocG9ydCwgbnIpCWlvcmVtYXAocG9ydCwgbnIpCisjZGVmaW5lIGlvcG9ydF91bm1hcChwb3J0KQlpb3VubWFwKHBvcnQpCisKICNkZWZpbmUgZG1hX2NhY2hlX3diYWNrX2ludihfc3RhcnQsIF9zaXplKQlcCiAJZmx1c2hfZGNhY2hlX3JlZ2lvbihfc3RhcnQsIF9zaXplKQogI2RlZmluZSBkbWFfY2FjaGVfaW52KF9zdGFydCwgX3NpemUpCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hdnIzMi91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL3VuaXN0ZC5oCmluZGV4IDU2ZWQxZjkuLjhmNTEyMDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWF2cjMyL3VuaXN0ZC5oCkBAIC0xMjAsNyArMTIwLDcgQEAKICNkZWZpbmUgX19OUl9nZXRpdGltZXIJCTEwNQogI2RlZmluZSBfX05SX3N3YXBvZmYJCTEwNgogI2RlZmluZSBfX05SX3N5c2luZm8JCTEwNwotI2RlZmluZSBfX05SX2lwYwkJMTA4CisvKiAxMDggd2FzIF9fTlJfaXBjIGZvciBhIGxpdHRsZSB3aGlsZSAqLwogI2RlZmluZSBfX05SX3NlbmRmaWxlCQkxMDkKICNkZWZpbmUgX19OUl9zZXRkb21haW5uYW1lCTExMAogI2RlZmluZSBfX05SX3VuYW1lCQkxMTEKQEAgLTI4Miw4ICsyODIsMjEgQEAKICNkZWZpbmUgX19OUl92bXNwbGljZQkJMjY0CiAjZGVmaW5lIF9fTlJfZXBvbGxfcHdhaXQJMjY1CiAKKyNkZWZpbmUgX19OUl9tc2dnZXQJCTI2NgorI2RlZmluZSBfX05SX21zZ3NuZAkJMjY3CisjZGVmaW5lIF9fTlJfbXNncmN2CQkyNjgKKyNkZWZpbmUgX19OUl9tc2djdGwJCTI2OQorI2RlZmluZSBfX05SX3NlbWdldAkJMjcwCisjZGVmaW5lIF9fTlJfc2Vtb3AJCTI3MQorI2RlZmluZSBfX05SX3NlbWN0bAkJMjcyCisjZGVmaW5lIF9fTlJfc2VtdGltZWRvcAkJMjczCisjZGVmaW5lIF9fTlJfc2htYXQJCTI3NAorI2RlZmluZSBfX05SX3NobWdldAkJMjc1CisjZGVmaW5lIF9fTlJfc2htZHQJCTI3NgorI2RlZmluZSBfX05SX3NobWN0bAkJMjc3CisKICNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIE5SX3N5c2NhbGxzCQkyNjYKKyNkZWZpbmUgTlJfc3lzY2FsbHMJCTI3OAogCiAKICNkZWZpbmUgX19BUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvYWNwaS5oIGIvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmgKaW5kZXggNWU2NTdlYi4uNDQ5ZjNmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmgKQEAgLTEyNyw2ICsxMjcsNyBAQAogI2RlZmluZSBhY3BpX2lvYXBpYyAwCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9ub2lycV9zZXQodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9kaXNhYmxlX3BjaSh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2FjcGkodm9pZCkgeyB9CiAKICNlbmRpZgkvKiAhQ09ORklHX0FDUEkgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaAppbmRleCAzYTYxMjA2Li5jYzZiMTY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaApAQCAtOTUsOSArOTUsNyBAQAogCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfRU9JLCAwKTsKIH0KIAotZXh0ZXJuIHZvaWQgKCp3YWl0X3RpbWVyX3RpY2spKHZvaWQpOwotCi1leHRlcm4gaW50IGdldF9tYXhsdnQodm9pZCk7CitleHRlcm4gaW50IGxhcGljX2dldF9tYXhsdnQodm9pZCk7CiBleHRlcm4gdm9pZCBjbGVhcl9sb2NhbF9BUElDKHZvaWQpOwogZXh0ZXJuIHZvaWQgY29ubmVjdF9ic3BfQVBJQyAodm9pZCk7CiBleHRlcm4gdm9pZCBkaXNjb25uZWN0X2JzcF9BUElDIChpbnQgdmlydF93aXJlX3NldHVwKTsKQEAgLTExMywxNCArMTExLDkgQEAKIGV4dGVybiB2b2lkIHNldHVwX2Jvb3RfQVBJQ19jbG9jayAodm9pZCk7CiBleHRlcm4gdm9pZCBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jayAodm9pZCk7CiBleHRlcm4gaW50IEFQSUNfaW5pdF91bmlwcm9jZXNzb3IgKHZvaWQpOwotZXh0ZXJuIHZvaWQgZGlzYWJsZV9BUElDX3RpbWVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgZW5hYmxlX0FQSUNfdGltZXIodm9pZCk7CiAKIGV4dGVybiB2b2lkIGVuYWJsZV9OTUlfdGhyb3VnaF9MVlQwICh2b2lkICogZHVtbXkpOwogCi12b2lkIHNtcF9zZW5kX3RpbWVyX2Jyb2FkY2FzdF9pcGkodm9pZCk7Ci12b2lkIHN3aXRjaF9BUElDX3RpbWVyX3RvX2lwaSh2b2lkICpjcHVtYXNrKTsKLXZvaWQgc3dpdGNoX2lwaV90b19BUElDX3RpbWVyKHZvaWQgKmNwdW1hc2spOwogI2RlZmluZSBBUkNIX0FQSUNUSU1FUl9TVE9QU19PTl9DMwkxCiAKIGV4dGVybiBpbnQgdGltZXJfb3Zlcl84MjU0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9ocGV0LmggYi9pbmNsdWRlL2FzbS1pMzg2L2hwZXQuaAppbmRleCBlNDdiZTlhLi5mYzAzY2Y5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2hwZXQuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2hwZXQuaApAQCAtOTAsMTYgKzkwLDE5IEBACiAjZGVmaW5lIEhQRVRfTUlOX1BFUklPRCAoMTAwMDAwVUwpCiAjZGVmaW5lIEhQRVRfVElDS19SQVRFICAoSFogKiAxMDAwMDBVTCkKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHBldF90aWNrOyAgCS8qIGhwZXQgY2xrcyBjb3VudCBwZXIgdGljayAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHBldF9hZGRyZXNzOwkvKiBocGV0IG1lbW9yeSBtYXAgcGh5c2ljYWwgYWRkcmVzcyAqLwotZXh0ZXJuIGludCBocGV0X3VzZV90aW1lcjsKK2V4dGVybiBpbnQgaXNfaHBldF9lbmFibGVkKHZvaWQpOwogCisjaWZkZWYgQ09ORklHX1g4Nl82NAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHBldF90aWNrOwkvKiBocGV0IGNsa3MgY291bnQgcGVyIHRpY2sgKi8KK2V4dGVybiBpbnQgaHBldF91c2VfdGltZXI7CiBleHRlcm4gaW50IGhwZXRfcnRjX3RpbWVyX2luaXQodm9pZCk7CiBleHRlcm4gaW50IGhwZXRfZW5hYmxlKHZvaWQpOwotZXh0ZXJuIGludCBocGV0X3JlZW5hYmxlKHZvaWQpOwotZXh0ZXJuIGludCBpc19ocGV0X2VuYWJsZWQodm9pZCk7CiBleHRlcm4gaW50IGlzX2hwZXRfY2FwYWJsZSh2b2lkKTsKIGV4dGVybiBpbnQgaHBldF9yZWFkbCh1bnNpZ25lZCBsb25nIGEpOworI2Vsc2UKK2V4dGVybiBpbnQgaHBldF9lbmFibGUodm9pZCk7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCiBleHRlcm4gaW50IGhwZXRfbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKTsKQEAgLTExMCw1ICsxMTMsMTAgQEAKIGV4dGVybiBpbnQgaHBldF9ydGNfdGltZXJfaW5pdCh2b2lkKTsKIGV4dGVybiBpcnFyZXR1cm5fdCBocGV0X3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKICNlbmRpZiAvKiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQyAqLworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBocGV0X2VuYWJsZSh2b2lkKSB7IHJldHVybiAwOyB9CisKICNlbmRpZiAvKiBDT05GSUdfSFBFVF9USU1FUiAqLwogI2VuZGlmIC8qIF9JMzg2X0hQRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9pODI1My5oIGIvaW5jbHVkZS9hc20taTM4Ni9pODI1My5oCmluZGV4IDAxNWQ4ZGYuLjZjYjBkZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaTgyNTMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2k4MjUzLmgKQEAgLTEsNiArMSwyMSBAQAogI2lmbmRlZiBfX0FTTV9JODI1M19IX18KICNkZWZpbmUgX19BU01fSTgyNTNfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisKIGV4dGVybiBzcGlubG9ja190IGk4MjUzX2xvY2s7CiAKK2V4dGVybiBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpnbG9iYWxfY2xvY2tfZXZlbnQ7CisKKy8qKgorICogcGl0X2ludGVycnVwdF9ob29rIC0gaG9vayBpbnRvIHRpbWVyIHRpY2sKKyAqIEByZWdzOglzdGFuZGFyZCByZWdpc3RlcnMgZnJvbSBpbnRlcnJ1cHQKKyAqCisgKiBDYWxsIHRoZSBnbG9iYWwgY2xvY2sgZXZlbnQgaGFuZGxlci4KKyAqKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwaXRfaW50ZXJydXB0X2hvb2sodm9pZCkKK3sKKwlnbG9iYWxfY2xvY2tfZXZlbnQtPmV2ZW50X2hhbmRsZXIoZ2xvYmFsX2Nsb2NrX2V2ZW50KTsKK30KKwogI2VuZGlmCS8qIF9fQVNNX0k4MjUzX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvZG9fdGltZXIuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L2RvX3RpbWVyLmgKaW5kZXggN2Q2MDZlMy4uNTZlNTY4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvZG9fdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9kb190aW1lci5oCkBAIC0xLDg2ICsxLDE2IEBACiAvKiBkZWZpbmVzIGZvciBpbmxpbmUgYXJjaCBzZXR1cCBmdW5jdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAKLSNpbmNsdWRlIDxhc20vYXBpYy5oPgogI2luY2x1ZGUgPGFzbS9pODI1OS5oPgorI2luY2x1ZGUgPGFzbS9pODI1My5oPgogCiAvKioKICAqIGRvX3RpbWVyX2ludGVycnVwdF9ob29rIC0gaG9vayBpbnRvIHRpbWVyIHRpY2sKLSAqIEByZWdzOglzdGFuZGFyZCByZWdpc3RlcnMgZnJvbSBpbnRlcnJ1cHQKICAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqCVRoaXMgaG9vayBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRpbWVyIGludGVycnVwdCBpcyBhY2snZC4KLSAqCUl0J3MgcHJpbWFyeSBwdXJwb3NlIGlzIHRvIGFsbG93IGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBwb3NzZXNzCi0gKglpbmRpdmlkdWFsIHBlciBDUFUgY2xvY2tzIChsaWtlIHRoZSBDUFUgQVBJQ3Mgc3VwcGx5KSB0byBicm9hZGNhc3QgdGhlCi0gKgl0aW1lciBpbnRlcnJ1cHQgYXMgYSBtZWFucyBvZiB0cmlnZ2VyaW5nIHJlc2NoZWR1bGVzIGV0Yy4KKyAqIENhbGwgdGhlIHBpdCBjbG9jayBldmVudCBoYW5kbGVyLiBzZWUgYXNtL2k4MjUzLmgKICAqKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdF9ob29rKHZvaWQpCiB7Ci0JZG9fdGltZXIoMSk7Ci0jaWZuZGVmIENPTkZJR19TTVAKLQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGVfdm0oZ2V0X2lycV9yZWdzKCkpKTsKLSNlbmRpZgotLyoKLSAqIEluIHRoZSBTTVAgY2FzZSB3ZSB1c2UgdGhlIGxvY2FsIEFQSUMgdGltZXIgaW50ZXJydXB0IHRvIGRvIHRoZQotICogcHJvZmlsaW5nLCBleGNlcHQgd2hlbiB3ZSBzaW11bGF0ZSBTTVAgbW9kZSBvbiBhIHVuaXByb2Nlc3NvcgotICogc3lzdGVtLCBpbiB0aGF0IGNhc2Ugd2UgaGF2ZSB0byBjYWxsIHRoZSBsb2NhbCBpbnRlcnJ1cHQgaGFuZGxlci4KLSAqLwotI2lmbmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Ci0jZWxzZQotCWlmICghdXNpbmdfYXBpY190aW1lcikKLQkJc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdCgpOwotI2VuZGlmCi19Ci0KLQotLyogeW91IGNhbiBzYWZlbHkgdW5kZWZpbmUgdGhpcyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgTmVwdHVuZSBjaGlwc2V0ICovCi0KLSNkZWZpbmUgQlVHR1lfTkVQVFVOX1RJTUVSCi0KLS8qKgotICogZG9fdGltZXJfb3ZlcmZsb3cgLSBwcm9jZXNzIGEgZGV0ZWN0ZWQgdGltZXIgb3ZlcmZsb3cgY29uZGl0aW9uCi0gKiBAY291bnQ6CWhhcmR3YXJlIHRpbWVyIGludGVycnVwdCBjb3VudCBvbiBvdmVyZmxvdwotICoKLSAqIERlc2NyaXB0aW9uOgotICoJVGhpcyBjYWxsIGlzIGludm9rZWQgd2hlbiB0aGUgamlmZmllcyBjb3VudCBoYXMgbm90IGluY3JlbWVudGVkIGJ1dAotICoJdGhlIGhhcmR3YXJlIHRpbWVyIGludGVycnVwdCBoYXMuICBJdCBtZWFucyB0aGF0IGEgdGltZXIgdGljayBpbnRlcnJ1cHQKLSAqCWNhbWUgYWxvbmcgd2hpbGUgdGhlIHByZXZpb3VzIG9uZSB3YXMgcGVuZGluZywgdGh1cyBhIHRpY2sgd2FzIG1pc3NlZAotICoqLwotc3RhdGljIGlubGluZSBpbnQgZG9fdGltZXJfb3ZlcmZsb3coaW50IGNvdW50KQotewotCWludCBpOwotCi0Jc3Bpbl9sb2NrKCZpODI1OUFfbG9jayk7Ci0JLyoKLQkgKiBUaGlzIGlzIHRyaWNreSB3aGVuIEkvTyBBUElDcyBhcmUgdXNlZDsKLQkgKiBzZWUgZG9fdGltZXJfaW50ZXJydXB0KCkuCi0JICovCi0JaSA9IGluYigweDIwKTsKLQlzcGluX3VubG9jaygmaTgyNTlBX2xvY2spOwotCQotCS8qIGFzc3VtcHRpb24gYWJvdXQgdGltZXIgYmVpbmcgSVJRMCAqLwotCWlmIChpICYgMHgwMSkgewotCQkvKgotCQkgKiBXZSBjYW5ub3QgZGV0ZWN0IGxvc3QgdGltZXIgaW50ZXJydXB0cyAuLi4gCi0JCSAqIHdlbGwsIHRoYXQncyB3aHkgd2UgY2FsbCB0aGVtIGxvc3QsIGRvbid0IHdlPyA6KQotCQkgKiBbaG1tLCBvbiB0aGUgUGVudGl1bSBhbmQgQWxwaGEgd2UgY2FuIC4uLiBzb3J0IG9mXQotCQkgKi8KLQkJY291bnQgLT0gTEFUQ0g7Ci0JfSBlbHNlIHsKLSNpZmRlZiBCVUdHWV9ORVBUVU5fVElNRVIKLQkJLyoKLQkJICogZm9yIHRoZSBOZXB0dW4gYnVnIHdlIGtub3cgdGhhdCB0aGUgJ2xhdGNoJwotCQkgKiBjb21tYW5kIGRvZXNuJ3QgbGF0Y2ggdGhlIGhpZ2ggYW5kIGxvdyB2YWx1ZQotCQkgKiBvZiB0aGUgY291bnRlciBhdG9taWNhbGx5LiBUaHVzIHdlIGhhdmUgdG8gCi0JCSAqIHN1YnN0cmFjdCAyNTYgZnJvbSB0aGUgY291bnRlciAKLQkJICogLi4uIGZ1bm55LCBpc250IGl0PyA6KQotCQkgKi8KLQkJCi0JCWNvdW50IC09IDI1NjsKLSNlbHNlCi0JCXByaW50aygiZG9fc2xvd19nZXR0aW1lb2Zmc2V0KCk6IGhhcmR3YXJlIHRpbWVyIHByb2JsZW0/XG4iKTsKLSNlbmRpZgotCX0KLQlyZXR1cm4gY291bnQ7CisJcGl0X2ludGVycnVwdF9ob29rKCk7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlci9kb190aW1lci5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvZG9fdGltZXIuaAppbmRleCAwNGU2OWMxLi42MGY5ZGNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlci9kb190aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12b3lhZ2VyL2RvX3RpbWVyLmgKQEAgLTEsMjUgKzEsMTggQEAKIC8qIGRlZmluZXMgZm9yIGlubGluZSBhcmNoIHNldHVwIGZ1bmN0aW9ucyAqLwotI2luY2x1ZGUgPGFzbS92b3lhZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogCisjaW5jbHVkZSA8YXNtL3ZveWFnZXIuaD4KKyNpbmNsdWRlIDxhc20vaTgyNTMuaD4KKworLyoqCisgKiBkb190aW1lcl9pbnRlcnJ1cHRfaG9vayAtIGhvb2sgaW50byB0aW1lciB0aWNrCisgKiBAcmVnczogICAgIHN0YW5kYXJkIHJlZ2lzdGVycyBmcm9tIGludGVycnVwdAorICoKKyAqIENhbGwgdGhlIHBpdCBjbG9jayBldmVudCBoYW5kbGVyLiBzZWUgYXNtL2k4MjUzLmgKKyAqKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBkb190aW1lcl9pbnRlcnJ1cHRfaG9vayh2b2lkKQogewotCWRvX3RpbWVyKDEpOwotI2lmbmRlZiBDT05GSUdfU01QCi0JdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlX3ZtKGlycV9yZWdzKSk7Ci0jZW5kaWYKLQorCXBpdF9pbnRlcnJ1cHRfaG9vaygpOwogCXZveWFnZXJfdGltZXJfaW50ZXJydXB0KCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRvX3RpbWVyX292ZXJmbG93KGludCBjb3VudCkKLXsKLQkvKiBjYW4ndCByZWFkIHRoZSBJU1IsIGp1c3QgYXNzdW1lIDEgdGljawotCSAgIG92ZXJmbG93ICovCi0JaWYoY291bnQgPiBMQVRDSCB8fCBjb3VudCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJWT1lBR0VSIFBST0JMRU06IGNvdW50IGlzICVkLCBsYXRjaCBpcyAlZFxuIiwgY291bnQsIExBVENIKTsKLQkJY291bnQgPSBMQVRDSDsKLQl9Ci0JY291bnQgLT0gTEFUQ0g7Ci0KLQlyZXR1cm4gY291bnQ7Ci19CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21wc3BlYy5oIGIvaW5jbHVkZS9hc20taTM4Ni9tcHNwZWMuaAppbmRleCA3NzBiZjZkLi5mMjEzNDkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21wc3BlYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjLmgKQEAgLTIzLDcgKzIzLDYgQEAKIGV4dGVybiBpbnQgbXBjX2RlZmF1bHRfdHlwZTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1wX2xhcGljX2FkZHI7CiBleHRlcm4gaW50IHBpY19tb2RlOwotZXh0ZXJuIGludCB1c2luZ19hcGljX3RpbWVyOwogCiAjaWZkZWYgQ09ORklHX0FDUEkKIGV4dGVybiB2b2lkIG1wX3JlZ2lzdGVyX2xhcGljICh1OCBpZCwgdTggZW5hYmxlZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21zci5oIGIvaW5jbHVkZS9hc20taTM4Ni9tc3IuaAppbmRleCA2MDlhMzg5Li42ZGI0MGQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21zci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbXNyLmgKQEAgLTMwNyw0ICszMDcsNyBAQAogI2RlZmluZSBNU1JfQ09SRV9QRVJGX0dMT0JBTF9DVFJMCTB4MzhmCiAjZGVmaW5lIE1TUl9DT1JFX1BFUkZfR0xPQkFMX09WRl9DVFJMCTB4MzkwCiAKKy8qIEdlb2RlIGRlZmluZWQgTVNScyAqLworI2RlZmluZSBNU1JfR0VPREVfQlVTQ09OVF9DT05GMCAgICAgICAgIDB4MTkwMAorCiAjZW5kaWYgLyogX19BU01fTVNSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdHNjLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RzYy5oCmluZGV4IGMxMzkzMzEuLmU5OTc4OTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdHNjLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90c2MuaApAQCAtMSw0OCArMSBAQAotLyoKLSAqIGxpbnV4L2luY2x1ZGUvYXNtLWkzODYvdHNjLmgKLSAqCi0gKiBpMzg2IFRTQyByZWxhdGVkIGZ1bmN0aW9ucwotICovCi0jaWZuZGVmIF9BU01faTM4Nl9UU0NfSAotI2RlZmluZSBfQVNNX2kzODZfVFNDX0gKLQotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLQotLyoKLSAqIFN0YW5kYXJkIHdheSB0byBhY2Nlc3MgdGhlIGN5Y2xlIGNvdW50ZXIgb24gaTU4NisgQ1BVcy4KLSAqIEN1cnJlbnRseSBvbmx5IHVzZWQgb24gU01QLgotICoKLSAqIElmIHlvdSByZWFsbHkgaGF2ZSBhIFNNUCBtYWNoaW5lIHdpdGggaTQ4NiBjaGlwcyBvciBvbGRlciwKLSAqIGNvbXBpbGUgZm9yIHRoYXQsIGFuZCB0aGlzIHdpbGwganVzdCBhbHdheXMgcmV0dXJuIHplcm8uCi0gKiBUaGF0J3Mgb2ssIGl0IGp1c3QgbWVhbnMgdGhhdCB0aGUgbmljZXIgc2NoZWR1bGluZyBoZXVyaXN0aWNzCi0gKiB3b24ndCB3b3JrIGZvciB5b3UuCi0gKgotICogV2Ugb25seSB1c2UgdGhlIGxvdyAzMiBiaXRzLCBhbmQgd2UnZCBzaW1wbHkgYmV0dGVyIG1ha2Ugc3VyZQotICogdGhhdCB3ZSByZXNjaGVkdWxlIGJlZm9yZSB0aGF0IHdyYXBzLiBTY2hlZHVsaW5nIGF0IGxlYXN0IGV2ZXJ5Ci0gKiBmb3VyIGJpbGxpb24gY3ljbGVzIGp1c3QgYmFzaWNhbGx5IHNvdW5kcyBsaWtlIGEgZ29vZCBpZGVhLAotICogcmVnYXJkbGVzcyBvZiBob3cgZmFzdCB0aGUgbWFjaGluZSBpcy4KLSAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzX3Q7Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3B1X2toejsKLWV4dGVybiB1bnNpZ25lZCBpbnQgdHNjX2toejsKLQotc3RhdGljIGlubGluZSBjeWNsZXNfdCBnZXRfY3ljbGVzKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHJldCA9IDA7Ci0KLSNpZm5kZWYgQ09ORklHX1g4Nl9UU0MKLQlpZiAoIWNwdV9oYXNfdHNjKQotCQlyZXR1cm4gMDsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0dFTkVSSUMpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl9UU0MpCi0JcmR0c2NsbChyZXQpOwotI2VuZGlmCi0JcmV0dXJuIHJldDsKLX0KLQotZXh0ZXJuIHZvaWQgdHNjX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBtYXJrX3RzY191bnN0YWJsZSh2b2lkKTsKLQotI2VuZGlmCisjaW5jbHVkZSA8YXNtLXg4Nl82NC90c2MuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvbGliYXRhLXBvcnRtYXAuaCBiL2luY2x1ZGUvYXNtLWlhNjQvbGliYXRhLXBvcnRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTAwYzlhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9saWJhdGEtcG9ydG1hcC5oCkBAIC0wLDAgKzEsMTIgQEAKKyNpZm5kZWYgX19BU01fSUE2NF9MSUJBVEFfUE9SVE1BUF9ICisjZGVmaW5lIF9fQVNNX0lBNjRfTElCQVRBX1BPUlRNQVBfSAorCisjZGVmaW5lIEFUQV9QUklNQVJZX0NNRAkJMHgxRjAKKyNkZWZpbmUgQVRBX1BSSU1BUllfQ1RMCQkweDNGNgorI2RlZmluZSBBVEFfUFJJTUFSWV9JUlEoZGV2KQlpc2FfaXJxX3RvX3ZlY3RvcigxNCkKKworI2RlZmluZSBBVEFfU0VDT05EQVJZX0NNRAkweDE3MAorI2RlZmluZSBBVEFfU0VDT05EQVJZX0NUTAkweDM3NgorI2RlZmluZSBBVEFfU0VDT05EQVJZX0lSUShkZXYpCWlzYV9pcnFfdG9fdmVjdG9yKDE1KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL0tidWlsZCBiL2luY2x1ZGUvYXNtLXNoL0tidWlsZAppbmRleCBjNjhlMTY4Li43NmE4Y2NmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9LYnVpbGQKKysrIGIvaW5jbHVkZS9hc20tc2gvS2J1aWxkCkBAIC0xICsxLDMgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCisKK2hlYWRlci15ICs9IGNwdS1mZWF0dXJlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9iaWdzdXIvYmlnc3VyLmggYi9pbmNsdWRlL2FzbS1zaC9iaWdzdXIvYmlnc3VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzI0NWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvYmlnc3VyL2JpZ3N1ci5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqCi0gKiBIaXRhY2hpIEJpZyBTdXIgRXZhbCBCb2FyZCBzdXBwb3J0Ci0gKgotICogRHVzdGluIE1jSW50aXJlIChkdXN0aW5Ac2Vuc29yaWEuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBEZXJpdmVkIGZyb20gSGl0YWNoaSBTSDc3NTEgcmVmZXJlbmNlIG1hbnVhbAotICogCi0gKi8KLQotI2lmbmRlZiBfQVNNX0JJR1NVUl9IXwotI2RlZmluZSBfQVNNX0JJR1NVUl9IXwotCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDY1L2hkNjQ0NjUuaD4KLQotLyogNzc1MSBJbnRlcm5hbCBJUlEncyB1c2VkIGJ5IGV4dGVybmFsIENQTEQgY29udHJvbGxlciAqLwotI2RlZmluZSBCSUdTVVJfSVJRX0xPVwkwCi0jZGVmaW5lIEJJR1NVUl9JUlFfTlVNICAxNCAgICAgICAgIC8qIEV4dGVybmFsIENQTEQgbGV2ZWwgMSBJUlFzICovCi0jZGVmaW5lIEJJR1NVUl9JUlFfSElHSCAoQklHU1VSX0lSUV9MT1cgKyBCSUdTVVJfSVJRX05VTSkKLSNkZWZpbmUgQklHU1VSXzJORExWTF9JUlFfTE9XICAgKEhENjQ0NjVfSVJRX0JBU0UrSEQ2NDQ2NV9JUlFfTlVNKSAgCi0jZGVmaW5lIEJJR1NVUl8yTkRMVkxfSVJRX05VTSAgIDMyIC8qIExldmVsIDIgSVJRcyA9IDQgcmVncyAqIDggYml0cyAqLwotI2RlZmluZSBCSUdTVVJfMk5ETFZMX0lSUV9ISUdIICAoQklHU1VSXzJORExWTF9JUlFfTE9XICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklHU1VSXzJORExWTF9JUlFfTlVNKQotCi0vKiBQQ0kgaW50ZXJydXB0IGJhc2UgbnVtYmVyIChBX0lOVEEtQV9JTlREKSAqLwotI2RlZmluZSBCSUdTVVJfU0g3NzUxX1BDSV9JUlFfQkFTRSAgKEJJR1NVUl8yTkRMVkxfSVJRX0xPVysxMCkgIAotCi0vKiBDUExEIHJlZ2lzdGVycyBhbmQgZXh0ZXJuYWwgY2hpcCBhZGRyZXNzZXMgKi8KLSNkZWZpbmUgQklHU1VSX0hENjQ0NjRfQUREUgkweEIyMDAwMDAwCi0jZGVmaW5lIEJJR1NVUl9ER0RSCTB4QjFGRkZFMDAKLSNkZWZpbmUgQklHU1VSX0JJRFIJMHhCMUZGRkQwMAotI2RlZmluZSBCSUdTVVJfQ1NMUgkweEIxRkZGQzAwCi0jZGVmaW5lIEJJR1NVUl9TVzFSCTB4QjFGRkZCMDAKLSNkZWZpbmUgQklHU1VSX0RCR1IJMHhCMUZGRkEwMAotI2RlZmluZSBCSUdTVVJfQkRUUgkweEIxRkZGOTAwCi0jZGVmaW5lIEJJR1NVUl9CRFJSCTB4QjFGRkY4MDAKLSNkZWZpbmUgQklHU1VSX1BQUjEJMHhCMUZGRjcwMAotI2RlZmluZSBCSUdTVVJfUFBSMgkweEIxRkZGNjAwCi0jZGVmaW5lIEJJR1NVUl9JREUyCTB4QjFGRkY1MDAKLSNkZWZpbmUgQklHU1VSX0lERTMJMHhCMUZGRjQwMAotI2RlZmluZSBCSUdTVVJfU1BDUgkweEIxRkZGMzAwCi0jZGVmaW5lIEJJR1NVUl9FVEhSCTB4QjFGRTAwMDAKLSNkZWZpbmUgQklHU1VSX1BQRFIJMHhCMUZERkYwMAotI2RlZmluZSBCSUdTVVJfSUNUTAkweEIxRkRGRTAwCi0jZGVmaW5lIEJJR1NVUl9JQ01ECTB4QjFGREZEMDAKLSNkZWZpbmUgQklHU1VSX0RNQTAJMHhCMUZERkMwMAotI2RlZmluZSBCSUdTVVJfRE1BMQkweEIxRkRGQjAwCi0jZGVmaW5lIEJJR1NVUl9JUlEwCTB4QjFGREZBMDAKLSNkZWZpbmUgQklHU1VSX0lSUTEJMHhCMUZERjkwMAotI2RlZmluZSBCSUdTVVJfSVJRMgkweEIxRkRGODAwCi0jZGVmaW5lIEJJR1NVUl9JUlEzCTB4QjFGREY3MDAKLSNkZWZpbmUgQklHU1VSX0lNUjAJMHhCMUZERjYwMAotI2RlZmluZSBCSUdTVVJfSU1SMQkweEIxRkRGNTAwCi0jZGVmaW5lIEJJR1NVUl9JTVIyCTB4QjFGREY0MDAKLSNkZWZpbmUgQklHU1VSX0lNUjMJMHhCMUZERjMwMAotI2RlZmluZSBCSUdTVVJfSVJMTVIwCTB4QjFGREYyMDAKLSNkZWZpbmUgQklHU1VSX0lSTE1SMQkweEIxRkRGMTAwCi0jZGVmaW5lIEJJR1NVUl9WMzIwVVNDX0FERFIgIDB4QjEwMDAwMDAKLSNkZWZpbmUgQklHU1VSX0hENjQ0NjVfQUREUiAgMHhCMDAwMDAwMAotI2RlZmluZSBCSUdTVVJfSU5URVJOQUxfQkFTRSAweEIwMDAwMDAwCi0KLS8qIFNNQyBldGhlcm5ldCBjYXJkIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgQklHU1VSX0VUSEVSX0lPUE9SVAkJMHgyMjAKLQotLyogSURFIHJlZ2lzdGVyIHBhcmFtdGVycyAqLwotI2RlZmluZSBCSUdTVVJfSURFQ01EX0lPUE9SVAkweDFmMAotI2RlZmluZSBCSUdTVVJfSURFQ1RMX0lPUE9SVAkweDFmOAotCi0vKiBMRUQgYml0IHBvc2l0aW9uIGluIEJJR1NVUl9DU0xSICovCi0jZGVmaW5lIEJJR1NVUl9MRUQgICgxPDw0KQotCi0vKiBQQ0k6IGRlZmF1bHQgTE9DQUwgbWVtb3J5IHdpbmRvdyBzaXplcyAoc2VlbiBmcm9tIFBDSSBidXMpICovCi0jZGVmaW5lIEJJR1NVUl9MU1IwX1NJWkUgICAgKDY0KigxPDwyMCkpIC8vNjRNQgotI2RlZmluZSBCSUdTVVJfTFNSMV9TSVpFICAgICg2NCooMTw8MjApKSAvLzY0TUIKLQotI2VuZGlmIC8qIF9BU01fQklHU1VSX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9iaWdzdXIvaW8uaCBiL2luY2x1ZGUvYXNtLXNoL2JpZ3N1ci9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDcwYWM4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL2JpZ3N1ci9pby5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXNoL2JpZ3N1ci9pby5oCi0gKgotICogQnkgRHVzdGluIE1jSW50aXJlIChkdXN0aW5Ac2Vuc29yaWEuY29tKSAoYykyMDAxCi0gKiBEZXJpdmVkIGZyb20gaW9faGQ2NDQ2NS5oLCB3aGljaCBib3JlIHRoZSBtZXNzYWdlOgotICogQnkgR3JlZyBCYW5rcyA8Z2JhbmtzQHBvY2tldHBlbmd1aW5zLmNvbT4KLSAqIChjKSAyMDAwIFBvY2tldFBlbmd1aW5zIEluYy4gCi0gKiBhbmQgZnJvbSBpb19oZDY0NDYxLmgsIHdoaWNoIGJvcmUgdGhlIG1lc3NhZ2U6Ci0gKiBDb3B5cmlnaHQgMjAwMCBTdHVhcnQgTWVuZWZ5IChzdHVhcnQubWVuZWZ5QHN0LmNvbSkKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogSU8gZnVuY3Rpb25zIGZvciBhIEhpdGFjaGkgQmlnIFN1ciBFdmFsdWF0aW9uIEJvYXJkLgotICovCi0KLSNpZm5kZWYgX0FTTV9TSF9JT19CSUdTVVJfSAotI2RlZmluZSBfQVNNX1NIX0lPX0JJR1NVUl9ICi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBiaWdzdXJfaXNhX3BvcnQyYWRkcih1bnNpZ25lZCBsb25nIG9mZnNldCk7Ci1leHRlcm4gaW50IGJpZ3N1cl9pcnFfZGVtdXgoaW50IGlycSk7Ci0vKiBQcm92aXNpb24gZm9yIGdlbmVyaWMgc2Vjb25kYXJ5IGRlbXV4IHN0ZXAgLS0gdXNlZCBieSBQQ01DSUEgY29kZSAqLwotZXh0ZXJuIHZvaWQgYmlnc3VyX3JlZ2lzdGVyX2lycV9kZW11eChpbnQgaXJxLAotCQlpbnQgKCpkZW11eCkoaW50IGlycSwgdm9pZCAqZGV2KSwgdm9pZCAqZGV2KTsKLWV4dGVybiB2b2lkIGJpZ3N1cl91bnJlZ2lzdGVyX2lycV9kZW11eChpbnQgaXJxKTsKLS8qIFNldCB0aGlzIHZhcmlhYmxlIHRvIDEgdG8gc2VlIHBvcnQgdHJhZmZpYyAqLwotZXh0ZXJuIGludCBiaWdzdXJfaW9fZGVidWc7Ci0vKiBNYXAgYSByYW5nZSBvZiBwb3J0cyB0byBhIHJhbmdlIG9mIGtlcm5lbCB2aXJ0dWFsIG1lbW9yeS4gKi8KLWV4dGVybiB2b2lkIGJpZ3N1cl9wb3J0X21hcCh1MzIgYmFzZXBvcnQsIHUzMiBucG9ydHMsIHUzMiBhZGRyLCB1OCBzaGlmdCk7Ci1leHRlcm4gdm9pZCBiaWdzdXJfcG9ydF91bm1hcCh1MzIgYmFzZXBvcnQsIHUzMiBucG9ydHMpOwotCi0jZW5kaWYgLyogX0FTTV9TSF9JT19CSUdTVVJfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9iaWdzdXIvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1zaC9iaWdzdXIvc2VyaWFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOGZhODIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvYmlnc3VyL3NlcmlhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXNoL2JpZ3N1ci9zZXJpYWwuaAotICoKLSAqIENvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgQmlnIFN1ciAxNjU1MCBiYXNlZCBzZXJpYWwgcG9ydHMgCi0gKiBpLmUuIEhENjQ0NjUsIFBDTUNJQSwgZXRjLgotICovCi0KLSNpZm5kZWYgX0FTTV9TRVJJQUxfQklHU1VSX0gKLSNkZWZpbmUgX0FTTV9TRVJJQUxfQklHU1VSX0gKLSNpbmNsdWRlIDxhc20vaGQ2NDQ2NS5oPgotCi0jZGVmaW5lIEJBU0VfQkFVRCAoMzM3OTIwMCAvIDE2KQotCi0jZGVmaW5lIFNURF9DT01fRkxBR1MgKEFTWU5DX0JPT1RfQVVUT0NPTkYgfCBBU1lOQ19TS0lQX1RFU1QpCi0KLQotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgLyogVUFSVCBDTEsgICBQT1JUIElSUSAgICAgRkxBR1MgICAgICAgICovICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAwLCBCQVNFX0JBVUQsIDB4M0Y4LCBIRDY0NDY1X0lSUV9VQVJULCBTVERfQ09NX0ZMQUdTIH0gLyogdHR5UzAgKi8gCi0KLS8qIFhYWDogVGhpcyBzaG91bGQgYmUgbW92ZWQgaW5vIGlycS5oICovCi0jZGVmaW5lIGlycV9jYW5ub25pY2FsaXplKHgpICh4KQotCi0jZW5kaWYgLyogX0FTTV9TRVJJQUxfQklHU1VSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2J1Z3MuaCBiL2luY2x1ZGUvYXNtLXNoL2J1Z3MuaAppbmRleCBhMjk0OTk3Li41YTExN2VjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9idWdzLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvYnVncy5oCkBAIC0xOSw5ICsxOSw5IEBACiAJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OwogCWNoYXIgKnAgPSAmaW5pdF91dHNuYW1lKCktPm1hY2hpbmVbMl07IC8qICJzaCIgKi8KIAotCWNwdV9kYXRhLT5sb29wc19wZXJfamlmZnkgPSBsb29wc19wZXJfamlmZnk7CisJY3VycmVudF9jcHVfZGF0YS5sb29wc19wZXJfamlmZnkgPSBsb29wc19wZXJfamlmZnk7CiAKLQlzd2l0Y2ggKGNwdV9kYXRhLT50eXBlKSB7CisJc3dpdGNoIChjdXJyZW50X2NwdV9kYXRhLnR5cGUpIHsKIAljYXNlIENQVV9TSDc2MDQgLi4uIENQVV9TSDc2MTk6CiAJCSpwKysgPSAnMic7CiAJCWJyZWFrOwpAQCAtNTQsNyArNTQsNyBAQAogCQlicmVhazsKIAl9CiAKLQlwcmludGsoIkNQVTogJXNcbiIsIGdldF9jcHVfc3VidHlwZSgpKTsKKwlwcmludGsoIkNQVTogJXNcbiIsIGdldF9jcHVfc3VidHlwZSgmY3VycmVudF9jcHVfZGF0YSkpOwogCiAjaWZuZGVmIF9fTElUVExFX0VORElBTl9fCiAJLyogJ2ViJyBtZWFucyAnRW5kaWFuIEJpZycgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLXNoL2NhY2hlZmx1c2guaAppbmRleCAwN2Y2MmVjLi4yMmYxMjYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY2FjaGVmbHVzaC5oCkBAIC0zMCw1ICszMCw4IEBACiAKICNkZWZpbmUgSEFWRV9BUkNIX1VOTUFQUEVEX0FSRUEKIAorLyogUGFnZSBmbGFnIGZvciBsYXp5IGRjYWNoZSB3cml0ZS1iYWNrIGZvciB0aGUgYWxpYXNpbmcgVVAgY2FjaGVzICovCisjZGVmaW5lIFBHX2RjYWNoZV9kaXJ0eQlQR19hcmNoXzEKKwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfX0FTTV9TSF9DQUNIRUZMVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9jYWNoZWZsdXNoLmgKaW5kZXggZjcwZDhlZjcuLjZmYWJiYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvY2FjaGVmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvY2FjaGVmbHVzaC5oCkBAIC0zNiw4ICszNiw2IEBACiAgLyogMzJLQiBjYWNoZSwgNGtiIFBBR0Ugc2l6ZXMgbmVlZCB0byBjaGVjayBiaXQgMTIgKi8KICNkZWZpbmUgQ0FDSEVfQUxJQVMgMHgwMDAwMTAwMAogCi0jZGVmaW5lIFBHX21hcHBlZAlQR19hcmNoXzEKLQogdm9pZCBmbHVzaF9jYWNoZV9hbGwodm9pZCk7CiB2b2lkIGZsdXNoX2NhY2hlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKICNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKSBmbHVzaF9jYWNoZV9tbShtbSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9jYWNoZWZsdXNoLmgKaW5kZXggYjAxYTEwZi4uYjM3NDZhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9jYWNoZWZsdXNoLmgKQEAgLTE3LDYgKzE3LDcgQEAKICAqICBzbyB3ZSBuZWVkIHRoZW0uCiAgKi8KIHZvaWQgZmx1c2hfY2FjaGVfYWxsKHZvaWQpOwordm9pZCBmbHVzaF9kY2FjaGVfYWxsKHZvaWQpOwogdm9pZCBmbHVzaF9jYWNoZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiAjZGVmaW5lIGZsdXNoX2NhY2hlX2R1cF9tbShtbSkgZmx1c2hfY2FjaGVfbW0obW0pCiB2b2lkIGZsdXNoX2NhY2hlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LApAQCAtMzgsMTYgKzM5LDQgQEAKIC8qIEluaXRpYWxpemF0aW9uIG9mIFAzIGFyZWEgZm9yIGNvcHlfdXNlcl9wYWdlICovCiB2b2lkIHAzX2NhY2hlX2luaXQodm9pZCk7CiAKLSNkZWZpbmUgUEdfbWFwcGVkCVBHX2FyY2hfMQotCi0jaWZkZWYgQ09ORklHX01NVQotZXh0ZXJuIGludCByZW1hcF9hcmVhX3BhZ2VzKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLSNlbHNlIC8qIENPTkZJR19NTVUgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHJlbWFwX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKLQkJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX01NVSAqLwogI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDRfQ0FDSEVGTFVTSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2RtYS5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9kbWEuaAppbmRleCAzZTRiM2U2Li5jMTM1ZTljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZG1hLmgKQEAgLTMsNiArMywxNyBAQAogCiAjZGVmaW5lIERNQU9SX0lOSVQJKCAweDgwMDAgfCBETUFPUl9ETUUgKQogCisvKiBTSDc3NTEvNzc2MC83NzgwIERNQSBJUlEgc291cmNlcyAqLworI2RlZmluZSBETVRFMF9JUlEJMzQKKyNkZWZpbmUgRE1URTFfSVJRCTM1CisjZGVmaW5lIERNVEUyX0lSUQkzNgorI2RlZmluZSBETVRFM19JUlEJMzcKKyNkZWZpbmUgRE1URTRfSVJRCTQ0CisjZGVmaW5lIERNVEU1X0lSUQk0NQorI2RlZmluZSBETVRFNl9JUlEJNDYKKyNkZWZpbmUgRE1URTdfSVJRCTQ3CisjZGVmaW5lIERNQUVfSVJRCTM4CisKICNpZmRlZiBDT05GSUdfQ1BVX1NINEEKICNkZWZpbmUgU0hfRE1BQ19CQVNFCTB4ZmM4MDgwMjAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXNoL2RtYS1tYXBwaW5nLmgKaW5kZXggOGQwODY3Yi4uZDNiYzc4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvZG1hLW1hcHBpbmcuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9kbWEtbWFwcGluZy5oCkBAIC01Myw2ICs1MywxMCBAQAogCWNvbnNpc3RlbnRfZnJlZSh2YWRkciwgc2l6ZSk7CiB9CiAKKyNkZWZpbmUgZG1hX2FsbG9jX25vbmNvaGVyZW50KGQsIHMsIGgsIGYpIGRtYV9hbGxvY19jb2hlcmVudChkLCBzLCBoLCBmKQorI2RlZmluZSBkbWFfZnJlZV9ub25jb2hlcmVudChkLCBzLCB2LCBoKSBkbWFfZnJlZV9jb2hlcmVudChkLCBzLCB2LCBoKQorI2RlZmluZSBkbWFfaXNfY29uc2lzdGVudChkLCBoKSAoMSkKKwogc3RhdGljIGlubGluZSB2b2lkIGRtYV9jYWNoZV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdmFkZHIsIHNpemVfdCBzaXplLAogCQkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZWMzMTA0L2VjMzEwNC5oIGIvaW5jbHVkZS9hc20tc2gvZWMzMTA0L2VjMzEwNC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzljZmE0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL2VjMzEwNC9lYzMxMDQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSNpZm5kZWYgX19BU01fRUMzMTA0X0gKLSNkZWZpbmUgX19BU01fRUMzMTA0X0gKLQotCi0vKgotICogTW9zdCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGlzIGF0IDB4YjBlYzAwMDAgLSAweGIwZWNmZmZmLgotICoKLSAqIGFzIGZhciBhcyBJJ3ZlIGZpZ3VyZWQgaXQgb3V0IHRoZSByZWdpc3RlciBtYXAgaXM6Ci0gKiAweGIwZWMwMDAwIC0gaWQgc3RyaW5nCi0gKiAweGIwZWMwWFhYIC0gcG93ZXIgbWFuYWdlbWVudAotICogMHhiMGVjMVhYWCAtIGludGVycnVwdCBjb250cm9sCi0gKiAweGIwZWMzWFhYIC0gcHMyIHBvcnQgKHRvdWNoIHBhZCBvbiBhZXJvIDgwMDApCi0gKiAweGIwZWM2WFhYIC0gaTJjCi0gKiAweGIwZWM3MDAwIC0gZmlyc3Qgc2VyaWFsIHBvcnQgKHByb3ByaWV0YXJ5IGNvbm5lY3RvciBvbiBhZXJvIDgwMDApCi0gKiAweGIwZWM4MDAwIC0gc2Vjb25kIHNlcmlhbCBwb3J0Ci0gKiAweGIwZWM5MDAwIC0gdGhpcmQgc2VyaWFsIHBvcnQKLSAqIDB4YjBlY2EwMDAgLSBmb3VydGggc2VyaWFsIHBvcnQgKGtleWJvYXJkIGNvbnRyb2xsZXIgb24gYWVybyA4MDAwKQotICogMHhiMGVjY1hYWCAtIEdQSU8KLSAqIDB4YjBlY2RYWFggLSBHUElPCi0gKi8KLQotI2RlZmluZSBFQzMxMDRfQkFTRQkweGIwZWMwMDAwCi0KLSNkZWZpbmUgRUMzMTA0X1NFUjRfREFUQQkoRUMzMTA0X0JBU0UrMHhhMDAwKQotI2RlZmluZSBFQzMxMDRfU0VSNF9JSVIJCShFQzMxMDRfQkFTRSsweGEwMDgpCi0jZGVmaW5lIEVDMzEwNF9TRVI0X01DUgkJKEVDMzEwNF9CQVNFKzB4YTAxMCkKLSNkZWZpbmUgRUMzMTA0X1NFUjRfTFNSCQkoRUMzMTA0X0JBU0UrMHhhMDE0KQotI2RlZmluZSBFQzMxMDRfU0VSNF9NU1IJCShFQzMxMDRfQkFTRSsweGEwMTgpCi0KLS8qCi0gKiBvdXIgSVNBIGJ1cy4gIHRoaXMgc2VlbXMgdG8gYmUgcmVhbCBJU0EuCi0gKi8KLSNkZWZpbmUgRUMzMTA0X0lTQV9CQVNFCTB4YTUwMDAwMDAKLQotI2RlZmluZSBFQzMxMDRfSVJRCTExCi0jZGVmaW5lIEVDMzEwNF9JUlFCQVNFCTY0Ci0KLSNkZWZpbmUgRUMzMTA0X0lSUV9TRVIxCUVDMzEwNF9JUlFCQVNFICsgNwotI2RlZmluZSBFQzMxMDRfSVJRX1NFUjIJRUMzMTA0X0lSUUJBU0UgKyA4Ci0jZGVmaW5lIEVDMzEwNF9JUlFfU0VSMwlFQzMxMDRfSVJRQkFTRSArIDkKLSNkZWZpbmUgRUMzMTA0X0lSUV9TRVI0CUVDMzEwNF9JUlFCQVNFICsgMTAKLQotI2VuZGlmIC8qIF9fQVNNX0VDMzEwNF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9lYzMxMDQvaW8uaCBiL2luY2x1ZGUvYXNtLXNoL2VjMzEwNC9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTVjOGU2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL2VjMzEwNC9pby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1NIX0lPX0VDMzEwNF9ICi0jZGVmaW5lIF9BU01fU0hfSU9fRUMzMTA0X0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIGVjMzEwNF9pbmIodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBlYzMxMDRfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBlYzMxMDRfaW5sKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLWV4dGVybiB2b2lkIGVjMzEwNF9vdXRiKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBlYzMxMDRfb3V0dyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIGVjMzEwNF9vdXRsKHVuc2lnbmVkIGxvbmcgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLWV4dGVybiBpbnQgZWMzMTA0X2lycV9kZW11eChpbnQgaXJxKTsKLQotI2VuZGlmIC8qIF9BU01fU0hfSU9fRUMzMTA0X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2VjMzEwNC9rZXlib2FyZC5oIGIvaW5jbHVkZS9hc20tc2gvZWMzMTA0L2tleWJvYXJkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjUzYTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvZWMzMTA0L2tleWJvYXJkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1leHRlcm4gdW5zaWduZWQgY2hhciBlYzMxMDRfa2JkX3N5c3JxX3hsYXRlW107Ci1leHRlcm4gaW50IGVjMzEwNF9rYmRfc2V0a2V5Y29kZSh1bnNpZ25lZCBpbnQgc2NhbmNvZGUsIHVuc2lnbmVkIGludCBrZXljb2RlKTsKLWV4dGVybiBpbnQgZWMzMTA0X2tiZF9nZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSk7Ci1leHRlcm4gaW50IGVjMzEwNF9rYmRfdHJhbnNsYXRlKHVuc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIgKiwgY2hhcik7Ci1leHRlcm4gY2hhciBlYzMxMDRfa2JkX3VuZXhwZWN0ZWRfdXAodW5zaWduZWQgY2hhcik7Ci1leHRlcm4gdm9pZCBlYzMxMDRfa2JkX2xlZHModW5zaWduZWQgY2hhcik7Ci1leHRlcm4gdm9pZCBlYzMxMDRfa2JkX2luaXRfaHcodm9pZCk7Ci0KLSNkZWZpbmUga2JkX3N5c3JxX3hsYXRlIGVjMzEwNF9rYmRfc3lzcnFfeGxhdGUKLSNkZWZpbmUga2JkX3NldGtleWNvZGUgZWMzMTA0X2tiZF9zZXRrZXljb2RlCi0jZGVmaW5lIGtiZF9nZXRrZXljb2RlIGVjMzEwNF9rYmRfZ2V0a2V5Y29kZQotI2RlZmluZSBrYmRfdHJhbnNsYXRlIGVjMzEwNF9rYmRfdHJhbnNsYXRlCi0jZGVmaW5lIGtiZF91bmV4cGVjdGVkX3VwIGVjMzEwNF9rYmRfdW5leHBlY3RlZF91cAotI2RlZmluZSBrYmRfbGVkcyBlYzMxMDRfa2JkX2xlZHMKLSNkZWZpbmUga2JkX2luaXRfaHcgZWMzMTA0X2tiZF9pbml0X2h3CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9lYzMxMDQvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1zaC9lYzMxMDQvc2VyaWFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTRkNzguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvZWMzMTA0L3NlcmlhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS9lYzMxMDQuaD4KLS8qIE5hdHVyYWxseSB3ZSBkb24ndCBrbm93IHRoZSBleGFjdCB2YWx1ZSBidXQgMTE1MjAwIGJhdWQgaGFzIGEgZGl2aXNvcgotICogb2YgOSBhbmQgMTkyMDAgYmF1ZCBoYXMgYSBkaXZpc29yIG9mIDUyLCBzbyB0aGlzIHNlZW1zIGxpa2UgYSBnb29kCi0gKiBndWVzcy4gICovCi0jZGVmaW5lIEJBU0VfQkFVRCAoMTY4MDAwMDAgLyAxNikKLQotI2RlZmluZSBTVERfQ09NX0ZMQUdTIChBU1lOQ19CT09UX0FVVE9DT05GIHwgQVNZTkNfU0tJUF9URVNUKQotCi0vKiB0aGVyZSBpcyBhIGZvdXJ0aCBzZXJpYWwgcG9ydCB3aXRoIHRoZSBleHBlY3RlZCB2YWx1ZXMgYXMgd2VsbCwgYnV0Ci0gKiBpdCdzIGdvdCB0aGUga2V5Ym9hcmQgY29udHJvbGxlciBiZWhpbmQgaXQgc28gd2UgY2FuJ3QgcmVhbGx5IHVzZSBpdAotICogKHdpdGhvdXQgbW92aW5nIHRoZSBrZXlib2FyZCBkcml2ZXIgdG8gdXNlcnNwYWNlLCB3aGljaCBkb2Vzbid0IHNvdW5kCi0gKiBsaWtlIGEgdmVyeSBnb29kIGlkZWEpICovCi0jZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMJCQlcCi0JLyogVUFSVCBDTEsgICBQT1JUIElSUSAgICAgRkxBR1MgICAgICAgICovCQkJXAotCXsgMCwgQkFTRV9CQVVELCAweDExQzAwLCBFQzMxMDRfSVJRQkFTRSs3LCBTVERfQ09NX0ZMQUdTIH0sIC8qIHR0eVMwICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjAwMCwgRUMzMTA0X0lSUUJBU0UrOCwgU1REX0NPTV9GTEFHUyB9LCAvKiB0dHlTMSAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTI0MDAsIEVDMzEwNF9JUlFCQVNFKzksIFNURF9DT01fRkxBR1MgfSwgLyogdHR5UzIgKi8KLQotLyogWFhYOiBUaGlzIHNob3VsZCBiZSBtb3ZlZCBpbm8gaXJxLmggKi8KLSNkZWZpbmUgaXJxX2Nhbm5vbmljYWxpemUoeCkgKHgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9pcnEuaCBiL2luY2x1ZGUvYXNtLXNoL2lycS5oCmluZGV4IGJmZjk2NWUuLjhjY2Y3YWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2lycS5oCkBAIC02NiwxMiArNjYsOCBAQAogLyogMy4gT0ZGQ0hJUF9OUl9JUlFTICovCiAjaWYgZGVmaW5lZChDT05GSUdfSEQ2NDQ2MSkKICMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAxOAotI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NIX0JJR1NVUikgLyogbXVzdCBiZSBiZWZvcmUgQ09ORklHX0hENjQ0NjUgKi8KLSMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyA0OAogI2VsaWYgZGVmaW5lZChDT05GSUdfSEQ2NDQ2NSkKICMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAxNgotI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NIX0VDMzEwNCkKLSMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAxNgogI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NIX0RSRUFNQ0FTVCkKICMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyA5NgogI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NIX1RJVEFOKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gva2dkYi5oIGIvaW5jbHVkZS9hc20tc2gva2dkYi5oCmluZGV4IDdiMjZmNTMuLjAwOTVjNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2tnZGIuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9rZ2RiLmgKQEAgLTg1LDEwICs4NSwxMCBAQAogI2RlZmluZSBLR0RCX1BSSU5USyguLi4pIHByaW50aygiS0dEQjogIiBfX1ZBX0FSR1NfXykKIAogLyogRm9yY2VkIGJyZWFrcG9pbnQgKi8KLSNkZWZpbmUgQlJFQUtQT0lOVCgpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoa2dkYl9lbmFibGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXNtIHZvbGF0aWxlKCJ0cmFwYSAgICMweGZmIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBCUkVBS1BPSU5UKCkJCQkJCVwKK2RvIHsJCQkJCQkJXAorCWlmIChrZ2RiX2VuYWJsZWQpCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oInRyYXBhICAgIzB4M2MiKTsJXAogfSB3aGlsZSAoMCkKIAogLyogS0dEQiBzaG91bGQgYmUgYWJsZSB0byBmbHVzaCBhbGwga2VybmVsIHRleHQgc3BhY2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL21tdS5oIGIvaW5jbHVkZS9hc20tc2gvbW11LmgKaW5kZXggY2Y0N2RmNy4uZWIwMzU4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvbW11LmgKKysrIGIvaW5jbHVkZS9hc20tc2gvbW11LmgKQEAgLTEsMjUgKzEsMTkgQEAKICNpZm5kZWYgX19NTVVfSAogI2RlZmluZSBfX01NVV9ICiAKLSNpZiAhZGVmaW5lZChDT05GSUdfTU1VKQorLyogRGVmYXVsdCAidW5zaWduZWQgbG9uZyIgY29udGV4dCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG1tX2NvbnRleHRfaWRfdFtOUl9DUFVTXTsKIAogdHlwZWRlZiBzdHJ1Y3QgeworI2lmZGVmIENPTkZJR19NTVUKKwltbV9jb250ZXh0X2lkX3QJCWlkOworCXZvaWQJCQkqdmRzbzsKKyNlbHNlCiAJc3RydWN0IHZtX2xpc3Rfc3RydWN0CSp2bWxpc3Q7CiAJdW5zaWduZWQgbG9uZwkJZW5kX2JyazsKKyNlbmRpZgogfSBtbV9jb250ZXh0X3Q7CiAKLSNlbHNlCi0KLS8qIERlZmF1bHQgInVuc2lnbmVkIGxvbmciIGNvbnRleHQgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBtbV9jb250ZXh0X2lkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQltbV9jb250ZXh0X2lkX3QgaWQ7Ci0Jdm9pZCAqdmRzbzsKLX0gbW1fY29udGV4dF90OwotCi0jZW5kaWYgLyogQ09ORklHX01NVSAqLwotCiAvKgogICogUHJpdmlsZWdlZCBTcGFjZSBNYXBwaW5nIEJ1ZmZlciAoUE1CKSBkZWZpbml0aW9ucwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tc2gvbW11X2NvbnRleHQuaAppbmRleCA0NmYwNGUyLi4zNDIwMjQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL21tdV9jb250ZXh0LmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAxOTk5IE5paWJlIFl1dGFrYQotICogQ29weXJpZ2h0IChDKSAyMDAzIFBhdWwgTXVuZHQKKyAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDYgUGF1bCBNdW5kdAogICoKICAqIEFTSUQgaGFuZGxpbmcgaWRlYSB0YWtlbiBmcm9tIE1JUFMgaW1wbGVtZW50YXRpb24uCiAgKi8KQEAgLTE5LDExICsxOSw2IEBACiAgKiAgICAoYikgQVNJRCAoQWRkcmVzcyBTcGFjZSBJRGVudGlmaWVyKQogICovCiAKLS8qCi0gKiBDYWNoZSBvZiBNTVUgY29udGV4dCBsYXN0IHVzZWQuCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIG1tdV9jb250ZXh0X2NhY2hlOwotCiAjZGVmaW5lIE1NVV9DT05URVhUX0FTSURfTUFTSwkJMHgwMDAwMDBmZgogI2RlZmluZSBNTVVfQ09OVEVYVF9WRVJTSU9OX01BU0sJMHhmZmZmZmYwMAogI2RlZmluZSBNTVVfQ09OVEVYVF9GSVJTVF9WRVJTSU9OCTB4MDAwMDAxMDAKQEAgLTMyLDYgKzI3LDExIEBACiAvKiBBU0lEIGlzIDgtYml0IHZhbHVlLCBzbyBpdCBjYW4ndCBiZSAweDEwMCAqLwogI2RlZmluZSBNTVVfTk9fQVNJRAkJCTB4MTAwCiAKKyNkZWZpbmUgY3B1X2NvbnRleHQoY3B1LCBtbSkJKChtbSktPmNvbnRleHQuaWRbY3B1XSkKKyNkZWZpbmUgY3B1X2FzaWQoY3B1LCBtbSkJKGNwdV9jb250ZXh0KChjcHUpLCAobW0pKSAmIFwKKwkJCQkgTU1VX0NPTlRFWFRfQVNJRF9NQVNLKQorI2RlZmluZSBhc2lkX2NhY2hlKGNwdSkJCShjcHVfZGF0YVtjcHVdLmFzaWRfY2FjaGUpCisKIC8qCiAgKiBWaXJ0dWFsIFBhZ2UgTnVtYmVyIG1hc2sKICAqLwpAQCAtNDEsMTggKzQxLDE3IEBACiAvKgogICogR2V0IE1NVSBjb250ZXh0IGlmIG5lZWRlZC4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGdldF9tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JdW5zaWduZWQgbG9uZyBtYyA9IG1tdV9jb250ZXh0X2NhY2hlOworCXVuc2lnbmVkIGxvbmcgYXNpZCA9IGFzaWRfY2FjaGUoY3B1KTsKIAogCS8qIENoZWNrIGlmIHdlIGhhdmUgb2xkIHZlcnNpb24gb2YgY29udGV4dC4gKi8KLQlpZiAoKChtbS0+Y29udGV4dC5pZCBeIG1jKSAmIE1NVV9DT05URVhUX1ZFUlNJT05fTUFTSykgPT0gMCkKKwlpZiAoKChjcHVfY29udGV4dChjcHUsIG1tKSBeIGFzaWQpICYgTU1VX0NPTlRFWFRfVkVSU0lPTl9NQVNLKSA9PSAwKQogCQkvKiBJdCdzIHVwIHRvIGRhdGUsIGRvIG5vdGhpbmcgKi8KIAkJcmV0dXJuOwogCiAJLyogSXQncyBvbGQsIHdlIG5lZWQgdG8gZ2V0IG5ldyBjb250ZXh0IHdpdGggbmV3IHZlcnNpb24uICovCi0JbWMgPSArK21tdV9jb250ZXh0X2NhY2hlOwotCWlmICghKG1jICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLKSkgeworCWlmICghKCsrYXNpZCAmIE1NVV9DT05URVhUX0FTSURfTUFTSykpIHsKIAkJLyoKIAkJICogV2UgZXhoYXVzdCBBU0lEIG9mIHRoaXMgdmVyc2lvbi4KIAkJICogRmx1c2ggYWxsIFRMQiBhbmQgc3RhcnQgbmV3IGN5Y2xlLgpAQCAtNjMsMTAgKzYyLDExIEBACiAJCSAqIEZpeCB2ZXJzaW9uOyBOb3RlIHRoYXQgd2UgYXZvaWQgdmVyc2lvbiAjMAogCQkgKiB0byBkaXN0aW5ndXNoIE5PX0NPTlRFWFQuCiAJCSAqLwotCQlpZiAoIW1jKQotCQkJbW11X2NvbnRleHRfY2FjaGUgPSBtYyA9IE1NVV9DT05URVhUX0ZJUlNUX1ZFUlNJT047CisJCWlmICghYXNpZCkKKwkJCWFzaWQgPSBNTVVfQ09OVEVYVF9GSVJTVF9WRVJTSU9OOwogCX0KLQltbS0+Y29udGV4dC5pZCA9IG1jOworCisJY3B1X2NvbnRleHQoY3B1LCBtbSkgPSBhc2lkX2NhY2hlKGNwdSkgPSBhc2lkOwogfQogCiAvKgpAQCAtNzQsOSArNzQsMTMgQEAKICAqIGluc3RhbmNlLgogICovCiBzdGF0aWMgaW5saW5lIGludCBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQkJCSAgICAgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKKwkJCQkgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQltbS0+Y29udGV4dC5pZCA9IE5PX0NPTlRFWFQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX29ubGluZV9jcHVzKCk7IGkrKykKKwkJY3B1X2NvbnRleHQoaSwgbW0pID0gTk9fQ09OVEVYVDsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMTcsMTAgKzEyMSwxMCBAQAogICogQWZ0ZXIgd2UgaGF2ZSBzZXQgY3VycmVudC0+bW0gdG8gYSBuZXcgdmFsdWUsIHRoaXMgYWN0aXZhdGVzCiAgKiB0aGUgY29udGV4dCBmb3IgdGhlIG5ldyBtbSBzbyB3ZSBzZWUgdGhlIG5ldyBtYXBwaW5ncy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCitzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgaW50IGNwdSkKIHsKLQlnZXRfbW11X2NvbnRleHQobW0pOwotCXNldF9hc2lkKG1tLT5jb250ZXh0LmlkICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLKTsKKwlnZXRfbW11X2NvbnRleHQobW0sIGNwdSk7CisJc2V0X2FzaWQoY3B1X2FzaWQoY3B1LCBtbSkpOwogfQogCiAvKiBNTVVfVFRCIGlzIHVzZWQgZm9yIG9wdGltaXppbmcgdGhlIGZhdWx0IGhhbmRsaW5nLiAqLwpAQCAtMTM4LDEwICsxNDIsMTUgQEAKIAkJCSAgICAgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKIAkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwogCWlmIChsaWtlbHkocHJldiAhPSBuZXh0KSkgeworCQljcHVfc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spOwogCQlzZXRfVFRCKG5leHQtPnBnZCk7Ci0JCWFjdGl2YXRlX2NvbnRleHQobmV4dCk7Ci0JfQorCQlhY3RpdmF0ZV9jb250ZXh0KG5leHQsIGNwdSk7CisJfSBlbHNlCisJCWlmICghY3B1X3Rlc3RfYW5kX3NldChjcHUsIG5leHQtPmNwdV92bV9tYXNrKSkKKwkJCWFjdGl2YXRlX2NvbnRleHQobmV4dCwgY3B1KTsKIH0KIAogI2RlZmluZSBkZWFjdGl2YXRlX21tKHRzayxtbSkJZG8geyB9IHdoaWxlICgwKQpAQCAtMTU5LDcgKzE2OCw3IEBACiAjZGVmaW5lIGRlc3Ryb3lfY29udGV4dChtbSkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgc2V0X2FzaWQoYXNpZCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGdldF9hc2lkKCkJCQkoMCkKLSNkZWZpbmUgYWN0aXZhdGVfY29udGV4dChtbSkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgYWN0aXZhdGVfY29udGV4dChtbSxjcHUpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgc3dpdGNoX21tKHByZXYsbmV4dCx0c2spCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZGVhY3RpdmF0ZV9tbSh0c2ssbW0pCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGFjdGl2YXRlX21tKHByZXYsbmV4dCkJCWRvIHsgfSB3aGlsZSAoMCkKQEAgLTE3NCwxNCArMTgzLDE2IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfbW11KHZvaWQpCiB7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwogCS8qIEVuYWJsZSBNTVUgKi8KIAljdHJsX291dGwoTU1VX0NPTlRST0xfSU5JVCwgTU1VQ1IpOwogCWN0cmxfYmFycmllcigpOwogCi0JaWYgKG1tdV9jb250ZXh0X2NhY2hlID09IE5PX0NPTlRFWFQpCi0JCW1tdV9jb250ZXh0X2NhY2hlID0gTU1VX0NPTlRFWFRfRklSU1RfVkVSU0lPTjsKKwlpZiAoYXNpZF9jYWNoZShjcHUpID09IE5PX0NPTlRFWFQpCisJCWFzaWRfY2FjaGUoY3B1KSA9IE1NVV9DT05URVhUX0ZJUlNUX1ZFUlNJT047CiAKLQlzZXRfYXNpZChtbXVfY29udGV4dF9jYWNoZSAmIE1NVV9DT05URVhUX0FTSURfTUFTSyk7CisJc2V0X2FzaWQoYXNpZF9jYWNoZShjcHUpICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfbW11KHZvaWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wYWdlLmggYi9pbmNsdWRlL2FzbS1zaC9wYWdlLmgKaW5kZXggMzgwZmQ2Mi4uYWM0YjQ2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaApAQCAtMTMsNiArMTMsOCBAQAogICAgWyBQNCBjb250cm9sICAgXQkJMHhFMDAwMDAwMAogICovCiAKKyNpZmRlZiBfX0tFUk5FTF9fCisKIC8qIFBBR0VfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgcGFnZSBzaXplICovCiAjaWYgZGVmaW5lZChDT05GSUdfUEFHRV9TSVpFXzRLQikKICMgZGVmaW5lIFBBR0VfU0hJRlQJMTIKQEAgLTUxLDcgKzUzLDYgQEAKICNkZWZpbmUgSFVHRVRMQl9QQUdFX09SREVSCShIUEFHRV9TSElGVC1QQUdFX1NISUZUKQogI2VuZGlmCiAKLSNpZmRlZiBfX0tFUk5FTF9fCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiBleHRlcm4gdm9pZCAoKmNsZWFyX3BhZ2UpKHZvaWQgKnRvKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXNoL3BndGFibGUuaAppbmRleCAwMzZjYTI4Li45MjE0YzAxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oCkBAIC00MywxNyArNDMsMTcgQEAKIC8qIFBHRCBiaXRzICovCiAjZGVmaW5lIFBHRElSX1NISUZUCShQVEVfU0hJRlQgKyBQVEVfQklUUykKICNkZWZpbmUgUEdESVJfQklUUwkoMzIgLSBQR0RJUl9TSElGVCkKLSNkZWZpbmUgUEdESVJfU0laRQkoMSA8PCBQR0RJUl9TSElGVCkKKyNkZWZpbmUgUEdESVJfU0laRQkoMVVMIDw8IFBHRElSX1NISUZUKQogI2RlZmluZSBQR0RJUl9NQVNLCSh+KFBHRElSX1NJWkUtMSkpCiAKIC8qIEVudHJpZXMgcGVyIGxldmVsICovCi0jZGVmaW5lIFBUUlNfUEVSX1BURQkoUEFHRV9TSVpFIC8gNCkKKyNkZWZpbmUgUFRSU19QRVJfUFRFCShQQUdFX1NJWkUgLyAoMSA8PCBQVEVfTUFHTklUVURFKSkKICNkZWZpbmUgUFRSU19QRVJfUEdECShQQUdFX1NJWkUgLyA0KQogCiAjZGVmaW5lIFVTRVJfUFRSU19QRVJfUEdECShUQVNLX1NJWkUvUEdESVJfU0laRSkKICNkZWZpbmUgRklSU1RfVVNFUl9BRERSRVNTCTAKIAotI2RlZmluZSBQVEVfUEhZU19NQVNLCTB4MWZmZmYwMDAKKyNkZWZpbmUgUFRFX1BIWVNfTUFTSwkJKDB4MjAwMDAwMDAgLSBQQUdFX1NJWkUpCiAKIC8qCiAgKiBGaXJzdCAxTUIgbWFwIGlzIHVzZWQgYnkgZml4ZWQgcHVycG9zZS4KQEAgLTU4MywxMSArNTgzLDYgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQga29ianNpemUoY29uc3Qgdm9pZCAqb2JqcCk7CiAjZW5kaWYgLyogIUNPTkZJR19NTVUgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpIHx8IGRlZmluZWQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKQotI2RlZmluZSBfX0hBVkVfQVJDSF9QVEVQX0dFVF9BTkRfQ0xFQVIKLWV4dGVybiBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApOwotI2VuZGlmCi0KIGV4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltQVFJTX1BFUl9QR0RdOwogZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmgKaW5kZXggZTI5ZjJhYi4uM2U0NmE3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmgKQEAgLTI3LDggKzI3LDYgQEAKICNkZWZpbmUgQ0NOX0NWUgkJMHhmZjAwMDA0MAogI2RlZmluZSBDQ05fUFJSCQkweGZmMDAwMDQ0CiAKLWNvbnN0IGNoYXIgKmdldF9jcHVfc3VidHlwZSh2b2lkKTsKLQogLyoKICAqICBDUFUgdHlwZSBhbmQgaGFyZHdhcmUgYnVnIGZsYWdzLiBLZXB0IHNlcGFyYXRlbHkgZm9yIGVhY2ggQ1BVLgogICoKQEAgLTY2LDYgKzY0LDcgQEAKIHN0cnVjdCBzaF9jcHVpbmZvIHsKIAl1bnNpZ25lZCBpbnQgdHlwZTsKIAl1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeTsKKwl1bnNpZ25lZCBsb25nIGFzaWRfY2FjaGU7CiAKIAlzdHJ1Y3QgY2FjaGVfaW5mbyBpY2FjaGU7CS8qIFByaW1hcnkgSS1jYWNoZSAqLwogCXN0cnVjdCBjYWNoZV9pbmZvIGRjYWNoZTsJLyogUHJpbWFyeSBELWNhY2hlICovCkBAIC0yODgsNSArMjg3LDggQEAKICNkZWZpbmUgdnN5c2NhbGxfaW5pdCgpIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCisvKiBhcmNoL3NoL2tlcm5lbC9zZXR1cC5jICovCitjb25zdCBjaGFyICpnZXRfY3B1X3N1YnR5cGUoc3RydWN0IHNoX2NwdWluZm8gKmMpOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9ydHM3NzUxcjJkLmggYi9pbmNsdWRlL2FzbS1zaC9ydHM3NzUxcjJkLmgKaW5kZXggNzk2YjhmYy4uMTA1NjVhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcnRzNzc1MXIyZC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQuaApAQCAtNjgsNiArNjgsMTAgQEAKICNkZWZpbmUgSVJRX1BDSVNMT1QyCTEwCQkvKiBQQ0kgU2xvdCAjMiBJUlEgKi8KICNkZWZpbmUJSVJRX0VYVEVOVElPTgkxMQkJLyogRVhUbiBJUlEgKi8KIAorLyogYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jICovCit2b2lkIGluaXRfcnRzNzc1MXIyZF9JUlEodm9pZCk7CitpbnQgcnRzNzc1MXIyZF9pcnFfZGVtdXgoaW50KTsKKwogI2RlZmluZSBfX0lPX1BSRUZJWCBydHM3NzUxcjJkCiAjaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1zaC9zZXJpYWwuaAppbmRleCA4NzM0NTkwLi4yMWY2ZDMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zZXJpYWwuaApAQCAtOSwxMSArOSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAotI2lmZGVmIENPTkZJR19TSF9FQzMxMDQKLSNpbmNsdWRlIDxhc20vc2VyaWFsLWVjMzEwNC5oPgotI2VsaWYgZGVmaW5lZCAoQ09ORklHX1NIX0JJR1NVUikKLSNpbmNsdWRlIDxhc20vc2VyaWFsLWJpZ3N1ci5oPgotI2Vsc2UKIC8qCiAgKiBUaGlzIGFzc3VtZXMgeW91IGhhdmUgYSAxLjg0MzIgTUh6IGNsb2NrIGZvciB5b3VyIFVBUlQuCiAgKgpAQCAtMzQsMTIgKzI5LDggQEAKIAogI2Vsc2UKIAotI2RlZmluZSBTRVJJQUxfUE9SVF9ERk5TCQkJXAotCS8qIFVBUlQgQ0xLICAgUE9SVCBJUlEgICAgIEZMQUdTICAgICAgICAqLwkJCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgzRjgsIDQsIFNURF9DT01fRkxBR1MgfSwJLyogdHR5UzAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDJGOCwgMywgU1REX0NPTV9GTEFHUyB9CS8qIHR0eVMxICovCisjZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMKIAogI2VuZGlmCiAKLSNlbmRpZgogI2VuZGlmIC8qIF9BU01fU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1zaC90aHJlYWRfaW5mby5oCmluZGV4IDg3OWY3NDEuLjI3OWU3MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdGhyZWFkX2luZm8uaApAQCAtMzIsMTIgKzMyLDIwIEBACiAKICNkZWZpbmUgUFJFRU1QVF9BQ1RJVkUJCTB4MTAwMDAwMDAKIAotI2lmZGVmIENPTkZJR180S1NUQUNLUwotI2RlZmluZSBUSFJFQURfU0laRQkJKFBBR0VfU0laRSkKKyNpZiBkZWZpbmVkKENPTkZJR180S1NUQUNLUykKKyNkZWZpbmUgVEhSRUFEX1NJWkVfT1JERVIJKDApCisjZWxpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfNEtCKQorI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUgkoMSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV84S0IpCisjZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSCSgxKQorI2VsaWYgZGVmaW5lZChDT05GSUdfUEFHRV9TSVpFXzY0S0IpCisjZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSCSgwKQogI2Vsc2UKLSNkZWZpbmUgVEhSRUFEX1NJWkUJCShQQUdFX1NJWkUgKiAyKQorI2Vycm9yICJVbmtub3duIHRocmVhZCBzaXplIgogI2VuZGlmCi0jZGVmaW5lIFNUQUNLX1dBUk4JCShUSFJFQURfU0laRSAvIDgpCisKKyNkZWZpbmUgVEhSRUFEX1NJWkUJKFBBR0VfU0laRSA8PCBUSFJFQURfU0laRV9PUkRFUikKKyNkZWZpbmUgU1RBQ0tfV0FSTgkoVEhSRUFEX1NJWkUgPj4gMykKIAogLyoKICAqIG1hY3Jvcy9mdW5jdGlvbnMgZm9yIGdhaW5pbmcgYWNjZXNzIHRvIHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0dXJlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC90bGJmbHVzaC5oIGIvaW5jbHVkZS9hc20tc2gvdGxiZmx1c2guaAppbmRleCAyOGMwNzNiLi40NTVmYjhkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC90bGJmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3RsYmZsdXNoLmgKQEAgLTQsNyArNCw2IEBACiAvKgogICogVExCIGZsdXNoaW5nOgogICoKLSAqICAtIGZsdXNoX3RsYigpIGZsdXNoZXMgdGhlIGN1cnJlbnQgbW0gc3RydWN0IFRMQnMKICAqICAtIGZsdXNoX3RsYl9hbGwoKSBmbHVzaGVzIGFsbCBwcm9jZXNzZXMgVExCcwogICogIC0gZmx1c2hfdGxiX21tKG1tKSBmbHVzaGVzIHRoZSBzcGVjaWZpZWQgbW0gY29udGV4dCBUTEIncwogICogIC0gZmx1c2hfdGxiX3BhZ2Uodm1hLCB2bWFkZHIpIGZsdXNoZXMgb25lIHBhZ2UKQEAgLTEyLDIwICsxMSw0NSBAQAogICogIC0gZmx1c2hfdGxiX2tlcm5lbF9yYW5nZShzdGFydCwgZW5kKSBmbHVzaGVzIGEgcmFuZ2Ugb2Yga2VybmVsIHBhZ2VzCiAgKiAgLSBmbHVzaF90bGJfcGd0YWJsZXMobW0sIHN0YXJ0LCBlbmQpIGZsdXNoZXMgYSByYW5nZSBvZiBwYWdlIHRhYmxlcwogICovCitleHRlcm4gdm9pZCBsb2NhbF9mbHVzaF90bGJfYWxsKHZvaWQpOworZXh0ZXJuIHZvaWQgbG9jYWxfZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJICB1bnNpZ25lZCBsb25nIGVuZCk7CitleHRlcm4gdm9pZCBsb2NhbF9mbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgdW5zaWduZWQgbG9uZyBwYWdlKTsKK2V4dGVybiB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgZW5kKTsKK2V4dGVybiB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9vbmUodW5zaWduZWQgbG9uZyBhc2lkLCB1bnNpZ25lZCBsb25nIHBhZ2UpOwogCi1leHRlcm4gdm9pZCBmbHVzaF90bGIodm9pZCk7CisjaWZkZWYgQ09ORklHX1NNUAorCiBleHRlcm4gdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpOwogZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKIGV4dGVybiB2b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGVuZCk7CiBleHRlcm4gdm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBwYWdlKTsKLWV4dGVybiB2b2lkIF9fZmx1c2hfdGxiX3BhZ2UodW5zaWduZWQgbG9uZyBhc2lkLCB1bnNpZ25lZCBsb25nIHBhZ2UpOworZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CitleHRlcm4gdm9pZCBmbHVzaF90bGJfb25lKHVuc2lnbmVkIGxvbmcgYXNpZCwgdW5zaWduZWQgbG9uZyBwYWdlKTsKKworI2Vsc2UKKworI2RlZmluZSBmbHVzaF90bGJfYWxsKCkJCQlsb2NhbF9mbHVzaF90bGJfYWxsKCkKKyNkZWZpbmUgZmx1c2hfdGxiX21tKG1tKQkJbG9jYWxfZmx1c2hfdGxiX21tKG1tKQorI2RlZmluZSBmbHVzaF90bGJfcGFnZSh2bWEsIHBhZ2UpCWxvY2FsX2ZsdXNoX3RsYl9wYWdlKHZtYSwgcGFnZSkKKyNkZWZpbmUgZmx1c2hfdGxiX29uZShhc2lkLCBwYWdlKQlsb2NhbF9mbHVzaF90bGJfb25lKGFzaWQsIHBhZ2UpCisKKyNkZWZpbmUgZmx1c2hfdGxiX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCkJXAorCWxvY2FsX2ZsdXNoX3RsYl9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpCisKKyNkZWZpbmUgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZShzdGFydCwgZW5kKQlcCisJbG9jYWxfZmx1c2hfdGxiX2tlcm5lbF9yYW5nZShzdGFydCwgZW5kKQorCisjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX3BndGFibGVzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoteyAvKiBOb3RoaW5nIHRvIGRvICovCit7CisJLyogTm90aGluZyB0byBkbyAqLwogfQotCi1leHRlcm4gdm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKLQogI2VuZGlmIC8qIF9fQVNNX1NIX1RMQkZMVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3ViYy5oIGIvaW5jbHVkZS9hc20tc2gvdWJjLmgKaW5kZXggNjk0ZjUxZi4uYWU5YmJkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdWJjLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdWJjLmgKQEAgLTE3LDcgKzE3LDcgQEAKIC8qIFVzZXIgQnJlYWsgQ29udHJvbGxlciAqLwogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQotI2RlZmluZSBVQkNfVFlQRV9TSDc3MjkJKGNwdV9kYXRhLT50eXBlID09IENQVV9TSDc3MjkpCisjZGVmaW5lIFVCQ19UWVBFX1NINzcyOQkoY3VycmVudF9jcHVfZGF0YS50eXBlID09IENQVV9TSDc3MjkpCiAjZWxzZQogI2RlZmluZSBVQkNfVFlQRV9TSDc3MjkJMAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXNoL3VuaXN0ZC5oCmluZGV4IGY5ODIwNzMuLjE3ZjUyN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3VuaXN0ZC5oCkBAIC0yOTIsMjIgKzI5MiwyMiBAQAogI2RlZmluZSBfX05SX21xX2dldHNldGF0dHIgICAgICAoX19OUl9tcV9vcGVuKzUpCiAjZGVmaW5lIF9fTlJfa2V4ZWNfbG9hZAkJMjgzCiAjZGVmaW5lIF9fTlJfd2FpdGlkCQkyODQKLS8qICNkZWZpbmUgX19OUl9zeXNfc2V0YWx0cm9vdAkyODUgKi8KLSNkZWZpbmUgX19OUl9hZGRfa2V5CQkyODYKLSNkZWZpbmUgX19OUl9yZXF1ZXN0X2tleQkyODcKLSNkZWZpbmUgX19OUl9rZXljdGwJCTI4OAotI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCTI4OQotI2RlZmluZSBfX05SX2lvcHJpb19nZXQJCTI5MAotI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdAkyOTEKLSNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaAkyOTIKLSNkZWZpbmUgX19OUl9pbm90aWZ5X3JtX3dhdGNoCTI5MworI2RlZmluZSBfX05SX2FkZF9rZXkJCTI4NQorI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI4NgorI2RlZmluZSBfX05SX2tleWN0bAkJMjg3CisjZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJMjg4CisjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjg5CisjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0CTI5MAorI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCTI5MQorI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJMjkyCisvKiAyOTMgaXMgdW51c2VkICovCiAjZGVmaW5lIF9fTlJfbWlncmF0ZV9wYWdlcwkyOTQKICNkZWZpbmUgX19OUl9vcGVuYXQJCTI5NQogI2RlZmluZSBfX05SX21rZGlyYXQJCTI5NgogI2RlZmluZSBfX05SX21rbm9kYXQJCTI5NwogI2RlZmluZSBfX05SX2ZjaG93bmF0CQkyOTgKICNkZWZpbmUgX19OUl9mdXRpbWVzYXQJCTI5OQotI2RlZmluZSBfX05SX25ld2ZzdGF0YXQJCTMwMAorI2RlZmluZSBfX05SX2ZzdGF0YXQ2NAkJMzAwCiAjZGVmaW5lIF9fTlJfdW5saW5rYXQJCTMwMQogI2RlZmluZSBfX05SX3JlbmFtZWF0CQkzMDIKICNkZWZpbmUgX19OUl9saW5rYXQJCTMwMwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdm95YWdlcmd4LmggYi9pbmNsdWRlL2FzbS1zaC92b3lhZ2VyZ3guaAppbmRleCA5OWIwODA3Li42NGM5MzZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC92b3lhZ2VyZ3guaAorKysgYi9pbmNsdWRlL2FzbS1zaC92b3lhZ2VyZ3guaApAQCAtMzA4LDYgKzMwOCw5IEBACiAjZGVmaW5lIEFDOTdDX1JFQUQJCQkoMSA8PCAxOSkKICNkZWZpbmUgQUM5N0NfV0RfQklUCQkJKDEgPDwgMikKICNkZWZpbmUgQUM5N0NfSU5ERVhfTUFTSwkJMHg3ZgotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2NvbnNpc3RlbnQuYyAqLwordm9pZCAqdm95YWdlcmd4X2NvbnNpc3RlbnRfYWxsb2Moc3RydWN0IGRldmljZSAqLCBzaXplX3QsIGRtYV9hZGRyX3QgKiwgZ2ZwX3QpOworaW50IHZveWFnZXJneF9jb25zaXN0ZW50X2ZyZWUoc3RydWN0IGRldmljZSAqLCBzaXplX3QsIHZvaWQgKiwgZG1hX2FkZHJfdCk7CiAKICNlbmRpZiAvKiBfVk9ZQUdFUl9HWF9SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2hwZXQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9ocGV0LmgKaW5kZXggYjM5MDk4NC4uNTlhNjZmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2hwZXQuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaHBldC5oCkBAIC01Niw4ICs1NiwxNSBAQAogZXh0ZXJuIGludCBpc19ocGV0X2VuYWJsZWQodm9pZCk7CiBleHRlcm4gaW50IGhwZXRfcnRjX3RpbWVyX2luaXQodm9pZCk7CiBleHRlcm4gaW50IGFwaWNfaXNfY2x1c3RlcmVkX2JveCh2b2lkKTsKK2V4dGVybiBpbnQgaHBldF9hcmNoX2luaXQodm9pZCk7CitleHRlcm4gaW50IGhwZXRfdGltZXJfc3RvcF9zZXRfZ28odW5zaWduZWQgbG9uZyB0aWNrKTsKK2V4dGVybiBpbnQgaHBldF9yZWVuYWJsZSh2b2lkKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaHBldF9jYWxpYnJhdGVfdHNjKHZvaWQpOwogCiBleHRlcm4gaW50IGhwZXRfdXNlX3RpbWVyOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHBldF9hZGRyZXNzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7CitleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X3RpY2s7CiAKICNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwogZXh0ZXJuIGludCBocGV0X21hc2tfcnRjX2lycV9iaXQodW5zaWduZWQgbG9uZyBiaXRfbWFzayk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCmluZGV4IGE2ZDJmZjUuLmY1NGYzYWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCkBAIC00NSwxMSArNDUsNyBAQAogI2Vsc2UKICNkZWZpbmUgcG10bXJfaW9wb3J0IDAKICNlbmRpZgotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfYmFzZTsKLWV4dGVybiBpbnQgc3lzY3RsX3ZzeXNjYWxsOwogZXh0ZXJuIGludCBub2hwZXQ7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyB2eHRpbWVfaHo7Ci1leHRlcm4gdm9pZCB0aW1lX2luaXRfZ3RvZCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgZWFybHlfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDEsMikpKTsKIApAQCAtOTEsOCArODcsNiBAQAogCiBleHRlcm4gaW50IHVuaGFuZGxlZF9zaWduYWwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBzaWcpOwogCi1leHRlcm4gaW50IHVuc3luY2hyb25pemVkX3RzYyh2b2lkKTsKLQogZXh0ZXJuIHZvaWQgc2VsZWN0X2lkbGVfcm91dGluZShjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyB0YWJsZV9zdGFydCwgdGFibGVfZW5kOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3RpbWV4LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdGltZXguaAppbmRleCBiOWU1MzIwLi44YzY4MDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdGltZXguaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdGltZXguaApAQCAtMTIsMzggKzEyLDIxIEBACiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS90c2MuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCiAjZGVmaW5lIENMT0NLX1RJQ0tfUkFURQlQSVRfVElDS19SQVRFCS8qIFVuZGVybHlpbmcgSFogKi8KIAotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzX3Q7Ci0KLXN0YXRpYyBpbmxpbmUgY3ljbGVzX3QgZ2V0X2N5Y2xlcyAodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmV0OwotCi0JcmR0c2NsbChyZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qIExpa2UgZ2V0X2N5Y2xlcywgYnV0IG1ha2Ugc3VyZSB0aGUgQ1BVIGlzIHN5bmNocm9uaXplZC4gKi8KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgY3ljbGVzX3QgZ2V0X2N5Y2xlc19zeW5jKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHJldDsKLQl1bnNpZ25lZCBlYXg7Ci0JLyogRG9uJ3QgZG8gYW4gYWRkaXRpb25hbCBzeW5jIG9uIENQVXMgd2hlcmUgd2Uga25vdwotCSAgIFJEVFNDIGlzIGFscmVhZHkgc3luY2hyb25vdXMuICovCi0JYWx0ZXJuYXRpdmVfaW8oImNwdWlkIiwgQVNNX05PUDIsIFg4Nl9GRUFUVVJFX1NZTkNfUkRUU0MsCi0JCQkgICI9YSIgKGVheCksICIwIiAoMSkgOiAiZWJ4IiwiZWN4IiwiZWR4IiwibWVtb3J5Iik7Ci0JcmR0c2NsbChyZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3B1X2toejsKLQogZXh0ZXJuIGludCByZWFkX2N1cnJlbnRfdGltZXIodW5zaWduZWQgbG9uZyAqdGltZXJfdmFsdWUpOwogI2RlZmluZSBBUkNIX0hBU19SRUFEX0NVUlJFTlRfVElNRVIJMQogCi1leHRlcm4gc3RydWN0IHZ4dGltZV9kYXRhIHZ4dGltZTsKKyNkZWZpbmUgVVNFQ19QRVJfVElDSyAoVVNFQ19QRVJfU0VDIC8gSFopCisjZGVmaW5lIE5TRUNfUEVSX1RJQ0sgKE5TRUNfUEVSX1NFQyAvIEhaKQorI2RlZmluZSBGU0VDX1BFUl9USUNLIChGU0VDX1BFUl9TRUMgLyBIWikKIAorI2RlZmluZSBOU19TQ0FMRSAgICAgICAgMTAgLyogMl4xMCwgY2FyZWZ1bGx5IGNob3NlbiAqLworI2RlZmluZSBVU19TQ0FMRSAgICAgICAgMzIgLyogMl4zMiwgYXJiaXRyYWxyaWx5IGNob3NlbiAqLworCitleHRlcm4gdm9pZCBtYXJrX3RzY191bnN0YWJsZSh2b2lkKTsKK2V4dGVybiB2b2lkIHNldF9jeWMybnNfc2NhbGUodW5zaWduZWQgbG9uZyBraHopOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdHNjLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdHNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwYTM2OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90c2MuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogbGludXgvaW5jbHVkZS9hc20teDg2XzY0L3RzYy5oCisgKgorICogeDg2XzY0IFRTQyByZWxhdGVkIGZ1bmN0aW9ucworICovCisjaWZuZGVmIF9BU01feDg2XzY0X1RTQ19ICisjZGVmaW5lIF9BU01feDg2XzY0X1RTQ19ICisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKKy8qCisgKiBTdGFuZGFyZCB3YXkgdG8gYWNjZXNzIHRoZSBjeWNsZSBjb3VudGVyLgorICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfdDsKKworZXh0ZXJuIHVuc2lnbmVkIGludCBjcHVfa2h6OworZXh0ZXJuIHVuc2lnbmVkIGludCB0c2Nfa2h6OworCitzdGF0aWMgaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmV0ID0gMDsKKworI2lmbmRlZiBDT05GSUdfWDg2X1RTQworCWlmICghY3B1X2hhc190c2MpCisJCXJldHVybiAwOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfWDg2X1RTQykKKwlyZHRzY2xsKHJldCk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKiBMaWtlIGdldF9jeWNsZXMsIGJ1dCBtYWtlIHN1cmUgdGhlIENQVSBpcyBzeW5jaHJvbml6ZWQuICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXNfc3luYyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXQ7CisjaWZkZWYgWDg2X0ZFQVRVUkVfU1lOQ19SRFRTQworCXVuc2lnbmVkIGVheDsKKworCS8qCisJICogRG9uJ3QgZG8gYW4gYWRkaXRpb25hbCBzeW5jIG9uIENQVXMgd2hlcmUgd2Uga25vdworCSAqIFJEVFNDIGlzIGFscmVhZHkgc3luY2hyb25vdXM6CisJICovCisJYWx0ZXJuYXRpdmVfaW8oImNwdWlkIiwgQVNNX05PUDIsIFg4Nl9GRUFUVVJFX1NZTkNfUkRUU0MsCisJCQkgICI9YSIgKGVheCksICIwIiAoMSkgOiAiZWJ4IiwiZWN4IiwiZWR4IiwibWVtb3J5Iik7CisjZWxzZQorCXN5bmNfY29yZSgpOworI2VuZGlmCisJcmR0c2NsbChyZXQpOworCisJcmV0dXJuIHJldDsKK30KKworZXh0ZXJuIHZvaWQgdHNjX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBtYXJrX3RzY191bnN0YWJsZSh2b2lkKTsKK2V4dGVybiBpbnQgdW5zeW5jaHJvbml6ZWRfdHNjKHZvaWQpOworCisvKgorICogQm9vdC10aW1lIGNoZWNrIHdoZXRoZXIgdGhlIFRTQ3MgYXJlIHN5bmNocm9uaXplZCBhY3Jvc3MKKyAqIGFsbCBDUFVzL2NvcmVzOgorICovCitleHRlcm4gdm9pZCBjaGVja190c2Nfc3luY19zb3VyY2UoaW50IGNwdSk7CitleHRlcm4gdm9pZCBjaGVja190c2Nfc3luY190YXJnZXQodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3ZzeXNjYWxsLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaAppbmRleCAwYzc4NDcxLi44MmI0YWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaApAQCAtMTYsNDYgKzE2LDI3IEBACiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KIAotI2RlZmluZSBfX3NlY3Rpb25fdnh0aW1lIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsIF9fc2VjdGlvbl9fICgiLnZ4dGltZSIpLCBhbGlnbmVkKDE2KSkpCiAjZGVmaW5lIF9fc2VjdGlvbl92Z2V0Y3B1X21vZGUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18gKCIudmdldGNwdV9tb2RlIiksIGFsaWduZWQoMTYpKSkKICNkZWZpbmUgX19zZWN0aW9uX2ppZmZpZXMgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18gKCIuamlmZmllcyIpLCBhbGlnbmVkKDE2KSkpCi0jZGVmaW5lIF9fc2VjdGlvbl9zeXNfdHogX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18gKCIuc3lzX3R6IiksIGFsaWduZWQoMTYpKSkKLSNkZWZpbmUgX19zZWN0aW9uX3N5c2N0bF92c3lzY2FsbCBfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBfX3NlY3Rpb25fXyAoIi5zeXNjdGxfdnN5c2NhbGwiKSwgYWxpZ25lZCgxNikpKQotI2RlZmluZSBfX3NlY3Rpb25feHRpbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18gKCIueHRpbWUiKSwgYWxpZ25lZCgxNikpKQotI2RlZmluZSBfX3NlY3Rpb25feHRpbWVfbG9jayBfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBfX3NlY3Rpb25fXyAoIi54dGltZV9sb2NrIiksIGFsaWduZWQoMTYpKSkKIAotI2RlZmluZSBWWFRJTUVfVFNDCTEKLSNkZWZpbmUgVlhUSU1FX0hQRVQJMgotI2RlZmluZSBWWFRJTUVfUE1UTVIJMworLyogRGVmaW5pdGlvbnMgZm9yIENPTkZJR19HRU5FUklDX1RJTUUgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgX19zZWN0aW9uX3ZzeXNjYWxsX2d0b2RfZGF0YSBfX2F0dHJpYnV0ZV9fIFwKKwkoKHVudXNlZCwgX19zZWN0aW9uX18gKCIudnN5c2NhbGxfZ3RvZF9kYXRhIiksYWxpZ25lZCgxNikpKQorI2RlZmluZSBfX3ZzeXNjYWxsX2ZuIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsX19zZWN0aW9uX18oIi52c3lzY2FsbF9mbiIpKSkKIAogI2RlZmluZSBWR0VUQ1BVX1JEVFNDUAkxCiAjZGVmaW5lIFZHRVRDUFVfTFNMCTIKIAotc3RydWN0IHZ4dGltZV9kYXRhIHsKLQlsb25nIGhwZXRfYWRkcmVzczsJLyogSFBFVCBiYXNlIGFkZHJlc3MgKi8KLQlpbnQgbGFzdDsKLQl1bnNpZ25lZCBsb25nIGxhc3RfdHNjOwotCWxvbmcgcXVvdDsKLQlsb25nIHRzY19xdW90OwotCWludCBtb2RlOwotfTsKLQogI2RlZmluZSBocGV0X3JlYWRsKGEpICAgICAgICAgICByZWFkbCgoY29uc3Qgdm9pZCBfX2lvbWVtICopZml4X3RvX3ZpcnQoRklYX0hQRVRfQkFTRSkgKyBhKQogI2RlZmluZSBocGV0X3dyaXRlbChkLGEpICAgICAgICB3cml0ZWwoZCwgKHZvaWQgX19pb21lbSAqKWZpeF90b192aXJ0KEZJWF9IUEVUX0JBU0UpICsgYSkKIAotLyogdnN5c2NhbGwgc3BhY2UgKHJlYWRvbmx5KSAqLwotZXh0ZXJuIHN0cnVjdCB2eHRpbWVfZGF0YSBfX3Z4dGltZTsKIGV4dGVybiBpbnQgX192Z2V0Y3B1X21vZGU7Ci1leHRlcm4gc3RydWN0IHRpbWVzcGVjIF9feHRpbWU7CiBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2ppZmZpZXM7Ci1leHRlcm4gc3RydWN0IHRpbWV6b25lIF9fc3lzX3R6OwotZXh0ZXJuIHNlcWxvY2tfdCBfX3h0aW1lX2xvY2s7CiAKIC8qIGtlcm5lbCBzcGFjZSAod3JpdGVhYmxlKSAqLwotZXh0ZXJuIHN0cnVjdCB2eHRpbWVfZGF0YSB2eHRpbWU7CiBleHRlcm4gaW50IHZnZXRjcHVfbW9kZTsKIGV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OwotZXh0ZXJuIGludCBzeXNjdGxfdnN5c2NhbGw7CitleHRlcm4gc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YV90IHZzeXNjYWxsX2d0b2RfZGF0YTsKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpLmggYi9pbmNsdWRlL2xpbnV4L2FjcGkuaAppbmRleCA4MTVmMWZiLi44YmNmYWE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FjcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FjcGkuaApAQCAtNzUsNyArNzUsNyBAQAogCiB0eXBlZGVmIGludCAoKmFjcGlfdGFibGVfaGFuZGxlcikgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOwogCi10eXBlZGVmIGludCAoKmFjcGlfbWFkdF9lbnRyeV9oYW5kbGVyKSAoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKTsKK3R5cGVkZWYgaW50ICgqYWNwaV90YWJsZV9lbnRyeV9oYW5kbGVyKSAoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKTsKIAogY2hhciAqIF9fYWNwaV9tYXBfdGFibGUgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogdW5zaWduZWQgbG9uZyBhY3BpX2ZpbmRfcnNkcCAodm9pZCk7CkBAIC04NSw4ICs4NSwxMCBAQAogCiBpbnQgYWNwaV90YWJsZV9pbml0ICh2b2lkKTsKIGludCBhY3BpX3RhYmxlX3BhcnNlIChjaGFyICppZCwgYWNwaV90YWJsZV9oYW5kbGVyIGhhbmRsZXIpOwotaW50IGFjcGlfdGFibGVfcGFyc2VfbWFkdCAoZW51bSBhY3BpX21hZHRfdHlwZSBpZCwgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKTsKLWludCBhY3BpX3RhYmxlX3BhcnNlX3NyYXQgKGVudW0gYWNwaV9zcmF0X3R5cGUgaWQsIGFjcGlfbWFkdF9lbnRyeV9oYW5kbGVyIGhhbmRsZXIsIHVuc2lnbmVkIGludCBtYXhfZW50cmllcyk7CitpbnQgX19pbml0IGFjcGlfdGFibGVfcGFyc2VfZW50cmllcyhjaGFyICppZCwgdW5zaWduZWQgbG9uZyB0YWJsZV9zaXplLAorCWludCBlbnRyeV9pZCwgYWNwaV90YWJsZV9lbnRyeV9oYW5kbGVyIGhhbmRsZXIsIHVuc2lnbmVkIGludCBtYXhfZW50cmllcyk7CitpbnQgYWNwaV90YWJsZV9wYXJzZV9tYWR0IChlbnVtIGFjcGlfbWFkdF90eXBlIGlkLCBhY3BpX3RhYmxlX2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKTsKK2ludCBhY3BpX3RhYmxlX3BhcnNlX3NyYXQgKGVudW0gYWNwaV9zcmF0X3R5cGUgaWQsIGFjcGlfdGFibGVfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpOwogaW50IGFjcGlfcGFyc2VfbWNmZyAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpoZWFkZXIpOwogdm9pZCBhY3BpX3RhYmxlX3ByaW50X21hZHRfZW50cnkgKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqbWFkdCk7CiB2b2lkIGFjcGlfdGFibGVfcHJpbnRfc3JhdF9lbnRyeSAoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpzcmF0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaV9wbXRtci5oIGIvaW5jbHVkZS9saW51eC9hY3BpX3BtdG1yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwZWYxYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaV9wbXRtci5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgX0FDUElfUE1UTVJfSF8KKyNkZWZpbmUgX0FDUElfUE1UTVJfSF8KKworI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisKKy8qIE51bWJlciBvZiBQTVRNUiB0aWNrcyBleHBlY3RlZCBkdXJpbmcgY2FsaWJyYXRpb24gcnVuICovCisjZGVmaW5lIFBNVE1SX1RJQ0tTX1BFUl9TRUMgMzU3OTU0NQorCisvKiBsaW1pdCBpdCB0byAyNCBiaXRzICovCisjZGVmaW5lIEFDUElfUE1fTUFTSyBDTE9DS1NPVVJDRV9NQVNLKDI0KQorCisvKiBPdmVycnVuIHZhbHVlICovCisjZGVmaW5lIEFDUElfUE1fT1ZSUlVOCSgxPDwyNCkKKworI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKKworZXh0ZXJuIHUzMiBhY3BpX3BtX3JlYWRfdmVyaWZpZWQodm9pZCk7CitleHRlcm4gdTMyIHBtdG1yX2lvcG9ydDsKKworc3RhdGljIGlubGluZSB1MzIgYWNwaV9wbV9yZWFkX2Vhcmx5KHZvaWQpCit7CisJaWYgKCFwbXRtcl9pb3BvcnQpCisJCXJldHVybiAwOworCS8qIG1hc2sgdGhlIG91dHB1dCB0byAyNCBiaXRzICovCisJcmV0dXJuIGFjcGlfcG1fcmVhZF92ZXJpZmllZCgpICYgQUNQSV9QTV9NQVNLOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHUzMiBhY3BpX3BtX3JlYWRfZWFybHkodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FncF9iYWNrZW5kLmggYi9pbmNsdWRlL2xpbnV4L2FncF9iYWNrZW5kLmgKaW5kZXggYTVjOGJiNS4uYWJjNTIxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hZ3BfYmFja2VuZC5oCisrKyBiL2luY2x1ZGUvbGludXgvYWdwX2JhY2tlbmQuaApAQCAtODcsMTAgKzg3LDE1IEBACiAJdTMyIHBoeXNpY2FsOwogCXU4IGlzX2JvdW5kOwogCXU4IGlzX2ZsdXNoZWQ7CisgICAgICAgIHU4IHZtYWxsb2NfZmxhZzsKIH07CiAKICNkZWZpbmUgQUdQX05PUk1BTF9NRU1PUlkgMAogCisjZGVmaW5lIEFHUF9VU0VSX1RZUEVTICgxIDw8IDE2KQorI2RlZmluZSBBR1BfVVNFUl9NRU1PUlkgKEFHUF9VU0VSX1RZUEVTKQorI2RlZmluZSBBR1BfVVNFUl9DQUNIRURfTUVNT1JZIChBR1BfVVNFUl9UWVBFUyArIDEpCisKIGV4dGVybiBzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICphZ3BfYnJpZGdlOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYWdwX2JyaWRnZXM7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYXRhLmggYi9pbmNsdWRlL2xpbnV4L2F0YS5oCmluZGV4IDE4ZTQwMWYuLjI3MjczNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9hdGEuaApAQCAtMzUyLDcgKzM1Miw3IEBACiB7CiAJaWYgKGF0YV9pZF9tYWpvcl92ZXJzaW9uKGRldl9pZCkgPj0gNSAmJiBhdGFfaWRfaXNfc2F0YShkZXZfaWQpKQogCQlyZXR1cm4gMDsJLyogU0FUQSAqLwotCWlmIChkZXZfaWRbOTNdICYgMHg0MDAwKQorCWlmICgoZGV2X2lkWzkzXSAmIDB4RTAwMCkgPT0gMHg2MDAwKQogCQlyZXR1cm4gMDsJLyogODAgd2lyZSAqLwogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmggYi9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWE3ZTdiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qICBsaW51eC9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaAorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgY2xvY2tjaGlwcy4KKyAqCisgKiAgSWYgeW91IGFyZSBub3QgYSBjbG9ja2NoaXAsIG9yIHRoZSB0aW1lIG9mIGRheSBjb2RlLCB5b3Ugc2hvdWxkCisgKiAgbm90IGJlIGluY2x1ZGluZyB0aGlzIGZpbGUhCisgKi8KKyNpZm5kZWYgX0xJTlVYX0NMT0NLQ0hJUFNfSAorI2RlZmluZSBfTElOVVhfQ0xPQ0tDSElQU19ICisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUworCisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgva3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCitzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlOworCisvKiBDbG9jayBldmVudCBtb2RlIGNvbW1hbmRzICovCitlbnVtIGNsb2NrX2V2ZW50X21vZGUgeworCUNMT0NLX0VWVF9NT0RFX1VOVVNFRCA9IDAsCisJQ0xPQ0tfRVZUX01PREVfU0hVVERPV04sCisJQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMsCisJQ0xPQ0tfRVZUX01PREVfT05FU0hPVCwKK307CisKKy8qIENsb2NrIGV2ZW50IG5vdGlmaWNhdGlvbiB2YWx1ZXMgKi8KK2VudW0gY2xvY2tfZXZlbnRfbm9maXRpZXJzIHsKKwlDTE9DS19FVlRfTk9USUZZX0FERCwKKwlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PTiwKKwlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PRkYsCisJQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIsCisJQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRVhJVCwKKwlDTE9DS19FVlRfTk9USUZZX1NVU1BFTkQsCisJQ0xPQ0tfRVZUX05PVElGWV9SRVNVTUUsCisJQ0xPQ0tfRVZUX05PVElGWV9DUFVfREVBRCwKK307CisKKy8qCisgKiBDbG9jayBldmVudCBmZWF0dXJlcworICovCisjZGVmaW5lIENMT0NLX0VWVF9GRUFUX1BFUklPRElDCQkweDAwMDAwMQorI2RlZmluZSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UCQkweDAwMDAwMgorLyoKKyAqIHg4Nig2NCkgc3BlY2lmaWMgbWlzZmVhdHVyZXM6CisgKgorICogLSBDbG9ja2V2ZW50IHNvdXJjZSBzdG9wcyBpbiBDMyBTdGF0ZSBhbmQgbmVlZHMgYnJvYWRjYXN0IHN1cHBvcnQuCisgKiAtIExvY2FsIEFQSUMgdGltZXIgaXMgdXNlZCBhcyBhIGR1bW15IGRldmljZS4KKyAqLworI2RlZmluZSBDTE9DS19FVlRfRkVBVF9DM1NUT1AJCTB4MDAwMDA0CisjZGVmaW5lIENMT0NLX0VWVF9GRUFUX0RVTU1ZCQkweDAwMDAwOAorCisvKioKKyAqIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgLSBjbG9jayBldmVudCBkZXZpY2UgZGVzY3JpcHRvcgorICogQG5hbWU6CQlwdHIgdG8gY2xvY2sgZXZlbnQgbmFtZQorICogQGhpbnRzOgkJdXNhZ2UgaGludHMKKyAqIEBtYXhfZGVsdGFfbnM6CW1heGltdW0gZGVsdGEgdmFsdWUgaW4gbnMKKyAqIEBtaW5fZGVsdGFfbnM6CW1pbmltdW0gZGVsdGEgdmFsdWUgaW4gbnMKKyAqIEBtdWx0OgkJbmFub3NlY29uZCB0byBjeWNsZXMgbXVsdGlwbGllcgorICogQHNoaWZ0OgkJbmFub3NlY29uZHMgdG8gY3ljbGVzIGRpdmlzb3IgKHBvd2VyIG9mIHR3bykKKyAqIEByYXRpbmc6CQl2YXJpYWJsZSB0byByYXRlIGNsb2NrIGV2ZW50IGRldmljZXMKKyAqIEBpcnE6CQlpcnEgbnVtYmVyIChvbmx5IGZvciBub24gY3B1IGxvY2FsIGRldmljZXMpCisgKiBAY3B1bWFzazoJCWNwdW1hc2sgdG8gaW5kaWNhdGUgZm9yIHdoaWNoIGNwdXMgdGhpcyBkZXZpY2Ugd29ya3MKKyAqIEBzZXRfbmV4dF9ldmVudDoJc2V0IG5leHQgZXZlbnQKKyAqIEBzZXRfbW9kZToJCXNldCBtb2RlIGZ1bmN0aW9uCisgKiBAZXZ0aGFuZGxlcjoJCUFzc2lnbmVkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gYmUgY2FsbGVkIGJ5IHRoZSBsb3cKKyAqCQkJbGV2ZWwgaGFuZGxlciBvZiB0aGUgZXZlbnQgc291cmNlCisgKiBAYnJvYWRjYXN0OgkJZnVuY3Rpb24gdG8gYnJvYWRjYXN0IGV2ZW50cworICogQGxpc3Q6CQlsaXN0IGhlYWQgZm9yIHRoZSBtYW5hZ2VtZW50IGNvZGUKKyAqIEBtb2RlOgkJb3BlcmF0aW5nIG1vZGUgYXNzaWduZWQgYnkgdGhlIG1hbmFnZW1lbnQgY29kZQorICogQG5leHRfZXZlbnQ6CQlsb2NhbCBzdG9yYWdlIGZvciB0aGUgbmV4dCBldmVudCBpbiBvbmVzaG90IG1vZGUKKyAqLworc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSB7CisJY29uc3QgY2hhcgkJKm5hbWU7CisJdW5zaWduZWQgaW50CQlmZWF0dXJlczsKKwl1bnNpZ25lZCBsb25nCQltYXhfZGVsdGFfbnM7CisJdW5zaWduZWQgbG9uZwkJbWluX2RlbHRhX25zOworCXVuc2lnbmVkIGxvbmcJCW11bHQ7CisJaW50CQkJc2hpZnQ7CisJaW50CQkJcmF0aW5nOworCWludAkJCWlycTsKKwljcHVtYXNrX3QJCWNwdW1hc2s7CisJaW50CQkJKCpzZXRfbmV4dF9ldmVudCkodW5zaWduZWQgbG9uZyBldnQsCisJCQkJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7CisJdm9pZAkJCSgqc2V0X21vZGUpKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJCQkgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKKwl2b2lkCQkJKCpldmVudF9oYW5kbGVyKShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOworCXZvaWQJCQkoKmJyb2FkY2FzdCkoY3B1bWFza190IG1hc2spOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwllbnVtIGNsb2NrX2V2ZW50X21vZGUJbW9kZTsKKwlrdGltZV90CQkJbmV4dF9ldmVudDsKK307CisKKy8qCisgKiBDYWxjdWxhdGUgYSBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgZm9yIHNjYWxlZCBtYXRoLCB3aGljaCBpcyB1c2VkIHRvIGNvbnZlcnQKKyAqIG5hbm9zZWNvbmRzIGJhc2VkIHZhbHVlcyB0byBjbG9jayB0aWNrczoKKyAqCisgKiBjbG9ja190aWNrcyA9IChuYW5vc2Vjb25kcyAqIGZhY3RvcikgPj4gc2hpZnQuCisgKgorICogZGl2X3NjIGlzIHRoZSByZWFycmFuZ2VkIGVxdWF0aW9uIHRvIGNhbGN1bGF0ZSBhIGZhY3RvciBmcm9tIGEgZ2l2ZW4gY2xvY2sKKyAqIHRpY2tzIC8gbmFub3NlY29uZHMgcmF0aW86CisgKgorICogZmFjdG9yID0gKGNsb2NrX3RpY2tzIDw8IHNoaWZ0KSAvIG5hbm9zZWNvbmRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkaXZfc2ModW5zaWduZWQgbG9uZyB0aWNrcywgdW5zaWduZWQgbG9uZyBuc2VjLAorCQkJCSAgIGludCBzaGlmdCkKK3sKKwl1aW50NjRfdCB0bXAgPSAoKHVpbnQ2NF90KXRpY2tzKSA8PCBzaGlmdDsKKworCWRvX2Rpdih0bXAsIG5zZWMpOworCXJldHVybiAodW5zaWduZWQgbG9uZykgdG1wOworfQorCisvKiBDbG9jayBldmVudCBsYXllciBmdW5jdGlvbnMgKi8KK2V4dGVybiB1bnNpZ25lZCBsb25nIGNsb2NrZXZlbnRfZGVsdGEybnModW5zaWduZWQgbG9uZyBsYXRjaCwKKwkJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCk7CitleHRlcm4gdm9pZCBjbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KTsKKworZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm9sZCwKKwkJCQkJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3KTsKK2V4dGVybgorc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xvY2tldmVudHNfcmVxdWVzdF9kZXZpY2UodW5zaWduZWQgaW50IGZlYXR1cmVzLAorCQkJCQkJICAgICAgY3B1bWFza190IGNwdW1hc2spOworZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIGNsb2NrZXZlbnRzX3NldF9tb2RlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKKwkJCQkgZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUpOworZXh0ZXJuIGludCBjbG9ja2V2ZW50c19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2V4dGVybiB2b2lkIGNsb2NrZXZlbnRzX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitleHRlcm4gaW50IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAorCQkJCSAgICAga3RpbWVfdCBleHBpcmVzLCBrdGltZV90IG5vdyk7CisKK2V4dGVybiB2b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIGNsb2NrZXZlbnRzX3Jlc3VtZV9ldmVudHModm9pZCkgeyB9CisjZGVmaW5lIGNsb2NrZXZlbnRzX25vdGlmeShyZWFzb24sIGFyZykgZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmggYi9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKaW5kZXggMTYyMmQyM2EuLmRhYTQ5NDBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCkBAIC0xMiwxMSArMTIsMTMgQEAKICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyogY2xvY2tzb3VyY2UgY3ljbGUgYmFzZSB0eXBlICovCiB0eXBlZGVmIHU2NCBjeWNsZV90Oworc3RydWN0IGNsb2Nrc291cmNlOwogCiAvKioKICAqIHN0cnVjdCBjbG9ja3NvdXJjZSAtIGhhcmR3YXJlIGFic3RyYWN0aW9uIGZvciBhIGZyZWUgcnVubmluZyBjb3VudGVyCkBAIC00NCw4ICs0Niw4IEBACiAgKgkJCXN1YnRyYWN0aW9uIG9mIG5vbiA2NCBiaXQgY291bnRlcnMKICAqIEBtdWx0OgkJY3ljbGUgdG8gbmFub3NlY29uZCBtdWx0aXBsaWVyCiAgKiBAc2hpZnQ6CQljeWNsZSB0byBuYW5vc2Vjb25kIGRpdmlzb3IgKHBvd2VyIG9mIHR3bykKLSAqIEB1cGRhdGVfY2FsbGJhY2s6CWNhbGxlZCB3aGVuIHNhZmUgdG8gYWx0ZXIgY2xvY2tzb3VyY2UgdmFsdWVzCi0gKiBAaXNfY29udGludW91czoJZGVmaW5lcyBpZiBjbG9ja3NvdXJjZSBpcyBmcmVlLXJ1bm5pbmcuCisgKiBAZmxhZ3M6CQlmbGFncyBkZXNjcmliaW5nIHNwZWNpYWwgcHJvcGVydGllcworICogQHZyZWFkOgkJdnN5c2NhbGwgYmFzZWQgcmVhZAogICogQGN5Y2xlX2ludGVydmFsOglVc2VkIGludGVybmFsbHkgYnkgdGltZWtlZXBpbmcgY29yZSwgcGxlYXNlIGlnbm9yZS4KICAqIEB4dGltZV9pbnRlcnZhbDoJVXNlZCBpbnRlcm5hbGx5IGJ5IHRpbWVrZWVwaW5nIGNvcmUsIHBsZWFzZSBpZ25vcmUuCiAgKi8KQEAgLTU3LDE1ICs1OSwzMCBAQAogCWN5Y2xlX3QgbWFzazsKIAl1MzIgbXVsdDsKIAl1MzIgc2hpZnQ7Ci0JaW50ICgqdXBkYXRlX2NhbGxiYWNrKSh2b2lkKTsKLQlpbnQgaXNfY29udGludW91czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWN5Y2xlX3QgKCp2cmVhZCkodm9pZCk7CiAKIAkvKiB0aW1la2VlcGluZyBzcGVjaWZpYyBkYXRhLCBpZ25vcmUgKi8KIAljeWNsZV90IGN5Y2xlX2xhc3QsIGN5Y2xlX2ludGVydmFsOwogCXU2NCB4dGltZV9uc2VjLCB4dGltZV9pbnRlcnZhbDsKIAlzNjQgZXJyb3I7CisKKyNpZmRlZiBDT05GSUdfQ0xPQ0tTT1VSQ0VfV0FUQ0hET0cKKwkvKiBXYXRjaGRvZyByZWxhdGVkIGRhdGEsIHVzZWQgYnkgdGhlIGZyYW1ld29yayAqLworCXN0cnVjdCBsaXN0X2hlYWQgd2RfbGlzdDsKKwljeWNsZV90IHdkX2xhc3Q7CisjZW5kaWYKIH07CiAKKy8qCisgKiBDbG9jayBzb3VyY2UgZmxhZ3MgYml0czo6CisgKi8KKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMJCTB4MDEKKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX01VU1RfVkVSSUZZCQkweDAyCisKKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX1dBVENIRE9HCQkJMHgxMAorI2RlZmluZSBDTE9DS19TT1VSQ0VfVkFMSURfRk9SX0hSRVMJCTB4MjAKKwogLyogc2ltcGxpZnkgaW5pdGlhbGl6YXRpb24gb2YgbWFzayBmaWVsZCAqLwogI2RlZmluZSBDTE9DS1NPVVJDRV9NQVNLKGJpdHMpIChjeWNsZV90KShiaXRzPDY0ID8gKCgxVUxMPDxiaXRzKS0xKSA6IC0xKQogCkBAIC0xNzgsOCArMTk1LDE2IEBACiAKIAogLyogdXNlZCB0byBpbnN0YWxsIGEgbmV3IGNsb2Nrc291cmNlICovCi1pbnQgY2xvY2tzb3VyY2VfcmVnaXN0ZXIoc3RydWN0IGNsb2Nrc291cmNlKik7Ci12b2lkIGNsb2Nrc291cmNlX3Jlc2VsZWN0KHZvaWQpOwotc3RydWN0IGNsb2Nrc291cmNlKiBjbG9ja3NvdXJjZV9nZXRfbmV4dCh2b2lkKTsKK2V4dGVybiBpbnQgY2xvY2tzb3VyY2VfcmVnaXN0ZXIoc3RydWN0IGNsb2Nrc291cmNlKik7CitleHRlcm4gc3RydWN0IGNsb2Nrc291cmNlKiBjbG9ja3NvdXJjZV9nZXRfbmV4dCh2b2lkKTsKK2V4dGVybiB2b2lkIGNsb2Nrc291cmNlX2NoYW5nZV9yYXRpbmcoc3RydWN0IGNsb2Nrc291cmNlICpjcywgaW50IHJhdGluZyk7CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMCitleHRlcm4gdm9pZCB1cGRhdGVfdnN5c2NhbGwoc3RydWN0IHRpbWVzcGVjICp0cywgc3RydWN0IGNsb2Nrc291cmNlICpjKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3ZzeXNjYWxsKHN0cnVjdCB0aW1lc3BlYyAqdHMsIHN0cnVjdCBjbG9ja3NvdXJjZSAqYykKK3sKK30KKyNlbmRpZgogCiAjZW5kaWYgLyogX0xJTlVYX0NMT0NLU09VUkNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKaW5kZXggN2YwMDhmNi4uMDg5OWUyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKQEAgLTg0LDkgKzg0LDYgQEAKICAgICAgICAgdW5zaWduZWQgaW50CQlwb2xpY3k7IC8qIHNlZSBhYm92ZSAqLwogCXN0cnVjdCBjcHVmcmVxX2dvdmVybm9yCSpnb3Zlcm5vcjsgLyogc2VlIGJlbG93ICovCiAKLSAJc3RydWN0IG11dGV4CQlsb2NrOyAgIC8qIENQVSAtPnNldHBvbGljeSBvciAtPnRhcmdldCBtYXkKLQkJCQkJICAgb25seSBiZSBjYWxsZWQgb25jZSBhIHRpbWUgKi8KLQogCXN0cnVjdCB3b3JrX3N0cnVjdAl1cGRhdGU7IC8qIGlmIHVwZGF0ZV9wb2xpY3koKSBuZWVkcyB0byBiZQogCQkJCQkgKiBjYWxsZWQsIGJ1dCB5b3UncmUgaW4gSVJRIGNvbnRleHQgKi8KIApAQCAtMTcyLDExICsxNjksMTYgQEAKIAkJCQkgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pOwogCiAKLWV4dGVybiBpbnQgY3B1ZnJlcV9kcml2ZXJfZ2V0YXZnKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KTsKK2V4dGVybiBpbnQgX19jcHVmcmVxX2RyaXZlcl9nZXRhdmcoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwogCiBpbnQgY3B1ZnJlcV9yZWdpc3Rlcl9nb3Zlcm5vcihzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciAqZ292ZXJub3IpOwogdm9pZCBjcHVmcmVxX3VucmVnaXN0ZXJfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfZ292ZXJub3IgKmdvdmVybm9yKTsKIAoraW50IGxvY2tfcG9saWN5X3J3c2VtX3JlYWQoaW50IGNwdSk7CitpbnQgbG9ja19wb2xpY3lfcndzZW1fd3JpdGUoaW50IGNwdSk7Cit2b2lkIHVubG9ja19wb2xpY3lfcndzZW1fcmVhZChpbnQgY3B1KTsKK3ZvaWQgdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShpbnQgY3B1KTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICBDUFVGUkVRIERSSVZFUiBJTlRFUkZBQ0UgICAgICAgICAgICAgICAgICAgICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaCBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCmluZGV4IDYxMjQ3MmEuLjc4MDMwMTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCkBAIC0xMDYsNyArMTA2LDcgQEAKICAqIGFsd2F5cyBiYWxhbmNlZCwgc28gdGhlIGludGVycnVwdGVkIHZhbHVlIG9mIC0+aGFyZGlycV9jb250ZXh0CiAgKiB3aWxsIGFsd2F5cyBiZSByZXN0b3JlZC4KICAqLwotI2RlZmluZSBpcnFfZW50ZXIoKQkJCQkJXAorI2RlZmluZSBfX2lycV9lbnRlcigpCQkJCQlcCiAJZG8gewkJCQkJCVwKIAkJYWNjb3VudF9zeXN0ZW1fdnRpbWUoY3VycmVudCk7CQlcCiAJCWFkZF9wcmVlbXB0X2NvdW50KEhBUkRJUlFfT0ZGU0VUKTsJXApAQCAtMTE0LDYgKzExNCwxMSBAQAogCX0gd2hpbGUgKDApCiAKIC8qCisgKiBFbnRlciBpcnEgY29udGV4dCAob24gTk9fSFosIHVwZGF0ZSBqaWZmaWVzKToKKyAqLworZXh0ZXJuIHZvaWQgaXJxX2VudGVyKHZvaWQpOworCisvKgogICogRXhpdCBpcnEgY29udGV4dCB3aXRob3V0IHByb2Nlc3Npbmcgc29mdGlycXM6CiAgKi8KICNkZWZpbmUgX19pcnFfZXhpdCgpCQkJCQlcCkBAIC0xMjgsNyArMTMzLDcgQEAKICAqLwogZXh0ZXJuIHZvaWQgaXJxX2V4aXQodm9pZCk7CiAKLSNkZWZpbmUgbm1pX2VudGVyKCkJCWRvIHsgbG9ja2RlcF9vZmYoKTsgaXJxX2VudGVyKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIG5taV9lbnRlcigpCQlkbyB7IGxvY2tkZXBfb2ZmKCk7IF9faXJxX2VudGVyKCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIG5taV9leGl0KCkJCWRvIHsgX19pcnFfZXhpdCgpOyBsb2NrZGVwX29uKCk7IH0gd2hpbGUgKDApCiAKICNlbmRpZiAvKiBMSU5VWF9IQVJESVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggZmNhOTMwMi4uMzdmOTI3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTIxLDIyICsyMSw3MiBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKK3N0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2U7CitzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZTsKKwogLyoKICAqIE1vZGUgYXJndW1lbnRzIG9mIHh4eF9ocnRpbWVyIGZ1bmN0aW9uczoKICAqLwogZW51bSBocnRpbWVyX21vZGUgewotCUhSVElNRVJfQUJTLAkvKiBUaW1lIHZhbHVlIGlzIGFic29sdXRlICovCi0JSFJUSU1FUl9SRUwsCS8qIFRpbWUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gbm93ICovCisJSFJUSU1FUl9NT0RFX0FCUywJLyogVGltZSB2YWx1ZSBpcyBhYnNvbHV0ZSAqLworCUhSVElNRVJfTU9ERV9SRUwsCS8qIFRpbWUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gbm93ICovCiB9OwogCisvKgorICogUmV0dXJuIHZhbHVlcyBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKi8KIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHsKLQlIUlRJTUVSX05PUkVTVEFSVCwKLQlIUlRJTUVSX1JFU1RBUlQsCisJSFJUSU1FUl9OT1JFU1RBUlQsCS8qIFRpbWVyIGlzIG5vdCByZXN0YXJ0ZWQgKi8KKwlIUlRJTUVSX1JFU1RBUlQsCS8qIFRpbWVyIG11c3QgYmUgcmVzdGFydGVkICovCiB9OwogCi0jZGVmaW5lIEhSVElNRVJfSU5BQ1RJVkUJKCh2b2lkICopMVVMKQorLyoKKyAqIGhydGltZXIgY2FsbGJhY2sgbW9kZXM6CisgKgorICoJSFJUSU1FUl9DQl9TT0ZUSVJROgkJQ2FsbGJhY2sgbXVzdCBydW4gaW4gc29mdGlycSBjb250ZXh0CisgKglIUlRJTUVSX0NCX0lSUVNBRkU6CQlDYWxsYmFjayBtYXkgcnVuIGluIGhhcmRpcnEgY29udGV4dAorICoJSFJUSU1FUl9DQl9JUlFTQUZFX05PX1JFU1RBUlQ6CUNhbGxiYWNrIG1heSBydW4gaW4gaGFyZGlycSBjb250ZXh0IGFuZAorICoJCQkJCWRvZXMgbm90IHJlc3RhcnQgdGhlIHRpbWVyCisgKglIUlRJTUVSX0NCX0lSUVNBRkVfTk9fU09GVElSUToJQ2FsbGJhY2sgbXVzdCBydW4gaW4gc29mdGlycSBjb250ZXh0CisgKgkJCQkJU3BlY2lhbCBtb2RlIGZvciB0aWNrIGVtdWx0YXRpb24KKyAqLworZW51bSBocnRpbWVyX2NiX21vZGUgeworCUhSVElNRVJfQ0JfU09GVElSUSwKKwlIUlRJTUVSX0NCX0lSUVNBRkUsCisJSFJUSU1FUl9DQl9JUlFTQUZFX05PX1JFU1RBUlQsCisJSFJUSU1FUl9DQl9JUlFTQUZFX05PX1NPRlRJUlEsCit9OwogCi1zdHJ1Y3QgaHJ0aW1lcl9iYXNlOworLyoKKyAqIFZhbHVlcyB0byB0cmFjayBzdGF0ZSBvZiB0aGUgdGltZXIKKyAqCisgKiBQb3NzaWJsZSBzdGF0ZXM6CisgKgorICogMHgwMAkJaW5hY3RpdmUKKyAqIDB4MDEJCWVucXVldWVkIGludG8gcmJ0cmVlCisgKiAweDAyCQljYWxsYmFjayBmdW5jdGlvbiBydW5uaW5nCisgKiAweDA0CQljYWxsYmFjayBwZW5kaW5nIChoaWdoIHJlc29sdXRpb24gbW9kZSkKKyAqCisgKiBTcGVjaWFsIGNhc2U6CisgKiAweDAzCQljYWxsYmFjayBmdW5jdGlvbiBydW5uaW5nIGFuZCBlbnF1ZXVlZAorICoJCSh3YXMgcmVxdWV1ZWQgb24gYW5vdGhlciBDUFUpCisgKiBUaGUgImNhbGxiYWNrIGZ1bmN0aW9uIHJ1bm5pbmcgYW5kIGVucXVldWVkIiBzdGF0dXMgaXMgb25seSBwb3NzaWJsZSBvbgorICogU01QLiBJdCBoYXBwZW5zIGZvciBleGFtcGxlIHdoZW4gYSBwb3NpeCB0aW1lciBleHBpcmVkIGFuZCB0aGUgY2FsbGJhY2sKKyAqIHF1ZXVlZCBhIHNpZ25hbC4gQmV0d2VlbiBkcm9wcGluZyB0aGUgbG9jayB3aGljaCBwcm90ZWN0cyB0aGUgcG9zaXggdGltZXIKKyAqIGFuZCByZWFjcXVpcmluZyB0aGUgYmFzZSBsb2NrIG9mIHRoZSBocnRpbWVyLCBhbm90aGVyIENQVSBjYW4gZGVsaXZlciB0aGUKKyAqIHNpZ25hbCBhbmQgcmVhcm0gdGhlIHRpbWVyLiBXZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBjYWxsYmFjayBydW5uaW5nIHN0YXRlLAorICogYXMgb3RoZXJ3aXNlIHRoZSB0aW1lciBjb3VsZCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgc29mdGlycSBjb2RlIGZpbmlzaGVzIHRoZQorICogdGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lci4KKyAqCisgKiBUaGUgSFJUSU1FUl9TVEFURV9FTlFVRVVFIGJpdCBpcyBhbHdheXMgb3InZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgdG8KKyAqIHByZXNlcnZlIHRoZSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLIGJpdCBpbiB0aGUgYWJvdmUgc2NlbmFyaW8uCisgKgorICogQWxsIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBwcm90ZWN0ZWQgYnkgY3B1X2Jhc2UtPmxvY2suCisgKi8KKyNkZWZpbmUgSFJUSU1FUl9TVEFURV9JTkFDVElWRQkweDAwCisjZGVmaW5lIEhSVElNRVJfU1RBVEVfRU5RVUVVRUQJMHgwMQorI2RlZmluZSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLCTB4MDIKKyNkZWZpbmUgSFJUSU1FUl9TVEFURV9QRU5ESU5HCTB4MDQKIAogLyoqCiAgKiBzdHJ1Y3QgaHJ0aW1lciAtIHRoZSBiYXNpYyBocnRpbWVyIHN0cnVjdHVyZQpAQCAtNDYsMTQgKzk2LDM0IEBACiAgKgkJd2hpY2ggdGhlIHRpbWVyIGlzIGJhc2VkLgogICogQGZ1bmN0aW9uOgl0aW1lciBleHBpcnkgY2FsbGJhY2sgZnVuY3Rpb24KICAqIEBiYXNlOglwb2ludGVyIHRvIHRoZSB0aW1lciBiYXNlIChwZXIgY3B1IGFuZCBwZXIgY2xvY2spCisgKiBAc3RhdGU6CXN0YXRlIGluZm9ybWF0aW9uIChTZWUgYml0IHZhbHVlcyBhYm92ZSkKKyAqIEBjYl9tb2RlOgloaWdoIHJlc29sdXRpb24gdGltZXIgZmVhdHVyZSB0byBzZWxlY3QgdGhlIGNhbGxiYWNrIGV4ZWN1dGlvbgorICoJCSBtb2RlCisgKiBAY2JfZW50cnk6CWxpc3QgaGVhZCB0byBlbnF1ZXVlIGFuIGV4cGlyZWQgdGltZXIgaW50byB0aGUgY2FsbGJhY2sgbGlzdAorICogQHN0YXJ0X3NpdGU6CXRpbWVyIHN0YXRpc3RpY3MgZmllbGQgdG8gc3RvcmUgdGhlIHNpdGUgd2hlcmUgdGhlIHRpbWVyCisgKgkJd2FzIHN0YXJ0ZWQKKyAqIEBzdGFydF9jb21tOiB0aW1lciBzdGF0aXN0aWNzIGZpZWxkIHRvIHN0b3JlIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHdoaWNoCisgKgkJc3RhcnRlZCB0aGUgdGltZXIKKyAqIEBzdGFydF9waWQ6IHRpbWVyIHN0YXRpc3RpY3MgZmllbGQgdG8gc3RvcmUgdGhlIHBpZCBvZiB0aGUgdGFzayB3aGljaAorICoJCXN0YXJ0ZWQgdGhlIHRpbWVyCiAgKgotICogVGhlIGhydGltZXIgc3RydWN0dXJlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgaW5pdF9ocnRpbWVyXyNDTE9DS1RZUEUoKQorICogVGhlIGhydGltZXIgc3RydWN0dXJlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgaHJ0aW1lcl9pbml0KCkKICAqLwogc3RydWN0IGhydGltZXIgewotCXN0cnVjdCByYl9ub2RlCQlub2RlOwotCWt0aW1lX3QJCQlleHBpcmVzOwotCWludAkJCSgqZnVuY3Rpb24pKHN0cnVjdCBocnRpbWVyICopOwotCXN0cnVjdCBocnRpbWVyX2Jhc2UJKmJhc2U7CisJc3RydWN0IHJiX25vZGUJCQlub2RlOworCWt0aW1lX3QJCQkJZXhwaXJlczsKKwllbnVtIGhydGltZXJfcmVzdGFydAkJKCpmdW5jdGlvbikoc3RydWN0IGhydGltZXIgKik7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZQkqYmFzZTsKKwl1bnNpZ25lZCBsb25nCQkJc3RhdGU7CisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCWVudW0gaHJ0aW1lcl9jYl9tb2RlCQljYl9tb2RlOworCXN0cnVjdCBsaXN0X2hlYWQJCWNiX2VudHJ5OworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJdm9pZAkJCQkqc3RhcnRfc2l0ZTsKKwljaGFyCQkJCXN0YXJ0X2NvbW1bMTZdOworCWludAkJCQlzdGFydF9waWQ7CisjZW5kaWYKIH07CiAKIC8qKgpAQCAtNzAsMzcgKzE0MCwxMTQgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgaHJ0aW1lcl9iYXNlIC0gdGhlIHRpbWVyIGJhc2UgZm9yIGEgc3BlY2lmaWMgY2xvY2sKLSAqIEBpbmRleDoJCWNsb2NrIHR5cGUgaW5kZXggZm9yIHBlcl9jcHUgc3VwcG9ydCB3aGVuIG1vdmluZyBhIHRpbWVyCi0gKgkJCXRvIGEgYmFzZSBvbiBhbm90aGVyIGNwdS4KLSAqIEBsb2NrOgkJbG9jayBwcm90ZWN0aW5nIHRoZSBiYXNlIGFuZCBhc3NvY2lhdGVkIHRpbWVycworICogQGluZGV4OgkJY2xvY2sgdHlwZSBpbmRleCBmb3IgcGVyX2NwdSBzdXBwb3J0IHdoZW4gbW92aW5nIGEKKyAqCQkJdGltZXIgdG8gYSBiYXNlIG9uIGFub3RoZXIgY3B1LgogICogQGFjdGl2ZToJCXJlZCBibGFjayB0cmVlIHJvb3Qgbm9kZSBmb3IgdGhlIGFjdGl2ZSB0aW1lcnMKICAqIEBmaXJzdDoJCXBvaW50ZXIgdG8gdGhlIHRpbWVyIG5vZGUgd2hpY2ggZXhwaXJlcyBmaXJzdAogICogQHJlc29sdXRpb246CQl0aGUgcmVzb2x1dGlvbiBvZiB0aGUgY2xvY2ssIGluIG5hbm9zZWNvbmRzCiAgKiBAZ2V0X3RpbWU6CQlmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSBjbG9jawogICogQGdldF9zb2Z0aXJxX3RpbWU6CWZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IHRpbWUgZnJvbSB0aGUgc29mdGlycQotICogQGN1cnJfdGltZXI6CQl0aGUgdGltZXIgd2hpY2ggaXMgZXhlY3V0aW5nIGEgY2FsbGJhY2sgcmlnaHQgbm93CiAgKiBAc29mdGlycV90aW1lOgl0aGUgdGltZSB3aGVuIHJ1bm5pbmcgdGhlIGhydGltZXIgcXVldWUgaW4gdGhlIHNvZnRpcnEKLSAqIEBsb2NrX2tleToJCXRoZSBsb2NrX2NsYXNzX2tleSBmb3IgdXNlIHdpdGggbG9ja2RlcAorICogQGNiX3BlbmRpbmc6CQlsaXN0IG9mIHRpbWVycyB3aGVyZSB0aGUgY2FsbGJhY2sgaXMgcGVuZGluZworICogQG9mZnNldDoJCW9mZnNldCBvZiB0aGlzIGNsb2NrIHRvIHRoZSBtb25vdG9uaWMgYmFzZQorICogQHJlcHJvZ3JhbToJCWZ1bmN0aW9uIHRvIHJlcHJvZ3JhbSB0aGUgdGltZXIgZXZlbnQKICAqLwotc3RydWN0IGhydGltZXJfYmFzZSB7CitzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlIHsKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZQkqY3B1X2Jhc2U7CiAJY2xvY2tpZF90CQlpbmRleDsKLQlzcGlubG9ja190CQlsb2NrOwogCXN0cnVjdCByYl9yb290CQlhY3RpdmU7CiAJc3RydWN0IHJiX25vZGUJCSpmaXJzdDsKIAlrdGltZV90CQkJcmVzb2x1dGlvbjsKIAlrdGltZV90CQkJKCpnZXRfdGltZSkodm9pZCk7CiAJa3RpbWVfdAkJCSgqZ2V0X3NvZnRpcnFfdGltZSkodm9pZCk7Ci0Jc3RydWN0IGhydGltZXIJCSpjdXJyX3RpbWVyOwogCWt0aW1lX3QJCQlzb2Z0aXJxX3RpbWU7Ci0Jc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGxvY2tfa2V5OworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlrdGltZV90CQkJb2Zmc2V0OworCWludAkJCSgqcmVwcm9ncmFtKShzdHJ1Y3QgaHJ0aW1lciAqdCwKKwkJCQkJICAgICBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiLAorCQkJCQkgICAgIGt0aW1lX3Qgbik7CisjZW5kaWYKIH07CiAKKyNkZWZpbmUgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVMgMgorCisvKgorICogc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgLSB0aGUgcGVyIGNwdSBjbG9jayBiYXNlcworICogQGxvY2s6CQlsb2NrIHByb3RlY3RpbmcgdGhlIGJhc2UgYW5kIGFzc29jaWF0ZWQgY2xvY2sgYmFzZXMKKyAqCQkJYW5kIHRpbWVycworICogQGxvY2tfa2V5OgkJdGhlIGxvY2tfY2xhc3Nfa2V5IGZvciB1c2Ugd2l0aCBsb2NrZGVwCisgKiBAY2xvY2tfYmFzZToJCWFycmF5IG9mIGNsb2NrIGJhc2VzIGZvciB0aGlzIGNwdQorICogQGN1cnJfdGltZXI6CQl0aGUgdGltZXIgd2hpY2ggaXMgZXhlY3V0aW5nIGEgY2FsbGJhY2sgcmlnaHQgbm93CisgKiBAZXhwaXJlc19uZXh0OglhYnNvbHV0ZSB0aW1lIG9mIHRoZSBuZXh0IGV2ZW50IHdoaWNoIHdhcyBzY2hlZHVsZWQKKyAqCQkJdmlhIGNsb2NrX3NldF9uZXh0X2V2ZW50KCkKKyAqIEBocmVzX2FjdGl2ZToJU3RhdGUgb2YgaGlnaCByZXNvbHV0aW9uIG1vZGUKKyAqIEBjaGVja19jbG9ja3M6CUluZGljdGF0b3IsIHdoZW4gc2V0IGV2YWx1YXRlIHRpbWUgc291cmNlIGFuZCBjbG9jaworICoJCQlldmVudCBkZXZpY2VzIHdoZXRoZXIgaGlnaCByZXNvbHV0aW9uIG1vZGUgY2FuIGJlCisgKgkJCWFjdGl2YXRlZC4KKyAqIEBjYl9wZW5kaW5nOgkJRXhwaXJlZCB0aW1lcnMgYXJlIG1vdmVkIGZyb20gdGhlIHJidHJlZSB0byB0aGlzCisgKgkJCWxpc3QgaW4gdGhlIHRpbWVyIGludGVycnVwdC4gVGhlIGxpc3QgaXMgcHJvY2Vzc2VkCisgKgkJCWluIHRoZSBzb2Z0aXJxLgorICogQG5yX2V2ZW50czoJCVRvdGFsIG51bWJlciBvZiB0aW1lciBpbnRlcnJ1cHQgZXZlbnRzCisgKi8KK3N0cnVjdCBocnRpbWVyX2NwdV9iYXNlIHsKKwlzcGlubG9ja190CQkJbG9jazsKKwlzdHJ1Y3QgbG9ja19jbGFzc19rZXkJCWxvY2tfa2V5OworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UJY2xvY2tfYmFzZVtIUlRJTUVSX01BWF9DTE9DS19CQVNFU107CisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCWt0aW1lX3QJCQkJZXhwaXJlc19uZXh0OworCWludAkJCQlocmVzX2FjdGl2ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQljYl9wZW5kaW5nOworCXVuc2lnbmVkIGxvbmcJCQlucl9ldmVudHM7CisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCitzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlOworCitleHRlcm4gdm9pZCBjbG9ja193YXNfc2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgaHJ0aW1lcl9pbnRlcnJ1cHQoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KTsKKworLyoKKyAqIEluIGhpZ2ggcmVzb2x1dGlvbiBtb2RlIHRoZSB0aW1lIHJlZmVyZW5jZSBtdXN0IGJlIHJlYWQgYWNjdXJhdGUKKyAqLworc3RhdGljIGlubGluZSBrdGltZV90IGhydGltZXJfY2JfZ2V0X3RpbWUoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXJldHVybiB0aW1lci0+YmFzZS0+Z2V0X3RpbWUoKTsKK30KKworLyoKKyAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9ja3MuIFRoZSByZXNvbHV0aW9uIHZhbHVlIGlzIHJldHVybmVkIGluCisgKiB0aGUgY2xvY2tfZ2V0cmVzKCkgc3lzdGVtIGNhbGwgdG8gZ2l2ZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVycyBhbgorICogaWRlYSBvZiB0aGUgKGluKWFjY3VyYWN5IG9mIHRpbWVycy4gVGltZXIgdmFsdWVzIGFyZSByb3VuZGVkIHVwIHRvCisgKiB0aGlzIHJlc29sdXRpb24gdmFsdWVzLgorICovCisjIGRlZmluZSBLVElNRV9ISUdIX1JFUwkJKGt0aW1lX3QpIHsgLnR2NjQgPSAxIH0KKyMgZGVmaW5lIEtUSU1FX01PTk9UT05JQ19SRVMJS1RJTUVfSElHSF9SRVMKKworI2Vsc2UKKworIyBkZWZpbmUgS1RJTUVfTU9OT1RPTklDX1JFUwlLVElNRV9MT1dfUkVTCisKIC8qCiAgKiBjbG9ja193YXNfc2V0KCkgaXMgYSBOT1AgZm9yIG5vbi0gaGlnaC1yZXNvbHV0aW9uIHN5c3RlbXMuIFRoZQogICogdGltZS1zb3J0ZWQgb3JkZXIgZ3VhcmFudGVlcyB0aGF0IGEgdGltZXIgZG9lcyBub3QgZXhwaXJlIGVhcmx5IGFuZAogICogaXMgZXhwaXJlZCBpbiB0aGUgbmV4dCBzb2Z0aXJxIHdoZW4gdGhlIGNsb2NrIHdhcyBhZHZhbmNlZC4KICAqLwotI2RlZmluZSBjbG9ja193YXNfc2V0KCkJCWRvIHsgfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9ja193YXNfc2V0KHZvaWQpIHsgfQorCisvKgorICogSW4gbm9uIGhpZ2ggcmVzb2x1dGlvbiBtb2RlIHRoZSB0aW1lIHJlZmVyZW5jZSBpcyB0YWtlbiBmcm9tCisgKiB0aGUgYmFzZSBzb2Z0aXJxIHRpbWUgdmFyaWFibGUuCisgKi8KK3N0YXRpYyBpbmxpbmUga3RpbWVfdCBocnRpbWVyX2NiX2dldF90aW1lKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gdGltZXItPmJhc2UtPnNvZnRpcnFfdGltZTsKK30KKworI2VuZGlmCisKK2V4dGVybiBrdGltZV90IGt0aW1lX2dldCh2b2lkKTsKK2V4dGVybiBrdGltZV90IGt0aW1lX2dldF9yZWFsKHZvaWQpOwogCiAvKiBFeHBvcnRlZCB0aW1lciBmdW5jdGlvbnM6ICovCiAKQEAgLTExNCwxOSArMjYxLDMzIEBACiBleHRlcm4gaW50IGhydGltZXJfY2FuY2VsKHN0cnVjdCBocnRpbWVyICp0aW1lcik7CiBleHRlcm4gaW50IGhydGltZXJfdHJ5X3RvX2NhbmNlbChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpOwogCi0jZGVmaW5lIGhydGltZXJfcmVzdGFydCh0aW1lcikgaHJ0aW1lcl9zdGFydCgodGltZXIpLCAodGltZXIpLT5leHBpcmVzLCBIUlRJTUVSX0FCUykKK3N0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfcmVzdGFydChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJcmV0dXJuIGhydGltZXJfc3RhcnQodGltZXIsIHRpbWVyLT5leHBpcmVzLCBIUlRJTUVSX01PREVfQUJTKTsKK30KIAogLyogUXVlcnkgdGltZXJzOiAqLwogZXh0ZXJuIGt0aW1lX3QgaHJ0aW1lcl9nZXRfcmVtYWluaW5nKGNvbnN0IHN0cnVjdCBocnRpbWVyICp0aW1lcik7CiBleHRlcm4gaW50IGhydGltZXJfZ2V0X3Jlcyhjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHApOwogCi0jaWZkZWYgQ09ORklHX05PX0lETEVfSFoKIGV4dGVybiBrdGltZV90IGhydGltZXJfZ2V0X25leHRfZXZlbnQodm9pZCk7Ci0jZW5kaWYKIAorLyoKKyAqIEEgdGltZXIgaXMgYWN0aXZlLCB3aGVuIGl0IGlzIGVucXVldWVkIGludG8gdGhlIHJidHJlZSBvciB0aGUgY2FsbGJhY2sKKyAqIGZ1bmN0aW9uIGlzIHJ1bm5pbmcuCisgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfYWN0aXZlKGNvbnN0IHN0cnVjdCBocnRpbWVyICp0aW1lcikKIHsKLQlyZXR1cm4gcmJfcGFyZW50KCZ0aW1lci0+bm9kZSkgIT0gJnRpbWVyLT5ub2RlOworCXJldHVybiB0aW1lci0+c3RhdGUgIT0gSFJUSU1FUl9TVEFURV9JTkFDVElWRTsKK30KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjaywgd2hldGhlciB0aGUgdGltZXIgaXMgb24gb25lIG9mIHRoZSBxdWV1ZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9pc19xdWV1ZWQoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXJldHVybiB0aW1lci0+c3RhdGUgJgorCQkoSFJUSU1FUl9TVEFURV9FTlFVRVVFRCB8IEhSVElNRVJfU1RBVEVfUEVORElORyk7CiB9CiAKIC8qIEZvcndhcmQgYSBocnRpbWVyIHNvIGl0IGV4cGlyZXMgYWZ0ZXIgbm93OiAqLwpAQCAtMTQ5LDQgKzMxMCw1MyBAQAogLyogQm9vdHVwIGluaXRpYWxpemF0aW9uOiAqLwogZXh0ZXJuIHZvaWQgX19pbml0IGhydGltZXJzX2luaXQodm9pZCk7CiAKKyNpZiBCSVRTX1BFUl9MT05HIDwgNjQKK2V4dGVybiB1bnNpZ25lZCBsb25nIGt0aW1lX2Rpdm5zKGNvbnN0IGt0aW1lX3Qga3QsIHM2NCBkaXYpOworI2Vsc2UgLyogQklUU19QRVJfTE9ORyA8IDY0ICovCisjIGRlZmluZSBrdGltZV9kaXZucyhrdCwgZGl2KQkJKHVuc2lnbmVkIGxvbmcpKChrdCkudHY2NCAvIChkaXYpKQorI2VuZGlmCisKKy8qIFNob3cgcGVuZGluZyB0aW1lcnM6ICovCitleHRlcm4gdm9pZCBzeXNycV90aW1lcl9saXN0X3Nob3codm9pZCk7CisKKy8qCisgKiBUaW1lci1zdGF0aXN0aWNzIGluZm86CisgKi8KKyNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKKworZXh0ZXJuIHZvaWQgdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHZvaWQgKnRpbWVyLCBwaWRfdCBwaWQsIHZvaWQgKnN0YXJ0ZiwKKwkJCQkgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqIGNvbW0pOworCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwl0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModGltZXIsIHRpbWVyLT5zdGFydF9waWQsIHRpbWVyLT5zdGFydF9zaXRlLAorCQkJCSB0aW1lci0+ZnVuY3Rpb24sIHRpbWVyLT5zdGFydF9jb21tKTsKK30KKworZXh0ZXJuIHZvaWQgX190aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lciwKKwkJCQkJCSB2b2lkICphZGRyKTsKKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCV9fdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyh0aW1lciwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2hydGltZXJfY2xlYXJfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJdGltZXItPnN0YXJ0X3NpdGUgPSBOVUxMOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19ocnRpbWVyX2NsZWFyX3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworfQorI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggNWE4YmEwYi4uZTVlYTE0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC00Miw2ICs0Miw4IEBACiAgKiBJUlFGX1NIQVJFRCAtIGFsbG93IHNoYXJpbmcgdGhlIGlycSBhbW9uZyBzZXZlcmFsIGRldmljZXMKICAqIElSUUZfUFJPQkVfU0hBUkVEIC0gc2V0IGJ5IGNhbGxlcnMgd2hlbiB0aGV5IGV4cGVjdCBzaGFyaW5nIG1pc21hdGNoZXMgdG8gb2NjdXIKICAqIElSUUZfVElNRVIgLSBGbGFnIHRvIG1hcmsgdGhpcyBpbnRlcnJ1cHQgYXMgdGltZXIgaW50ZXJydXB0CisgKiBJUlFGX1BFUkNQVSAtIEludGVycnVwdCBpcyBwZXIgY3B1CisgKiBJUlFGX05PQkFMQU5DSU5HIC0gRmxhZyB0byBleGNsdWRlIHRoaXMgaW50ZXJydXB0IGZyb20gaXJxIGJhbGFuY2luZwogICovCiAjZGVmaW5lIElSUUZfRElTQUJMRUQJCTB4MDAwMDAwMjAKICNkZWZpbmUgSVJRRl9TQU1QTEVfUkFORE9NCTB4MDAwMDAwNDAKQEAgLTQ5LDYgKzUxLDcgQEAKICNkZWZpbmUgSVJRRl9QUk9CRV9TSEFSRUQJMHgwMDAwMDEwMAogI2RlZmluZSBJUlFGX1RJTUVSCQkweDAwMDAwMjAwCiAjZGVmaW5lIElSUUZfUEVSQ1BVCQkweDAwMDAwNDAwCisjZGVmaW5lIElSUUZfTk9CQUxBTkNJTkcJMHgwMDAwMDgwMAogCiAvKgogICogTWlncmF0aW9uIGhlbHBlcnMuIFNjaGVkdWxlZCBmb3IgcmVtb3ZhbCBpbiAxLzIwMDcKQEAgLTIzOSw2ICsyNDIsOSBAQAogCUJMT0NLX1NPRlRJUlEsCiAJVEFTS0xFVF9TT0ZUSVJRLAogCVNDSEVEX1NPRlRJUlEsCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCUhSVElNRVJfU09GVElSUSwKKyNlbmRpZgogfTsKIAogLyogc29mdGlycSBtYXNrIGFuZCBhY3RpdmUgZmllbGRzIG1vdmVkIHRvIGlycV9jcHVzdGF0X3QgaW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxLmggYi9pbmNsdWRlL2xpbnV4L2lycS5oCmluZGV4IDU1MDRiNjcuLjE5MzlkNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnEuaApAQCAtMzEsNyArMzEsNyBAQAogLyoKICAqIElSUSBsaW5lIHN0YXR1cy4KICAqCi0gKiBCaXRzIDAtMTYgYXJlIHJlc2VydmVkIGZvciB0aGUgSVJRRl8qIGJpdHMgaW4gbGludXgvaW50ZXJydXB0LmgKKyAqIEJpdHMgMC03IGFyZSByZXNlcnZlZCBmb3IgdGhlIElSUUZfKiBiaXRzIGluIGxpbnV4L2ludGVycnVwdC5oCiAgKgogICogSVJRIHR5cGVzCiAgKi8KQEAgLTQ1LDI4ICs0NSwzMCBAQAogI2RlZmluZSBJUlFfVFlQRV9QUk9CRQkJMHgwMDAwMDAxMAkvKiBQcm9iaW5nIGluIHByb2dyZXNzICovCiAKIC8qIEludGVybmFsIGZsYWdzICovCi0jZGVmaW5lIElSUV9JTlBST0dSRVNTCQkweDAwMDEwMDAwCS8qIElSUSBoYW5kbGVyIGFjdGl2ZSAtIGRvIG5vdCBlbnRlciEgKi8KLSNkZWZpbmUgSVJRX0RJU0FCTEVECQkweDAwMDIwMDAwCS8qIElSUSBkaXNhYmxlZCAtIGRvIG5vdCBlbnRlciEgKi8KLSNkZWZpbmUgSVJRX1BFTkRJTkcJCTB4MDAwNDAwMDAJLyogSVJRIHBlbmRpbmcgLSByZXBsYXkgb24gZW5hYmxlICovCi0jZGVmaW5lIElSUV9SRVBMQVkJCTB4MDAwODAwMDAJLyogSVJRIGhhcyBiZWVuIHJlcGxheWVkIGJ1dCBub3QgYWNrZWQgeWV0ICovCi0jZGVmaW5lIElSUV9BVVRPREVURUNUCQkweDAwMTAwMDAwCS8qIElSUSBpcyBiZWluZyBhdXRvZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgSVJRX1dBSVRJTkcJCTB4MDAyMDAwMDAJLyogSVJRIG5vdCB5ZXQgc2VlbiAtIGZvciBhdXRvZGV0ZWN0aW9uICovCi0jZGVmaW5lIElSUV9MRVZFTAkJMHgwMDQwMDAwMAkvKiBJUlEgbGV2ZWwgdHJpZ2dlcmVkICovCi0jZGVmaW5lIElSUV9NQVNLRUQJCTB4MDA4MDAwMDAJLyogSVJRIG1hc2tlZCAtIHNob3VsZG4ndCBiZSBzZWVuIGFnYWluICovCi0jZGVmaW5lIElSUV9QRVJfQ1BVCQkweDAxMDAwMDAwCS8qIElSUSBpcyBwZXIgQ1BVICovCisjZGVmaW5lIElSUV9JTlBST0dSRVNTCQkweDAwMDAwMTAwCS8qIElSUSBoYW5kbGVyIGFjdGl2ZSAtIGRvIG5vdCBlbnRlciEgKi8KKyNkZWZpbmUgSVJRX0RJU0FCTEVECQkweDAwMDAwMjAwCS8qIElSUSBkaXNhYmxlZCAtIGRvIG5vdCBlbnRlciEgKi8KKyNkZWZpbmUgSVJRX1BFTkRJTkcJCTB4MDAwMDA0MDAJLyogSVJRIHBlbmRpbmcgLSByZXBsYXkgb24gZW5hYmxlICovCisjZGVmaW5lIElSUV9SRVBMQVkJCTB4MDAwMDA4MDAJLyogSVJRIGhhcyBiZWVuIHJlcGxheWVkIGJ1dCBub3QgYWNrZWQgeWV0ICovCisjZGVmaW5lIElSUV9BVVRPREVURUNUCQkweDAwMDAxMDAwCS8qIElSUSBpcyBiZWluZyBhdXRvZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgSVJRX1dBSVRJTkcJCTB4MDAwMDIwMDAJLyogSVJRIG5vdCB5ZXQgc2VlbiAtIGZvciBhdXRvZGV0ZWN0aW9uICovCisjZGVmaW5lIElSUV9MRVZFTAkJMHgwMDAwNDAwMAkvKiBJUlEgbGV2ZWwgdHJpZ2dlcmVkICovCisjZGVmaW5lIElSUV9NQVNLRUQJCTB4MDAwMDgwMDAJLyogSVJRIG1hc2tlZCAtIHNob3VsZG4ndCBiZSBzZWVuIGFnYWluICovCisjZGVmaW5lIElSUV9QRVJfQ1BVCQkweDAwMDEwMDAwCS8qIElSUSBpcyBwZXIgQ1BVICovCisjZGVmaW5lIElSUV9OT1BST0JFCQkweDAwMDIwMDAwCS8qIElSUSBpcyBub3QgdmFsaWQgZm9yIHByb2JpbmcgKi8KKyNkZWZpbmUgSVJRX05PUkVRVUVTVAkJMHgwMDA0MDAwMAkvKiBJUlEgY2Fubm90IGJlIHJlcXVlc3RlZCAqLworI2RlZmluZSBJUlFfTk9BVVRPRU4JCTB4MDAwODAwMDAJLyogSVJRIHdpbGwgbm90IGJlIGVuYWJsZWQgb24gcmVxdWVzdCBpcnEgKi8KKyNkZWZpbmUgSVJRX1dBS0VVUAkJMHgwMDEwMDAwMAkvKiBJUlEgdHJpZ2dlcnMgc3lzdGVtIHdha2V1cCAqLworI2RlZmluZSBJUlFfTU9WRV9QRU5ESU5HCTB4MDAyMDAwMDAJLyogbmVlZCB0byByZS10YXJnZXQgSVJRIGRlc3RpbmF0aW9uICovCisjZGVmaW5lIElSUV9OT19CQUxBTkNJTkcJMHgwMDQwMDAwMAkvKiBJUlEgaXMgZXhjbHVkZWQgZnJvbSBiYWxhbmNpbmcgKi8KKwogI2lmZGVmIENPTkZJR19JUlFfUEVSX0NQVQogIyBkZWZpbmUgQ0hFQ0tfSVJRX1BFUl9DUFUodmFyKSAoKHZhcikgJiBJUlFfUEVSX0NQVSkKKyMgZGVmaW5lIElSUV9OT19CQUxBTkNJTkdfTUFTSwkoSVJRX1BFUl9DUFUgfCBJUlFfTk9fQkFMQU5DSU5HKQogI2Vsc2UKICMgZGVmaW5lIENIRUNLX0lSUV9QRVJfQ1BVKHZhcikgMAorIyBkZWZpbmUgSVJRX05PX0JBTEFOQ0lOR19NQVNLCUlSUV9OT19CQUxBTkNJTkcKICNlbmRpZgogCi0jZGVmaW5lIElSUV9OT1BST0JFCQkweDAyMDAwMDAwCS8qIElSUSBpcyBub3QgdmFsaWQgZm9yIHByb2JpbmcgKi8KLSNkZWZpbmUgSVJRX05PUkVRVUVTVAkJMHgwNDAwMDAwMAkvKiBJUlEgY2Fubm90IGJlIHJlcXVlc3RlZCAqLwotI2RlZmluZSBJUlFfTk9BVVRPRU4JCTB4MDgwMDAwMDAJLyogSVJRIHdpbGwgbm90IGJlIGVuYWJsZWQgb24gcmVxdWVzdCBpcnEgKi8KLSNkZWZpbmUgSVJRX0RFTEFZRURfRElTQUJMRQkweDEwMDAwMDAwCS8qIElSUSBkaXNhYmxlIChtYXNraW5nKSBoYXBwZW5zIGRlbGF5ZWQuICovCi0jZGVmaW5lIElSUV9XQUtFVVAJCTB4MjAwMDAwMDAJLyogSVJRIHRyaWdnZXJzIHN5c3RlbSB3YWtldXAgKi8KLSNkZWZpbmUgSVJRX01PVkVfUEVORElORwkweDQwMDAwMDAwCS8qIG5lZWQgdG8gcmUtdGFyZ2V0IElSUSBkZXN0aW5hdGlvbiAqLwotCiBzdHJ1Y3QgcHJvY19kaXJfZW50cnk7CiBzdHJ1Y3QgbXNpX2Rlc2M7CiAKQEAgLTEyNyw2ICsxMjksNyBAQAogICoKICAqIEBoYW5kbGVfaXJxOgkJaGlnaGxldmVsIGlycS1ldmVudHMgaGFuZGxlciBbaWYgTlVMTCwgX19kb19JUlEoKV0KICAqIEBjaGlwOgkJbG93IGxldmVsIGludGVycnVwdCBoYXJkd2FyZSBhY2Nlc3MKKyAqIEBtc2lfZGVzYzoJCU1TSSBkZXNjcmlwdG9yCiAgKiBAaGFuZGxlcl9kYXRhOglwZXItSVJRIGRhdGEgZm9yIHRoZSBpcnFfY2hpcCBtZXRob2RzCiAgKiBAY2hpcF9kYXRhOgkJcGxhdGZvcm0tc3BlY2lmaWMgcGVyLWNoaXAgcHJpdmF0ZSBkYXRhIGZvciB0aGUgY2hpcAogICoJCQltZXRob2RzLCB0byBhbGxvdyBzaGFyZWQgY2hpcCBpbXBsZW1lbnRhdGlvbnMKQEAgLTIzNSwxMSArMjM4LDIxIEBACiAKICNlbmRpZiAvKiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUSAqLwogCitleHRlcm4gaW50IGlycV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IGNwdW1hc2spOworZXh0ZXJuIGludCBpcnFfY2FuX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxKTsKKwogI2Vsc2UgLyogQ09ORklHX1NNUCAqLwogCiAjZGVmaW5lIG1vdmVfbmF0aXZlX2lycSh4KQogI2RlZmluZSBtb3ZlX21hc2tlZF9pcnEoeCkKIAorc3RhdGljIGlubGluZSBpbnQgaXJxX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgY3B1bWFzaykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXJxX2Nhbl9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSkgeyByZXR1cm4gMDsgfQorCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAjaWZkZWYgQ09ORklHX0lSUUJBTEFOQ0UKQEAgLTI2MSw2ICsyNzQsMTEgQEAKIAogZXh0ZXJuIGludCBub19pcnFfYWZmaW5pdHk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlycV9iYWxhbmNpbmdfZGlzYWJsZWQodW5zaWduZWQgaW50IGlycSkKK3sKKwlyZXR1cm4gaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiBJUlFfTk9fQkFMQU5DSU5HX01BU0s7Cit9CisKIC8qIEhhbmRsZSBpcnEgYWN0aW9uIGNoYWluczogKi8KIGV4dGVybiBpbnQgaGFuZGxlX0lSUV9ldmVudCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaCBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCmluZGV4IDBlYzZlMjguLmMwODBmNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamlmZmllcy5oCisrKyBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCkBAIC0xNDIsMTMgKzE0MiwxMyBAQAogICoKICAqIEFuZCBzb21lIG5vdCBzbyBvYnZpb3VzLgogICoKLSAqIE5vdGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHJldHVybiBNQVhfTE9ORywgYmVjYXVzZQorICogTm90ZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIExPTkdfTUFYLCBiZWNhdXNlCiAgKiBmb3IgdmFyaW91cyB0aW1lb3V0IHJlYXNvbnMgd2Ugb2Z0ZW4gZW5kIHVwIGhhdmluZwogICogdG8gd2FpdCAiamlmZmllcysxIiBpbiBvcmRlciB0byBndWFyYW50ZWUgdGhhdCB3ZSB3YWl0CiAgKiBhdCBfbGVhc3RfICJqaWZmaWVzIiAtIHNvICJqaWZmaWVzKzEiIGhhZCBiZXR0ZXIgc3RpbGwKICAqIGJlIHBvc2l0aXZlLgogICovCi0jZGVmaW5lIE1BWF9KSUZGWV9PRkZTRVQgKCh+MFVMID4+IDEpLTEpCisjZGVmaW5lIE1BWF9KSUZGWV9PRkZTRVQgKChMT05HX01BWCA+PiAxKS0xKQogCiAvKgogICogV2Ugd2FudCB0byBkbyByZWFsaXN0aWMgY29udmVyc2lvbnMgb2YgdGltZSBzbyB3ZSBuZWVkIHRvIHVzZSB0aGUgc2FtZQpAQCAtMjU5LDIwNyArMjU5LDIzIEBACiAjZW5kaWYKIAogLyoKLSAqIENvbnZlcnQgamlmZmllcyB0byBtaWxsaXNlY29uZHMgYW5kIGJhY2suCi0gKgotICogQXZvaWQgdW5uZWNlc3NhcnkgbXVsdGlwbGljYXRpb25zL2RpdmlzaW9ucyBpbiB0aGUKLSAqIHR3byBtb3N0IGNvbW1vbiBIWiBjYXNlczoKKyAqIENvbnZlcnQgdmFyaW91cyB0aW1lIHVuaXRzIHRvIGVhY2ggb3RoZXI6CiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGppZmZpZXNfdG9fbXNlY3MoY29uc3QgdW5zaWduZWQgbG9uZyBqKQotewotI2lmIEhaIDw9IE1TRUNfUEVSX1NFQyAmJiAhKE1TRUNfUEVSX1NFQyAlIEhaKQotCXJldHVybiAoTVNFQ19QRVJfU0VDIC8gSFopICogajsKLSNlbGlmIEhaID4gTVNFQ19QRVJfU0VDICYmICEoSFogJSBNU0VDX1BFUl9TRUMpCi0JcmV0dXJuIChqICsgKEhaIC8gTVNFQ19QRVJfU0VDKSAtIDEpLyhIWiAvIE1TRUNfUEVSX1NFQyk7Ci0jZWxzZQotCXJldHVybiAoaiAqIE1TRUNfUEVSX1NFQykgLyBIWjsKLSNlbmRpZgotfQorZXh0ZXJuIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX21zZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaik7CitleHRlcm4gdW5zaWduZWQgaW50IGppZmZpZXNfdG9fdXNlY3MoY29uc3QgdW5zaWduZWQgbG9uZyBqKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1zZWNzX3RvX2ppZmZpZXMoY29uc3QgdW5zaWduZWQgaW50IG0pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdXNlY3NfdG9famlmZmllcyhjb25zdCB1bnNpZ25lZCBpbnQgdSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB0aW1lc3BlY190b19qaWZmaWVzKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdmFsdWUpOworZXh0ZXJuIHZvaWQgamlmZmllc190b190aW1lc3BlYyhjb25zdCB1bnNpZ25lZCBsb25nIGppZmZpZXMsCisJCQkJc3RydWN0IHRpbWVzcGVjICp2YWx1ZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB0aW1ldmFsX3RvX2ppZmZpZXMoY29uc3Qgc3RydWN0IHRpbWV2YWwgKnZhbHVlKTsKK2V4dGVybiB2b2lkIGppZmZpZXNfdG9fdGltZXZhbChjb25zdCB1bnNpZ25lZCBsb25nIGppZmZpZXMsCisJCQkgICAgICAgc3RydWN0IHRpbWV2YWwgKnZhbHVlKTsKK2V4dGVybiBjbG9ja190IGppZmZpZXNfdG9fY2xvY2tfdChsb25nIHgpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY2xvY2tfdF90b19qaWZmaWVzKHVuc2lnbmVkIGxvbmcgeCk7CitleHRlcm4gdTY0IGppZmZpZXNfNjRfdG9fY2xvY2tfdCh1NjQgeCk7CitleHRlcm4gdTY0IG5zZWNfdG9fY2xvY2tfdCh1NjQgeCk7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGppZmZpZXNfdG9fdXNlY3MoY29uc3QgdW5zaWduZWQgbG9uZyBqKQotewotI2lmIEhaIDw9IFVTRUNfUEVSX1NFQyAmJiAhKFVTRUNfUEVSX1NFQyAlIEhaKQotCXJldHVybiAoVVNFQ19QRVJfU0VDIC8gSFopICogajsKLSNlbGlmIEhaID4gVVNFQ19QRVJfU0VDICYmICEoSFogJSBVU0VDX1BFUl9TRUMpCi0JcmV0dXJuIChqICsgKEhaIC8gVVNFQ19QRVJfU0VDKSAtIDEpLyhIWiAvIFVTRUNfUEVSX1NFQyk7Ci0jZWxzZQotCXJldHVybiAoaiAqIFVTRUNfUEVSX1NFQykgLyBIWjsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXNlY3NfdG9famlmZmllcyhjb25zdCB1bnNpZ25lZCBpbnQgbSkKLXsKLQlpZiAobSA+IGppZmZpZXNfdG9fbXNlY3MoTUFYX0pJRkZZX09GRlNFVCkpCi0JCXJldHVybiBNQVhfSklGRllfT0ZGU0VUOwotI2lmIEhaIDw9IE1TRUNfUEVSX1NFQyAmJiAhKE1TRUNfUEVSX1NFQyAlIEhaKQotCXJldHVybiAobSArIChNU0VDX1BFUl9TRUMgLyBIWikgLSAxKSAvIChNU0VDX1BFUl9TRUMgLyBIWik7Ci0jZWxpZiBIWiA+IE1TRUNfUEVSX1NFQyAmJiAhKEhaICUgTVNFQ19QRVJfU0VDKQotCXJldHVybiBtICogKEhaIC8gTVNFQ19QRVJfU0VDKTsKLSNlbHNlCi0JcmV0dXJuIChtICogSFogKyBNU0VDX1BFUl9TRUMgLSAxKSAvIE1TRUNfUEVSX1NFQzsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdXNlY3NfdG9famlmZmllcyhjb25zdCB1bnNpZ25lZCBpbnQgdSkKLXsKLQlpZiAodSA+IGppZmZpZXNfdG9fdXNlY3MoTUFYX0pJRkZZX09GRlNFVCkpCi0JCXJldHVybiBNQVhfSklGRllfT0ZGU0VUOwotI2lmIEhaIDw9IFVTRUNfUEVSX1NFQyAmJiAhKFVTRUNfUEVSX1NFQyAlIEhaKQotCXJldHVybiAodSArIChVU0VDX1BFUl9TRUMgLyBIWikgLSAxKSAvIChVU0VDX1BFUl9TRUMgLyBIWik7Ci0jZWxpZiBIWiA+IFVTRUNfUEVSX1NFQyAmJiAhKEhaICUgVVNFQ19QRVJfU0VDKQotCXJldHVybiB1ICogKEhaIC8gVVNFQ19QRVJfU0VDKTsKLSNlbHNlCi0JcmV0dXJuICh1ICogSFogKyBVU0VDX1BFUl9TRUMgLSAxKSAvIFVTRUNfUEVSX1NFQzsKLSNlbmRpZgotfQotCi0vKgotICogVGhlIFRJQ0tfTlNFQyAtIDEgcm91bmRzIHVwIHRoZSB2YWx1ZSB0byB0aGUgbmV4dCByZXNvbHV0aW9uLiAgTm90ZQotICogdGhhdCBhIHJlbWFpbmRlciBzdWJ0cmFjdCBoZXJlIHdvdWxkIG5vdCBkbyB0aGUgcmlnaHQgdGhpbmcgYXMgdGhlCi0gKiByZXNvbHV0aW9uIHZhbHVlcyBkb24ndCBmYWxsIG9uIHNlY29uZCBib3VuZHJpZXMuICBJLmUuIHRoZSBsaW5lOgotICogbnNlYyAtPSBuc2VjICUgVElDS19OU0VDOyBpcyBOT1QgYSBjb3JyZWN0IHJlc29sdXRpb24gcm91bmRpbmcuCi0gKgotICogUmF0aGVyLCB3ZSBqdXN0IHNoaWZ0IHRoZSBiaXRzIG9mZiB0aGUgcmlnaHQuCi0gKgotICogVGhlID4+IChOU0VDX0pJRkZJRV9TQyAtIFNFQ19KSUZGSUVfU0MpIGNvbnZlcnRzIHRoZSBzY2FsZWQgbnNlYwotICogdmFsdWUgdG8gYSBzY2FsZWQgc2Vjb25kIHZhbHVlLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nCi10aW1lc3BlY190b19qaWZmaWVzKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBzZWMgPSB2YWx1ZS0+dHZfc2VjOwotCWxvbmcgbnNlYyA9IHZhbHVlLT50dl9uc2VjICsgVElDS19OU0VDIC0gMTsKLQotCWlmIChzZWMgPj0gTUFYX1NFQ19JTl9KSUZGSUVTKXsKLQkJc2VjID0gTUFYX1NFQ19JTl9KSUZGSUVTOwotCQluc2VjID0gMDsKLQl9Ci0JcmV0dXJuICgoKHU2NClzZWMgKiBTRUNfQ09OVkVSU0lPTikgKwotCQkoKCh1NjQpbnNlYyAqIE5TRUNfQ09OVkVSU0lPTikgPj4KLQkJIChOU0VDX0pJRkZJRV9TQyAtIFNFQ19KSUZGSUVfU0MpKSkgPj4gU0VDX0pJRkZJRV9TQzsKLQotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1qaWZmaWVzX3RvX3RpbWVzcGVjKGNvbnN0IHVuc2lnbmVkIGxvbmcgamlmZmllcywgc3RydWN0IHRpbWVzcGVjICp2YWx1ZSkKLXsKLQkvKgotCSAqIENvbnZlcnQgamlmZmllcyB0byBuYW5vc2Vjb25kcyBhbmQgc2VwYXJhdGUgd2l0aAotCSAqIG9uZSBkaXZpZGUuCi0JICovCi0JdTY0IG5zZWMgPSAodTY0KWppZmZpZXMgKiBUSUNLX05TRUM7Ci0JdmFsdWUtPnR2X3NlYyA9IGRpdl9sb25nX2xvbmdfcmVtKG5zZWMsIE5TRUNfUEVSX1NFQywgJnZhbHVlLT50dl9uc2VjKTsKLX0KLQotLyogU2FtZSBmb3IgInRpbWV2YWwiCi0gKgotICogV2VsbCwgYWxtb3N0LiAgVGhlIHByb2JsZW0gaGVyZSBpcyB0aGF0IHRoZSByZWFsIHN5c3RlbSByZXNvbHV0aW9uIGlzCi0gKiBpbiBuYW5vc2Vjb25kcyBhbmQgdGhlIHZhbHVlIGJlaW5nIGNvbnZlcnRlZCBpcyBpbiBtaWNybyBzZWNvbmRzLgotICogQWxzbyBmb3Igc29tZSBtYWNoaW5lcyAodGhvc2UgdGhhdCB1c2UgSFogPSAxMDI0LCBpbi1wYXJ0aWN1bGFyKSwKLSAqIHRoZXJlIGlzIGEgTEFSR0UgZXJyb3IgaW4gdGhlIHRpY2sgc2l6ZSBpbiBtaWNyb3NlY29uZHMuCi0KLSAqIFRoZSBzb2x1dGlvbiB3ZSB1c2UgaXMgdG8gZG8gdGhlIHJvdW5kaW5nIEFGVEVSIHdlIGNvbnZlcnQgdGhlCi0gKiBtaWNyb3NlY29uZCBwYXJ0LiAgVGh1cyB0aGUgVVNFQ19ST1VORCwgdGhlIGJpdHMgdG8gYmUgc2hpZnRlZCBvZmYuCi0gKiBJbnN0cnVjdGlvbiB3aXNlLCB0aGlzIHNob3VsZCBjb3N0IG9ubHkgYW4gYWRkaXRpb25hbCBhZGQgd2l0aCBjYXJyeQotICogaW5zdHJ1Y3Rpb24gYWJvdmUgdGhlIHdheSBpdCB3YXMgZG9uZSBhYm92ZS4KLSAqLwotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZwotdGltZXZhbF90b19qaWZmaWVzKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHNlYyA9IHZhbHVlLT50dl9zZWM7Ci0JbG9uZyB1c2VjID0gdmFsdWUtPnR2X3VzZWM7Ci0KLQlpZiAoc2VjID49IE1BWF9TRUNfSU5fSklGRklFUyl7Ci0JCXNlYyA9IE1BWF9TRUNfSU5fSklGRklFUzsKLQkJdXNlYyA9IDA7Ci0JfQotCXJldHVybiAoKCh1NjQpc2VjICogU0VDX0NPTlZFUlNJT04pICsKLQkJKCgodTY0KXVzZWMgKiBVU0VDX0NPTlZFUlNJT04gKyBVU0VDX1JPVU5EKSA+PgotCQkgKFVTRUNfSklGRklFX1NDIC0gU0VDX0pJRkZJRV9TQykpKSA+PiBTRUNfSklGRklFX1NDOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1qaWZmaWVzX3RvX3RpbWV2YWwoY29uc3QgdW5zaWduZWQgbG9uZyBqaWZmaWVzLCBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCi17Ci0JLyoKLQkgKiBDb252ZXJ0IGppZmZpZXMgdG8gbmFub3NlY29uZHMgYW5kIHNlcGFyYXRlIHdpdGgKLQkgKiBvbmUgZGl2aWRlLgotCSAqLwotCXU2NCBuc2VjID0gKHU2NClqaWZmaWVzICogVElDS19OU0VDOwotCWxvbmcgdHZfdXNlYzsKLQotCXZhbHVlLT50dl9zZWMgPSBkaXZfbG9uZ19sb25nX3JlbShuc2VjLCBOU0VDX1BFUl9TRUMsICZ0dl91c2VjKTsKLQl0dl91c2VjIC89IE5TRUNfUEVSX1VTRUM7Ci0JdmFsdWUtPnR2X3VzZWMgPSB0dl91c2VjOwotfQotCi0vKgotICogQ29udmVydCBqaWZmaWVzL2ppZmZpZXNfNjQgdG8gY2xvY2tfdCBhbmQgYmFjay4KLSAqLwotc3RhdGljIGlubGluZSBjbG9ja190IGppZmZpZXNfdG9fY2xvY2tfdChsb25nIHgpCi17Ci0jaWYgKFRJQ0tfTlNFQyAlIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSkgPT0gMAotCXJldHVybiB4IC8gKEhaIC8gVVNFUl9IWik7Ci0jZWxzZQotCXU2NCB0bXAgPSAodTY0KXggKiBUSUNLX05TRUM7Ci0JZG9fZGl2KHRtcCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKLQlyZXR1cm4gKGxvbmcpdG1wOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjbG9ja190X3RvX2ppZmZpZXModW5zaWduZWQgbG9uZyB4KQotewotI2lmIChIWiAlIFVTRVJfSFopPT0wCi0JaWYgKHggPj0gfjBVTCAvIChIWiAvIFVTRVJfSFopKQotCQlyZXR1cm4gfjBVTDsKLQlyZXR1cm4geCAqIChIWiAvIFVTRVJfSFopOwotI2Vsc2UKLQl1NjQgamlmOwotCi0JLyogRG9uJ3Qgd29ycnkgYWJvdXQgbG9zcyBvZiBwcmVjaXNpb24gaGVyZSAuLiAqLwotCWlmICh4ID49IH4wVUwgLyBIWiAqIFVTRVJfSFopCi0JCXJldHVybiB+MFVMOwotCi0JLyogLi4gYnV0IGRvIHRyeSB0byBjb250YWluIGl0IGhlcmUgKi8KLQlqaWYgPSB4ICogKHU2NCkgSFo7Ci0JZG9fZGl2KGppZiwgVVNFUl9IWik7Ci0JcmV0dXJuIGppZjsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHU2NCBqaWZmaWVzXzY0X3RvX2Nsb2NrX3QodTY0IHgpCi17Ci0jaWYgKFRJQ0tfTlNFQyAlIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSkgPT0gMAotCWRvX2Rpdih4LCBIWiAvIFVTRVJfSFopOwotI2Vsc2UKLQkvKgotCSAqIFRoZXJlIGFyZSBiZXR0ZXIgd2F5cyB0aGF0IGRvbid0IG92ZXJmbG93IGVhcmx5LAotCSAqIGJ1dCBldmVuIHRoaXMgZG9lc24ndCBvdmVyZmxvdyBpbiBodW5kcmVkcyBvZiB5ZWFycwotCSAqIGluIDY0IGJpdHMsIHNvLi4KLQkgKi8KLQl4ICo9IFRJQ0tfTlNFQzsKLQlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKLSNlbmRpZgotCXJldHVybiB4OwotfQotCi1zdGF0aWMgaW5saW5lIHU2NCBuc2VjX3RvX2Nsb2NrX3QodTY0IHgpCi17Ci0jaWYgKE5TRUNfUEVSX1NFQyAlIFVTRVJfSFopID09IDAKLQlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKLSNlbGlmIChVU0VSX0haICUgNTEyKSA9PSAwCi0JeCAqPSBVU0VSX0haLzUxMjsKLQlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIDUxMikpOwotI2Vsc2UKLQkvKgotICAgICAgICAgKiBtYXggcmVsYXRpdmUgZXJyb3IgNS43ZS04ICgxLjhzIHBlciB5ZWFyKSBmb3IgVVNFUl9IWiA8PSAxMDI0LAotICAgICAgICAgKiBvdmVyZmxvdyBhZnRlciA2NC45OSB5ZWFycy4KLSAgICAgICAgICogZXhhY3QgZm9yIEhaPTYwLCA3MiwgOTAsIDEyMCwgMTQ0LCAxODAsIDMwMCwgNjAwLCA5MDAsIC4uLgotICAgICAgICAgKi8KLQl4ICo9IDk7Ci0JZG9fZGl2KHgsICh1bnNpZ25lZCBsb25nKSgoOXVsbCAqIE5TRUNfUEVSX1NFQyArIChVU0VSX0haLzIpKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgLyBVU0VSX0haKSk7Ci0jZW5kaWYKLQlyZXR1cm4geDsKLX0KKyNkZWZpbmUgVElNRVNUQU1QX1NJWkUJMzAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t0aW1lLmggYi9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKaW5kZXggNzQ0NGE2My4uYzY4YzdhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgva3RpbWUuaApAQCAtMjYxLDggKzI2MSw3IEBACiAgKiBpZGVhIG9mIHRoZSAoaW4pYWNjdXJhY3kgb2YgdGltZXJzLiBUaW1lciB2YWx1ZXMgYXJlIHJvdW5kZWQgdXAgdG8KICAqIHRoaXMgcmVzb2x1dGlvbiB2YWx1ZXMuCiAgKi8KLSNkZWZpbmUgS1RJTUVfUkVBTFRJTUVfUkVTCShrdGltZV90KXsgLnR2NjQgPSBUSUNLX05TRUMgfQotI2RlZmluZSBLVElNRV9NT05PVE9OSUNfUkVTCShrdGltZV90KXsgLnR2NjQgPSBUSUNLX05TRUMgfQorI2RlZmluZSBLVElNRV9MT1dfUkVTCQkoa3RpbWVfdCl7IC50djY0ID0gVElDS19OU0VDIH0KIAogLyogR2V0IHRoZSBtb25vdG9uaWMgdGltZSBpbiB0aW1lc3BlYyBmb3JtYXQ6ICovCiBleHRlcm4gdm9pZCBrdGltZV9nZXRfdHMoc3RydWN0IHRpbWVzcGVjICp0cyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCA1OTZlMGMxLi5iODcwYjIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTE3Miw2ICsxNzIsNyBAQAogCUFUQV9GTEFHX0RFQlVHTVNHCT0gKDEgPDwgMTMpLAogCUFUQV9GTEFHX1NFVFhGRVJfUE9MTElORz0gKDEgPDwgMTQpLCAvKiB1c2UgcG9sbGluZyBmb3IgU0VUWEZFUiAqLwogCUFUQV9GTEFHX0lHTl9TSU1QTEVYCT0gKDEgPDwgMTUpLCAvKiBpZ25vcmUgU0lNUExFWCAqLworCUFUQV9GTEFHX05PX0lPUkRZCT0gKDEgPDwgMTYpLCAvKiBjb250cm9sbGVyIGxhY2tzIGlvcmR5ICovCiAKIAkvKiBUaGUgZm9sbG93aW5nIGZsYWcgYmVsb25ncyB0byBhcC0+cGZsYWdzIGJ1dCBpcyBrZXB0IGluCiAJICogYXAtPmZsYWdzIGJlY2F1c2UgaXQncyByZWZlcmVuY2VkIGluIG1hbnkgTExEcyBhbmQgd2lsbCBiZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnM0LmggYi9pbmNsdWRlL2xpbnV4L25mczQuaAppbmRleCBkYjA1MTgyLi4xYmU1YmU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mczQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mczQuaApAQCAtMTA1LDEyICsxMDUsMTEgQEAKIAl1aW50MzJfdAlhY2Nlc3NfbWFzazsKIAlpbnQJCXdob3R5cGU7CiAJdWlkX3QJCXdobzsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxfYWNlOwogfTsKIAogc3RydWN0IG5mczRfYWNsIHsKIAl1aW50MzJfdAluYWNlczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGFjZV9oZWFkOworCXN0cnVjdCBuZnM0X2FjZQlhY2VzWzBdOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGRhdGFbTkZTNF9WRVJJRklFUl9TSVpFXTsgfSBuZnM0X3ZlcmlmaWVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnM0X2FjbC5oIGIvaW5jbHVkZS9saW51eC9uZnM0X2FjbC5oCmluZGV4IDIyYWZmNGQuLjQwOWI2ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzNF9hY2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mczRfYWNsLmgKQEAgLTM5LDkgKzM5LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KIAotc3RydWN0IG5mczRfYWNsICpuZnM0X2FjbF9uZXcodm9pZCk7Ci12b2lkIG5mczRfYWNsX2ZyZWUoc3RydWN0IG5mczRfYWNsICopOwotaW50IG5mczRfYWNsX2FkZF9hY2Uoc3RydWN0IG5mczRfYWNsICosIHUzMiwgdTMyLCB1MzIsIGludCwgdWlkX3QpOworLyogTWF4aW11bSBBQ0wgd2UnbGwgYWNjZXB0IGZyb20gY2xpZW50OyBjaG9zZW4gKHNvbWV3aGF0IGFyYml0cmFyaWx5KSB0bworICogZml0IGluIGEgcGFnZTogKi8KKyNkZWZpbmUgTkZTNF9BQ0xfTUFYIDE3MAorCitzdHJ1Y3QgbmZzNF9hY2wgKm5mczRfYWNsX25ldyhpbnQpOwordm9pZCBuZnM0X2FjbF9hZGRfYWNlKHN0cnVjdCBuZnM0X2FjbCAqLCB1MzIsIHUzMiwgdTMyLCBpbnQsIHVpZF90KTsKIGludCBuZnM0X2FjbF9nZXRfd2hvdHlwZShjaGFyICosIHUzMik7CiBpbnQgbmZzNF9hY2xfd3JpdGVfd2hvKGludCB3aG8sIGNoYXIgKnApOwogaW50IG5mczRfYWNsX3Blcm1pc3Npb24oc3RydWN0IG5mczRfYWNsICphY2wsIHVpZF90IG93bmVyLCBnaWRfdCBncm91cCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGljay5oIGIvaW5jbHVkZS9saW51eC90aWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3MjUyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdGljay5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiAgbGludXgvaW5jbHVkZS9saW51eC90aWNrLmgKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIHRpY2sgcmVsYXRlZCBmdW5jdGlvbnMKKyAqCisgKi8KKyNpZm5kZWYgX0xJTlVYX1RJQ0tfSAorI2RlZmluZSBfTElOVVhfVElDS19ICisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUworCitlbnVtIHRpY2tfZGV2aWNlX21vZGUgeworCVRJQ0tERVZfTU9ERV9QRVJJT0RJQywKKwlUSUNLREVWX01PREVfT05FU0hPVCwKK307CisKK3N0cnVjdCB0aWNrX2RldmljZSB7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ZGV2OworCWVudW0gdGlja19kZXZpY2VfbW9kZSBtb2RlOworfTsKKworZW51bSB0aWNrX25vaHpfbW9kZSB7CisJTk9IWl9NT0RFX0lOQUNUSVZFLAorCU5PSFpfTU9ERV9MT1dSRVMsCisJTk9IWl9NT0RFX0hJR0hSRVMsCit9OworCisvKioKKyAqIHN0cnVjdCB0aWNrX3NjaGVkIC0gc2NoZWQgdGljayBlbXVsYXRpb24gYW5kIG5vIGlkbGUgdGljayBjb250cm9sL3N0YXRzCisgKiBAc2NoZWRfdGltZXI6CWhydGltZXIgdG8gc2NoZWR1bGUgdGhlIHBlcmlvZGljIHRpY2sgaW4gaGlnaAorICoJCQlyZXNvbHV0aW9uIG1vZGUKKyAqIEBpZGxlX3RpY2s6CQlTdG9yZSB0aGUgbGFzdCBpZGxlIHRpY2sgZXhwaXJ5IHRpbWUgd2hlbiB0aGUgdGljaworICoJCQl0aW1lciBpcyBtb2RpZmllZCBmb3IgaWRsZSBzbGVlcHMuIFRoaXMgaXMgbmVjZXNzYXJ5CisgKgkJCXRvIHJlc3VtZSB0aGUgdGljayB0aW1lciBvcGVyYXRpb24gaW4gdGhlIHRpbWVsaW5lCisgKgkJCXdoZW4gdGhlIENQVSByZXR1cm5zIGZyb20gaWRsZQorICogQHRpY2tfc3RvcHBlZDoJSW5kaWNhdG9yIHRoYXQgdGhlIGlkbGUgdGljayBoYXMgYmVlbiBzdG9wcGVkCisgKiBAaWRsZV9qaWZmaWVzOglqaWZmaWVzIGF0IHRoZSBlbnRyeSB0byBpZGxlIGZvciBpZGxlIHRpbWUgYWNjb3VudGluZworICogQGlkbGVfY2FsbHM6CQlUb3RhbCBudW1iZXIgb2YgaWRsZSBjYWxscworICogQGlkbGVfc2xlZXBzOglOdW1iZXIgb2YgaWRsZSBjYWxscywgd2hlcmUgdGhlIHNjaGVkIHRpY2sgd2FzIHN0b3BwZWQKKyAqIEBpZGxlX2VudHJ5dGltZToJVGltZSB3aGVuIHRoZSBpZGxlIGNhbGwgd2FzIGVudGVyZWQKKyAqIEBpZGxlX3NsZWVwdGltZToJU3VtIG9mIHRoZSB0aW1lIHNsZXB0IGluIGlkbGUgd2l0aCBzY2hlZCB0aWNrIHN0b3BwZWQKKyAqLworc3RydWN0IHRpY2tfc2NoZWQgeworCXN0cnVjdCBocnRpbWVyCQkJc2NoZWRfdGltZXI7CisJdW5zaWduZWQgbG9uZwkJCWNoZWNrX2Nsb2NrczsKKwllbnVtIHRpY2tfbm9oel9tb2RlCQlub2h6X21vZGU7CisJa3RpbWVfdAkJCQlpZGxlX3RpY2s7CisJaW50CQkJCXRpY2tfc3RvcHBlZDsKKwl1bnNpZ25lZCBsb25nCQkJaWRsZV9qaWZmaWVzOworCXVuc2lnbmVkIGxvbmcJCQlpZGxlX2NhbGxzOworCXVuc2lnbmVkIGxvbmcJCQlpZGxlX3NsZWVwczsKKwlrdGltZV90CQkJCWlkbGVfZW50cnl0aW1lOworCWt0aW1lX3QJCQkJaWRsZV9zbGVlcHRpbWU7CisJdW5zaWduZWQgbG9uZwkJCWxhc3RfamlmZmllczsKKwl1bnNpZ25lZCBsb25nCQkJbmV4dF9qaWZmaWVzOworCWt0aW1lX3QJCQkJaWRsZV9leHBpcmVzOworfTsKKworZXh0ZXJuIHZvaWQgX19pbml0IHRpY2tfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgdGlja19pc19vbmVzaG90X2F2YWlsYWJsZSh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgdGlja19kZXZpY2UgKnRpY2tfZ2V0X2RldmljZShpbnQgY3B1KTsKKworIyBpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCitleHRlcm4gaW50IHRpY2tfaW5pdF9oaWdocmVzKHZvaWQpOworZXh0ZXJuIGludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpOworZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9zY2hlZF90aW1lcih2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpOworIyBlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19jYW5jZWxfc2NoZWRfdGltZXIoaW50IGNwdSkgeyB9CisjIGVuZGlmIC8qIEhJR0hSRVMgKi8KKworIyBpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKK2V4dGVybiBzdHJ1Y3QgdGlja19kZXZpY2UgKnRpY2tfZ2V0X2Jyb2FkY2FzdF9kZXZpY2Uodm9pZCk7CitleHRlcm4gY3B1bWFza190ICp0aWNrX2dldF9icm9hZGNhc3RfbWFzayh2b2lkKTsKKworIyAgaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAorZXh0ZXJuIGNwdW1hc2tfdCAqdGlja19nZXRfYnJvYWRjYXN0X29uZXNob3RfbWFzayh2b2lkKTsKKyMgIGVuZGlmCisKKyMgZW5kaWYgLyogQlJPQURDQVNUICovCisKKyMgaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAorZXh0ZXJuIHZvaWQgdGlja19jbG9ja19ub3RpZnkodm9pZCk7CitleHRlcm4gaW50IHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoaW50IGFsbG93X25vaHopOworZXh0ZXJuIHN0cnVjdCB0aWNrX3NjaGVkICp0aWNrX2dldF90aWNrX3NjaGVkKGludCBjcHUpOworIyBlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19jbG9ja19ub3RpZnkodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIGludCB0aWNrX2NoZWNrX29uZXNob3RfY2hhbmdlKGludCBhbGxvd19ub2h6KSB7IHJldHVybiAwOyB9CisjIGVuZGlmCisKKyNlbHNlIC8qIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19pbml0KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2xvY2tfbm90aWZ5KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19vbmVzaG90X2NoYW5nZShpbnQgYWxsb3dfbm9oeikgeyByZXR1cm4gMDsgfQorI2VuZGlmIC8qICFDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUyAqLworCisjIGlmZGVmIENPTkZJR19OT19IWgorZXh0ZXJuIHZvaWQgdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljayh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2sodm9pZCk7CitleHRlcm4gdm9pZCB0aWNrX25vaHpfdXBkYXRlX2ppZmZpZXModm9pZCk7CisjIGVsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2sodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19ub2h6X3VwZGF0ZV9qaWZmaWVzKHZvaWQpIHsgfQorIyBlbmRpZiAvKiAhTk9fSFogKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL2luY2x1ZGUvbGludXgvdGltZS5oCmluZGV4IGVjZWIxYTUuLjhlYThkZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC05Miw2ICs5Miw3IEBACiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fbW9ub3RvbmljOwogZXh0ZXJuIHNlcWxvY2tfdCB4dGltZV9sb2NrIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHZvaWQpOwogdm9pZCB0aW1la2VlcGluZ19pbml0KHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3NlY29uZHModm9pZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZXIuaCBiL2luY2x1ZGUvbGludXgvdGltZXIuaAppbmRleCBmYjVlZGFhLi43MTkxMTNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lci5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfTElOVVhfVElNRVJfSAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KIApAQCAtMTUsNiArMTYsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGRhdGE7CiAKIAlzdHJ1Y3QgdHZlY190X2Jhc2VfcyAqYmFzZTsKKyNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKKwl2b2lkICpzdGFydF9zaXRlOworCWNoYXIgc3RhcnRfY29tbVsxNl07CisJaW50IHN0YXJ0X3BpZDsKKyNlbmRpZgogfTsKIAogZXh0ZXJuIHN0cnVjdCB0dmVjX3RfYmFzZV9zIGJvb3RfdHZlY19iYXNlczsKQEAgLTYxLDcgKzY3LDY1IEBACiBleHRlcm4gaW50IF9fbW9kX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgbG9uZyBleHBpcmVzKTsKIGV4dGVybiBpbnQgbW9kX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgbG9uZyBleHBpcmVzKTsKIAorLyoKKyAqIFJldHVybiB3aGVuIHRoZSBuZXh0IHRpbWVyLXdoZWVsIHRpbWVvdXQgb2NjdXJzIChpbiBhYnNvbHV0ZSBqaWZmaWVzKSwKKyAqIGxvY2tzIHRoZSB0aW1lciBiYXNlOgorICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyX2ludGVycnVwdCh2b2lkKTsKKy8qCisgKiBSZXR1cm4gd2hlbiB0aGUgbmV4dCB0aW1lci13aGVlbCB0aW1lb3V0IG9jY3VycyAoaW4gYWJzb2x1dGUgamlmZmllcyksCisgKiBsb2NrcyB0aGUgdGltZXIgYmFzZSBhbmQgZG9lcyB0aGUgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZSBnaXZlbgorICogamlmZmllLgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfbmV4dF90aW1lcl9pbnRlcnJ1cHQodW5zaWduZWQgbG9uZyBub3cpOworCisvKgorICogVGltZXItc3RhdGlzdGljcyBpbmZvOgorICovCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisKK2V4dGVybiB2b2lkIGluaXRfdGltZXJfc3RhdHModm9pZCk7CisKK2V4dGVybiB2b2lkIHRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh2b2lkICp0aW1lciwgcGlkX3QgcGlkLCB2b2lkICpzdGFydGYsCisJCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKiBjb21tKTsKKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh0aW1lciwgdGltZXItPnN0YXJ0X3BpZCwgdGltZXItPnN0YXJ0X3NpdGUsCisJCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0pOworfQorCitleHRlcm4gdm9pZCBfX3RpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwKKwkJCQkJICAgICAgIHZvaWQgKmFkZHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCV9fdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8odGltZXIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c190aW1lcl9jbGVhcl9zdGFydF9pbmZvKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwl0aW1lci0+c3RhcnRfc2l0ZSA9IE5VTEw7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGluaXRfdGltZXJfc3RhdHModm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfY2xlYXJfc3RhcnRfaW5mbyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7Cit9CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgZGVsYXllZF93b3JrX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgX19kYXRhKTsKIAogLyoqCiAgKiBhZGRfdGltZXIgLSBzdGFydCBhIHRpbWVyCkBAIC05Niw3ICsxNjAsNyBAQAogZXh0ZXJuIHZvaWQgaW5pdF90aW1lcnModm9pZCk7CiBleHRlcm4gdm9pZCBydW5fbG9jYWxfdGltZXJzKHZvaWQpOwogc3RydWN0IGhydGltZXI7Ci1leHRlcm4gaW50IGl0X3JlYWxfZm4oc3RydWN0IGhydGltZXIgKik7CitleHRlcm4gZW51bSBocnRpbWVyX3Jlc3RhcnQgaXRfcmVhbF9mbihzdHJ1Y3QgaHJ0aW1lciAqKTsKIAogdW5zaWduZWQgbG9uZyBfX3JvdW5kX2ppZmZpZXModW5zaWduZWQgbG9uZyBqLCBpbnQgY3B1KTsKIHVuc2lnbmVkIGxvbmcgX19yb3VuZF9qaWZmaWVzX3JlbGF0aXZlKHVuc2lnbmVkIGxvbmcgaiwgaW50IGNwdSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWV4LmggYi9pbmNsdWRlL2xpbnV4L3RpbWV4LmgKaW5kZXggOWEyNGU1MC4uZGE5MjlkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1leC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZXguaApAQCAtMjg2LDYgKzI4NiwxMyBAQAogCiAjZGVmaW5lIFRJQ0tfTEVOR1RIX1NISUZUCTMyCiAKKyNpZmRlZiBDT05GSUdfTk9fSFoKKyNkZWZpbmUgTlRQX0lOVEVSVkFMX0ZSRVEgICgyKQorI2Vsc2UKKyNkZWZpbmUgTlRQX0lOVEVSVkFMX0ZSRVEgIChIWikKKyNlbmRpZgorI2RlZmluZSBOVFBfSU5URVJWQUxfTEVOR1RIIChOU0VDX1BFUl9TRUMvTlRQX0lOVEVSVkFMX0ZSRVEpCisKIC8qIFJldHVybnMgaG93IGxvbmcgdGlja3MgYXJlIGF0IHByZXNlbnQsIGluIG5zIC8gMl4oU0hJRlRfU0NBTEUtMTApLiAqLwogZXh0ZXJuIHU2NCBjdXJyZW50X3RpY2tfbGVuZ3RoKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IDI0MjFlMTUuLjk1MzUwMGIgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L3Rhc2tzdGF0c19rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CkBAIC01MTUsNiArNTE2LDcgQEAKICAqIGVuYWJsZSB0aGVtCiAgKi8KIAlsb2NrX2tlcm5lbCgpOworCXRpY2tfaW5pdCgpOwogCWJvb3RfY3B1X2luaXQoKTsKIAlwYWdlX2FkZHJlc3NfaW5pdCgpOwogCXByaW50ayhLRVJOX05PVElDRSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCAwYjYyOTNkLi5kMTU0Y2M3IDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTg1OCw3ICs4NTgsNyBAQAogCWluaXRfc2lncGVuZGluZygmc2lnLT5zaGFyZWRfcGVuZGluZyk7CiAJSU5JVF9MSVNUX0hFQUQoJnNpZy0+cG9zaXhfdGltZXJzKTsKIAotCWhydGltZXJfaW5pdCgmc2lnLT5yZWFsX3RpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfUkVMKTsKKwlocnRpbWVyX2luaXQoJnNpZy0+cmVhbF90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAlzaWctPml0X3JlYWxfaW5jci50djY0ID0gMDsKIAlzaWctPnJlYWxfdGltZXIuZnVuY3Rpb24gPSBpdF9yZWFsX2ZuOwogCXNpZy0+dHNrID0gdHNrOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCA1YTczN2RlLi5lNzQ5ZTdkIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMTEzNCw3ICsxMTM0LDcgQEAKIAogCWlmIChzZWMgIT0gTUFYX1NDSEVEVUxFX1RJTUVPVVQpIHsKIAkJdG8gPSAmdGltZW91dDsKLQkJaHJ0aW1lcl9pbml0KCZ0by0+dGltZXIsIENMT0NLX1JFQUxUSU1FLCBIUlRJTUVSX0FCUyk7CisJCWhydGltZXJfaW5pdCgmdG8tPnRpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7CiAJCWhydGltZXJfaW5pdF9zbGVlcGVyKHRvLCBjdXJyZW50KTsKIAkJdG8tPnRpbWVyLmV4cGlyZXMgPSBrdGltZV9zZXQoc2VjLCBuc2VjKTsKIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCBmNDRlNDk5Li40NzZjYjBjIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTEsOCArMSw5IEBACiAvKgogICogIGxpbnV4L2tlcm5lbC9ocnRpbWVyLmMKICAqCi0gKiAgQ29weXJpZ2h0KEMpIDIwMDUsIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgotICogIENvcHlyaWdodChDKSAyMDA1LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogIENvcHlyaWdodChDKSAyMDA1LTIwMDYsIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorICogIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiAgQ29weXJpZ2h0KEMpIDIwMDYtMjAwNyAgVGltZXN5cyBDb3JwLiwgVGhvbWFzIEdsZWl4bmVyCiAgKgogICogIEhpZ2gtcmVzb2x1dGlvbiBrZXJuZWwgdGltZXJzCiAgKgpAQCAtMzEsMTIgKzMyLDE3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTQ1LDcgKzUxLDcgQEAKICAqCiAgKiByZXR1cm5zIHRoZSB0aW1lIGluIGt0aW1lX3QgZm9ybWF0CiAgKi8KLXN0YXRpYyBrdGltZV90IGt0aW1lX2dldCh2b2lkKQora3RpbWVfdCBrdGltZV9nZXQodm9pZCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgbm93OwogCkBAIC01OSw3ICs2NSw3IEBACiAgKgogICogcmV0dXJucyB0aGUgdGltZSBpbiBrdGltZV90IGZvcm1hdAogICovCi1zdGF0aWMga3RpbWVfdCBrdGltZV9nZXRfcmVhbCh2b2lkKQora3RpbWVfdCBrdGltZV9nZXRfcmVhbCh2b2lkKQogewogCXN0cnVjdCB0aW1lc3BlYyBub3c7CiAKQEAgLTc5LDIxICs4NSwyMiBAQAogICogVGhpcyBlbnN1cmVzIHRoYXQgd2UgY2FwdHVyZSBlcnJvbmVvdXMgYWNjZXNzZXMgdG8gdGhlc2UgY2xvY2sgaWRzCiAgKiByYXRoZXIgdGhhbiBtb3ZpbmcgdGhlbSBpbnRvIHRoZSByYW5nZSBvZiB2YWxpZCBjbG9jayBpZCdzLgogICovCi0KLSNkZWZpbmUgTUFYX0hSVElNRVJfQkFTRVMgMgotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGhydGltZXJfYmFzZSwgaHJ0aW1lcl9iYXNlc1tNQVhfSFJUSU1FUl9CQVNFU10pID0KK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlLCBocnRpbWVyX2Jhc2VzKSA9CiB7CisKKwkuY2xvY2tfYmFzZSA9CiAJewotCQkuaW5kZXggPSBDTE9DS19SRUFMVElNRSwKLQkJLmdldF90aW1lID0gJmt0aW1lX2dldF9yZWFsLAotCQkucmVzb2x1dGlvbiA9IEtUSU1FX1JFQUxUSU1FX1JFUywKLQl9LAotCXsKLQkJLmluZGV4ID0gQ0xPQ0tfTU9OT1RPTklDLAotCQkuZ2V0X3RpbWUgPSAma3RpbWVfZ2V0LAotCQkucmVzb2x1dGlvbiA9IEtUSU1FX01PTk9UT05JQ19SRVMsCi0JfSwKKwkJeworCQkJLmluZGV4ID0gQ0xPQ0tfUkVBTFRJTUUsCisJCQkuZ2V0X3RpbWUgPSAma3RpbWVfZ2V0X3JlYWwsCisJCQkucmVzb2x1dGlvbiA9IEtUSU1FX0xPV19SRVMsCisJCX0sCisJCXsKKwkJCS5pbmRleCA9IENMT0NLX01PTk9UT05JQywKKwkJCS5nZXRfdGltZSA9ICZrdGltZV9nZXQsCisJCQkucmVzb2x1dGlvbiA9IEtUSU1FX0xPV19SRVMsCisJCX0sCisJfQogfTsKIAogLyoqCkBAIC0xMjUsMjAgKzEzMiwzNSBAQAogICogR2V0IHRoZSBjb2Fyc2UgZ3JhaW5lZCB0aW1lIGF0IHRoZSBzb2Z0aXJxIGJhc2VkIG9uIHh0aW1lIGFuZAogICogd2FsbF90b19tb25vdG9uaWMuCiAgKi8KLXN0YXRpYyB2b2lkIGhydGltZXJfZ2V0X3NvZnRpcnFfdGltZShzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlKQorc3RhdGljIHZvaWQgaHJ0aW1lcl9nZXRfc29mdGlycV90aW1lKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlKQogewogCWt0aW1lX3QgeHRpbSwgdG9tb25vOworCXN0cnVjdCB0aW1lc3BlYyB4dHM7CiAJdW5zaWduZWQgbG9uZyBzZXE7CiAKIAlkbyB7CiAJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwotCQl4dGltID0gdGltZXNwZWNfdG9fa3RpbWUoeHRpbWUpOwotCQl0b21vbm8gPSB0aW1lc3BlY190b19rdGltZSh3YWxsX3RvX21vbm90b25pYyk7Ci0KKyNpZmRlZiBDT05GSUdfTk9fSFoKKwkJZ2V0bnN0aW1lb2ZkYXkoJnh0cyk7CisjZWxzZQorCQl4dHMgPSB4dGltZTsKKyNlbmRpZgogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwogCi0JYmFzZVtDTE9DS19SRUFMVElNRV0uc29mdGlycV90aW1lID0geHRpbTsKLQliYXNlW0NMT0NLX01PTk9UT05JQ10uc29mdGlycV90aW1lID0ga3RpbWVfYWRkKHh0aW0sIHRvbW9ubyk7CisJeHRpbSA9IHRpbWVzcGVjX3RvX2t0aW1lKHh0cyk7CisJdG9tb25vID0gdGltZXNwZWNfdG9fa3RpbWUod2FsbF90b19tb25vdG9uaWMpOworCWJhc2UtPmNsb2NrX2Jhc2VbQ0xPQ0tfUkVBTFRJTUVdLnNvZnRpcnFfdGltZSA9IHh0aW07CisJYmFzZS0+Y2xvY2tfYmFzZVtDTE9DS19NT05PVE9OSUNdLnNvZnRpcnFfdGltZSA9CisJCWt0aW1lX2FkZCh4dGltLCB0b21vbm8pOworfQorCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrLCB3aGV0aGVyIHRoZSB0aW1lciBpcyBydW5uaW5nIHRoZSBjYWxsYmFjaworICogZnVuY3Rpb24KKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9jYWxsYmFja19ydW5uaW5nKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gdGltZXItPnN0YXRlICYgSFJUSU1FUl9TVEFURV9DQUxMQkFDSzsKIH0KIAogLyoKQEAgLTE0Nyw4ICsxNjksNiBAQAogICovCiAjaWZkZWYgQ09ORklHX1NNUAogCi0jZGVmaW5lIHNldF9jdXJyX3RpbWVyKGIsIHQpCQlkbyB7IChiKS0+Y3Vycl90aW1lciA9ICh0KTsgfSB3aGlsZSAoMCkKLQogLyoKICAqIFdlIGFyZSB1c2luZyBoYXNoZWQgbG9ja2luZzogaG9sZGluZyBwZXJfY3B1KGhydGltZXJfYmFzZXMpW25dLmxvY2sKICAqIG1lYW5zIHRoYXQgYWxsIHRpbWVycyB3aGljaCBhcmUgdGllZCB0byB0aGlzIGJhc2UgdmlhIHRpbWVyLT5iYXNlIGFyZQpAQCAtMTYxLDE5ICsxODEsMjAgQEAKICAqIHBvc3NpYmxlIHRvIHNldCB0aW1lci0+YmFzZSA9IE5VTEwgYW5kIGRyb3AgdGhlIGxvY2s6IHRoZSB0aW1lciByZW1haW5zCiAgKiBsb2NrZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpsb2NrX2hydGltZXJfYmFzZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQorc3RhdGljCitzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpsb2NrX2hydGltZXJfYmFzZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOwogCiAJZm9yICg7OykgewogCQliYXNlID0gdGltZXItPmJhc2U7CiAJCWlmIChsaWtlbHkoYmFzZSAhPSBOVUxMKSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+Y3B1X2Jhc2UtPmxvY2ssICpmbGFncyk7CiAJCQlpZiAobGlrZWx5KGJhc2UgPT0gdGltZXItPmJhc2UpKQogCQkJCXJldHVybiBiYXNlOwogCQkJLyogVGhlIHRpbWVyIGhhcyBtaWdyYXRlZCB0byBhbm90aGVyIENQVTogKi8KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXNlLT5jcHVfYmFzZS0+bG9jaywgKmZsYWdzKTsKIAkJfQogCQljcHVfcmVsYXgoKTsKIAl9CkBAIC0xODIsMTIgKzIwMywxNCBAQAogLyoKICAqIFN3aXRjaCB0aGUgdGltZXIgYmFzZSB0byB0aGUgY3VycmVudCBDUFUgd2hlbiBwb3NzaWJsZS4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICoKLXN3aXRjaF9ocnRpbWVyX2Jhc2Uoc3RydWN0IGhydGltZXIgKnRpbWVyLCBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICoKK3N3aXRjaF9ocnRpbWVyX2Jhc2Uoc3RydWN0IGhydGltZXIgKnRpbWVyLCBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKm5ld19iYXNlOworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKm5ld19iYXNlOworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpuZXdfY3B1X2Jhc2U7CiAKLQluZXdfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpW2Jhc2UtPmluZGV4XTsKKwluZXdfY3B1X2Jhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwluZXdfYmFzZSA9ICZuZXdfY3B1X2Jhc2UtPmNsb2NrX2Jhc2VbYmFzZS0+aW5kZXhdOwogCiAJaWYgKGJhc2UgIT0gbmV3X2Jhc2UpIHsKIAkJLyoKQEAgLTE5OSwxMyArMjIyLDEzIEBACiAJCSAqIGNvbXBsZXRlZC4gVGhlcmUgaXMgbm8gY29uZmxpY3QgYXMgd2UgaG9sZCB0aGUgbG9jayB1bnRpbAogCQkgKiB0aGUgdGltZXIgaXMgZW5xdWV1ZWQuCiAJCSAqLwotCQlpZiAodW5saWtlbHkoYmFzZS0+Y3Vycl90aW1lciA9PSB0aW1lcikpCisJCWlmICh1bmxpa2VseShocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcodGltZXIpKSkKIAkJCXJldHVybiBiYXNlOwogCiAJCS8qIFNlZSB0aGUgY29tbWVudCBpbiBsb2NrX3RpbWVyX2Jhc2UoKSAqLwogCQl0aW1lci0+YmFzZSA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrKCZiYXNlLT5sb2NrKTsKLQkJc3Bpbl9sb2NrKCZuZXdfYmFzZS0+bG9jayk7CisJCXNwaW5fdW5sb2NrKCZiYXNlLT5jcHVfYmFzZS0+bG9jayk7CisJCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmNwdV9iYXNlLT5sb2NrKTsKIAkJdGltZXItPmJhc2UgPSBuZXdfYmFzZTsKIAl9CiAJcmV0dXJuIG5ld19iYXNlOwpAQCAtMjEzLDE5ICsyMzYsMTcgQEAKIAogI2Vsc2UgLyogQ09ORklHX1NNUCAqLwogCi0jZGVmaW5lIHNldF9jdXJyX3RpbWVyKGIsIHQpCQlkbyB7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGhydGltZXJfYmFzZSAqCitzdGF0aWMgaW5saW5lIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKgogbG9ja19ocnRpbWVyX2Jhc2UoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyLCB1bnNpZ25lZCBsb25nICpmbGFncykKIHsKLQlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlID0gdGltZXItPmJhc2U7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSA9IHRpbWVyLT5iYXNlOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmNwdV9iYXNlLT5sb2NrLCAqZmxhZ3MpOwogCiAJcmV0dXJuIGJhc2U7CiB9CiAKLSNkZWZpbmUgc3dpdGNoX2hydGltZXJfYmFzZSh0LCBiKQkoYikKKyMgZGVmaW5lIHN3aXRjaF9ocnRpbWVyX2Jhc2UodCwgYikJKGIpCiAKICNlbmRpZgkvKiAhQ09ORklHX1NNUCAqLwogCkBAIC0yNTYsMTUgKzI3NywxMiBAQAogCiAJcmV0dXJuIGt0aW1lX2FkZChrdCwgdG1wKTsKIH0KLQotI2Vsc2UgLyogQ09ORklHX0tUSU1FX1NDQUxBUiAqLwotCiAjIGVuZGlmIC8qICFDT05GSUdfS1RJTUVfU0NBTEFSICovCiAKIC8qCiAgKiBEaXZpZGUgYSBrdGltZSB2YWx1ZSBieSBhIG5hbm9zZWNvbmQgdmFsdWUKICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcga3RpbWVfZGl2bnMoY29uc3Qga3RpbWVfdCBrdCwgczY0IGRpdikKK3Vuc2lnbmVkIGxvbmcga3RpbWVfZGl2bnMoY29uc3Qga3RpbWVfdCBrdCwgczY0IGRpdikKIHsKIAl1NjQgZGNsYywgaW5jLCBkbnM7CiAJaW50IHNmdCA9IDA7CkBAIC0yODEsMTggKzI5OSwzMTEgQEAKIAogCXJldHVybiAodW5zaWduZWQgbG9uZykgZGNsYzsKIH0KLQotI2Vsc2UgLyogQklUU19QRVJfTE9ORyA8IDY0ICovCi0jIGRlZmluZSBrdGltZV9kaXZucyhrdCwgZGl2KQkJKHVuc2lnbmVkIGxvbmcpKChrdCkudHY2NCAvIChkaXYpKQogI2VuZGlmIC8qIEJJVFNfUEVSX0xPTkcgPj0gNjQgKi8KIAorLyogSGlnaCByZXNvbHV0aW9uIHRpbWVyIHJlbGF0ZWQgZnVuY3Rpb25zICovCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCisvKgorICogSGlnaCByZXNvbHV0aW9uIHRpbWVyIGVuYWJsZWQgPworICovCitzdGF0aWMgaW50IGhydGltZXJfaHJlc19lbmFibGVkIF9fcmVhZF9tb3N0bHkgID0gMTsKKworLyoKKyAqIEVuYWJsZSAvIERpc2FibGUgaGlnaCByZXNvbHV0aW9uIG1vZGUKKyAqLworc3RhdGljIGludCBfX2luaXQgc2V0dXBfaHJ0aW1lcl9ocmVzKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkKKwkJaHJ0aW1lcl9ocmVzX2VuYWJsZWQgPSAwOworCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAib24iKSkKKwkJaHJ0aW1lcl9ocmVzX2VuYWJsZWQgPSAxOworCWVsc2UKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImhpZ2hyZXM9Iiwgc2V0dXBfaHJ0aW1lcl9ocmVzKTsKKworLyoKKyAqIGhydGltZXJfaGlnaF9yZXNfZW5hYmxlZCAtIHF1ZXJ5LCBpZiB0aGUgaGlnaHJlcyBtb2RlIGlzIGVuYWJsZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9pc19ocmVzX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gaHJ0aW1lcl9ocmVzX2VuYWJsZWQ7Cit9CisKKy8qCisgKiBJcyB0aGUgaGlnaCByZXNvbHV0aW9uIG1vZGUgYWN0aXZlID8KKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9ocmVzX2FjdGl2ZSh2b2lkKQoreworCXJldHVybiBfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpLmhyZXNfYWN0aXZlOworfQorCisvKgorICogUmVwcm9ncmFtIHRoZSBldmVudCBzb3VyY2Ugd2l0aCBjaGVja2luZyBib3RoIHF1ZXVlcyBmb3IgdGhlCisgKiBuZXh0IGV2ZW50CisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCBiYXNlLT5sb2NrIGhlbGQKKyAqLworc3RhdGljIHZvaWQgaHJ0aW1lcl9mb3JjZV9yZXByb2dyYW0oc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlKQoreworCWludCBpOworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UgPSBjcHVfYmFzZS0+Y2xvY2tfYmFzZTsKKwlrdGltZV90IGV4cGlyZXM7CisKKwljcHVfYmFzZS0+ZXhwaXJlc19uZXh0LnR2NjQgPSBLVElNRV9NQVg7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVM7IGkrKywgYmFzZSsrKSB7CisJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKKworCQlpZiAoIWJhc2UtPmZpcnN0KQorCQkJY29udGludWU7CisJCXRpbWVyID0gcmJfZW50cnkoYmFzZS0+Zmlyc3QsIHN0cnVjdCBocnRpbWVyLCBub2RlKTsKKwkJZXhwaXJlcyA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgYmFzZS0+b2Zmc2V0KTsKKwkJaWYgKGV4cGlyZXMudHY2NCA8IGNwdV9iYXNlLT5leHBpcmVzX25leHQudHY2NCkKKwkJCWNwdV9iYXNlLT5leHBpcmVzX25leHQgPSBleHBpcmVzOworCX0KKworCWlmIChjcHVfYmFzZS0+ZXhwaXJlc19uZXh0LnR2NjQgIT0gS1RJTUVfTUFYKQorCQl0aWNrX3Byb2dyYW1fZXZlbnQoY3B1X2Jhc2UtPmV4cGlyZXNfbmV4dCwgMSk7Cit9CisKKy8qCisgKiBTaGFyZWQgcmVwcm9ncmFtbWluZyBmb3IgY2xvY2tfcmVhbHRpbWUgYW5kIGNsb2NrX21vbm90b25pYworICoKKyAqIFdoZW4gYSB0aW1lciBpcyBlbnF1ZXVlZCBhbmQgZXhwaXJlcyBlYXJsaWVyIHRoYW4gdGhlIGFscmVhZHkgZW5xdWV1ZWQKKyAqIHRpbWVycywgd2UgaGF2ZSB0byBjaGVjaywgd2hldGhlciBpdCBleHBpcmVzIGVhcmxpZXIgdGhhbiB0aGUgdGltZXIgZm9yCisgKiB3aGljaCB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlIHdhcyBhcm1lZC4KKyAqCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCBiYXNlLT5jcHVfYmFzZS5sb2NrIGhlbGQKKyAqLworc3RhdGljIGludCBocnRpbWVyX3JlcHJvZ3JhbShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UpCit7CisJa3RpbWVfdCAqZXhwaXJlc19uZXh0ID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcykuZXhwaXJlc19uZXh0OworCWt0aW1lX3QgZXhwaXJlcyA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgYmFzZS0+b2Zmc2V0KTsKKwlpbnQgcmVzOworCisJLyoKKwkgKiBXaGVuIHRoZSBjYWxsYmFjayBpcyBydW5uaW5nLCB3ZSBkbyBub3QgcmVwcm9ncmFtIHRoZSBjbG9jayBldmVudAorCSAqIGRldmljZS4gVGhlIHRpbWVyIGNhbGxiYWNrIGlzIGVpdGhlciBydW5uaW5nIG9uIGEgZGlmZmVyZW50IENQVSBvcgorCSAqIHRoZSBjYWxsYmFjayBpcyBleGVjdXRlZCBpbiB0aGUgaHJ0aW1lcl9pbnRlcnVwdCBjb250ZXh0LiBUaGUKKwkgKiByZXByb2dyYW1taW5nIGlzIGhhbmRsZWQgZWl0aGVyIGJ5IHRoZSBzb2Z0aXJxLCB3aGljaCBjYWxsZWQgdGhlCisJICogY2FsbGJhY2sgb3IgYXQgdGhlIGVuZCBvZiB0aGUgaHJ0aW1lcl9pbnRlcnJ1cHQuCisJICovCisJaWYgKGhydGltZXJfY2FsbGJhY2tfcnVubmluZyh0aW1lcikpCisJCXJldHVybiAwOworCisJaWYgKGV4cGlyZXMudHY2NCA+PSBleHBpcmVzX25leHQtPnR2NjQpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDbG9ja2V2ZW50cyByZXR1cm5zIC1FVElNRSwgd2hlbiB0aGUgZXZlbnQgd2FzIGluIHRoZSBwYXN0LgorCSAqLworCXJlcyA9IHRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzLCAwKTsKKwlpZiAoIUlTX0VSUl9WQUxVRShyZXMpKQorCQkqZXhwaXJlc19uZXh0ID0gZXhwaXJlczsKKwlyZXR1cm4gcmVzOworfQorCisKKy8qCisgKiBSZXRyaWdnZXIgbmV4dCBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgY2xvY2sgd2FzIHNldAorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgdmlhIG9uX2VhY2hfY3B1KCkKKyAqLworc3RhdGljIHZvaWQgcmV0cmlnZ2VyX25leHRfZXZlbnQodm9pZCAqYXJnKQoreworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlOworCXN0cnVjdCB0aW1lc3BlYyByZWFsdGltZV9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBzZXE7CisKKwlpZiAoIWhydGltZXJfaHJlc19hY3RpdmUoKSkKKwkJcmV0dXJuOworCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnJlYWx0aW1lX29mZnNldCwKKwkJCQkJLXdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYywKKwkJCQkJLXdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMpOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCisJYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCisJLyogQWRqdXN0IENMT0NLX1JFQUxUSU1FIG9mZnNldCAqLworCXNwaW5fbG9jaygmYmFzZS0+bG9jayk7CisJYmFzZS0+Y2xvY2tfYmFzZVtDTE9DS19SRUFMVElNRV0ub2Zmc2V0ID0KKwkJdGltZXNwZWNfdG9fa3RpbWUocmVhbHRpbWVfb2Zmc2V0KTsKKworCWhydGltZXJfZm9yY2VfcmVwcm9ncmFtKGJhc2UpOworCXNwaW5fdW5sb2NrKCZiYXNlLT5sb2NrKTsKK30KKworLyoKKyAqIENsb2NrIHJlYWx0aW1lIHdhcyBzZXQKKyAqCisgKiBDaGFuZ2UgdGhlIG9mZnNldCBvZiB0aGUgcmVhbHRpbWUgY2xvY2sgdnMuIHRoZSBtb25vdG9uaWMKKyAqIGNsb2NrLgorICoKKyAqIFdlIG1pZ2h0IGhhdmUgdG8gcmVwcm9ncmFtIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgaW50ZXJydXB0LiBPbgorICogU01QIHdlIGNhbGwgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlIHRvIHJldHJpZ2dlciBfYWxsXyBoaWdoCisgKiByZXNvbHV0aW9uIHRpbWVyIGludGVycnVwdHMuIE9uIFVQIHdlIGp1c3QgZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZAorICogY2FsbCB0aGUgaGlnaCByZXNvbHV0aW9uIGludGVycnVwdCBjb2RlLgorICovCit2b2lkIGNsb2NrX3dhc19zZXQodm9pZCkKK3sKKwkvKiBSZXRyaWdnZXIgdGhlIENQVSBsb2NhbCBldmVudHMgZXZlcnl3aGVyZSAqLworCW9uX2VhY2hfY3B1KHJldHJpZ2dlcl9uZXh0X2V2ZW50LCBOVUxMLCAwLCAxKTsKK30KKworLyoKKyAqIENoZWNrLCB3aGV0aGVyIHRoZSB0aW1lciBpcyBvbiB0aGUgY2FsbGJhY2sgcGVuZGluZyBsaXN0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfY2JfcGVuZGluZyhjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJcmV0dXJuIHRpbWVyLT5zdGF0ZSAmIEhSVElNRVJfU1RBVEVfUEVORElORzsKK30KKworLyoKKyAqIFJlbW92ZSBhIHRpbWVyIGZyb20gdGhlIGNhbGxiYWNrIHBlbmRpbmcgbGlzdAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9yZW1vdmVfY2JfcGVuZGluZyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJbGlzdF9kZWxfaW5pdCgmdGltZXItPmNiX2VudHJ5KTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGhpZ2ggcmVzb2x1dGlvbiByZWxhdGVkIHBhcnRzIG9mIGNwdV9iYXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfaHJlcyhzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSkKK3sKKwliYXNlLT5leHBpcmVzX25leHQudHY2NCA9IEtUSU1FX01BWDsKKwliYXNlLT5ocmVzX2FjdGl2ZSA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJmJhc2UtPmNiX3BlbmRpbmcpOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgaGlnaCByZXNvbHV0aW9uIHJlbGF0ZWQgcGFydHMgb2YgYSBocnRpbWVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfdGltZXJfaHJlcyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJSU5JVF9MSVNUX0hFQUQoJnRpbWVyLT5jYl9lbnRyeSk7Cit9CisKKy8qCisgKiBXaGVuIEhpZ2ggcmVzb2x1dGlvbiB0aW1lcnMgYXJlIGFjdGl2ZSwgdHJ5IHRvIHJlcHJvZ3JhbS4gTm90ZSwgdGhhdCBpbiBjYXNlCisgKiB0aGUgc3RhdGUgaGFzIEhSVElNRVJfU1RBVEVfQ0FMTEJBQ0sgc2V0LCBubyByZXByb2dyYW1taW5nIGFuZCBubyBleHBpcnkKKyAqIGNoZWNrIGhhcHBlbnMuIFRoZSB0aW1lciBnZXRzIGVucXVldWVkIGludG8gdGhlIHJidHJlZS4gVGhlIHJlcHJvZ3JhbW1pbmcKKyAqIGFuZCBleHBpcnkgY2hlY2sgaXMgZG9uZSBpbiB0aGUgaHJ0aW1lcl9pbnRlcnJ1cHQgb3IgaW4gdGhlIHNvZnRpcnEuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfZW5xdWV1ZV9yZXByb2dyYW0oc3RydWN0IGhydGltZXIgKnRpbWVyLAorCQkJCQkgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKK3sKKwlpZiAoYmFzZS0+Y3B1X2Jhc2UtPmhyZXNfYWN0aXZlICYmIGhydGltZXJfcmVwcm9ncmFtKHRpbWVyLCBiYXNlKSkgeworCisJCS8qIFRpbWVyIGlzIGV4cGlyZWQsIGFjdCB1cG9uIHRoZSBjYWxsYmFjayBtb2RlICovCisJCXN3aXRjaCh0aW1lci0+Y2JfbW9kZSkgeworCQljYXNlIEhSVElNRVJfQ0JfSVJRU0FGRV9OT19SRVNUQVJUOgorCQkJLyoKKwkJCSAqIFdlIGNhbiBjYWxsIHRoZSBjYWxsYmFjayBmcm9tIGhlcmUuIE5vIHJlc3RhcnQKKwkJCSAqIGhhcHBlbnMsIHNvIG5vIGRhbmdlciBvZiByZWN1cnNpb24KKwkJCSAqLworCQkJQlVHX09OKHRpbWVyLT5mdW5jdGlvbih0aW1lcikgIT0gSFJUSU1FUl9OT1JFU1RBUlQpOworCQkJcmV0dXJuIDE7CisJCWNhc2UgSFJUSU1FUl9DQl9JUlFTQUZFX05PX1NPRlRJUlE6CisJCQkvKgorCQkJICogVGhpcyBpcyBzb2xlbHkgZm9yIHRoZSBzY2hlZCB0aWNrIGVtdWxhdGlvbiB3aXRoCisJCQkgKiBkeW5hbWljIHRpY2sgc3VwcG9ydCB0byBlbnN1cmUgdGhhdCB3ZSBkbyBub3QKKwkJCSAqIHJlc3RhcnQgdGhlIHRpY2sgcmlnaHQgb24gdGhlIGVkZ2UgYW5kIGVuZCB1cCB3aXRoCisJCQkgKiB0aGUgdGljayB0aW1lciBpbiB0aGUgc29mdGlycSAhIFRoZSBjYWxsaW5nIHNpdGUKKwkJCSAqIHRha2VzIGNhcmUgb2YgdGhpcy4KKwkJCSAqLworCQkJcmV0dXJuIDE7CisJCWNhc2UgSFJUSU1FUl9DQl9JUlFTQUZFOgorCQljYXNlIEhSVElNRVJfQ0JfU09GVElSUToKKwkJCS8qCisJCQkgKiBNb3ZlIGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIHRoZSBzb2Z0aXJxIHBlbmRpbmcgbGlzdCAhCisJCQkgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5jYl9lbnRyeSwKKwkJCQkgICAgICAmYmFzZS0+Y3B1X2Jhc2UtPmNiX3BlbmRpbmcpOworCQkJdGltZXItPnN0YXRlID0gSFJUSU1FUl9TVEFURV9QRU5ESU5HOworCQkJcmFpc2Vfc29mdGlycShIUlRJTUVSX1NPRlRJUlEpOworCQkJcmV0dXJuIDE7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN3aXRjaCB0byBoaWdoIHJlc29sdXRpb24gbW9kZQorICovCitzdGF0aWMgdm9pZCBocnRpbWVyX3N3aXRjaF90b19ocmVzKHZvaWQpCit7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmJhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGJhc2UtPmhyZXNfYWN0aXZlKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAodGlja19pbml0X2hpZ2hyZXMoKSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKwl9CisJYmFzZS0+aHJlc19hY3RpdmUgPSAxOworCWJhc2UtPmNsb2NrX2Jhc2VbQ0xPQ0tfUkVBTFRJTUVdLnJlc29sdXRpb24gPSBLVElNRV9ISUdIX1JFUzsKKwliYXNlLT5jbG9ja19iYXNlW0NMT0NLX01PTk9UT05JQ10ucmVzb2x1dGlvbiA9IEtUSU1FX0hJR0hfUkVTOworCisJdGlja19zZXR1cF9zY2hlZF90aW1lcigpOworCisJLyogIlJldHJpZ2dlciIgdGhlIGludGVycnVwdCB0byBnZXQgdGhpbmdzIGdvaW5nICovCisJcmV0cmlnZ2VyX25leHRfZXZlbnQoTlVMTCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXByaW50ayhLRVJOX0lORk8gIlN3aXRjaGVkIHRvIGhpZ2ggcmVzb2x1dGlvbiBtb2RlIG9uIENQVSAlZFxuIiwKKwkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9ocmVzX2FjdGl2ZSh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2lzX2hyZXNfZW5hYmxlZCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9zd2l0Y2hfdG9faHJlcyh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2ZvcmNlX3JlcHJvZ3JhbShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSkgeyB9CitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2VucXVldWVfcmVwcm9ncmFtKHN0cnVjdCBocnRpbWVyICp0aW1lciwKKwkJCQkJICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2NiX3BlbmRpbmcoc3RydWN0IGhydGltZXIgKnRpbWVyKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9yZW1vdmVfY2JfcGVuZGluZyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGhydGltZXJfaW5pdF9ocmVzKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfdGltZXJfaHJlcyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpIHsgfQorCisjZW5kaWYgLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLworCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCit2b2lkIF9fdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHZvaWQgKmFkZHIpCit7CisJaWYgKHRpbWVyLT5zdGFydF9zaXRlKQorCQlyZXR1cm47CisKKwl0aW1lci0+c3RhcnRfc2l0ZSA9IGFkZHI7CisJbWVtY3B5KHRpbWVyLT5zdGFydF9jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwl0aW1lci0+c3RhcnRfcGlkID0gY3VycmVudC0+cGlkOworfQorI2VuZGlmCisKIC8qCiAgKiBDb3VudGVycGFydCB0byBsb2NrX3RpbWVyX2Jhc2UgYWJvdmU6CiAgKi8KIHN0YXRpYyBpbmxpbmUKIHZvaWQgdW5sb2NrX2hydGltZXJfYmFzZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5iYXNlLT5sb2NrLCAqZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5iYXNlLT5jcHVfYmFzZS0+bG9jaywgKmZsYWdzKTsKIH0KIAogLyoqCkBAIC0zNDIsNyArNjUzLDggQEAKICAqIFRoZSB0aW1lciBpcyBpbnNlcnRlZCBpbiBleHBpcnkgb3JkZXIuIEluc2VydGlvbiBpbnRvIHRoZQogICogcmVkIGJsYWNrIHRyZWUgaXMgTyhsb2cobikpLiBNdXN0IGhvbGQgdGhlIGJhc2UgbG9jay4KICAqLwotc3RhdGljIHZvaWQgZW5xdWV1ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwgc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKK3N0YXRpYyB2b2lkIGVucXVldWVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwgaW50IHJlcHJvZ3JhbSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqKmxpbmsgPSAmYmFzZS0+YWN0aXZlLnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CkBAIC0zNjgsMzkgKzY4MCw4NSBAQAogCSAqIEluc2VydCB0aGUgdGltZXIgdG8gdGhlIHJidHJlZSBhbmQgY2hlY2sgd2hldGhlciBpdAogCSAqIHJlcGxhY2VzIHRoZSBmaXJzdCBwZW5kaW5nIHRpbWVyCiAJICovCisJaWYgKCFiYXNlLT5maXJzdCB8fCB0aW1lci0+ZXhwaXJlcy50djY0IDwKKwkgICAgcmJfZW50cnkoYmFzZS0+Zmlyc3QsIHN0cnVjdCBocnRpbWVyLCBub2RlKS0+ZXhwaXJlcy50djY0KSB7CisJCS8qCisJCSAqIFJlcHJvZ3JhbSB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlLiBXaGVuIHRoZSB0aW1lciBpcyBhbHJlYWR5CisJCSAqIGV4cGlyZWQgaHJ0aW1lcl9lbnF1ZXVlX3JlcHJvZ3JhbSBoYXMgZWl0aGVyIGNhbGxlZCB0aGUKKwkJICogY2FsbGJhY2sgb3IgYWRkZWQgaXQgdG8gdGhlIHBlbmRpbmcgbGlzdCBhbmQgcmFpc2VkIHRoZQorCQkgKiBzb2Z0aXJxLgorCQkgKgorCQkgKiBUaGlzIGlzIGEgTk9QIGZvciAhSElHSFJFUworCQkgKi8KKwkJaWYgKHJlcHJvZ3JhbSAmJiBocnRpbWVyX2VucXVldWVfcmVwcm9ncmFtKHRpbWVyLCBiYXNlKSkKKwkJCXJldHVybjsKKworCQliYXNlLT5maXJzdCA9ICZ0aW1lci0+bm9kZTsKKwl9CisKIAlyYl9saW5rX25vZGUoJnRpbWVyLT5ub2RlLCBwYXJlbnQsIGxpbmspOwogCXJiX2luc2VydF9jb2xvcigmdGltZXItPm5vZGUsICZiYXNlLT5hY3RpdmUpOwotCi0JaWYgKCFiYXNlLT5maXJzdCB8fCB0aW1lci0+ZXhwaXJlcy50djY0IDwKLQkgICAgcmJfZW50cnkoYmFzZS0+Zmlyc3QsIHN0cnVjdCBocnRpbWVyLCBub2RlKS0+ZXhwaXJlcy50djY0KQotCQliYXNlLT5maXJzdCA9ICZ0aW1lci0+bm9kZTsKKwkvKgorCSAqIEhSVElNRVJfU1RBVEVfRU5RVUVVRUQgaXMgb3InZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgdG8gcHJlc2VydmUgdGhlCisJICogc3RhdGUgb2YgYSBwb3NzaWJseSBydW5uaW5nIGNhbGxiYWNrLgorCSAqLworCXRpbWVyLT5zdGF0ZSB8PSBIUlRJTUVSX1NUQVRFX0VOUVVFVUVEOwogfQogCiAvKgogICogX19yZW1vdmVfaHJ0aW1lciAtIGludGVybmFsIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVyCiAgKgogICogQ2FsbGVyIG11c3QgaG9sZCB0aGUgYmFzZSBsb2NrLgorICoKKyAqIEhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2RlIHJlcHJvZ3JhbXMgdGhlIGNsb2NrIGV2ZW50IGRldmljZSB3aGVuIHRoZQorICogdGltZXIgaXMgdGhlIG9uZSB3aGljaCBleHBpcmVzIG5leHQuIFRoZSBjYWxsZXIgY2FuIGRpc2FibGUgdGhpcyBieSBzZXR0aW5nCisgKiByZXByb2dyYW0gdG8gemVyby4gVGhpcyBpcyB1c2VmdWwsIHdoZW4gdGhlIGNvbnRleHQgZG9lcyBhIHJlcHJvZ3JhbW1pbmcKKyAqIGFueXdheSAoZS5nLiB0aW1lciBpbnRlcnJ1cHQpCiAgKi8KLXN0YXRpYyB2b2lkIF9fcmVtb3ZlX2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyLCBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlKQorc3RhdGljIHZvaWQgX19yZW1vdmVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbmV3c3RhdGUsIGludCByZXByb2dyYW0pCiB7Ci0JLyoKLQkgKiBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHJidHJlZSBhbmQgcmVwbGFjZSB0aGUKLQkgKiBmaXJzdCBlbnRyeSBwb2ludGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlpZiAoYmFzZS0+Zmlyc3QgPT0gJnRpbWVyLT5ub2RlKQotCQliYXNlLT5maXJzdCA9IHJiX25leHQoJnRpbWVyLT5ub2RlKTsKLQlyYl9lcmFzZSgmdGltZXItPm5vZGUsICZiYXNlLT5hY3RpdmUpOwotCXJiX3NldF9wYXJlbnQoJnRpbWVyLT5ub2RlLCAmdGltZXItPm5vZGUpOworCS8qIEhpZ2ggcmVzLiBjYWxsYmFjayBsaXN0LiBOT1AgZm9yICFISUdIUkVTICovCisJaWYgKGhydGltZXJfY2JfcGVuZGluZyh0aW1lcikpCisJCWhydGltZXJfcmVtb3ZlX2NiX3BlbmRpbmcodGltZXIpOworCWVsc2UgeworCQkvKgorCQkgKiBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHJidHJlZSBhbmQgcmVwbGFjZSB0aGUKKwkJICogZmlyc3QgZW50cnkgcG9pbnRlciBpZiBuZWNlc3NhcnkuCisJCSAqLworCQlpZiAoYmFzZS0+Zmlyc3QgPT0gJnRpbWVyLT5ub2RlKSB7CisJCQliYXNlLT5maXJzdCA9IHJiX25leHQoJnRpbWVyLT5ub2RlKTsKKwkJCS8qIFJlcHJvZ3JhbSB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlLiBpZiBlbmFibGVkICovCisJCQlpZiAocmVwcm9ncmFtICYmIGhydGltZXJfaHJlc19hY3RpdmUoKSkKKwkJCQlocnRpbWVyX2ZvcmNlX3JlcHJvZ3JhbShiYXNlLT5jcHVfYmFzZSk7CisJCX0KKwkJcmJfZXJhc2UoJnRpbWVyLT5ub2RlLCAmYmFzZS0+YWN0aXZlKTsKKwl9CisJdGltZXItPnN0YXRlID0gbmV3c3RhdGU7CiB9CiAKIC8qCiAgKiByZW1vdmUgaHJ0aW1lciwgY2FsbGVkIHdpdGggYmFzZSBsb2NrIGhlbGQKICAqLwogc3RhdGljIGlubGluZSBpbnQKLXJlbW92ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwgc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKK3JlbW92ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKIHsKLQlpZiAoaHJ0aW1lcl9hY3RpdmUodGltZXIpKSB7Ci0JCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIGJhc2UpOworCWlmIChocnRpbWVyX2lzX3F1ZXVlZCh0aW1lcikpIHsKKwkJaW50IHJlcHJvZ3JhbTsKKworCQkvKgorCQkgKiBSZW1vdmUgdGhlIHRpbWVyIGFuZCBmb3JjZSByZXByb2dyYW1taW5nIHdoZW4gaGlnaAorCQkgKiByZXNvbHV0aW9uIG1vZGUgaXMgYWN0aXZlIGFuZCB0aGUgdGltZXIgaXMgb24gdGhlIGN1cnJlbnQKKwkJICogQ1BVLiBJZiB3ZSByZW1vdmUgYSB0aW1lciBvbiBhbm90aGVyIENQVSwgcmVwcm9ncmFtbWluZyBpcworCQkgKiBza2lwcGVkLiBUaGUgaW50ZXJydXB0IGV2ZW50IG9uIHRoaXMgQ1BVIGlzIGZpcmVkIGFuZAorCQkgKiByZXByb2dyYW1taW5nIGhhcHBlbnMgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLiBUaGlzIGlzIGEKKwkJICogcmFyZSBjYXNlIGFuZCBsZXNzIGV4cGVuc2l2ZSB0aGFuIGEgc21wIGNhbGwuCisJCSAqLworCQl0aW1lcl9zdGF0c19ocnRpbWVyX2NsZWFyX3N0YXJ0X2luZm8odGltZXIpOworCQlyZXByb2dyYW0gPSBiYXNlLT5jcHVfYmFzZSA9PSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwgSFJUSU1FUl9TVEFURV9JTkFDVElWRSwKKwkJCQkgcmVwcm9ncmFtKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtNDE5LDcgKzc3Nyw3IEBACiBpbnQKIGhydGltZXJfc3RhcnQoc3RydWN0IGhydGltZXIgKnRpbWVyLCBrdGltZV90IHRpbSwgY29uc3QgZW51bSBocnRpbWVyX21vZGUgbW9kZSkKIHsKLQlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlLCAqbmV3X2Jhc2U7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwgKm5ld19iYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIApAQCAtNDMxLDcgKzc4OSw3IEBACiAJLyogU3dpdGNoIHRoZSB0aW1lciBiYXNlLCBpZiBuZWNlc3Nhcnk6ICovCiAJbmV3X2Jhc2UgPSBzd2l0Y2hfaHJ0aW1lcl9iYXNlKHRpbWVyLCBiYXNlKTsKIAotCWlmIChtb2RlID09IEhSVElNRVJfUkVMKSB7CisJaWYgKG1vZGUgPT0gSFJUSU1FUl9NT0RFX1JFTCkgewogCQl0aW0gPSBrdGltZV9hZGQodGltLCBuZXdfYmFzZS0+Z2V0X3RpbWUoKSk7CiAJCS8qCiAJCSAqIENPTkZJR19USU1FX0xPV19SRVMgaXMgYSB0ZW1wb3Jhcnkgd2F5IGZvciBhcmNoaXRlY3R1cmVzCkBAIC00NDYsNyArODA0LDkgQEAKIAl9CiAJdGltZXItPmV4cGlyZXMgPSB0aW07CiAKLQllbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlKTsKKwl0aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKKworCWVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UsIGJhc2UgPT0gbmV3X2Jhc2UpOwogCiAJdW5sb2NrX2hydGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIApAQCAtNDY2LDEzICs4MjYsMTMgQEAKICAqLwogaW50IGhydGltZXJfdHJ5X3RvX2NhbmNlbChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IC0xOwogCiAJYmFzZSA9IGxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwogCi0JaWYgKGJhc2UtPmN1cnJfdGltZXIgIT0gdGltZXIpCisJaWYgKCFocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcodGltZXIpKQogCQlyZXQgPSByZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSk7CiAKIAl1bmxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwpAQCAtNTA4LDE5ICs4NjgsMTkgQEAKICAqLwoga3RpbWVfdCBocnRpbWVyX2dldF9yZW1haW5pbmcoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2U7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWt0aW1lX3QgcmVtOwogCiAJYmFzZSA9IGxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwotCXJlbSA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgdGltZXItPmJhc2UtPmdldF90aW1lKCkpOworCXJlbSA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgYmFzZS0+Z2V0X3RpbWUoKSk7CiAJdW5sb2NrX2hydGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIAogCXJldHVybiByZW07CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocnRpbWVyX2dldF9yZW1haW5pbmcpOwogCi0jaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKyNpZiBkZWZpbmVkKENPTkZJR19OT19JRExFX0haKSB8fCBkZWZpbmVkKENPTkZJR19OT19IWikKIC8qKgogICogaHJ0aW1lcl9nZXRfbmV4dF9ldmVudCAtIGdldCB0aGUgdGltZSB1bnRpbCBuZXh0IGV4cGlyeSBldmVudAogICoKQEAgLTUyOSwyNiArODg5LDMxIEBACiAgKi8KIGt0aW1lX3QgaHJ0aW1lcl9nZXRfbmV4dF9ldmVudCh2b2lkKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UgPSBfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UgPSBjcHVfYmFzZS0+Y2xvY2tfYmFzZTsKIAlrdGltZV90IGRlbHRhLCBtaW5kZWx0YSA9IHsgLnR2NjQgPSBLVElNRV9NQVggfTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IUlRJTUVSX0JBU0VTOyBpKyssIGJhc2UrKykgewotCQlzdHJ1Y3QgaHJ0aW1lciAqdGltZXI7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwdV9iYXNlLT5sb2NrLCBmbGFncyk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKCFiYXNlLT5maXJzdCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZS0+bG9jaywgZmxhZ3MpOwotCQkJY29udGludWU7CisJaWYgKCFocnRpbWVyX2hyZXNfYWN0aXZlKCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyssIGJhc2UrKykgeworCQkJc3RydWN0IGhydGltZXIgKnRpbWVyOworCisJCQlpZiAoIWJhc2UtPmZpcnN0KQorCQkJCWNvbnRpbnVlOworCisJCQl0aW1lciA9IHJiX2VudHJ5KGJhc2UtPmZpcnN0LCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CisJCQlkZWx0YS50djY0ID0gdGltZXItPmV4cGlyZXMudHY2NDsKKwkJCWRlbHRhID0ga3RpbWVfc3ViKGRlbHRhLCBiYXNlLT5nZXRfdGltZSgpKTsKKwkJCWlmIChkZWx0YS50djY0IDwgbWluZGVsdGEudHY2NCkKKwkJCQltaW5kZWx0YS50djY0ID0gZGVsdGEudHY2NDsKIAkJfQotCQl0aW1lciA9IHJiX2VudHJ5KGJhc2UtPmZpcnN0LCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7Ci0JCWRlbHRhLnR2NjQgPSB0aW1lci0+ZXhwaXJlcy50djY0OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXNlLT5sb2NrLCBmbGFncyk7Ci0JCWRlbHRhID0ga3RpbWVfc3ViKGRlbHRhLCBiYXNlLT5nZXRfdGltZSgpKTsKLQkJaWYgKGRlbHRhLnR2NjQgPCBtaW5kZWx0YS50djY0KQotCQkJbWluZGVsdGEudHY2NCA9IGRlbHRhLnR2NjQ7CiAJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1X2Jhc2UtPmxvY2ssIGZsYWdzKTsKKwogCWlmIChtaW5kZWx0YS50djY0IDwgMCkKIAkJbWluZGVsdGEudHY2NCA9IDA7CiAJcmV0dXJuIG1pbmRlbHRhOwpAQCAtNTY0LDE3ICs5MjksMjMgQEAKIHZvaWQgaHJ0aW1lcl9pbml0KHN0cnVjdCBocnRpbWVyICp0aW1lciwgY2xvY2tpZF90IGNsb2NrX2lkLAogCQkgIGVudW0gaHJ0aW1lcl9tb2RlIG1vZGUpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZXM7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlOwogCiAJbWVtc2V0KHRpbWVyLCAwLCBzaXplb2Yoc3RydWN0IGhydGltZXIpKTsKIAotCWJhc2VzID0gX19yYXdfZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisJY3B1X2Jhc2UgPSAmX19yYXdfZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CiAKLQlpZiAoY2xvY2tfaWQgPT0gQ0xPQ0tfUkVBTFRJTUUgJiYgbW9kZSAhPSBIUlRJTUVSX0FCUykKKwlpZiAoY2xvY2tfaWQgPT0gQ0xPQ0tfUkVBTFRJTUUgJiYgbW9kZSAhPSBIUlRJTUVSX01PREVfQUJTKQogCQljbG9ja19pZCA9IENMT0NLX01PTk9UT05JQzsKIAotCXRpbWVyLT5iYXNlID0gJmJhc2VzW2Nsb2NrX2lkXTsKLQlyYl9zZXRfcGFyZW50KCZ0aW1lci0+bm9kZSwgJnRpbWVyLT5ub2RlKTsKKwl0aW1lci0+YmFzZSA9ICZjcHVfYmFzZS0+Y2xvY2tfYmFzZVtjbG9ja19pZF07CisJaHJ0aW1lcl9pbml0X3RpbWVyX2hyZXModGltZXIpOworCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJdGltZXItPnN0YXJ0X3NpdGUgPSBOVUxMOworCXRpbWVyLT5zdGFydF9waWQgPSAtMTsKKwltZW1zZXQodGltZXItPnN0YXJ0X2NvbW0sIDAsIFRBU0tfQ09NTV9MRU4pOworI2VuZGlmCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocnRpbWVyX2luaXQpOwogCkBAIC01ODgsMjEgKzk1OSwxNTkgQEAKICAqLwogaW50IGhydGltZXJfZ2V0X3Jlcyhjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHApCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZXM7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlOwogCi0JYmFzZXMgPSBfX3Jhd19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKLQkqdHAgPSBrdGltZV90b190aW1lc3BlYyhiYXNlc1t3aGljaF9jbG9ja10ucmVzb2x1dGlvbik7CisJY3B1X2Jhc2UgPSAmX19yYXdfZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisJKnRwID0ga3RpbWVfdG9fdGltZXNwZWMoY3B1X2Jhc2UtPmNsb2NrX2Jhc2Vbd2hpY2hfY2xvY2tdLnJlc29sdXRpb24pOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocnRpbWVyX2dldF9yZXMpOwogCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCisvKgorICogSGlnaCByZXNvbHV0aW9uIHRpbWVyIGludGVycnVwdAorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorICovCit2b2lkIGhydGltZXJfaW50ZXJydXB0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqY3B1X2Jhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOworCWt0aW1lX3QgZXhwaXJlc19uZXh0LCBub3c7CisJaW50IGksIHJhaXNlID0gMDsKKworCUJVR19PTighY3B1X2Jhc2UtPmhyZXNfYWN0aXZlKTsKKwljcHVfYmFzZS0+bnJfZXZlbnRzKys7CisJZGV2LT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CisKKyByZXRyeToKKwlub3cgPSBrdGltZV9nZXQoKTsKKworCWV4cGlyZXNfbmV4dC50djY0ID0gS1RJTUVfTUFYOworCisJYmFzZSA9IGNwdV9iYXNlLT5jbG9ja19iYXNlOworCisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspIHsKKwkJa3RpbWVfdCBiYXNlbm93OworCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKworCQlzcGluX2xvY2soJmNwdV9iYXNlLT5sb2NrKTsKKworCQliYXNlbm93ID0ga3RpbWVfYWRkKG5vdywgYmFzZS0+b2Zmc2V0KTsKKworCQl3aGlsZSAoKG5vZGUgPSBiYXNlLT5maXJzdCkpIHsKKwkJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKKworCQkJdGltZXIgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CisKKwkJCWlmIChiYXNlbm93LnR2NjQgPCB0aW1lci0+ZXhwaXJlcy50djY0KSB7CisJCQkJa3RpbWVfdCBleHBpcmVzOworCisJCQkJZXhwaXJlcyA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywKKwkJCQkJCSAgICBiYXNlLT5vZmZzZXQpOworCQkJCWlmIChleHBpcmVzLnR2NjQgPCBleHBpcmVzX25leHQudHY2NCkKKwkJCQkJZXhwaXJlc19uZXh0ID0gZXhwaXJlczsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogTW92ZSBzb2Z0aXJxIGNhbGxiYWNrcyB0byB0aGUgcGVuZGluZyBsaXN0ICovCisJCQlpZiAodGltZXItPmNiX21vZGUgPT0gSFJUSU1FUl9DQl9TT0ZUSVJRKSB7CisJCQkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwKKwkJCQkJCSBIUlRJTUVSX1NUQVRFX1BFTkRJTkcsIDApOworCQkJCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5jYl9lbnRyeSwKKwkJCQkJICAgICAgJmJhc2UtPmNwdV9iYXNlLT5jYl9wZW5kaW5nKTsKKwkJCQlyYWlzZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIGJhc2UsCisJCQkJCSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLLCAwKTsKKwkJCXRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcih0aW1lcik7CisKKwkJCS8qCisJCQkgKiBOb3RlOiBXZSBjbGVhciB0aGUgQ0FMTEJBQ0sgYml0IGFmdGVyCisJCQkgKiBlbnF1ZXVlX2hydGltZXIgdG8gYXZvaWQgcmVwcm9ncmFtbWluZyBvZgorCQkJICogdGhlIGV2ZW50IGhhcmR3YXJlLiBUaGlzIGhhcHBlbnMgYXQgdGhlIGVuZAorCQkJICogb2YgdGhpcyBmdW5jdGlvbiBhbnl3YXkuCisJCQkgKi8KKwkJCWlmICh0aW1lci0+ZnVuY3Rpb24odGltZXIpICE9IEhSVElNRVJfTk9SRVNUQVJUKSB7CisJCQkJQlVHX09OKHRpbWVyLT5zdGF0ZSAhPSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLKTsKKwkJCQllbnF1ZXVlX2hydGltZXIodGltZXIsIGJhc2UsIDApOworCQkJfQorCQkJdGltZXItPnN0YXRlICY9IH5IUlRJTUVSX1NUQVRFX0NBTExCQUNLOworCQl9CisJCXNwaW5fdW5sb2NrKCZjcHVfYmFzZS0+bG9jayk7CisJCWJhc2UrKzsKKwl9CisKKwljcHVfYmFzZS0+ZXhwaXJlc19uZXh0ID0gZXhwaXJlc19uZXh0OworCisJLyogUmVwcm9ncmFtbWluZyBuZWNlc3NhcnkgPyAqLworCWlmIChleHBpcmVzX25leHQudHY2NCAhPSBLVElNRV9NQVgpIHsKKwkJaWYgKHRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzX25leHQsIDApKQorCQkJZ290byByZXRyeTsKKwl9CisKKwkvKiBSYWlzZSBzb2Z0aXJxID8gKi8KKwlpZiAocmFpc2UpCisJCXJhaXNlX3NvZnRpcnEoSFJUSU1FUl9TT0ZUSVJRKTsKK30KKworc3RhdGljIHZvaWQgcnVuX2hydGltZXJfc29mdGlycShzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKmgpCit7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisKKwlzcGluX2xvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNwdV9iYXNlLT5jYl9wZW5kaW5nKSkgeworCQllbnVtIGhydGltZXJfcmVzdGFydCAoKmZuKShzdHJ1Y3QgaHJ0aW1lciAqKTsKKwkJc3RydWN0IGhydGltZXIgKnRpbWVyOworCQlpbnQgcmVzdGFydDsKKworCQl0aW1lciA9IGxpc3RfZW50cnkoY3B1X2Jhc2UtPmNiX3BlbmRpbmcubmV4dCwKKwkJCQkgICBzdHJ1Y3QgaHJ0aW1lciwgY2JfZW50cnkpOworCisJCXRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcih0aW1lcik7CisKKwkJZm4gPSB0aW1lci0+ZnVuY3Rpb247CisJCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIHRpbWVyLT5iYXNlLCBIUlRJTUVSX1NUQVRFX0NBTExCQUNLLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CisKKwkJcmVzdGFydCA9IGZuKHRpbWVyKTsKKworCQlzcGluX2xvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CisKKwkJdGltZXItPnN0YXRlICY9IH5IUlRJTUVSX1NUQVRFX0NBTExCQUNLOworCQlpZiAocmVzdGFydCA9PSBIUlRJTUVSX1JFU1RBUlQpIHsKKwkJCUJVR19PTihocnRpbWVyX2FjdGl2ZSh0aW1lcikpOworCQkJLyoKKwkJCSAqIEVucXVldWUgdGhlIHRpbWVyLCBhbGxvdyByZXByb2dyYW1taW5nIG9mIHRoZSBldmVudAorCQkJICogZGV2aWNlCisJCQkgKi8KKwkJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgdGltZXItPmJhc2UsIDEpOworCQl9IGVsc2UgaWYgKGhydGltZXJfYWN0aXZlKHRpbWVyKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZSB0aW1lciB3YXMgcmVhcm1lZCBvbiBhbm90aGVyIENQVSwgcmVwcm9ncmFtCisJCQkgKiB0aGUgZXZlbnQgZGV2aWNlLgorCQkJICovCisJCQlpZiAodGltZXItPmJhc2UtPmZpcnN0ID09ICZ0aW1lci0+bm9kZSkKKwkJCQlocnRpbWVyX3JlcHJvZ3JhbSh0aW1lciwgdGltZXItPmJhc2UpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY3B1X2Jhc2UtPmxvY2spOworfQorCisjZW5kaWYJLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLworCiAvKgogICogRXhwaXJlIHRoZSBwZXIgYmFzZSBocnRpbWVyLXF1ZXVlOgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcnVuX2hydGltZXJfcXVldWUoc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBydW5faHJ0aW1lcl9xdWV1ZShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqY3B1X2Jhc2UsCisJCQkJICAgICBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSA9ICZjcHVfYmFzZS0+Y2xvY2tfYmFzZVtpbmRleF07CiAKIAlpZiAoIWJhc2UtPmZpcnN0KQogCQlyZXR1cm47CkBAIC02MTAsNTMgKzExMTksNzIgQEAKIAlpZiAoYmFzZS0+Z2V0X3NvZnRpcnFfdGltZSkKIAkJYmFzZS0+c29mdGlycV90aW1lID0gYmFzZS0+Z2V0X3NvZnRpcnFfdGltZSgpOwogCi0Jc3Bpbl9sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmY3B1X2Jhc2UtPmxvY2spOwogCiAJd2hpbGUgKChub2RlID0gYmFzZS0+Zmlyc3QpKSB7CiAJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKLQkJaW50ICgqZm4pKHN0cnVjdCBocnRpbWVyICopOworCQllbnVtIGhydGltZXJfcmVzdGFydCAoKmZuKShzdHJ1Y3QgaHJ0aW1lciAqKTsKIAkJaW50IHJlc3RhcnQ7CiAKIAkJdGltZXIgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CiAJCWlmIChiYXNlLT5zb2Z0aXJxX3RpbWUudHY2NCA8PSB0aW1lci0+ZXhwaXJlcy50djY0KQogCQkJYnJlYWs7CiAKKwkJdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHRpbWVyKTsKKwogCQlmbiA9IHRpbWVyLT5mdW5jdGlvbjsKLQkJc2V0X2N1cnJfdGltZXIoYmFzZSwgdGltZXIpOwotCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCBiYXNlKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZiYXNlLT5sb2NrKTsKKwkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwgSFJUSU1FUl9TVEFURV9DQUxMQkFDSywgMCk7CisJCXNwaW5fdW5sb2NrX2lycSgmY3B1X2Jhc2UtPmxvY2spOwogCiAJCXJlc3RhcnQgPSBmbih0aW1lcik7CiAKLQkJc3Bpbl9sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmNwdV9iYXNlLT5sb2NrKTsKIAorCQl0aW1lci0+c3RhdGUgJj0gfkhSVElNRVJfU1RBVEVfQ0FMTEJBQ0s7CiAJCWlmIChyZXN0YXJ0ICE9IEhSVElNRVJfTk9SRVNUQVJUKSB7CiAJCQlCVUdfT04oaHJ0aW1lcl9hY3RpdmUodGltZXIpKTsKLQkJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgYmFzZSk7CisJCQllbnF1ZXVlX2hydGltZXIodGltZXIsIGJhc2UsIDApOwogCQl9CiAJfQotCXNldF9jdXJyX3RpbWVyKGJhc2UsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CiB9CiAKIC8qCiAgKiBDYWxsZWQgZnJvbSB0aW1lciBzb2Z0aXJxIGV2ZXJ5IGppZmZ5LCBleHBpcmUgaHJ0aW1lcnM6CisgKgorICogRm9yIEhSVCBpdHMgdGhlIGZhbGwgYmFjayBjb2RlIHRvIHJ1biB0aGUgc29mdGlycSBpbiB0aGUgdGltZXIKKyAqIHNvZnRpcnEgY29udGV4dCBpbiBjYXNlIHRoZSBocnRpbWVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCBvciBoYXMKKyAqIG5vdCBiZWVuIGRvbmUgeWV0LgogICovCiB2b2lkIGhydGltZXJfcnVuX3F1ZXVlcyh2b2lkKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UgPSBfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwogCWludCBpOwogCi0JaHJ0aW1lcl9nZXRfc29mdGlycV90aW1lKGJhc2UpOworCWlmIChocnRpbWVyX2hyZXNfYWN0aXZlKCkpCisJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFJUSU1FUl9CQVNFUzsgaSsrKQotCQlydW5faHJ0aW1lcl9xdWV1ZSgmYmFzZVtpXSk7CisJLyoKKwkgKiBUaGlzIF9pc18gdWdseTogV2UgaGF2ZSB0byBjaGVjayBpbiB0aGUgc29mdGlycSBjb250ZXh0LAorCSAqIHdoZXRoZXIgd2UgY2FuIHN3aXRjaCB0byBoaWdocmVzIGFuZCAvIG9yIG5vaHogbW9kZS4gVGhlCisJICogY2xvY2tzb3VyY2Ugc3dpdGNoIGhhcHBlbnMgaW4gdGhlIHRpbWVyIGludGVycnVwdCB3aXRoCisJICogeHRpbWVfbG9jayBoZWxkLiBOb3RpZmljYXRpb24gZnJvbSB0aGVyZSBvbmx5IHNldHMgdGhlCisJICogY2hlY2sgYml0IGluIHRoZSB0aWNrX29uZXNob3QgY29kZSwgb3RoZXJ3aXNlIHdlIG1pZ2h0CisJICogZGVhZGxvY2sgdnMuIHh0aW1lX2xvY2suCisJICovCisJaWYgKHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoIWhydGltZXJfaXNfaHJlc19lbmFibGVkKCkpKQorCQlocnRpbWVyX3N3aXRjaF90b19ocmVzKCk7CisKKwlocnRpbWVyX2dldF9zb2Z0aXJxX3RpbWUoY3B1X2Jhc2UpOworCisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspCisJCXJ1bl9ocnRpbWVyX3F1ZXVlKGNwdV9iYXNlLCBpKTsKIH0KIAogLyoKICAqIFNsZWVwIHJlbGF0ZWQgZnVuY3Rpb25zOgogICovCi1zdGF0aWMgaW50IGhydGltZXJfd2FrZXVwKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBocnRpbWVyX3dha2V1cChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7CiAJc3RydWN0IGhydGltZXJfc2xlZXBlciAqdCA9CiAJCWNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGhydGltZXJfc2xlZXBlciwgdGltZXIpOwpAQCAtNjczLDYgKzEyMDEsOSBAQAogewogCXNsLT50aW1lci5mdW5jdGlvbiA9IGhydGltZXJfd2FrZXVwOwogCXNsLT50YXNrID0gdGFzazsKKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCisJc2wtPnRpbWVyLmNiX21vZGUgPSBIUlRJTUVSX0NCX0lSUVNBRkVfTk9fUkVTVEFSVDsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW50IF9fc2NoZWQgZG9fbmFub3NsZWVwKHN0cnVjdCBocnRpbWVyX3NsZWVwZXIgKnQsIGVudW0gaHJ0aW1lcl9tb2RlIG1vZGUpCkBAIC02ODMsMTAgKzEyMTQsMTEgQEAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaHJ0aW1lcl9zdGFydCgmdC0+dGltZXIsIHQtPnRpbWVyLmV4cGlyZXMsIG1vZGUpOwogCi0JCXNjaGVkdWxlKCk7CisJCWlmIChsaWtlbHkodC0+dGFzaykpCisJCQlzY2hlZHVsZSgpOwogCiAJCWhydGltZXJfY2FuY2VsKCZ0LT50aW1lcik7Ci0JCW1vZGUgPSBIUlRJTUVSX0FCUzsKKwkJbW9kZSA9IEhSVElNRVJfTU9ERV9BQlM7CiAKIAl9IHdoaWxlICh0LT50YXNrICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CiAKQEAgLTcwMiwxMCArMTIzNCwxMCBAQAogCiAJcmVzdGFydC0+Zm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CiAKLQlocnRpbWVyX2luaXQoJnQudGltZXIsIHJlc3RhcnQtPmFyZzAsIEhSVElNRVJfQUJTKTsKKwlocnRpbWVyX2luaXQoJnQudGltZXIsIHJlc3RhcnQtPmFyZzAsIEhSVElNRVJfTU9ERV9BQlMpOwogCXQudGltZXIuZXhwaXJlcy50djY0ID0gKCh1NjQpcmVzdGFydC0+YXJnMyA8PCAzMikgfCAodTY0KSByZXN0YXJ0LT5hcmcyOwogCi0JaWYgKGRvX25hbm9zbGVlcCgmdCwgSFJUSU1FUl9BQlMpKQorCWlmIChkb19uYW5vc2xlZXAoJnQsIEhSVElNRVJfTU9ERV9BQlMpKQogCQlyZXR1cm4gMDsKIAogCXJtdHAgPSAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKSByZXN0YXJ0LT5hcmcxOwpAQCAtNzM4LDcgKzEyNzAsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIEFic29sdXRlIHRpbWVycyBkbyBub3QgdXBkYXRlIHRoZSBybXRwIHZhbHVlIGFuZCByZXN0YXJ0OiAqLwotCWlmIChtb2RlID09IEhSVElNRVJfQUJTKQorCWlmIChtb2RlID09IEhSVElNRVJfTU9ERV9BQlMpCiAJCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7CiAKIAlpZiAocm10cCkgewpAQCAtNzcxLDcgKzEzMDMsNyBAQAogCWlmICghdGltZXNwZWNfdmFsaWQoJnR1KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gaHJ0aW1lcl9uYW5vc2xlZXAoJnR1LCBybXRwLCBIUlRJTUVSX1JFTCwgQ0xPQ0tfTU9OT1RPTklDKTsKKwlyZXR1cm4gaHJ0aW1lcl9uYW5vc2xlZXAoJnR1LCBybXRwLCBIUlRJTUVSX01PREVfUkVMLCBDTE9DS19NT05PVE9OSUMpOwogfQogCiAvKgpAQCAtNzc5LDU2ICsxMzExLDYwIEBACiAgKi8KIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2hydGltZXJzX2NwdShpbnQgY3B1KQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UgPSBwZXJfY3B1KGhydGltZXJfYmFzZXMsIGNwdSk7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlID0gJnBlcl9jcHUoaHJ0aW1lcl9iYXNlcywgY3B1KTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFJUSU1FUl9CQVNFUzsgaSsrLCBiYXNlKyspIHsKLQkJc3Bpbl9sb2NrX2luaXQoJmJhc2UtPmxvY2spOwotCQlsb2NrZGVwX3NldF9jbGFzcygmYmFzZS0+bG9jaywgJmJhc2UtPmxvY2tfa2V5KTsKLQl9CisJc3Bpbl9sb2NrX2luaXQoJmNwdV9iYXNlLT5sb2NrKTsKKwlsb2NrZGVwX3NldF9jbGFzcygmY3B1X2Jhc2UtPmxvY2ssICZjcHVfYmFzZS0+bG9ja19rZXkpOworCisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspCisJCWNwdV9iYXNlLT5jbG9ja19iYXNlW2ldLmNwdV9iYXNlID0gY3B1X2Jhc2U7CisKKwlocnRpbWVyX2luaXRfaHJlcyhjcHVfYmFzZSk7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAotc3RhdGljIHZvaWQgbWlncmF0ZV9ocnRpbWVyX2xpc3Qoc3RydWN0IGhydGltZXJfYmFzZSAqb2xkX2Jhc2UsCi0JCQkJc3RydWN0IGhydGltZXJfYmFzZSAqbmV3X2Jhc2UpCitzdGF0aWMgdm9pZCBtaWdyYXRlX2hydGltZXJfbGlzdChzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpvbGRfYmFzZSwKKwkJCQlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpuZXdfYmFzZSkKIHsKIAlzdHJ1Y3QgaHJ0aW1lciAqdGltZXI7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CiAKIAl3aGlsZSAoKG5vZGUgPSByYl9maXJzdCgmb2xkX2Jhc2UtPmFjdGl2ZSkpKSB7CiAJCXRpbWVyID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGhydGltZXIsIG5vZGUpOwotCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCBvbGRfYmFzZSk7CisJCUJVR19PTihocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcodGltZXIpKTsKKwkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgb2xkX2Jhc2UsIEhSVElNRVJfU1RBVEVfSU5BQ1RJVkUsIDApOwogCQl0aW1lci0+YmFzZSA9IG5ld19iYXNlOwotCQllbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlKTsKKwkJLyoKKwkJICogRW5xdWV1ZSB0aGUgdGltZXIuIEFsbG93IHJlcHJvZ3JhbW1pbmcgb2YgdGhlIGV2ZW50IGRldmljZQorCQkgKi8KKwkJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBuZXdfYmFzZSwgMSk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBtaWdyYXRlX2hydGltZXJzKGludCBjcHUpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqb2xkX2Jhc2UsICpuZXdfYmFzZTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqb2xkX2Jhc2UsICpuZXdfYmFzZTsKIAlpbnQgaTsKIAogCUJVR19PTihjcHVfb25saW5lKGNwdSkpOwotCW9sZF9iYXNlID0gcGVyX2NwdShocnRpbWVyX2Jhc2VzLCBjcHUpOwotCW5ld19iYXNlID0gZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisJb2xkX2Jhc2UgPSAmcGVyX2NwdShocnRpbWVyX2Jhc2VzLCBjcHUpOworCW5ld19iYXNlID0gJmdldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCisJdGlja19jYW5jZWxfc2NoZWRfdGltZXIoY3B1KTsKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hSVElNRVJfQkFTRVM7IGkrKykgeworCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmxvY2spOworCXNwaW5fbG9jaygmb2xkX2Jhc2UtPmxvY2spOwogCi0JCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmxvY2spOwotCQlzcGluX2xvY2soJm9sZF9iYXNlLT5sb2NrKTsKLQotCQlCVUdfT04ob2xkX2Jhc2UtPmN1cnJfdGltZXIpOwotCi0JCW1pZ3JhdGVfaHJ0aW1lcl9saXN0KG9sZF9iYXNlLCBuZXdfYmFzZSk7Ci0KLQkJc3Bpbl91bmxvY2soJm9sZF9iYXNlLT5sb2NrKTsKLQkJc3Bpbl91bmxvY2soJm5ld19iYXNlLT5sb2NrKTsKLQkJb2xkX2Jhc2UrKzsKLQkJbmV3X2Jhc2UrKzsKKwlmb3IgKGkgPSAwOyBpIDwgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVM7IGkrKykgeworCQltaWdyYXRlX2hydGltZXJfbGlzdCgmb2xkX2Jhc2UtPmNsb2NrX2Jhc2VbaV0sCisJCQkJICAgICAmbmV3X2Jhc2UtPmNsb2NrX2Jhc2VbaV0pOwogCX0KKwlzcGluX3VubG9jaygmb2xkX2Jhc2UtPmxvY2spOworCXNwaW5fdW5sb2NrKCZuZXdfYmFzZS0+bG9jayk7CiAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJcHV0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CkBAIC04NDgsNiArMTM4NCw3IEBACiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAljYXNlIENQVV9ERUFEOgorCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9DUFVfREVBRCwgJmNwdSk7CiAJCW1pZ3JhdGVfaHJ0aW1lcnMoY3B1KTsKIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTg2OCw1ICsxNDA1LDggQEAKIAlocnRpbWVyX2NwdV9ub3RpZnkoJmhydGltZXJzX25iLCAodW5zaWduZWQgbG9uZylDUFVfVVBfUFJFUEFSRSwKIAkJCSAgKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmaHJ0aW1lcnNfbmIpOworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlvcGVuX3NvZnRpcnEoSFJUSU1FUl9TT0ZUSVJRLCBydW5faHJ0aW1lcl9zb2Z0aXJxLCBOVUxMKTsKKyNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2NoaXAuYyBiL2tlcm5lbC9pcnEvY2hpcC5jCmluZGV4IDQ3NWU4YTcuLjAxMzNmNGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvY2hpcC5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIC8qKgogICoJc2V0X2lycV9kYXRhIC0gc2V0IGlycSB0eXBlIGRhdGEgZm9yIGFuIGlycQogICoJQGlycToJSW50ZXJydXB0IG51bWJlcgotICoJQGRhdGE6CVBvaW50ZXIgdG8gaW50ZXJydXB0IHNwZWNpZmljIGRhdGEKKyAqCUBlbnRyeToJUG9pbnRlciB0byBNU0kgZGVzY3JpcHRvciBkYXRhCiAgKgogICoJU2V0IHRoZSBoYXJkd2FyZSBpcnEgY29udHJvbGxlciBkYXRhIGZvciBhbiBpcnEKICAqLwpAQCAtMjMwLDEwICsyMzAsNiBAQAogICovCiBzdGF0aWMgdm9pZCBkZWZhdWx0X2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQotCWlmICghKGRlc2MtPnN0YXR1cyAmIElSUV9ERUxBWUVEX0RJU0FCTEUpKQotCQlkZXNjLT5jaGlwLT5tYXNrKGlycSk7CiB9CiAKIC8qCkBAIC0yOTgsMTMgKzI5NCwxOCBAQAogCiAJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIElSUV9JTlBST0dSRVNTKSkKIAkJZ290byBvdXRfdW5sb2NrOwotCWRlc2MtPnN0YXR1cyAmPSB+KElSUV9SRVBMQVkgfCBJUlFfV0FJVElORyk7CiAJa3N0YXRfY3B1KGNwdSkuaXJxc1tpcnFdKys7CiAKIAlhY3Rpb24gPSBkZXNjLT5hY3Rpb247Ci0JaWYgKHVubGlrZWx5KCFhY3Rpb24gfHwgKGRlc2MtPnN0YXR1cyAmIElSUV9ESVNBQkxFRCkpKQorCWlmICh1bmxpa2VseSghYWN0aW9uIHx8IChkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpKSkgeworCQlpZiAoZGVzYy0+Y2hpcC0+bWFzaykKKwkJCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsKKwkJZGVzYy0+c3RhdHVzICY9IH4oSVJRX1JFUExBWSB8IElSUV9XQUlUSU5HKTsKKwkJZGVzYy0+c3RhdHVzIHw9IElSUV9QRU5ESU5HOwogCQlnb3RvIG91dF91bmxvY2s7CisJfQogCisJZGVzYy0+c3RhdHVzICY9IH4oSVJRX1JFUExBWSB8IElSUV9XQUlUSU5HIHwgSVJRX1BFTkRJTkcpOwogCWRlc2MtPnN0YXR1cyB8PSBJUlFfSU5QUk9HUkVTUzsKIAlzcGluX3VubG9jaygmZGVzYy0+bG9jayk7CiAKQEAgLTM5NiwxMSArMzk3LDEzIEBACiAKIAkvKgogCSAqIElmIGl0cyBkaXNhYmxlZCBvciBubyBhY3Rpb24gYXZhaWxhYmxlCi0JICoga2VlcCBpdCBtYXNrZWQgYW5kIGdldCBvdXQgb2YgaGVyZQorCSAqIHRoZW4gbWFzayBpdCBhbmQgZ2V0IG91dCBvZiBoZXJlOgogCSAqLwogCWFjdGlvbiA9IGRlc2MtPmFjdGlvbjsKIAlpZiAodW5saWtlbHkoIWFjdGlvbiB8fCAoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSkpIHsKIAkJZGVzYy0+c3RhdHVzIHw9IElSUV9QRU5ESU5HOworCQlpZiAoZGVzYy0+Y2hpcC0+bWFzaykKKwkJCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC01NjIsMTAgKzU2NSw4IEBACiAKIAkvKiBVbmluc3RhbGw/ICovCiAJaWYgKGhhbmRsZSA9PSBoYW5kbGVfYmFkX2lycSkgewotCQlpZiAoZGVzYy0+Y2hpcCAhPSAmbm9faXJxX2NoaXApIHsKLQkJCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsKLQkJCWRlc2MtPmNoaXAtPmFjayhpcnEpOwotCQl9CisJCWlmIChkZXNjLT5jaGlwICE9ICZub19pcnFfY2hpcCkKKwkJCW1hc2tfYWNrX2lycShkZXNjLCBpcnEpOwogCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0RJU0FCTEVEOwogCQlkZXNjLT5kZXB0aCA9IDE7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tYW5hZ2UuYyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKaW5kZXggYWNjNWQ5Zi4uNTU5N2MxNSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9tYW5hZ2UuYworKysgYi9rZXJuZWwvaXJxL21hbmFnZS5jCkBAIC0zOCw2ICszOCw0NiBAQAogfQogRVhQT1JUX1NZTUJPTChzeW5jaHJvbml6ZV9pcnEpOwogCisvKioKKyAqCWlycV9jYW5fc2V0X2FmZmluaXR5IC0gQ2hlY2sgaWYgdGhlIGFmZmluaXR5IG9mIGEgZ2l2ZW4gaXJxIGNhbiBiZSBzZXQKKyAqCUBpcnE6CQlJbnRlcnJ1cHQgdG8gY2hlY2sKKyAqCisgKi8KK2ludCBpcnFfY2FuX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCisJaWYgKENIRUNLX0lSUV9QRVJfQ1BVKGRlc2MtPnN0YXR1cykgfHwgIWRlc2MtPmNoaXAgfHwKKwkgICAgIWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglpcnFfc2V0X2FmZmluaXR5IC0gU2V0IHRoZSBpcnEgYWZmaW5pdHkgb2YgYSBnaXZlbiBpcnEKKyAqCUBpcnE6CQlJbnRlcnJ1cHQgdG8gc2V0IGFmZmluaXR5CisgKglAY3B1bWFzazoJY3B1bWFzaworICoKKyAqLworaW50IGlycV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IGNwdW1hc2spCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisKKwlpZiAoIWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzZXRfYmFsYW5jZV9pcnFfYWZmaW5pdHkoaXJxLCBjcHVtYXNrKTsKKworI2lmZGVmIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCisJc2V0X3BlbmRpbmdfaXJxKGlycSwgY3B1bWFzayk7CisjZWxzZQorCWRlc2MtPmFmZmluaXR5ID0gY3B1bWFzazsKKwlkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLCBjcHVtYXNrKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCiAjZW5kaWYKIAogLyoqCkBAIC0yODEsNiArMzIxLDEwIEBACiAJaWYgKG5ldy0+ZmxhZ3MgJiBJUlFGX1BFUkNQVSkKIAkJZGVzYy0+c3RhdHVzIHw9IElSUV9QRVJfQ1BVOwogI2VuZGlmCisJLyogRXhjbHVkZSBJUlEgZnJvbSBiYWxhbmNpbmcgKi8KKwlpZiAobmV3LT5mbGFncyAmIElSUUZfTk9CQUxBTkNJTkcpCisJCWRlc2MtPnN0YXR1cyB8PSBJUlFfTk9fQkFMQU5DSU5HOworCiAJaWYgKCFzaGFyZWQpIHsKIAkJaXJxX2NoaXBfc2V0X2RlZmF1bHRzKGRlc2MtPmNoaXApOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3Byb2MuYyBiL2tlcm5lbC9pcnEvcHJvYy5jCmluZGV4IDZkM2JlMDYuLjJkYjkxZWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvcHJvYy5jCisrKyBiL2tlcm5lbC9pcnEvcHJvYy5jCkBAIC0xNiwyNiArMTYsNiBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCi0jaWZkZWYgQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEKLXZvaWQgcHJvY19zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrX3ZhbCkKLXsKLQlzZXRfYmFsYW5jZV9pcnFfYWZmaW5pdHkoaXJxLCBtYXNrX3ZhbCk7Ci0KLQkvKgotCSAqIFNhdmUgdGhlc2UgYXdheSBmb3IgbGF0ZXIgdXNlLiBSZS1wcm9nYW0gd2hlbiB0aGUKLQkgKiBpbnRlcnJ1cHQgaXMgcGVuZGluZwotCSAqLwotCXNldF9wZW5kaW5nX2lycShpcnEsIG1hc2tfdmFsKTsKLX0KLSNlbHNlCi12b2lkIHByb2Nfc2V0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFza192YWwpCi17Ci0Jc2V0X2JhbGFuY2VfaXJxX2FmZmluaXR5KGlycSwgbWFza192YWwpOwotCWlycV9kZXNjW2lycV0uYWZmaW5pdHkgPSBtYXNrX3ZhbDsKLQlpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eShpcnEsIG1hc2tfdmFsKTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IGlycV9hZmZpbml0eV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCQkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewpAQCAtNTUsNyArMzUsNyBAQAogCWNwdW1hc2tfdCBuZXdfdmFsdWUsIHRtcDsKIAogCWlmICghaXJxX2Rlc2NbaXJxXS5jaGlwLT5zZXRfYWZmaW5pdHkgfHwgbm9faXJxX2FmZmluaXR5IHx8Ci0JCQkJQ0hFQ0tfSVJRX1BFUl9DUFUoaXJxX2Rlc2NbaXJxXS5zdGF0dXMpKQorCSAgICBpcnFfYmFsYW5jaW5nX2Rpc2FibGVkKGlycSkpCiAJCXJldHVybiAtRUlPOwogCiAJZXJyID0gY3B1bWFza19wYXJzZV91c2VyKGJ1ZmZlciwgY291bnQsIG5ld192YWx1ZSk7CkBAIC03Myw3ICs1Myw3IEBACiAJCSAgIGNvZGUgdG8gc2V0IGRlZmF1bHQgU01QIGFmZmluaXR5LiAqLwogCQlyZXR1cm4gc2VsZWN0X3NtcF9hZmZpbml0eShpcnEpID8gLUVJTlZBTCA6IGZ1bGxfY291bnQ7CiAKLQlwcm9jX3NldF9pcnFfYWZmaW5pdHkoaXJxLCBuZXdfdmFsdWUpOworCWlycV9zZXRfYWZmaW5pdHkoaXJxLCBuZXdfdmFsdWUpOwogCiAJcmV0dXJuIGZ1bGxfY291bnQ7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvaXRpbWVyLmMgYi9rZXJuZWwvaXRpbWVyLmMKaW5kZXggMjA0ZWQ3OS4uMzA3YzZhNiAxMDA2NDQKLS0tIGEva2VybmVsL2l0aW1lci5jCisrKyBiL2tlcm5lbC9pdGltZXIuYwpAQCAtMTI4LDE4ICsxMjgsMTMgQEAKIC8qCiAgKiBUaGUgdGltZXIgaXMgYXV0b21hZ2ljYWxseSByZXN0YXJ0ZWQsIHdoZW4gaW50ZXJ2YWwgIT0gMAogICovCi1pbnQgaXRfcmVhbF9mbihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCitlbnVtIGhydGltZXJfcmVzdGFydCBpdF9yZWFsX2ZuKHN0cnVjdCBocnRpbWVyICp0aW1lcikKIHsKIAlzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnID0KIAkgICAgY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCwgcmVhbF90aW1lcik7CiAKIAlzZW5kX2dyb3VwX3NpZ19pbmZvKFNJR0FMUk0sIFNFTkRfU0lHX1BSSVYsIHNpZy0+dHNrKTsKIAotCWlmIChzaWctPml0X3JlYWxfaW5jci50djY0ICE9IDApIHsKLQkJaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLCB0aW1lci0+YmFzZS0+c29mdGlycV90aW1lLAotCQkJCXNpZy0+aXRfcmVhbF9pbmNyKTsKLQkJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKLQl9CiAJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwogfQogCkBAIC0yMzEsMTEgKzIyNiwxNCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwogCQkJZ290byBhZ2FpbjsKIAkJfQotCQl0c2stPnNpZ25hbC0+aXRfcmVhbF9pbmNyID0KLQkJCXRpbWV2YWxfdG9fa3RpbWUodmFsdWUtPml0X2ludGVydmFsKTsKIAkJZXhwaXJlcyA9IHRpbWV2YWxfdG9fa3RpbWUodmFsdWUtPml0X3ZhbHVlKTsKLQkJaWYgKGV4cGlyZXMudHY2NCAhPSAwKQotCQkJaHJ0aW1lcl9zdGFydCh0aW1lciwgZXhwaXJlcywgSFJUSU1FUl9SRUwpOworCQlpZiAoZXhwaXJlcy50djY0ICE9IDApIHsKKwkJCXRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IgPQorCQkJCXRpbWV2YWxfdG9fa3RpbWUodmFsdWUtPml0X2ludGVydmFsKTsKKwkJCWhydGltZXJfc3RhcnQodGltZXIsIGV4cGlyZXMsIEhSVElNRVJfTU9ERV9SRUwpOworCQl9IGVsc2UKKwkJCXRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IudHY2NCA9IDA7CisKIAkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwogCQlicmVhazsKIAljYXNlIElUSU1FUl9WSVJUVUFMOgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYyBiL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMKaW5kZXggN2MzZTFlNi4uNjU3Zjc3NiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYworKysgYi9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJICogc2hvdWxkIGJlIGFibGUgdG8gc2VlIGl0LgogCQkgKi8KIAkJc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQlyY3VfcmVhZF9sb2NrKCk7CiAJCXAgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CiAJCWlmIChwKSB7CiAJCQlpZiAoQ1BVQ0xPQ0tfUEVSVEhSRUFEKHdoaWNoX2Nsb2NrKSkgewpAQCAtMzEyLDEyICszMTIsMTcgQEAKIAkJCQkJZXJyb3IgPSBjcHVfY2xvY2tfc2FtcGxlKHdoaWNoX2Nsb2NrLAogCQkJCQkJCQkgcCwgJnJ0bik7CiAJCQkJfQotCQkJfSBlbHNlIGlmIChwLT50Z2lkID09IHBpZCAmJiBwLT5zaWduYWwpIHsKLQkJCQllcnJvciA9IGNwdV9jbG9ja19zYW1wbGVfZ3JvdXAod2hpY2hfY2xvY2ssCi0JCQkJCQkJICAgICAgIHAsICZydG4pOworCQkJfSBlbHNlIHsKKwkJCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQkJCWlmIChwLT50Z2lkID09IHBpZCAmJiBwLT5zaWduYWwpIHsKKwkJCQkJZXJyb3IgPQorCQkJCQkgICAgY3B1X2Nsb2NrX3NhbXBsZV9ncm91cCh3aGljaF9jbG9jaywKKwkJCQkJCQkgICAgICAgICAgIHAsICZydG4pOworCQkJCX0KKwkJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJCQl9CiAJCX0KLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKIAlpZiAoZXJyb3IpCmRpZmYgLS1naXQgYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKaW5kZXggYTFiZjYxNi4uNDQzMThjYSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LXRpbWVycy5jCisrKyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJCQkgICAgc3RydWN0IGl0aW1lcnNwZWMgKiwgc3RydWN0IGl0aW1lcnNwZWMgKik7CiBzdGF0aWMgaW50IGNvbW1vbl90aW1lcl9kZWwoc3RydWN0IGtfaXRpbWVyICp0aW1lcik7CiAKLXN0YXRpYyBpbnQgcG9zaXhfdGltZXJfZm4oc3RydWN0IGhydGltZXIgKmRhdGEpOworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHBvc2l4X3RpbWVyX2ZuKHN0cnVjdCBocnRpbWVyICpkYXRhKTsKIAogc3RhdGljIHN0cnVjdCBrX2l0aW1lciAqbG9ja190aW1lcih0aW1lcl90IHRpbWVyX2lkLCB1bnNpZ25lZCBsb25nICpmbGFncyk7CiAKQEAgLTMzNCwxMiArMzM0LDEyIEBACiAKICAqIFRoaXMgY29kZSBpcyBmb3IgQ0xPQ0tfUkVBTFRJTUUqIGFuZCBDTE9DS19NT05PVE9OSUMqIHRpbWVycy4KICAqLwotc3RhdGljIGludCBwb3NpeF90aW1lcl9mbihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgcG9zaXhfdGltZXJfZm4oc3RydWN0IGhydGltZXIgKnRpbWVyKQogewogCXN0cnVjdCBrX2l0aW1lciAqdGltcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzaV9wcml2YXRlID0gMDsKLQlpbnQgcmV0ID0gSFJUSU1FUl9OT1JFU1RBUlQ7CisJZW51bSBocnRpbWVyX3Jlc3RhcnQgcmV0ID0gSFJUSU1FUl9OT1JFU1RBUlQ7CiAKIAl0aW1yID0gY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3Qga19pdGltZXIsIGl0LnJlYWwudGltZXIpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1yLT5pdF9sb2NrLCBmbGFncyk7CkBAIC0zNTYsNyArMzU2LDcgQEAKIAkJaWYgKHRpbXItPml0LnJlYWwuaW50ZXJ2YWwudHY2NCAhPSAwKSB7CiAJCQl0aW1yLT5pdF9vdmVycnVuICs9CiAJCQkJaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLAotCQkJCQkJdGltZXItPmJhc2UtPnNvZnRpcnFfdGltZSwKKwkJCQkJCWhydGltZXJfY2JfZ2V0X3RpbWUodGltZXIpLAogCQkJCQkJdGltci0+aXQucmVhbC5pbnRlcnZhbCk7CiAJCQlyZXQgPSBIUlRJTUVSX1JFU1RBUlQ7CiAJCQkrK3RpbXItPml0X3JlcXVldWVfcGVuZGluZzsKQEAgLTcyMiw3ICs3MjIsNyBAQAogCWlmICghbmV3X3NldHRpbmctPml0X3ZhbHVlLnR2X3NlYyAmJiAhbmV3X3NldHRpbmctPml0X3ZhbHVlLnR2X25zZWMpCiAJCXJldHVybiAwOwogCi0JbW9kZSA9IGZsYWdzICYgVElNRVJfQUJTVElNRSA/IEhSVElNRVJfQUJTIDogSFJUSU1FUl9SRUw7CisJbW9kZSA9IGZsYWdzICYgVElNRVJfQUJTVElNRSA/IEhSVElNRVJfTU9ERV9BQlMgOiBIUlRJTUVSX01PREVfUkVMOwogCWhydGltZXJfaW5pdCgmdGltci0+aXQucmVhbC50aW1lciwgdGltci0+aXRfY2xvY2ssIG1vZGUpOwogCXRpbXItPml0LnJlYWwudGltZXIuZnVuY3Rpb24gPSBwb3NpeF90aW1lcl9mbjsKIApAQCAtNzM0LDcgKzczNCw3IEBACiAJLyogU0lHRVZfTk9ORSB0aW1lcnMgYXJlIG5vdCBxdWV1ZWQgISBTZWUgY29tbW9uX3RpbWVyX2dldCAqLwogCWlmICgoKHRpbXItPml0X3NpZ2V2X25vdGlmeSAmIH5TSUdFVl9USFJFQURfSUQpID09IFNJR0VWX05PTkUpKSB7CiAJCS8qIFNldHVwIGNvcnJlY3QgZXhwaXJ5IHRpbWUgZm9yIHJlbGF0aXZlIHRpbWVycyAqLwotCQlpZiAobW9kZSA9PSBIUlRJTUVSX1JFTCkKKwkJaWYgKG1vZGUgPT0gSFJUSU1FUl9NT0RFX1JFTCkKIAkJCXRpbWVyLT5leHBpcmVzID0ga3RpbWVfYWRkKHRpbWVyLT5leHBpcmVzLAogCQkJCQkJICAgdGltZXItPmJhc2UtPmdldF90aW1lKCkpOwogCQlyZXR1cm4gMDsKQEAgLTk1MCw3ICs5NTAsOCBAQAogCQkJIHN0cnVjdCB0aW1lc3BlYyAqdHNhdmUsIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHApCiB7CiAJcmV0dXJuIGhydGltZXJfbmFub3NsZWVwKHRzYXZlLCBybXRwLCBmbGFncyAmIFRJTUVSX0FCU1RJTUUgPwotCQkJCSBIUlRJTUVSX0FCUyA6IEhSVElNRVJfUkVMLCB3aGljaF9jbG9jayk7CisJCQkJIEhSVElNRVJfTU9ERV9BQlMgOiBIUlRJTUVSX01PREVfUkVMLAorCQkJCSB3aGljaF9jbG9jayk7CiB9CiAKIGFzbWxpbmthZ2UgbG9uZwpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXguYyBiL2tlcm5lbC9ydG11dGV4LmMKaW5kZXggNGFiMTdkYS4uMTgwOTc4YyAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXguYworKysgYi9rZXJuZWwvcnRtdXRleC5jCkBAIC02MjUsNyArNjI1LDcgQEAKIAkvKiBTZXR1cCB0aGUgdGltZXIsIHdoZW4gdGltZW91dCAhPSBOVUxMICovCiAJaWYgKHVubGlrZWx5KHRpbWVvdXQpKQogCQlocnRpbWVyX3N0YXJ0KCZ0aW1lb3V0LT50aW1lciwgdGltZW91dC0+dGltZXIuZXhwaXJlcywKLQkJCSAgICAgIEhSVElNRVJfQUJTKTsKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOwogCiAJZm9yICg7OykgewogCQkvKiBUcnkgdG8gYWNxdWlyZSB0aGUgbG9jazogKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCA4MDcyZTU2Li5lMmE3ZDRiIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC00NTYsMjYgKzQ1Niw1MCBAQAogaW50IGRlcXVldWVfc2lnbmFsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzaWdzZXRfdCAqbWFzaywgc2lnaW5mb190ICppbmZvKQogewogCWludCBzaWduciA9IF9fZGVxdWV1ZV9zaWduYWwoJnRzay0+cGVuZGluZywgbWFzaywgaW5mbyk7Ci0JaWYgKCFzaWducikKKwlpZiAoIXNpZ25yKSB7CiAJCXNpZ25yID0gX19kZXF1ZXVlX3NpZ25hbCgmdHNrLT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nLAogCQkJCQkgbWFzaywgaW5mbyk7CisJCS8qCisJCSAqIGl0aW1lciBzaWduYWwgPworCQkgKgorCQkgKiBpdGltZXJzIGFyZSBwcm9jZXNzIHNoYXJlZCBhbmQgd2UgcmVzdGFydCBwZXJpb2RpYworCQkgKiBpdGltZXJzIGluIHRoZSBzaWduYWwgZGVsaXZlcnkgcGF0aCB0byBwcmV2ZW50IERvUworCQkgKiBhdHRhY2tzIGluIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgY2FzZS4gVGhpcyBpcworCQkgKiBjb21wbGlhbnQgd2l0aCB0aGUgb2xkIHdheSBvZiBzZWxmIHJlc3RhcnRpbmcKKwkJICogaXRpbWVycywgYXMgdGhlIFNJR0FMUk0gaXMgYSBsZWdhY3kgc2lnbmFsIGFuZCBvbmx5CisJCSAqIHF1ZXVlZCBvbmNlLiBDaGFuZ2luZyB0aGUgcmVzdGFydCBiZWhhdmlvdXIgdG8KKwkJICogcmVzdGFydCB0aGUgdGltZXIgaW4gdGhlIHNpZ25hbCBkZXF1ZXVlIHBhdGggaXMKKwkJICogcmVkdWNpbmcgdGhlIHRpbWVyIG5vaXNlIG9uIGhlYXZ5IGxvYWRlZCAhaGlnaHJlcworCQkgKiBzeXN0ZW1zIHRvby4KKwkJICovCisJCWlmICh1bmxpa2VseShzaWduciA9PSBTSUdBTFJNKSkgeworCQkJc3RydWN0IGhydGltZXIgKnRtciA9ICZ0c2stPnNpZ25hbC0+cmVhbF90aW1lcjsKKworCQkJaWYgKCFocnRpbWVyX2lzX3F1ZXVlZCh0bXIpICYmCisJCQkgICAgdHNrLT5zaWduYWwtPml0X3JlYWxfaW5jci50djY0ICE9IDApIHsKKwkJCQlocnRpbWVyX2ZvcndhcmQodG1yLCB0bXItPmJhc2UtPmdldF90aW1lKCksCisJCQkJCQl0c2stPnNpZ25hbC0+aXRfcmVhbF9pbmNyKTsKKwkJCQlocnRpbWVyX3Jlc3RhcnQodG1yKTsKKwkJCX0KKwkJfQorCX0KIAlyZWNhbGNfc2lncGVuZGluZ190c2sodHNrKTsKLSAJaWYgKHNpZ25yICYmIHVubGlrZWx5KHNpZ19rZXJuZWxfc3RvcChzaWducikpKSB7Ci0gCQkvKgotIAkJICogU2V0IGEgbWFya2VyIHRoYXQgd2UgaGF2ZSBkZXF1ZXVlZCBhIHN0b3Agc2lnbmFsLiAgT3VyCi0gCQkgKiBjYWxsZXIgbWlnaHQgcmVsZWFzZSB0aGUgc2lnbG9jayBhbmQgdGhlbiB0aGUgcGVuZGluZwotIAkJICogc3RvcCBzaWduYWwgaXQgaXMgYWJvdXQgdG8gcHJvY2VzcyBpcyBubyBsb25nZXIgaW4gdGhlCi0gCQkgKiBwZW5kaW5nIGJpdG1hc2tzLCBidXQgbXVzdCBzdGlsbCBiZSBjbGVhcmVkIGJ5IGEgU0lHQ09OVAotIAkJICogKGFuZCBvdmVycnVsZWQgYnkgYSBTSUdLSUxMKS4gIFNvIHRob3NlIGNhc2VzIGNsZWFyIHRoaXMKLSAJCSAqIHNoYXJlZCBmbGFnIGFmdGVyIHdlJ3ZlIHNldCBpdC4gIE5vdGUgdGhhdCB0aGlzIGZsYWcgbWF5Ci0gCQkgKiByZW1haW4gc2V0IGFmdGVyIHRoZSBzaWduYWwgd2UgcmV0dXJuIGlzIGlnbm9yZWQgb3IKLSAJCSAqIGhhbmRsZWQuICBUaGF0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UgaXRzIG9ubHkgcHVycG9zZQotIAkJICogaXMgdG8gYWxlcnQgc3RvcC1zaWduYWwgcHJvY2Vzc2luZyBjb2RlIHdoZW4gYW5vdGhlcgotIAkJICogcHJvY2Vzc29yIGhhcyBjb21lIGFsb25nIGFuZCBjbGVhcmVkIHRoZSBmbGFnLgotIAkJICovCi0gCQlpZiAoISh0c2stPnNpZ25hbC0+ZmxhZ3MgJiBTSUdOQUxfR1JPVVBfRVhJVCkpCi0gCQkJdHNrLT5zaWduYWwtPmZsYWdzIHw9IFNJR05BTF9TVE9QX0RFUVVFVUVEOwotIAl9CisJaWYgKHNpZ25yICYmIHVubGlrZWx5KHNpZ19rZXJuZWxfc3RvcChzaWducikpKSB7CisJCS8qCisJCSAqIFNldCBhIG1hcmtlciB0aGF0IHdlIGhhdmUgZGVxdWV1ZWQgYSBzdG9wIHNpZ25hbC4gIE91cgorCQkgKiBjYWxsZXIgbWlnaHQgcmVsZWFzZSB0aGUgc2lnbG9jayBhbmQgdGhlbiB0aGUgcGVuZGluZworCQkgKiBzdG9wIHNpZ25hbCBpdCBpcyBhYm91dCB0byBwcm9jZXNzIGlzIG5vIGxvbmdlciBpbiB0aGUKKwkJICogcGVuZGluZyBiaXRtYXNrcywgYnV0IG11c3Qgc3RpbGwgYmUgY2xlYXJlZCBieSBhIFNJR0NPTlQKKwkJICogKGFuZCBvdmVycnVsZWQgYnkgYSBTSUdLSUxMKS4gIFNvIHRob3NlIGNhc2VzIGNsZWFyIHRoaXMKKwkJICogc2hhcmVkIGZsYWcgYWZ0ZXIgd2UndmUgc2V0IGl0LiAgTm90ZSB0aGF0IHRoaXMgZmxhZyBtYXkKKwkJICogcmVtYWluIHNldCBhZnRlciB0aGUgc2lnbmFsIHdlIHJldHVybiBpcyBpZ25vcmVkIG9yCisJCSAqIGhhbmRsZWQuICBUaGF0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UgaXRzIG9ubHkgcHVycG9zZQorCQkgKiBpcyB0byBhbGVydCBzdG9wLXNpZ25hbCBwcm9jZXNzaW5nIGNvZGUgd2hlbiBhbm90aGVyCisJCSAqIHByb2Nlc3NvciBoYXMgY29tZSBhbG9uZyBhbmQgY2xlYXJlZCB0aGUgZmxhZy4KKwkJICovCisJCWlmICghKHRzay0+c2lnbmFsLT5mbGFncyAmIFNJR05BTF9HUk9VUF9FWElUKSkKKwkJCXRzay0+c2lnbmFsLT5mbGFncyB8PSBTSUdOQUxfU1RPUF9ERVFVRVVFRDsKKwl9CiAJaWYgKCBzaWduciAmJgogCSAgICAgKChpbmZvLT5zaV9jb2RlICYgX19TSV9NQVNLKSA9PSBfX1NJX1RJTUVSKSAmJgogCSAgICAgaW5mby0+c2lfc3lzX3ByaXZhdGUpewpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggOTE4ZTUyZC4uOGI3NTAwOCAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogLyoKQEAgLTI3Myw2ICsyNzQsMTggQEAKIAogI2VuZGlmCiAKKy8qCisgKiBFbnRlciBhbiBpbnRlcnJ1cHQgY29udGV4dC4KKyAqLwordm9pZCBpcnFfZW50ZXIodm9pZCkKK3sKKwlfX2lycV9lbnRlcigpOworI2lmZGVmIENPTkZJR19OT19IWgorCWlmIChpZGxlX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQl0aWNrX25vaHpfdXBkYXRlX2ppZmZpZXMoKTsKKyNlbmRpZgorfQorCiAjaWZkZWYgX19BUkNIX0lSUV9FWElUX0lSUVNfRElTQUJMRUQKICMgZGVmaW5lIGludm9rZV9zb2Z0aXJxKCkJX19kb19zb2Z0aXJxKCkKICNlbHNlCkBAIC0yODksNiArMzAyLDEyIEBACiAJc3ViX3ByZWVtcHRfY291bnQoSVJRX0VYSVRfT0ZGU0VUKTsKIAlpZiAoIWluX2ludGVycnVwdCgpICYmIGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKQogCQlpbnZva2Vfc29mdGlycSgpOworCisjaWZkZWYgQ09ORklHX05PX0haCisJLyogTWFrZSBzdXJlIHRoYXQgdGltZXIgd2hlZWwgdXBkYXRlcyBhcmUgcHJvcGFnYXRlZCAqLworCWlmICghaW5faW50ZXJydXB0KCkgJiYgaWRsZV9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKSAmJiAhbmVlZF9yZXNjaGVkKCkpCisJCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soKTsKKyNlbmRpZgogCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUuYyBiL2tlcm5lbC90aW1lLmMKaW5kZXggMGUwMTdiZmYuLmM2YzgwZWE1IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lLmMKQEAgLTQ3MCw2ICs0NzAsMjYwIEBACiAJcmV0dXJuIHR2OwogfQogCisvKgorICogQ29udmVydCBqaWZmaWVzIHRvIG1pbGxpc2Vjb25kcyBhbmQgYmFjay4KKyAqCisgKiBBdm9pZCB1bm5lY2Vzc2FyeSBtdWx0aXBsaWNhdGlvbnMvZGl2aXNpb25zIGluIHRoZQorICogdHdvIG1vc3QgY29tbW9uIEhaIGNhc2VzOgorICovCit1bnNpZ25lZCBpbnQgamlmZmllc190b19tc2Vjcyhjb25zdCB1bnNpZ25lZCBsb25nIGopCit7CisjaWYgSFogPD0gTVNFQ19QRVJfU0VDICYmICEoTVNFQ19QRVJfU0VDICUgSFopCisJcmV0dXJuIChNU0VDX1BFUl9TRUMgLyBIWikgKiBqOworI2VsaWYgSFogPiBNU0VDX1BFUl9TRUMgJiYgIShIWiAlIE1TRUNfUEVSX1NFQykKKwlyZXR1cm4gKGogKyAoSFogLyBNU0VDX1BFUl9TRUMpIC0gMSkvKEhaIC8gTVNFQ19QRVJfU0VDKTsKKyNlbHNlCisJcmV0dXJuIChqICogTVNFQ19QRVJfU0VDKSAvIEhaOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGppZmZpZXNfdG9fbXNlY3MpOworCit1bnNpZ25lZCBpbnQgamlmZmllc190b191c2Vjcyhjb25zdCB1bnNpZ25lZCBsb25nIGopCit7CisjaWYgSFogPD0gVVNFQ19QRVJfU0VDICYmICEoVVNFQ19QRVJfU0VDICUgSFopCisJcmV0dXJuIChVU0VDX1BFUl9TRUMgLyBIWikgKiBqOworI2VsaWYgSFogPiBVU0VDX1BFUl9TRUMgJiYgIShIWiAlIFVTRUNfUEVSX1NFQykKKwlyZXR1cm4gKGogKyAoSFogLyBVU0VDX1BFUl9TRUMpIC0gMSkvKEhaIC8gVVNFQ19QRVJfU0VDKTsKKyNlbHNlCisJcmV0dXJuIChqICogVVNFQ19QRVJfU0VDKSAvIEhaOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGppZmZpZXNfdG9fdXNlY3MpOworCisvKgorICogV2hlbiB3ZSBjb252ZXJ0IHRvIGppZmZpZXMgdGhlbiB3ZSBpbnRlcnByZXQgaW5jb21pbmcgdmFsdWVzCisgKiB0aGUgZm9sbG93aW5nIHdheToKKyAqCisgKiAtIG5lZ2F0aXZlIHZhbHVlcyBtZWFuICdpbmZpbml0ZSB0aW1lb3V0JyAoTUFYX0pJRkZZX09GRlNFVCkKKyAqCisgKiAtICd0b28gbGFyZ2UnIHZhbHVlcyBbdGhhdCB3b3VsZCByZXN1bHQgaW4gbGFyZ2VyIHRoYW4KKyAqICAgTUFYX0pJRkZZX09GRlNFVCB2YWx1ZXNdIG1lYW4gJ2luZmluaXRlIHRpbWVvdXQnIHRvby4KKyAqCisgKiAtIGFsbCBvdGhlciB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBqaWZmaWVzIGJ5IGVpdGhlciBtdWx0aXBseWluZworICogICB0aGUgaW5wdXQgdmFsdWUgYnkgYSBmYWN0b3Igb3IgZGl2aWRpbmcgaXQgd2l0aCBhIGZhY3RvcgorICoKKyAqIFdlIG11c3QgYWxzbyBiZSBjYXJlZnVsIGFib3V0IDMyLWJpdCBvdmVyZmxvd3MuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbXNlY3NfdG9famlmZmllcyhjb25zdCB1bnNpZ25lZCBpbnQgbSkKK3sKKwkvKgorCSAqIE5lZ2F0aXZlIHZhbHVlLCBtZWFucyBpbmZpbml0ZSB0aW1lb3V0OgorCSAqLworCWlmICgoaW50KW0gPCAwKQorCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKKworI2lmIEhaIDw9IE1TRUNfUEVSX1NFQyAmJiAhKE1TRUNfUEVSX1NFQyAlIEhaKQorCS8qCisJICogSFogaXMgZXF1YWwgdG8gb3Igc21hbGxlciB0aGFuIDEwMDAsIGFuZCAxMDAwIGlzIGEgbmljZQorCSAqIHJvdW5kIG11bHRpcGxlIG9mIEhaLCBkaXZpZGUgd2l0aCB0aGUgZmFjdG9yIGJldHdlZW4gdGhlbSwKKwkgKiBidXQgcm91bmQgdXB3YXJkczoKKwkgKi8KKwlyZXR1cm4gKG0gKyAoTVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoTVNFQ19QRVJfU0VDIC8gSFopOworI2VsaWYgSFogPiBNU0VDX1BFUl9TRUMgJiYgIShIWiAlIE1TRUNfUEVSX1NFQykKKwkvKgorCSAqIEhaIGlzIGxhcmdlciB0aGFuIDEwMDAsIGFuZCBIWiBpcyBhIG5pY2Ugcm91bmQgbXVsdGlwbGUgb2YKKwkgKiAxMDAwIC0gc2ltcGx5IG11bHRpcGx5IHdpdGggdGhlIGZhY3RvciBiZXR3ZWVuIHRoZW0uCisJICoKKwkgKiBCdXQgZmlyc3QgbWFrZSBzdXJlIHRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQgY2Fubm90CisJICogb3ZlcmZsb3c6CisJICovCisJaWYgKG0gPiBqaWZmaWVzX3RvX21zZWNzKE1BWF9KSUZGWV9PRkZTRVQpKQorCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKKworCXJldHVybiBtICogKEhaIC8gTVNFQ19QRVJfU0VDKTsKKyNlbHNlCisJLyoKKwkgKiBHZW5lcmljIGNhc2UgLSBtdWx0aXBseSwgcm91bmQgYW5kIGRpdmlkZS4gQnV0IGZpcnN0CisJICogY2hlY2sgdGhhdCBpZiB3ZSBhcmUgZG9pbmcgYSBuZXQgbXVsdGlwbGljYXRpb24sIHRoYXQKKwkgKiB3ZSB3b3VsZG50IG92ZXJmbG93OgorCSAqLworCWlmIChIWiA+IE1TRUNfUEVSX1NFQyAmJiBtID4gamlmZmllc190b19tc2VjcyhNQVhfSklGRllfT0ZGU0VUKSkKKwkJcmV0dXJuIE1BWF9KSUZGWV9PRkZTRVQ7CisKKwlyZXR1cm4gKG0gKiBIWiArIE1TRUNfUEVSX1NFQyAtIDEpIC8gTVNFQ19QRVJfU0VDOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKG1zZWNzX3RvX2ppZmZpZXMpOworCit1bnNpZ25lZCBsb25nIHVzZWNzX3RvX2ppZmZpZXMoY29uc3QgdW5zaWduZWQgaW50IHUpCit7CisJaWYgKHUgPiBqaWZmaWVzX3RvX3VzZWNzKE1BWF9KSUZGWV9PRkZTRVQpKQorCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKKyNpZiBIWiA8PSBVU0VDX1BFUl9TRUMgJiYgIShVU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKHUgKyAoVVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoVVNFQ19QRVJfU0VDIC8gSFopOworI2VsaWYgSFogPiBVU0VDX1BFUl9TRUMgJiYgIShIWiAlIFVTRUNfUEVSX1NFQykKKwlyZXR1cm4gdSAqIChIWiAvIFVTRUNfUEVSX1NFQyk7CisjZWxzZQorCXJldHVybiAodSAqIEhaICsgVVNFQ19QRVJfU0VDIC0gMSkgLyBVU0VDX1BFUl9TRUM7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0wodXNlY3NfdG9famlmZmllcyk7CisKKy8qCisgKiBUaGUgVElDS19OU0VDIC0gMSByb3VuZHMgdXAgdGhlIHZhbHVlIHRvIHRoZSBuZXh0IHJlc29sdXRpb24uICBOb3RlCisgKiB0aGF0IGEgcmVtYWluZGVyIHN1YnRyYWN0IGhlcmUgd291bGQgbm90IGRvIHRoZSByaWdodCB0aGluZyBhcyB0aGUKKyAqIHJlc29sdXRpb24gdmFsdWVzIGRvbid0IGZhbGwgb24gc2Vjb25kIGJvdW5kcmllcy4gIEkuZS4gdGhlIGxpbmU6CisgKiBuc2VjIC09IG5zZWMgJSBUSUNLX05TRUM7IGlzIE5PVCBhIGNvcnJlY3QgcmVzb2x1dGlvbiByb3VuZGluZy4KKyAqCisgKiBSYXRoZXIsIHdlIGp1c3Qgc2hpZnQgdGhlIGJpdHMgb2ZmIHRoZSByaWdodC4KKyAqCisgKiBUaGUgPj4gKE5TRUNfSklGRklFX1NDIC0gU0VDX0pJRkZJRV9TQykgY29udmVydHMgdGhlIHNjYWxlZCBuc2VjCisgKiB2YWx1ZSB0byBhIHNjYWxlZCBzZWNvbmQgdmFsdWUuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK3RpbWVzcGVjX3RvX2ppZmZpZXMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNlYyA9IHZhbHVlLT50dl9zZWM7CisJbG9uZyBuc2VjID0gdmFsdWUtPnR2X25zZWMgKyBUSUNLX05TRUMgLSAxOworCisJaWYgKHNlYyA+PSBNQVhfU0VDX0lOX0pJRkZJRVMpeworCQlzZWMgPSBNQVhfU0VDX0lOX0pJRkZJRVM7CisJCW5zZWMgPSAwOworCX0KKwlyZXR1cm4gKCgodTY0KXNlYyAqIFNFQ19DT05WRVJTSU9OKSArCisJCSgoKHU2NCluc2VjICogTlNFQ19DT05WRVJTSU9OKSA+PgorCQkgKE5TRUNfSklGRklFX1NDIC0gU0VDX0pJRkZJRV9TQykpKSA+PiBTRUNfSklGRklFX1NDOworCit9CitFWFBPUlRfU1lNQk9MKHRpbWVzcGVjX3RvX2ppZmZpZXMpOworCit2b2lkCitqaWZmaWVzX3RvX3RpbWVzcGVjKGNvbnN0IHVuc2lnbmVkIGxvbmcgamlmZmllcywgc3RydWN0IHRpbWVzcGVjICp2YWx1ZSkKK3sKKwkvKgorCSAqIENvbnZlcnQgamlmZmllcyB0byBuYW5vc2Vjb25kcyBhbmQgc2VwYXJhdGUgd2l0aAorCSAqIG9uZSBkaXZpZGUuCisJICovCisJdTY0IG5zZWMgPSAodTY0KWppZmZpZXMgKiBUSUNLX05TRUM7CisJdmFsdWUtPnR2X3NlYyA9IGRpdl9sb25nX2xvbmdfcmVtKG5zZWMsIE5TRUNfUEVSX1NFQywgJnZhbHVlLT50dl9uc2VjKTsKK30KK0VYUE9SVF9TWU1CT0woamlmZmllc190b190aW1lc3BlYyk7CisKKy8qIFNhbWUgZm9yICJ0aW1ldmFsIgorICoKKyAqIFdlbGwsIGFsbW9zdC4gIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgcmVhbCBzeXN0ZW0gcmVzb2x1dGlvbiBpcworICogaW4gbmFub3NlY29uZHMgYW5kIHRoZSB2YWx1ZSBiZWluZyBjb252ZXJ0ZWQgaXMgaW4gbWljcm8gc2Vjb25kcy4KKyAqIEFsc28gZm9yIHNvbWUgbWFjaGluZXMgKHRob3NlIHRoYXQgdXNlIEhaID0gMTAyNCwgaW4tcGFydGljdWxhciksCisgKiB0aGVyZSBpcyBhIExBUkdFIGVycm9yIGluIHRoZSB0aWNrIHNpemUgaW4gbWljcm9zZWNvbmRzLgorCisgKiBUaGUgc29sdXRpb24gd2UgdXNlIGlzIHRvIGRvIHRoZSByb3VuZGluZyBBRlRFUiB3ZSBjb252ZXJ0IHRoZQorICogbWljcm9zZWNvbmQgcGFydC4gIFRodXMgdGhlIFVTRUNfUk9VTkQsIHRoZSBiaXRzIHRvIGJlIHNoaWZ0ZWQgb2ZmLgorICogSW5zdHJ1Y3Rpb24gd2lzZSwgdGhpcyBzaG91bGQgY29zdCBvbmx5IGFuIGFkZGl0aW9uYWwgYWRkIHdpdGggY2FycnkKKyAqIGluc3RydWN0aW9uIGFib3ZlIHRoZSB3YXkgaXQgd2FzIGRvbmUgYWJvdmUuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK3RpbWV2YWxfdG9famlmZmllcyhjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBzZWMgPSB2YWx1ZS0+dHZfc2VjOworCWxvbmcgdXNlYyA9IHZhbHVlLT50dl91c2VjOworCisJaWYgKHNlYyA+PSBNQVhfU0VDX0lOX0pJRkZJRVMpeworCQlzZWMgPSBNQVhfU0VDX0lOX0pJRkZJRVM7CisJCXVzZWMgPSAwOworCX0KKwlyZXR1cm4gKCgodTY0KXNlYyAqIFNFQ19DT05WRVJTSU9OKSArCisJCSgoKHU2NCl1c2VjICogVVNFQ19DT05WRVJTSU9OICsgVVNFQ19ST1VORCkgPj4KKwkJIChVU0VDX0pJRkZJRV9TQyAtIFNFQ19KSUZGSUVfU0MpKSkgPj4gU0VDX0pJRkZJRV9TQzsKK30KKwordm9pZCBqaWZmaWVzX3RvX3RpbWV2YWwoY29uc3QgdW5zaWduZWQgbG9uZyBqaWZmaWVzLCBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCit7CisJLyoKKwkgKiBDb252ZXJ0IGppZmZpZXMgdG8gbmFub3NlY29uZHMgYW5kIHNlcGFyYXRlIHdpdGgKKwkgKiBvbmUgZGl2aWRlLgorCSAqLworCXU2NCBuc2VjID0gKHU2NClqaWZmaWVzICogVElDS19OU0VDOworCWxvbmcgdHZfdXNlYzsKKworCXZhbHVlLT50dl9zZWMgPSBkaXZfbG9uZ19sb25nX3JlbShuc2VjLCBOU0VDX1BFUl9TRUMsICZ0dl91c2VjKTsKKwl0dl91c2VjIC89IE5TRUNfUEVSX1VTRUM7CisJdmFsdWUtPnR2X3VzZWMgPSB0dl91c2VjOworfQorCisvKgorICogQ29udmVydCBqaWZmaWVzL2ppZmZpZXNfNjQgdG8gY2xvY2tfdCBhbmQgYmFjay4KKyAqLworY2xvY2tfdCBqaWZmaWVzX3RvX2Nsb2NrX3QobG9uZyB4KQoreworI2lmIChUSUNLX05TRUMgJSAoTlNFQ19QRVJfU0VDIC8gVVNFUl9IWikpID09IDAKKwlyZXR1cm4geCAvIChIWiAvIFVTRVJfSFopOworI2Vsc2UKKwl1NjQgdG1wID0gKHU2NCl4ICogVElDS19OU0VDOworCWRvX2Rpdih0bXAsIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSk7CisJcmV0dXJuIChsb25nKXRtcDsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChqaWZmaWVzX3RvX2Nsb2NrX3QpOworCit1bnNpZ25lZCBsb25nIGNsb2NrX3RfdG9famlmZmllcyh1bnNpZ25lZCBsb25nIHgpCit7CisjaWYgKEhaICUgVVNFUl9IWik9PTAKKwlpZiAoeCA+PSB+MFVMIC8gKEhaIC8gVVNFUl9IWikpCisJCXJldHVybiB+MFVMOworCXJldHVybiB4ICogKEhaIC8gVVNFUl9IWik7CisjZWxzZQorCXU2NCBqaWY7CisKKwkvKiBEb24ndCB3b3JyeSBhYm91dCBsb3NzIG9mIHByZWNpc2lvbiBoZXJlIC4uICovCisJaWYgKHggPj0gfjBVTCAvIEhaICogVVNFUl9IWikKKwkJcmV0dXJuIH4wVUw7CisKKwkvKiAuLiBidXQgZG8gdHJ5IHRvIGNvbnRhaW4gaXQgaGVyZSAqLworCWppZiA9IHggKiAodTY0KSBIWjsKKwlkb19kaXYoamlmLCBVU0VSX0haKTsKKwlyZXR1cm4gamlmOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGNsb2NrX3RfdG9famlmZmllcyk7CisKK3U2NCBqaWZmaWVzXzY0X3RvX2Nsb2NrX3QodTY0IHgpCit7CisjaWYgKFRJQ0tfTlNFQyAlIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSkgPT0gMAorCWRvX2Rpdih4LCBIWiAvIFVTRVJfSFopOworI2Vsc2UKKwkvKgorCSAqIFRoZXJlIGFyZSBiZXR0ZXIgd2F5cyB0aGF0IGRvbid0IG92ZXJmbG93IGVhcmx5LAorCSAqIGJ1dCBldmVuIHRoaXMgZG9lc24ndCBvdmVyZmxvdyBpbiBodW5kcmVkcyBvZiB5ZWFycworCSAqIGluIDY0IGJpdHMsIHNvLi4KKwkgKi8KKwl4ICo9IFRJQ0tfTlNFQzsKKwlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKKyNlbmRpZgorCXJldHVybiB4OworfQorCitFWFBPUlRfU1lNQk9MKGppZmZpZXNfNjRfdG9fY2xvY2tfdCk7CisKK3U2NCBuc2VjX3RvX2Nsb2NrX3QodTY0IHgpCit7CisjaWYgKE5TRUNfUEVSX1NFQyAlIFVTRVJfSFopID09IDAKKwlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKKyNlbGlmIChVU0VSX0haICUgNTEyKSA9PSAwCisJeCAqPSBVU0VSX0haLzUxMjsKKwlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIDUxMikpOworI2Vsc2UKKwkvKgorICAgICAgICAgKiBtYXggcmVsYXRpdmUgZXJyb3IgNS43ZS04ICgxLjhzIHBlciB5ZWFyKSBmb3IgVVNFUl9IWiA8PSAxMDI0LAorICAgICAgICAgKiBvdmVyZmxvdyBhZnRlciA2NC45OSB5ZWFycy4KKyAgICAgICAgICogZXhhY3QgZm9yIEhaPTYwLCA3MiwgOTAsIDEyMCwgMTQ0LCAxODAsIDMwMCwgNjAwLCA5MDAsIC4uLgorICAgICAgICAgKi8KKwl4ICo9IDk7CisJZG9fZGl2KHgsICh1bnNpZ25lZCBsb25nKSgoOXVsbCAqIE5TRUNfUEVSX1NFQyArIChVU0VSX0haLzIpKSAvCisJCQkJICBVU0VSX0haKSk7CisjZW5kaWYKKwlyZXR1cm4geDsKK30KKwogI2lmIChCSVRTX1BFUl9MT05HIDwgNjQpCiB1NjQgZ2V0X2ppZmZpZXNfNjQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL0tjb25maWcgYi9rZXJuZWwvdGltZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjM1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvdGltZS9LY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgVGltZXIgc3Vic3lzdGVtIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjCitjb25maWcgVElDS19PTkVTSE9UCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgTk9fSFoKKwlib29sICJUaWNrbGVzcyBTeXN0ZW0gKER5bmFtaWMgVGlja3MpIgorCWRlcGVuZHMgb24gR0VORVJJQ19USU1FICYmIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlzZWxlY3QgVElDS19PTkVTSE9UCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBhIHRpY2tsZXNzIHN5c3RlbTogdGltZXIgaW50ZXJydXB0cyB3aWxsCisJICBvbmx5IHRyaWdnZXIgb24gYW4gYXMtbmVlZGVkIGJhc2lzIGJvdGggd2hlbiB0aGUgc3lzdGVtIGlzCisJICBidXN5IGFuZCB3aGVuIHRoZSBzeXN0ZW0gaXMgaWRsZS4KKworY29uZmlnIEhJR0hfUkVTX1RJTUVSUworCWJvb2wgIkhpZ2ggUmVzb2x1dGlvbiBUaW1lciBTdXBwb3J0IgorCWRlcGVuZHMgb24gR0VORVJJQ19USU1FICYmIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlzZWxlY3QgVElDS19PTkVTSE9UCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBoaWdoIHJlc29sdXRpb24gdGltZXIgc3VwcG9ydC4gSWYgeW91cgorCSAgaGFyZHdhcmUgaXMgbm90IGNhcGFibGUgdGhlbiB0aGlzIG9wdGlvbiBvbmx5IGluY3JlYXNlcworCSAgdGhlIHNpemUgb2YgdGhlIGtlcm5lbCBpbWFnZS4KKwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvTWFrZWZpbGUgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQppbmRleCA2MWEzOTA3Li45M2JjY2JhIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9NYWtlZmlsZQorKysgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQpAQCAtMSArMSw4IEBACi1vYmoteSArPSBudHAubyBjbG9ja3NvdXJjZS5vIGppZmZpZXMubworb2JqLXkgKz0gbnRwLm8gY2xvY2tzb3VyY2UubyBqaWZmaWVzLm8gdGltZXJfbGlzdC5vCisKK29iai0kKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTKQkJKz0gY2xvY2tldmVudHMubworb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMpCQkrPSB0aWNrLWNvbW1vbi5vCitvYmotJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpCSs9IHRpY2stYnJvYWRjYXN0Lm8KK29iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1vbmVzaG90Lm8KK29iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1zY2hlZC5vCitvYmotJChDT05GSUdfVElNRVJfU1RBVFMpCQkJKz0gdGltZXJfc3RhdHMubwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5MzJlYQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBsaW51eC9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB3aGljaCBtYW5hZ2UgY2xvY2sgZXZlbnQgZGV2aWNlcy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQoQykgMjAwNi0yMDA3LCBUaW1lc3lzIENvcnAuLCBUaG9tYXMgR2xlaXhuZXIKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuIEZvciBkZXRhaWxzIHNlZQorICoga2VybmVsLWJhc2UvQ09QWUlORy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKworLyogVGhlIHJlZ2lzdGVyZWQgY2xvY2sgZXZlbnQgZGV2aWNlcyAqLworc3RhdGljIExJU1RfSEVBRChjbG9ja2V2ZW50X2RldmljZXMpOworc3RhdGljIExJU1RfSEVBRChjbG9ja2V2ZW50c19yZWxlYXNlZCk7CisKKy8qIE5vdGlmaWNhdGlvbiBmb3IgY2xvY2sgZXZlbnRzICovCitzdGF0aWMgUkFXX05PVElGSUVSX0hFQUQoY2xvY2tldmVudHNfY2hhaW4pOworCisvKiBQcm90ZWN0aW9uIGZvciB0aGUgYWJvdmUgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xvY2tldmVudHNfbG9jayk7CisKKy8qKgorICogY2xvY2tldmVudHNfZGVsdGEybnMgLSBDb252ZXJ0IGEgbGF0Y2ggdmFsdWUgKGRldmljZSB0aWNrcykgdG8gbmFub3NlY29uZHMKKyAqIEBsYXRjaDoJdmFsdWUgdG8gY29udmVydAorICogQGV2dDoJcG9pbnRlciB0byBjbG9jayBldmVudCBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIE1hdGggaGVscGVyLCByZXR1cm5zIGxhdGNoIHZhbHVlIGNvbnZlcnRlZCB0byBuYW5vc2Vjb25kcyAoYm91bmQgY2hlY2tlZCkKKyAqLwordW5zaWduZWQgbG9uZyBjbG9ja2V2ZW50X2RlbHRhMm5zKHVuc2lnbmVkIGxvbmcgbGF0Y2gsCisJCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJdTY0IGNsYyA9ICgodTY0KSBsYXRjaCA8PCBldnQtPnNoaWZ0KTsKKworCWRvX2RpdihjbGMsIGV2dC0+bXVsdCk7CisJaWYgKGNsYyA8IDEwMDApCisJCWNsYyA9IDEwMDA7CisJaWYgKGNsYyA+IExPTkdfTUFYKQorCQljbGMgPSBMT05HX01BWDsKKworCXJldHVybiAodW5zaWduZWQgbG9uZykgY2xjOworfQorCisvKioKKyAqIGNsb2NrZXZlbnRzX3NldF9tb2RlIC0gc2V0IHRoZSBvcGVyYXRpbmcgbW9kZSBvZiBhIGNsb2NrIGV2ZW50IGRldmljZQorICogQGRldjoJZGV2aWNlIHRvIG1vZGlmeQorICogQG1vZGU6CW5ldyBtb2RlCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICEKKyAqLwordm9pZCBjbG9ja2V2ZW50c19zZXRfbW9kZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsCisJCQkJIGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlKQoreworCWlmIChkZXYtPm1vZGUgIT0gbW9kZSkgeworCQlkZXYtPnNldF9tb2RlKG1vZGUsIGRldik7CisJCWRldi0+bW9kZSA9IG1vZGU7CisJfQorfQorCisvKioKKyAqIGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQgLSBSZXByb2dyYW0gdGhlIGNsb2NrIGV2ZW50IGRldmljZS4KKyAqIEBleHBpcmVzOglhYnNvbHV0ZSBleHBpcnkgdGltZSAobW9ub3RvbmljIGNsb2NrKQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRVRJTUUgd2hlbiB0aGUgZXZlbnQgaXMgaW4gdGhlIHBhc3QuCisgKi8KK2ludCBjbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwga3RpbWVfdCBleHBpcmVzLAorCQkJICAgICAga3RpbWVfdCBub3cpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGNsYzsKKwlpbnQ2NF90IGRlbHRhOworCisJZGVsdGEgPSBrdGltZV90b19ucyhrdGltZV9zdWIoZXhwaXJlcywgbm93KSk7CisKKwlpZiAoZGVsdGEgPD0gMCkKKwkJcmV0dXJuIC1FVElNRTsKKworCWRldi0+bmV4dF9ldmVudCA9IGV4cGlyZXM7CisKKwlpZiAoZGV2LT5tb2RlID09IENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKQorCQlyZXR1cm4gMDsKKworCWlmIChkZWx0YSA+IGRldi0+bWF4X2RlbHRhX25zKQorCQlkZWx0YSA9IGRldi0+bWF4X2RlbHRhX25zOworCWlmIChkZWx0YSA8IGRldi0+bWluX2RlbHRhX25zKQorCQlkZWx0YSA9IGRldi0+bWluX2RlbHRhX25zOworCisJY2xjID0gZGVsdGEgKiBkZXYtPm11bHQ7CisJY2xjID4+PSBkZXYtPnNoaWZ0OworCisJcmV0dXJuIGRldi0+c2V0X25leHRfZXZlbnQoKHVuc2lnbmVkIGxvbmcpIGNsYywgZGV2KTsKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c19yZWdpc3Rlcl9ub3RpZmllciAtIHJlZ2lzdGVyIGEgY2xvY2sgZXZlbnRzIGNoYW5nZSBsaXN0ZW5lcgorICovCitpbnQgY2xvY2tldmVudHNfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKKwlyZXQgPSByYXdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmNsb2NrZXZlbnRzX2NoYWluLCBuYik7CisJc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c191bnJlZ2lzdGVyX25vdGlmaWVyIC0gdW5yZWdpc3RlciBhIGNsb2NrIGV2ZW50cyBjaGFuZ2UgbGlzdGVuZXIKKyAqLwordm9pZCBjbG9ja2V2ZW50c191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKKwlyYXdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmY2xvY2tldmVudHNfY2hhaW4sIG5iKTsKKwlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Cit9CisKKy8qCisgKiBOb3RpZnkgYWJvdXQgYSBjbG9jayBldmVudCBjaGFuZ2UuIENhbGxlZCB3aXRoIGNsb2NrZXZlbnRzX2xvY2sKKyAqIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGNsb2NrZXZlbnRzX2RvX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqZGV2KQoreworCXJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZjbG9ja2V2ZW50c19jaGFpbiwgcmVhc29uLCBkZXYpOworfQorCisvKgorICogQ2FsbGVkIGFmdGVyIGEgbm90aWZ5IGFkZCB0byBtYWtlIGRldmljZXMgYXZhaWxibGUgd2hpY2ggd2VyZQorICogcmVsZWFzZWQgZnJvbSB0aGUgbm90aWZpZXIgY2FsbC4KKyAqLworc3RhdGljIHZvaWQgY2xvY2tldmVudHNfbm90aWZ5X3JlbGVhc2VkKHZvaWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2OworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjbG9ja2V2ZW50c19yZWxlYXNlZCkpIHsKKwkJZGV2ID0gbGlzdF9lbnRyeShjbG9ja2V2ZW50c19yZWxlYXNlZC5uZXh0LAorCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBsaXN0KTsKKwkJbGlzdF9kZWwoJmRldi0+bGlzdCk7CisJCWxpc3RfYWRkKCZkZXYtPmxpc3QsICZjbG9ja2V2ZW50X2RldmljZXMpOworCQljbG9ja2V2ZW50c19kb19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9BREQsIGRldik7CisJfQorfQorCisvKioKKyAqIGNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSAtIHJlZ2lzdGVyIGEgY2xvY2sgZXZlbnQgZGV2aWNlCisgKiBAZGV2OglkZXZpY2UgdG8gcmVnaXN0ZXIKKyAqLwordm9pZCBjbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCUJVR19PTihkZXYtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfVU5VU0VEKTsKKworCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7CisKKwlsaXN0X2FkZCgmZGV2LT5saXN0LCAmY2xvY2tldmVudF9kZXZpY2VzKTsKKwljbG9ja2V2ZW50c19kb19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9BREQsIGRldik7CisJY2xvY2tldmVudHNfbm90aWZ5X3JlbGVhc2VkKCk7CisKKwlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Cit9CisKKy8qCisgKiBOb29wIGhhbmRsZXIgd2hlbiB3ZSBzaHV0IGRvd24gYW4gZXZlbnQgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGNsb2NrZXZlbnRzX2hhbmRsZV9ub29wKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UgLSByZWxlYXNlIGFuZCByZXF1ZXN0IGNsb2NrIGRldmljZXMKKyAqIEBvbGQ6CWRldmljZSB0byByZWxlYXNlIChjYW4gYmUgTlVMTCkKKyAqIEBuZXc6CWRldmljZSB0byByZXF1ZXN0IChjYW4gYmUgTlVMTCkKKyAqCisgKiBDYWxsZWQgZnJvbSB0aGUgbm90aWZpZXIgY2hhaW4uIGNsb2NrZXZlbnRzX2xvY2sgaXMgaGVsZCBhbHJlYWR5CisgKi8KK3ZvaWQgY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm9sZCwKKwkJCQkgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyoKKwkgKiBDYWxsZXIgcmVsZWFzZXMgYSBjbG9jayBldmVudCBkZXZpY2UuIFdlIHF1ZXVlIGl0IGludG8gdGhlCisJICogcmVsZWFzZWQgbGlzdCBhbmQgZG8gYSBub3RpZnkgYWRkIGxhdGVyLgorCSAqLworCWlmIChvbGQpIHsKKwkJb2xkLT5ldmVudF9oYW5kbGVyID0gY2xvY2tldmVudHNfaGFuZGxlX25vb3A7CisJCWNsb2NrZXZlbnRzX3NldF9tb2RlKG9sZCwgQ0xPQ0tfRVZUX01PREVfVU5VU0VEKTsKKwkJbGlzdF9kZWwoJm9sZC0+bGlzdCk7CisJCWxpc3RfYWRkKCZvbGQtPmxpc3QsICZjbG9ja2V2ZW50c19yZWxlYXNlZCk7CisJfQorCisJaWYgKG5ldykgeworCQlCVUdfT04obmV3LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX1VOVVNFRCk7CisJCWNsb2NrZXZlbnRzX3NldF9tb2RlKG5ldywgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qKgorICogY2xvY2tldmVudHNfcmVxdWVzdF9kZXZpY2UKKyAqLworc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xvY2tldmVudHNfcmVxdWVzdF9kZXZpY2UodW5zaWduZWQgaW50IGZlYXR1cmVzLAorCQkJCQkJICAgICAgY3B1bWFza190IGNwdW1hc2spCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY3VyLCAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlzcGluX2xvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJbGlzdF9mb3JfZWFjaCh0bXAsICZjbG9ja2V2ZW50X2RldmljZXMpIHsKKwkJY3VyID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UsIGxpc3QpOworCisJCWlmICgoY3VyLT5mZWF0dXJlcyAmIGZlYXR1cmVzKSA9PSBmZWF0dXJlcyAmJgorCQkgICAgY3B1c19lcXVhbChjcHVtYXNrLCBjdXItPmNwdW1hc2spKSB7CisJCQlpZiAoIWRldiB8fCBkZXYtPnJhdGluZyA8IGN1ci0+cmF0aW5nKQorCQkJCWRldiA9IGN1cjsKKwkJfQorCX0KKworCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShOVUxMLCBkZXYpOworCisJc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJcmV0dXJuIGRldjsKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c19yZWxlYXNlX2RldmljZQorICovCit2b2lkIGNsb2NrZXZlbnRzX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlzcGluX2xvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKGRldiwgTlVMTCk7CisJY2xvY2tldmVudHNfbm90aWZ5X3JlbGVhc2VkKCk7CisKKwlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Cit9CisKKy8qKgorICogY2xvY2tldmVudHNfbm90aWZ5IC0gbm90aWZpY2F0aW9uIGFib3V0IHJlbGV2YW50IGV2ZW50cworICovCit2b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKQoreworCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7CisJY2xvY2tldmVudHNfZG9fbm90aWZ5KHJlYXNvbiwgYXJnKTsKKworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBDTE9DS19FVlRfTk9USUZZX0NQVV9ERUFEOgorCQkvKgorCQkgKiBVbnJlZ2lzdGVyIHRoZSBjbG9jayBldmVudCBkZXZpY2VzIHdoaWNoIHdlcmUKKwkJICogcmVsZWFzZWQgZnJvbSB0aGUgdXNlcnMgaW4gdGhlIG5vdGlmeSBjaGFpbi4KKwkJICovCisJCXdoaWxlICghbGlzdF9lbXB0eSgmY2xvY2tldmVudHNfcmVsZWFzZWQpKSB7CisJCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXY7CisKKwkJCWRldiA9IGxpc3RfZW50cnkoY2xvY2tldmVudHNfcmVsZWFzZWQubmV4dCwKKwkJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UsIGxpc3QpOworCQkJbGlzdF9kZWwoJmRldi0+bGlzdCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNsb2NrZXZlbnRzX25vdGlmeSk7CisKKyNpZmRlZiBDT05GSUdfU1lTRlMKKworLyoqCisgKiBjbG9ja2V2ZW50c19zaG93X3JlZ2lzdGVyZWQgLSBzeXNmcyBpbnRlcmZhY2UgZm9yIGxpc3RpbmcgY2xvY2tldmVudHMKKyAqIEBkZXY6CXVudXNlZAorICogQGJ1ZjoJY2hhciBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggY2xvY2sgZXZlbnRzIGxpc3QKKyAqCisgKiBQcm92aWRlcyBzeXNmcyBpbnRlcmZhY2UgZm9yIGxpc3RpbmcgcmVnaXN0ZXJlZCBjbG9jayBldmVudCBkZXZpY2VzCisgKi8KK3N0YXRpYyBzc2l6ZV90IGNsb2NrZXZlbnRzX3Nob3dfcmVnaXN0ZXJlZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCWNoYXIgKnAgPSBidWY7CisJaW50IGNwdTsKKworCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNsb2NrZXZlbnRfZGV2aWNlcykgeworCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZTsKKworCQljZSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBsaXN0KTsKKwkJcCArPSBzcHJpbnRmKHAsICIlLTIwcyBGOiUwNHggTTolZCIsIGNlLT5uYW1lLAorCQkJICAgICBjZS0+ZmVhdHVyZXMsIGNlLT5tb2RlKTsKKwkJcCArPSBzcHJpbnRmKHAsICIgQzoiKTsKKwkJaWYgKCFjcHVzX2VxdWFsKGNlLT5jcHVtYXNrLCBjcHVfcG9zc2libGVfbWFwKSkgeworCQkJZm9yX2VhY2hfY3B1X21hc2soY3B1LCBjZS0+Y3B1bWFzaykKKwkJCQlwICs9IHNwcmludGYocCwgIiAlZCIsIGNwdSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRklYTUU6IEFkZCB0aGUgY3B1IHdoaWNoIGlzIGhhbmRsaW5nIHRoaXMgc3Vja2VyCisJCQkgKi8KKwkJfQorCQlwICs9IHNwcmludGYocCwgIlxuIik7CisJfQorCisJc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKKy8qCisgKiBTeXNmcyBzZXR1cCBiaXRzOgorICovCitzdGF0aWMgU1lTREVWX0FUVFIocmVnaXN0ZXJlZCwgMDYwMCwKKwkJICAgY2xvY2tldmVudHNfc2hvd19yZWdpc3RlcmVkLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgY2xvY2tldmVudHNfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgiY2xvY2tldmVudHMiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBjbG9ja2V2ZW50c19zeXNfZGV2aWNlID0geworCS5pZAk9IDAsCisJLmNscwk9ICZjbG9ja2V2ZW50c19zeXNjbGFzcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNsb2NrZXZlbnRzX3N5c2ZzX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmNsb2NrZXZlbnRzX3N5c2NsYXNzKTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZjbG9ja2V2ZW50c19zeXNfZGV2aWNlKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHN5c2Rldl9jcmVhdGVfZmlsZSgKKwkJCQkmY2xvY2tldmVudHNfc3lzX2RldmljZSwKKwkJCQkmYXR0cl9yZWdpc3RlcmVkKTsKKwlyZXR1cm4gZXJyb3I7Cit9CitkZXZpY2VfaW5pdGNhbGwoY2xvY2tldmVudHNfc3lzZnNfaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCmluZGV4IGQ5ZWYxNzYuLjE5M2EwNzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPiAvKiBmb3Igc3Bpbl91bmxvY2tfaXJxKCkgdXNpbmcgcHJlZW1wdF9jb3VudCgpIG02OGsgKi8KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAKIC8qIFhYWCAtIFdvdWxkIGxpa2UgYSBiZXR0ZXIgd2F5IGZvciBpbml0aWFsaXppbmcgY3Vycl9jbG9ja3NvdXJjZSAqLwogZXh0ZXJuIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9qaWZmaWVzOwpAQCAtNDgsNiArNDksNyBAQAogICovCiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpjdXJyX2Nsb2Nrc291cmNlID0gJmNsb2Nrc291cmNlX2ppZmZpZXM7CiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpuZXh0X2Nsb2Nrc291cmNlOworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSAqY2xvY2tzb3VyY2Vfb3ZlcnJpZGU7CiBzdGF0aWMgTElTVF9IRUFEKGNsb2Nrc291cmNlX2xpc3QpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhjbG9ja3NvdXJjZV9sb2NrKTsKIHN0YXRpYyBjaGFyIG92ZXJyaWRlX25hbWVbMzJdOwpAQCAtNjIsOSArNjQsMTIzIEBACiAJZmluaXNoZWRfYm9vdGluZyA9IDE7CiAJcmV0dXJuIDA7CiB9Ci0KIGxhdGVfaW5pdGNhbGwoY2xvY2tzb3VyY2VfZG9uZV9ib290aW5nKTsKIAorI2lmZGVmIENPTkZJR19DTE9DS1NPVVJDRV9XQVRDSERPRworc3RhdGljIExJU1RfSEVBRCh3YXRjaGRvZ19saXN0KTsKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgKndhdGNoZG9nOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOworc3RhdGljIERFRklORV9TUElOTE9DSyh3YXRjaGRvZ19sb2NrKTsKK3N0YXRpYyBjeWNsZV90IHdhdGNoZG9nX2xhc3Q7CisvKgorICogSW50ZXJ2YWw6IDAuNXNlYyBUcmVzaG9sZDogMC4wNjI1cworICovCisjZGVmaW5lIFdBVENIRE9HX0lOVEVSVkFMIChIWiA+PiAxKQorI2RlZmluZSBXQVRDSERPR19UUkVTSE9MRCAoTlNFQ19QRVJfU0VDID4+IDQpCisKK3N0YXRpYyB2b2lkIGNsb2Nrc291cmNlX3JhdGV3ZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCBpbnQ2NF90IGRlbHRhKQoreworCWlmIChkZWx0YSA+IC1XQVRDSERPR19UUkVTSE9MRCAmJiBkZWx0YSA8IFdBVENIRE9HX1RSRVNIT0xEKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJDbG9ja3NvdXJjZSAlcyB1bnN0YWJsZSAoZGVsdGEgPSAlTGQgbnMpXG4iLAorCSAgICAgICBjcy0+bmFtZSwgZGVsdGEpOworCWNzLT5mbGFncyAmPSB+KENMT0NLX1NPVVJDRV9WQUxJRF9GT1JfSFJFUyB8IENMT0NLX1NPVVJDRV9XQVRDSERPRyk7CisJY2xvY2tzb3VyY2VfY2hhbmdlX3JhdGluZyhjcywgMCk7CisJY3MtPmZsYWdzICY9IH5DTE9DS19TT1VSQ0VfV0FUQ0hET0c7CisJbGlzdF9kZWwoJmNzLT53ZF9saXN0KTsKK30KKworc3RhdGljIHZvaWQgY2xvY2tzb3VyY2Vfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsICp0bXA7CisJY3ljbGVfdCBjc25vdywgd2Rub3c7CisJaW50NjRfdCB3ZF9uc2VjLCBjc19uc2VjOworCisJc3Bpbl9sb2NrKCZ3YXRjaGRvZ19sb2NrKTsKKworCXdkbm93ID0gd2F0Y2hkb2ctPnJlYWQoKTsKKwl3ZF9uc2VjID0gY3ljMm5zKHdhdGNoZG9nLCAod2Rub3cgLSB3YXRjaGRvZ19sYXN0KSAmIHdhdGNoZG9nLT5tYXNrKTsKKwl3YXRjaGRvZ19sYXN0ID0gd2Rub3c7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3MsIHRtcCwgJndhdGNoZG9nX2xpc3QsIHdkX2xpc3QpIHsKKwkJY3Nub3cgPSBjcy0+cmVhZCgpOworCQkvKiBJbml0aWFsaXplZCA/ICovCisJCWlmICghKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9XQVRDSERPRykpIHsKKwkJCWlmICgoY3MtPmZsYWdzICYgQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMpICYmCisJCQkgICAgKHdhdGNoZG9nLT5mbGFncyAmIENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTKSkgeworCQkJCWNzLT5mbGFncyB8PSBDTE9DS19TT1VSQ0VfVkFMSURfRk9SX0hSRVM7CisJCQkJLyoKKwkJCQkgKiBXZSBqdXN0IG1hcmtlZCB0aGUgY2xvY2tzb3VyY2UgYXMKKwkJCQkgKiBoaWdocmVzLWNhcGFibGUsIG5vdGlmeSB0aGUgcmVzdCBvZiB0aGUKKwkJCQkgKiBzeXN0ZW0gYXMgd2VsbCBzbyB0aGF0IHdlIHRyYW5zaXRpb24KKwkJCQkgKiBpbnRvIGhpZ2gtcmVzIG1vZGU6CisJCQkJICovCisJCQkJdGlja19jbG9ja19ub3RpZnkoKTsKKwkJCX0KKwkJCWNzLT5mbGFncyB8PSBDTE9DS19TT1VSQ0VfV0FUQ0hET0c7CisJCQljcy0+d2RfbGFzdCA9IGNzbm93OworCQl9IGVsc2UgeworCQkJY3NfbnNlYyA9IGN5YzJucyhjcywgKGNzbm93IC0gY3MtPndkX2xhc3QpICYgY3MtPm1hc2spOworCQkJY3MtPndkX2xhc3QgPSBjc25vdzsKKwkJCS8qIENoZWNrIHRoZSBkZWx0YS4gTWlnaHQgcmVtb3ZlIGZyb20gdGhlIGxpc3QgISAqLworCQkJY2xvY2tzb3VyY2VfcmF0ZXdkKGNzLCBjc19uc2VjIC0gd2RfbnNlYyk7CisJCX0KKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJndhdGNoZG9nX2xpc3QpKSB7CisJCV9fbW9kX3RpbWVyKCZ3YXRjaGRvZ190aW1lciwKKwkJCSAgICB3YXRjaGRvZ190aW1lci5leHBpcmVzICsgV0FUQ0hET0dfSU5URVJWQUwpOworCX0KKwlzcGluX3VubG9jaygmd2F0Y2hkb2dfbG9jayk7Cit9CitzdGF0aWMgdm9pZCBjbG9ja3NvdXJjZV9jaGVja193YXRjaGRvZyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3NlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F0Y2hkb2dfbG9jaywgZmxhZ3MpOworCWlmIChjcy0+ZmxhZ3MgJiBDTE9DS19TT1VSQ0VfTVVTVF9WRVJJRlkpIHsKKwkJaW50IHN0YXJ0ZWQgPSAhbGlzdF9lbXB0eSgmd2F0Y2hkb2dfbGlzdCk7CisKKwkJbGlzdF9hZGQoJmNzLT53ZF9saXN0LCAmd2F0Y2hkb2dfbGlzdCk7CisJCWlmICghc3RhcnRlZCAmJiB3YXRjaGRvZykgeworCQkJd2F0Y2hkb2dfbGFzdCA9IHdhdGNoZG9nLT5yZWFkKCk7CisJCQl3YXRjaGRvZ190aW1lci5leHBpcmVzID0gamlmZmllcyArIFdBVENIRE9HX0lOVEVSVkFMOworCQkJYWRkX3RpbWVyKCZ3YXRjaGRvZ190aW1lcik7CisJCX0KKwl9IGVsc2UgaWYgKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTKSB7CisJCQljcy0+ZmxhZ3MgfD0gQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTOworCisJCWlmICghd2F0Y2hkb2cgfHwgY3MtPnJhdGluZyA+IHdhdGNoZG9nLT5yYXRpbmcpIHsKKwkJCWlmICh3YXRjaGRvZykKKwkJCQlkZWxfdGltZXIoJndhdGNoZG9nX3RpbWVyKTsKKwkJCXdhdGNoZG9nID0gY3M7CisJCQlpbml0X3RpbWVyKCZ3YXRjaGRvZ190aW1lcik7CisJCQl3YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9IGNsb2Nrc291cmNlX3dhdGNoZG9nOworCisJCQkvKiBSZXNldCB3YXRjaGRvZyBjeWNsZXMgKi8KKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3NlLCAmd2F0Y2hkb2dfbGlzdCwgd2RfbGlzdCkKKwkJCQljc2UtPmZsYWdzICY9IH5DTE9DS19TT1VSQ0VfV0FUQ0hET0c7CisJCQkvKiBTdGFydCBpZiBsaXN0IGlzIG5vdCBlbXB0eSAqLworCQkJaWYgKCFsaXN0X2VtcHR5KCZ3YXRjaGRvZ19saXN0KSkgeworCQkJCXdhdGNoZG9nX2xhc3QgPSB3YXRjaGRvZy0+cmVhZCgpOworCQkJCXdhdGNoZG9nX3RpbWVyLmV4cGlyZXMgPQorCQkJCQlqaWZmaWVzICsgV0FUQ0hET0dfSU5URVJWQUw7CisJCQkJYWRkX3RpbWVyKCZ3YXRjaGRvZ190aW1lcik7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2F0Y2hkb2dfbG9jaywgZmxhZ3MpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGNsb2Nrc291cmNlX2NoZWNrX3dhdGNoZG9nKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJaWYgKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTKQorCQljcy0+ZmxhZ3MgfD0gQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTOworfQorI2VuZGlmCisKIC8qKgogICogY2xvY2tzb3VyY2VfZ2V0X25leHQgLSBSZXR1cm5zIHRoZSBzZWxlY3RlZCBjbG9ja3NvdXJjZQogICoKQEAgLTg0LDYwICsyMDAsNTQgQEAKIH0KIAogLyoqCi0gKiBzZWxlY3RfY2xvY2tzb3VyY2UgLSBGaW5kcyB0aGUgYmVzdCByZWdpc3RlcmVkIGNsb2Nrc291cmNlLgorICogc2VsZWN0X2Nsb2Nrc291cmNlIC0gU2VsZWN0cyB0aGUgYmVzdCByZWdpc3RlcmVkIGNsb2Nrc291cmNlLgogICoKICAqIFByaXZhdGUgZnVuY3Rpb24uIE11c3QgaG9sZCBjbG9ja3NvdXJjZV9sb2NrIHdoZW4gY2FsbGVkLgogICoKLSAqIExvb2tzIHRocm91Z2ggdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBjbG9ja3NvdXJjZXMsIHJldHVybmluZwotICogdGhlIG9uZSB3aXRoIHRoZSBoaWdoZXN0IHJhdGluZyB2YWx1ZS4gSWYgdGhlcmUgaXMgYSBjbG9ja3NvdXJjZQotICogbmFtZSB0aGF0IG1hdGNoZXMgdGhlIG92ZXJyaWRlIHN0cmluZywgaXQgcmV0dXJucyB0aGF0IGNsb2Nrc291cmNlLgorICogU2VsZWN0IHRoZSBjbG9ja3NvdXJjZSB3aXRoIHRoZSBiZXN0IHJhdGluZywgb3IgdGhlIGNsb2Nrc291cmNlLAorICogd2hpY2ggaXMgc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIG92ZXJyaWRlLgogICovCiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpzZWxlY3RfY2xvY2tzb3VyY2Uodm9pZCkKIHsKLQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmJlc3QgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgKm5leHQ7CiAKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNsb2Nrc291cmNlX2xpc3QpIHsKLQkJc3RydWN0IGNsb2Nrc291cmNlICpzcmM7CisJaWYgKGxpc3RfZW1wdHkoJmNsb2Nrc291cmNlX2xpc3QpKQorCQlyZXR1cm4gTlVMTDsKIAotCQlzcmMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNsb2Nrc291cmNlLCBsaXN0KTsKLQkJaWYgKCFiZXN0KQotCQkJYmVzdCA9IHNyYzsKKwlpZiAoY2xvY2tzb3VyY2Vfb3ZlcnJpZGUpCisJCW5leHQgPSBjbG9ja3NvdXJjZV9vdmVycmlkZTsKKwllbHNlCisJCW5leHQgPSBsaXN0X2VudHJ5KGNsb2Nrc291cmNlX2xpc3QubmV4dCwgc3RydWN0IGNsb2Nrc291cmNlLAorCQkJCSAgbGlzdCk7CiAKLQkJLyogY2hlY2sgZm9yIG92ZXJyaWRlOiAqLwotCQlpZiAoc3RybGVuKHNyYy0+bmFtZSkgPT0gc3RybGVuKG92ZXJyaWRlX25hbWUpICYmCi0JCSAgICAhc3RyY21wKHNyYy0+bmFtZSwgb3ZlcnJpZGVfbmFtZSkpIHsKLQkJCWJlc3QgPSBzcmM7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBwaWNrIHRoZSBoaWdoZXN0IHJhdGluZzogKi8KLQkJaWYgKHNyYy0+cmF0aW5nID4gYmVzdC0+cmF0aW5nKQotCQkgCWJlc3QgPSBzcmM7Ci0JfQorCWlmIChuZXh0ID09IGN1cnJfY2xvY2tzb3VyY2UpCisJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIGJlc3Q7CisJcmV0dXJuIG5leHQ7CiB9CiAKLS8qKgotICogaXNfcmVnaXN0ZXJlZF9zb3VyY2UgLSBDaGVja3MgaWYgY2xvY2tzb3VyY2UgaXMgcmVnaXN0ZXJlZAotICogQGM6CQlwb2ludGVyIHRvIGEgY2xvY2tzb3VyY2UKLSAqCi0gKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbi4gTXVzdCBob2xkIGNsb2Nrc291cmNlX2xvY2sgd2hlbiBjYWxsZWQuCi0gKgotICogUmV0dXJucyBvbmUgaWYgdGhlIGNsb2Nrc291cmNlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgemVybyBvdGhlcndpc2UuCisvKgorICogRW5xdWV1ZSB0aGUgY2xvY2tzb3VyY2Ugc29ydGVkIGJ5IHJhdGluZwogICovCi1zdGF0aWMgaW50IGlzX3JlZ2lzdGVyZWRfc291cmNlKHN0cnVjdCBjbG9ja3NvdXJjZSAqYykKK3N0YXRpYyBpbnQgY2xvY2tzb3VyY2VfZW5xdWV1ZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmMpCiB7Ci0JaW50IGxlbiA9IHN0cmxlbihjLT5uYW1lKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqZW50cnkgPSAmY2xvY2tzb3VyY2VfbGlzdDsKIAogCWxpc3RfZm9yX2VhY2godG1wLCAmY2xvY2tzb3VyY2VfbGlzdCkgewotCQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKnNyYzsKKwkJc3RydWN0IGNsb2Nrc291cmNlICpjczsKIAotCQlzcmMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNsb2Nrc291cmNlLCBsaXN0KTsKLQkJaWYgKHN0cmxlbihzcmMtPm5hbWUpID09IGxlbiAmJgkhc3RyY21wKHNyYy0+bmFtZSwgYy0+bmFtZSkpCi0JCQlyZXR1cm4gMTsKKwkJY3MgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNsb2Nrc291cmNlLCBsaXN0KTsKKwkJaWYgKGNzID09IGMpCisJCQlyZXR1cm4gLUVCVVNZOworCQkvKiBLZWVwIHRyYWNrIG9mIHRoZSBwbGFjZSwgd2hlcmUgdG8gaW5zZXJ0ICovCisJCWlmIChjcy0+cmF0aW5nID49IGMtPnJhdGluZykKKwkJCWVudHJ5ID0gdG1wOwogCX0KKwlsaXN0X2FkZCgmYy0+bGlzdCwgZW50cnkpOworCisJaWYgKHN0cmxlbihjLT5uYW1lKSA9PSBzdHJsZW4ob3ZlcnJpZGVfbmFtZSkgJiYKKwkgICAgIXN0cmNtcChjLT5uYW1lLCBvdmVycmlkZV9uYW1lKSkKKwkJY2xvY2tzb3VyY2Vfb3ZlcnJpZGUgPSBjOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTAsNDIgKzI2MCwzNSBAQAogICovCiBpbnQgY2xvY2tzb3VyY2VfcmVnaXN0ZXIoc3RydWN0IGNsb2Nrc291cmNlICpjKQogewotCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja3NvdXJjZV9sb2NrLCBmbGFncyk7Ci0JLyogY2hlY2sgaWYgY2xvY2tzb3VyY2UgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCi0JaWYgKGlzX3JlZ2lzdGVyZWRfc291cmNlKGMpKSB7Ci0JCXByaW50aygicmVnaXN0ZXJfY2xvY2tzb3VyY2U6IENhbm5vdCByZWdpc3RlciAlcy4gIgotCQkgICAgICAgIkFscmVhZHkgcmVnaXN0ZXJlZCEiLCBjLT5uYW1lKTsKLQkJcmV0ID0gLUVCVVNZOwotCX0gZWxzZSB7Ci0JCS8qIHJlZ2lzdGVyIGl0ICovCi0gCQlsaXN0X2FkZCgmYy0+bGlzdCwgJmNsb2Nrc291cmNlX2xpc3QpOwotCQkvKiBzY2FuIHRoZSByZWdpc3RlcmVkIGNsb2Nrc291cmNlcywgYW5kIHBpY2sgdGhlIGJlc3Qgb25lICovCisJcmV0ID0gY2xvY2tzb3VyY2VfZW5xdWV1ZShjKTsKKwlpZiAoIXJldCkKIAkJbmV4dF9jbG9ja3NvdXJjZSA9IHNlbGVjdF9jbG9ja3NvdXJjZSgpOwotCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja3NvdXJjZV9sb2NrLCBmbGFncyk7CisJaWYgKCFyZXQpCisJCWNsb2Nrc291cmNlX2NoZWNrX3dhdGNoZG9nKGMpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGNsb2Nrc291cmNlX3JlZ2lzdGVyKTsKIAogLyoqCi0gKiBjbG9ja3NvdXJjZV9yZXNlbGVjdCAtIFJlc2NhbiBsaXN0IGZvciBuZXh0IGNsb2Nrc291cmNlCisgKiBjbG9ja3NvdXJjZV9jaGFuZ2VfcmF0aW5nIC0gQ2hhbmdlIHRoZSByYXRpbmcgb2YgYSByZWdpc3RlcmVkIGNsb2Nrc291cmNlCiAgKgotICogQSBxdWljayBoZWxwZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBpZiBhIGNsb2Nrc291cmNlIGNoYW5nZXMgaXRzCi0gKiByYXRpbmcuIEZvcmNlcyB0aGUgY2xvY2tzb3VyY2UgbGlzdCB0byBiZSByZS1zY2FubmVkIGZvciB0aGUgYmVzdAotICogY2xvY2tzb3VyY2UuCiAgKi8KLXZvaWQgY2xvY2tzb3VyY2VfcmVzZWxlY3Qodm9pZCkKK3ZvaWQgY2xvY2tzb3VyY2VfY2hhbmdlX3JhdGluZyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCBpbnQgcmF0aW5nKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZjcy0+bGlzdCk7CisJY3MtPnJhdGluZyA9IHJhdGluZzsKKwljbG9ja3NvdXJjZV9lbnF1ZXVlKGNzKTsKIAluZXh0X2Nsb2Nrc291cmNlID0gc2VsZWN0X2Nsb2Nrc291cmNlKCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChjbG9ja3NvdXJjZV9yZXNlbGVjdCk7CiAKICNpZmRlZiBDT05GSUdfU1lTRlMKIC8qKgpAQCAtMjIxLDcgKzMyNCwxMSBAQAogc3RhdGljIHNzaXplX3Qgc3lzZnNfb3ZlcnJpZGVfY2xvY2tzb3VyY2Uoc3RydWN0IHN5c19kZXZpY2UgKmRldiwKIAkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgKm92ciA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCXNpemVfdCByZXQgPSBjb3VudDsKKwlpbnQgbGVuOworCiAJLyogc3RyaW5ncyBmcm9tIHN5c2ZzIHdyaXRlIGFyZSBub3QgMCB0ZXJtaW5hdGVkISAqLwogCWlmIChjb3VudCA+PSBzaXplb2Yob3ZlcnJpZGVfbmFtZSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI5LDE3ICszMzYsMzIgQEAKIAkvKiBzdHJpcCBvZiBcbjogKi8KIAlpZiAoYnVmW2NvdW50LTFdID09ICdcbicpCiAJCWNvdW50LS07Ci0JaWYgKGNvdW50IDwgMSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxKCZjbG9ja3NvdXJjZV9sb2NrKTsKIAotCS8qIGNvcHkgdGhlIG5hbWUgZ2l2ZW46ICovCi0JbWVtY3B5KG92ZXJyaWRlX25hbWUsIGJ1ZiwgY291bnQpOworCWlmIChjb3VudCA+IDApCisJCW1lbWNweShvdmVycmlkZV9uYW1lLCBidWYsIGNvdW50KTsKIAlvdmVycmlkZV9uYW1lW2NvdW50XSA9IDA7CiAKLQkvKiB0cnkgdG8gc2VsZWN0IGl0OiAqLwotCW5leHRfY2xvY2tzb3VyY2UgPSBzZWxlY3RfY2xvY2tzb3VyY2UoKTsKKwlsZW4gPSBzdHJsZW4ob3ZlcnJpZGVfbmFtZSk7CisJaWYgKGxlbikgeworCQlvdnIgPSBjbG9ja3NvdXJjZV9vdmVycmlkZTsKKwkJLyogdHJ5IHRvIHNlbGVjdCBpdDogKi8KKwkJbGlzdF9mb3JfZWFjaCh0bXAsICZjbG9ja3NvdXJjZV9saXN0KSB7CisJCQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzOworCisJCQljcyA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2xvY2tzb3VyY2UsIGxpc3QpOworCQkJaWYgKHN0cmxlbihjcy0+bmFtZSkgPT0gbGVuICYmCisJCQkgICAgIXN0cmNtcChjcy0+bmFtZSwgb3ZlcnJpZGVfbmFtZSkpCisJCQkJb3ZyID0gY3M7CisJCX0KKwl9CisKKwkvKiBSZXNlbGVjdCwgd2hlbiB0aGUgb3ZlcnJpZGUgbmFtZSBoYXMgY2hhbmdlZCAqLworCWlmIChvdnIgIT0gY2xvY2tzb3VyY2Vfb3ZlcnJpZGUpIHsKKwkJY2xvY2tzb3VyY2Vfb3ZlcnJpZGUgPSBvdnI7CisJCW5leHRfY2xvY2tzb3VyY2UgPSBzZWxlY3RfY2xvY2tzb3VyY2UoKTsKKwl9CiAKIAlzcGluX3VubG9ja19pcnEoJmNsb2Nrc291cmNlX2xvY2spOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9qaWZmaWVzLmMgYi9rZXJuZWwvdGltZS9qaWZmaWVzLmMKaW5kZXggYTk5YjJhNi4uM2JlOGRhOCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvamlmZmllcy5jCisrKyBiL2tlcm5lbC90aW1lL2ppZmZpZXMuYwpAQCAtNjIsNyArNjIsNiBAQAogCS5tYXNrCQk9IDB4ZmZmZmZmZmYsIC8qMzJiaXRzKi8KIAkubXVsdAkJPSBOU0VDX1BFUl9KSUZGWSA8PCBKSUZGSUVTX1NISUZULCAvKiBkZXRhaWxzIGFib3ZlICovCiAJLnNoaWZ0CQk9IEpJRkZJRVNfU0hJRlQsCi0JLmlzX2NvbnRpbnVvdXMJPSAwLCAvKiB0aWNrIGJhc2VkLCBub3QgZnJlZSBydW5uaW5nICovCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2ppZmZpZXNfY2xvY2tzb3VyY2Uodm9pZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL250cC5jIGIva2VybmVsL3RpbWUvbnRwLmMKaW5kZXggM2FmZWFhMy4uZWIxMjUwOSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvbnRwLmMKKysrIGIva2VybmVsL3RpbWUvbnRwLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2RlZmluZSBNQVhfVElDS0FESgkJNTAwCQkvKiBtaWNyb3NlY3MgKi8KICNkZWZpbmUgTUFYX1RJQ0tBREpfU0NBTEVECSgoKHU2NCkoTUFYX1RJQ0tBREogKiBOU0VDX1BFUl9VU0VDKSA8PCBcCi0JCQkJICBUSUNLX0xFTkdUSF9TSElGVCkgLyBIWikKKwkJCQkgIFRJQ0tfTEVOR1RIX1NISUZUKSAvIE5UUF9JTlRFUlZBTF9GUkVRKQogCiAvKgogICogcGhhc2UtbG9jayBsb29wIHZhcmlhYmxlcwpAQCAtNDYsMTMgKzQ2LDE3IEBACiAKIHN0YXRpYyB2b2lkIG50cF91cGRhdGVfZnJlcXVlbmN5KHZvaWQpCiB7Ci0JdGlja19sZW5ndGhfYmFzZSA9ICh1NjQpKHRpY2tfdXNlYyAqIE5TRUNfUEVSX1VTRUMgKiBVU0VSX0haKSA8PCBUSUNLX0xFTkdUSF9TSElGVDsKLQl0aWNrX2xlbmd0aF9iYXNlICs9IChzNjQpQ0xPQ0tfVElDS19BREpVU1QgPDwgVElDS19MRU5HVEhfU0hJRlQ7Ci0JdGlja19sZW5ndGhfYmFzZSArPSAoczY0KXRpbWVfZnJlcSA8PCAoVElDS19MRU5HVEhfU0hJRlQgLSBTSElGVF9OU0VDKTsKKwl1NjQgc2Vjb25kX2xlbmd0aCA9ICh1NjQpKHRpY2tfdXNlYyAqIE5TRUNfUEVSX1VTRUMgKiBVU0VSX0haKQorCQkJCTw8IFRJQ0tfTEVOR1RIX1NISUZUOworCXNlY29uZF9sZW5ndGggKz0gKHM2NClDTE9DS19USUNLX0FESlVTVCA8PCBUSUNLX0xFTkdUSF9TSElGVDsKKwlzZWNvbmRfbGVuZ3RoICs9IChzNjQpdGltZV9mcmVxIDw8IChUSUNLX0xFTkdUSF9TSElGVCAtIFNISUZUX05TRUMpOwogCi0JZG9fZGl2KHRpY2tfbGVuZ3RoX2Jhc2UsIEhaKTsKKwl0aWNrX2xlbmd0aF9iYXNlID0gc2Vjb25kX2xlbmd0aDsKIAotCXRpY2tfbnNlYyA9IHRpY2tfbGVuZ3RoX2Jhc2UgPj4gVElDS19MRU5HVEhfU0hJRlQ7CisJZG9fZGl2KHNlY29uZF9sZW5ndGgsIEhaKTsKKwl0aWNrX25zZWMgPSBzZWNvbmRfbGVuZ3RoID4+IFRJQ0tfTEVOR1RIX1NISUZUOworCisJZG9fZGl2KHRpY2tfbGVuZ3RoX2Jhc2UsIE5UUF9JTlRFUlZBTF9GUkVRKTsKIH0KIAogLyoqCkBAIC0xNjIsNyArMTY2LDcgQEAKIAkJCXRpY2tfbGVuZ3RoIC09IE1BWF9USUNLQURKX1NDQUxFRDsKIAkJfSBlbHNlIHsKIAkJCXRpY2tfbGVuZ3RoICs9IChzNjQpKHRpbWVfYWRqdXN0ICogTlNFQ19QRVJfVVNFQyAvCi0JCQkJCSAgICAgSFopIDw8IFRJQ0tfTEVOR1RIX1NISUZUOworCQkJCQlOVFBfSU5URVJWQUxfRlJFUSkgPDwgVElDS19MRU5HVEhfU0hJRlQ7CiAJCQl0aW1lX2FkanVzdCA9IDA7CiAJCX0KIAl9CkBAIC0yMzksNyArMjQzLDggQEAKIAkJICAgIHJlc3VsdCA9IC1FSU5WQUw7CiAJCSAgICBnb3RvIGxlYXZlOwogCQl9Ci0JCXRpbWVfZnJlcSA9ICgoczY0KXR4Yy0+ZnJlcSAqIE5TRUNfUEVSX1VTRUMpID4+IChTSElGVF9VU0VDIC0gU0hJRlRfTlNFQyk7CisJCXRpbWVfZnJlcSA9ICgoczY0KXR4Yy0+ZnJlcSAqIE5TRUNfUEVSX1VTRUMpCisJCQkJPj4gKFNISUZUX1VTRUMgLSBTSElGVF9OU0VDKTsKIAkgICAgfQogCiAJICAgIGlmICh0eGMtPm1vZGVzICYgQURKX01BWEVSUk9SKSB7CkBAIC0zMDksNyArMzE0LDggQEAKIAkJICAgIGZyZXFfYWRqICs9IHRpbWVfZnJlcTsKIAkJICAgIGZyZXFfYWRqID0gbWluKGZyZXFfYWRqLCAoczY0KU1BWEZSRVFfTlNFQyk7CiAJCSAgICB0aW1lX2ZyZXEgPSBtYXgoZnJlcV9hZGosIChzNjQpLU1BWEZSRVFfTlNFQyk7Ci0JCSAgICB0aW1lX29mZnNldCA9ICh0aW1lX29mZnNldCAvIEhaKSA8PCBTSElGVF9VUERBVEU7CisJCSAgICB0aW1lX29mZnNldCA9ICh0aW1lX29mZnNldCAvIE5UUF9JTlRFUlZBTF9GUkVRKQorCQkgICAgCQkJPDwgU0hJRlRfVVBEQVRFOwogCQl9IC8qIFNUQV9QTEwgKi8KIAkgICAgfSAvKiB0eGMtPm1vZGVzICYgQURKX09GRlNFVCAqLwogCSAgICBpZiAodHhjLT5tb2RlcyAmIEFESl9USUNLKQpAQCAtMzI0LDggKzMzMCwxMCBAQAogCWlmICgodHhjLT5tb2RlcyAmIEFESl9PRkZTRVRfU0lOR0xFU0hPVCkgPT0gQURKX09GRlNFVF9TSU5HTEVTSE9UKQogCSAgICB0eGMtPm9mZnNldAkgICA9IHNhdmVfYWRqdXN0OwogCWVsc2UKLQkgICAgdHhjLT5vZmZzZXQgICAgPSBzaGlmdF9yaWdodCh0aW1lX29mZnNldCwgU0hJRlRfVVBEQVRFKSAqIEhaIC8gMTAwMDsKLQl0eGMtPmZyZXEJICAgPSAodGltZV9mcmVxIC8gTlNFQ19QRVJfVVNFQykgPDwgKFNISUZUX1VTRUMgLSBTSElGVF9OU0VDKTsKKwkgICAgdHhjLT5vZmZzZXQgICAgPSBzaGlmdF9yaWdodCh0aW1lX29mZnNldCwgU0hJRlRfVVBEQVRFKQorCSAgICAJCQkqIE5UUF9JTlRFUlZBTF9GUkVRIC8gMTAwMDsKKwl0eGMtPmZyZXEJICAgPSAodGltZV9mcmVxIC8gTlNFQ19QRVJfVVNFQykKKwkJCQk8PCAoU0hJRlRfVVNFQyAtIFNISUZUX05TRUMpOwogCXR4Yy0+bWF4ZXJyb3IJICAgPSB0aW1lX21heGVycm9yOwogCXR4Yy0+ZXN0ZXJyb3IJICAgPSB0aW1lX2VzdGVycm9yOwogCXR4Yy0+c3RhdHVzCSAgID0gdGltZV9zdGF0dXM7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmIzZWZlCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHdoaWNoIGVtdWxhdGUgYSBsb2NhbCBjbG9jay1ldmVudAorICogZGV2aWNlIHZpYSBhIGJyb2FkY2FzdCBldmVudCBzb3VyY2UuCisgKgorICogQ29weXJpZ2h0KEMpIDIwMDUtMjAwNiwgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA3LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogQ29weXJpZ2h0KEMpIDIwMDYtMjAwNywgVGltZXN5cyBDb3JwLiwgVGhvbWFzIEdsZWl4bmVyCisgKgorICogVGhpcyBjb2RlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBHUEwgdmVyc2lvbiAyLiBGb3IgZGV0YWlscyBzZWUKKyAqIGtlcm5lbC1iYXNlL0NPUFlJTkcuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgorCisjaW5jbHVkZSAidGljay1pbnRlcm5hbC5oIgorCisvKgorICogQnJvYWRjYXN0IHN1cHBvcnQgZm9yIGJyb2tlbiB4ODYgaGFyZHdhcmUsIHdoZXJlIHRoZSBsb2NhbCBhcGljCisgKiB0aW1lciBzdG9wcyBpbiBDMyBzdGF0ZS4KKyAqLworCitzdHJ1Y3QgdGlja19kZXZpY2UgdGlja19icm9hZGNhc3RfZGV2aWNlOworc3RhdGljIGNwdW1hc2tfdCB0aWNrX2Jyb2FkY2FzdF9tYXNrOworc3RhdGljIERFRklORV9TUElOTE9DSyh0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKKworLyoKKyAqIERlYnVnZ2luZzogc2VlIHRpbWVyX2xpc3QuYworICovCitzdHJ1Y3QgdGlja19kZXZpY2UgKnRpY2tfZ2V0X2Jyb2FkY2FzdF9kZXZpY2Uodm9pZCkKK3sKKwlyZXR1cm4gJnRpY2tfYnJvYWRjYXN0X2RldmljZTsKK30KKworY3B1bWFza190ICp0aWNrX2dldF9icm9hZGNhc3RfbWFzayh2b2lkKQoreworCXJldHVybiAmdGlja19icm9hZGNhc3RfbWFzazsKK30KKworLyoKKyAqIFN0YXJ0IHRoZSBkZXZpY2UgaW4gcGVyaW9kaWMgbW9kZQorICovCitzdGF0aWMgdm9pZCB0aWNrX2Jyb2FkY2FzdF9zdGFydF9wZXJpb2RpYyhzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKK3sKKwlpZiAoYmMgJiYgYmMtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pCisJCXRpY2tfc2V0dXBfcGVyaW9kaWMoYmMsIDEpOworfQorCisvKgorICogQ2hlY2ssIGlmIHRoZSBkZXZpY2UgY2FuIGJlIHV0aWxpemVkIGFzIGJyb2FkY2FzdCBkZXZpY2U6CisgKi8KK2ludCB0aWNrX2NoZWNrX2Jyb2FkY2FzdF9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCWlmICh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2IHx8CisJICAgIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfQzNTVE9QKSkKKwkJcmV0dXJuIDA7CisKKwljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoTlVMTCwgZGV2KTsKKwl0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2ID0gZGV2OworCWlmICghY3B1c19lbXB0eSh0aWNrX2Jyb2FkY2FzdF9tYXNrKSkKKwkJdGlja19icm9hZGNhc3Rfc3RhcnRfcGVyaW9kaWMoZGV2KTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENoZWNrLCBpZiB0aGUgZGV2aWNlIGlzIHRoZSBicm9hZGNhc3QgZGV2aWNlCisgKi8KK2ludCB0aWNrX2lzX2Jyb2FkY2FzdF9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCXJldHVybiAoZGV2ICYmIHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXYgPT0gZGV2KTsKK30KKworLyoKKyAqIENoZWNrLCBpZiB0aGUgZGV2aWNlIGlzIGRpc2Z1bmN0aW9uYWwgYW5kIGEgcGxhY2UgaG9sZGVyLCB3aGljaAorICogbmVlZHMgdG8gYmUgaGFuZGxlZCBieSB0aGUgYnJvYWRjYXN0IGRldmljZS4KKyAqLworaW50IHRpY2tfZGV2aWNlX3VzZXNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogRGV2aWNlcyBtaWdodCBiZSByZWdpc3RlcmVkIHdpdGggYm90aCBwZXJpb2RpYyBhbmQgb25lc2hvdAorCSAqIG1vZGUgZGlzYWJsZWQuIFRoaXMgc2lnbmFscywgdGhhdCB0aGUgZGV2aWNlIG5lZWRzIHRvIGJlCisJICogb3BlcmF0ZWQgZnJvbSB0aGUgYnJvYWRjYXN0IGRldmljZSBhbmQgaXMgYSBwbGFjZWhvbGRlciBmb3IKKwkgKiB0aGUgY3B1IGxvY2FsIGRldmljZS4KKwkgKi8KKwlpZiAoIXRpY2tfZGV2aWNlX2lzX2Z1bmN0aW9uYWwoZGV2KSkgeworCQlkZXYtPmV2ZW50X2hhbmRsZXIgPSB0aWNrX2hhbmRsZV9wZXJpb2RpYzsKKwkJY3B1X3NldChjcHUsIHRpY2tfYnJvYWRjYXN0X21hc2spOworCQl0aWNrX2Jyb2FkY2FzdF9zdGFydF9wZXJpb2RpYyh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2KTsKKwkJcmV0ID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEJyb2FkY2FzdCB0aGUgZXZlbnQgdG8gdGhlIGNwdXMsIHdoaWNoIGFyZSBzZXQgaW4gdGhlIG1hc2sKKyAqLworaW50IHRpY2tfZG9fYnJvYWRjYXN0KGNwdW1hc2tfdCBtYXNrKQoreworCWludCByZXQgPSAwLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKKworCS8qCisJICogQ2hlY2ssIGlmIHRoZSBjdXJyZW50IGNwdSBpcyBpbiB0aGUgbWFzaworCSAqLworCWlmIChjcHVfaXNzZXQoY3B1LCBtYXNrKSkgeworCQljcHVfY2xlYXIoY3B1LCBtYXNrKTsKKwkJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJCXRkLT5ldnRkZXYtPmV2ZW50X2hhbmRsZXIodGQtPmV2dGRldik7CisJCXJldCA9IDE7CisJfQorCisJaWYgKCFjcHVzX2VtcHR5KG1hc2spKSB7CisJCS8qCisJCSAqIEl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBhY3R1YWxseSBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2VzCisJCSAqIGhhdmUgZGlmZmVyZW50IGJyb2FkY2FzdCBmdW5jdGlvbnMuIEZvciBub3csIGp1c3QgdXNlIHRoZQorCQkgKiBvbmUgb2YgdGhlIGZpcnN0IGRldmljZS4gVGhpcyB3b3JrcyBhcyBsb25nIGFzIHdlIGhhdmUgdGhpcworCQkgKiBtaXNmZWF0dXJlIG9ubHkgb24geDg2IChsYXBpYykKKwkJICovCisJCWNwdSA9IGZpcnN0X2NwdShtYXNrKTsKKwkJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJCXRkLT5ldnRkZXYtPmJyb2FkY2FzdChtYXNrKTsKKwkJcmV0ID0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBlcmlvZGljIGJyb2FkY2FzdDoKKyAqIC0gaW52b2tlIHRoZSBicm9hZGNhc3QgaGFuZGxlcnMKKyAqLworc3RhdGljIHZvaWQgdGlja19kb19wZXJpb2RpY19icm9hZGNhc3Qodm9pZCkKK3sKKwljcHVtYXNrX3QgbWFzazsKKworCXNwaW5fbG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7CisKKwljcHVzX2FuZChtYXNrLCBjcHVfb25saW5lX21hcCwgdGlja19icm9hZGNhc3RfbWFzayk7CisJdGlja19kb19icm9hZGNhc3QobWFzayk7CisKKwlzcGluX3VubG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7Cit9CisKKy8qCisgKiBFdmVudCBoYW5kbGVyIGZvciBwZXJpb2RpYyBicm9hZGNhc3QgdGlja3MKKyAqLworc3RhdGljIHZvaWQgdGlja19oYW5kbGVfcGVyaW9kaWNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPm5leHRfZXZlbnQudHY2NCA9IEtUSU1FX01BWDsKKworCXRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KCk7CisKKwkvKgorCSAqIFRoZSBkZXZpY2UgaXMgaW4gcGVyaW9kaWMgbW9kZS4gTm8gcmVwcm9ncmFtbWluZyBuZWNlc3Nhcnk6CisJICovCisJaWYgKGRldi0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCisJICogcGVyaW9kaWMgbW9kZToKKwkgKi8KKwlmb3IgKDs7KSB7CisJCWt0aW1lX3QgbmV4dCA9IGt0aW1lX2FkZChkZXYtPm5leHRfZXZlbnQsIHRpY2tfcGVyaW9kKTsKKworCQlpZiAoIWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBuZXh0LCBrdGltZV9nZXQoKSkpCisJCQlyZXR1cm47CisJCXRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KCk7CisJfQorfQorCisvKgorICogUG93ZXJzdGF0ZSBpbmZvcm1hdGlvbjogVGhlIHN5c3RlbSBlbnRlcnMvbGVhdmVzIGEgc3RhdGUsIHdoZXJlCisgKiBhZmZlY3RlZCBkZXZpY2VzIG1pZ2h0IHN0b3AKKyAqLworc3RhdGljIHZvaWQgdGlja19kb19icm9hZGNhc3Rfb25fb2ZmKHZvaWQgKndoeSkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYywgKmRldjsKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsICpyZWFzb24gPSB3aHk7CisJaW50IGNwdTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJZGV2ID0gdGQtPmV2dGRldjsKKwliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CisKKwkvKgorCSAqIElzIHRoZSBkZXZpY2UgaW4gYnJvYWRjYXN0IG1vZGUgZm9yZXZlciBvciBpcyBpdCBub3QKKwkgKiBhZmZlY3RlZCBieSB0aGUgcG93ZXJzdGF0ZSA/CisJICovCisJaWYgKCFkZXYgfHwgIXRpY2tfZGV2aWNlX2lzX2Z1bmN0aW9uYWwoZGV2KSB8fAorCSAgICAhKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9DM1NUT1ApKQorCQlnb3RvIG91dDsKKworCWlmICgqcmVhc29uID09IENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OKSB7CisJCWlmICghY3B1X2lzc2V0KGNwdSwgdGlja19icm9hZGNhc3RfbWFzaykpIHsKKwkJCWNwdV9zZXQoY3B1LCB0aWNrX2Jyb2FkY2FzdF9tYXNrKTsKKwkJCWlmICh0ZC0+bW9kZSA9PSBUSUNLREVWX01PREVfUEVSSU9ESUMpCisJCQkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LAorCQkJCQkJICAgICBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY3B1X2lzc2V0KGNwdSwgdGlja19icm9hZGNhc3RfbWFzaykpIHsKKwkJCWNwdV9jbGVhcihjcHUsIHRpY2tfYnJvYWRjYXN0X21hc2spOworCQkJaWYgKHRkLT5tb2RlID09IFRJQ0tERVZfTU9ERV9QRVJJT0RJQykKKwkJCQl0aWNrX3NldHVwX3BlcmlvZGljKGRldiwgMCk7CisJCX0KKwl9CisKKwlpZiAoY3B1c19lbXB0eSh0aWNrX2Jyb2FkY2FzdF9tYXNrKSkKKwkJY2xvY2tldmVudHNfc2V0X21vZGUoYmMsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKKwllbHNlIHsKKwkJaWYgKHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID09IFRJQ0tERVZfTU9ERV9QRVJJT0RJQykKKwkJCXRpY2tfYnJvYWRjYXN0X3N0YXJ0X3BlcmlvZGljKGJjKTsKKwkJZWxzZQorCQkJdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChiYyk7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFBvd2Vyc3RhdGUgaW5mb3JtYXRpb246IFRoZSBzeXN0ZW0gZW50ZXJzL2xlYXZlcyBhIHN0YXRlLCB3aGVyZQorICogYWZmZWN0ZWQgZGV2aWNlcyBtaWdodCBzdG9wLgorICovCit2b2lkIHRpY2tfYnJvYWRjYXN0X29uX29mZih1bnNpZ25lZCBsb25nIHJlYXNvbiwgaW50ICpvbmNwdSkKK3sKKwlpbnQgY3B1ID0gZ2V0X2NwdSgpOworCisJaWYgKGNwdSA9PSAqb25jcHUpCisJCXRpY2tfZG9fYnJvYWRjYXN0X29uX29mZigmcmVhc29uKTsKKwllbHNlCisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgqb25jcHUsIHRpY2tfZG9fYnJvYWRjYXN0X29uX29mZiwKKwkJCQkJICZyZWFzb24sIDEsIDEpOworCXB1dF9jcHUoKTsKK30KKworLyoKKyAqIFNldCB0aGUgcGVyaW9kaWMgaGFuZGxlciBkZXBlbmRpbmcgb24gYnJvYWRjYXN0IG9uL29mZgorICovCit2b2lkIHRpY2tfc2V0X3BlcmlvZGljX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgYnJvYWRjYXN0KQoreworCWlmICghYnJvYWRjYXN0KQorCQlkZXYtPmV2ZW50X2hhbmRsZXIgPSB0aWNrX2hhbmRsZV9wZXJpb2RpYzsKKwllbHNlCisJCWRldi0+ZXZlbnRfaGFuZGxlciA9IHRpY2tfaGFuZGxlX3BlcmlvZGljX2Jyb2FkY2FzdDsKK30KKworLyoKKyAqIFJlbW92ZSBhIENQVSBmcm9tIGJyb2FkY2FzdGluZworICovCit2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0KHVuc2lnbmVkIGludCAqY3B1cCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjcHUgPSAqY3B1cDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisKKwliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CisJY3B1X2NsZWFyKGNwdSwgdGlja19icm9hZGNhc3RfbWFzayk7CisKKwlpZiAodGlja19icm9hZGNhc3RfZGV2aWNlLm1vZGUgPT0gVElDS0RFVl9NT0RFX1BFUklPRElDKSB7CisJCWlmIChiYyAmJiBjcHVzX2VtcHR5KHRpY2tfYnJvYWRjYXN0X21hc2spKQorCQkJY2xvY2tldmVudHNfc2V0X21vZGUoYmMsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfVElDS19PTkVTSE9UCisKK3N0YXRpYyBjcHVtYXNrX3QgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrOworCisvKgorICogRGVidWdnaW5nOiBzZWUgdGltZXJfbGlzdC5jCisgKi8KK2NwdW1hc2tfdCAqdGlja19nZXRfYnJvYWRjYXN0X29uZXNob3RfbWFzayh2b2lkKQoreworCXJldHVybiAmdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrOworfQorCitzdGF0aWMgaW50IHRpY2tfYnJvYWRjYXN0X3NldF9ldmVudChrdGltZV90IGV4cGlyZXMsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CisJa3RpbWVfdCBub3cgPSBrdGltZV9nZXQoKTsKKwlpbnQgcmVzOworCisJZm9yKDs7KSB7CisJCXJlcyA9IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoYmMsIGV4cGlyZXMsIG5vdyk7CisJCWlmICghcmVzIHx8ICFmb3JjZSkKKwkJCXJldHVybiByZXM7CisJCW5vdyA9IGt0aW1lX2dldCgpOworCQlleHBpcmVzID0ga3RpbWVfYWRkKG5vdywga3RpbWVfc2V0KDAsIGJjLT5taW5fZGVsdGFfbnMpKTsKKwl9Cit9CisKKy8qCisgKiBSZXByb2dyYW0gdGhlIGJyb2FkY2FzdCBkZXZpY2U6CisgKgorICogQ2FsbGVkIHdpdGggdGlja19icm9hZGNhc3RfbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCitzdGF0aWMgaW50IHRpY2tfYnJvYWRjYXN0X3JlcHJvZ3JhbSh2b2lkKQoreworCWt0aW1lX3QgZXhwaXJlcyA9IHsgLnR2NjQgPSBLVElNRV9NQVggfTsKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOworCWludCBjcHU7CisKKwkvKgorCSAqIEZpbmQgdGhlIGV2ZW50IHdoaWNoIGV4cGlyZXMgbmV4dDoKKwkgKi8KKwlmb3IgKGNwdSA9IGZpcnN0X2NwdSh0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spOyBjcHUgIT0gTlJfQ1BVUzsKKwkgICAgIGNwdSA9IG5leHRfY3B1KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKSkgeworCQl0ZCA9ICZwZXJfY3B1KHRpY2tfY3B1X2RldmljZSwgY3B1KTsKKwkJaWYgKHRkLT5ldnRkZXYtPm5leHRfZXZlbnQudHY2NCA8IGV4cGlyZXMudHY2NCkKKwkJCWV4cGlyZXMgPSB0ZC0+ZXZ0ZGV2LT5uZXh0X2V2ZW50OworCX0KKworCWlmIChleHBpcmVzLnR2NjQgPT0gS1RJTUVfTUFYKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB0aWNrX2Jyb2FkY2FzdF9zZXRfZXZlbnQoZXhwaXJlcywgMCk7Cit9CisKKy8qCisgKiBIYW5kbGUgb25lc2hvdCBtb2RlIGJyb2FkY2FzdGluZworICovCitzdGF0aWMgdm9pZCB0aWNrX2hhbmRsZV9vbmVzaG90X2Jyb2FkY2FzdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKKwljcHVtYXNrX3QgbWFzazsKKwlrdGltZV90IG5vdzsKKwlpbnQgY3B1OworCisJc3Bpbl9sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKK2FnYWluOgorCWRldi0+bmV4dF9ldmVudC50djY0ID0gS1RJTUVfTUFYOworCW1hc2sgPSBDUFVfTUFTS19OT05FOworCW5vdyA9IGt0aW1lX2dldCgpOworCS8qIEZpbmQgYWxsIGV4cGlyZWQgZXZlbnRzICovCisJZm9yIChjcHUgPSBmaXJzdF9jcHUodGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKTsgY3B1ICE9IE5SX0NQVVM7CisJICAgICBjcHUgPSBuZXh0X2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfbWFzaykpIHsKKwkJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJCWlmICh0ZC0+ZXZ0ZGV2LT5uZXh0X2V2ZW50LnR2NjQgPD0gbm93LnR2NjQpCisJCQljcHVfc2V0KGNwdSwgbWFzayk7CisJfQorCisJLyoKKwkgKiBXYWtldXAgdGhlIGNwdXMgd2hpY2ggaGF2ZSBhbiBleHBpcmVkIGV2ZW50LiBUaGUgYnJvYWRjYXN0CisJICogZGV2aWNlIGlzIHJlcHJvZ3JhbW1lZCBpbiB0aGUgcmV0dXJuIGZyb20gaWRsZSBjb2RlLgorCSAqLworCWlmICghdGlja19kb19icm9hZGNhc3QobWFzaykpIHsKKwkJLyoKKwkJICogVGhlIGdsb2JhbCBldmVudCBkaWQgbm90IGV4cGlyZSBhbnkgQ1BVIGxvY2FsCisJCSAqIGV2ZW50cy4gVGhpcyBoYXBwZW5zIGluIGR5bnRpY2sgbW9kZSwgYXMgdGhlCisJCSAqIG1heGltdW0gUElUIGRlbHRhIGlzIHF1aXRlIHNtYWxsLgorCQkgKi8KKwkJaWYgKHRpY2tfYnJvYWRjYXN0X3JlcHJvZ3JhbSgpKQorCQkJZ290byBhZ2FpbjsKKwl9CisJc3Bpbl91bmxvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOworfQorCisvKgorICogUG93ZXJzdGF0ZSBpbmZvcm1hdGlvbjogVGhlIHN5c3RlbSBlbnRlcnMvbGVhdmVzIGEgc3RhdGUsIHdoZXJlCisgKiBhZmZlY3RlZCBkZXZpY2VzIG1pZ2h0IHN0b3AKKyAqLwordm9pZCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wodW5zaWduZWQgbG9uZyByZWFzb24pCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMsICpkZXY7CisJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjcHU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBQZXJpb2RpYyBtb2RlIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGVudGVyL2V4aXQgb2YgcG93ZXIKKwkgKiBzdGF0ZXMKKwkgKi8KKwlpZiAodGlja19icm9hZGNhc3RfZGV2aWNlLm1vZGUgPT0gVElDS0RFVl9NT0RFX1BFUklPRElDKQorCQlnb3RvIG91dDsKKworCWJjID0gdGlja19icm9hZGNhc3RfZGV2aWNlLmV2dGRldjsKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJZGV2ID0gdGQtPmV2dGRldjsKKworCWlmICghKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9DM1NUT1ApKQorCQlnb3RvIG91dDsKKworCWlmIChyZWFzb24gPT0gQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIpIHsKKwkJaWYgKCFjcHVfaXNzZXQoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spKSB7CisJCQljcHVfc2V0KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKTsKKwkJCWNsb2NrZXZlbnRzX3NldF9tb2RlKGRldiwgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCQkJaWYgKGRldi0+bmV4dF9ldmVudC50djY0IDwgYmMtPm5leHRfZXZlbnQudHY2NCkKKwkJCQl0aWNrX2Jyb2FkY2FzdF9zZXRfZXZlbnQoZGV2LT5uZXh0X2V2ZW50LCAxKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjcHVfaXNzZXQoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spKSB7CisJCQljcHVfY2xlYXIoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spOworCQkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwkJCWlmIChkZXYtPm5leHRfZXZlbnQudHY2NCAhPSBLVElNRV9NQVgpCisJCQkJdGlja19wcm9ncmFtX2V2ZW50KGRldi0+bmV4dF9ldmVudCwgMSk7CisJCX0KKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogdGlja19icm9hZGNhc3Rfc2V0dXBfaGlnaHJlcyAtIHNldHVwIHRoZSBicm9hZGNhc3QgZGV2aWNlIGZvciBoaWdocmVzCisgKi8KK3ZvaWQgdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKK3sKKwlpZiAoYmMtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCkgeworCQliYy0+ZXZlbnRfaGFuZGxlciA9IHRpY2tfaGFuZGxlX29uZXNob3RfYnJvYWRjYXN0OworCQljbG9ja2V2ZW50c19zZXRfbW9kZShiYywgQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7CisJCWJjLT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CisJfQorfQorCisvKgorICogU2VsZWN0IG9uZXNob3Qgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBicm9hZGNhc3QgZGV2aWNlCisgKi8KK3ZvaWQgdGlja19icm9hZGNhc3Rfc3dpdGNoX3RvX29uZXNob3Qodm9pZCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKworCXRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID0gVElDS0RFVl9NT0RFX09ORVNIT1Q7CisJYmMgPSB0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2OworCWlmIChiYykKKwkJdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChiYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOworfQorCisKKy8qCisgKiBSZW1vdmUgYSBkZWFkIENQVSBmcm9tIGJyb2FkY2FzdGluZworICovCit2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNwdSA9ICpjcHVwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKworCWJjID0gdGlja19icm9hZGNhc3RfZGV2aWNlLmV2dGRldjsKKwljcHVfY2xlYXIoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spOworCisJaWYgKHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID09IFRJQ0tERVZfTU9ERV9PTkVTSE9UKSB7CisJCWlmIChiYyAmJiBjcHVzX2VtcHR5KHRpY2tfYnJvYWRjYXN0X29uZXNob3RfbWFzaykpCisJCQljbG9ja2V2ZW50c19zZXRfbW9kZShiYywgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWNvbW1vbi5jIGIva2VybmVsL3RpbWUvdGljay1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTAwZTM0Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1jb21tb24uYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stY29tbW9uLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGJhc2UgZnVuY3Rpb25zIHRvIG1hbmFnZSBwZXJpb2RpYyB0aWNrCisgKiByZWxhdGVkIGV2ZW50cy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQoQykgMjAwNi0yMDA3LCBUaW1lc3lzIENvcnAuLCBUaG9tYXMgR2xlaXhuZXIKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuIEZvciBkZXRhaWxzIHNlZQorICoga2VybmVsLWJhc2UvQ09QWUlORy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisKKyNpbmNsdWRlICJ0aWNrLWludGVybmFsLmgiCisKKy8qCisgKiBUaWNrIGRldmljZXMKKyAqLworREVGSU5FX1BFUl9DUFUoc3RydWN0IHRpY2tfZGV2aWNlLCB0aWNrX2NwdV9kZXZpY2UpOworLyoKKyAqIFRpY2sgbmV4dCBldmVudDoga2VlcHMgdHJhY2sgb2YgdGhlIHRpY2sgdGltZQorICovCitrdGltZV90IHRpY2tfbmV4dF9wZXJpb2Q7CitrdGltZV90IHRpY2tfcGVyaW9kOworc3RhdGljIGludCB0aWNrX2RvX3RpbWVyX2NwdSA9IC0xOworREVGSU5FX1NQSU5MT0NLKHRpY2tfZGV2aWNlX2xvY2spOworCisvKgorICogRGVidWdnaW5nOiBzZWUgdGltZXJfbGlzdC5jCisgKi8KK3N0cnVjdCB0aWNrX2RldmljZSAqdGlja19nZXRfZGV2aWNlKGludCBjcHUpCit7CisJcmV0dXJuICZwZXJfY3B1KHRpY2tfY3B1X2RldmljZSwgY3B1KTsKK30KKworLyoqCisgKiB0aWNrX2lzX29uZXNob3RfYXZhaWxhYmxlIC0gY2hlY2sgZm9yIGEgb25lc2hvdCBjYXBhYmxlIGV2ZW50IGRldmljZQorICovCitpbnQgdGlja19pc19vbmVzaG90X2F2YWlsYWJsZSh2b2lkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiA9IF9fZ2V0X2NwdV92YXIodGlja19jcHVfZGV2aWNlKS5ldnRkZXY7CisKKwlyZXR1cm4gZGV2ICYmIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCk7Cit9CisKKy8qCisgKiBQZXJpb2RpYyB0aWNrCisgKi8KK3N0YXRpYyB2b2lkIHRpY2tfcGVyaW9kaWMoaW50IGNwdSkKK3sKKwlpZiAodGlja19kb190aW1lcl9jcHUgPT0gY3B1KSB7CisJCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJCS8qIEtlZXAgdHJhY2sgb2YgdGhlIG5leHQgdGljayBldmVudCAqLworCQl0aWNrX25leHRfcGVyaW9kID0ga3RpbWVfYWRkKHRpY2tfbmV4dF9wZXJpb2QsIHRpY2tfcGVyaW9kKTsKKworCQlkb190aW1lcigxKTsKKwkJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwl9CisKKwl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKKwlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Cit9CisKKy8qCisgKiBFdmVudCBoYW5kbGVyIGZvciBwZXJpb2RpYyB0aWNrcworICovCit2b2lkIHRpY2tfaGFuZGxlX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJdGlja19wZXJpb2RpYyhjcHUpOworCisJaWYgKGRldi0+bW9kZSAhPSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKQorCQlyZXR1cm47CisJLyoKKwkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCisJICogcGVyaW9kaWMgbW9kZToKKwkgKi8KKwlmb3IgKDs7KSB7CisJCWt0aW1lX3QgbmV4dCA9IGt0aW1lX2FkZChkZXYtPm5leHRfZXZlbnQsIHRpY2tfcGVyaW9kKTsKKworCQlpZiAoIWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBuZXh0LCBrdGltZV9nZXQoKSkpCisJCQlyZXR1cm47CisJCXRpY2tfcGVyaW9kaWMoY3B1KTsKKwl9Cit9CisKKy8qCisgKiBTZXR1cCB0aGUgZGV2aWNlIGZvciBhIHBlcmlvZGljIHRpY2sKKyAqLwordm9pZCB0aWNrX3NldHVwX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGJyb2FkY2FzdCkKK3sKKwl0aWNrX3NldF9wZXJpb2RpY19oYW5kbGVyKGRldiwgYnJvYWRjYXN0KTsKKworCS8qIEJyb2FkY2FzdCBzZXR1cCA/ICovCisJaWYgKCF0aWNrX2RldmljZV9pc19mdW5jdGlvbmFsKGRldikpCisJCXJldHVybjsKKworCWlmIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMpIHsKKwkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQyk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBzZXE7CisJCWt0aW1lX3QgbmV4dDsKKworCQlkbyB7CisJCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJCW5leHQgPSB0aWNrX25leHRfcGVyaW9kOworCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKKworCQljbG9ja2V2ZW50c19zZXRfbW9kZShkZXYsIENMT0NLX0VWVF9NT0RFX09ORVNIT1QpOworCisJCWZvciAoOzspIHsKKwkJCWlmICghY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChkZXYsIG5leHQsIGt0aW1lX2dldCgpKSkKKwkJCQlyZXR1cm47CisJCQluZXh0ID0ga3RpbWVfYWRkKG5leHQsIHRpY2tfcGVyaW9kKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFNldHVwIHRoZSB0aWNrIGRldmljZQorICovCitzdGF0aWMgdm9pZCB0aWNrX3NldHVwX2RldmljZShzdHJ1Y3QgdGlja19kZXZpY2UgKnRkLAorCQkJICAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3ZGV2LCBpbnQgY3B1LAorCQkJICAgICAgY3B1bWFza190IGNwdW1hc2spCit7CisJa3RpbWVfdCBuZXh0X2V2ZW50OworCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopID0gTlVMTDsKKworCS8qCisJICogRmlyc3QgZGV2aWNlIHNldHVwID8KKwkgKi8KKwlpZiAoIXRkLT5ldnRkZXYpIHsKKwkJLyoKKwkJICogSWYgbm8gY3B1IHRvb2sgdGhlIGRvX3RpbWVyIHVwZGF0ZSwgYXNzaWduIGl0IHRvCisJCSAqIHRoaXMgY3B1OgorCQkgKi8KKwkJaWYgKHRpY2tfZG9fdGltZXJfY3B1ID09IC0xKSB7CisJCQl0aWNrX2RvX3RpbWVyX2NwdSA9IGNwdTsKKwkJCXRpY2tfbmV4dF9wZXJpb2QgPSBrdGltZV9nZXQoKTsKKwkJCXRpY2tfcGVyaW9kID0ga3RpbWVfc2V0KDAsIE5TRUNfUEVSX1NFQyAvIEhaKTsKKwkJfQorCisJCS8qCisJCSAqIFN0YXJ0dXAgaW4gcGVyaW9kaWMgbW9kZSBmaXJzdC4KKwkJICovCisJCXRkLT5tb2RlID0gVElDS0RFVl9NT0RFX1BFUklPRElDOworCX0gZWxzZSB7CisJCWhhbmRsZXIgPSB0ZC0+ZXZ0ZGV2LT5ldmVudF9oYW5kbGVyOworCQluZXh0X2V2ZW50ID0gdGQtPmV2dGRldi0+bmV4dF9ldmVudDsKKwl9CisKKwl0ZC0+ZXZ0ZGV2ID0gbmV3ZGV2OworCisJLyoKKwkgKiBXaGVuIHRoZSBkZXZpY2UgaXMgbm90IHBlciBjcHUsIHBpbiB0aGUgaW50ZXJydXB0IHRvIHRoZQorCSAqIGN1cnJlbnQgY3B1OgorCSAqLworCWlmICghY3B1c19lcXVhbChuZXdkZXYtPmNwdW1hc2ssIGNwdW1hc2spKQorCQlpcnFfc2V0X2FmZmluaXR5KG5ld2Rldi0+aXJxLCBjcHVtYXNrKTsKKworCS8qCisJICogV2hlbiBnbG9iYWwgYnJvYWRjYXN0aW5nIGlzIGFjdGl2ZSwgY2hlY2sgaWYgdGhlIGN1cnJlbnQKKwkgKiBkZXZpY2UgaXMgcmVnaXN0ZXJlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBicm9hZGNhc3QgbW9kZS4KKwkgKiBUaGlzIGFsbG93cyB1cyB0byBoYW5kbGUgdGhpcyB4ODYgbWlzZmVhdHVyZSBpbiBhIGdlbmVyaWMKKwkgKiB3YXkuCisJICovCisJaWYgKHRpY2tfZGV2aWNlX3VzZXNfYnJvYWRjYXN0KG5ld2RldiwgY3B1KSkKKwkJcmV0dXJuOworCisJaWYgKHRkLT5tb2RlID09IFRJQ0tERVZfTU9ERV9QRVJJT0RJQykKKwkJdGlja19zZXR1cF9wZXJpb2RpYyhuZXdkZXYsIDApOworCWVsc2UKKwkJdGlja19zZXR1cF9vbmVzaG90KG5ld2RldiwgaGFuZGxlciwgbmV4dF9ldmVudCk7Cit9CisKKy8qCisgKiBDaGVjaywgaWYgdGhlIG5ldyByZWdpc3RlcmVkIGRldmljZSBzaG91bGQgYmUgdXNlZC4KKyAqLworc3RhdGljIGludCB0aWNrX2NoZWNrX25ld19kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3ZGV2KQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmN1cmRldjsKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOworCWludCBjcHUsIHJldCA9IE5PVElGWV9PSzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNwdW1hc2tfdCBjcHVtYXNrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAoIWNwdV9pc3NldChjcHUsIG5ld2Rldi0+Y3B1bWFzaykpCisJCWdvdG8gb3V0OworCisJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJY3VyZGV2ID0gdGQtPmV2dGRldjsKKwljcHVtYXNrID0gY3B1bWFza19vZl9jcHUoY3B1KTsKKworCS8qIGNwdSBsb2NhbCBkZXZpY2UgPyAqLworCWlmICghY3B1c19lcXVhbChuZXdkZXYtPmNwdW1hc2ssIGNwdW1hc2spKSB7CisKKwkJLyoKKwkJICogSWYgdGhlIGNwdSBhZmZpbml0eSBvZiB0aGUgZGV2aWNlIGludGVycnVwdCBjYW4gbm90CisJCSAqIGJlIHNldCwgaWdub3JlIGl0LgorCQkgKi8KKwkJaWYgKCFpcnFfY2FuX3NldF9hZmZpbml0eShuZXdkZXYtPmlycSkpCisJCQlnb3RvIG91dF9iYzsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgY3B1IGxvY2FsIGRldmljZSBhbHJlYWR5LCBkbyBub3QgcmVwbGFjZSBpdAorCQkgKiBieSBhIG5vbiBjcHUgbG9jYWwgZGV2aWNlCisJCSAqLworCQlpZiAoY3VyZGV2ICYmIGNwdXNfZXF1YWwoY3VyZGV2LT5jcHVtYXNrLCBjcHVtYXNrKSkKKwkJCWdvdG8gb3V0X2JjOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBhbiBhY3RpdmUgZGV2aWNlLCB0aGVuIGNoZWNrIHRoZSByYXRpbmcgYW5kIHRoZSBvbmVzaG90CisJICogZmVhdHVyZS4KKwkgKi8KKwlpZiAoY3VyZGV2KSB7CisJCS8qCisJCSAqIFByZWZlciBvbmUgc2hvdCBjYXBhYmxlIGRldmljZXMgIQorCQkgKi8KKwkJaWYgKChjdXJkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCkgJiYKKwkJICAgICEobmV3ZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX09ORVNIT1QpKQorCQkJZ290byBvdXRfYmM7CisJCS8qCisJCSAqIENoZWNrIHRoZSByYXRpbmcKKwkJICovCisJCWlmIChjdXJkZXYtPnJhdGluZyA+PSBuZXdkZXYtPnJhdGluZykKKwkJCWdvdG8gb3V0X2JjOworCX0KKworCS8qCisJICogUmVwbGFjZSB0aGUgZXZlbnR1YWxseSBleGlzdGluZyBkZXZpY2UgYnkgdGhlIG5ldworCSAqIGRldmljZS4gSWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRoZSBicm9hZGNhc3QgZGV2aWNlLCBkbworCSAqIG5vdCBnaXZlIGl0IGJhY2sgdG8gdGhlIGNsb2NrZXZlbnRzIGxheWVyICEKKwkgKi8KKwlpZiAodGlja19pc19icm9hZGNhc3RfZGV2aWNlKGN1cmRldikpIHsKKwkJY2xvY2tldmVudHNfc2V0X21vZGUoY3VyZGV2LCBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7CisJCWN1cmRldiA9IE5VTEw7CisJfQorCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShjdXJkZXYsIG5ld2Rldik7CisJdGlja19zZXR1cF9kZXZpY2UodGQsIG5ld2RldiwgY3B1LCBjcHVtYXNrKTsKKwlpZiAobmV3ZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX09ORVNIT1QpCisJCXRpY2tfb25lc2hvdF9ub3RpZnkoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gTk9USUZZX1NUT1A7CisKK291dF9iYzoKKwkvKgorCSAqIENhbiB0aGUgbmV3IGRldmljZSBiZSB1c2VkIGFzIGEgYnJvYWRjYXN0IGRldmljZSA/CisJICovCisJaWYgKHRpY2tfY2hlY2tfYnJvYWRjYXN0X2RldmljZShuZXdkZXYpKQorCQlyZXQgPSBOT1RJRllfU1RPUDsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2RldmljZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU2h1dGRvd24gYW4gZXZlbnQgZGV2aWNlIG9uIGEgZ2l2ZW4gY3B1OgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIG9uIGEgbGlmZSBDUFUsIHdoZW4gYSBDUFUgaXMgZGVhZC4gU28gd2UgY2Fubm90CisgKiBhY2Nlc3MgdGhlIGhhcmR3YXJlIGRldmljZSBpdHNlbGYuCisgKiBXZSBqdXN0IHNldCB0aGUgbW9kZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3RzLgorICovCitzdGF0aWMgdm9pZCB0aWNrX3NodXRkb3duKHVuc2lnbmVkIGludCAqY3B1cCkKK3sKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkID0gJnBlcl9jcHUodGlja19jcHVfZGV2aWNlLCAqY3B1cCk7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2ID0gdGQtPmV2dGRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwl0ZC0+bW9kZSA9IFRJQ0tERVZfTU9ERV9QRVJJT0RJQzsKKwlpZiAoZGV2KSB7CisJCS8qCisJCSAqIFByZXZlbnQgdGhhdCB0aGUgY2xvY2sgZXZlbnRzIGxheWVyIHRyaWVzIHRvIGNhbGwKKwkJICogdGhlIHNldCBtb2RlIGZ1bmN0aW9uIQorCQkgKi8KKwkJZGV2LT5tb2RlID0gQ0xPQ0tfRVZUX01PREVfVU5VU0VEOworCQljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoZGV2LCBOVUxMKTsKKwkJdGQtPmV2dGRldiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIE5vdGlmaWNhdGlvbiBhYm91dCBjbG9jayBldmVudCBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbnQgdGlja19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyByZWFzb24sCisJCQkgICAgICAgdm9pZCAqZGV2KQoreworCXN3aXRjaCAocmVhc29uKSB7CisKKwljYXNlIENMT0NLX0VWVF9OT1RJRllfQUREOgorCQlyZXR1cm4gdGlja19jaGVja19uZXdfZGV2aWNlKGRldik7CisKKwljYXNlIENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OOgorCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT0ZGOgorCQl0aWNrX2Jyb2FkY2FzdF9vbl9vZmYocmVhc29uLCBkZXYpOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVI6CisJY2FzZSBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElUOgorCQl0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wocmVhc29uKTsKKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX0VWVF9OT1RJRllfQ1BVX0RFQUQ6CisJCXRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QoZGV2KTsKKwkJdGlja19zaHV0ZG93bl9icm9hZGNhc3QoZGV2KTsKKwkJdGlja19zaHV0ZG93bihkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGlja19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHRpY2tfbm90aWZ5LAorfTsKKworLyoqCisgKiB0aWNrX2luaXQgLSBpbml0aWFsaXplIHRoZSB0aWNrIGNvbnRyb2wKKyAqCisgKiBSZWdpc3RlciB0aGUgbm90aWZpZXIgd2l0aCB0aGUgY2xvY2tldmVudHMgZnJhbWV3b3JrCisgKi8KK3ZvaWQgX19pbml0IHRpY2tfaW5pdCh2b2lkKQoreworCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX25vdGlmaWVyKCZ0aWNrX25vdGlmaWVyKTsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaCBiL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg2MWEwCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogdGljayBpbnRlcm5hbCB2YXJpYWJsZSBhbmQgZnVuY3Rpb25zIHVzZWQgYnkgbG93L2hpZ2ggcmVzIGNvZGUKKyAqLworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCB0aWNrX2RldmljZSwgdGlja19jcHVfZGV2aWNlKTsKK2V4dGVybiBzcGlubG9ja190IHRpY2tfZGV2aWNlX2xvY2s7CitleHRlcm4ga3RpbWVfdCB0aWNrX25leHRfcGVyaW9kOworZXh0ZXJuIGt0aW1lX3QgdGlja19wZXJpb2Q7CisKK2V4dGVybiB2b2lkIHRpY2tfc2V0dXBfcGVyaW9kaWMoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgYnJvYWRjYXN0KTsKK2V4dGVybiB2b2lkIHRpY2tfaGFuZGxlX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CisKKy8qCisgKiBOT19IWiAvIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBzaGFyZWQgY29kZQorICovCisjaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAorZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm5ld2RldiwKKwkJCSAgICAgICB2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSwKKwkJCSAgICAgICBrdGltZV90IG5leHRldnQpOworZXh0ZXJuIGludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpOworZXh0ZXJuIHZvaWQgdGlja19vbmVzaG90X25vdGlmeSh2b2lkKTsKK2V4dGVybiBpbnQgdGlja19zd2l0Y2hfdG9fb25lc2hvdCh2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSk7CisKKyMgaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCitleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKTsKK2V4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbik7CitleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zd2l0Y2hfdG9fb25lc2hvdCh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKTsKKyMgZWxzZSAvKiBCUk9BRENBU1QgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKQoreworCUJVRygpOworfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfc3dpdGNoX3RvX29uZXNob3Qodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3Rfb25lc2hvdCh1bnNpZ25lZCBpbnQgKmNwdXApIHsgfQorIyBlbmRpZiAvKiAhQlJPQURDQVNUICovCisKKyNlbHNlIC8qICFPTkVTSE9UICovCitzdGF0aWMgaW5saW5lCit2b2lkIHRpY2tfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpuZXdkZXYsCisJCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSwKKwkJCWt0aW1lX3QgbmV4dGV2dCkKK3sKKwlCVUcoKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfcHJvZ3JhbV9ldmVudChrdGltZV90IGV4cGlyZXMsIGludCBmb3JjZSkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX29uZXNob3Rfbm90aWZ5KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X3NldHVwX29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpCit7CisJQlVHKCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NodXRkb3duX2Jyb2FkY2FzdF9vbmVzaG90KHVuc2lnbmVkIGludCAqY3B1cCkgeyB9CisjZW5kaWYgLyogIVRJQ0tfT05FU0hPVCAqLworCisvKgorICogQnJvYWRjYXN0aW5nIHN1cHBvcnQKKyAqLworI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAorZXh0ZXJuIGludCB0aWNrX2RvX2Jyb2FkY2FzdChjcHVtYXNrX3QgbWFzayk7CisKK2V4dGVybiBpbnQgdGlja19kZXZpY2VfdXNlc19icm9hZGNhc3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgY3B1KTsKK2V4dGVybiBpbnQgdGlja19jaGVja19icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHRpY2tfaXNfYnJvYWRjYXN0X2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgdGlja19icm9hZGNhc3Rfb25fb2ZmKHVuc2lnbmVkIGxvbmcgcmVhc29uLCBpbnQgKm9uY3B1KTsKK2V4dGVybiB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0KHVuc2lnbmVkIGludCAqY3B1cCk7CisKK2V4dGVybiB2b2lkCit0aWNrX3NldF9wZXJpb2RpY19oYW5kbGVyKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGJyb2FkY2FzdCk7CisKKyNlbHNlIC8qICFCUk9BRENBU1QgKi8KKworc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGlja19pc19icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfZGV2aWNlX3VzZXNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICBpbnQgY3B1KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X29uX29mZih1bnNpZ25lZCBsb25nIHJlYXNvbiwgaW50ICpvbmNwdSkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3QodW5zaWduZWQgaW50ICpjcHVwKSB7IH0KKworLyoKKyAqIFNldCB0aGUgcGVyaW9kaWMgaGFuZGxlciBpbiBub24gYnJvYWRjYXN0IG1vZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2V0X3BlcmlvZGljX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAorCQkJCQkgICAgIGludCBicm9hZGNhc3QpCit7CisJZGV2LT5ldmVudF9oYW5kbGVyID0gdGlja19oYW5kbGVfcGVyaW9kaWM7Cit9CisjZW5kaWYgLyogIUJST0FEQ0FTVCAqLworCisvKgorICogQ2hlY2ssIGlmIHRoZSBkZXZpY2UgaXMgZnVuY3Rpb25hbCBvciBhIGR1bW15IGZvciBicm9hZGNhc3QKKyAqLworc3RhdGljIGlubGluZSBpbnQgdGlja19kZXZpY2VfaXNfZnVuY3Rpb25hbChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICEoZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0RVTU1ZKTsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stb25lc2hvdC5jIGIva2VybmVsL3RpbWUvdGljay1vbmVzaG90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4YjdmZgotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL3RpY2stb25lc2hvdC5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBsaW51eC9rZXJuZWwvdGltZS90aWNrLW9uZXNob3QuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgd2hpY2ggbWFuYWdlIGhpZ2ggcmVzb2x1dGlvbiB0aWNrCisgKiByZWxhdGVkIGV2ZW50cy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQoQykgMjAwNi0yMDA3LCBUaW1lc3lzIENvcnAuLCBUaG9tYXMgR2xlaXhuZXIKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuIEZvciBkZXRhaWxzIHNlZQorICoga2VybmVsLWJhc2UvQ09QWUlORy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisKKyNpbmNsdWRlICJ0aWNrLWludGVybmFsLmgiCisKKy8qKgorICogdGlja19wcm9ncmFtX2V2ZW50CisgKi8KK2ludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2ID0gX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9kZXZpY2UpLmV2dGRldjsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHJldCA9IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBleHBpcmVzLCBub3cpOworCisJCWlmICghcmV0IHx8ICFmb3JjZSkKKwkJCXJldHVybiByZXQ7CisJCW5vdyA9IGt0aW1lX2dldCgpOworCQlleHBpcmVzID0ga3RpbWVfYWRkKG5vdywga3RpbWVfc2V0KDAsIGRldi0+bWluX2RlbHRhX25zKSk7CisJfQorfQorCisvKioKKyAqIHRpY2tfc2V0dXBfb25lc2hvdCAtIHNldHVwIHRoZSBldmVudCBkZXZpY2UgZm9yIG9uZXNob3QgbW9kZSAoaHJlcyBvciBub2h6KQorICovCit2b2lkIHRpY2tfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpuZXdkZXYsCisJCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSwKKwkJCWt0aW1lX3QgbmV4dF9ldmVudCkKK3sKKwluZXdkZXYtPmV2ZW50X2hhbmRsZXIgPSBoYW5kbGVyOworCWNsb2NrZXZlbnRzX3NldF9tb2RlKG5ld2RldiwgQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7CisJY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChuZXdkZXYsIG5leHRfZXZlbnQsIGt0aW1lX2dldCgpKTsKK30KKworLyoqCisgKiB0aWNrX3N3aXRjaF90b19vbmVzaG90IC0gc3dpdGNoIHRvIG9uZXNob3QgbW9kZQorICovCitpbnQgdGlja19zd2l0Y2hfdG9fb25lc2hvdCh2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSkKK3sKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkID0gJl9fZ2V0X2NwdV92YXIodGlja19jcHVfZGV2aWNlKTsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYgPSB0ZC0+ZXZ0ZGV2OworCisJaWYgKCFkZXYgfHwgIShkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCkgfHwKKwkgICAgIXRpY2tfZGV2aWNlX2lzX2Z1bmN0aW9uYWwoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ZC0+bW9kZSA9IFRJQ0tERVZfTU9ERV9PTkVTSE9UOworCWRldi0+ZXZlbnRfaGFuZGxlciA9IGhhbmRsZXI7CisJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwl0aWNrX2Jyb2FkY2FzdF9zd2l0Y2hfdG9fb25lc2hvdCgpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworLyoqCisgKiB0aWNrX2luaXRfaGlnaHJlcyAtIHN3aXRjaCB0byBoaWdoIHJlc29sdXRpb24gbW9kZQorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK2ludCB0aWNrX2luaXRfaGlnaHJlcyh2b2lkKQoreworCXJldHVybiB0aWNrX3N3aXRjaF90b19vbmVzaG90KGhydGltZXJfaW50ZXJydXB0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTQxZjdmCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCkBAIC0wLDAgKzEsNTYzIEBACisvKgorICogIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYworICoKKyAqICBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqICBDb3B5cmlnaHQoQykgMjAwNS0yMDA3LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogIENvcHlyaWdodChDKSAyMDA2LTIwMDcgIFRpbWVzeXMgQ29ycC4sIFRob21hcyBHbGVpeG5lcgorICoKKyAqICBObyBpZGxlIHRpY2sgaW1wbGVtZW50YXRpb24gZm9yIGxvdyBhbmQgaGlnaCByZXNvbHV0aW9uIHRpbWVycworICoKKyAqICBTdGFydGVkIGJ5OiBUaG9tYXMgR2xlaXhuZXIgYW5kIEluZ28gTW9sbmFyCisgKgorICogIEZvciBsaWNlbmNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgorCisjaW5jbHVkZSAidGljay1pbnRlcm5hbC5oIgorCisvKgorICogUGVyIGNwdSBub2h6IGNvbnRyb2wgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGlja19zY2hlZCwgdGlja19jcHVfc2NoZWQpOworCisvKgorICogVGhlIHRpbWUsIHdoZW4gdGhlIGxhc3QgamlmZnkgdXBkYXRlIGhhcHBlbmVkLiBQcm90ZWN0ZWQgYnkgeHRpbWVfbG9jay4KKyAqLworc3RhdGljIGt0aW1lX3QgbGFzdF9qaWZmaWVzX3VwZGF0ZTsKKworc3RydWN0IHRpY2tfc2NoZWQgKnRpY2tfZ2V0X3RpY2tfc2NoZWQoaW50IGNwdSkKK3sKKwlyZXR1cm4gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7Cit9CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgIQorICovCitzdGF0aWMgdm9pZCB0aWNrX2RvX3VwZGF0ZV9qaWZmaWVzNjQoa3RpbWVfdCBub3cpCit7CisJdW5zaWduZWQgbG9uZyB0aWNrcyA9IDA7CisJa3RpbWVfdCBkZWx0YTsKKworCS8qIFJlZXZhbHV0ZSB3aXRoIHh0aW1lX2xvY2sgaGVsZCAqLworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJZGVsdGEgPSBrdGltZV9zdWIobm93LCBsYXN0X2ppZmZpZXNfdXBkYXRlKTsKKwlpZiAoZGVsdGEudHY2NCA+PSB0aWNrX3BlcmlvZC50djY0KSB7CisKKwkJZGVsdGEgPSBrdGltZV9zdWIoZGVsdGEsIHRpY2tfcGVyaW9kKTsKKwkJbGFzdF9qaWZmaWVzX3VwZGF0ZSA9IGt0aW1lX2FkZChsYXN0X2ppZmZpZXNfdXBkYXRlLAorCQkJCQkJdGlja19wZXJpb2QpOworCisJCS8qIFNsb3cgcGF0aCBmb3IgbG9uZyB0aW1lb3V0cyAqLworCQlpZiAodW5saWtlbHkoZGVsdGEudHY2NCA+PSB0aWNrX3BlcmlvZC50djY0KSkgeworCQkJczY0IGluY3IgPSBrdGltZV90b19ucyh0aWNrX3BlcmlvZCk7CisKKwkJCXRpY2tzID0ga3RpbWVfZGl2bnMoZGVsdGEsIGluY3IpOworCisJCQlsYXN0X2ppZmZpZXNfdXBkYXRlID0ga3RpbWVfYWRkX25zKGxhc3RfamlmZmllc191cGRhdGUsCisJCQkJCQkJICAgaW5jciAqIHRpY2tzKTsKKwkJfQorCQlkb190aW1lcigrK3RpY2tzKTsKKwl9CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYW5kIHJldHVybiByZXRyaWV2ZSB0aGUgamlmZmllcyB1cGRhdGUuCisgKi8KK3N0YXRpYyBrdGltZV90IHRpY2tfaW5pdF9qaWZmeV91cGRhdGUodm9pZCkKK3sKKwlrdGltZV90IHBlcmlvZDsKKworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCS8qIERpZCB3ZSBzdGFydCB0aGUgamlmZmllcyB1cGRhdGUgeWV0ID8gKi8KKwlpZiAobGFzdF9qaWZmaWVzX3VwZGF0ZS50djY0ID09IDApCisJCWxhc3RfamlmZmllc191cGRhdGUgPSB0aWNrX25leHRfcGVyaW9kOworCXBlcmlvZCA9IGxhc3RfamlmZmllc191cGRhdGU7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwlyZXR1cm4gcGVyaW9kOworfQorCisvKgorICogTk9IWiAtIGFrYSBkeW5hbWljIHRpY2sgZnVuY3Rpb25hbGl0eQorICovCisjaWZkZWYgQ09ORklHX05PX0haCisvKgorICogTk8gSFogZW5hYmxlZCA/CisgKi8KK3N0YXRpYyBpbnQgdGlja19ub2h6X2VuYWJsZWQgX19yZWFkX21vc3RseSAgPSAxOworCisvKgorICogRW5hYmxlIC8gRGlzYWJsZSB0aWNrbGVzcyBtb2RlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3RpY2tfbm9oeihjaGFyICpzdHIpCit7CisJaWYgKCFzdHJjbXAoc3RyLCAib2ZmIikpCisJCXRpY2tfbm9oel9lbmFibGVkID0gMDsKKwllbHNlIGlmICghc3RyY21wKHN0ciwgIm9uIikpCisJCXRpY2tfbm9oel9lbmFibGVkID0gMTsKKwllbHNlCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJub2h6PSIsIHNldHVwX3RpY2tfbm9oeik7CisKKy8qKgorICogdGlja19ub2h6X3VwZGF0ZV9qaWZmaWVzIC0gdXBkYXRlIGppZmZpZXMgd2hlbiBpZGxlIHdhcyBpbnRlcnJ1cHRlZAorICoKKyAqIENhbGxlZCBmcm9tIGludGVycnVwdCBlbnRyeSB3aGVuIHRoZSBDUFUgd2FzIGlkbGUKKyAqCisgKiBJbiBjYXNlIHRoZSBzY2hlZF90aWNrIHdhcyBzdG9wcGVkIG9uIHRoaXMgQ1BVLCB3ZSBoYXZlIHRvIGNoZWNrIGlmIGppZmZpZXMKKyAqIG11c3QgYmUgdXBkYXRlZC4gT3RoZXJ3aXNlIGFuIGludGVycnVwdCBoYW5kbGVyIGNvdWxkIHVzZSBhIHN0YWxlIGppZmZ5CisgKiB2YWx1ZS4gV2UgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHkgb24gYW55IGNwdSwgYXMgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZQorICogY3B1LCB3aGljaCBoYXMgdGhlIHVwZGF0ZSB0YXNrIGFzc2lnbmVkIGlzIGluIGEgbG9uZyBzbGVlcC4KKyAqLwordm9pZCB0aWNrX25vaHpfdXBkYXRlX2ppZmZpZXModm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZwZXJfY3B1KHRpY2tfY3B1X3NjaGVkLCBjcHUpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJa3RpbWVfdCBub3c7CisKKwlpZiAoIXRzLT50aWNrX3N0b3BwZWQpCisJCXJldHVybjsKKworCWNwdV9jbGVhcihjcHUsIG5vaHpfY3B1X21hc2spOworCW5vdyA9IGt0aW1lX2dldCgpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKiB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrIC0gc3RvcCB0aGUgaWRsZSB0aWNrIGZyb20gdGhlIGlkbGUgdGFzaworICoKKyAqIFdoZW4gdGhlIG5leHQgZXZlbnQgaXMgbW9yZSB0aGFuIGEgdGljayBpbnRvIHRoZSBmdXR1cmUsIHN0b3AgdGhlIGlkbGUgdGljaworICogQ2FsbGVkIGVpdGhlciBmcm9tIHRoZSBpZGxlIGxvb3Agb3IgZnJvbSBpcnFfZXhpdCgpIHdoZW4gYW4gaWRsZSBwZXJpb2Qgd2FzCisgKiBqdXN0IGludGVycnVwdGVkIGJ5IGFuIGludGVycnVwdCB3aGljaCBkaWQgbm90IGNhdXNlIGEgcmVzY2hlZHVsZS4KKyAqLwordm9pZCB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzZXEsIGxhc3RfamlmZmllcywgbmV4dF9qaWZmaWVzLCBkZWx0YV9qaWZmaWVzLCBmbGFnczsKKwlzdHJ1Y3QgdGlja19zY2hlZCAqdHM7CisJa3RpbWVfdCBsYXN0X3VwZGF0ZSwgZXhwaXJlcywgbm93LCBkZWx0YTsKKwlpbnQgY3B1OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXRzID0gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7CisKKwlpZiAodW5saWtlbHkodHMtPm5vaHpfbW9kZSA9PSBOT0haX01PREVfSU5BQ1RJVkUpKQorCQlnb3RvIGVuZDsKKworCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJZ290byBlbmQ7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJQlVHX09OKGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKTsKKworCW5vdyA9IGt0aW1lX2dldCgpOworCS8qCisJICogV2hlbiBjYWxsZWQgZnJvbSBpcnFfZXhpdCB3ZSBuZWVkIHRvIGFjY291bnQgdGhlIGlkbGUgc2xlZXAgdGltZQorCSAqIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAodHMtPnRpY2tfc3RvcHBlZCkgeworCQlkZWx0YSA9IGt0aW1lX3N1Yihub3csIHRzLT5pZGxlX2VudHJ5dGltZSk7CisJCXRzLT5pZGxlX3NsZWVwdGltZSA9IGt0aW1lX2FkZCh0cy0+aWRsZV9zbGVlcHRpbWUsIGRlbHRhKTsKKwl9CisKKwl0cy0+aWRsZV9lbnRyeXRpbWUgPSBub3c7CisJdHMtPmlkbGVfY2FsbHMrKzsKKworCS8qIFJlYWQgamlmZmllcyBhbmQgdGhlIHRpbWUgd2hlbiBqaWZmaWVzIHdlcmUgdXBkYXRlZCBsYXN0ICovCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJbGFzdF91cGRhdGUgPSBsYXN0X2ppZmZpZXNfdXBkYXRlOworCQlsYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCisJLyogR2V0IHRoZSBuZXh0IHRpbWVyIHdoZWVsIHRpbWVyICovCisJbmV4dF9qaWZmaWVzID0gZ2V0X25leHRfdGltZXJfaW50ZXJydXB0KGxhc3RfamlmZmllcyk7CisJZGVsdGFfamlmZmllcyA9IG5leHRfamlmZmllcyAtIGxhc3RfamlmZmllczsKKworCS8qCisJICogRG8gbm90IHN0b3AgdGhlIHRpY2ssIGlmIHdlIGFyZSBvbmx5IG9uZSBvZmYKKwkgKiBvciBpZiB0aGUgY3B1IGlzIHJlcXVpcmVkIGZvciByY3UKKwkgKi8KKwlpZiAoIXRzLT50aWNrX3N0b3BwZWQgJiYgKGRlbHRhX2ppZmZpZXMgPT0gMSB8fCByY3VfbmVlZHNfY3B1KGNwdSkpKQorCQlnb3RvIG91dDsKKworCS8qIFNjaGVkdWxlIHRoZSB0aWNrLCBpZiB3ZSBhcmUgYXQgbGVhc3Qgb25lIGppZmZpZSBvZmYgKi8KKwlpZiAoKGxvbmcpZGVsdGFfamlmZmllcyA+PSAxKSB7CisKKwkJaWYgKHJjdV9uZWVkc19jcHUoY3B1KSkKKwkJCWRlbHRhX2ppZmZpZXMgPSAxOworCQllbHNlCisJCQljcHVfc2V0KGNwdSwgbm9oel9jcHVfbWFzayk7CisJCS8qCisJCSAqIG5vaHpfc3RvcF9zY2hlZF90aWNrIGNhbiBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBiZWZvcmUKKwkJICogdGhlIG5vaHpfcmVzdGFydF9zY2hlZF90aWNrIGlzIGNhbGxlZC4gVGhpcyBoYXBwZW5zIHdoZW4KKwkJICogaW50ZXJydXB0cyBhcnJpdmUgd2hpY2ggZG8gbm90IGNhdXNlIGEgcmVzY2hlZHVsZS4gSW4gdGhlCisJCSAqIGZpcnN0IGNhbGwgd2Ugc2F2ZSB0aGUgY3VycmVudCB0aWNrIHRpbWUsIHNvIHdlIGNhbiByZXN0YXJ0CisJCSAqIHRoZSBzY2hlZHVsZXIgdGljayBpbiBub2h6X3Jlc3RhcnRfc2NoZWRfdGljay4KKwkJICovCisJCWlmICghdHMtPnRpY2tfc3RvcHBlZCkgeworCQkJdHMtPmlkbGVfdGljayA9IHRzLT5zY2hlZF90aW1lci5leHBpcmVzOworCQkJdHMtPnRpY2tfc3RvcHBlZCA9IDE7CisJCQl0cy0+aWRsZV9qaWZmaWVzID0gbGFzdF9qaWZmaWVzOworCQl9CisJCS8qCisJCSAqIGNhbGN1bGF0ZSB0aGUgZXhwaXJ5IHRpbWUgZm9yIHRoZSBuZXh0IHRpbWVyIHdoZWVsCisJCSAqIHRpbWVyCisJCSAqLworCQlleHBpcmVzID0ga3RpbWVfYWRkX25zKGxhc3RfdXBkYXRlLCB0aWNrX3BlcmlvZC50djY0ICoKKwkJCQkgICAgICAgZGVsdGFfamlmZmllcyk7CisJCXRzLT5pZGxlX2V4cGlyZXMgPSBleHBpcmVzOworCQl0cy0+aWRsZV9zbGVlcHMrKzsKKworCQlpZiAodHMtPm5vaHpfbW9kZSA9PSBOT0haX01PREVfSElHSFJFUykgeworCQkJaHJ0aW1lcl9zdGFydCgmdHMtPnNjaGVkX3RpbWVyLCBleHBpcmVzLAorCQkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOworCQkJLyogQ2hlY2ssIGlmIHRoZSB0aW1lciB3YXMgYWxyZWFkeSBpbiB0aGUgcGFzdCAqLworCQkJaWYgKGhydGltZXJfYWN0aXZlKCZ0cy0+c2NoZWRfdGltZXIpKQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYoIXRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzLCAwKSkKKwkJCQlnb3RvIG91dDsKKwkJLyoKKwkJICogV2UgYXJlIHBhc3QgdGhlIGV2ZW50IGFscmVhZHkuIFNvIHdlIGNyb3NzZWQgYQorCQkgKiBqaWZmaWUgYm91bmRhcnkuIFVwZGF0ZSBqaWZmaWVzIGFuZCByYWlzZSB0aGUKKwkJICogc29mdGlycS4KKwkJICovCisJCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChrdGltZV9nZXQoKSk7CisJCWNwdV9jbGVhcihjcHUsIG5vaHpfY3B1X21hc2spOworCX0KKwlyYWlzZV9zb2Z0aXJxX2lycW9mZihUSU1FUl9TT0ZUSVJRKTsKK291dDoKKwl0cy0+bmV4dF9qaWZmaWVzID0gbmV4dF9qaWZmaWVzOworCXRzLT5sYXN0X2ppZmZpZXMgPSBsYXN0X2ppZmZpZXM7CitlbmQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIG5vaHpfcmVzdGFydF9zY2hlZF90aWNrIC0gcmVzdGFydCB0aGUgaWRsZSB0aWNrIGZyb20gdGhlIGlkbGUgdGFzaworICoKKyAqIFJlc3RhcnQgdGhlIGlkbGUgdGljayB3aGVuIHRoZSBDUFUgaXMgd29rZW4gdXAgZnJvbSBpZGxlCisgKi8KK3ZvaWQgdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljayh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7CisJdW5zaWduZWQgbG9uZyB0aWNrczsKKwlrdGltZV90IG5vdywgZGVsdGE7CisKKwlpZiAoIXRzLT50aWNrX3N0b3BwZWQpCisJCXJldHVybjsKKworCS8qIFVwZGF0ZSBqaWZmaWVzIGZpcnN0ICovCisJbm93ID0ga3RpbWVfZ2V0KCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCWNwdV9jbGVhcihjcHUsIG5vaHpfY3B1X21hc2spOworCisJLyogQWNjb3VudCB0aGUgaWRsZSB0aW1lICovCisJZGVsdGEgPSBrdGltZV9zdWIobm93LCB0cy0+aWRsZV9lbnRyeXRpbWUpOworCXRzLT5pZGxlX3NsZWVwdGltZSA9IGt0aW1lX2FkZCh0cy0+aWRsZV9zbGVlcHRpbWUsIGRlbHRhKTsKKworCS8qCisJICogV2Ugc3RvcHBlZCB0aGUgdGljayBpbiBpZGxlLiBVcGRhdGUgcHJvY2VzcyB0aW1lcyB3b3VsZCBtaXNzIHRoZQorCSAqIHRpbWUgd2Ugc2xlcHQgYXMgdXBkYXRlX3Byb2Nlc3NfdGltZXMgZG9lcyBvbmx5IGEgMSB0aWNrCisJICogYWNjb3VudGluZy4gRW5mb3JjZSB0aGF0IHRoaXMgaXMgYWNjb3VudGVkIHRvIGlkbGUgIQorCSAqLworCXRpY2tzID0gamlmZmllcyAtIHRzLT5pZGxlX2ppZmZpZXM7CisJLyoKKwkgKiBXZSBtaWdodCBiZSBvbmUgb2ZmLiBEbyBub3QgcmFuZG9tbHkgYWNjb3VudCBhIGh1Z2UgbnVtYmVyIG9mIHRpY2tzIQorCSAqLworCWlmICh0aWNrcyAmJiB0aWNrcyA8IExPTkdfTUFYKSB7CisJCWFkZF9wcmVlbXB0X2NvdW50KEhBUkRJUlFfT0ZGU0VUKTsKKwkJYWNjb3VudF9zeXN0ZW1fdGltZShjdXJyZW50LCBIQVJESVJRX09GRlNFVCwKKwkJCQkgICAgamlmZmllc190b19jcHV0aW1lKHRpY2tzKSk7CisJCXN1Yl9wcmVlbXB0X2NvdW50KEhBUkRJUlFfT0ZGU0VUKTsKKwl9CisKKwkvKgorCSAqIENhbmNlbCB0aGUgc2NoZWR1bGVkIHRpbWVyIGFuZCByZXN0b3JlIHRoZSB0aWNrCisJICovCisJdHMtPnRpY2tfc3RvcHBlZCAgPSAwOworCWhydGltZXJfY2FuY2VsKCZ0cy0+c2NoZWRfdGltZXIpOworCXRzLT5zY2hlZF90aW1lci5leHBpcmVzID0gdHMtPmlkbGVfdGljazsKKworCXdoaWxlICgxKSB7CisJCS8qIEZvcndhcmQgdGhlIHRpbWUgdG8gZXhwaXJlIGluIHRoZSBmdXR1cmUgKi8KKwkJaHJ0aW1lcl9mb3J3YXJkKCZ0cy0+c2NoZWRfdGltZXIsIG5vdywgdGlja19wZXJpb2QpOworCisJCWlmICh0cy0+bm9oel9tb2RlID09IE5PSFpfTU9ERV9ISUdIUkVTKSB7CisJCQlocnRpbWVyX3N0YXJ0KCZ0cy0+c2NoZWRfdGltZXIsCisJCQkJICAgICAgdHMtPnNjaGVkX3RpbWVyLmV4cGlyZXMsCisJCQkJICAgICAgSFJUSU1FUl9NT0RFX0FCUyk7CisJCQkvKiBDaGVjaywgaWYgdGhlIHRpbWVyIHdhcyBhbHJlYWR5IGluIHRoZSBwYXN0ICovCisJCQlpZiAoaHJ0aW1lcl9hY3RpdmUoJnRzLT5zY2hlZF90aW1lcikpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlpZiAoIXRpY2tfcHJvZ3JhbV9ldmVudCh0cy0+c2NoZWRfdGltZXIuZXhwaXJlcywgMCkpCisJCQkJYnJlYWs7CisJCX0KKwkJLyogVXBkYXRlIGppZmZpZXMgYW5kIHJlcmVhZCB0aW1lICovCisJCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCQlub3cgPSBrdGltZV9nZXQoKTsKKwl9CisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCitzdGF0aWMgaW50IHRpY2tfbm9oel9yZXByb2dyYW0oc3RydWN0IHRpY2tfc2NoZWQgKnRzLCBrdGltZV90IG5vdykKK3sKKwlocnRpbWVyX2ZvcndhcmQoJnRzLT5zY2hlZF90aW1lciwgbm93LCB0aWNrX3BlcmlvZCk7CisJcmV0dXJuIHRpY2tfcHJvZ3JhbV9ldmVudCh0cy0+c2NoZWRfdGltZXIuZXhwaXJlcywgMCk7Cit9CisKKy8qCisgKiBUaGUgbm9oeiBsb3cgcmVzIGludGVycnVwdCBoYW5kbGVyCisgKi8KK3N0YXRpYyB2b2lkIHRpY2tfbm9oel9oYW5kbGVyKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGlja19zY2hlZCAqdHMgPSAmX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9zY2hlZCk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOworCisJZGV2LT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CisKKwkvKiBDaGVjaywgaWYgdGhlIGppZmZpZXMgbmVlZCBhbiB1cGRhdGUgKi8KKwl0aWNrX2RvX3VwZGF0ZV9qaWZmaWVzNjQobm93KTsKKworCS8qCisJICogV2hlbiB3ZSBhcmUgaWRsZSBhbmQgdGhlIHRpY2sgaXMgc3RvcHBlZCwgd2UgaGF2ZSB0byB0b3VjaAorCSAqIHRoZSB3YXRjaGRvZyBhcyB3ZSBtaWdodCBub3Qgc2NoZWR1bGUgZm9yIGEgcmVhbGx5IGxvbmcKKwkgKiB0aW1lLiBUaGlzIGhhcHBlbnMgb24gY29tcGxldGUgaWRsZSBTTVAgc3lzdGVtcyB3aGlsZQorCSAqIHdhaXRpbmcgb24gdGhlIGxvZ2luIHByb21wdC4gV2UgYWxzbyBpbmNyZW1lbnQgdGhlICJzdGFydAorCSAqIG9mIGlkbGUiIGppZmZ5IHN0YW1wIHNvIHRoZSBpZGxlIGFjY291bnRpbmcgYWRqdXN0bWVudCB3ZQorCSAqIGRvIHdoZW4gd2UgZ28gYnVzeSBhZ2FpbiBkb2VzIG5vdCBhY2NvdW50IHRvbyBtdWNoIHRpY2tzLgorCSAqLworCWlmICh0cy0+dGlja19zdG9wcGVkKSB7CisJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwkJdHMtPmlkbGVfamlmZmllcysrOworCX0KKworCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOworCisJLyogRG8gbm90IHJlc3RhcnQsIHdoZW4gd2UgYXJlIGluIHRoZSBpZGxlIGxvb3AgKi8KKwlpZiAodHMtPnRpY2tfc3RvcHBlZCkKKwkJcmV0dXJuOworCisJd2hpbGUgKHRpY2tfbm9oel9yZXByb2dyYW0odHMsIG5vdykpIHsKKwkJbm93ID0ga3RpbWVfZ2V0KCk7CisJCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCX0KK30KKworLyoqCisgKiB0aWNrX25vaHpfc3dpdGNoX3RvX25vaHogLSBzd2l0Y2ggdG8gbm9oeiBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIHRpY2tfbm9oel9zd2l0Y2hfdG9fbm9oeih2b2lkKQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKKwlrdGltZV90IG5leHQ7CisKKwlpZiAoIXRpY2tfbm9oel9lbmFibGVkKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWlmICh0aWNrX3N3aXRjaF90b19vbmVzaG90KHRpY2tfbm9oel9oYW5kbGVyKSkgeworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCXJldHVybjsKKwl9CisKKwl0cy0+bm9oel9tb2RlID0gTk9IWl9NT0RFX0xPV1JFUzsKKworCS8qCisJICogUmVjeWNsZSB0aGUgaHJ0aW1lciBpbiB0cywgc28gd2UgY2FuIHNoYXJlIHRoZQorCSAqIGhydGltZXJfZm9yd2FyZCB3aXRoIHRoZSBoaWdocmVzIGNvZGUuCisJICovCisJaHJ0aW1lcl9pbml0KCZ0cy0+c2NoZWRfdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CisJLyogR2V0IHRoZSBuZXh0IHBlcmlvZCAqLworCW5leHQgPSB0aWNrX2luaXRfamlmZnlfdXBkYXRlKCk7CisKKwlmb3IgKDs7KSB7CisJCXRzLT5zY2hlZF90aW1lci5leHBpcmVzID0gbmV4dDsKKwkJaWYgKCF0aWNrX3Byb2dyYW1fZXZlbnQobmV4dCwgMCkpCisJCQlicmVhazsKKwkJbmV4dCA9IGt0aW1lX2FkZChuZXh0LCB0aWNrX3BlcmlvZCk7CisJfQorCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXByaW50ayhLRVJOX0lORk8gIlN3aXRjaGVkIHRvIE5PSHogbW9kZSBvbiBDUFUgIyVkXG4iLAorCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19ub2h6X3N3aXRjaF90b19ub2h6KHZvaWQpIHsgfQorCisjZW5kaWYgLyogTk9fSFogKi8KKworLyoKKyAqIEhpZ2ggcmVzb2x1dGlvbiB0aW1lciBzcGVjaWZpYyBjb2RlCisgKi8KKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCisvKgorICogV2UgcmVhcm0gdGhlIHRpbWVyIHVudGlsIHdlIGdldCBkaXNhYmxlZCBieSB0aGUgaWRsZSBjb2RlCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCB0aW1lci0+YmFzZS0+Y3B1X2Jhc2UtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHRpY2tfc2NoZWRfdGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9CisJCWNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IHRpY2tfc2NoZWQsIHNjaGVkX3RpbWVyKTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSA9IHRpbWVyLT5iYXNlLT5jcHVfYmFzZTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOworCWt0aW1lX3Qgbm93ID0ga3RpbWVfZ2V0KCk7CisKKwkvKiBDaGVjaywgaWYgdGhlIGppZmZpZXMgbmVlZCBhbiB1cGRhdGUgKi8KKwl0aWNrX2RvX3VwZGF0ZV9qaWZmaWVzNjQobm93KTsKKworCS8qCisJICogRG8gbm90IGNhbGwsIHdoZW4gd2UgYXJlIG5vdCBpbiBpcnEgY29udGV4dCBhbmQgaGF2ZQorCSAqIG5vIHZhbGlkIHJlZ3MgcG9pbnRlcgorCSAqLworCWlmIChyZWdzKSB7CisJCS8qCisJCSAqIFdoZW4gd2UgYXJlIGlkbGUgYW5kIHRoZSB0aWNrIGlzIHN0b3BwZWQsIHdlIGhhdmUgdG8gdG91Y2gKKwkJICogdGhlIHdhdGNoZG9nIGFzIHdlIG1pZ2h0IG5vdCBzY2hlZHVsZSBmb3IgYSByZWFsbHkgbG9uZworCQkgKiB0aW1lLiBUaGlzIGhhcHBlbnMgb24gY29tcGxldGUgaWRsZSBTTVAgc3lzdGVtcyB3aGlsZQorCQkgKiB3YWl0aW5nIG9uIHRoZSBsb2dpbiBwcm9tcHQuIFdlIGFsc28gaW5jcmVtZW50IHRoZSAic3RhcnQgb2YKKwkJICogaWRsZSIgamlmZnkgc3RhbXAgc28gdGhlIGlkbGUgYWNjb3VudGluZyBhZGp1c3RtZW50IHdlIGRvCisJCSAqIHdoZW4gd2UgZ28gYnVzeSBhZ2FpbiBkb2VzIG5vdCBhY2NvdW50IHRvbyBtdWNoIHRpY2tzLgorCQkgKi8KKwkJaWYgKHRzLT50aWNrX3N0b3BwZWQpIHsKKwkJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwkJCXRzLT5pZGxlX2ppZmZpZXMrKzsKKwkJfQorCQkvKgorCQkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIG1pZ2h0IHRha2UgdGFza2xpc3RfbG9jaywgaGVuY2UKKwkJICogZHJvcCB0aGUgYmFzZSBsb2NrLiBzY2hlZC10aWNrIGhydGltZXJzIGFyZSBwZXItQ1BVIGFuZAorCQkgKiBuZXZlciBhY2Nlc3NpYmxlIGJ5IHVzZXJzcGFjZSBBUElzLCBzbyB0aGlzIGlzIHNhZmUgdG8gZG8uCisJCSAqLworCQlzcGluX3VubG9jaygmYmFzZS0+bG9jayk7CisJCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisJCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKKwkJc3Bpbl9sb2NrKCZiYXNlLT5sb2NrKTsKKwl9CisKKwkvKiBEbyBub3QgcmVzdGFydCwgd2hlbiB3ZSBhcmUgaW4gdGhlIGlkbGUgbG9vcCAqLworCWlmICh0cy0+dGlja19zdG9wcGVkKQorCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CisKKwlocnRpbWVyX2ZvcndhcmQodGltZXIsIG5vdywgdGlja19wZXJpb2QpOworCisJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKK30KKworLyoqCisgKiB0aWNrX3NldHVwX3NjaGVkX3RpbWVyIC0gc2V0dXAgdGhlIHRpY2sgZW11bGF0aW9uIHRpbWVyCisgKi8KK3ZvaWQgdGlja19zZXR1cF9zY2hlZF90aW1lcih2b2lkKQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOworCisJLyoKKwkgKiBFbXVsYXRlIHRpY2sgcHJvY2Vzc2luZyB2aWEgcGVyLUNQVSBocnRpbWVyczoKKwkgKi8KKwlocnRpbWVyX2luaXQoJnRzLT5zY2hlZF90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKwl0cy0+c2NoZWRfdGltZXIuZnVuY3Rpb24gPSB0aWNrX3NjaGVkX3RpbWVyOworCXRzLT5zY2hlZF90aW1lci5jYl9tb2RlID0gSFJUSU1FUl9DQl9JUlFTQUZFX05PX1NPRlRJUlE7CisKKwkvKiBHZXQgdGhlIG5leHQgcGVyaW9kICovCisJdHMtPnNjaGVkX3RpbWVyLmV4cGlyZXMgPSB0aWNrX2luaXRfamlmZnlfdXBkYXRlKCk7CisKKwlmb3IgKDs7KSB7CisJCWhydGltZXJfZm9yd2FyZCgmdHMtPnNjaGVkX3RpbWVyLCBub3csIHRpY2tfcGVyaW9kKTsKKwkJaHJ0aW1lcl9zdGFydCgmdHMtPnNjaGVkX3RpbWVyLCB0cy0+c2NoZWRfdGltZXIuZXhwaXJlcywKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOworCQkvKiBDaGVjaywgaWYgdGhlIHRpbWVyIHdhcyBhbHJlYWR5IGluIHRoZSBwYXN0ICovCisJCWlmIChocnRpbWVyX2FjdGl2ZSgmdHMtPnNjaGVkX3RpbWVyKSkKKwkJCWJyZWFrOworCQlub3cgPSBrdGltZV9nZXQoKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfTk9fSFoKKwlpZiAodGlja19ub2h6X2VuYWJsZWQpCisJCXRzLT5ub2h6X21vZGUgPSBOT0haX01PREVfSElHSFJFUzsKKyNlbmRpZgorfQorCit2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpCit7CisJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7CisKKwlpZiAodHMtPnNjaGVkX3RpbWVyLmJhc2UpCisJCWhydGltZXJfY2FuY2VsKCZ0cy0+c2NoZWRfdGltZXIpOworCXRzLT50aWNrX3N0b3BwZWQgPSAwOworCXRzLT5ub2h6X21vZGUgPSBOT0haX01PREVfSU5BQ1RJVkU7Cit9CisjZW5kaWYgLyogSElHSF9SRVNfVElNRVJTICovCisKKy8qKgorICogQXN5bmMgbm90aWZpY2F0aW9uIGFib3V0IGNsb2Nrc291cmNlIGNoYW5nZXMKKyAqLwordm9pZCB0aWNrX2Nsb2NrX25vdGlmeSh2b2lkKQoreworCWludCBjcHU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQorCQlzZXRfYml0KDAsICZwZXJfY3B1KHRpY2tfY3B1X3NjaGVkLCBjcHUpLmNoZWNrX2Nsb2Nrcyk7Cit9CisKKy8qCisgKiBBc3luYyBub3RpZmljYXRpb24gYWJvdXQgY2xvY2sgZXZlbnQgY2hhbmdlcworICovCit2b2lkIHRpY2tfb25lc2hvdF9ub3RpZnkodm9pZCkKK3sKKwlzdHJ1Y3QgdGlja19zY2hlZCAqdHMgPSAmX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9zY2hlZCk7CisKKwlzZXRfYml0KDAsICZ0cy0+Y2hlY2tfY2xvY2tzKTsKK30KKworLyoqCisgKiBDaGVjaywgaWYgYSBjaGFuZ2UgaGFwcGVuZWQsIHdoaWNoIG1ha2VzIG9uZXNob3QgcG9zc2libGUuCisgKgorICogQ2FsbGVkIGN5Y2xpYyBmcm9tIHRoZSBocnRpbWVyIHNvZnRpcnEgKGRyaXZlbiBieSB0aGUgdGltZXIKKyAqIHNvZnRpcnEpIGFsbG93X25vaHogc2lnbmFscywgdGhhdCB3ZSBjYW4gc3dpdGNoIGludG8gbG93LXJlcyBub2h6CisgKiBtb2RlLCBiZWNhdXNlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lcnMgYXJlIGRpc2FibGVkIChlaXRoZXIgY29tcGlsZQorICogb3IgcnVudGltZSkuCisgKi8KK2ludCB0aWNrX2NoZWNrX29uZXNob3RfY2hhbmdlKGludCBhbGxvd19ub2h6KQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KDAsICZ0cy0+Y2hlY2tfY2xvY2tzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodHMtPm5vaHpfbW9kZSAhPSBOT0haX01PREVfSU5BQ1RJVkUpCisJCXJldHVybiAwOworCisJaWYgKCF0aW1la2VlcGluZ19pc19jb250aW51b3VzKCkgfHwgIXRpY2tfaXNfb25lc2hvdF9hdmFpbGFibGUoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFsbG93X25vaHopCisJCXJldHVybiAxOworCisJdGlja19ub2h6X3N3aXRjaF90b19ub2h6KCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMgYi9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyYzYzNQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYwpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIGtlcm5lbC90aW1lL3RpbWVyX2xpc3QuYworICoKKyAqIExpc3QgcGVuZGluZyB0aW1lcnMKKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNiwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCit0eXBlZGVmIHZvaWQgKCpwcmludF9mbl90KShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHVuc2lnbmVkIGludCAqY2xhc3Nlcyk7CisKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSwgaHJ0aW1lcl9iYXNlcyk7CisKKy8qCisgKiBUaGlzIGFsbG93cyBwcmludGluZyBib3RoIHRvIC9wcm9jL3RpbWVyX2xpc3QgYW5kCisgKiB0byB0aGUgY29uc29sZSAob24gU3lzUnEtUSk6CisgKi8KKyNkZWZpbmUgU0VRX3ByaW50ZihtLCB4Li4uKQkJCVwKKyBkbyB7CQkJCQkJXAorCWlmIChtKQkJCQkJXAorCQlzZXFfcHJpbnRmKG0sIHgpOwkJXAorCWVsc2UJCQkJCVwKKwkJcHJpbnRrKHgpOwkJCVwKKyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBwcmludF9uYW1lX29mZnNldChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnN5bSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylzeW07CisJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07CisJdW5zaWduZWQgbG9uZyBzaXplLCBvZmZzZXQ7CisJY29uc3QgY2hhciAqc3ltX25hbWU7CisJY2hhciAqbW9kbmFtZTsKKworCXN5bV9uYW1lID0ga2FsbHN5bXNfbG9va3VwKGFkZHIsICZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgbmFtZWJ1Zik7CisJaWYgKHN5bV9uYW1lKQorCQlTRVFfcHJpbnRmKG0sICIlcyIsIHN5bV9uYW1lKTsKKwllbHNlCisJCVNFUV9wcmludGYobSwgIjwlcD4iLCBzeW0pOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdGltZXIoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIGludCBpZHgsIHU2NCBub3cpCit7CisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJY2hhciB0bXBbVEFTS19DT01NX0xFTiArIDFdOworI2VuZGlmCisJU0VRX3ByaW50ZihtLCAiICMlZDogIiwgaWR4KTsKKwlwcmludF9uYW1lX29mZnNldChtLCB0aW1lcik7CisJU0VRX3ByaW50ZihtLCAiLCAiKTsKKwlwcmludF9uYW1lX29mZnNldChtLCB0aW1lci0+ZnVuY3Rpb24pOworCVNFUV9wcmludGYobSwgIiwgUzolMDJseCIsIHRpbWVyLT5zdGF0ZSk7CisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJU0VRX3ByaW50ZihtLCAiLCAiKTsKKwlwcmludF9uYW1lX29mZnNldChtLCB0aW1lci0+c3RhcnRfc2l0ZSk7CisJbWVtY3B5KHRtcCwgdGltZXItPnN0YXJ0X2NvbW0sIFRBU0tfQ09NTV9MRU4pOworCXRtcFtUQVNLX0NPTU1fTEVOXSA9IDA7CisJU0VRX3ByaW50ZihtLCAiLCAlcy8lZCIsIHRtcCwgdGltZXItPnN0YXJ0X3BpZCk7CisjZW5kaWYKKwlTRVFfcHJpbnRmKG0sICJcbiIpOworCVNFUV9wcmludGYobSwgIiAjIGV4cGlyZXMgYXQgJUxkIG5zZWNzIFtpbiAlTGQgbnNlY3NdXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWt0aW1lX3RvX25zKHRpbWVyLT5leHBpcmVzKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykoa3RpbWVfdG9fbnModGltZXItPmV4cGlyZXMpIC0gbm93KSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9hY3RpdmVfdGltZXJzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwKKwkJICAgIHU2NCBub3cpCit7CisJc3RydWN0IGhydGltZXIgKnRpbWVyLCB0bXA7CisJdW5zaWduZWQgbG9uZyBuZXh0ID0gMCwgaTsKKwlzdHJ1Y3QgcmJfbm9kZSAqY3VycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCituZXh0X29uZToKKwlpID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+Y3B1X2Jhc2UtPmxvY2ssIGZsYWdzKTsKKworCWN1cnIgPSBiYXNlLT5maXJzdDsKKwkvKgorCSAqIENydWRlIGJ1dCB3ZSBoYXZlIHRvIGRvIHRoaXMgTyhOKk4pIHRoaW5nLCBiZWNhdXNlCisJICogd2UgaGF2ZSB0byB1bmxvY2sgdGhlIGJhc2Ugd2hlbiBwcmludGluZzoKKwkgKi8KKwl3aGlsZSAoY3VyciAmJiBpIDwgbmV4dCkgeworCQljdXJyID0gcmJfbmV4dChjdXJyKTsKKwkJaSsrOworCX0KKworCWlmIChjdXJyKSB7CisKKwkJdGltZXIgPSByYl9lbnRyeShjdXJyLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CisJCXRtcCA9ICp0aW1lcjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZS0+Y3B1X2Jhc2UtPmxvY2ssIGZsYWdzKTsKKworCQlwcmludF90aW1lcihtLCAmdG1wLCBpLCBub3cpOworCQluZXh0Kys7CisJCWdvdG8gbmV4dF9vbmU7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2UtPmNwdV9iYXNlLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9iYXNlKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwgdTY0IG5vdykKK3sKKwlTRVFfcHJpbnRmKG0sICIgIC5pbmRleDogICAgICAlZFxuIiwKKwkJCWJhc2UtPmluZGV4KTsKKwlTRVFfcHJpbnRmKG0sICIgIC5yZXNvbHV0aW9uOiAlTGQgbnNlY3NcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWt0aW1lX3RvX25zKGJhc2UtPnJlc29sdXRpb24pKTsKKwlTRVFfcHJpbnRmKG0sICAgIiAgLmdldF90aW1lOiAgICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGJhc2UtPmdldF90aW1lKTsKKwlTRVFfcHJpbnRmKG0sICAgIlxuIik7CisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCVNFUV9wcmludGYobSwgIiAgLm9mZnNldDogICAgICVMZCBuc2Vjc1xuIiwKKwkJCWt0aW1lX3RvX25zKGJhc2UtPm9mZnNldCkpOworI2VuZGlmCisJU0VRX3ByaW50ZihtLCAgICJhY3RpdmUgdGltZXJzOlxuIik7CisJcHJpbnRfYWN0aXZlX3RpbWVycyhtLCBiYXNlLCBub3cpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9jcHUoc3RydWN0IHNlcV9maWxlICptLCBpbnQgY3B1LCB1NjQgbm93KQoreworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZwZXJfY3B1KGhydGltZXJfYmFzZXMsIGNwdSk7CisJaW50IGk7CisKKwlTRVFfcHJpbnRmKG0sICJcbmNwdTogJWRcbiIsIGNwdSk7CisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspIHsKKwkJU0VRX3ByaW50ZihtLCAiIGNsb2NrICVkOlxuIiwgaSk7CisJCXByaW50X2Jhc2UobSwgY3B1X2Jhc2UtPmNsb2NrX2Jhc2UgKyBpLCBub3cpOworCX0KKyNkZWZpbmUgUCh4KSBcCisJU0VRX3ByaW50ZihtLCAiICAuJS0xNXM6ICVMZFxuIiwgI3gsICh1NjQpKGNwdV9iYXNlLT54KSkKKyNkZWZpbmUgUF9ucyh4KSBcCisJU0VRX3ByaW50ZihtLCAiICAuJS0xNXM6ICVMZCBuc2Vjc1xuIiwgI3gsIFwKKwkJKHU2NCkoa3RpbWVfdG9fbnMoY3B1X2Jhc2UtPngpKSkKKworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlQX25zKGV4cGlyZXNfbmV4dCk7CisJUChocmVzX2FjdGl2ZSk7CisJUChucl9ldmVudHMpOworI2VuZGlmCisjdW5kZWYgUAorI3VuZGVmIFBfbnMKKworI2lmZGVmIENPTkZJR19USUNLX09ORVNIT1QKKyMgZGVmaW5lIFAoeCkgXAorCVNFUV9wcmludGYobSwgIiAgLiUtMTVzOiAlTGRcbiIsICN4LCAodTY0KSh0cy0+eCkpCisjIGRlZmluZSBQX25zKHgpIFwKKwlTRVFfcHJpbnRmKG0sICIgIC4lLTE1czogJUxkIG5zZWNzXG4iLCAjeCwgXAorCQkodTY0KShrdGltZV90b19ucyh0cy0+eCkpKQorCXsKKwkJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gdGlja19nZXRfdGlja19zY2hlZChjcHUpOworCQlQKG5vaHpfbW9kZSk7CisJCVBfbnMoaWRsZV90aWNrKTsKKwkJUCh0aWNrX3N0b3BwZWQpOworCQlQKGlkbGVfamlmZmllcyk7CisJCVAoaWRsZV9jYWxscyk7CisJCVAoaWRsZV9zbGVlcHMpOworCQlQX25zKGlkbGVfZW50cnl0aW1lKTsKKwkJUF9ucyhpZGxlX3NsZWVwdGltZSk7CisJCVAobGFzdF9qaWZmaWVzKTsKKwkJUChuZXh0X2ppZmZpZXMpOworCQlQX25zKGlkbGVfZXhwaXJlcyk7CisJCVNFUV9wcmludGYobSwgImppZmZpZXM6ICVMZFxuIiwgKHU2NClqaWZmaWVzKTsKKwl9CisjZW5kaWYKKworI3VuZGVmIFAKKyN1bmRlZiBQX25zCit9CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUworc3RhdGljIHZvaWQKK3ByaW50X3RpY2tkZXZpY2Uoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdGlja19kZXZpY2UgKnRkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiA9IHRkLT5ldnRkZXY7CisKKwlTRVFfcHJpbnRmKG0sICJcblRpY2sgRGV2aWNlOiBtb2RlOiAgICAgJWRcbiIsIHRkLT5tb2RlKTsKKworCVNFUV9wcmludGYobSwgIkNsb2NrIEV2ZW50IERldmljZTogIik7CisJaWYgKCFkZXYpIHsKKwkJU0VRX3ByaW50ZihtLCAiPE5VTEw+XG4iKTsKKwkJcmV0dXJuOworCX0KKwlTRVFfcHJpbnRmKG0sICIlc1xuIiwgZGV2LT5uYW1lKTsKKwlTRVFfcHJpbnRmKG0sICIgbWF4X2RlbHRhX25zOiAgICVsZFxuIiwgZGV2LT5tYXhfZGVsdGFfbnMpOworCVNFUV9wcmludGYobSwgIiBtaW5fZGVsdGFfbnM6ICAgJWxkXG4iLCBkZXYtPm1pbl9kZWx0YV9ucyk7CisJU0VRX3ByaW50ZihtLCAiIG11bHQ6ICAgICAgICAgICAlbGRcbiIsIGRldi0+bXVsdCk7CisJU0VRX3ByaW50ZihtLCAiIHNoaWZ0OiAgICAgICAgICAlZFxuIiwgZGV2LT5zaGlmdCk7CisJU0VRX3ByaW50ZihtLCAiIG1vZGU6ICAgICAgICAgICAlZFxuIiwgZGV2LT5tb2RlKTsKKwlTRVFfcHJpbnRmKG0sICIgbmV4dF9ldmVudDogICAgICVMZCBuc2Vjc1xuIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykga3RpbWVfdG9fbnMoZGV2LT5uZXh0X2V2ZW50KSk7CisKKwlTRVFfcHJpbnRmKG0sICIgc2V0X25leHRfZXZlbnQ6ICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGRldi0+c2V0X25leHRfZXZlbnQpOworCVNFUV9wcmludGYobSwgIlxuIik7CisKKwlTRVFfcHJpbnRmKG0sICIgc2V0X21vZGU6ICAgICAgICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGRldi0+c2V0X21vZGUpOworCVNFUV9wcmludGYobSwgIlxuIik7CisKKwlTRVFfcHJpbnRmKG0sICIgZXZlbnRfaGFuZGxlcjogICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGRldi0+ZXZlbnRfaGFuZGxlcik7CisJU0VRX3ByaW50ZihtLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfbGlzdF9zaG93X3RpY2tkZXZpY2VzKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlpbnQgY3B1OworCisjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCisJcHJpbnRfdGlja2RldmljZShtLCB0aWNrX2dldF9icm9hZGNhc3RfZGV2aWNlKCkpOworCVNFUV9wcmludGYobSwgInRpY2tfYnJvYWRjYXN0X21hc2s6ICUwOGx4XG4iLAorCQkgICB0aWNrX2dldF9icm9hZGNhc3RfbWFzaygpLT5iaXRzWzBdKTsKKyNpZmRlZiBDT05GSUdfVElDS19PTkVTSE9UCisJU0VRX3ByaW50ZihtLCAidGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrOiAlMDhseFxuIiwKKwkJICAgdGlja19nZXRfYnJvYWRjYXN0X29uZXNob3RfbWFzaygpLT5iaXRzWzBdKTsKKyNlbmRpZgorCVNFUV9wcmludGYobSwgIlxuIik7CisjZW5kaWYKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJICAgcHJpbnRfdGlja2RldmljZShtLCB0aWNrX2dldF9kZXZpY2UoY3B1KSk7CisJU0VRX3ByaW50ZihtLCAiXG4iKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCB0aW1lcl9saXN0X3Nob3dfdGlja2RldmljZXMoc3RydWN0IHNlcV9maWxlICptKSB7IH0KKyNlbmRpZgorCitzdGF0aWMgaW50IHRpbWVyX2xpc3Rfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJdTY0IG5vdyA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKTsKKwlpbnQgY3B1OworCisJU0VRX3ByaW50ZihtLCAiVGltZXIgTGlzdCBWZXJzaW9uOiB2MC4zXG4iKTsKKwlTRVFfcHJpbnRmKG0sICJIUlRJTUVSX01BWF9DTE9DS19CQVNFUzogJWRcbiIsIEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTKTsKKwlTRVFfcHJpbnRmKG0sICJub3cgYXQgJUxkIG5zZWNzXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKW5vdyk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJcHJpbnRfY3B1KG0sIGNwdSwgbm93KTsKKworCVNFUV9wcmludGYobSwgIlxuIik7CisJdGltZXJfbGlzdF9zaG93X3RpY2tkZXZpY2VzKG0pOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3lzcnFfdGltZXJfbGlzdF9zaG93KHZvaWQpCit7CisJdGltZXJfbGlzdF9zaG93KE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHRpbWVyX2xpc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlscCwgdGltZXJfbGlzdF9zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGltZXJfbGlzdF9mb3BzID0geworCS5vcGVuCQk9IHRpbWVyX2xpc3Rfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90aW1lcl9saXN0X3Byb2Nmcyh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGU7CisKKwlwZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJ0aW1lcl9saXN0IiwgMDY0NCwgTlVMTCk7CisJaWYgKCFwZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZS0+cHJvY19mb3BzID0gJnRpbWVyX2xpc3RfZm9wczsKKworCXJldHVybiAwOworfQorX19pbml0Y2FsbChpbml0X3RpbWVyX2xpc3RfcHJvY2ZzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMgYi9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzQ4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCkBAIC0wLDAgKzEsNDExIEBACisvKgorICoga2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYworICoKKyAqIENvbGxlY3QgdGltZXIgdXNhZ2Ugc3RhdGlzdGljcy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNiwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqIENvcHlyaWdodChDKSAyMDA2IFRpbWVzeXMgQ29ycC4sIFRob21hcyBHbGVpeG5lciA8dGdseEB0aW1lc3lzLmNvbT4KKyAqCisgKiB0aW1lcl9zdGF0cyBpcyBiYXNlZCBvbiB0aW1lcl90b3AsIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5IHdoaWNoIHdhcyBwYXJ0IG9mCisgKiBDb24gS29saXZhcyBkeW50aWNrIHBhdGNoIHNldC4gSXQgd2FzIGRldmVsb3BlZCBieSBEYW5pZWwgUGV0cmluaSBhdCB0aGUKKyAqIEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhIC0gSU5kVCAtIE1hbmF1cy4gdGltZXJfdG9wJ3MgZGVzaWduIHdhcyBiYXNlZAorICogb24gZHluYW1pYyBhbGxvY2F0aW9uIG9mIHRoZSBzdGF0aXN0aWNzIGVudHJpZXMgYW5kIGxpbmVhciBzZWFyY2ggYmFzZWQKKyAqIGxvb2t1cCBjb21iaW5lZCB3aXRoIGEgZ2xvYmFsIGxvY2ssIHJhdGhlciB0aGFuIHRoZSBzdGF0aWMgYXJyYXksIGhhc2gKKyAqIGFuZCBwZXItQ1BVIGxvY2tpbmcgd2hpY2ggaXMgdXNlZCBieSB0aW1lcl9zdGF0cy4gSXQgd2FzIHdyaXR0ZW4gZm9yIHRoZQorICogcHJlIGhydGltZXIga2VybmVsIGNvZGUgYW5kIHRoZXJlZm9yZSBkaWQgbm90IHRha2UgaHJ0aW1lcnMgaW50byBhY2NvdW50LgorICogTmV2ZXJ0aGVsZXNzIGl0IHByb3ZpZGVkIHRoZSBiYXNlIGZvciB0aGUgdGltZXJfc3RhdHMgaW1wbGVtZW50YXRpb24gYW5kCisgKiB3YXMgYSBoZWxwZnVsIHNvdXJjZSBvZiBpbnNwaXJhdGlvbi4gS3Vkb3MgdG8gRGFuaWVsIGFuZCB0aGUgTm9raWEgZm9sa3MKKyAqIGZvciB0aGlzIGVmZm9ydC4KKyAqCisgKiB0aW1lcl90b3AuYyBpcworICoJQ29weXJpZ2h0IChDKSAyMDA1IEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhIC0gSU5kVCAtIE1hbmF1cworICoJV3JpdHRlbiBieSBEYW5pZWwgUGV0cmluaSA8ZC5wZW5zYXRvckBnbWFpbC5jb20+CisgKgl0aW1lcl90b3AuYyB3YXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICoKKyAqIFdlIGV4cG9ydCB0aGUgYWRkcmVzc2VzIGFuZCBjb3VudGluZyBvZiB0aW1lciBmdW5jdGlvbnMgYmVpbmcgY2FsbGVkLAorICogdGhlIHBpZCBhbmQgY21kbGluZSBmcm9tIHRoZSBvd25lciBwcm9jZXNzIGlmIGFwcGxpY2FibGUuCisgKgorICogU3RhcnQvc3RvcCBkYXRhIGNvbGxlY3Rpb246CisgKiAjIGVjaG8gMVswXSA+L3Byb2MvdGltZXJfc3RhdHMKKyAqCisgKiBEaXNwbGF5IHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgc28gZmFyOgorICogIyBjYXQgL3Byb2MvdGltZXJfc3RhdHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qCisgKiBUaGlzIGlzIG91ciBiYXNpYyB1bml0IG9mIGludGVyZXN0OiBhIHRpbWVyIGV4cGlyeSBldmVudCBpZGVudGlmaWVkCisgKiBieSB0aGUgdGltZXIsIGl0cyBzdGFydC9leHBpcmUgZnVuY3Rpb25zIGFuZCB0aGUgUElEIG9mIHRoZSB0YXNrIHRoYXQKKyAqIHN0YXJ0ZWQgdGhlIHRpbWVyLiBXZSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuIGV2ZW50IGhhcHBlbnM6CisgKi8KK3N0cnVjdCBlbnRyeSB7CisJLyoKKwkgKiBIYXNoIGxpc3Q6CisJICovCisJc3RydWN0IGVudHJ5CQkqbmV4dDsKKworCS8qCisJICogSGFzaCBrZXlzOgorCSAqLworCXZvaWQJCQkqdGltZXI7CisJdm9pZAkJCSpzdGFydF9mdW5jOworCXZvaWQJCQkqZXhwaXJlX2Z1bmM7CisJcGlkX3QJCQlwaWQ7CisKKwkvKgorCSAqIE51bWJlciBvZiB0aW1lb3V0IGV2ZW50czoKKwkgKi8KKwl1bnNpZ25lZCBsb25nCQljb3VudDsKKworCS8qCisJICogV2Ugc2F2ZSB0aGUgY29tbWFuZC1saW5lIHN0cmluZyB0byBwcmVzZXJ2ZQorCSAqIHRoaXMgaW5mb3JtYXRpb24gcGFzdCB0YXNrIGV4aXQ6CisJICovCisJY2hhcgkJCWNvbW1bVEFTS19DT01NX0xFTiArIDFdOworCit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisKKy8qCisgKiBTcGlubG9jayBwcm90ZWN0aW5nIHRoZSB0YWJsZXMgLSBub3QgdGFrZW4gZHVyaW5nIGxvb2t1cDoKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyh0YWJsZV9sb2NrKTsKKworLyoKKyAqIFBlci1DUFUgbG9va3VwIGxvY2tzIGZvciBmYXN0IGhhc2ggbG9va3VwOgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3BpbmxvY2tfdCwgbG9va3VwX2xvY2spOworCisvKgorICogTXV0ZXggdG8gc2VyaWFsaXplIHN0YXRlIGNoYW5nZXMgd2l0aCBzaG93LXN0YXRzIGFjdGl2aXRpZXM6CisgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoc2hvd19tdXRleCk7CisKKy8qCisgKiBDb2xsZWN0aW9uIHN0YXR1cywgYWN0aXZlL2luYWN0aXZlOgorICovCitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgYWN0aXZlOworCisvKgorICogQmVnaW5uaW5nL2VuZCB0aW1lc3RhbXBzIG9mIG1lYXN1cmVtZW50OgorICovCitzdGF0aWMga3RpbWVfdCB0aW1lX3N0YXJ0LCB0aW1lX3N0b3A7CisKKy8qCisgKiB0c3RhdCBlbnRyeSBzdHJ1Y3RzIG9ubHkgZ2V0IGFsbG9jYXRlZCB3aGlsZSBjb2xsZWN0aW9uIGlzCisgKiBhY3RpdmUgYW5kIG5ldmVyIGZyZWVkIGR1cmluZyB0aGF0IHRpbWUgLSB0aGlzIHNpbXBsaWZpZXMKKyAqIHRoaW5ncyBxdWl0ZSBhIGJpdC4KKyAqCisgKiBUaGV5IGdldCBmcmVlZCB3aGVuIGEgbmV3IGNvbGxlY3Rpb24gcGVyaW9kIGlzIHN0YXJ0ZWQuCisgKi8KKyNkZWZpbmUgTUFYX0VOVFJJRVNfQklUUwkxMAorI2RlZmluZSBNQVhfRU5UUklFUwkJKDFVTCA8PCBNQVhfRU5UUklFU19CSVRTKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBucl9lbnRyaWVzOworc3RhdGljIHN0cnVjdCBlbnRyeSBlbnRyaWVzW01BWF9FTlRSSUVTXTsKKworc3RhdGljIGF0b21pY190IG92ZXJmbG93X2NvdW50OworCitzdGF0aWMgdm9pZCByZXNldF9lbnRyaWVzKHZvaWQpCit7CisJbnJfZW50cmllcyA9IDA7CisJbWVtc2V0KGVudHJpZXMsIDAsIHNpemVvZihlbnRyaWVzKSk7CisJYXRvbWljX3NldCgmb3ZlcmZsb3dfY291bnQsIDApOworfQorCitzdGF0aWMgc3RydWN0IGVudHJ5ICphbGxvY19lbnRyeSh2b2lkKQoreworCWlmIChucl9lbnRyaWVzID49IE1BWF9FTlRSSUVTKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBlbnRyaWVzICsgbnJfZW50cmllcysrOworfQorCisvKgorICogVGhlIGVudHJpZXMgYXJlIGluIGEgaGFzaC10YWJsZSwgZm9yIGZhc3QgbG9va3VwOgorICovCisjZGVmaW5lIFRTVEFUX0hBU0hfQklUUwkJKE1BWF9FTlRSSUVTX0JJVFMgLSAxKQorI2RlZmluZSBUU1RBVF9IQVNIX1NJWkUJCSgxVUwgPDwgVFNUQVRfSEFTSF9CSVRTKQorI2RlZmluZSBUU1RBVF9IQVNIX01BU0sJCShUU1RBVF9IQVNIX1NJWkUgLSAxKQorCisjZGVmaW5lIF9fdHN0YXRfaGFzaGZuKGVudHJ5KQkJCQkJCVwKKwkoKCh1bnNpZ25lZCBsb25nKShlbnRyeSktPnRpbWVyICAgICAgIF4JCQkJXAorCSAgKHVuc2lnbmVkIGxvbmcpKGVudHJ5KS0+c3RhcnRfZnVuYyAgXgkJCQlcCisJICAodW5zaWduZWQgbG9uZykoZW50cnkpLT5leHBpcmVfZnVuYyBeCQkJCVwKKwkgICh1bnNpZ25lZCBsb25nKShlbnRyeSktPnBpZAkJKSAmIFRTVEFUX0hBU0hfTUFTSykKKworI2RlZmluZSB0c3RhdF9oYXNoZW50cnkoZW50cnkpCSh0c3RhdF9oYXNoX3RhYmxlICsgX190c3RhdF9oYXNoZm4oZW50cnkpKQorCitzdGF0aWMgc3RydWN0IGVudHJ5ICp0c3RhdF9oYXNoX3RhYmxlW1RTVEFUX0hBU0hfU0laRV0gX19yZWFkX21vc3RseTsKKworc3RhdGljIGludCBtYXRjaF9lbnRyaWVzKHN0cnVjdCBlbnRyeSAqZW50cnkxLCBzdHJ1Y3QgZW50cnkgKmVudHJ5MikKK3sKKwlyZXR1cm4gZW50cnkxLT50aW1lciAgICAgICA9PSBlbnRyeTItPnRpbWVyCSAgJiYKKwkgICAgICAgZW50cnkxLT5zdGFydF9mdW5jICA9PSBlbnRyeTItPnN0YXJ0X2Z1bmMgICYmCisJICAgICAgIGVudHJ5MS0+ZXhwaXJlX2Z1bmMgPT0gZW50cnkyLT5leHBpcmVfZnVuYyAmJgorCSAgICAgICBlbnRyeTEtPnBpZAkgICA9PSBlbnRyeTItPnBpZDsKK30KKworLyoKKyAqIExvb2sgdXAgd2hldGhlciBhbiBlbnRyeSBtYXRjaGluZyB0aGlzIGl0ZW0gaXMgcHJlc2VudAorICogaW4gdGhlIGhhc2ggYWxyZWFkeS4gTXVzdCBiZSBjYWxsZWQgd2l0aCBpcnFzIG9mZiBhbmQgdGhlCisgKiBsb29rdXAgbG9jayBoZWxkOgorICovCitzdGF0aWMgc3RydWN0IGVudHJ5ICp0c3RhdF9sb29rdXAoc3RydWN0IGVudHJ5ICplbnRyeSwgY2hhciAqY29tbSkKK3sKKwlzdHJ1Y3QgZW50cnkgKipoZWFkLCAqY3VyciwgKnByZXY7CisKKwloZWFkID0gdHN0YXRfaGFzaGVudHJ5KGVudHJ5KTsKKwljdXJyID0gKmhlYWQ7CisKKwkvKgorCSAqIFRoZSBmYXN0cGF0aCBpcyB3aGVuIHRoZSBlbnRyeSBpcyBhbHJlYWR5IGhhc2hlZCwKKwkgKiB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvb2t1cCBsb2NrIGhlbGQsIGJ1dCB3aXRoIHRoZQorCSAqIHRhYmxlIGxvY2sgbm90IGhlbGQ6CisJICovCisJd2hpbGUgKGN1cnIpIHsKKwkJaWYgKG1hdGNoX2VudHJpZXMoY3VyciwgZW50cnkpKQorCQkJcmV0dXJuIGN1cnI7CisKKwkJY3VyciA9IGN1cnItPm5leHQ7CisJfQorCS8qCisJICogU2xvd3BhdGg6IGFsbG9jYXRlLCBzZXQgdXAgYW5kIGxpbmsgYSBuZXcgaGFzaCBlbnRyeToKKwkgKi8KKwlwcmV2ID0gTlVMTDsKKwljdXJyID0gKmhlYWQ7CisKKwlzcGluX2xvY2soJnRhYmxlX2xvY2spOworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgbm90IHJhY2VkIHdpdGggYW5vdGhlciBDUFU6CisJICovCisJd2hpbGUgKGN1cnIpIHsKKwkJaWYgKG1hdGNoX2VudHJpZXMoY3VyciwgZW50cnkpKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCXByZXYgPSBjdXJyOworCQljdXJyID0gY3Vyci0+bmV4dDsKKwl9CisKKwljdXJyID0gYWxsb2NfZW50cnkoKTsKKwlpZiAoY3VycikgeworCQkqY3VyciA9ICplbnRyeTsKKwkJY3Vyci0+Y291bnQgPSAwOworCQltZW1jcHkoY3Vyci0+Y29tbSwgY29tbSwgVEFTS19DT01NX0xFTik7CisJCWlmIChwcmV2KQorCQkJcHJldi0+bmV4dCA9IGN1cnI7CisJCWVsc2UKKwkJCSpoZWFkID0gY3VycjsKKwkJY3Vyci0+bmV4dCA9IE5VTEw7CisJfQorIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJnRhYmxlX2xvY2spOworCisJcmV0dXJuIGN1cnI7Cit9CisKKy8qKgorICogdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzIC0gVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGZvciBhIHRpbWVyLgorICogQHRpbWVyOglwb2ludGVyIHRvIGVpdGhlciBhIHRpbWVyX2xpc3Qgb3IgYSBocnRpbWVyCisgKiBAcGlkOgl0aGUgcGlkIG9mIHRoZSB0YXNrIHdoaWNoIHNldCB1cCB0aGUgdGltZXIKKyAqIEBzdGFydGY6CXBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHdoaWNoIGRpZCB0aGUgdGltZXIgc2V0dXAKKyAqIEB0aW1lcmY6CXBvaW50ZXIgdG8gdGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSB0aW1lcgorICogQGNvbW06CW5hbWUgb2YgdGhlIHByb2Nlc3Mgd2hpY2ggc2V0IHVwIHRoZSB0aW1lcgorICoKKyAqIFdoZW4gdGhlIHRpbWVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgdGhlbiB0aGUgZXZlbnQgY291bnRlciBpcworICogaW5jcmVtZW50ZWQuIE90aGVyd2lzZSB0aGUgdGltZXIgaXMgcmVnaXN0ZXJlZCBpbiBhIGZyZWUgc2xvdC4KKyAqLwordm9pZCB0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModm9pZCAqdGltZXIsIHBpZF90IHBpZCwgdm9pZCAqc3RhcnRmLAorCQkJICAgICAgdm9pZCAqdGltZXJmLCBjaGFyICogY29tbSkKK3sKKwkvKgorCSAqIEl0IGRvZXNudCBtYXR0ZXIgd2hpY2ggbG9jayB3ZSB0YWtlOgorCSAqLworCXNwaW5sb2NrX3QgKmxvY2sgPSAmcGVyX2NwdShsb29rdXBfbG9jaywgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJc3RydWN0IGVudHJ5ICplbnRyeSwgaW5wdXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlucHV0LnRpbWVyID0gdGltZXI7CisJaW5wdXQuc3RhcnRfZnVuYyA9IHN0YXJ0ZjsKKwlpbnB1dC5leHBpcmVfZnVuYyA9IHRpbWVyZjsKKwlpbnB1dC5waWQgPSBwaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CisJaWYgKCFhY3RpdmUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWVudHJ5ID0gdHN0YXRfbG9va3VwKCZpbnB1dCwgY29tbSk7CisJaWYgKGxpa2VseShlbnRyeSkpCisJCWVudHJ5LT5jb3VudCsrOworCWVsc2UKKwkJYXRvbWljX2luYygmb3ZlcmZsb3dfY291bnQpOworCisgb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbmFtZV9vZmZzZXQoc3RydWN0IHNlcV9maWxlICptLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07CisJdW5zaWduZWQgbG9uZyBzaXplLCBvZmZzZXQ7CisJY29uc3QgY2hhciAqc3ltX25hbWU7CisJY2hhciAqbW9kbmFtZTsKKworCXN5bV9uYW1lID0ga2FsbHN5bXNfbG9va3VwKGFkZHIsICZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgbmFtZWJ1Zik7CisJaWYgKHN5bV9uYW1lKQorCQlzZXFfcHJpbnRmKG0sICIlcyIsIHN5bV9uYW1lKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgIjwlcD4iLCAodm9pZCAqKWFkZHIpOworfQorCitzdGF0aWMgaW50IHRzdGF0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgcGVyaW9kOworCXN0cnVjdCBlbnRyeSAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBtczsKKwlsb25nIGV2ZW50cyA9IDA7CisJa3RpbWVfdCB0aW1lOworCWludCBpOworCisJbXV0ZXhfbG9jaygmc2hvd19tdXRleCk7CisJLyoKKwkgKiBJZiBzdGlsbCBhY3RpdmUgdGhlbiBjYWxjdWxhdGUgdXAgdG8gbm93OgorCSAqLworCWlmIChhY3RpdmUpCisJCXRpbWVfc3RvcCA9IGt0aW1lX2dldCgpOworCisJdGltZSA9IGt0aW1lX3N1Yih0aW1lX3N0b3AsIHRpbWVfc3RhcnQpOworCisJcGVyaW9kID0ga3RpbWVfdG9fdGltZXNwZWModGltZSk7CisJbXMgPSBwZXJpb2QudHZfbnNlYyAvIDEwMDAwMDA7CisKKwlzZXFfcHV0cyhtLCAiVGltZXIgU3RhdHMgVmVyc2lvbjogdjAuMVxuIik7CisJc2VxX3ByaW50ZihtLCAiU2FtcGxlIHBlcmlvZDogJWxkLiUwM2xkIHNcbiIsIHBlcmlvZC50dl9zZWMsIG1zKTsKKwlpZiAoYXRvbWljX3JlYWQoJm92ZXJmbG93X2NvdW50KSkKKwkJc2VxX3ByaW50ZihtLCAiT3ZlcmZsb3c6ICVkIGVudHJpZXNcbiIsCisJCQlhdG9taWNfcmVhZCgmb3ZlcmZsb3dfY291bnQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9lbnRyaWVzOyBpKyspIHsKKwkJZW50cnkgPSBlbnRyaWVzICsgaTsKKwkJc2VxX3ByaW50ZihtLCAiJTRsdSwgJTVkICUtMTZzICIsCisJCQkJZW50cnktPmNvdW50LCBlbnRyeS0+cGlkLCBlbnRyeS0+Y29tbSk7CisKKwkJcHJpbnRfbmFtZV9vZmZzZXQobSwgKHVuc2lnbmVkIGxvbmcpZW50cnktPnN0YXJ0X2Z1bmMpOworCQlzZXFfcHV0cyhtLCAiICgiKTsKKwkJcHJpbnRfbmFtZV9vZmZzZXQobSwgKHVuc2lnbmVkIGxvbmcpZW50cnktPmV4cGlyZV9mdW5jKTsKKwkJc2VxX3B1dHMobSwgIilcbiIpOworCisJCWV2ZW50cyArPSBlbnRyeS0+Y291bnQ7CisJfQorCisJbXMgKz0gcGVyaW9kLnR2X3NlYyAqIDEwMDA7CisJaWYgKCFtcykKKwkJbXMgPSAxOworCisJaWYgKGV2ZW50cyAmJiBwZXJpb2QudHZfc2VjKQorCQlzZXFfcHJpbnRmKG0sICIlbGQgdG90YWwgZXZlbnRzLCAlbGQuJWxkIGV2ZW50cy9zZWNcbiIsIGV2ZW50cywKKwkJCSAgIGV2ZW50cyAvIHBlcmlvZC50dl9zZWMsIGV2ZW50cyAqIDEwMDAgLyBtcyk7CisJZWxzZQorCQlzZXFfcHJpbnRmKG0sICIlbGQgdG90YWwgZXZlbnRzXG4iLCBldmVudHMpOworCisJbXV0ZXhfdW5sb2NrKCZzaG93X211dGV4KTsKKworCXJldHVybiAwOworfQorCisvKgorICogQWZ0ZXIgYSBzdGF0ZSBjaGFuZ2UsIG1ha2Ugc3VyZSBhbGwgY29uY3VycmVudCBsb29rdXAvdXBkYXRlCisgKiBhY3Rpdml0aWVzIGhhdmUgc3RvcHBlZDoKKyAqLworc3RhdGljIHZvaWQgc3luY19hY2Nlc3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsb29rdXBfbG9jaywgY3B1KSwgZmxhZ3MpOworCQkvKiBub3RoaW5nICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobG9va3VwX2xvY2ssIGNwdSksIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzdGF0c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcykKK3sKKwljaGFyIGN0bFsyXTsKKworCWlmIChjb3VudCAhPSAyIHx8ICpvZmZzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihjdGwsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW11dGV4X2xvY2soJnNob3dfbXV0ZXgpOworCXN3aXRjaCAoY3RsWzBdKSB7CisJY2FzZSAnMCc6CisJCWlmIChhY3RpdmUpIHsKKwkJCWFjdGl2ZSA9IDA7CisJCQl0aW1lX3N0b3AgPSBrdGltZV9nZXQoKTsKKwkJCXN5bmNfYWNjZXNzKCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnMSc6CisJCWlmICghYWN0aXZlKSB7CisJCQlyZXNldF9lbnRyaWVzKCk7CisJCQl0aW1lX3N0YXJ0ID0ga3RpbWVfZ2V0KCk7CisJCQlhY3RpdmUgPSAxOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvdW50ID0gLUVJTlZBTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzaG93X211dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB0c3RhdHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlscCwgdHN0YXRzX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0c3RhdHNfZm9wcyA9IHsKKwkub3BlbgkJPSB0c3RhdHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gdHN0YXRzX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCit2b2lkIF9faW5pdCBpbml0X3RpbWVyX3N0YXRzKHZvaWQpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCXNwaW5fbG9ja19pbml0KCZwZXJfY3B1KGxvb2t1cF9sb2NrLCBjcHUpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF90c3RhdHNfcHJvY2ZzKHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZTsKKworCXBlID0gY3JlYXRlX3Byb2NfZW50cnkoInRpbWVyX3N0YXRzIiwgMDY0NCwgTlVMTCk7CisJaWYgKCFwZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZS0+cHJvY19mb3BzID0gJnRzdGF0c19mb3BzOworCisJcmV0dXJuIDA7Cit9CitfX2luaXRjYWxsKGluaXRfdHN0YXRzX3Byb2Nmcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IDQ5MDIxODEuLmNiMWI4NmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC0zNCw2ICszNCw4IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC0yNjIsNiArMjY0LDE4IEBACiAJbGlzdF9hZGRfdGFpbCgmdGltZXItPmVudHJ5LCB2ZWMpOwogfQogCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCit2b2lkIF9fdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCB2b2lkICphZGRyKQoreworCWlmICh0aW1lci0+c3RhcnRfc2l0ZSkKKwkJcmV0dXJuOworCisJdGltZXItPnN0YXJ0X3NpdGUgPSBhZGRyOworCW1lbWNweSh0aW1lci0+c3RhcnRfY29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJdGltZXItPnN0YXJ0X3BpZCA9IGN1cnJlbnQtPnBpZDsKK30KKyNlbmRpZgorCiAvKioKICAqIGluaXRfdGltZXIgLSBpbml0aWFsaXplIGEgdGltZXIuCiAgKiBAdGltZXI6IHRoZSB0aW1lciB0byBiZSBpbml0aWFsaXplZApAQCAtMjczLDExICsyODcsMTYgQEAKIHsKIAl0aW1lci0+ZW50cnkubmV4dCA9IE5VTEw7CiAJdGltZXItPmJhc2UgPSBfX3Jhd19nZXRfY3B1X3Zhcih0dmVjX2Jhc2VzKTsKKyNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKKwl0aW1lci0+c3RhcnRfc2l0ZSA9IE5VTEw7CisJdGltZXItPnN0YXJ0X3BpZCA9IC0xOworCW1lbXNldCh0aW1lci0+c3RhcnRfY29tbSwgMCwgVEFTS19DT01NX0xFTik7CisjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0woaW5pdF90aW1lcik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXRhY2hfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAotCQkJCQlpbnQgY2xlYXJfcGVuZGluZykKKwkJCQlpbnQgY2xlYXJfcGVuZGluZykKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9ICZ0aW1lci0+ZW50cnk7CiAKQEAgLTMyNCw2ICszNDMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKKwl0aW1lcl9zdGF0c190aW1lcl9zZXRfc3RhcnRfaW5mbyh0aW1lcik7CiAJQlVHX09OKCF0aW1lci0+ZnVuY3Rpb24pOwogCiAJYmFzZSA9IGxvY2tfdGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKQEAgLTM3NCw2ICszOTQsNyBAQAogCXR2ZWNfYmFzZV90ICpiYXNlID0gcGVyX2NwdSh0dmVjX2Jhc2VzLCBjcHUpOwogICAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKICAgCUJVR19PTih0aW1lcl9wZW5kaW5nKHRpbWVyKSB8fCAhdGltZXItPmZ1bmN0aW9uKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+bG9jaywgZmxhZ3MpOwogCXRpbWVyLT5iYXNlID0gYmFzZTsKQEAgLTQwNiw2ICs0MjcsNyBAQAogewogCUJVR19PTighdGltZXItPmZ1bmN0aW9uKTsKIAorCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKIAkvKgogCSAqIFRoaXMgaXMgYSBjb21tb24gb3B0aW1pemF0aW9uIHRyaWdnZXJlZCBieSB0aGUKIAkgKiBuZXR3b3JraW5nIGNvZGUgLSBpZiB0aGUgdGltZXIgaXMgcmUtbW9kaWZpZWQKQEAgLTQzNiw2ICs0NTgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKKwl0aW1lcl9zdGF0c190aW1lcl9jbGVhcl9zdGFydF9pbmZvKHRpbWVyKTsKIAlpZiAodGltZXJfcGVuZGluZyh0aW1lcikpIHsKIAkJYmFzZSA9IGxvY2tfdGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIAkJaWYgKHRpbWVyX3BlbmRpbmcodGltZXIpKSB7CkBAIC01NjksNiArNTkyLDggQEAKICAJCQlmbiA9IHRpbWVyLT5mdW5jdGlvbjsKICAJCQlkYXRhID0gdGltZXItPmRhdGE7CiAKKwkJCXRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIodGltZXIpOworCiAJCQlzZXRfcnVubmluZ190aW1lcihiYXNlLCB0aW1lcik7CiAJCQlkZXRhY2hfdGltZXIodGltZXIsIDEpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZiYXNlLT5sb2NrKTsKQEAgLTU5MSwxMDUgKzYxNiwxMjQgQEAKIAlzcGluX3VubG9ja19pcnEoJmJhc2UtPmxvY2spOwogfQogCi0jaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKyNpZiBkZWZpbmVkKENPTkZJR19OT19JRExFX0haKSB8fCBkZWZpbmVkKENPTkZJR19OT19IWikKIC8qCiAgKiBGaW5kIG91dCB3aGVuIHRoZSBuZXh0IHRpbWVyIGV2ZW50IGlzIGR1ZSB0byBoYXBwZW4uIFRoaXMKICAqIGlzIHVzZWQgb24gUy8zOTAgdG8gc3RvcCBhbGwgYWN0aXZpdHkgd2hlbiBhIGNwdXMgaXMgaWRsZS4KICAqIFRoaXMgZnVuY3Rpb25zIG5lZWRzIHRvIGJlIGNhbGxlZCBkaXNhYmxlZC4KICAqLwotdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyX2ludGVycnVwdCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19uZXh0X3RpbWVyX2ludGVycnVwdCh0dmVjX2Jhc2VfdCAqYmFzZSkKIHsKLQl0dmVjX2Jhc2VfdCAqYmFzZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXVuc2lnbmVkIGxvbmcgdGltZXJfamlmZmllcyA9IGJhc2UtPnRpbWVyX2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBleHBpcmVzID0gdGltZXJfamlmZmllcyArIChMT05HX01BWCA+PiAxKTsKKwlpbnQgaW5kZXgsIHNsb3QsIGFycmF5LCBmb3VuZCA9IDA7CiAJc3RydWN0IHRpbWVyX2xpc3QgKm50ZTsKLQl1bnNpZ25lZCBsb25nIGV4cGlyZXM7Ci0JdW5zaWduZWQgbG9uZyBocl9leHBpcmVzID0gTUFYX0pJRkZZX09GRlNFVDsKLQlrdGltZV90IGhyX2RlbHRhOwogCXR2ZWNfdCAqdmFycmF5WzRdOwotCWludCBpLCBqOwotCi0JaHJfZGVsdGEgPSBocnRpbWVyX2dldF9uZXh0X2V2ZW50KCk7Ci0JaWYgKGhyX2RlbHRhLnR2NjQgIT0gS1RJTUVfTUFYKSB7Ci0JCXN0cnVjdCB0aW1lc3BlYyB0c2RlbHRhOwotCQl0c2RlbHRhID0ga3RpbWVfdG9fdGltZXNwZWMoaHJfZGVsdGEpOwotCQlocl9leHBpcmVzID0gdGltZXNwZWNfdG9famlmZmllcygmdHNkZWx0YSk7Ci0JCWlmIChocl9leHBpcmVzIDwgMykKLQkJCXJldHVybiBocl9leHBpcmVzICsgamlmZmllczsKLQl9Ci0JaHJfZXhwaXJlcyArPSBqaWZmaWVzOwotCi0JYmFzZSA9IF9fZ2V0X2NwdV92YXIodHZlY19iYXNlcyk7Ci0Jc3Bpbl9sb2NrKCZiYXNlLT5sb2NrKTsKLQlleHBpcmVzID0gYmFzZS0+dGltZXJfamlmZmllcyArIChMT05HX01BWCA+PiAxKTsKLQlsaXN0ID0gTlVMTDsKIAogCS8qIExvb2sgZm9yIHRpbWVyIGV2ZW50cyBpbiB0djEuICovCi0JaiA9IGJhc2UtPnRpbWVyX2ppZmZpZXMgJiBUVlJfTUFTSzsKKwlpbmRleCA9IHNsb3QgPSB0aW1lcl9qaWZmaWVzICYgVFZSX01BU0s7CiAJZG8gewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG50ZSwgYmFzZS0+dHYxLnZlYyArIGosIGVudHJ5KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobnRlLCBiYXNlLT50djEudmVjICsgc2xvdCwgZW50cnkpIHsKKwkJCWZvdW5kID0gMTsKIAkJCWV4cGlyZXMgPSBudGUtPmV4cGlyZXM7Ci0JCQlpZiAoaiA8IChiYXNlLT50aW1lcl9qaWZmaWVzICYgVFZSX01BU0spKQotCQkJCWxpc3QgPSBiYXNlLT50djIudmVjICsgKElOREVYKDApKTsKLQkJCWdvdG8gZm91bmQ7CisJCQkvKiBMb29rIGF0IHRoZSBjYXNjYWRlIGJ1Y2tldChzKT8gKi8KKwkJCWlmICghaW5kZXggfHwgc2xvdCA8IGluZGV4KQorCQkJCWdvdG8gY2FzY2FkZTsKKwkJCXJldHVybiBleHBpcmVzOwogCQl9Ci0JCWogPSAoaiArIDEpICYgVFZSX01BU0s7Ci0JfSB3aGlsZSAoaiAhPSAoYmFzZS0+dGltZXJfamlmZmllcyAmIFRWUl9NQVNLKSk7CisJCXNsb3QgPSAoc2xvdCArIDEpICYgVFZSX01BU0s7CisJfSB3aGlsZSAoc2xvdCAhPSBpbmRleCk7CisKK2Nhc2NhZGU6CisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IGNhc2NhZGUgZXZlbnQgKi8KKwlpZiAoaW5kZXgpCisJCXRpbWVyX2ppZmZpZXMgKz0gVFZSX1NJWkUgLSBpbmRleDsKKwl0aW1lcl9qaWZmaWVzID4+PSBUVlJfQklUUzsKIAogCS8qIENoZWNrIHR2Mi10djUuICovCiAJdmFycmF5WzBdID0gJmJhc2UtPnR2MjsKIAl2YXJyYXlbMV0gPSAmYmFzZS0+dHYzOwogCXZhcnJheVsyXSA9ICZiYXNlLT50djQ7CiAJdmFycmF5WzNdID0gJmJhc2UtPnR2NTsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWogPSBJTkRFWChpKTsKKworCWZvciAoYXJyYXkgPSAwOyBhcnJheSA8IDQ7IGFycmF5KyspIHsKKwkJdHZlY190ICp2YXJwID0gdmFycmF5W2FycmF5XTsKKworCQlpbmRleCA9IHNsb3QgPSB0aW1lcl9qaWZmaWVzICYgVFZOX01BU0s7CiAJCWRvIHsKLQkJCWlmIChsaXN0X2VtcHR5KHZhcnJheVtpXS0+dmVjICsgaikpIHsKLQkJCQlqID0gKGogKyAxKSAmIFRWTl9NQVNLOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShudGUsIHZhcnJheVtpXS0+dmVjICsgaiwgZW50cnkpCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG50ZSwgdmFycC0+dmVjICsgc2xvdCwgZW50cnkpIHsKKwkJCQlmb3VuZCA9IDE7CiAJCQkJaWYgKHRpbWVfYmVmb3JlKG50ZS0+ZXhwaXJlcywgZXhwaXJlcykpCiAJCQkJCWV4cGlyZXMgPSBudGUtPmV4cGlyZXM7Ci0JCQlpZiAoaiA8IChJTkRFWChpKSkgJiYgaSA8IDMpCi0JCQkJbGlzdCA9IHZhcnJheVtpICsgMV0tPnZlYyArIChJTkRFWChpICsgMSkpOwotCQkJZ290byBmb3VuZDsKLQkJfSB3aGlsZSAoaiAhPSAoSU5ERVgoaSkpKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBEbyB3ZSBzdGlsbCBzZWFyY2ggZm9yIHRoZSBmaXJzdCB0aW1lciBvciBhcmUKKwkJCSAqIHdlIGxvb2tpbmcgdXAgdGhlIGNhc2NhZGUgYnVja2V0cyA/CisJCQkgKi8KKwkJCWlmIChmb3VuZCkgeworCQkJCS8qIExvb2sgYXQgdGhlIGNhc2NhZGUgYnVja2V0KHMpPyAqLworCQkJCWlmICghaW5kZXggfHwgc2xvdCA8IGluZGV4KQorCQkJCQlicmVhazsKKwkJCQlyZXR1cm4gZXhwaXJlczsKKwkJCX0KKwkJCXNsb3QgPSAoc2xvdCArIDEpICYgVFZOX01BU0s7CisJCX0gd2hpbGUgKHNsb3QgIT0gaW5kZXgpOworCisJCWlmIChpbmRleCkKKwkJCXRpbWVyX2ppZmZpZXMgKz0gVFZOX1NJWkUgLSBpbmRleDsKKwkJdGltZXJfamlmZmllcyA+Pj0gVFZOX0JJVFM7CiAJfQotZm91bmQ6Ci0JaWYgKGxpc3QpIHsKLQkJLyoKLQkJICogVGhlIHNlYXJjaCB3cmFwcGVkLiBXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIG5leHQgbGlzdAotCQkgKiBmcm9tIG5leHQgdHYgZWxlbWVudCB0aGF0IHdvdWxkIGNhc2NhZGUgaW50byB0diBlbGVtZW50Ci0JCSAqIHdoZXJlIHdlIGZvdW5kIHRoZSB0aW1lciBlbGVtZW50LgotCQkgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShudGUsIGxpc3QsIGVudHJ5KSB7Ci0JCQlpZiAodGltZV9iZWZvcmUobnRlLT5leHBpcmVzLCBleHBpcmVzKSkKLQkJCQlleHBpcmVzID0gbnRlLT5leHBpcmVzOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZiYXNlLT5sb2NrKTsKLQotCS8qCi0JICogSXQgY2FuIGhhcHBlbiB0aGF0IG90aGVyIENQVXMgc2VydmljZSB0aW1lciBJUlFzIGFuZCBpbmNyZW1lbnQKLQkgKiBqaWZmaWVzLCBidXQgd2UgaGF2ZSBub3QgeWV0IGdvdCBhIGxvY2FsIHRpbWVyIHRpY2sgdG8gcHJvY2VzcwotCSAqIHRoZSB0aW1lciB3aGVlbHMuICBJbiB0aGF0IGNhc2UsIHRoZSBleHBpcnkgdGltZSBjYW4gYmUgYmVmb3JlCi0JICogamlmZmllcywgYnV0IHNpbmNlIHRoZSBoaWdoLXJlc29sdXRpb24gdGltZXIgaGVyZSBpcyByZWxhdGl2ZSB0bwotCSAqIGppZmZpZXMsIHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gd2hlbiBoaWdoLXJlc29sdXRpb24gdGltZXJzIGFyZQotCSAqIG5vdCBhY3RpdmUsCi0JICoKLQkgKiAgIHRpbWVfYmVmb3JlKE1BWF9KSUZGWV9PRkZTRVQgKyBqaWZmaWVzLCBleHBpcmVzKQotCSAqCi0JICogd291bGQgZmFsc2VseSBldmFsdWF0ZSB0byB0cnVlLiAgSWYgdGhhdCBpcyB0aGUgY2FzZSwganVzdAotCSAqIHJldHVybiBqaWZmaWVzIHNvIHRoYXQgd2UgY2FuIGltbWVkaWF0ZWx5IGZpcmUgdGhlIGxvY2FsIHRpbWVyCi0JICovCi0JaWYgKHRpbWVfYmVmb3JlKGV4cGlyZXMsIGppZmZpZXMpKQotCQlyZXR1cm4gamlmZmllczsKLQotCWlmICh0aW1lX2JlZm9yZShocl9leHBpcmVzLCBleHBpcmVzKSkKLQkJcmV0dXJuIGhyX2V4cGlyZXM7Ci0KIAlyZXR1cm4gZXhwaXJlczsKIH0KKworLyoKKyAqIENoZWNrLCBpZiB0aGUgbmV4dCBocnRpbWVyIGV2ZW50IGlzIGJlZm9yZSB0aGUgbmV4dCB0aW1lciB3aGVlbAorICogZXZlbnQ6CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNtcF9uZXh0X2hydGltZXJfZXZlbnQodW5zaWduZWQgbG9uZyBub3csCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGV4cGlyZXMpCit7CisJa3RpbWVfdCBocl9kZWx0YSA9IGhydGltZXJfZ2V0X25leHRfZXZlbnQoKTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHNkZWx0YTsKKworCWlmIChocl9kZWx0YS50djY0ID09IEtUSU1FX01BWCkKKwkJcmV0dXJuIGV4cGlyZXM7CisKKwlpZiAoaHJfZGVsdGEudHY2NCA8PSBUSUNLX05TRUMpCisJCXJldHVybiBub3c7CisKKwl0c2RlbHRhID0ga3RpbWVfdG9fdGltZXNwZWMoaHJfZGVsdGEpOworCW5vdyArPSB0aW1lc3BlY190b19qaWZmaWVzKCZ0c2RlbHRhKTsKKwlpZiAodGltZV9iZWZvcmUobm93LCBleHBpcmVzKSkKKwkJcmV0dXJuIG5vdzsKKwlyZXR1cm4gZXhwaXJlczsKK30KKworLyoqCisgKiBuZXh0X3RpbWVyX2ludGVycnVwdCAtIHJldHVybiB0aGUgamlmZnkgb2YgdGhlIG5leHQgcGVuZGluZyB0aW1lcgorICovCit1bnNpZ25lZCBsb25nIGdldF9uZXh0X3RpbWVyX2ludGVycnVwdCh1bnNpZ25lZCBsb25nIG5vdykKK3sKKwl0dmVjX2Jhc2VfdCAqYmFzZSA9IF9fZ2V0X2NwdV92YXIodHZlY19iYXNlcyk7CisJdW5zaWduZWQgbG9uZyBleHBpcmVzOworCisJc3Bpbl9sb2NrKCZiYXNlLT5sb2NrKTsKKwlleHBpcmVzID0gX19uZXh0X3RpbWVyX2ludGVycnVwdChiYXNlKTsKKwlzcGluX3VubG9jaygmYmFzZS0+bG9jayk7CisKKwlpZiAodGltZV9iZWZvcmVfZXEoZXhwaXJlcywgbm93KSkKKwkJcmV0dXJuIG5vdzsKKworCXJldHVybiBjbXBfbmV4dF9ocnRpbWVyX2V2ZW50KG5vdywgZXhwaXJlcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfTk9fSURMRV9IWgordW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyX2ludGVycnVwdCh2b2lkKQoreworCXJldHVybiBnZXRfbmV4dF90aW1lcl9pbnRlcnJ1cHQoamlmZmllcyk7Cit9CisjZW5kaWYKKwogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04MzIsMzIgKzg3NiwzNSBAQAogICoKICAqIEFjY3VtdWxhdGVzIGN1cnJlbnQgdGltZSBpbnRlcnZhbCBhbmQgaW5pdGlhbGl6ZXMgbmV3IGNsb2Nrc291cmNlCiAgKi8KLXN0YXRpYyBpbnQgY2hhbmdlX2Nsb2Nrc291cmNlKHZvaWQpCitzdGF0aWMgdm9pZCBjaGFuZ2VfY2xvY2tzb3VyY2Uodm9pZCkKIHsKIAlzdHJ1Y3QgY2xvY2tzb3VyY2UgKm5ldzsKIAljeWNsZV90IG5vdzsKIAl1NjQgbnNlYzsKLQluZXcgPSBjbG9ja3NvdXJjZV9nZXRfbmV4dCgpOwotCWlmIChjbG9jayAhPSBuZXcpIHsKLQkJbm93ID0gY2xvY2tzb3VyY2VfcmVhZChuZXcpOwotCQluc2VjID0gIF9fZ2V0X25zZWNfb2Zmc2V0KCk7Ci0JCXRpbWVzcGVjX2FkZF9ucygmeHRpbWUsIG5zZWMpOwogCi0JCWNsb2NrID0gbmV3OwotCQljbG9jay0+Y3ljbGVfbGFzdCA9IG5vdzsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVGltZTogJXMgY2xvY2tzb3VyY2UgaGFzIGJlZW4gaW5zdGFsbGVkLlxuIiwKLQkJICAgICAgIGNsb2NrLT5uYW1lKTsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIGlmIChjbG9jay0+dXBkYXRlX2NhbGxiYWNrKSB7Ci0JCXJldHVybiBjbG9jay0+dXBkYXRlX2NhbGxiYWNrKCk7Ci0JfQotCXJldHVybiAwOworCW5ldyA9IGNsb2Nrc291cmNlX2dldF9uZXh0KCk7CisKKwlpZiAoY2xvY2sgPT0gbmV3KQorCQlyZXR1cm47CisKKwlub3cgPSBjbG9ja3NvdXJjZV9yZWFkKG5ldyk7CisJbnNlYyA9ICBfX2dldF9uc2VjX29mZnNldCgpOworCXRpbWVzcGVjX2FkZF9ucygmeHRpbWUsIG5zZWMpOworCisJY2xvY2sgPSBuZXc7CisJY2xvY2stPmN5Y2xlX2xhc3QgPSBub3c7CisKKwljbG9jay0+ZXJyb3IgPSAwOworCWNsb2NrLT54dGltZV9uc2VjID0gMDsKKwljbG9ja3NvdXJjZV9jYWxjdWxhdGVfaW50ZXJ2YWwoY2xvY2ssIE5UUF9JTlRFUlZBTF9MRU5HVEgpOworCisJdGlja19jbG9ja19ub3RpZnkoKTsKKworCXByaW50ayhLRVJOX0lORk8gIlRpbWU6ICVzIGNsb2Nrc291cmNlIGhhcyBiZWVuIGluc3RhbGxlZC5cbiIsCisJICAgICAgIGNsb2NrLT5uYW1lKTsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfY2xvY2tzb3VyY2Uodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFuZ2VfY2xvY2tzb3VyY2Uodm9pZCkgeyB9CiAjZW5kaWYKIAogLyoqCkBAIC04NzEsMzMgKzkxOCw1NiBAQAogCWRvIHsKIAkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7CiAKLQkJcmV0ID0gY2xvY2stPmlzX2NvbnRpbnVvdXM7CisJCXJldCA9IGNsb2NrLT5mbGFncyAmIENMT0NLX1NPVVJDRV9WQUxJRF9GT1JfSFJFUzsKIAogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwogCiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiByZWFkX3BlcnNpc3RlbnRfY2xvY2sgLSAgUmV0dXJuIHRpbWUgaW4gc2Vjb25kcyBmcm9tIHRoZSBwZXJzaXN0ZW50IGNsb2NrLgorICoKKyAqIFdlYWsgZHVtbXkgZnVuY3Rpb24gZm9yIGFyY2hlcyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydCBpdC4KKyAqIFJldHVybnMgc2Vjb25kcyBmcm9tIGVwb2NoIHVzaW5nIHRoZSBiYXR0ZXJ5IGJhY2tlZCBwZXJzaXN0ZW50IGNsb2NrLgorICogUmV0dXJucyB6ZXJvIGlmIHVuc3VwcG9ydGVkLgorICoKKyAqICBYWFggLSBEbyBiZSBzdXJlIHRvIHJlbW92ZSBpdCBvbmNlIGFsbCBhcmNoZXMgaW1wbGVtZW50IGl0LgorICovCit1bnNpZ25lZCBsb25nIF9fYXR0cmlidXRlX18oKHdlYWspKSByZWFkX3BlcnNpc3RlbnRfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIHRpbWVrZWVwaW5nX2luaXQgLSBJbml0aWFsaXplcyB0aGUgY2xvY2tzb3VyY2UgYW5kIGNvbW1vbiB0aW1la2VlcGluZyB2YWx1ZXMKICAqLwogdm9pZCBfX2luaXQgdGltZWtlZXBpbmdfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzZWMgPSByZWFkX3BlcnNpc3RlbnRfY2xvY2soKTsKIAogCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogCiAJbnRwX2NsZWFyKCk7CiAKIAljbG9jayA9IGNsb2Nrc291cmNlX2dldF9uZXh0KCk7Ci0JY2xvY2tzb3VyY2VfY2FsY3VsYXRlX2ludGVydmFsKGNsb2NrLCB0aWNrX25zZWMpOworCWNsb2Nrc291cmNlX2NhbGN1bGF0ZV9pbnRlcnZhbChjbG9jaywgTlRQX0lOVEVSVkFMX0xFTkdUSCk7CiAJY2xvY2stPmN5Y2xlX2xhc3QgPSBjbG9ja3NvdXJjZV9yZWFkKGNsb2NrKTsKIAorCXh0aW1lLnR2X3NlYyA9IHNlYzsKKwl4dGltZS50dl9uc2VjID0gMDsKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCisJCS14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKKwogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiB9CiAKLQorLyogZmxhZyBmb3IgaWYgdGltZWtlZXBpbmcgaXMgc3VzcGVuZGVkICovCiBzdGF0aWMgaW50IHRpbWVrZWVwaW5nX3N1c3BlbmRlZDsKKy8qIHRpbWUgaW4gc2Vjb25kcyB3aGVuIHN1c3BlbmQgYmVnYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVrZWVwaW5nX3N1c3BlbmRfdGltZTsKKwogLyoqCiAgKiB0aW1la2VlcGluZ19yZXN1bWUgLSBSZXN1bWVzIHRoZSBnZW5lcmljIHRpbWVrZWVwaW5nIHN1YnN5c3RlbS4KICAqIEBkZXY6CXVudXNlZApAQCAtOTA5LDEzICs5NzksMjYgQEAKIHN0YXRpYyBpbnQgdGltZWtlZXBpbmdfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IHJlYWRfcGVyc2lzdGVudF9jbG9jaygpOwogCiAJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7Ci0JLyogcmVzdGFydCB0aGUgbGFzdCBjeWNsZSB2YWx1ZSAqLworCisJaWYgKG5vdyAmJiAobm93ID4gdGltZWtlZXBpbmdfc3VzcGVuZF90aW1lKSkgeworCQl1bnNpZ25lZCBsb25nIHNsZWVwX2xlbmd0aCA9IG5vdyAtIHRpbWVrZWVwaW5nX3N1c3BlbmRfdGltZTsKKworCQl4dGltZS50dl9zZWMgKz0gc2xlZXBfbGVuZ3RoOworCQl3YWxsX3RvX21vbm90b25pYy50dl9zZWMgLT0gc2xlZXBfbGVuZ3RoOworCX0KKwkvKiByZS1iYXNlIHRoZSBsYXN0IGN5Y2xlIHZhbHVlICovCiAJY2xvY2stPmN5Y2xlX2xhc3QgPSBjbG9ja3NvdXJjZV9yZWFkKGNsb2NrKTsKIAljbG9jay0+ZXJyb3IgPSAwOwogCXRpbWVrZWVwaW5nX3N1c3BlbmRlZCA9IDA7CiAJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKworCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwkvKiBSZXN1bWUgaHJ0aW1lcnMgKi8KKwljbG9ja193YXNfc2V0KCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTI1LDYgKzEwMDgsNyBAQAogCiAJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiAJdGltZWtlZXBpbmdfc3VzcGVuZGVkID0gMTsKKwl0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUgPSByZWFkX3BlcnNpc3RlbnRfY2xvY2soKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQpAQCAtMTA4OSwxMSArMTE3Myw4IEBACiAJY2xvY2stPnh0aW1lX25zZWMgLT0gKHM2NCl4dGltZS50dl9uc2VjIDw8IGNsb2NrLT5zaGlmdDsKIAogCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5ldyBjbG9ja3NvdXJjZSB0byB1c2UgKi8KLQlpZiAoY2hhbmdlX2Nsb2Nrc291cmNlKCkpIHsKLQkJY2xvY2stPmVycm9yID0gMDsKLQkJY2xvY2stPnh0aW1lX25zZWMgPSAwOwotCQljbG9ja3NvdXJjZV9jYWxjdWxhdGVfaW50ZXJ2YWwoY2xvY2ssIHRpY2tfbnNlYyk7Ci0JfQorCWNoYW5nZV9jbG9ja3NvdXJjZSgpOworCXVwZGF0ZV92c3lzY2FsbCgmeHRpbWUsIGNsb2NrKTsKIH0KIAogLyoKQEAgLTExNzMsNyArMTI1NCw4IEBACiB7CiAJdHZlY19iYXNlX3QgKmJhc2UgPSBfX2dldF9jcHVfdmFyKHR2ZWNfYmFzZXMpOwogCi0gCWhydGltZXJfcnVuX3F1ZXVlcygpOworCWhydGltZXJfcnVuX3F1ZXVlcygpOworCiAJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgYmFzZS0+dGltZXJfamlmZmllcykpCiAJCV9fcnVuX3RpbWVycyhiYXNlKTsKIH0KQEAgLTE2MTksNiArMTcwMSw4IEBACiAJaW50IGVyciA9IHRpbWVyX2NwdV9ub3RpZnkoJnRpbWVyc19uYiwgKHVuc2lnbmVkIGxvbmcpQ1BVX1VQX1BSRVBBUkUsCiAJCQkJKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwogCisJaW5pdF90aW1lcl9zdGF0cygpOworCiAJQlVHX09OKGVyciA9PSBOT1RJRllfQkFEKTsKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnRpbWVyc19uYik7CiAJb3Blbl9zb2Z0aXJxKFRJTUVSX1NPRlRJUlEsIHJ1bl90aW1lcl9zb2Z0aXJxLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90c2FjY3QuYyBiL2tlcm5lbC90c2FjY3QuYwppbmRleCBiYWFjYzM2Li42NThmNjM4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHNhY2N0LmMKKysrIGIva2VybmVsL3RzYWNjdC5jCkBAIC0yMiw4ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvYWNjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAotCi0jZGVmaW5lIFVTRUNfUEVSX1RJQ0sJKFVTRUNfUEVSX1NFQy9IWikKIC8qCiAgKiBmaWxsIGluIGJhc2ljIGFjY291bnRpbmcgZmllbGRzCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCAwMjBkMWZmLi5iNmZhNWU2IDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHF1ZXVlX3dvcmspOwogCi1zdGF0aWMgdm9pZCBkZWxheWVkX3dvcmtfdGltZXJfZm4odW5zaWduZWQgbG9uZyBfX2RhdGEpCit2b2lkIGRlbGF5ZWRfd29ya190aW1lcl9mbih1bnNpZ25lZCBsb25nIF9fZGF0YSkKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IChzdHJ1Y3QgZGVsYXllZF93b3JrICopX19kYXRhOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGdldF93cV9kYXRhKCZkd29yay0+d29yayk7CkBAIC0yNDUsNiArMjQ1LDcgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIgPSAmZHdvcmstPnRpbWVyOwogCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayA9ICZkd29yay0+d29yazsKIAorCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKIAlpZiAoZGVsYXkgPT0gMCkKIAkJcmV0dXJuIHF1ZXVlX3dvcmsod3EsIHdvcmspOwogCkBAIC01OTMsOCArNTk0LDEwIEBACiAgKiBBZnRlciB3YWl0aW5nIGZvciBhIGdpdmVuIHRpbWUgdGhpcyBwdXRzIGEgam9iIGluIHRoZSBrZXJuZWwtZ2xvYmFsCiAgKiB3b3JrcXVldWUuCiAgKi8KLWludCBmYXN0Y2FsbCBzY2hlZHVsZV9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpCitpbnQgZmFzdGNhbGwgc2NoZWR1bGVfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrLAorCQkJCQl1bnNpZ25lZCBsb25nIGRlbGF5KQogeworCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKCZkd29yay0+dGltZXIpOwogCXJldHVybiBxdWV1ZV9kZWxheWVkX3dvcmsoa2V2ZW50ZF93cSwgZHdvcmssIGRlbGF5KTsKIH0KIEVYUE9SVF9TWU1CT0woc2NoZWR1bGVfZGVsYXllZF93b3JrKTsKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggNjNmMDRjMS4uNDQ0OGY5MSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTEzNCw2ICsxMzQsMTcgQEAKIAkgIGFwcGxpY2F0aW9uLCB5b3UgY2FuIHNheSBOIHRvIGF2b2lkIHRoZSB2ZXJ5IHNsaWdodCBvdmVyaGVhZAogCSAgdGhpcyBhZGRzLgogCitjb25maWcgVElNRVJfU1RBVFMKKwlib29sICJDb2xsZWN0IGtlcm5lbCB0aW1lcnMgc3RhdGlzdGljcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBQUk9DX0ZTCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIGFkZGl0aW9uYWwgY29kZSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlCisJICB0aW1lciByb3V0aW5lcyB0byBjb2xsZWN0IHN0YXRpc3RpY3MgYWJvdXQga2VybmVsIHRpbWVycyBiZWluZworCSAgcmVwcm9ncmFtbWVkLiBUaGUgc3RhdGlzdGljcyBjYW4gYmUgcmVhZCBmcm9tIC9wcm9jL3RpbWVyX3N0YXRzLgorCSAgVGhlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBpcyBzdGFydGVkIGJ5IHdyaXRpbmcgMSB0byAvcHJvYy90aW1lcl9zdGF0cywKKwkgIHdyaXRpbmcgMCBzdG9wcyBpdC4gVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCB0byBjb2xsZWN0IGluZm9ybWF0aW9uCisJICBhYm91dCB0aW1lciB1c2FnZSBwYXR0ZXJucyBpbiBrZXJuZWwgYW5kIHVzZXJzcGFjZS4KKwogY29uZmlnIERFQlVHX1NMQUIKIAlib29sICJEZWJ1ZyBzbGFiIG1lbW9yeSBhbGxvY2F0aW9ucyIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBTTEFCCmRpZmYgLS1naXQgYS9saWIvZGV2cmVzLmMgYi9saWIvZGV2cmVzLmMKaW5kZXggMmE2NjhkZC4uZWIzODg0OSAxMDA2NDQKLS0tIGEvbGliL2RldnJlcy5jCisrKyBiL2xpYi9kZXZyZXMuYwpAQCAtMjc0LDIxICsyNzQsMjEgQEAKIAogCQlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBpLCBuYW1lKTsKIAkJaWYgKHJjKQotCQkJZ290byBlcnJfcmVnaW9uOworCQkJZ290byBlcnJfaW52YWw7CiAKIAkJcmMgPSAtRU5PTUVNOwogCQlpZiAoIXBjaW1faW9tYXAocGRldiwgaSwgMCkpCi0JCQlnb3RvIGVycl9pb21hcDsKKwkJCWdvdG8gZXJyX3JlZ2lvbjsKIAl9CiAKIAlyZXR1cm4gMDsKIAotIGVycl9pb21hcDoKLQlwY2ltX2lvdW5tYXAocGRldiwgaW9tYXBbaV0pOwogIGVycl9yZWdpb246CiAJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIGkpOwogIGVycl9pbnZhbDoKIAl3aGlsZSAoLS1pID49IDApIHsKKwkJaWYgKCEobWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOwogCQlwY2ltX2lvdW5tYXAocGRldiwgaW9tYXBbaV0pOwogCQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgaSk7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IDAwNDE0ODQuLmQxMDYwYjggMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTIwNzksMjEgKzIwNzksMjcgQEAKIAkJLyogTGltaXQgdGhlIHNpemUgb2YgdGhlIGNvcHkgdG8gdGhlIGNhbGxlcidzIHdyaXRlIHNpemUgKi8KIAkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGNvdW50KTsKIAotCQkvKgotCQkgKiBMaW1pdCB0aGUgc2l6ZSBvZiB0aGUgY29weSB0byB0aGF0IG9mIHRoZSBjdXJyZW50IHNlZ21lbnQsCi0JCSAqIGJlY2F1c2UgZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoKSBkb2Vzbid0IGtub3cgaG93IHRvIHdhbGsKLQkJICogc2VnbWVudHMuCisJCS8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCBwcmVmYXVsdGluZyB3aGVuIHdyaXRlcyBhcmUgZnJvbQorCQkgKiB1c2VyLXNwYWNlLiAgTkZTZCB1c2VzIHZmc193cml0ZXYgd2l0aCBzZXZlcmFsIG5vbi1hbGlnbmVkCisJCSAqIHNlZ21lbnRzIGluIHRoZSB2ZWN0b3IsIGFuZCBsaW1pdGluZyB0byBvbmUgc2VnbWVudCBhIHRpbWUgaXMKKwkJICogYSBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGZvciByZS13cml0ZQogCQkgKi8KLQkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGN1cl9pb3YtPmlvdl9sZW4gLSBpb3ZfYmFzZSk7CisJCWlmICghc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkgeworCQkJLyoKKwkJCSAqIExpbWl0IHRoZSBzaXplIG9mIHRoZSBjb3B5IHRvIHRoYXQgb2YgdGhlIGN1cnJlbnQKKwkJCSAqIHNlZ21lbnQsIGJlY2F1c2UgZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoKSBkb2Vzbid0CisJCQkgKiBrbm93IGhvdyB0byB3YWxrIHNlZ21lbnRzLgorCQkJICovCisJCQlieXRlcyA9IG1pbihieXRlcywgY3VyX2lvdi0+aW92X2xlbiAtIGlvdl9iYXNlKTsKIAotCQkvKgotCQkgKiBCcmluZyBpbiB0aGUgdXNlciBwYWdlIHRoYXQgd2Ugd2lsbCBjb3B5IGZyb20gX2ZpcnN0Xy4KLQkJICogT3RoZXJ3aXNlIHRoZXJlJ3MgYSBuYXN0eSBkZWFkbG9jayBvbiBjb3B5aW5nIGZyb20gdGhlCi0JCSAqIHNhbWUgcGFnZSBhcyB3ZSdyZSB3cml0aW5nIHRvLCB3aXRob3V0IGl0IGJlaW5nIG1hcmtlZAotCQkgKiB1cC10by1kYXRlLgotCQkgKi8KLQkJZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBieXRlcyk7Ci0KKwkJCS8qCisJCQkgKiBCcmluZyBpbiB0aGUgdXNlciBwYWdlIHRoYXQgd2Ugd2lsbCBjb3B5IGZyb20KKwkJCSAqIF9maXJzdF8uICBPdGhlcndpc2UgdGhlcmUncyBhIG5hc3R5IGRlYWRsb2NrIG9uCisJCQkgKiBjb3B5aW5nIGZyb20gdGhlIHNhbWUgcGFnZSBhcyB3ZSdyZSB3cml0aW5nIHRvLAorCQkJICogd2l0aG91dCBpdCBiZWluZyBtYXJrZWQgdXAtdG8tZGF0ZS4KKwkJCSAqLworCQkJZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBieXRlcyk7CisJCX0KIAkJcGFnZSA9IF9fZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsaW5kZXgsJmNhY2hlZF9wYWdlLCZscnVfcHZlYyk7CiAJCWlmICghcGFnZSkgewogCQkJc3RhdHVzID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL21tL21pbmNvcmUuYyBiL21tL21pbmNvcmUuYwppbmRleCA5NWM1ZjQ5Li41ZWZlMGRlIDEwMDY0NAotLS0gYS9tbS9taW5jb3JlLmMKKysrIGIvbW0vbWluY29yZS5jCkBAIC03Nyw4ICs3NywxNiBAQAogCSAqIFBURSBhcnJheSBmb3Igb3VyIGFkZHJlc3MuCiAJICovCiAJbnIgPSBQVFJTX1BFUl9QVEUgLSAoKGFkZHIgPj4gUEFHRV9TSElGVCkgJiAoUFRSU19QRVJfUFRFLTEpKTsKLQlpZiAobnIgPiBwYWdlcykKLQkJbnIgPSBwYWdlczsKKworCS8qCisJICogRG9uJ3Qgb3ZlcnJ1biB0aGlzIHZtYQorCSAqLworCW5yID0gbWluKG5yLCAodm1hLT52bV9lbmQgLSBhZGRyKSA+PiBQQUdFX1NISUZUKTsKKworCS8qCisJICogRG9uJ3QgcmV0dXJuIG1vcmUgdGhhbiB0aGUgY2FsbGVyIGFza2VkIGZvcgorCSAqLworCW5yID0gbWluKG5yLCBwYWdlcyk7CiAKIAlwZ2QgPSBwZ2Rfb2Zmc2V0KHZtYS0+dm1fbW0sIGFkZHIpOwogCWlmIChwZ2Rfbm9uZV9vcl9jbGVhcl9iYWQocGdkKSkKQEAgLTExNiwxMCArMTI0LDE3IEBACiAJCQkJLyogbWlncmF0aW9uIGVudHJpZXMgYXJlIGFsd2F5cyB1cHRvZGF0ZSAqLwogCQkJCXByZXNlbnQgPSAxOwogCQkJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfU1dBUAogCQkJCXBnb2ZmID0gZW50cnkudmFsOwogCQkJCXByZXNlbnQgPSBtaW5jb3JlX3BhZ2UoJnN3YXBwZXJfc3BhY2UsIHBnb2ZmKTsKKyNlbHNlCisJCQkJV0FSTl9PTigxKTsKKwkJCQlwcmVzZW50ID0gMTsKKyNlbmRpZgogCQkJfQogCQl9CisKKwkJdmVjW2ldID0gcHJlc2VudDsKIAl9CiAJcHRlX3VubWFwX3VubG9jayhwdGVwLTEsIHB0bCk7CiAKQEAgLTEzMCw2ICsxNDUsOSBAQAogCQlwZ29mZiA9IGxpbmVhcl9wYWdlX2luZGV4KHZtYSwgYWRkcik7CiAJCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrLCBwZ29mZisrKQogCQkJdmVjW2ldID0gbWluY29yZV9wYWdlKHZtYS0+dm1fZmlsZS0+Zl9tYXBwaW5nLCBwZ29mZik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCisJCQl2ZWNbaV0gPSAwOwogCX0KIAogCXJldHVybiBucjsK